perspective designer WIP

This commit is contained in:
Jan Prochazka
2022-08-25 15:20:16 +02:00
parent aeceb34d19
commit daf7629f5f
2 changed files with 139 additions and 67 deletions

View File

@@ -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: [],

View File

@@ -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 {
} }
} }
createReferenceConfigColumns(): PerspectiveReferenceConfig['columns'] {
return null;
}
ensureNodeConfig(cfg: PerspectiveConfig): PerspectiveConfig {
let node = cfg.nodes.find(x => x.designerId == this.designerId);
if (!node) {
const nodeConfig: PerspectiveNodeConfig = {
...createPerspectiveNodeConfig(this.namedObject),
isAutoGenerated: true,
};
const refConfig: PerspectiveReferenceConfig = {
designerId: uuidv1(),
sourceId: this.parentNode.designerId,
targetId: nodeConfig.designerId,
isAutoGenerated: true,
columns: this.createReferenceConfigColumns(),
};
return {
...cfg,
nodes: [...cfg.nodes, nodeConfig],
references: [...cfg.references, refConfig],
};
}
return cfg;
}
includeInNodeSet(field: 'expandedNodes' | 'uncheckedNodes' | 'checkedNodes', isIncluded: boolean) { includeInNodeSet(field: 'expandedNodes' | 'uncheckedNodes' | 'checkedNodes', isIncluded: boolean) {
// this.setConfig(cfg => { this.setConfig(cfg => {
// const node = cfg.nodes.find(x=>x.designerId==this.designerId); const changedFields = n => ({
// if (!node) { ...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 { return {
// ...cfg,
// nodes: cfg.nodes.map(node =>
// node.designerId == this.parentNode?.designerId
// ? {
// ...node,
// [field]: [...(node[field] || []), this.codeName],
// }
// : node
// ),
// };
// });
if (isIncluded) {
this.setConfig(cfg => ({
...cfg, ...cfg,
nodes: cfg.nodes.map(node => nodes: cfg.nodes.map(n => (n.designerId == this.parentNode?.designerId ? changedFields(n) : n)),
node.designerId == this.parentNode?.designerId };
? { });
...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
),
}));
}
} }
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,8 +971,11 @@ 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(
config,
parentColumn,
designerId =>
new PerspectiveTableColumnNode( new PerspectiveTableColumnNode(
col, col,
table, table,
@@ -925,7 +985,8 @@ export function getTableChildPerspectiveNodes(
dataProvider, dataProvider,
databaseConfig, databaseConfig,
parentColumn, parentColumn,
null designerId
)
) )
); );
const circularColumns = columnNodes.filter(x => x.isCircular).map(x => x.columnName); const circularColumns = columnNodes.filter(x => x.isCircular).map(x => x.columnName);
@@ -945,6 +1006,10 @@ 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(
findDesignerIdForNode(
config,
parentColumn,
designerId =>
new PerspectiveTableReferenceNode( new PerspectiveTableReferenceNode(
fk, fk,
tbl, tbl,
@@ -955,7 +1020,8 @@ export function getTableChildPerspectiveNodes(
databaseConfig, databaseConfig,
isMultiple, isMultiple,
parentColumn, parentColumn,
null designerId
)
) )
); );
} }