mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-27 14:56:00 +00:00
perspective designer WIP
This commit is contained in:
@@ -88,9 +88,9 @@ export interface PerspectiveConfig {
|
|||||||
references: PerspectiveReferenceConfig[];
|
references: PerspectiveReferenceConfig[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createPerspectiveConfig(rootObject: { schemaName?: string; pureName: string }): PerspectiveConfig {
|
export function createPerspectiveNodeConfig(name: { schemaName?: string; pureName: string }) {
|
||||||
const rootNode: PerspectiveNodeConfig = {
|
const node: PerspectiveNodeConfig = {
|
||||||
...rootObject,
|
...name,
|
||||||
designerId: uuidv1(),
|
designerId: uuidv1(),
|
||||||
|
|
||||||
expandedNodes: [],
|
expandedNodes: [],
|
||||||
@@ -100,6 +100,12 @@ export function createPerspectiveConfig(rootObject: { schemaName?: string; pureN
|
|||||||
sort: [],
|
sort: [],
|
||||||
filters: {},
|
filters: {},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createPerspectiveConfig(rootObject: { schemaName?: string; pureName: string }): PerspectiveConfig {
|
||||||
|
const rootNode = createPerspectiveNodeConfig(rootObject);
|
||||||
return {
|
return {
|
||||||
nodes: [rootNode],
|
nodes: [rootNode],
|
||||||
references: [],
|
references: [],
|
||||||
|
|||||||
@@ -9,11 +9,13 @@ import {
|
|||||||
} from 'dbgate-types';
|
} from 'dbgate-types';
|
||||||
import {
|
import {
|
||||||
ChangePerspectiveConfigFunc,
|
ChangePerspectiveConfigFunc,
|
||||||
|
createPerspectiveNodeConfig,
|
||||||
MultipleDatabaseInfo,
|
MultipleDatabaseInfo,
|
||||||
PerspectiveConfig,
|
PerspectiveConfig,
|
||||||
PerspectiveCustomJoinConfig,
|
PerspectiveCustomJoinConfig,
|
||||||
PerspectiveFilterColumnInfo,
|
PerspectiveFilterColumnInfo,
|
||||||
PerspectiveNodeConfig,
|
PerspectiveNodeConfig,
|
||||||
|
PerspectiveReferenceConfig,
|
||||||
} from './PerspectiveConfig';
|
} from './PerspectiveConfig';
|
||||||
import _isEqual from 'lodash/isEqual';
|
import _isEqual from 'lodash/isEqual';
|
||||||
import _cloneDeep from 'lodash/cloneDeep';
|
import _cloneDeep from 'lodash/cloneDeep';
|
||||||
@@ -33,6 +35,7 @@ import { getFilterType, parseFilter } from 'dbgate-filterparser';
|
|||||||
import { FilterType } from 'dbgate-filterparser/lib/types';
|
import { FilterType } from 'dbgate-filterparser/lib/types';
|
||||||
import { Condition, Expression, Select } from 'dbgate-sqltree';
|
import { Condition, Expression, Select } from 'dbgate-sqltree';
|
||||||
import { getPerspectiveDefaultColumns } from './getPerspectiveDefaultColumns';
|
import { getPerspectiveDefaultColumns } from './getPerspectiveDefaultColumns';
|
||||||
|
import uuidv1 from 'uuid/v1';
|
||||||
|
|
||||||
export interface PerspectiveDataLoadPropsWithNode {
|
export interface PerspectiveDataLoadPropsWithNode {
|
||||||
props: PerspectiveDataLoadProps;
|
props: PerspectiveDataLoadProps;
|
||||||
@@ -182,51 +185,50 @@ export abstract class PerspectiveTreeNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
includeInNodeSet(field: 'expandedNodes' | 'uncheckedNodes' | 'checkedNodes', isIncluded: boolean) {
|
createReferenceConfigColumns(): PerspectiveReferenceConfig['columns'] {
|
||||||
// this.setConfig(cfg => {
|
return null;
|
||||||
// const node = cfg.nodes.find(x=>x.designerId==this.designerId);
|
}
|
||||||
// if (!node) {
|
|
||||||
|
|
||||||
// }
|
ensureNodeConfig(cfg: PerspectiveConfig): PerspectiveConfig {
|
||||||
|
let node = cfg.nodes.find(x => x.designerId == this.designerId);
|
||||||
// return {
|
if (!node) {
|
||||||
// ...cfg,
|
const nodeConfig: PerspectiveNodeConfig = {
|
||||||
// nodes: cfg.nodes.map(node =>
|
...createPerspectiveNodeConfig(this.namedObject),
|
||||||
// node.designerId == this.parentNode?.designerId
|
isAutoGenerated: true,
|
||||||
// ? {
|
};
|
||||||
// ...node,
|
const refConfig: PerspectiveReferenceConfig = {
|
||||||
// [field]: [...(node[field] || []), this.codeName],
|
designerId: uuidv1(),
|
||||||
// }
|
sourceId: this.parentNode.designerId,
|
||||||
// : node
|
targetId: nodeConfig.designerId,
|
||||||
// ),
|
isAutoGenerated: true,
|
||||||
// };
|
columns: this.createReferenceConfigColumns(),
|
||||||
// });
|
};
|
||||||
|
return {
|
||||||
if (isIncluded) {
|
|
||||||
this.setConfig(cfg => ({
|
|
||||||
...cfg,
|
...cfg,
|
||||||
nodes: cfg.nodes.map(node =>
|
nodes: [...cfg.nodes, nodeConfig],
|
||||||
node.designerId == this.parentNode?.designerId
|
references: [...cfg.references, refConfig],
|
||||||
? {
|
};
|
||||||
...node,
|
|
||||||
[field]: [...(node[field] || []), this.codeName],
|
|
||||||
}
|
|
||||||
: node
|
|
||||||
),
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
this.setConfig(cfg => ({
|
|
||||||
...cfg,
|
|
||||||
nodes: cfg.nodes.map(node =>
|
|
||||||
node.designerId == this.parentNode?.designerId
|
|
||||||
? {
|
|
||||||
...node,
|
|
||||||
[field]: (node[field] || []).filter(x => x != this.codeName),
|
|
||||||
}
|
|
||||||
: node
|
|
||||||
),
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
includeInNodeSet(field: 'expandedNodes' | 'uncheckedNodes' | 'checkedNodes', isIncluded: boolean) {
|
||||||
|
this.setConfig(cfg => {
|
||||||
|
const changedFields = n => ({
|
||||||
|
...n,
|
||||||
|
[field]: isIncluded ? [...(n[field] || []), this.codeName] : (n[field] || []).filter(x => x != this.codeName),
|
||||||
|
});
|
||||||
|
|
||||||
|
cfg = this.parentNode?.ensureNodeConfig(cfg);
|
||||||
|
if (isIncluded && field == 'expandedNodes') {
|
||||||
|
cfg = this.ensureNodeConfig(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
...cfg,
|
||||||
|
nodes: cfg.nodes.map(n => (n.designerId == this.parentNode?.designerId ? changedFields(n) : n)),
|
||||||
|
};
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getFilter() {
|
getFilter() {
|
||||||
@@ -463,6 +465,13 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createReferenceConfigColumns(): PerspectiveReferenceConfig['columns'] {
|
||||||
|
return this.foreignKey?.columns?.map(col => ({
|
||||||
|
source: col.columnName,
|
||||||
|
target: col.refColumnName,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
getNodeLoadProps(parentRows: any[]): PerspectiveDataLoadProps {
|
getNodeLoadProps(parentRows: any[]): PerspectiveDataLoadProps {
|
||||||
if (!this.foreignKey) return null;
|
if (!this.foreignKey) return null;
|
||||||
return {
|
return {
|
||||||
@@ -775,6 +784,13 @@ export class PerspectiveTableReferenceNode extends PerspectiveTableNode {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createReferenceConfigColumns(): PerspectiveReferenceConfig['columns'] {
|
||||||
|
return this.foreignKey?.columns?.map(col => ({
|
||||||
|
source: col.refColumnName,
|
||||||
|
target: col.columnName,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
get columnTitle() {
|
get columnTitle() {
|
||||||
return this.table.pureName;
|
return this.table.pureName;
|
||||||
}
|
}
|
||||||
@@ -902,6 +918,47 @@ export class PerspectiveCustomJoinTreeNode extends PerspectiveTableNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function findDesignerIdForNode<T extends PerspectiveTreeNode>(
|
||||||
|
config: PerspectiveConfig,
|
||||||
|
parentNode: PerspectiveTreeNode,
|
||||||
|
nodeCreateFunc: (designerId: string) => T
|
||||||
|
): T {
|
||||||
|
const node = nodeCreateFunc(null);
|
||||||
|
const refColumns = node.createReferenceConfigColumns();
|
||||||
|
if (!refColumns?.length) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
const ref1 = config.references.find(
|
||||||
|
x =>
|
||||||
|
x.sourceId == parentNode.designerId &&
|
||||||
|
_isEqual(
|
||||||
|
refColumns.map(x => x.source),
|
||||||
|
x.columns.map(x => x.source)
|
||||||
|
) &&
|
||||||
|
_isEqual(
|
||||||
|
refColumns.map(x => x.target),
|
||||||
|
x.columns.map(x => x.target)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if (ref1) return nodeCreateFunc(ref1.targetId);
|
||||||
|
|
||||||
|
const ref2 = config.references.find(
|
||||||
|
x =>
|
||||||
|
x.targetId == parentNode.designerId &&
|
||||||
|
_isEqual(
|
||||||
|
refColumns.map(x => x.target),
|
||||||
|
x.columns.map(x => x.source)
|
||||||
|
) &&
|
||||||
|
_isEqual(
|
||||||
|
refColumns.map(x => x.source),
|
||||||
|
x.columns.map(x => x.target)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if (ref2) return nodeCreateFunc(ref2.sourceId);
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
export function getTableChildPerspectiveNodes(
|
export function getTableChildPerspectiveNodes(
|
||||||
table: TableInfo | ViewInfo,
|
table: TableInfo | ViewInfo,
|
||||||
dbs: MultipleDatabaseInfo,
|
dbs: MultipleDatabaseInfo,
|
||||||
@@ -914,19 +971,23 @@ export function getTableChildPerspectiveNodes(
|
|||||||
if (!table) return [];
|
if (!table) return [];
|
||||||
const db = parentColumn.db;
|
const db = parentColumn.db;
|
||||||
|
|
||||||
const columnNodes = table.columns.map(
|
const columnNodes = table.columns.map(col =>
|
||||||
col =>
|
findDesignerIdForNode(
|
||||||
new PerspectiveTableColumnNode(
|
config,
|
||||||
col,
|
parentColumn,
|
||||||
table,
|
designerId =>
|
||||||
dbs,
|
new PerspectiveTableColumnNode(
|
||||||
config,
|
col,
|
||||||
setConfig,
|
table,
|
||||||
dataProvider,
|
dbs,
|
||||||
databaseConfig,
|
config,
|
||||||
parentColumn,
|
setConfig,
|
||||||
null
|
dataProvider,
|
||||||
)
|
databaseConfig,
|
||||||
|
parentColumn,
|
||||||
|
designerId
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
const circularColumns = columnNodes.filter(x => x.isCircular).map(x => x.columnName);
|
const circularColumns = columnNodes.filter(x => x.isCircular).map(x => x.columnName);
|
||||||
const defaultColumns = getPerspectiveDefaultColumns(table, db, circularColumns);
|
const defaultColumns = getPerspectiveDefaultColumns(table, db, circularColumns);
|
||||||
@@ -945,17 +1006,22 @@ export function getTableChildPerspectiveNodes(
|
|||||||
(table as TableInfo)?.dependencies.filter(x => x.pureName == fk.pureName && x.schemaName == fk.schemaName)
|
(table as TableInfo)?.dependencies.filter(x => x.pureName == fk.pureName && x.schemaName == fk.schemaName)
|
||||||
.length >= 2;
|
.length >= 2;
|
||||||
dependencies.push(
|
dependencies.push(
|
||||||
new PerspectiveTableReferenceNode(
|
findDesignerIdForNode(
|
||||||
fk,
|
|
||||||
tbl,
|
|
||||||
dbs,
|
|
||||||
config,
|
config,
|
||||||
setConfig,
|
|
||||||
dataProvider,
|
|
||||||
databaseConfig,
|
|
||||||
isMultiple,
|
|
||||||
parentColumn,
|
parentColumn,
|
||||||
null
|
designerId =>
|
||||||
|
new PerspectiveTableReferenceNode(
|
||||||
|
fk,
|
||||||
|
tbl,
|
||||||
|
dbs,
|
||||||
|
config,
|
||||||
|
setConfig,
|
||||||
|
dataProvider,
|
||||||
|
databaseConfig,
|
||||||
|
isMultiple,
|
||||||
|
parentColumn,
|
||||||
|
designerId
|
||||||
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user