mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 20:35:59 +00:00
171 lines
4.4 KiB
TypeScript
171 lines
4.4 KiB
TypeScript
import { ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveTreeNode } from 'dbgate-datalib';
|
|
import _ from 'lodash';
|
|
import { showModal } from '../modals/modalTools';
|
|
import CustomJoinModal from './CustomJoinModal.svelte';
|
|
|
|
interface PerspectiveNodeMenuProps {
|
|
node: PerspectiveTreeNode;
|
|
conid: string;
|
|
database: string;
|
|
root: PerspectiveTreeNode;
|
|
config: PerspectiveConfig;
|
|
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) {
|
|
const { node, conid, database, root, config, setConfig } = props;
|
|
const customJoin = node.customJoinConfig;
|
|
const filterInfo = node.filterInfo;
|
|
|
|
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 => setPerspectiveSort(cfg, parentDesignerId, columnName, order), true);
|
|
};
|
|
|
|
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' },
|
|
{ divider: true },
|
|
|
|
filterInfo && {
|
|
text: 'Add to filter',
|
|
onClick: () =>
|
|
setConfig(cfg => ({
|
|
...cfg,
|
|
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',
|
|
onClick: () =>
|
|
setConfig(cfg => ({
|
|
...cfg,
|
|
nodes: (cfg.nodes || []).filter(x => x.designerId != customJoin.refNodeDesignerId),
|
|
references: (cfg.references || []).filter(x => x.designerId != customJoin.referenceDesignerId),
|
|
})),
|
|
},
|
|
customJoin && {
|
|
text: 'Edit custom join',
|
|
onClick: () =>
|
|
showModal(CustomJoinModal, {
|
|
config,
|
|
setConfig,
|
|
conid,
|
|
database,
|
|
root,
|
|
editValue: customJoin,
|
|
}),
|
|
},
|
|
];
|
|
}
|