diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index ae9d8cd9c..f3fdd0704 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -715,6 +715,7 @@ export class PerspectiveTableColumnNode extends PerspectiveTreeNode { pureName: this.foreignKey.refTableName, conid: this.databaseConfig.conid, database: this.databaseConfig.database, + objectTypeField: this.table.objectTypeField, }; } return null; @@ -743,8 +744,9 @@ export class PerspectivePatternColumnNode extends PerspectiveTreeNode { refTable: TableInfo; constructor( - public owner: NamedObjectInfo, + public table: TableInfo | ViewInfo | CollectionInfo, public column: PerspectiveDataPatternColumn, + public tableColumn: ColumnInfo, dbs: MultipleDatabaseInfo, config: PerspectiveConfig, setConfig: ChangePerspectiveConfigFunc, @@ -848,10 +850,11 @@ export class PerspectivePatternColumnNode extends PerspectiveTreeNode { } get isSortable() { - return true; + return !this.isChildColumn; } get filterType(): FilterType { + if (this.tableColumn) return getFilterType(this.tableColumn.dataType); return 'mongo'; } @@ -859,8 +862,9 @@ export class PerspectivePatternColumnNode extends PerspectiveTreeNode { return this.column.columns.map( column => new PerspectivePatternColumnNode( - this.owner, + this.table, column, + this.tableColumn, this.dbs, this.config, this.setConfig, @@ -895,8 +899,8 @@ export class PerspectivePatternColumnNode extends PerspectiveTreeNode { return { columnName: this.columnName, filterType: this.filterType, - pureName: this.owner.pureName, - schemaName: this.owner.schemaName, + pureName: this.table.pureName, + schemaName: this.table.schemaName, foreignKey: this.foreignKey, }; } @@ -1013,6 +1017,7 @@ export class PerspectiveTableNode extends PerspectiveTreeNode { pureName: this.table.pureName, conid: this.databaseConfig.conid, database: this.databaseConfig.database, + objectTypeField: this.table.objectTypeField, }; } @@ -1309,6 +1314,7 @@ export function getTableChildPerspectiveNodes( ? new PerspectivePatternColumnNode( table, pattern?.columns?.find(x => x.name == col.columnName), + col, dbs, config, setConfig, @@ -1338,6 +1344,7 @@ export function getTableChildPerspectiveNodes( new PerspectivePatternColumnNode( table, col, + null, dbs, config, setConfig, diff --git a/packages/web/src/perspectives/PerspectiveTable.svelte b/packages/web/src/perspectives/PerspectiveTable.svelte index 32a9b97d0..09277e76d 100644 --- a/packages/web/src/perspectives/PerspectiveTable.svelte +++ b/packages/web/src/perspectives/PerspectiveTable.svelte @@ -16,6 +16,7 @@ ChangePerspectiveConfigFunc, PerspectiveConfig, PerspectiveDisplay, + PerspectivePatternColumnNode, PerspectiveTableColumnNode, PerspectiveTreeNode, PERSPECTIVE_PAGE_SIZE, @@ -41,6 +42,24 @@ import { getFilterValueExpression } from 'dbgate-filterparser'; import StatusBarTabItem from '../widgets/StatusBarTabItem.svelte'; + const TABS_BY_FIELD = { + tables: { + text: 'table', + tabComponent: 'TableDataTab', + icon: 'img table', + }, + views: { + text: 'view', + tabComponent: 'ViewDataTab', + icon: 'img view', + }, + collections: { + text: 'collection', + tabComponent: 'CollectionDataTab', + icon: 'img collection', + }, + }; + const dbg = debug('dbgate:PerspectiveTable'); export const activator = createActivator('PerspectiveTable', true, ['Designer']); @@ -210,24 +229,28 @@ const tableNode = root?.findNodeByDesignerId(tableNodeDesignerId); if (tableNode?.headerTableAttributes) { - const { pureName, schemaName, conid, database } = tableNode?.headerTableAttributes; - res.push({ - text: `Open table ${pureName}`, - onClick: () => { - openNewTab({ - title: pureName, - icon: 'img table', - tabComponent: 'TableDataTab', - props: { - schemaName, - pureName, - conid: conid, - database: database, - objectTypeField: 'tables', - }, - }); - }, - }); + const { pureName, schemaName, conid, database, objectTypeField } = tableNode?.headerTableAttributes; + console.log('objectTypeField', objectTypeField); + const tab = TABS_BY_FIELD[objectTypeField]; + if (tab) { + res.push({ + text: `Open ${tab.text} ${pureName}`, + onClick: () => { + openNewTab({ + title: pureName, + icon: tab.icon, + tabComponent: tab.tabComponent, + props: { + schemaName, + pureName, + conid: conid, + database: database, + objectTypeField, + }, + }); + }, + }); + } } const setColumnDisplay = type => { @@ -291,42 +314,39 @@ const value = display.rows[rowIndex].rowData[columnIndex]; const { dataNode } = column; - if (dataNode instanceof PerspectiveTableColumnNode) { + if ( + dataNode.filterInfo && + (dataNode instanceof PerspectiveTableColumnNode || dataNode instanceof PerspectivePatternColumnNode) + ) { const { table } = dataNode; - let tabComponent = null; - let icon = null; - let objectTypeField = null; - if (dataNode.isTable) { - tabComponent = 'TableDataTab'; - icon = 'img table'; - objectTypeField = 'tables'; - } - if (dataNode.isView) { - tabComponent = 'ViewDataTab'; - icon = 'img view'; - objectTypeField = 'views'; - } - if (tabComponent) { + + const tab = TABS_BY_FIELD[table.objectTypeField]; + const filterExpression = getFilterValueExpression( + value, + dataNode instanceof PerspectiveTableColumnNode ? dataNode.column.dataType : null + ); + + if (tab) { res.push({ - text: 'Open filtered table', + text: 'Open filtered grid', onClick: () => { openNewTab( { title: table.pureName, - icon, - tabComponent, + icon: tab.icon, + tabComponent: tab.tabComponent, props: { schemaName: table.schemaName, pureName: table.pureName, conid, database, - objectTypeField, + objectTypeField: table.objectTypeField, }, }, { grid: { filters: { - [dataNode.columnName]: getFilterValueExpression(value, dataNode.column.dataType), + [dataNode.columnName]: filterExpression, }, // isFormView: true, }, @@ -350,7 +370,7 @@ ...n, filters: { ...n.filters, - [dataNode.columnName]: getFilterValueExpression(value, dataNode.column.dataType), + [dataNode.columnName]: filterExpression, }, } : n