diff --git a/packages/datalib/src/PerspectiveColumnDefinition.ts b/packages/datalib/src/PerspectiveColumnDefinition.ts index ac2b13596..edc67d988 100644 --- a/packages/datalib/src/PerspectiveColumnDefinition.ts +++ b/packages/datalib/src/PerspectiveColumnDefinition.ts @@ -1,14 +1,47 @@ -import { ColumnInfo, ForeignKeyInfo, TableInfo } from 'dbgate-types'; +import { ColumnInfo, DatabaseInfo, ForeignKeyInfo, TableInfo } from 'dbgate-types'; import { clearConfigCache } from 'prettier'; import { ChangePerspectiveConfigFunc, PerspectiveConfig } from './PerspectiveConfig'; export abstract class PerspectiveColumnDefinition { + constructor( + public config: PerspectiveConfig, + public setConfig: ChangePerspectiveConfigFunc, + public parentColumn: PerspectiveTableColumnDefinition + ) {} abstract get title(); + abstract get codeName(); abstract get props(); - abstract get isExpanded(); abstract get isExpandable(); - abstract get level(); - abstract toggleExpanded(); + abstract get childColumns(): PerspectiveColumnDefinition[]; + get uniqueName() { + if (this.parentColumn) return `${this.parentColumn.uniqueName}.${this.codeName}`; + return this.codeName; + } + get level() { + if (this.parentColumn) return this.parentColumn.level + 1; + return 0; + } + get isExpanded() { + return this.config.expandedColumns.includes(this.uniqueName); + } + + toggleExpanded(value?: boolean) { + this.includeInColumnSet('expandedColumns', this.uniqueName, value == null ? !this.isExpanded : value); + } + + includeInColumnSet(field: keyof PerspectiveConfig, uniqueName: string, isIncluded: boolean) { + if (isIncluded) { + this.setConfig(cfg => ({ + ...cfg, + [field]: [...(cfg[field] || []), uniqueName], + })); + } else { + this.setConfig(cfg => ({ + ...cfg, + [field]: (cfg[field] || []).filter(x => x != uniqueName), + })); + } + } } export class PerspectiveTableColumnDefinition extends PerspectiveColumnDefinition { @@ -16,16 +49,22 @@ export class PerspectiveTableColumnDefinition extends PerspectiveColumnDefinitio constructor( public column: ColumnInfo, public table: TableInfo, - public config: PerspectiveConfig, - public setConfig: ChangePerspectiveConfigFunc + public db: DatabaseInfo, + config: PerspectiveConfig, + setConfig: ChangePerspectiveConfigFunc, + parentColumn: PerspectiveTableColumnDefinition ) { - super(); + super(config, setConfig, parentColumn); this.foreignKey = table.foreignKeys && table.foreignKeys.find(fk => fk.columns.length == 1 && fk.columns[0].columnName == column.columnName); } + get codeName() { + return this.column.columnName; + } + get title() { return this.column.columnName; } @@ -34,17 +73,19 @@ export class PerspectiveTableColumnDefinition extends PerspectiveColumnDefinitio return this.column; } - get isExpanded() { - return this.config.expandedColumns.includes(this.column.uniqueName); - } - get isExpandable() { return !!this.foreignKey; } - get level() { - return 0; + get childColumns(): PerspectiveColumnDefinition[] { + if (!this.foreignKey) return []; + const tbl = this?.db?.tables?.find( + x => x.pureName == this.foreignKey?.refTableName && x.schemaName == this.foreignKey?.refSchemaName + ); + return ( + tbl?.columns?.map( + col => new PerspectiveTableColumnDefinition(col, tbl, this.db, this.config, this.setConfig, this) + ) || [] + ); } - - toggleExpanded() {} } diff --git a/packages/web/src/perspectives/PerspectiveColumnRow.svelte b/packages/web/src/perspectives/PerspectiveColumnRow.svelte index 062a557d1..81893cf1d 100644 --- a/packages/web/src/perspectives/PerspectiveColumnRow.svelte +++ b/packages/web/src/perspectives/PerspectiveColumnRow.svelte @@ -10,7 +10,7 @@ column.togglExpanded()} + on:click={() => column.toggleExpanded()} /> diff --git a/packages/web/src/perspectives/PerspectiveColumns.svelte b/packages/web/src/perspectives/PerspectiveColumns.svelte index 29820bbf6..d426a0361 100644 --- a/packages/web/src/perspectives/PerspectiveColumns.svelte +++ b/packages/web/src/perspectives/PerspectiveColumns.svelte @@ -4,8 +4,23 @@ import PerspectiveColumnRow from './PerspectiveColumnRow.svelte'; export let columns = []; + + function processFlatColumns(res, columns) { + for (const col of columns) { + res.push(col); + if (col.isExpanded) { + processFlatColumns(res, col.childColumns); + } + } + } + + function getFlatColumns(columns) { + const res = []; + processFlatColumns(res, columns); + return res; + } -{#each columns as column} +{#each getFlatColumns(columns) as column} {/each} diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index 3288610f1..389d4f483 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -4,7 +4,7 @@ import _ from 'lodash'; import HorizontalSplitter from '../elements/HorizontalSplitter.svelte'; - import { useTableInfo, useViewInfo } from '../utility/metadataLoaders'; + import { useDatabaseInfo, useTableInfo, useViewInfo } from '../utility/metadataLoaders'; import { getLocalStorage, setLocalStorage } from '../utility/storageCache'; import WidgetColumnBar from '../widgets/WidgetColumnBar.svelte'; @@ -32,24 +32,27 @@ return '300px'; } + const dbInfo = useDatabaseInfo({ conid, database }); const tableInfo = useTableInfo({ conid, database, schemaName, pureName }); const viewInfo = useViewInfo({ conid, database, schemaName, pureName }); // $: console.log('tableInfo', $tableInfo); // $: console.log('viewInfo', $viewInfo); - function getTableColumns(table, config, setConfig) { - return table.columns.map(col => new PerspectiveTableColumnDefinition(col, table, config, setConfig)); + function getTableColumns(table, dbInfo, config, setConfig) { + return table.columns.map(col => new PerspectiveTableColumnDefinition(col, table, dbInfo, config, setConfig, null)); } - function getViewColumns(view, config, setConfig) { + function getViewColumns(view, dbInfo, config, setConfig) { return []; } + $: console.log('CFG', config); + $: columns = $tableInfo - ? getTableColumns($tableInfo, config, setConfig) + ? getTableColumns($tableInfo, $dbInfo, config, setConfig) : $viewInfo - ? getViewColumns($viewInfo, config, setConfig) + ? getViewColumns($viewInfo, $dbInfo, config, setConfig) : null;