Files
dbgate/packages/web/src/perspectives/perspectiveMenu.ts
2022-11-06 13:31:13 +01:00

223 lines
6.0 KiB
TypeScript

import type { ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveTreeNode } from 'dbgate-datalib';
import _ from 'lodash';
import { showModal } from '../modals/modalTools';
import CustomJoinModal from './CustomJoinModal.svelte';
import InputTextModal from '../modals/InputTextModal.svelte';
import runCommand from '../commands/runCommand';
import { tick } from 'svelte';
interface PerspectiveNodeMenuProps {
node: PerspectiveTreeNode;
conid: string;
database: string;
root: PerspectiveTreeNode;
config: PerspectiveConfig;
setConfig: ChangePerspectiveConfigFunc;
designerId: string;
}
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 addToPerspectiveFilter(
cfg: PerspectiveConfig,
designerId: string,
columnName: string,
filterValue: string = ''
) {
return {
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == designerId
? {
...n,
filters: {
...n.filters,
[columnName]: filterValue,
},
}
: n
),
};
}
export function setPerspectiveTableAlias(cfg: PerspectiveConfig, designerId: string, alias: string) {
return {
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == designerId
? {
...n,
alias,
}
: n
),
};
}
export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
const { node, conid, database, root, config, setConfig, designerId } = 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 nodeConfig = config.nodes.find(x => x.designerId == designerId);
const setSort = order => {
setConfig(cfg => setPerspectiveSort(cfg, parentDesignerId, columnName, order), true);
};
const addToSort = order => {
setConfig(cfg => addToPerspectiveSort(cfg, parentDesignerId, columnName, order), true);
};
const clearSort = () => {
setConfig(cfg => clearPerspectiveSort(cfg, parentDesignerId), true);
};
return [
node?.isSortable && { onClick: () => setSort('ASC'), text: 'Sort ascending' },
node?.isSortable && { onClick: () => setSort('DESC'), text: 'Sort descending' },
node?.isSortable && isSortDefined && !order && { onClick: () => addToSort('ASC'), text: 'Add to sort - ascending' },
node?.isSortable &&
isSortDefined &&
!order && { onClick: () => addToSort('DESC'), text: 'Add to sort - descending' },
node?.isSortable && order && { onClick: () => clearSort(), text: 'Clear sort criteria' },
{ divider: true },
filterInfo && {
text: 'Add to filter',
onClick: () => setConfig(cfg => addToPerspectiveFilter(cfg, parentDesignerId, columnName)),
},
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,
}),
},
node?.supportsParentFilter && {
text: node.isParentFilter ? 'Cancel filter parent rows' : 'Filter parent rows',
onClick: () => {
setConfig(
cfg => ({
...cfg,
nodes: cfg.nodes.map(n =>
n.designerId == node?.designerId ? { ...n, isParentFilter: !node.isParentFilter } : n
),
}),
true
);
},
},
nodeConfig && [
{
text: 'Set alias',
onClick: () => {
showModal(InputTextModal, {
value: node?.nodeConfig?.alias || '',
label: 'New alias',
header: 'Set alias',
onConfirm: newAlias => {
setConfig(cfg => setPerspectiveTableAlias(cfg, designerId, newAlias));
},
});
},
},
nodeConfig?.alias && {
text: 'Remove alias',
onClick: () => setConfig(cfg => setPerspectiveTableAlias(cfg, designerId, null)),
},
],
nodeConfig &&
config.rootDesignerId != designerId && [
{ divider: true },
{
text: 'Set root',
onClick: async () => {
setConfig(cfg => ({
...cfg,
rootDesignerId: designerId,
}));
await tick();
if (config.isArranged) {
runCommand('designer.arrange');
}
},
},
],
];
}