diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index 536212989..5115bce25 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -29,6 +29,8 @@ views: 'ViewDataTab', matviews: 'ViewDataTab', queries: 'QueryDataTab', + procedures: 'SqlObjectTab', + functions: 'SqlObjectTab', }; function createScriptTemplatesSubmenu(objectTypeField) { @@ -70,25 +72,9 @@ switch (objectTypeField) { case 'tables': return [ + ...defaultDatabaseObjectAppObjectActions['tables'], { - label: 'Open data', - tab: 'TableDataTab', - forceNewTab: true, - }, - { - label: 'Open form', - tab: 'TableDataTab', - forceNewTab: true, - initialData: { - grid: { - isFormView: true, - }, - }, - }, - { - label: 'Open structure', - tab: 'TableStructureTab', - icon: 'img table-structure', + divider: true, }, { label: 'Design query', @@ -101,6 +87,33 @@ forceNewTab: true, icon: 'img perspective', }, + createScriptTemplatesSubmenu('tables'), + { + label: 'SQL generator', + submenu: [ + { + label: 'CREATE TABLE', + sqlGeneratorProps: { + createTables: true, + createIndexes: true, + createForeignKeys: true, + }, + }, + { + label: 'DROP TABLE', + sqlGeneratorProps: { + dropTables: true, + dropReferences: true, + }, + }, + { + label: 'INSERT', + sqlGeneratorProps: { + insert: true, + }, + }, + ], + }, { divider: true, }, @@ -150,52 +163,12 @@ label: 'Open active chart', isActiveChart: true, }, - { - divider: true, - }, - { - isShowSql: true, - label: 'Show SQL', - }, - createScriptTemplatesSubmenu('tables'), - { - label: 'SQL generator', - submenu: [ - { - label: 'CREATE TABLE', - sqlGeneratorProps: { - createTables: true, - createIndexes: true, - createForeignKeys: true, - }, - }, - { - label: 'DROP TABLE', - sqlGeneratorProps: { - dropTables: true, - dropReferences: true, - }, - }, - { - label: 'INSERT', - sqlGeneratorProps: { - insert: true, - }, - }, - ], - }, ]; case 'views': return [ + ...defaultDatabaseObjectAppObjectActions['views'], { - label: 'Open data', - tab: 'ViewDataTab', - forceNewTab: true, - }, - { - label: 'Open structure', - tab: 'TableStructureTab', - icon: 'img view-structure', + divider: true, }, { label: 'Design query', @@ -207,35 +180,6 @@ forceNewTab: true, icon: 'img perspective', }, - hasPermission('dbops/model/edit') && { - label: 'Drop view', - isDrop: true, - requiresWriteAccess: true, - }, - hasPermission('dbops/model/edit') && { - label: 'Rename view', - isRename: true, - requiresWriteAccess: true, - }, - { - divider: true, - }, - { - label: 'Export', - isExport: true, - functionName: 'tableReader', - }, - { - label: 'Open active chart', - isActiveChart: true, - }, - { - divider: true, - }, - { - isShowSql: true, - label: 'Show SQL', - }, createScriptTemplatesSubmenu('views'), { label: 'SQL generator', @@ -254,17 +198,8 @@ }, ], }, - ]; - case 'matviews': - return [ { - label: 'Open data', - tab: 'ViewDataTab', - forceNewTab: true, - }, - { - label: 'Open structure', - tab: 'TableStructureTab', + divider: true, }, hasPermission('dbops/model/edit') && { label: 'Drop view', @@ -276,10 +211,6 @@ isRename: true, requiresWriteAccess: true, }, - { - label: 'Query designer', - isQueryDesigner: true, - }, { divider: true, }, @@ -292,12 +223,29 @@ label: 'Open active chart', isActiveChart: true, }, + ]; + case 'matviews': + return [ + ...defaultDatabaseObjectAppObjectActions['matviews'], + { + divider: true, + }, + hasPermission('dbops/model/edit') && { + label: 'Drop view', + isDrop: true, + requiresWriteAccess: true, + }, + hasPermission('dbops/model/edit') && { + label: 'Rename view', + isRename: true, + requiresWriteAccess: true, + }, { divider: true, }, { - isShowSql: true, - label: 'Show SQL', + label: 'Query designer', + isQueryDesigner: true, }, createScriptTemplatesSubmenu('matviews'), { @@ -317,6 +265,18 @@ }, ], }, + { + divider: true, + }, + { + label: 'Export', + isExport: true, + functionName: 'tableReader', + }, + { + label: 'Open active chart', + isActiveChart: true, + }, ]; case 'queries': return [ @@ -328,6 +288,10 @@ ]; case 'procedures': return [ + ...defaultDatabaseObjectAppObjectActions['procedures'], + { + divider: true, + }, hasPermission('dbops/model/edit') && { label: 'Drop procedure', isDrop: true, @@ -338,10 +302,6 @@ isRename: true, requiresWriteAccess: true, }, - { - isShowSql: true, - label: 'Show SQL', - }, createScriptTemplatesSubmenu('procedures'), { label: 'SQL generator', @@ -363,6 +323,10 @@ ]; case 'functions': return [ + ...defaultDatabaseObjectAppObjectActions['functions'], + { + divider: true, + }, hasPermission('dbops/model/edit') && { label: 'Drop function', isDrop: true, @@ -373,10 +337,6 @@ isRename: true, requiresWriteAccess: true, }, - { - isShowSql: true, - label: 'Show SQL', - }, createScriptTemplatesSubmenu('functions'), { label: 'SQL generator', @@ -398,20 +358,9 @@ ]; case 'collections': return [ + ...defaultDatabaseObjectAppObjectActions['collections'], { - label: 'Open data', - tab: 'CollectionDataTab', - forceNewTab: true, - }, - { - label: 'Open JSON', - tab: 'CollectionDataTab', - forceNewTab: true, - initialData: { - grid: { - isJsonView: true, - }, - }, + divider: true, }, { label: 'Design perspective query', @@ -657,20 +606,20 @@ // fixedTargetPureName: data.pureName, // }, // }); - } else if (menu.isShowSql) { - openNewTab({ - title: data.pureName, - icon: 'img sql-file', - tabComponent: 'SqlObjectTab', - tabPreviewMode: true, - props: { - conid: data.conid, - database: data.database, - schemaName: data.schemaName, - pureName: data.pureName, - objectTypeField: data.objectTypeField, - }, - }); + // } else if (menu.isShowSql) { + // openNewTab({ + // title: data.pureName, + // icon: 'img sql-file', + // tabComponent: 'SqlObjectTab', + // tabPreviewMode: true, + // props: { + // conid: data.conid, + // database: data.database, + // schemaName: data.schemaName, + // pureName: data.pureName, + // objectTypeField: data.objectTypeField, + // }, + // }); } else { openDatabaseObjectDetail( menu.tab, @@ -724,10 +673,13 @@ openNewTab( { - title: getObjectTitle(connection, schemaName, pureName), + // title: getObjectTitle(connection, schemaName, pureName), + title: tabComponent ? getObjectTitle(connection, schemaName, pureName) : 'Query #', tooltip, - icon: icon || (scriptTemplate ? 'img sql-file' : databaseObjectIcons[objectTypeField]), - tabComponent: scriptTemplate ? 'SqlObjectTab' : tabComponent, + icon: + icon || + (scriptTemplate || tabComponent == 'SqlObjectTab' ? 'img sql-file' : databaseObjectIcons[objectTypeField]), + tabComponent: tabComponent ?? 'QueryTab', appObject: 'DatabaseObjectAppObject', appObjectData, tabPreviewMode, @@ -750,6 +702,7 @@ const driver = findEngineDriver(data, getExtensions()); const activeTab = getActiveTab(); + console.log('activeTab', activeTab); const configuredAction = getCurrentSettings()[`defaultAction.dbObjectClick.${objectTypeField}`]; const overrideMenu = createMenus(objectTypeField, driver).find(x => x.label && x.label == configuredAction); @@ -760,7 +713,7 @@ openDatabaseObjectDetail( defaultTabs[objectTypeField], - defaultTabs[objectTypeField] ? null : 'CREATE OBJECT', + null, { schemaName, pureName, @@ -910,7 +863,7 @@ import { getDefaultFileFormat } from '../plugins/fileformats'; import hasPermission from '../utility/hasPermission'; import { openImportExportTab } from '../utility/importExportTools'; - import { matchDatabaseObjectAppObject } from './appObjectMatchers'; + import { defaultDatabaseObjectAppObjectActions, matchDatabaseObjectAppObject } from './appObjectTools'; import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate'; export let data; diff --git a/packages/web/src/appobj/appObjectMatchers.ts b/packages/web/src/appobj/appObjectMatchers.ts deleted file mode 100644 index 12daa26d8..000000000 --- a/packages/web/src/appobj/appObjectMatchers.ts +++ /dev/null @@ -1,9 +0,0 @@ -export function matchDatabaseObjectAppObject(obj1, obj2) { - return ( - obj1?.objectTypeField == obj2?.objectTypeField && - obj1?.conid == obj2?.conid && - obj1?.database == obj2?.database && - obj1?.pureName == obj2?.pureName && - obj1?.schemaName == obj2?.schemaName - ); -} diff --git a/packages/web/src/appobj/appObjectTools.ts b/packages/web/src/appobj/appObjectTools.ts new file mode 100644 index 000000000..a22f0b705 --- /dev/null +++ b/packages/web/src/appobj/appObjectTools.ts @@ -0,0 +1,80 @@ +export function matchDatabaseObjectAppObject(obj1, obj2) { + return ( + obj1?.objectTypeField == obj2?.objectTypeField && + obj1?.conid == obj2?.conid && + obj1?.database == obj2?.database && + obj1?.pureName == obj2?.pureName && + obj1?.schemaName == obj2?.schemaName + ); +} + +function getTableLikeActions(dataTab) { + return [ + { + label: 'Open data', + tab: dataTab, + defaultActionId: 'openTable', + }, + { + label: 'Open form', + tab: dataTab, + initialData: { + grid: { + isFormView: true, + }, + }, + defaultActionId: 'openForm', + }, + { + label: 'Open structure', + tab: 'TableStructureTab', + icon: 'img table-structure', + defaultActionId: 'openStructure', + }, + { + label: 'Show SQL', + tab: 'SqlObjectTab', + defaultActionId: 'showSql', + icon: 'img sql-file', + }, + ]; +} + +export const defaultDatabaseObjectAppObjectActions = { + tables: getTableLikeActions('TableDataTab'), + views: getTableLikeActions('ViewDataTab'), + matviews: getTableLikeActions('ViewDataTab'), + procedures: [ + { + label: 'Show SQL', + tab: 'SqlObjectTab', + defaultActionId: 'showSql', + icon: 'img sql-file', + }, + ], + functions: [ + { + label: 'Show SQL', + tab: 'SqlObjectTab', + defaultActionId: 'showSql', + icon: 'img sql-file', + }, + ], + collections: [ + { + label: 'Open data', + tab: 'CollectionDataTab', + defaultActionId: 'openTable', + }, + { + label: 'Open JSON', + tab: 'CollectionDataTab', + defaultActionId: 'openJson', + initialData: { + grid: { + isJsonView: true, + }, + }, + }, + ], +}; diff --git a/packages/web/src/tabs/SqlObjectTab.svelte b/packages/web/src/tabs/SqlObjectTab.svelte index 1c96bdf9d..329849777 100644 --- a/packages/web/src/tabs/SqlObjectTab.svelte +++ b/packages/web/src/tabs/SqlObjectTab.svelte @@ -9,6 +9,8 @@ testEnabled: () => getCurrentEditor() != null, onClick: () => getCurrentEditor().find(), }); + + export const matchingProps = ['conid', 'database', 'schemaName', 'pureName', 'objectTypeField'];