show sort in perspective deisgner and tree

This commit is contained in:
Jan Prochazka
2022-08-28 12:02:38 +02:00
parent 14110cb6db
commit f405db7685
8 changed files with 147 additions and 70 deletions

View File

@@ -26,6 +26,7 @@ import _flatten from 'lodash/flatten';
import _uniqBy from 'lodash/uniqBy'; import _uniqBy from 'lodash/uniqBy';
import _sortBy from 'lodash/sortBy'; import _sortBy from 'lodash/sortBy';
import _cloneDeepWith from 'lodash/cloneDeepWith'; import _cloneDeepWith from 'lodash/cloneDeepWith';
import _findIndex from 'lodash/findIndex';
import { import {
PerspectiveDatabaseConfig, PerspectiveDatabaseConfig,
PerspectiveDataLoadProps, PerspectiveDataLoadProps,
@@ -440,6 +441,16 @@ export abstract class PerspectiveTreeNode {
getParentJoinCondition(alias: string, parentAlias: string): Condition[] { getParentJoinCondition(alias: string, parentAlias: string): Condition[] {
return []; 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 { export class PerspectiveTableColumnNode extends PerspectiveTreeNode {

View File

@@ -6,6 +6,7 @@
import CheckboxField from '../forms/CheckboxField.svelte'; import CheckboxField from '../forms/CheckboxField.svelte';
import FontIcon from '../icons/FontIcon.svelte'; import FontIcon from '../icons/FontIcon.svelte';
import contextMenu from '../utility/contextMenu'; import contextMenu from '../utility/contextMenu';
import SortOrderIcon from './SortOrderIcon.svelte';
export let column; export let column;
export let table; export let table;
export let designer; export let designer;
@@ -25,6 +26,16 @@
function createMenu() { function createMenu() {
const foreignKey = findForeignKeyForColumn(table, column); const foreignKey = findForeignKeyForColumn(table, column);
if (settings?.columnMenu) {
return settings?.columnMenu({
designer,
designerId,
column,
foreignKey,
});
}
const setSortOrder = sortOrder => { const setSortOrder = sortOrder => {
onChangeColumn( onChangeColumn(
{ {
@@ -47,6 +58,8 @@
foreignKey && { text: 'Add reference', onClick: addReference }, foreignKey && { text: 'Add reference', onClick: addReference },
]; ];
} }
$: sortOrderProps = settings?.getSortOrderProps ? settings?.getSortOrderProps(designerId, column.columnName) : null;
</script> </script>
<div <div
@@ -144,6 +157,10 @@
<FontIcon icon="img group" /> <FontIcon icon="img group" />
{/if} {/if}
{#if sortOrderProps}
<SortOrderIcon {...sortOrderProps} />
{/if}
{#if designer?.style?.showNullability || designer?.style?.showDataType} {#if designer?.style?.showNullability || designer?.style?.showDataType}
<div class="space" /> <div class="space" />
{#if designer?.style?.showDataType && column?.dataType} {#if designer?.style?.showDataType && column?.dataType}

View File

@@ -0,0 +1,23 @@
<script lang="ts">
import FontIcon from '../icons/FontIcon.svelte';
export let order;
export let orderIndex;
</script>
{#if order == 'ASC'}
<span class="icon">
<FontIcon icon="img sort-asc" />
{#if orderIndex >= 0}
<span class="color-icon-green order-index">{orderIndex + 1}</span>
{/if}
</span>
{/if}
{#if order == 'DESC'}
<span class="icon">
<FontIcon icon="img sort-desc" />
{#if orderIndex >= 0}
<span class="color-icon-green order-index">{orderIndex + 1}</span>
{/if}
</span>
{/if}

View File

@@ -5,12 +5,13 @@
PerspectiveConfig, PerspectiveConfig,
perspectiveNodesHaveStructure, perspectiveNodesHaveStructure,
} from 'dbgate-datalib'; } from 'dbgate-datalib';
import _ from 'lodash'; import _, { findIndex } from 'lodash';
import { tick } from 'svelte'; import { tick } from 'svelte';
import runCommand from '../commands/runCommand'; import runCommand from '../commands/runCommand';
import Designer from '../designer/Designer.svelte'; import Designer from '../designer/Designer.svelte';
import QueryDesignerReference from '../designer/QueryDesignerReference.svelte'; import QueryDesignerReference from '../designer/QueryDesignerReference.svelte';
import { addToPerspectiveSort, clearPerspectiveSort, setPerspectiveSort } from './perspectiveMenu';
export let config: PerspectiveConfig; export let config: PerspectiveConfig;
export let dbInfos: MultipleDatabaseInfo; export let dbInfos: MultipleDatabaseInfo;
@@ -130,6 +131,30 @@
referenceMenu: ({ designer, reference, onChangeReference, onRemoveReference }) => { referenceMenu: ({ designer, reference, onChangeReference, onRemoveReference }) => {
return [{ text: 'Remove', onClick: () => onRemoveReference(reference) }]; 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'), createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'),
isColumnChecked: (designerId, columnName) => { isColumnChecked: (designerId, columnName) => {
return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(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} referenceComponent={QueryDesignerReference}
value={createDesignerModel(config, dbInfos)} value={createDesignerModel(config, dbInfos)}

View File

@@ -4,21 +4,14 @@
import DropDownButton from '../buttons/DropDownButton.svelte'; import DropDownButton from '../buttons/DropDownButton.svelte';
import FontIcon from '../icons/FontIcon.svelte'; import FontIcon from '../icons/FontIcon.svelte';
import SortOrderIcon from '../designer/SortOrderIcon.svelte';
export let column: PerspectiveDisplayColumn; export let column: PerspectiveDisplayColumn;
export let columnLevel; export let columnLevel;
export let config: PerspectiveConfig; export let config: PerspectiveConfig;
export let setConfig: ChangePerspectiveConfigFunc; export let setConfig: ChangePerspectiveConfigFunc;
// $: parentDesignerId = column.dataNode?.parentNode?.designerId || ''; $: order = column.dataNode?.sortOrder;
// $: nodeDesignerId = column.dataNode.designerId; $: orderIndex = column.dataNode?.sortOrderIndex;
$: 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;
</script> </script>
{#if column.isVisible(columnLevel)} {#if column.isVisible(columnLevel)}
@@ -28,22 +21,7 @@
{column.title} {column.title}
</div> </div>
{#if order == 'ASC'} <SortOrderIcon {order} {orderIndex} />
<span class="icon">
<FontIcon icon="img sort-asc" />
{#if orderIndex >= 0}
<span class="color-icon-green order-index">{orderIndex + 1}</span>
{/if}
</span>
{/if}
{#if order == 'DESC'}
<span class="icon">
<FontIcon icon="img sort-desc" />
{#if orderIndex >= 0}
<span class="color-icon-green order-index">{orderIndex + 1}</span>
{/if}
</span>
{/if}
</div> </div>
</th> </th>
{/if} {/if}

View File

@@ -8,6 +8,7 @@
import contextMenu from '../utility/contextMenu'; import contextMenu from '../utility/contextMenu';
import CustomJoinModal from './CustomJoinModal.svelte'; import CustomJoinModal from './CustomJoinModal.svelte';
import { getPerspectiveNodeMenu } from './perspectiveMenu'; import { getPerspectiveNodeMenu } from './perspectiveMenu';
import SortOrderIcon from '../designer/SortOrderIcon.svelte';
export let conid; export let conid;
export let database; export let database;
@@ -71,6 +72,8 @@
<FontIcon icon={node.icon} /> <FontIcon icon={node.icon} />
<span>{node.title}</span> <span>{node.title}</span>
<SortOrderIcon order={node.sortOrder} orderIndex={node.sortOrderIndex} />
</div> </div>
<style> <style>

View File

@@ -156,7 +156,7 @@
} }
} }
$: console.log('PERSPECTIVE', config); // $: console.log('PERSPECTIVE', config);
</script> </script>
<HorizontalSplitter initialValue={getInitialManagerSize()} bind:size={managerSize}> <HorizontalSplitter initialValue={getInitialManagerSize()} bind:size={managerSize}>

View File

@@ -12,6 +12,58 @@ interface PerspectiveNodeMenuProps {
setConfig: ChangePerspectiveConfigFunc; setConfig: ChangePerspectiveConfigFunc;
} }
export function setPerspectiveSort(
cfg: PerspectiveConfig,
designerId: string,
columnName: string,
order: 'ASC' | 'DESC'
): PerspectiveConfig {
return {
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == designerId
? {
...n,
sort: [{ columnName, order }],
}
: n
),
};
}
export function addToPerspectiveSort(
cfg: PerspectiveConfig,
designerId: string,
columnName: string,
order: 'ASC' | 'DESC'
): PerspectiveConfig {
return {
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == designerId
? {
...n,
sort: [...(n.sort || []).filter(x => x.columnName != columnName), { columnName, order }],
}
: n
),
};
}
export function clearPerspectiveSort(cfg: PerspectiveConfig, designerId: string) {
return {
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == designerId
? {
...n,
sort: [],
}
: n
),
};
}
export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) { export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
const { node, conid, database, root, config, setConfig } = props; const { node, conid, database, root, config, setConfig } = props;
const customJoin = node.customJoinConfig; const customJoin = node.customJoinConfig;
@@ -25,37 +77,11 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
const isSortDefined = sort?.length > 0; const isSortDefined = sort?.length > 0;
const setSort = order => { const setSort = order => {
setConfig( setConfig(cfg => setPerspectiveSort(cfg, parentDesignerId, columnName, order), true);
cfg => ({
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == parentDesignerId
? {
...n,
sort: [{ columnName, order }],
}
: n
),
}),
true
);
}; };
const addToSort = order => { const addToSort = order => {
setConfig( setConfig(cfg => addToPerspectiveSort(cfg, parentDesignerId, columnName, order), true);
cfg => ({
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == parentDesignerId
? {
...n,
sort: [...(n.sort || []), { columnName, order }],
}
: n
),
}),
true
);
// setConfig( // setConfig(
// cfg => ({ // cfg => ({
@@ -70,20 +96,7 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
}; };
const clearSort = () => { const clearSort = () => {
setConfig( setConfig(cfg => clearPerspectiveSort(cfg, parentDesignerId), true);
cfg => ({
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == parentDesignerId
? {
...n,
sort: [],
}
: n
),
}),
true
);
// setConfig( // setConfig(
// cfg => ({ // cfg => ({