diff --git a/packages/tools/src/diffTools.ts b/packages/tools/src/diffTools.ts index 0e9b213c6..f89daaf3c 100644 --- a/packages/tools/src/diffTools.ts +++ b/packages/tools/src/diffTools.ts @@ -1,4 +1,4 @@ -import { TableInfo } from 'dbgate-types'; +import { ColumnInfo, TableInfo } from 'dbgate-types'; import uuidv1 from 'uuid/v1'; export function generateTablePairingId(table: TableInfo): TableInfo { @@ -15,3 +15,70 @@ export function generateTablePairingId(table: TableInfo): TableInfo { } return table; } + +function processPrimaryKey(table: TableInfo, oldColumn: ColumnInfo, newColumn: ColumnInfo) { + if (!oldColumn?.isPrimaryKey && newColumn?.isPrimaryKey) { + if (!table.primaryKey) { + table.primaryKey = { + constraintType: 'primaryKey', + pureName: table.pureName, + schemaName: table.schemaName, + columns: [], + }; + } + table.primaryKey.columns = [ + ...table.primaryKey.columns, + { + columnName: newColumn.columnName, + }, + ]; + } + + console.log('processPrimaryKey', oldColumn, newColumn); + + if (oldColumn?.isPrimaryKey && !newColumn?.isPrimaryKey) { + if (table.primaryKey) { + table.primaryKey = { + ...table.primaryKey, + columns: table.primaryKey.columns.filter(x => x.columnName != oldColumn.columnName), + }; + if (table.primaryKey.columns.length == 0) { + table.primaryKey = null; + } + } + } +} + +export function editorAddColumn(table: TableInfo, column: ColumnInfo): TableInfo { + const res = { + ...table, + columns: [...table.columns, { ...column, pairingId: uuidv1() }], + }; + + processPrimaryKey(res, null, column); + + return res; +} + +export function editorModifyColumn(table: TableInfo, column: ColumnInfo): TableInfo { + const oldColumn = table?.columns?.find(x => x.pairingId == column.pairingId); + + const res = { + ...table, + columns: table.columns.map(col => (col.pairingId == column.pairingId ? column : col)), + }; + processPrimaryKey(res, oldColumn, column); + + return res; +} + +export function editorDeleteColumn(table: TableInfo, column: ColumnInfo): TableInfo { + const res = { + ...table, + columns: table.columns.filter(col => col.pairingId != column.pairingId), + }; + + processPrimaryKey(res, column, null); + + return res; +} diff --git a/packages/types/dbinfo.d.ts b/packages/types/dbinfo.d.ts index f363e1956..87a608d24 100644 --- a/packages/types/dbinfo.d.ts +++ b/packages/types/dbinfo.d.ts @@ -10,7 +10,7 @@ export interface ColumnReference { export interface ConstraintInfo extends NamedObjectInfo { pairingId?: string; - constraintName: string; + constraintName?: string; constraintType: 'primaryKey' | 'foreignKey' | 'index' | 'check' | 'unique'; } @@ -52,6 +52,7 @@ export interface ColumnInfo extends NamedObjectInfo { isSparse: boolean; defaultValue: string; defaultConstraint: string; + isPrimaryKey?: boolean; // only used in editor } export interface DatabaseObjectInfo extends NamedObjectInfo { diff --git a/packages/web/src/tableeditor/ColumnEditorModal.svelte b/packages/web/src/tableeditor/ColumnEditorModal.svelte index 1a51185ac..c6034258b 100644 --- a/packages/web/src/tableeditor/ColumnEditorModal.svelte +++ b/packages/web/src/tableeditor/ColumnEditorModal.svelte @@ -13,6 +13,7 @@ import ElectronFilesInput from '../impexp/ElectronFilesInput.svelte'; import DropDownButton from '../elements/DropDownButton.svelte'; import DataTypeEditor from './DataTypeEditor.svelte'; + import { editorAddColumn, editorDeleteColumn, editorModifyColumn } from 'dbgate-tools'; export let columnInfo; export let setTableInfo; @@ -21,19 +22,25 @@ - + x.columnName == columnInfo.columnName), + }} +> {columnInfo ? 'Edit column' : `Add column ${(tableInfo?.columns || []).length + 1}`} - - - + @@ -44,15 +51,9 @@ on:click={e => { closeCurrentModal(); if (columnInfo) { - setTableInfo(tbl => ({ - ...tbl, - columns: tbl.columns.map(col => (col.pairingId == columnInfo.pairingId ? e.detail : col)), - })); + setTableInfo(tbl => editorModifyColumn(tbl, e.detail)); } else { - setTableInfo(tbl => ({ - ...tbl, - columns: [...tbl.columns, { ...e.detail, pairingId: uuidv1() }], - })); + setTableInfo(tbl => editorAddColumn(tbl, e.detail)); if (onAddNext) onAddNext(); } }} @@ -63,10 +64,7 @@ value="Save" on:click={e => { closeCurrentModal(); - setTableInfo(tbl => ({ - ...tbl, - columns: [...tbl.columns, { ...e.detail, pairingId: uuidv1() }], - })); + setTableInfo(tbl => editorAddColumn(tbl, e.detail)); }} /> {/if} @@ -78,10 +76,7 @@ value="Remove" on:click={() => { closeCurrentModal(); - setTableInfo(tbl => ({ - ...tbl, - columns: tbl.columns.filter(col => col.pairingId != columnInfo.pairingId), - })); + setTableInfo(tbl => editorDeleteColumn(tbl, columnInfo)); }} /> {/if}