diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index e21f51a0f..5ca5fdfca 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -10,9 +10,9 @@ export abstract class PerspectiveTreeNode { ) {} abstract get title(); abstract get codeName(); - abstract get props(); abstract get isExpandable(); abstract get childNodes(): PerspectiveTreeNode[]; + abstract get icon(): string; get uniqueName() { if (this.parentNode) return `${this.parentNode.uniqueName}.${this.codeName}`; return this.codeName; @@ -61,6 +61,12 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { table.foreignKeys.find(fk => fk.columns.length == 1 && fk.columns[0].columnName == column.columnName); } + get icon() { + if (this.column.autoIncrement) return 'img autoincrement'; + if (this.foreignKey) return 'img foreign-key'; + return 'img column'; + } + get codeName() { return this.column.columnName; } @@ -69,10 +75,6 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { return this.column.columnName; } - get props() { - return this.column; - } - get isExpandable() { return !!this.foreignKey; } @@ -83,10 +85,40 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { x => x.pureName == this.foreignKey?.refTableName && x.schemaName == this.foreignKey?.refSchemaName ); return getTableChildPerspectiveNodes(tbl, this.db, this.config, this.setConfig, this); - // return ( - // tbl?.columns?.map(col => new PerspectiveTableColumnNode(col, tbl, this.db, this.config, this.setConfig, this)) || - // [] - // ); + } +} + +export class PerspectiveTableReferenceNode extends PerspectiveTreeNode { + foreignKey: ForeignKeyInfo; + constructor( + public fk: ForeignKeyInfo, + public table: TableInfo, + public db: DatabaseInfo, + config: PerspectiveConfig, + setConfig: ChangePerspectiveConfigFunc, + parentColumn: PerspectiveTreeNode + ) { + super(config, setConfig, parentColumn); + } + + get codeName() { + return this.table.schemaName ? `${this.table.schemaName}:${this.table.pureName}` : this.table.pureName; + } + + get title() { + return this.table.pureName; + } + + get isExpandable() { + return true; + } + + get childNodes(): PerspectiveTreeNode[] { + return getTableChildPerspectiveNodes(this.table, this.db, this.config, this.setConfig, this); + } + + get icon() { + return 'img table'; } } @@ -98,5 +130,15 @@ export function getTableChildPerspectiveNodes( parentColumn: PerspectiveTreeNode ) { if (!table) return []; - return table.columns.map(col => new PerspectiveTableColumnNode(col, table, db, config, setConfig, parentColumn)); + const res = []; + res.push( + ...table.columns.map(col => new PerspectiveTableColumnNode(col, table, db, config, setConfig, parentColumn)) + ); + if (db && table.dependencies) { + for (const fk of table.dependencies) { + const tbl = db.tables.find(x => x.pureName == fk.pureName && x.schemaName == fk.schemaName); + if (tbl) res.push(new PerspectiveTableReferenceNode(fk, tbl, db, config, setConfig, parentColumn)); + } + } + return res; } diff --git a/packages/web/src/perspectives/PerspectiveColumnRow.svelte b/packages/web/src/perspectives/PerspectiveNodeRow.svelte similarity index 68% rename from packages/web/src/perspectives/PerspectiveColumnRow.svelte rename to packages/web/src/perspectives/PerspectiveNodeRow.svelte index 81893cf1d..3f38fb9ef 100644 --- a/packages/web/src/perspectives/PerspectiveColumnRow.svelte +++ b/packages/web/src/perspectives/PerspectiveNodeRow.svelte @@ -3,20 +3,20 @@ import { plusExpandIcon } from '../icons/expandIcons'; import FontIcon from '../icons/FontIcon.svelte'; - export let column; + export let node;
- + column.toggleExpanded()} + icon={node.isExpandable ? plusExpandIcon(node.isExpanded) : 'icon invisible-box'} + on:click={() => node.toggleExpanded()} /> { e.stopPropagation(); }} @@ -24,13 +24,15 @@ e.stopPropagation(); }} on:change={() => { - const newValue = !column.isChecked; + const newValue = !node.isChecked; // display.setColumnVisibility(column.uniquePath, newValue); // dispatch('setvisibility', newValue); }} /> - + + + {node.title}