diff --git a/packages/datalib/src/PerspectiveTreeNode.ts b/packages/datalib/src/PerspectiveTreeNode.ts index 94aa1e16a..4b1477375 100644 --- a/packages/datalib/src/PerspectiveTreeNode.ts +++ b/packages/datalib/src/PerspectiveTreeNode.ts @@ -352,8 +352,6 @@ export abstract class PerspectiveTreeNode { // } findNodeByDesignerId(designerId: string): PerspectiveTreeNode { - console.log('findNodeByDesignerId', designerId, this.level, this.designerId); - if (!this.designerId) { return null; } diff --git a/packages/datalib/src/processPerspectiveDefaultColunns.ts b/packages/datalib/src/processPerspectiveDefaultColunns.ts index a65451769..eef1213ff 100644 --- a/packages/datalib/src/processPerspectiveDefaultColunns.ts +++ b/packages/datalib/src/processPerspectiveDefaultColunns.ts @@ -42,13 +42,34 @@ function getPerspectiveDefaultColumns( return [[columns[0]], null]; } -export function processPerspectiveDefaultColunns( +export function shouldProcessPerspectiveDefaultColunns( + config: PerspectiveConfig, + dbInfos: MultipleDatabaseInfo, + conid: string, + database: string +) { + const nodesNotProcessed = config.nodes.filter(x => !x.defaultColumnsProcessed); + if (nodesNotProcessed.length == 0) return false; + + for (const node of nodesNotProcessed) { + const db = dbInfos?.[node.conid || conid]?.[node.database || database]; + if (!db) return false; + + const table = db.tables.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName); + const view = db.views.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName); + + if (!table && !view) return false; + } + + return true; +} + +function processPerspectiveDefaultColunnsStep( config: PerspectiveConfig, dbInfos: MultipleDatabaseInfo, conid: string, database: string ) { - console.log('processPerspectiveDefaultColunns'); const rootNode = config.nodes.find(x => x.designerId == config.rootDesignerId); if (!rootNode) return null; const rootDb = dbInfos?.[rootNode.conid || conid]?.[rootNode.database || database]; @@ -56,8 +77,6 @@ export function processPerspectiveDefaultColunns( const rootTable = rootDb.tables.find(x => x.pureName == rootNode.pureName && x.schemaName == rootNode.schemaName); const rootView = rootDb.views.find(x => x.pureName == rootNode.pureName && x.schemaName == rootNode.schemaName); - console.log('CREATE ROOT'); - const root = new PerspectiveTableNode( rootTable || rootView, dbInfos, @@ -69,8 +88,6 @@ export function processPerspectiveDefaultColunns( config.rootDesignerId ); - console.log('ROOT', root); - for (const node of config.nodes) { if (node.defaultColumnsProcessed) continue; @@ -81,7 +98,6 @@ export function processPerspectiveDefaultColunns( const view = db.views.find(x => x.pureName == node.pureName && x.schemaName == node.schemaName); if (table || view) { - console.log('FINDING', node.pureName); const treeNode = root.findNodeByDesignerId(node.designerId); if (!treeNode) continue; const circularColumns = treeNode.childNodes.filter(x => x.isCircular).map(x => x.columnName); @@ -141,3 +157,35 @@ export function processPerspectiveDefaultColunns( return null; } + +function markAllProcessed(config: PerspectiveConfig): PerspectiveConfig { + return { + ...config, + nodes: config.nodes.map(x => ({ + ...x, + defaultColumnsProcessed: true, + })), + }; +} + +export function processPerspectiveDefaultColunns( + config: PerspectiveConfig, + dbInfos: MultipleDatabaseInfo, + conid: string, + database: string +) { + while (config.nodes.filter(x => !x.defaultColumnsProcessed).length > 0) { + const newConfig = processPerspectiveDefaultColunnsStep(config, dbInfos, conid, database); + if (!newConfig) { + return markAllProcessed(config); + } + if ( + newConfig.nodes.filter(x => x.defaultColumnsProcessed).length <= + config.nodes.filter(x => x.defaultColumnsProcessed).length + ) { + return markAllProcessed(config); + } + config = newConfig; + } + return markAllProcessed(config); +} diff --git a/packages/web/src/perspectives/PerspectiveDesigner.svelte b/packages/web/src/perspectives/PerspectiveDesigner.svelte index db52071a9..29b04411f 100644 --- a/packages/web/src/perspectives/PerspectiveDesigner.svelte +++ b/packages/web/src/perspectives/PerspectiveDesigner.svelte @@ -52,20 +52,30 @@ oldValue.nodes.map(node => { const table = newValue.tables?.find(x => x.designerId == node.designerId); + const nodeChanged = { + ...node, + }; + + if (table) { + nodeChanged.alias = table?.alias; + } + + if (settings?.isCalledFromArrange) { + // when called from arrange, position must be set to prevent cycle + nodeChanged.position = { x: table?.left || 0, y: table?.top || 0 }; + } + if (!table && settings?.removeTables) { return null; } - const nodeChanged = { - ...node, - alias: table?.alias, - }; if (table && (table.left != node.position?.x || table.top != node.position?.y)) { if (!settings?.isCalledFromArrange) { isArranged = false; } - nodeChanged.position = { x: table.left, y: table.top }; + // nodeChanged.position = { x: table.left, y: table.top }; } + return nodeChanged; }) ), @@ -94,7 +104,6 @@ async function detectAutoArrange(config: PerspectiveConfig, dbInfos) { if (config.nodes.find(x => !x.position)) { await tick(); - console.log('ARRANGE', config.nodes.length); runCommand('designer.arrange'); } } diff --git a/packages/web/src/perspectives/PerspectiveView.svelte b/packages/web/src/perspectives/PerspectiveView.svelte index cdf143c85..fd6c6d818 100644 --- a/packages/web/src/perspectives/PerspectiveView.svelte +++ b/packages/web/src/perspectives/PerspectiveView.svelte @@ -37,6 +37,7 @@ PerspectiveTableColumnNode, PerspectiveTableNode, processPerspectiveDefaultColunns, + shouldProcessPerspectiveDefaultColunns, } from 'dbgate-datalib'; import _ from 'lodash'; @@ -150,20 +151,23 @@ : null; $: { - tick().then(() => { - const newConfig = processPerspectiveDefaultColunns(config, $dbInfos, conid, database); - if (newConfig) { - if ( - newConfig.nodes.filter(x => x.defaultColumnsProcessed).length > - config.nodes.filter(x => x.defaultColumnsProcessed).length - ) { - console.log('CONFIG CHANGED'); - setConfig(() => newConfig); - } else { - console.warn('No new default columns', newConfig); - } - } - }); + if (shouldProcessPerspectiveDefaultColunns(config, $dbInfos, conid, database)) { + setConfig(cfg => processPerspectiveDefaultColunns(cfg, $dbInfos, conid, database)); + } + // tick().then(() => { + // const newConfig = processPerspectiveDefaultColunns(config, $dbInfos, conid, database); + // if (newConfig) { + // if ( + // newConfig.nodes.filter(x => x.defaultColumnsProcessed).length > + // config.nodes.filter(x => x.defaultColumnsProcessed).length + // ) { + // console.log('CONFIG CHANGED'); + // setConfig(() => newConfig); + // } else { + // console.warn('No new default columns', newConfig); + // } + // } + // }); }