mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-17 23:45:59 +00:00
perspective alias
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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 },
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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} />
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
},
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user