diagram - update tables from db info

This commit is contained in:
Jan Prochazka
2022-01-05 16:39:21 +01:00
parent 5843ef458d
commit 1b551a8665
4 changed files with 57 additions and 19 deletions

View File

@@ -5,7 +5,7 @@
import DesignerTable from './DesignerTable.svelte'; import DesignerTable from './DesignerTable.svelte';
import { isConnectedByReference } from './designerTools'; import { isConnectedByReference } from './designerTools';
import uuidv1 from 'uuid/v1'; import uuidv1 from 'uuid/v1';
import { getTableInfo } from '../utility/metadataLoaders'; import { getTableInfo, useDatabaseInfo } from '../utility/metadataLoaders';
import cleanupDesignColumns from './cleanupDesignColumns'; import cleanupDesignColumns from './cleanupDesignColumns';
import _ from 'lodash'; import _ from 'lodash';
import createRef from '../utility/createRef'; import createRef from '../utility/createRef';
@@ -13,6 +13,7 @@
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
import { tick } from 'svelte'; import { tick } from 'svelte';
import contextMenu from '../utility/contextMenu'; import contextMenu from '../utility/contextMenu';
import stableStringify from 'json-stable-stringify';
export let value; export let value;
export let onChange; export let onChange;
@@ -26,6 +27,8 @@
const sourceDragColumn$ = writable(null); const sourceDragColumn$ = writable(null);
const targetDragColumn$ = writable(null); const targetDragColumn$ = writable(null);
const dbInfo = settings?.updateFromDbInfo ? useDatabaseInfo({ conid, database }) : null;
$: tables = value?.tables as any[]; $: tables = value?.tables as any[];
$: references = value?.references as any[]; $: references = value?.references as any[];
@@ -48,6 +51,41 @@
return tables; return tables;
} }
$: {
if (dbInfo) {
updateFromDbInfo($dbInfo);
}
}
function updateFromDbInfo(db) {
if (!settings?.updateFromDbInfo || !db) return;
onChange(current => {
let newTables = current.tables || [];
for (const table of current.tables || []) {
const dbTable = (db.tables || []).find(x => x.pureName == table.pureName && x.schemaName == table.schemaName);
if (
stableStringify(_.pick(dbTable, ['columns', 'primaryKey', 'foreignKeys'])) !=
stableStringify(_.pick(table, ['columns', 'primaryKey', 'foreignKeys']))
) {
newTables = newTables.map(x =>
x == table
? {
...table,
..._.pick(dbTable, ['columns', 'primaryKey', 'foreignKeys']),
}
: x
);
}
}
return {
...current,
tables: newTables,
};
}, true);
}
function callChange(changeFunc, skipUndoChain = undefined) { function callChange(changeFunc, skipUndoChain = undefined) {
onChange(changeFunc, skipUndoChain); onChange(changeFunc, skipUndoChain);
tick().then(recomputeReferencePositions); tick().then(recomputeReferencePositions);
@@ -169,19 +207,21 @@
alias, alias,
}, },
], ],
references: [ references: settings?.allowCreateRefByDrag
...(current.references || []), ? [
{ ...(current.references || []),
designerId: uuidv1(), {
sourceId: fromTable.designerId, designerId: uuidv1(),
targetId: newTableDesignerId, sourceId: fromTable.designerId,
joinType: 'INNER JOIN', targetId: newTableDesignerId,
columns: foreignKey.columns.map(col => ({ joinType: 'INNER JOIN',
source: col.columnName, columns: foreignKey.columns.map(col => ({
target: col.refColumnName, source: col.columnName,
})), target: col.refColumnName,
}, })),
], },
]
: current.references,
}; };
}); });
}; };

View File

@@ -9,5 +9,6 @@
allowColumnOperations: false, allowColumnOperations: false,
allowCreateRefByDrag: false, allowCreateRefByDrag: false,
allowTableAlias: false, allowTableAlias: false,
updateFromDbInfo: true,
}} }}
/> />

View File

@@ -9,5 +9,6 @@
allowColumnOperations: true, allowColumnOperations: true,
allowCreateRefByDrag: true, allowCreateRefByDrag: true,
allowTableAlias: true, allowTableAlias: true,
updateFromDbInfo: false,
}} }}
/> />

View File

@@ -16,7 +16,7 @@
<script lang="ts"> <script lang="ts">
import useEditorData from '../query/useEditorData'; import useEditorData from '../query/useEditorData';
import { extensions } from '../stores'; import { extensions } from '../stores';
import { useConnectionInfo } from '../utility/metadataLoaders'; import { useConnectionInfo, useDatabaseInfo } from '../utility/metadataLoaders';
import { registerFileCommands } from '../commands/stdCommands'; import { registerFileCommands } from '../commands/stdCommands';
import createUndoReducer from '../utility/createUndoReducer'; import createUndoReducer from '../utility/createUndoReducer';
import _ from 'lodash'; import _ from 'lodash';
@@ -31,9 +31,6 @@
export const activator = createActivator('DiagramTab', true); export const activator = createActivator('DiagramTab', true);
$: connection = useConnectionInfo({ conid });
$: engine = findEngineDriver($connection, $extensions);
$: setEditorData($modelState.value); $: setEditorData($modelState.value);
export function getTabId() { export function getTabId() {
@@ -78,7 +75,6 @@
const [modelState, dispatchModel] = createUndoReducer({ const [modelState, dispatchModel] = createUndoReducer({
tables: [], tables: [],
references: [], references: [],
columns: [],
}); });
function createMenu() { function createMenu() {