diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index 1bf6b02a9..c58f71299 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -26,6 +26,7 @@ import _flatten from 'lodash/flatten'; import _uniqBy from 'lodash/uniqBy'; import _sortBy from 'lodash/sortBy'; import _cloneDeepWith from 'lodash/cloneDeepWith'; +import _findIndex from 'lodash/findIndex'; import { PerspectiveDatabaseConfig, PerspectiveDataLoadProps, @@ -440,6 +441,16 @@ export abstract class PerspectiveTreeNode { getParentJoinCondition(alias: string, parentAlias: string): Condition[] { return []; } + + get sortOrder() { + return this.parentNodeConfig?.sort?.find(x => x.columnName == this.columnName)?.order; + } + + get sortOrderIndex() { + return this.parentNodeConfig?.sort?.length > 1 + ? _findIndex(this.parentNodeConfig?.sort, x => x.columnName == this.columnName) + : -1; + } } export class PerspectiveTableColumnNode extends PerspectiveTreeNode { diff --git a/packages/web/src/designer/ColumnLine.svelte b/packages/web/src/designer/ColumnLine.svelte index 241ac55f1..e6e126d4e 100644 --- a/packages/web/src/designer/ColumnLine.svelte +++ b/packages/web/src/designer/ColumnLine.svelte @@ -6,6 +6,7 @@ import CheckboxField from '../forms/CheckboxField.svelte'; import FontIcon from '../icons/FontIcon.svelte'; import contextMenu from '../utility/contextMenu'; + import SortOrderIcon from './SortOrderIcon.svelte'; export let column; export let table; export let designer; @@ -25,6 +26,16 @@ function createMenu() { const foreignKey = findForeignKeyForColumn(table, column); + + if (settings?.columnMenu) { + return settings?.columnMenu({ + designer, + designerId, + column, + foreignKey, + }); + } + const setSortOrder = sortOrder => { onChangeColumn( { @@ -47,6 +58,8 @@ foreignKey && { text: 'Add reference', onClick: addReference }, ]; } + + $: sortOrderProps = settings?.getSortOrderProps ? settings?.getSortOrderProps(designerId, column.columnName) : null;
{/if} + {#if sortOrderProps} + + {/if} + {#if designer?.style?.showNullability || designer?.style?.showDataType}
{#if designer?.style?.showDataType && column?.dataType} diff --git a/packages/web/src/designer/SortOrderIcon.svelte b/packages/web/src/designer/SortOrderIcon.svelte new file mode 100644 index 000000000..c0d58658d --- /dev/null +++ b/packages/web/src/designer/SortOrderIcon.svelte @@ -0,0 +1,23 @@ + + +{#if order == 'ASC'} + + + {#if orderIndex >= 0} + {orderIndex + 1} + {/if} + +{/if} +{#if order == 'DESC'} + + + {#if orderIndex >= 0} + {orderIndex + 1} + {/if} + +{/if} diff --git a/packages/web/src/perspectives/PerspectiveDesigner.svelte b/packages/web/src/perspectives/PerspectiveDesigner.svelte index e4a27607d..b7d0edd47 100644 --- a/packages/web/src/perspectives/PerspectiveDesigner.svelte +++ b/packages/web/src/perspectives/PerspectiveDesigner.svelte @@ -5,12 +5,13 @@ PerspectiveConfig, perspectiveNodesHaveStructure, } from 'dbgate-datalib'; - import _ from 'lodash'; + import _, { findIndex } from 'lodash'; import { tick } from 'svelte'; import runCommand from '../commands/runCommand'; import Designer from '../designer/Designer.svelte'; import QueryDesignerReference from '../designer/QueryDesignerReference.svelte'; + import { addToPerspectiveSort, clearPerspectiveSort, setPerspectiveSort } from './perspectiveMenu'; export let config: PerspectiveConfig; export let dbInfos: MultipleDatabaseInfo; @@ -130,6 +131,30 @@ referenceMenu: ({ designer, reference, onChangeReference, onRemoveReference }) => { return [{ text: 'Remove', onClick: () => onRemoveReference(reference) }]; }, + columnMenu: ({ designer, designerId, column, foreignKey }) => { + 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)), + }, + ]; + }, createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'), isColumnChecked: (designerId, columnName) => { return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(columnName); @@ -163,6 +188,13 @@ ), })); }, + getSortOrderProps: (designerId, columnName) => { + const sort = config.nodes.find(x => x.designerId == designerId)?.sort; + const order = sort?.find(x => x.columnName == columnName)?.order; + if (!order) return null; + const orderIndex = sort.length > 1 ? _.findIndex(sort, x => x.columnName == columnName) : -1; + return { order, orderIndex }; + }, }} referenceComponent={QueryDesignerReference} value={createDesignerModel(config, dbInfos)} diff --git a/packages/web/src/perspectives/PerspectiveHeaderControl.svelte b/packages/web/src/perspectives/PerspectiveHeaderControl.svelte index b1e08f021..25603b4e0 100644 --- a/packages/web/src/perspectives/PerspectiveHeaderControl.svelte +++ b/packages/web/src/perspectives/PerspectiveHeaderControl.svelte @@ -4,21 +4,14 @@ import DropDownButton from '../buttons/DropDownButton.svelte'; import FontIcon from '../icons/FontIcon.svelte'; + import SortOrderIcon from '../designer/SortOrderIcon.svelte'; export let column: PerspectiveDisplayColumn; export let columnLevel; export let config: PerspectiveConfig; export let setConfig: ChangePerspectiveConfigFunc; - // $: 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; + $: order = column.dataNode?.sortOrder; + $: orderIndex = column.dataNode?.sortOrderIndex; {#if column.isVisible(columnLevel)} @@ -28,22 +21,7 @@ {column.title}
- {#if order == 'ASC'} - - - {#if orderIndex >= 0} - {orderIndex + 1} - {/if} - - {/if} - {#if order == 'DESC'} - - - {#if orderIndex >= 0} - {orderIndex + 1} - {/if} - - {/if} +
{/if} diff --git a/packages/web/src/perspectives/PerspectiveNodeRow.svelte b/packages/web/src/perspectives/PerspectiveNodeRow.svelte index 1675321d9..c285bb1c2 100644 --- a/packages/web/src/perspectives/PerspectiveNodeRow.svelte +++ b/packages/web/src/perspectives/PerspectiveNodeRow.svelte @@ -8,6 +8,7 @@ import contextMenu from '../utility/contextMenu'; import CustomJoinModal from './CustomJoinModal.svelte'; import { getPerspectiveNodeMenu } from './perspectiveMenu'; + import SortOrderIcon from '../designer/SortOrderIcon.svelte'; export let conid; export let database; @@ -71,6 +72,8 @@ {node.title} + +