mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-20 13:36:02 +00:00
custom joins
This commit is contained in:
@@ -219,14 +219,18 @@
|
||||
}));
|
||||
updateFromDbInfo();
|
||||
} else {
|
||||
callChange(current => ({
|
||||
...current,
|
||||
tables: (current.tables || []).filter(x => x.designerId != table.designerId),
|
||||
references: (current.references || []).filter(
|
||||
x => x.sourceId != table.designerId && x.targetId != table.designerId
|
||||
),
|
||||
columns: (current.columns || []).filter(x => x.designerId != table.designerId),
|
||||
}));
|
||||
callChange(
|
||||
current => ({
|
||||
...current,
|
||||
tables: (current.tables || []).filter(x => x.designerId != table.designerId),
|
||||
references: (current.references || []).filter(
|
||||
x => x.sourceId != table.designerId && x.targetId != table.designerId
|
||||
),
|
||||
columns: (current.columns || []).filter(x => x.designerId != table.designerId),
|
||||
}),
|
||||
undefined,
|
||||
{ removeTables: true }
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
import { onMount, tick } from 'svelte';
|
||||
import {
|
||||
ChangePerspectiveConfigFunc,
|
||||
createPerspectiveNodeConfig,
|
||||
PerspectiveConfig,
|
||||
PerspectiveCustomJoinConfig,
|
||||
PerspectiveTreeNode,
|
||||
@@ -35,7 +36,6 @@
|
||||
|
||||
let conidOverride = editValue?.conid || null;
|
||||
let databaseOverride = editValue?.database || null;
|
||||
let joinid = editValue?.joinid || uuidv1();
|
||||
|
||||
// $: fromDbInfo = useDatabaseInfo({
|
||||
// conid,
|
||||
@@ -68,19 +68,19 @@
|
||||
let columns = editValue?.columns || [];
|
||||
// let fromTableName = pureName;
|
||||
// let fromSchemaName = schemaName;
|
||||
let fromUniuqeName = editValue?.baseUniqueName || root.uniqueName;
|
||||
let fromDesignerId = editValue?.baseDesignerId || root.designerId;
|
||||
let refTableName = editValue?.refTableName || null;
|
||||
let refSchemaName = editValue?.refSchemaName || null;
|
||||
let joinName = editValue?.joinName || '';
|
||||
|
||||
onMount(() => {
|
||||
if (editValue) return;
|
||||
let index = 1;
|
||||
while (config.customJoins?.find(x => x.joinName == `Custom join ${index}`)) {
|
||||
index += 1;
|
||||
}
|
||||
joinName = `Custom join ${index}`;
|
||||
});
|
||||
// onMount(() => {
|
||||
// if (editValue) return;
|
||||
// let index = 1;
|
||||
// while (config.customJoins?.find(x => x.joinName == `Custom join ${index}`)) {
|
||||
// index += 1;
|
||||
// }
|
||||
// joinName = `Custom join ${index}`;
|
||||
// });
|
||||
|
||||
// $: fromTableList = [
|
||||
// ..._.sortBy($fromDbInfo?.tables || [], ['schemaName', 'pureName']),
|
||||
@@ -124,7 +124,7 @@
|
||||
];
|
||||
|
||||
$: fromTableList = root.getBaseTables();
|
||||
$: fromTableInfo = fromTableList?.find(x => x.node.uniqueName == fromUniuqeName)?.table;
|
||||
$: fromTableInfo = fromTableList?.find(x => x.node.designerId == fromDesignerId)?.table;
|
||||
|
||||
$: (async () => {
|
||||
// without this has svelte problem, doesn't invalidate SelectField options
|
||||
@@ -134,7 +134,7 @@
|
||||
|
||||
fromTableOptions = fromTableList.map(tbl => ({
|
||||
label: fullNameToLabel(tbl.table),
|
||||
value: tbl.node.uniqueName,
|
||||
value: tbl.node.designerId,
|
||||
}));
|
||||
|
||||
refTableOptions = refTableList.map(tbl => ({
|
||||
@@ -173,13 +173,13 @@
|
||||
<div class="label col-3">Base table</div>
|
||||
<div class="col-9">
|
||||
<SelectField
|
||||
value={fromUniuqeName}
|
||||
value={fromDesignerId}
|
||||
isNative
|
||||
notSelected
|
||||
options={fromTableOptions}
|
||||
on:change={e => {
|
||||
if (e.detail) {
|
||||
fromUniuqeName = e.detail;
|
||||
fromDesignerId = e.detail;
|
||||
}
|
||||
}}
|
||||
/>
|
||||
@@ -321,23 +321,48 @@
|
||||
<svelte:fragment slot="footer">
|
||||
<FormSubmit
|
||||
value={'Save'}
|
||||
on:click={async () => {
|
||||
const newJoin = {
|
||||
joinid,
|
||||
joinName,
|
||||
baseUniqueName: fromUniuqeName,
|
||||
refTableName,
|
||||
refSchemaName,
|
||||
columns,
|
||||
conid: conidOverride,
|
||||
database: databaseOverride,
|
||||
};
|
||||
setConfig(cfg => ({
|
||||
...cfg,
|
||||
customJoins: editValue
|
||||
? cfg.customJoins.map(x => (x.joinid == editValue.joinid ? newJoin : x))
|
||||
: [...(cfg.customJoins || []), newJoin],
|
||||
}));
|
||||
on:click={() => {
|
||||
setConfig(cfg => {
|
||||
const newNode = createPerspectiveNodeConfig({ pureName: refTableName, schemaName: refSchemaName });
|
||||
newNode.designerId = editValue?.refNodeDesignerId || uuidv1();
|
||||
newNode.conid = conidOverride;
|
||||
newNode.database = databaseOverride;
|
||||
newNode.position = cfg.nodes.find(x => x.designerId == editValue?.refNodeDesignerId)?.position;
|
||||
newNode.alias = joinName || refTableName;
|
||||
|
||||
const newRef = {
|
||||
designerId: editValue?.referenceDesignerId || uuidv1(),
|
||||
sourceId: fromDesignerId,
|
||||
targetId: newNode.designerId,
|
||||
columns: columns.map(col => ({
|
||||
source: col.baseColumnName,
|
||||
target: col.refColumnName,
|
||||
})),
|
||||
};
|
||||
|
||||
return {
|
||||
...cfg,
|
||||
nodes: [...cfg.nodes.filter(x => x.designerId != editValue?.refNodeDesignerId), newNode],
|
||||
references: [...cfg.references.filter(x => x.designerId != editValue?.referenceDesignerId), newRef],
|
||||
};
|
||||
});
|
||||
|
||||
// const newJoin = {
|
||||
// joinid,
|
||||
// joinName,
|
||||
// baseDesignerId: fromDesignerId,
|
||||
// refTableName,
|
||||
// refSchemaName,
|
||||
// columns,
|
||||
// conid: conidOverride,
|
||||
// database: databaseOverride,
|
||||
// };
|
||||
// setConfig(cfg => ({
|
||||
// ...cfg,
|
||||
// customJoins: editValue
|
||||
// ? cfg.customJoins.map(x => (x.joinid == editValue.joinid ? newJoin : x))
|
||||
// : [...(cfg.customJoins || []), newJoin],
|
||||
// }));
|
||||
closeCurrentModal();
|
||||
}}
|
||||
/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { MultipleDatabaseInfo, PerspectiveConfig } from 'dbgate-datalib';
|
||||
import { createPerspectiveNodeConfig, MultipleDatabaseInfo, PerspectiveConfig } from 'dbgate-datalib';
|
||||
import _ from 'lodash';
|
||||
import { tick } from 'svelte';
|
||||
import runCommand from '../commands/runCommand';
|
||||
@@ -46,21 +46,43 @@
|
||||
}
|
||||
const res = {
|
||||
...oldValue,
|
||||
nodes: oldValue.nodes.map(node => {
|
||||
const table = newValue.tables?.find(x => x.designerId == node.designerId);
|
||||
if (table && (table.left != node.position?.x || table.top != node.position?.y)) {
|
||||
if (!settings?.isCalledFromArrange) {
|
||||
isArranged = false;
|
||||
references: newValue.references,
|
||||
nodes: _.compact(
|
||||
oldValue.nodes.map(node => {
|
||||
const table = newValue.tables?.find(x => x.designerId == node.designerId);
|
||||
|
||||
if (!table && settings?.removeTables) {
|
||||
return null;
|
||||
}
|
||||
return {
|
||||
|
||||
const nodeChanged = {
|
||||
...node,
|
||||
position: { x: table.left, y: table.top },
|
||||
alias: table?.alias,
|
||||
};
|
||||
}
|
||||
return node;
|
||||
}),
|
||||
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 };
|
||||
}
|
||||
return nodeChanged;
|
||||
})
|
||||
),
|
||||
};
|
||||
|
||||
for (const table of newValue.tables) {
|
||||
if (res.nodes.find(x => x.designerId == table.designerId)) {
|
||||
continue;
|
||||
}
|
||||
const newNode = createPerspectiveNodeConfig(table);
|
||||
newNode.designerId = table.designerId;
|
||||
newNode.position = { x: table.left, y: table.top };
|
||||
isArranged = false;
|
||||
res.nodes.push(newNode);
|
||||
}
|
||||
|
||||
res.isArranged = isArranged;
|
||||
|
||||
return res;
|
||||
});
|
||||
}
|
||||
@@ -81,10 +103,10 @@
|
||||
showTableCloseButton: true,
|
||||
allowColumnOperations: true,
|
||||
allowCreateRefByDrag: true,
|
||||
allowTableAlias: true,
|
||||
allowScrollColumns: true,
|
||||
canSelectColumns: true,
|
||||
canCheckTables: true,
|
||||
allowTableAlias: true,
|
||||
arrangeAlg: 'tree',
|
||||
referenceMenu: ({ designer, reference, onChangeReference, onRemoveReference }) => {
|
||||
return [{ text: 'Remove', onClick: () => onRemoveReference(reference) }];
|
||||
|
||||
@@ -89,7 +89,8 @@ export function getPerspectiveNodeMenu(props: PerspectiveNodeMenuProps) {
|
||||
onClick: () =>
|
||||
setConfig(cfg => ({
|
||||
...cfg,
|
||||
customJoins: (cfg.customJoins || []).filter(x => x.joinid != customJoin.joinid),
|
||||
nodes: (cfg.nodes || []).filter(x => x.designerId != customJoin.refNodeDesignerId),
|
||||
references: (cfg.references || []).filter(x => x.designerId != customJoin.referenceDesignerId),
|
||||
})),
|
||||
},
|
||||
customJoin && {
|
||||
|
||||
Reference in New Issue
Block a user