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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,6 +2,7 @@ import { ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveTreeNode } f
import _ from 'lodash';
import { showModal } from '../modals/modalTools';
import CustomJoinModal from './CustomJoinModal.svelte';
import InputTextModal from '../modals/InputTextModal.svelte';
interface PerspectiveNodeMenuProps {
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) {
const { node, conid, database, root, config, setConfig } = props;
const customJoin = node.customJoinConfig;
@@ -104,40 +119,20 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
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' },
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 && {
@@ -174,5 +169,39 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
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)),
},
],
];
}