From f886b8c95d2bc6ca109f109d5fa983b7c77d1332 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Sun, 28 Aug 2022 13:11:42 +0200 Subject: [PATCH] perspective alias --- packages/datalib/src/PerspectiveTreeNode.ts | 17 ++-- .../web/src/designer/DesignerTable.svelte | 3 + .../src/perspectives/CustomJoinModal.svelte | 2 +- .../perspectives/PerspectiveDesigner.svelte | 70 +++++++--------- .../src/perspectives/PerspectiveView.svelte | 2 +- .../web/src/perspectives/perspectiveMenu.ts | 83 +++++++++++++------ 6 files changed, 105 insertions(+), 72 deletions(-) diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index c58f71299..73ae4c6c5 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -116,6 +116,9 @@ export abstract class PerspectiveTreeNode { if (this.isRoot) return this; return this.parentNode?.rootNode; } + get isSortable() { + return false; + } matchChildRow(parentRow: any, childRow: any): boolean { return true; } @@ -570,6 +573,10 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { return !!this.foreignKey; } + get isSortable() { + return true; + } + get filterType(): FilterType { return getFilterType(this.column.dataType); } @@ -706,7 +713,7 @@ export class PerspectiveTableNode extends PerspectiveTreeNode { } get title() { - return this.table.pureName; + return this.nodeConfig?.alias || this.table.pureName; } get isExpandable() { @@ -964,9 +971,9 @@ export class PerspectiveCustomJoinTreeNode extends PerspectiveTableNode { }; } - get title() { - return this.customJoin.joinName; - } + // get title() { + // return this.customJoin.joinName || this.customJoin.refTableName; + // } get icon() { return 'icon custom-join'; @@ -1161,7 +1168,7 @@ export function getTableChildPerspectiveNodes( refNodeDesignerId: node.designerId, referenceDesignerId: ref.designerId, baseDesignerId: parentNode.designerId, - joinName: node.alias || node.pureName, + joinName: node.alias, refTableName: node.pureName, refSchemaName: node.schemaName, conid: node.conid, diff --git a/packages/web/src/designer/DesignerTable.svelte b/packages/web/src/designer/DesignerTable.svelte index bb11e0cb8..de6336af2 100644 --- a/packages/web/src/designer/DesignerTable.svelte +++ b/packages/web/src/designer/DesignerTable.svelte @@ -179,6 +179,9 @@ }; function createMenu() { + if (settings?.tableMenu) { + return settings?.tableMenu({ designer, designerId, onRemoveTable }); + } return [ { text: 'Remove', onClick: () => onRemoveTable({ designerId }) }, { divider: true }, diff --git a/packages/web/src/perspectives/CustomJoinModal.svelte b/packages/web/src/perspectives/CustomJoinModal.svelte index ea16ea12d..9d4170f9c 100644 --- a/packages/web/src/perspectives/CustomJoinModal.svelte +++ b/packages/web/src/perspectives/CustomJoinModal.svelte @@ -328,7 +328,7 @@ newNode.conid = conidOverride; newNode.database = databaseOverride; newNode.position = cfg.nodes.find(x => x.designerId == editValue?.refNodeDesignerId)?.position; - newNode.alias = joinName || refTableName; + newNode.alias = joinName; const newRef = { designerId: editValue?.referenceDesignerId || uuidv1(), diff --git a/packages/web/src/perspectives/PerspectiveDesigner.svelte b/packages/web/src/perspectives/PerspectiveDesigner.svelte index 755809ba9..09287fbaf 100644 --- a/packages/web/src/perspectives/PerspectiveDesigner.svelte +++ b/packages/web/src/perspectives/PerspectiveDesigner.svelte @@ -4,6 +4,7 @@ MultipleDatabaseInfo, PerspectiveConfig, perspectiveNodesHaveStructure, + PerspectiveTreeNode, } from 'dbgate-datalib'; import _, { findIndex } from 'lodash'; import { tick } from 'svelte'; @@ -11,20 +12,16 @@ import Designer from '../designer/Designer.svelte'; import QueryDesignerReference from '../designer/QueryDesignerReference.svelte'; - import { - addToPerspectiveFilter, - addToPerspectiveSort, - clearPerspectiveSort, - setPerspectiveSort, - } from './perspectiveMenu'; + import { getPerspectiveNodeMenu } from './perspectiveMenu'; export let config: PerspectiveConfig; export let dbInfos: MultipleDatabaseInfo; + export let root: PerspectiveTreeNode; export let conid; export let database; - export let onChange; + export let setConfig; function createDesignerModel(config: PerspectiveConfig, dbInfos: MultipleDatabaseInfo) { return { @@ -50,7 +47,7 @@ } function handleChange(value, skipUndoChain, settings) { - onChange(oldValue => { + setConfig(oldValue => { const newValue = _.isFunction(value) ? value(createDesignerModel(oldValue, dbInfos)) : value; let isArranged = oldValue.isArranged; if (settings?.isCalledFromArrange) { @@ -67,9 +64,9 @@ ...node, }; - if (table) { - nodeChanged.alias = table?.alias; - } + // if (table) { + // nodeChanged.alias = table?.alias; + // } if (settings?.isCalledFromArrange) { // when called from arrange, position must be set to prevent cycle @@ -137,32 +134,29 @@ return [{ text: 'Remove', onClick: () => onRemoveReference(reference) }]; }, columnMenu: ({ designer, designerId, column, foreignKey }) => { + const node = root.findNodeByDesignerId(designerId); + const child = node.childNodes.find(x => x.columnName == column.columnName); + return getPerspectiveNodeMenu({ + config, + setConfig, + conid, + database, + root, + node: child, + }); + }, + tableMenu: ({ designer, designerId, onRemoveTable }) => { + const node = root.findNodeByDesignerId(designerId); return [ - { - text: 'Sort ascending', - onClick: () => onChange(cfg => setPerspectiveSort(cfg, designerId, column.columnName, 'ASC')), - }, - { - text: 'Sort descending', - onClick: () => onChange(cfg => setPerspectiveSort(cfg, designerId, column.columnName, 'DESC')), - }, - { - text: 'Add to sort ascending', - onClick: () => onChange(cfg => addToPerspectiveSort(cfg, designerId, column.columnName, 'ASC')), - }, - { - text: 'Add to sort descending', - onClick: () => onChange(cfg => addToPerspectiveSort(cfg, designerId, column.columnName, 'DESC')), - }, - { - text: 'Clear sort criteria', - onClick: () => onChange(cfg => clearPerspectiveSort(cfg, designerId)), - }, - { divider: true }, - { - text: 'Add to filter', - onClick: () => onChange(cfg => addToPerspectiveFilter(cfg, designerId, column.columnName)), - }, + { text: 'Remove', onClick: () => onRemoveTable({ designerId }) }, + getPerspectiveNodeMenu({ + config, + setConfig, + conid, + database, + root, + node, + }), ]; }, createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'), @@ -170,7 +164,7 @@ return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(columnName); }, setColumnChecked: (designerId, columnName, value) => { - onChange(cfg => ({ + setConfig(cfg => ({ ...cfg, nodes: cfg.nodes.map(node => node.designerId == designerId @@ -186,7 +180,7 @@ }, isTableChecked: designerId => config.nodes?.find(x => x.designerId == designerId)?.isNodeChecked, setTableChecked: (designerId, value) => { - onChange(cfg => ({ + setConfig(cfg => ({ ...cfg, nodes: cfg.nodes.map(node => node.designerId == designerId diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index 1b18257b0..18b477cb9 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -184,7 +184,7 @@ - + diff --git a/packages/web/src/perspectives/perspectiveMenu.ts b/packages/web/src/perspectives/perspectiveMenu.ts index 010a2c722..55da3b12c 100644 --- a/packages/web/src/perspectives/perspectiveMenu.ts +++ b/packages/web/src/perspectives/perspectiveMenu.ts @@ -2,6 +2,7 @@ import { ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveTreeNode } f import _ from 'lodash'; import { showModal } from '../modals/modalTools'; import CustomJoinModal from './CustomJoinModal.svelte'; +import InputTextModal from '../modals/InputTextModal.svelte'; interface PerspectiveNodeMenuProps { node: PerspectiveTreeNode; @@ -86,6 +87,20 @@ export function addToPerspectiveFilter( }; } +export function setPerspectiveTableAlias(cfg: PerspectiveConfig, designerId: string, alias: string) { + return { + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == designerId + ? { + ...n, + alias, + } + : n + ), + }; +} + export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { const { node, conid, database, root, config, setConfig } = props; const customJoin = node.customJoinConfig; @@ -104,40 +119,20 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { const addToSort = order => { setConfig(cfg => addToPerspectiveSort(cfg, parentDesignerId, columnName, order), true); - - // setConfig( - // cfg => ({ - // ...cfg, - // sort: { - // ...cfg.sort, - // [parentUniqueName]: [...(cfg.sort?.[parentUniqueName] || []), { uniqueName, order }], - // }, - // }), - // true - // ); }; const clearSort = () => { setConfig(cfg => clearPerspectiveSort(cfg, parentDesignerId), true); - - // setConfig( - // cfg => ({ - // ...cfg, - // sort: { - // ...cfg.sort, - // [parentUniqueName]: [], - // }, - // }), - // true - // ); }; return [ - { onClick: () => setSort('ASC'), text: 'Sort ascending' }, - { onClick: () => setSort('DESC'), text: 'Sort descending' }, - isSortDefined && !order && { onClick: () => addToSort('ASC'), text: 'Add to sort - ascending' }, - isSortDefined && !order && { onClick: () => addToSort('DESC'), text: 'Add to sort - descending' }, - order && { onClick: () => clearSort(), text: 'Clear sort criteria' }, + node.isSortable && { onClick: () => setSort('ASC'), text: 'Sort ascending' }, + node.isSortable && { onClick: () => setSort('DESC'), text: 'Sort descending' }, + node.isSortable && isSortDefined && !order && { onClick: () => addToSort('ASC'), text: 'Add to sort - ascending' }, + node.isSortable && + isSortDefined && + !order && { onClick: () => addToSort('DESC'), text: 'Add to sort - descending' }, + node.isSortable && order && { onClick: () => clearSort(), text: 'Clear sort criteria' }, { divider: true }, filterInfo && { @@ -174,5 +169,39 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { editValue: customJoin, }), }, + node?.supportsParentFilter && { + text: node.isParentFilter ? 'Cancel filter parent rows' : 'Filter parent rows', + onClick: () => { + setConfig( + cfg => ({ + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == node?.designerId ? { ...n, isParentFilter: !node.isParentFilter } : n + ), + }), + true + ); + }, + }, + + node?.nodeConfig && [ + { + text: 'Set alias', + onClick: () => { + showModal(InputTextModal, { + value: node?.nodeConfig?.alias || '', + label: 'New alias', + header: 'Set alias', + onConfirm: newAlias => { + setConfig(cfg => setPerspectiveTableAlias(cfg, node?.designerId, newAlias)); + }, + }); + }, + }, + node?.nodeConfig?.alias && { + text: 'Remove alias', + onClick: () => setConfig(cfg => setPerspectiveTableAlias(cfg, node?.designerId, null)), + }, + ], ]; }