table editor WIP

This commit is contained in:
Jan Prochazka
2021-06-17 11:09:26 +02:00
parent 112f310d13
commit 17fc6ccc2e
3 changed files with 85 additions and 22 deletions

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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 @@
</script>
<FormProvider initialValues={columnInfo}>
<FormProvider
initialValues={{
...columnInfo,
isPrimaryKey:
!!columnInfo &&
!!tableInfo?.primaryKey &&
!!tableInfo.primaryKey.columns.find(x => x.columnName == columnInfo.columnName),
}}
>
<ModalBase {...$$restProps}>
<svelte:fragment slot="header"
>{columnInfo ? 'Edit column' : `Add column ${(tableInfo?.columns || []).length + 1}`}</svelte:fragment
>
<FormTextField name="columnName" label="Column name" focused />
<!-- <FormTextField name="dataType" label="Data type" /> -->
<DataTypeEditor />
<!-- <FormSelectField name="dataType" label="Data type" options={dataTypes} /> -->
<FormCheckboxField name="notNull" label="NOT NULL" />
<!-- <FormCheckboxField name="isPrimaryKey" label="Is Primary Key" /> -->
<FormCheckboxField name="isPrimaryKey" label="Is Primary Key" />
<FormCheckboxField name="autoIncrement" label="Is Autoincrement" />
<FormTextField name="defaultValue" label="Default value" />
<FormTextField name="computedExpression" label="Computed expression" />
@@ -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}