diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index c27a0fb69..d8d0281f8 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -44,6 +44,10 @@ label: 'Drop table', isDrop: true, }, + { + label: 'Rename table', + isRename: true, + }, { label: 'Query designer', isQueryDesigner: true, @@ -353,6 +357,7 @@ import createQuickExportMenu from '../utility/createQuickExportMenu'; import ConfirmSqlModal from '../modals/ConfirmSqlModal.svelte'; import axiosInstance from '../utility/axiosInstance'; + import { alterDatabaseDialog, renameDatabaseObjectDialog } from '../utility/alterDatabaseTools'; export let data; @@ -508,34 +513,20 @@ }); } else if (menu.isDrop) { const { conid, database } = data; - const db = generateDbPairingId(await getDatabaseInfo({ conid, database })); - console.log('DB', db); - const driver = await getDriver(); - const dbUpdated = { + alterDatabaseDialog(conid, database, db => ({ ...db, [data.objectTypeField]: (db[data.objectTypeField] || []).filter( x => x.schemaName != data.schemaName || x.pureName != data.pureName ), - }; - - const sql = getAlterDatabaseScript(db, dbUpdated, {}, db, driver); - - showModal(ConfirmSqlModal, { - sql, - onConfirm: async () => { - const resp = await axiosInstance.request({ - url: 'database-connections/run-script', - method: 'post', - params: { - conid, - database, - }, - data: { sql }, - }); - await axiosInstance.post('database-connections/sync-model', { conid, database }); - }, - engine: driver.engine, - }); + })); + } else if (menu.isRename) { + const { conid, database } = data; + renameDatabaseObjectDialog(conid, database, data.pureName, (db, newName) => ({ + ...db, + [data.objectTypeField]: (db[data.objectTypeField] || []).map(x => + x.schemaName == data.schemaName && x.pureName == data.pureName ? { ...x, pureName: newName } : x + ), + })); } else { openDatabaseObjectDetail(menu.tab, menu.scriptTemplate, data, menu.forceNewTab, menu.initialData); } diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index a0754b624..c3897d35c 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -150,3 +150,9 @@ useSettings().subscribe(value => { invalidateCommands(); }); export const getCurrentSettings = () => currentSettingsValue || {}; + +let extensionsValue = null; +extensions.subscribe(value => { + extensionsValue = value; +}); +export const getExtensions = () => extensionsValue; diff --git a/packages/web/src/utility/alterDatabaseTools.ts b/packages/web/src/utility/alterDatabaseTools.ts new file mode 100644 index 000000000..3d1beb977 --- /dev/null +++ b/packages/web/src/utility/alterDatabaseTools.ts @@ -0,0 +1,45 @@ +import { findEngineDriver, generateDbPairingId, getAlterDatabaseScript } from 'dbgate-tools'; +import InputTextModal from '../modals/InputTextModal.svelte'; +import { showModal } from '../modals/modalTools'; +import { getExtensions } from '../stores'; +import { getConnectionInfo, getDatabaseInfo } from './metadataLoaders'; +import ConfirmSqlModal from '../modals/ConfirmSqlModal.svelte'; +import axiosInstance from './axiosInstance'; + +export async function alterDatabaseDialog(conid, database, updateFunc) { + const conn = await getConnectionInfo({ conid }); + const driver = findEngineDriver(conn, getExtensions()); + + const db = generateDbPairingId(await getDatabaseInfo({ conid, database })); + const dbUpdated = updateFunc(db); + + const sql = getAlterDatabaseScript(db, dbUpdated, {}, db, driver); + + showModal(ConfirmSqlModal, { + sql, + onConfirm: async () => { + const resp = await axiosInstance.request({ + url: 'database-connections/run-script', + method: 'post', + params: { + conid, + database, + }, + data: { sql }, + }); + await axiosInstance.post('database-connections/sync-model', { conid, database }); + }, + engine: driver.engine, + }); +} + +export async function renameDatabaseObjectDialog(conid, database, oldName, updateFunc) { + showModal(InputTextModal, { + value: oldName, + label: 'New name', + header: 'Rename object', + onConfirm: newName => { + alterDatabaseDialog(conid, database, db => updateFunc(db, newName)); + }, + }); +}