mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-17 22:36:01 +00:00
perspective alias
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -179,6 +179,9 @@
|
||||
};
|
||||
|
||||
function createMenu() {
|
||||
if (settings?.tableMenu) {
|
||||
return settings?.tableMenu({ designer, designerId, onRemoveTable });
|
||||
}
|
||||
return [
|
||||
{ text: 'Remove', onClick: () => onRemoveTable({ designerId }) },
|
||||
{ divider: true },
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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} />
|
||||
|
||||
@@ -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)),
|
||||
},
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user