diff --git a/packages/datalib/src/PerspectiveConfig.ts b/packages/datalib/src/PerspectiveConfig.ts index cc1414f71..f3b3d2091 100644 --- a/packages/datalib/src/PerspectiveConfig.ts +++ b/packages/datalib/src/PerspectiveConfig.ts @@ -57,7 +57,7 @@ export interface PerspectiveNodeConfig { conid?: string; database?: string; - isParentFilter?: true | undefined; + isParentFilter?: boolean; expandedColumns: string[]; checkedColumns: string[]; diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index a949d8115..1bf6b02a9 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -303,7 +303,7 @@ export abstract class PerspectiveTreeNode { getOrderBy(table: TableInfo | ViewInfo): PerspectiveDataLoadProps['orderBy'] { const res = _compact( this.childNodes.map(node => { - const sort = this.parentNodeConfig?.sort?.find(x => x.columnName == node.columnName); + const sort = this.nodeConfig?.sort?.find(x => x.columnName == node.columnName); if (sort) { return { columnName: node.columnName, diff --git a/packages/web/src/perspectives/PerspectiveFilters.svelte b/packages/web/src/perspectives/PerspectiveFilters.svelte index 184d1dda5..d41372aa2 100644 --- a/packages/web/src/perspectives/PerspectiveFilters.svelte +++ b/packages/web/src/perspectives/PerspectiveFilters.svelte @@ -1,7 +1,9 @@ - - {#if allFilterNames.length == 0} + + {#if filterCount == 0}
No Filters defined
Use context menu, command "Add to filter" in table or in tree
{:else} - {#each allFilterNames as uniqueName} - {@const node = root?.findNodeByUniqueName(uniqueName)} - {@const filterInfo = node?.filterInfo} - {#if filterInfo} - - setConfig(cfg => ({ - ...cfg, - filters: { - ...cfg.filters, - [uniqueName]: value, - }, - }))} - onRemoveFilter={value => - setConfig(cfg => ({ - ...cfg, - filters: _.omit(cfg.filters, [uniqueName]), - }))} - /> - {/if} + {#each config.nodes as nodeConfig} + {#each _.keys(nodeConfig.filters) as filterKey} + {@const tableNode = root?.findNodeByDesignerId(nodeConfig.designerId)} + {@const filterInfo = tableNode?.childNodes?.find(x => x.columnName == filterKey)?.filterInfo} + {#if filterInfo} + + setConfig(cfg => ({ + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == tableNode.designerId + ? { + ...n, + filters: { + ...n.filters, + [filterKey]: value, + }, + } + : n + ), + }))} + onRemoveFilter={value => + setConfig(cfg => ({ + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == tableNode.designerId + ? { + ...n, + filters: _.omit(n.filters, [filterKey]), + } + : n + ), + }))} + /> + {/if} + {/each} {/each} {/if}
diff --git a/packages/web/src/perspectives/PerspectiveFiltersColumn.svelte b/packages/web/src/perspectives/PerspectiveFiltersColumn.svelte index 953718adb..769fae944 100644 --- a/packages/web/src/perspectives/PerspectiveFiltersColumn.svelte +++ b/packages/web/src/perspectives/PerspectiveFiltersColumn.svelte @@ -28,34 +28,33 @@ export let config: PerspectiveConfig; export let setConfig: ChangePerspectiveConfigFunc; - export let node: PerspectiveTreeNode; + export let tableNode: PerspectiveTreeNode; - $: customCommandIcon = node?.parentNode?.supportsParentFilter - ? node?.parentNode?.isParentFilter + // $: console.log('node', node); + // $: console.log('node?.parentNode?.supportsParentFilter', node?.parentNode?.supportsParentFilter); + // $: console.log('node?.parentNode', node?.parentNode); + + $: customCommandIcon = tableNode?.supportsParentFilter + ? tableNode?.isParentFilter ? 'icon parent-filter' : 'icon parent-filter-outline' : null; function changeParentFilter() { - const tableNode = node?.parentNode; - if (!tableNode) return; - if (tableNode.isParentFilter) { - setConfig( - cfg => ({ - ...cfg, - parentFilters: cfg.parentFilters.filter(x => x.uniqueName != tableNode.uniqueName), - }), - true - ); - } else { - setConfig( - cfg => ({ - ...cfg, - parentFilters: [...(cfg.parentFilters || []), { uniqueName: tableNode.uniqueName }], - }), - true - ); - } + setConfig( + cfg => ({ + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == tableNode?.designerId + ? { + ...n, + isParentFilter: !n.isParentFilter, + } + : n + ), + }), + true + ); } @@ -78,6 +77,6 @@ foreignKey={filterInfo.foreignKey} {customCommandIcon} onCustomCommand={customCommandIcon ? changeParentFilter : null} - customCommandTooltip='Filter parent rows' + customCommandTooltip="Filter parent rows" /> diff --git a/packages/web/src/perspectives/PerspectiveHeaderControl.svelte b/packages/web/src/perspectives/PerspectiveHeaderControl.svelte index 47e5b35fd..b1e08f021 100644 --- a/packages/web/src/perspectives/PerspectiveHeaderControl.svelte +++ b/packages/web/src/perspectives/PerspectiveHeaderControl.svelte @@ -9,16 +9,16 @@ export let config: PerspectiveConfig; export let setConfig: ChangePerspectiveConfigFunc; - $: parentDesignerId = column.dataNode?.parentNode?.designerId || ''; - $: nodeDesignerId = column.dataNode.designerId; - $: nodeConfig = column.dataNode.nodeConfig; - $: order = nodeConfig?.sort?.find(x => x.columnName == column.dataNode.columnName)?.order; - $: orderIndex = -1; - // $: orderIndex = - // config.sort?.[parentUniqueName]?.length > 1 - // ? _.findIndex(config.sort?.[parentUniqueName], x => x.uniqueName == uniqueName) - // : -1; - $: isSortDefined = nodeConfig?.sort?.length > 0; + // $: parentDesignerId = column.dataNode?.parentNode?.designerId || ''; + // $: nodeDesignerId = column.dataNode.designerId; + $: tableNodeConfig = column.dataNode.parentNode?.nodeConfig; + $: order = tableNodeConfig?.sort?.find(x => x.columnName == column.dataNode.columnName)?.order; + // $: orderIndex = -1; + $: orderIndex = + tableNodeConfig?.sort?.length > 1 + ? _.findIndex(tableNodeConfig?.sort, x => x.columnName == column.dataNode.columnName) + : -1; + // $: isSortDefined = tableNodeConfig?.sort?.length > 0; {#if column.isVisible(columnLevel)} diff --git a/packages/web/src/perspectives/PerspectiveTable.svelte b/packages/web/src/perspectives/PerspectiveTable.svelte index 0b3499de8..3c321ce30 100644 --- a/packages/web/src/perspectives/PerspectiveTable.svelte +++ b/packages/web/src/perspectives/PerspectiveTable.svelte @@ -212,36 +212,23 @@ }); } - // if (tableNode?.supportsParentFilter) { - // const isParentFilter = (config.parentFilters || []).find(x => x.uniqueName == tableNode.uniqueName); - // if (isParentFilter) { - // res.push({ - // text: 'Cancel filter parent rows', - // onClick: () => { - // setConfig( - // cfg => ({ - // ...cfg, - // parentFilters: cfg.parentFilters.filter(x => x.uniqueName != tableNode.uniqueName), - // }), - // true - // ); - // }, - // }); - // } else { - // res.push({ - // text: 'Filter parent rows', - // onClick: () => { - // setConfig( - // cfg => ({ - // ...cfg, - // parentFilters: [...(cfg.parentFilters || []), { uniqueName: tableNode.uniqueName }], - // }), - // true - // ); - // }, - // }); - // } - // } + if (tableNode?.supportsParentFilter) { + const isParentFilter = tableNode?.isParentFilter; + res.push({ + text: isParentFilter ? 'Cancel filter parent rows' : 'Filter parent rows', + onClick: () => { + setConfig( + cfg => ({ + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == tableNode?.designerId ? { ...n, isParentFilter: !isParentFilter } : n + ), + }), + true + ); + }, + }); + } const rowIndex = tr?.getAttribute('data-rowIndex'); if (rowIndex != null) { @@ -296,18 +283,25 @@ }); } - // res.push({ - // text: 'Filter this value', - // onClick: () => { - // setConfig(cfg => ({ - // ...cfg, - // filters: { - // ...cfg.filters, - // [dataNode.uniqueName]: getFilterValueExpression(value, dataNode.column.dataType), - // }, - // })); - // }, - // }); + res.push({ + text: 'Filter this value', + onClick: () => { + setConfig(cfg => ({ + ...cfg, + nodes: cfg.nodes.map(n => + n.designerId == dataNode?.parentNode?.designerId + ? { + ...n, + filters: { + ...n.filters, + [dataNode.columnName]: getFilterValueExpression(value, dataNode.column.dataType), + }, + } + : n + ), + })); + }, + }); } } } diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index 1b18257b0..71ed9d1db 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -156,7 +156,7 @@ } } - // $: console.log('PERSPECTIVE', config); + $: console.log('PERSPECTIVE', config); diff --git a/packages/web/src/perspectives/perspectiveMenu.ts b/packages/web/src/perspectives/perspectiveMenu.ts index 34add8b0f..91e2c3988 100644 --- a/packages/web/src/perspectives/perspectiveMenu.ts +++ b/packages/web/src/perspectives/perspectiveMenu.ts @@ -17,23 +17,25 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { const customJoin = node.customJoinConfig; const filterInfo = node.filterInfo; - const parentUniqueName = node?.parentNode?.uniqueName || ''; - const uniqueName = node.uniqueName; - const order = config.sort?.[parentUniqueName]?.find(x => x.uniqueName == uniqueName)?.order; - const orderIndex = - config.sort?.[parentUniqueName]?.length > 1 - ? _.findIndex(config.sort?.[parentUniqueName], x => x.uniqueName == uniqueName) - : -1; - const isSortDefined = config.sort?.[parentUniqueName]?.length > 0; + const parentDesignerId = node?.parentNode?.designerId || ''; + const columnName = node.columnName; + const sort = config.nodes?.find(x => x.designerId == parentDesignerId)?.sort; + const order = sort?.find(x => x.columnName == columnName)?.order; + const orderIndex = sort?.length > 1 ? _.findIndex(sort, x => x.columnName == columnName) : -1; + const isSortDefined = sort?.length > 0; const setSort = order => { setConfig( cfg => ({ ...cfg, - sort: { - ...cfg.sort, - [parentUniqueName]: [{ uniqueName, order }], - }, + nodes: cfg.nodes.map(n => + n.designerId == parentDesignerId + ? { + ...n, + sort: [{ columnName, order }], + } + : n + ), }), true ); @@ -43,26 +45,56 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { setConfig( cfg => ({ ...cfg, - sort: { - ...cfg.sort, - [parentUniqueName]: [...(cfg.sort?.[parentUniqueName] || []), { uniqueName, order }], - }, + nodes: cfg.nodes.map(n => + n.designerId == parentDesignerId + ? { + ...n, + sort: [...(n.sort || []), { columnName, order }], + } + : n + ), }), true ); + + // setConfig( + // cfg => ({ + // ...cfg, + // sort: { + // ...cfg.sort, + // [parentUniqueName]: [...(cfg.sort?.[parentUniqueName] || []), { uniqueName, order }], + // }, + // }), + // true + // ); }; const clearSort = () => { setConfig( cfg => ({ ...cfg, - sort: { - ...cfg.sort, - [parentUniqueName]: [], - }, + nodes: cfg.nodes.map(n => + n.designerId == parentDesignerId + ? { + ...n, + sort: [], + } + : n + ), }), true ); + + // setConfig( + // cfg => ({ + // ...cfg, + // sort: { + // ...cfg.sort, + // [parentUniqueName]: [], + // }, + // }), + // true + // ); }; return [ @@ -78,11 +110,27 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { onClick: () => setConfig(cfg => ({ ...cfg, - filters: { - ...cfg.filters, - [node.uniqueName]: '', - }, + nodes: cfg.nodes.map(n => + n.designerId == parentDesignerId + ? { + ...n, + filters: { + ...n.filters, + [columnName]: '', + }, + } + : n + ), })), + + // setConfig(cfg => ({ + // ...cfg, + + // filters: { + // ...cfg.filters, + // [node.uniqueName]: '', + // }, + // })), }, customJoin && { text: 'Remove custom join',