diff --git a/packages/datalib/src/PerspectiveColumnDefinition.ts b/packages/datalib/src/PerspectiveColumnDefinition.ts new file mode 100644 index 000000000..ac2b13596 --- /dev/null +++ b/packages/datalib/src/PerspectiveColumnDefinition.ts @@ -0,0 +1,50 @@ +import { ColumnInfo, ForeignKeyInfo, TableInfo } from 'dbgate-types'; +import { clearConfigCache } from 'prettier'; +import { ChangePerspectiveConfigFunc, PerspectiveConfig } from './PerspectiveConfig'; + +export abstract class PerspectiveColumnDefinition { + abstract get title(); + abstract get props(); + abstract get isExpanded(); + abstract get isExpandable(); + abstract get level(); + abstract toggleExpanded(); +} + +export class PerspectiveTableColumnDefinition extends PerspectiveColumnDefinition { + foreignKey: ForeignKeyInfo; + constructor( + public column: ColumnInfo, + public table: TableInfo, + public config: PerspectiveConfig, + public setConfig: ChangePerspectiveConfigFunc + ) { + super(); + + this.foreignKey = + table.foreignKeys && + table.foreignKeys.find(fk => fk.columns.length == 1 && fk.columns[0].columnName == column.columnName); + } + + get title() { + return this.column.columnName; + } + + get props() { + return this.column; + } + + get isExpanded() { + return this.config.expandedColumns.includes(this.column.uniqueName); + } + + get isExpandable() { + return !!this.foreignKey; + } + + get level() { + return 0; + } + + toggleExpanded() {} +} diff --git a/packages/datalib/src/PerspectiveConfig.ts b/packages/datalib/src/PerspectiveConfig.ts new file mode 100644 index 000000000..b24be768f --- /dev/null +++ b/packages/datalib/src/PerspectiveConfig.ts @@ -0,0 +1,17 @@ +export interface PerspectiveConfig { + hiddenColumns: string[]; + shownColumns: string[]; + expandedColumns: string[]; + collapsedColumns: string[]; +} + +export function createPerspectiveConfig(): PerspectiveConfig { + return { + hiddenColumns: [], + shownColumns: [], + expandedColumns: [], + collapsedColumns: [], + }; +} + +export type ChangePerspectiveConfigFunc = (changeFunc: (config: PerspectiveConfig) => PerspectiveConfig) => void; diff --git a/packages/datalib/src/index.ts b/packages/datalib/src/index.ts index 7bff4808e..3c6f34032 100644 --- a/packages/datalib/src/index.ts +++ b/packages/datalib/src/index.ts @@ -1,5 +1,7 @@ export * from './GridDisplay'; export * from './GridConfig'; +export * from './PerspectiveConfig'; +export * from './PerspectiveColumnDefinition'; export * from './TableGridDisplay'; export * from './ViewGridDisplay'; export * from './JslGridDisplay'; diff --git a/packages/web/src/perspectives/PerspectiveColumnRow.svelte b/packages/web/src/perspectives/PerspectiveColumnRow.svelte new file mode 100644 index 000000000..062a557d1 --- /dev/null +++ b/packages/web/src/perspectives/PerspectiveColumnRow.svelte @@ -0,0 +1,50 @@ + + +
+ + column.togglExpanded()} + /> + + + { + e.stopPropagation(); + }} + on:mousedown={e => { + e.stopPropagation(); + }} + on:change={() => { + const newValue = !column.isChecked; + // display.setColumnVisibility(column.uniquePath, newValue); + // dispatch('setvisibility', newValue); + }} + /> + + +
+ + diff --git a/packages/web/src/perspectives/PerspectiveColumns.svelte b/packages/web/src/perspectives/PerspectiveColumns.svelte index e69de29bb..29820bbf6 100644 --- a/packages/web/src/perspectives/PerspectiveColumns.svelte +++ b/packages/web/src/perspectives/PerspectiveColumns.svelte @@ -0,0 +1,11 @@ + + +{#each columns as column} + +{/each} diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index b13d220fa..3288610f1 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -1,4 +1,6 @@
- + {#if columns} + + {/if}
diff --git a/packages/web/src/tabs/PerspectiveTab.svelte b/packages/web/src/tabs/PerspectiveTab.svelte index 33964347a..6a61bc308 100644 --- a/packages/web/src/tabs/PerspectiveTab.svelte +++ b/packages/web/src/tabs/PerspectiveTab.svelte @@ -1,11 +1,14 @@ - + diff --git a/packages/web/src/utility/usePerspectiveConfig.ts b/packages/web/src/utility/usePerspectiveConfig.ts new file mode 100644 index 000000000..5d77bb689 --- /dev/null +++ b/packages/web/src/utility/usePerspectiveConfig.ts @@ -0,0 +1,25 @@ +import { createPerspectiveConfig } from 'dbgate-datalib'; +import { writable } from 'svelte/store'; +import { onDestroy } from 'svelte'; + +function doLoadPerspectiveConfigFunc(tabid) { + try { + const existing = localStorage.getItem(`tabdata_perspective_${tabid}`); + if (existing) { + return { + ...createPerspectiveConfig(), + ...JSON.parse(existing), + }; + } + } catch (err) { + console.warn('Error loading perspective config:', err.message); + } + return createPerspectiveConfig(); +} + +export default function usePerspectiveConfig(tabid) { + const config = writable(doLoadPerspectiveConfigFunc(tabid)); + const unsubscribe = config.subscribe(value => localStorage.setItem(`tabdata_perspective_${tabid}`, JSON.stringify(value))); + onDestroy(unsubscribe); + return config; +}