diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index 1a50422f2..efc19c4d6 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -1,4 +1,4 @@ -import { ColumnInfo, DatabaseInfo, ForeignKeyInfo, RangeDefinition, TableInfo } from 'dbgate-types'; +import { ColumnInfo, DatabaseInfo, ForeignKeyInfo, RangeDefinition, TableInfo, ViewInfo } from 'dbgate-types'; import { clearConfigCache } from 'prettier'; import { ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveConfigColumns } from './PerspectiveConfig'; import _isEqual from 'lodash/isEqual'; @@ -185,7 +185,7 @@ export abstract class PerspectiveTreeNode { }; } - getOrderBy(table: TableInfo): PerspectiveDataLoadProps['orderBy'] { + getOrderBy(table: TableInfo | ViewInfo): PerspectiveDataLoadProps['orderBy'] { const res = _compact( this.childNodes.map(node => { const sort = this.config?.sort?.[node?.parentNode?.uniqueName]?.find(x => x.uniqueName == node.uniqueName); @@ -199,7 +199,7 @@ export abstract class PerspectiveTreeNode { ); return res.length > 0 ? res - : table?.primaryKey?.columns.map(x => ({ columnName: x.columnName, order: 'ASC' })) || [ + : (table as TableInfo)?.primaryKey?.columns.map(x => ({ columnName: x.columnName, order: 'ASC' })) || [ { columnName: table?.columns[0].columnName, order: 'ASC' }, ]; } @@ -210,7 +210,7 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { refTable: TableInfo; constructor( public column: ColumnInfo, - public table: TableInfo, + public table: TableInfo | ViewInfo, public db: DatabaseInfo, config: PerspectiveConfig, setConfig: ChangePerspectiveConfigFunc, @@ -223,9 +223,9 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { this.defaultChecked = defaultChecked; - this.foreignKey = - table.foreignKeys && - table.foreignKeys.find(fk => fk.columns.length == 1 && fk.columns[0].columnName == column.columnName); + this.foreignKey = (table as TableInfo)?.foreignKeys?.find( + fk => fk.columns.length == 1 && fk.columns[0].columnName == column.columnName + ); this.refTable = db.tables.find( x => x.pureName == this.foreignKey?.refTableName && x.schemaName == this.foreignKey?.refSchemaName @@ -382,6 +382,59 @@ export class PerspectiveTableNode extends PerspectiveTreeNode { } } +export class PerspectiveViewNode extends PerspectiveTreeNode { + constructor( + public view: ViewInfo, + public db: DatabaseInfo, + config: PerspectiveConfig, + setConfig: ChangePerspectiveConfigFunc, + public dataProvider: PerspectiveDataProvider, + databaseConfig: PerspectiveDatabaseConfig, + parentNode: PerspectiveTreeNode + ) { + super(config, setConfig, parentNode, dataProvider, databaseConfig); + } + + getNodeLoadProps(parentRows: any[]): PerspectiveDataLoadProps { + return { + schemaName: this.view.schemaName, + pureName: this.view.pureName, + dataColumns: this.getDataLoadColumns(), + databaseConfig: this.databaseConfig, + orderBy: this.getOrderBy(this.view), + condition: this.getChildrenCondition(), + }; + } + + get codeName() { + return this.view.schemaName ? `${this.view.schemaName}:${this.view.pureName}` : this.view.pureName; + } + + get title() { + return this.view.pureName; + } + + get isExpandable() { + return true; + } + + get childNodes(): PerspectiveTreeNode[] { + return getTableChildPerspectiveNodes( + this.view, + this.db, + this.config, + this.setConfig, + this.dataProvider, + this.databaseConfig, + this + ); + } + + get icon() { + return 'img table'; + } +} + export class PerspectiveTableReferenceNode extends PerspectiveTableNode { constructor( public foreignKey: ForeignKeyInfo, @@ -434,7 +487,7 @@ export class PerspectiveTableReferenceNode extends PerspectiveTableNode { } export function getTableChildPerspectiveNodes( - table: TableInfo, + table: TableInfo | ViewInfo, db: DatabaseInfo, config: PerspectiveConfig, setConfig: ChangePerspectiveConfigFunc, @@ -463,8 +516,8 @@ export function getTableChildPerspectiveNodes( ) ) ); - if (db && table.dependencies) { - for (const fk of table.dependencies) { + if (db && (table as TableInfo)?.dependencies) { + for (const fk of (table as TableInfo)?.dependencies) { const tbl = db.tables.find(x => x.pureName == fk.pureName && x.schemaName == fk.schemaName); if (tbl) res.push( diff --git a/packages/datalib/src/getPerspectiveDefaultColumns.ts b/packages/datalib/src/getPerspectiveDefaultColumns.ts index d3ede9479..1eabe08ee 100644 --- a/packages/datalib/src/getPerspectiveDefaultColumns.ts +++ b/packages/datalib/src/getPerspectiveDefaultColumns.ts @@ -1,7 +1,7 @@ import { findForeignKeyForColumn } from 'dbgate-tools'; -import { DatabaseInfo, TableInfo } from 'dbgate-types'; +import { DatabaseInfo, TableInfo, ViewInfo } from 'dbgate-types'; -export function getPerspectiveDefaultColumns(table: TableInfo, db: DatabaseInfo): string[] { +export function getPerspectiveDefaultColumns(table: TableInfo | ViewInfo, db: DatabaseInfo): string[] { const columns = table.columns.map(x => x.columnName); const predicates = [ x => x.toLowerCase() == 'name', @@ -9,7 +9,7 @@ export function getPerspectiveDefaultColumns(table: TableInfo, db: DatabaseInfo) x => x.toLowerCase().includes('name'), x => x.toLowerCase().includes('title'), x => x.dataType?.toLowerCase()?.includes('char'), - x => findForeignKeyForColumn(table, x)?.columns?.length == 1, + x => findForeignKeyForColumn(table as TableInfo, x)?.columns?.length == 1, ]; for (const predicate of predicates) { diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index a4a2364d2..7fe147aac 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -142,6 +142,12 @@ tab: 'TableStructureTab', icon: 'img view-structure', }, + { + label: 'Open perspective', + tab: 'PerspectiveTab', + forceNewTab: true, + icon: 'img perspective', + }, { label: 'Drop view', isDrop: true, @@ -193,12 +199,6 @@ dropViews: true, }, }, - { - label: 'Create perspective', - tab: 'PerspectiveTab', - forceNewTab: true, - icon: 'img perspective', - }, ], matviews: [ { diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index 50e3ecb47..19745a4e1 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -5,6 +5,7 @@ PerspectiveDataProvider, PerspectiveTableColumnNode, PerspectiveTableNode, + PerspectiveViewNode, } from 'dbgate-datalib'; import _ from 'lodash'; @@ -60,6 +61,8 @@ $: loader = new PerspectiveDataLoader(apiCall); $: root = $tableInfo ? new PerspectiveTableNode($tableInfo, $dbInfo, config, setConfig, dataProvider, { conid, database }, null) + : $viewInfo + ? new PerspectiveViewNode($viewInfo, $dbInfo, config, setConfig, dataProvider, { conid, database }, null) : null; // $: console.log('CONFIG', config);