diff --git a/packages/datalib/src/CollectionGridDisplay.ts b/packages/datalib/src/CollectionGridDisplay.ts index 6739156aa..df0058f9b 100644 --- a/packages/datalib/src/CollectionGridDisplay.ts +++ b/packages/datalib/src/CollectionGridDisplay.ts @@ -3,6 +3,27 @@ import { GridDisplay, ChangeCacheFunc, ChangeConfigFunc } from './GridDisplay'; import { EngineDriver, ViewInfo, ColumnInfo, CollectionInfo } from 'dbgate-types'; import { GridConfig, GridCache } from './GridConfig'; +function getObjectKeys(obj) { + if (_.isArray(obj)) { + return Object.keys(obj) + .slice(0, 10) + .map(x => parseInt(x)); + } + if (_.isPlainObject(obj)) { + return Object.keys(obj); + } + return []; +} + +function createHeaderText(path) { + let res = path[0]; + for (let i = 1; i < path.length; i++) { + const name = path[i]; + if (_.isNumber(name)) res += `[${name}]`; + else res += `.${name}`; + } + return res; +} export class CollectionGridDisplay extends GridDisplay { constructor( public collection: CollectionInfo, @@ -19,15 +40,13 @@ export class CollectionGridDisplay extends GridDisplay { this.sortable = true; this.editable = false; this.supportsReload = true; + this.isDynamicStructure = true; } getDisplayColumns(rows) { const res = []; for (const row of rows) { - for (const name of Object.keys(row)) { - if (res.find(x => x.columnName == name)) continue; - res.push(this.getDisplayColumn(name)); - } + this.getColumnsForObject([], row, res); } return ( res.map(col => ({ @@ -37,14 +56,32 @@ export class CollectionGridDisplay extends GridDisplay { ); } - getDisplayColumn(columnName: string) { - const uniquePath = [columnName]; + getColumnsForObject(basePath, obj, res) { + for (const name of getObjectKeys(obj)) { + let column = res.find(x => x.columnName == name); + if (!column) { + column = this.getDisplayColumn(basePath, name); + res.push(column); + } + if (_.isPlainObject(obj[name]) || _.isArray(obj[name])) { + column.isExpandable = true; + } + + if (this.isExpandedColumn(column.uniqueName)) { + this.getColumnsForObject([...basePath, name], obj[name], res); + } + } + } + + getDisplayColumn(basePath, columnName) { + const uniquePath = [...basePath, columnName]; const uniqueName = uniquePath.join('.'); return { columnName, - headerText: columnName, + headerText: createHeaderText(uniquePath), uniqueName, uniquePath, + isStructured: true, }; } } diff --git a/packages/datalib/src/GridDisplay.ts b/packages/datalib/src/GridDisplay.ts index 7ed2c113a..f078e28a1 100644 --- a/packages/datalib/src/GridDisplay.ts +++ b/packages/datalib/src/GridDisplay.ts @@ -18,9 +18,11 @@ export interface DisplayColumn { autoIncrement?: boolean; isPrimaryKey?: boolean; foreignKey?: ForeignKeyInfo; + isExpandable?: boolean; isChecked?: boolean; hintColumnName?: string; dataType?: string; + isStructured?: boolean; } export interface DisplayedColumnEx extends DisplayColumn { @@ -59,6 +61,7 @@ export abstract class GridDisplay { editable = false; isLoadedCorrectly = true; supportsReload = false; + isDynamicStructure = false; setColumnVisibility(uniquePath: string[], isVisible: boolean) { const uniqueName = uniquePath.join('.'); @@ -66,7 +69,7 @@ export abstract class GridDisplay { this.includeInColumnSet('hiddenColumns', uniqueName, !isVisible); } else { this.includeInColumnSet('addedColumns', uniqueName, isVisible); - this.reload(); + if (!this.isDynamicStructure) this.reload(); } } diff --git a/packages/datalib/src/TableGridDisplay.ts b/packages/datalib/src/TableGridDisplay.ts index 0bd00f4bd..c9ba5a703 100644 --- a/packages/datalib/src/TableGridDisplay.ts +++ b/packages/datalib/src/TableGridDisplay.ts @@ -59,6 +59,7 @@ export class TableGridDisplay extends GridDisplay { ...col, isChecked: this.isColumnChecked(col), hintColumnName: col.foreignKey ? `hint_${col.uniqueName}` : null, + isExpandable: !!col.foreignKey, })) || [] ); } diff --git a/packages/web/src/datagrid/ColumnManagerRow.svelte b/packages/web/src/datagrid/ColumnManagerRow.svelte index 46b4f1586..86ceb0fe9 100644 --- a/packages/web/src/datagrid/ColumnManagerRow.svelte +++ b/packages/web/src/datagrid/ColumnManagerRow.svelte @@ -18,7 +18,7 @@ > diff --git a/packages/web/src/datagrid/DataGridCell.svelte b/packages/web/src/datagrid/DataGridCell.svelte index cddb52b97..89320bf25 100644 --- a/packages/web/src/datagrid/DataGridCell.svelte +++ b/packages/web/src/datagrid/DataGridCell.svelte @@ -39,7 +39,7 @@ export let hideContent = false; export let onSetFormView; - $: value = (rowData || {})[col.uniqueName]; + $: value = col.isStructured ? _.get(rowData || {}, col.uniquePath) : (rowData || {})[col.uniqueName];