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}
+
+