diff --git a/packages/datalib/src/PerspectiveDisplay.ts b/packages/datalib/src/PerspectiveDisplay.ts index ca4cff0e3..7e1985a69 100644 --- a/packages/datalib/src/PerspectiveDisplay.ts +++ b/packages/datalib/src/PerspectiveDisplay.ts @@ -1,37 +1,68 @@ import { PerspectiveTableNode, PerspectiveTreeNode } from './PerspectiveTreeNode'; +import _max from 'lodash/max'; export class PerspectiveDisplayColumn { - subColumns: PerspectiveDisplayColumn[] = []; title: string; dataField: string; + parentColumns: string[] = []; + display: PerspectiveDisplay; + colSpanAtLevel = {}; + + get rowSpan() { + return this.display.columnLevelCount - this.parentColumns.length; + } + + showParent(level: number) { + return !!this.colSpanAtLevel[level]; + } + + getColSpan(level: number) { + return this.colSpanAtLevel[level]; + } + + isVisible(level: number) { + return level == this.columnLevel; + } + + get columnLevel() { + return this.parentColumns.length; + } constructor() {} } export class PerspectiveDisplay { columns: PerspectiveDisplayColumn[] = []; + readonly columnLevelCount: number; constructor(public root: PerspectiveTreeNode, public rows: any[]) { - const children = root.childNodes; - this.fillChildren(root.childNodes, this.columns); + this.fillChildren(root.childNodes, []); + this.columnLevelCount = _max(this.columns.map(x => x.parentColumns.length)) + 1; } - fillChildren(children: PerspectiveTreeNode[], columns: PerspectiveDisplayColumn[]) { + fillChildren(children: PerspectiveTreeNode[], parentColumns: string[]) { for (const child of children) { if (child.isChecked) { - const childColumn = this.nodeToColumn(child); - columns.push(childColumn); + this.processColumn(child, parentColumns); } } } - nodeToColumn(node: PerspectiveTreeNode) { - const res = new PerspectiveDisplayColumn(); - res.title = node.columnTitle; - res.dataField = node.dataField; + processColumn(node: PerspectiveTreeNode, parentColumns: string[]) { if (node.isExpandable) { - this.fillChildren(node.childNodes, res.subColumns); + const countBefore = this.columns.length; + this.fillChildren(node.childNodes, [...parentColumns, node.title]); + + if (this.columns.length > countBefore) { + this.columns[countBefore].colSpanAtLevel[parentColumns.length] = this.columns.length - countBefore; + } + } else { + const column = new PerspectiveDisplayColumn(); + column.title = node.columnTitle; + column.dataField = node.dataField; + column.parentColumns = parentColumns; + column.display = this; + this.columns.push(column); } - return res; } } diff --git a/packages/web/src/perspectives/PerspectiveTable.svelte b/packages/web/src/perspectives/PerspectiveTable.svelte index d1600fcfe..fef44d2c3 100644 --- a/packages/web/src/perspectives/PerspectiveTable.svelte +++ b/packages/web/src/perspectives/PerspectiveTable.svelte @@ -6,7 +6,7 @@ PerspectiveDisplay, PerspectiveTreeNode, } from 'dbgate-datalib'; - import _ from 'lodash'; + import _, { range } from 'lodash'; import { onMount } from 'svelte'; import { prop_dev } from 'svelte/internal'; @@ -60,7 +60,8 @@ const rows = []; await loadLevelData(node, rows); dataRows = rows; - // console.log('RESULT', rows); + + console.log('DISPLAY ROWS', rows); // const rows = await node.loadLevelData(); // for (const child of node.childNodes) { // const loadProps = []; @@ -78,17 +79,18 @@ {#if display} - - - - {#each display.columns as column} - - {/each} - + {#each _.range(display.columnLevelCount) as columnLevel} + + {#each display.columns as column} + {#if column.isVisible(columnLevel)} + + {/if} + {#if column.showParent(columnLevel)} + + {/if} + {/each} + + {/each} {#each display.rows as row}
{column.title}
{column.title}{column.parentColumns[columnLevel]}