perspective alias

This commit is contained in:
Jan Prochazka
2022-08-28 13:11:42 +02:00
parent 2284264a92
commit f886b8c95d
6 changed files with 105 additions and 72 deletions

View File

@@ -116,6 +116,9 @@ export abstract class PerspectiveTreeNode {
if (this.isRoot) return this; if (this.isRoot) return this;
return this.parentNode?.rootNode; return this.parentNode?.rootNode;
} }
get isSortable() {
return false;
}
matchChildRow(parentRow: any, childRow: any): boolean { matchChildRow(parentRow: any, childRow: any): boolean {
return true; return true;
} }
@@ -570,6 +573,10 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
return !!this.foreignKey; return !!this.foreignKey;
} }
get isSortable() {
return true;
}
get filterType(): FilterType { get filterType(): FilterType {
return getFilterType(this.column.dataType); return getFilterType(this.column.dataType);
} }
@@ -706,7 +713,7 @@ export class PerspectiveTableNode extends PerspectiveTreeNode {
} }
get title() { get title() {
return this.table.pureName; return this.nodeConfig?.alias || this.table.pureName;
} }
get isExpandable() { get isExpandable() {
@@ -964,9 +971,9 @@ export class PerspectiveCustomJoinTreeNode extends PerspectiveTableNode {
}; };
} }
get title() { // get title() {
return this.customJoin.joinName; // return this.customJoin.joinName || this.customJoin.refTableName;
} // }
get icon() { get icon() {
return 'icon custom-join'; return 'icon custom-join';
@@ -1161,7 +1168,7 @@ export function getTableChildPerspectiveNodes(
refNodeDesignerId: node.designerId, refNodeDesignerId: node.designerId,
referenceDesignerId: ref.designerId, referenceDesignerId: ref.designerId,
baseDesignerId: parentNode.designerId, baseDesignerId: parentNode.designerId,
joinName: node.alias || node.pureName, joinName: node.alias,
refTableName: node.pureName, refTableName: node.pureName,
refSchemaName: node.schemaName, refSchemaName: node.schemaName,
conid: node.conid, conid: node.conid,

View File

@@ -179,6 +179,9 @@
}; };
function createMenu() { function createMenu() {
if (settings?.tableMenu) {
return settings?.tableMenu({ designer, designerId, onRemoveTable });
}
return [ return [
{ text: 'Remove', onClick: () => onRemoveTable({ designerId }) }, { text: 'Remove', onClick: () => onRemoveTable({ designerId }) },
{ divider: true }, { divider: true },

View File

@@ -328,7 +328,7 @@
newNode.conid = conidOverride; newNode.conid = conidOverride;
newNode.database = databaseOverride; newNode.database = databaseOverride;
newNode.position = cfg.nodes.find(x => x.designerId == editValue?.refNodeDesignerId)?.position; newNode.position = cfg.nodes.find(x => x.designerId == editValue?.refNodeDesignerId)?.position;
newNode.alias = joinName || refTableName; newNode.alias = joinName;
const newRef = { const newRef = {
designerId: editValue?.referenceDesignerId || uuidv1(), designerId: editValue?.referenceDesignerId || uuidv1(),

View File

@@ -4,6 +4,7 @@
MultipleDatabaseInfo, MultipleDatabaseInfo,
PerspectiveConfig, PerspectiveConfig,
perspectiveNodesHaveStructure, perspectiveNodesHaveStructure,
PerspectiveTreeNode,
} from 'dbgate-datalib'; } from 'dbgate-datalib';
import _, { findIndex } from 'lodash'; import _, { findIndex } from 'lodash';
import { tick } from 'svelte'; import { tick } from 'svelte';
@@ -11,20 +12,16 @@
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 { import { getPerspectiveNodeMenu } from './perspectiveMenu';
addToPerspectiveFilter,
addToPerspectiveSort,
clearPerspectiveSort,
setPerspectiveSort,
} from './perspectiveMenu';
export let config: PerspectiveConfig; export let config: PerspectiveConfig;
export let dbInfos: MultipleDatabaseInfo; export let dbInfos: MultipleDatabaseInfo;
export let root: PerspectiveTreeNode;
export let conid; export let conid;
export let database; export let database;
export let onChange; export let setConfig;
function createDesignerModel(config: PerspectiveConfig, dbInfos: MultipleDatabaseInfo) { function createDesignerModel(config: PerspectiveConfig, dbInfos: MultipleDatabaseInfo) {
return { return {
@@ -50,7 +47,7 @@
} }
function handleChange(value, skipUndoChain, settings) { function handleChange(value, skipUndoChain, settings) {
onChange(oldValue => { setConfig(oldValue => {
const newValue = _.isFunction(value) ? value(createDesignerModel(oldValue, dbInfos)) : value; const newValue = _.isFunction(value) ? value(createDesignerModel(oldValue, dbInfos)) : value;
let isArranged = oldValue.isArranged; let isArranged = oldValue.isArranged;
if (settings?.isCalledFromArrange) { if (settings?.isCalledFromArrange) {
@@ -67,9 +64,9 @@
...node, ...node,
}; };
if (table) { // if (table) {
nodeChanged.alias = table?.alias; // nodeChanged.alias = table?.alias;
} // }
if (settings?.isCalledFromArrange) { if (settings?.isCalledFromArrange) {
// when called from arrange, position must be set to prevent cycle // when called from arrange, position must be set to prevent cycle
@@ -137,32 +134,29 @@
return [{ text: 'Remove', onClick: () => onRemoveReference(reference) }]; return [{ text: 'Remove', onClick: () => onRemoveReference(reference) }];
}, },
columnMenu: ({ designer, designerId, column, foreignKey }) => { columnMenu: ({ designer, designerId, column, foreignKey }) => {
const node = root.findNodeByDesignerId(designerId);
const child = node.childNodes.find(x => x.columnName == column.columnName);
return getPerspectiveNodeMenu({
config,
setConfig,
conid,
database,
root,
node: child,
});
},
tableMenu: ({ designer, designerId, onRemoveTable }) => {
const node = root.findNodeByDesignerId(designerId);
return [ return [
{ { text: 'Remove', onClick: () => onRemoveTable({ designerId }) },
text: 'Sort ascending', getPerspectiveNodeMenu({
onClick: () => onChange(cfg => setPerspectiveSort(cfg, designerId, column.columnName, 'ASC')), config,
}, setConfig,
{ conid,
text: 'Sort descending', database,
onClick: () => onChange(cfg => setPerspectiveSort(cfg, designerId, column.columnName, 'DESC')), root,
}, node,
{ }),
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)),
},
{ divider: true },
{
text: 'Add to filter',
onClick: () => onChange(cfg => addToPerspectiveFilter(cfg, designerId, column.columnName)),
},
]; ];
}, },
createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'), createReferenceText: reference => (reference.isAutoGenerated ? 'FK' : 'Custom'),
@@ -170,7 +164,7 @@
return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(columnName); return config.nodes.find(x => x.designerId == designerId)?.checkedColumns?.includes(columnName);
}, },
setColumnChecked: (designerId, columnName, value) => { setColumnChecked: (designerId, columnName, value) => {
onChange(cfg => ({ setConfig(cfg => ({
...cfg, ...cfg,
nodes: cfg.nodes.map(node => nodes: cfg.nodes.map(node =>
node.designerId == designerId node.designerId == designerId
@@ -186,7 +180,7 @@
}, },
isTableChecked: designerId => config.nodes?.find(x => x.designerId == designerId)?.isNodeChecked, isTableChecked: designerId => config.nodes?.find(x => x.designerId == designerId)?.isNodeChecked,
setTableChecked: (designerId, value) => { setTableChecked: (designerId, value) => {
onChange(cfg => ({ setConfig(cfg => ({
...cfg, ...cfg,
nodes: cfg.nodes.map(node => nodes: cfg.nodes.map(node =>
node.designerId == designerId node.designerId == designerId

View File

@@ -184,7 +184,7 @@
<svelte:fragment slot="2"> <svelte:fragment slot="2">
<VerticalSplitter> <VerticalSplitter>
<svelte:fragment slot="1"> <svelte:fragment slot="1">
<PerspectiveDesigner {config} {conid} {database} onChange={setConfig} dbInfos={$dbInfos} /> <PerspectiveDesigner {config} {conid} {database} {setConfig} dbInfos={$dbInfos} {root} />
</svelte:fragment> </svelte:fragment>
<svelte:fragment slot="2"> <svelte:fragment slot="2">
<PerspectiveTable {root} {loadedCounts} {config} {setConfig} {conid} {database} /> <PerspectiveTable {root} {loadedCounts} {config} {setConfig} {conid} {database} />

View File

@@ -2,6 +2,7 @@ import { ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveTreeNode } f
import _ from 'lodash'; import _ from 'lodash';
import { showModal } from '../modals/modalTools'; import { showModal } from '../modals/modalTools';
import CustomJoinModal from './CustomJoinModal.svelte'; import CustomJoinModal from './CustomJoinModal.svelte';
import InputTextModal from '../modals/InputTextModal.svelte';
interface PerspectiveNodeMenuProps { interface PerspectiveNodeMenuProps {
node: PerspectiveTreeNode; node: PerspectiveTreeNode;
@@ -86,6 +87,20 @@ export function addToPerspectiveFilter(
}; };
} }
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) { 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;
@@ -104,40 +119,20 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
const addToSort = order => { const addToSort = order => {
setConfig(cfg => addToPerspectiveSort(cfg, parentDesignerId, columnName, order), true); setConfig(cfg => addToPerspectiveSort(cfg, parentDesignerId, columnName, order), true);
// setConfig(
// cfg => ({
// ...cfg,
// sort: {
// ...cfg.sort,
// [parentUniqueName]: [...(cfg.sort?.[parentUniqueName] || []), { uniqueName, order }],
// },
// }),
// true
// );
}; };
const clearSort = () => { const clearSort = () => {
setConfig(cfg => clearPerspectiveSort(cfg, parentDesignerId), true); setConfig(cfg => clearPerspectiveSort(cfg, parentDesignerId), true);
// setConfig(
// cfg => ({
// ...cfg,
// sort: {
// ...cfg.sort,
// [parentUniqueName]: [],
// },
// }),
// true
// );
}; };
return [ return [
{ onClick: () => setSort('ASC'), text: 'Sort ascending' }, node.isSortable && { onClick: () => setSort('ASC'), text: 'Sort ascending' },
{ onClick: () => setSort('DESC'), text: 'Sort descending' }, node.isSortable && { onClick: () => setSort('DESC'), text: 'Sort descending' },
isSortDefined && !order && { onClick: () => addToSort('ASC'), text: 'Add to sort - ascending' }, node.isSortable && isSortDefined && !order && { onClick: () => addToSort('ASC'), text: 'Add to sort - ascending' },
isSortDefined && !order && { onClick: () => addToSort('DESC'), text: 'Add to sort - descending' }, node.isSortable &&
order && { onClick: () => clearSort(), text: 'Clear sort criteria' }, isSortDefined &&
!order && { onClick: () => addToSort('DESC'), text: 'Add to sort - descending' },
node.isSortable && order && { onClick: () => clearSort(), text: 'Clear sort criteria' },
{ divider: true }, { divider: true },
filterInfo && { filterInfo && {
@@ -174,5 +169,39 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
editValue: customJoin, 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
);
},
},
node?.nodeConfig && [
{
text: 'Set alias',
onClick: () => {
showModal(InputTextModal, {
value: node?.nodeConfig?.alias || '',
label: 'New alias',
header: 'Set alias',
onConfirm: newAlias => {
setConfig(cfg => setPerspectiveTableAlias(cfg, node?.designerId, newAlias));
},
});
},
},
node?.nodeConfig?.alias && {
text: 'Remove alias',
onClick: () => setConfig(cfg => setPerspectiveTableAlias(cfg, node?.designerId, null)),
},
],
]; ];
} }