mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-25 02:56:00 +00:00
db app obj WIP
This commit is contained in:
@@ -29,6 +29,8 @@
|
|||||||
views: 'ViewDataTab',
|
views: 'ViewDataTab',
|
||||||
matviews: 'ViewDataTab',
|
matviews: 'ViewDataTab',
|
||||||
queries: 'QueryDataTab',
|
queries: 'QueryDataTab',
|
||||||
|
procedures: 'SqlObjectTab',
|
||||||
|
functions: 'SqlObjectTab',
|
||||||
};
|
};
|
||||||
|
|
||||||
function createScriptTemplatesSubmenu(objectTypeField) {
|
function createScriptTemplatesSubmenu(objectTypeField) {
|
||||||
@@ -70,25 +72,9 @@
|
|||||||
switch (objectTypeField) {
|
switch (objectTypeField) {
|
||||||
case 'tables':
|
case 'tables':
|
||||||
return [
|
return [
|
||||||
|
...defaultDatabaseObjectAppObjectActions['tables'],
|
||||||
{
|
{
|
||||||
label: 'Open data',
|
divider: true,
|
||||||
tab: 'TableDataTab',
|
|
||||||
forceNewTab: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Open form',
|
|
||||||
tab: 'TableDataTab',
|
|
||||||
forceNewTab: true,
|
|
||||||
initialData: {
|
|
||||||
grid: {
|
|
||||||
isFormView: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Open structure',
|
|
||||||
tab: 'TableStructureTab',
|
|
||||||
icon: 'img table-structure',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Design query',
|
label: 'Design query',
|
||||||
@@ -101,6 +87,33 @@
|
|||||||
forceNewTab: true,
|
forceNewTab: true,
|
||||||
icon: 'img perspective',
|
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,
|
divider: true,
|
||||||
},
|
},
|
||||||
@@ -150,52 +163,12 @@
|
|||||||
label: 'Open active chart',
|
label: 'Open active chart',
|
||||||
isActiveChart: true,
|
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':
|
case 'views':
|
||||||
return [
|
return [
|
||||||
|
...defaultDatabaseObjectAppObjectActions['views'],
|
||||||
{
|
{
|
||||||
label: 'Open data',
|
divider: true,
|
||||||
tab: 'ViewDataTab',
|
|
||||||
forceNewTab: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Open structure',
|
|
||||||
tab: 'TableStructureTab',
|
|
||||||
icon: 'img view-structure',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Design query',
|
label: 'Design query',
|
||||||
@@ -207,35 +180,6 @@
|
|||||||
forceNewTab: true,
|
forceNewTab: true,
|
||||||
icon: 'img perspective',
|
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'),
|
createScriptTemplatesSubmenu('views'),
|
||||||
{
|
{
|
||||||
label: 'SQL generator',
|
label: 'SQL generator',
|
||||||
@@ -254,17 +198,8 @@
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
];
|
|
||||||
case 'matviews':
|
|
||||||
return [
|
|
||||||
{
|
{
|
||||||
label: 'Open data',
|
divider: true,
|
||||||
tab: 'ViewDataTab',
|
|
||||||
forceNewTab: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Open structure',
|
|
||||||
tab: 'TableStructureTab',
|
|
||||||
},
|
},
|
||||||
hasPermission('dbops/model/edit') && {
|
hasPermission('dbops/model/edit') && {
|
||||||
label: 'Drop view',
|
label: 'Drop view',
|
||||||
@@ -276,10 +211,6 @@
|
|||||||
isRename: true,
|
isRename: true,
|
||||||
requiresWriteAccess: true,
|
requiresWriteAccess: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: 'Query designer',
|
|
||||||
isQueryDesigner: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
divider: true,
|
divider: true,
|
||||||
},
|
},
|
||||||
@@ -292,12 +223,29 @@
|
|||||||
label: 'Open active chart',
|
label: 'Open active chart',
|
||||||
isActiveChart: true,
|
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,
|
divider: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
isShowSql: true,
|
label: 'Query designer',
|
||||||
label: 'Show SQL',
|
isQueryDesigner: true,
|
||||||
},
|
},
|
||||||
createScriptTemplatesSubmenu('matviews'),
|
createScriptTemplatesSubmenu('matviews'),
|
||||||
{
|
{
|
||||||
@@ -317,6 +265,18 @@
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
divider: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Export',
|
||||||
|
isExport: true,
|
||||||
|
functionName: 'tableReader',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Open active chart',
|
||||||
|
isActiveChart: true,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
case 'queries':
|
case 'queries':
|
||||||
return [
|
return [
|
||||||
@@ -328,6 +288,10 @@
|
|||||||
];
|
];
|
||||||
case 'procedures':
|
case 'procedures':
|
||||||
return [
|
return [
|
||||||
|
...defaultDatabaseObjectAppObjectActions['procedures'],
|
||||||
|
{
|
||||||
|
divider: true,
|
||||||
|
},
|
||||||
hasPermission('dbops/model/edit') && {
|
hasPermission('dbops/model/edit') && {
|
||||||
label: 'Drop procedure',
|
label: 'Drop procedure',
|
||||||
isDrop: true,
|
isDrop: true,
|
||||||
@@ -338,10 +302,6 @@
|
|||||||
isRename: true,
|
isRename: true,
|
||||||
requiresWriteAccess: true,
|
requiresWriteAccess: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
isShowSql: true,
|
|
||||||
label: 'Show SQL',
|
|
||||||
},
|
|
||||||
createScriptTemplatesSubmenu('procedures'),
|
createScriptTemplatesSubmenu('procedures'),
|
||||||
{
|
{
|
||||||
label: 'SQL generator',
|
label: 'SQL generator',
|
||||||
@@ -363,6 +323,10 @@
|
|||||||
];
|
];
|
||||||
case 'functions':
|
case 'functions':
|
||||||
return [
|
return [
|
||||||
|
...defaultDatabaseObjectAppObjectActions['functions'],
|
||||||
|
{
|
||||||
|
divider: true,
|
||||||
|
},
|
||||||
hasPermission('dbops/model/edit') && {
|
hasPermission('dbops/model/edit') && {
|
||||||
label: 'Drop function',
|
label: 'Drop function',
|
||||||
isDrop: true,
|
isDrop: true,
|
||||||
@@ -373,10 +337,6 @@
|
|||||||
isRename: true,
|
isRename: true,
|
||||||
requiresWriteAccess: true,
|
requiresWriteAccess: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
isShowSql: true,
|
|
||||||
label: 'Show SQL',
|
|
||||||
},
|
|
||||||
createScriptTemplatesSubmenu('functions'),
|
createScriptTemplatesSubmenu('functions'),
|
||||||
{
|
{
|
||||||
label: 'SQL generator',
|
label: 'SQL generator',
|
||||||
@@ -398,20 +358,9 @@
|
|||||||
];
|
];
|
||||||
case 'collections':
|
case 'collections':
|
||||||
return [
|
return [
|
||||||
|
...defaultDatabaseObjectAppObjectActions['collections'],
|
||||||
{
|
{
|
||||||
label: 'Open data',
|
divider: true,
|
||||||
tab: 'CollectionDataTab',
|
|
||||||
forceNewTab: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Open JSON',
|
|
||||||
tab: 'CollectionDataTab',
|
|
||||||
forceNewTab: true,
|
|
||||||
initialData: {
|
|
||||||
grid: {
|
|
||||||
isJsonView: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Design perspective query',
|
label: 'Design perspective query',
|
||||||
@@ -657,20 +606,20 @@
|
|||||||
// fixedTargetPureName: data.pureName,
|
// fixedTargetPureName: data.pureName,
|
||||||
// },
|
// },
|
||||||
// });
|
// });
|
||||||
} else if (menu.isShowSql) {
|
// } else if (menu.isShowSql) {
|
||||||
openNewTab({
|
// openNewTab({
|
||||||
title: data.pureName,
|
// title: data.pureName,
|
||||||
icon: 'img sql-file',
|
// icon: 'img sql-file',
|
||||||
tabComponent: 'SqlObjectTab',
|
// tabComponent: 'SqlObjectTab',
|
||||||
tabPreviewMode: true,
|
// tabPreviewMode: true,
|
||||||
props: {
|
// props: {
|
||||||
conid: data.conid,
|
// conid: data.conid,
|
||||||
database: data.database,
|
// database: data.database,
|
||||||
schemaName: data.schemaName,
|
// schemaName: data.schemaName,
|
||||||
pureName: data.pureName,
|
// pureName: data.pureName,
|
||||||
objectTypeField: data.objectTypeField,
|
// objectTypeField: data.objectTypeField,
|
||||||
},
|
// },
|
||||||
});
|
// });
|
||||||
} else {
|
} else {
|
||||||
openDatabaseObjectDetail(
|
openDatabaseObjectDetail(
|
||||||
menu.tab,
|
menu.tab,
|
||||||
@@ -724,10 +673,13 @@
|
|||||||
|
|
||||||
openNewTab(
|
openNewTab(
|
||||||
{
|
{
|
||||||
title: getObjectTitle(connection, schemaName, pureName),
|
// title: getObjectTitle(connection, schemaName, pureName),
|
||||||
|
title: tabComponent ? getObjectTitle(connection, schemaName, pureName) : 'Query #',
|
||||||
tooltip,
|
tooltip,
|
||||||
icon: icon || (scriptTemplate ? 'img sql-file' : databaseObjectIcons[objectTypeField]),
|
icon:
|
||||||
tabComponent: scriptTemplate ? 'SqlObjectTab' : tabComponent,
|
icon ||
|
||||||
|
(scriptTemplate || tabComponent == 'SqlObjectTab' ? 'img sql-file' : databaseObjectIcons[objectTypeField]),
|
||||||
|
tabComponent: tabComponent ?? 'QueryTab',
|
||||||
appObject: 'DatabaseObjectAppObject',
|
appObject: 'DatabaseObjectAppObject',
|
||||||
appObjectData,
|
appObjectData,
|
||||||
tabPreviewMode,
|
tabPreviewMode,
|
||||||
@@ -750,6 +702,7 @@
|
|||||||
const driver = findEngineDriver(data, getExtensions());
|
const driver = findEngineDriver(data, getExtensions());
|
||||||
|
|
||||||
const activeTab = getActiveTab();
|
const activeTab = getActiveTab();
|
||||||
|
console.log('activeTab', activeTab);
|
||||||
|
|
||||||
const configuredAction = getCurrentSettings()[`defaultAction.dbObjectClick.${objectTypeField}`];
|
const configuredAction = getCurrentSettings()[`defaultAction.dbObjectClick.${objectTypeField}`];
|
||||||
const overrideMenu = createMenus(objectTypeField, driver).find(x => x.label && x.label == configuredAction);
|
const overrideMenu = createMenus(objectTypeField, driver).find(x => x.label && x.label == configuredAction);
|
||||||
@@ -760,7 +713,7 @@
|
|||||||
|
|
||||||
openDatabaseObjectDetail(
|
openDatabaseObjectDetail(
|
||||||
defaultTabs[objectTypeField],
|
defaultTabs[objectTypeField],
|
||||||
defaultTabs[objectTypeField] ? null : 'CREATE OBJECT',
|
null,
|
||||||
{
|
{
|
||||||
schemaName,
|
schemaName,
|
||||||
pureName,
|
pureName,
|
||||||
@@ -910,7 +863,7 @@
|
|||||||
import { getDefaultFileFormat } from '../plugins/fileformats';
|
import { getDefaultFileFormat } from '../plugins/fileformats';
|
||||||
import hasPermission from '../utility/hasPermission';
|
import hasPermission from '../utility/hasPermission';
|
||||||
import { openImportExportTab } from '../utility/importExportTools';
|
import { openImportExportTab } from '../utility/importExportTools';
|
||||||
import { matchDatabaseObjectAppObject } from './appObjectMatchers';
|
import { defaultDatabaseObjectAppObjectActions, matchDatabaseObjectAppObject } from './appObjectTools';
|
||||||
import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate';
|
import { getSupportedScriptTemplates } from '../utility/applyScriptTemplate';
|
||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
|
|||||||
@@ -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
|
|
||||||
);
|
|
||||||
}
|
|
||||||
80
packages/web/src/appobj/appObjectTools.ts
Normal file
80
packages/web/src/appobj/appObjectTools.ts
Normal file
@@ -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,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@@ -9,6 +9,8 @@
|
|||||||
testEnabled: () => getCurrentEditor() != null,
|
testEnabled: () => getCurrentEditor() != null,
|
||||||
onClick: () => getCurrentEditor().find(),
|
onClick: () => getCurrentEditor().find(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const matchingProps = ['conid', 'database', 'schemaName', 'pureName', 'objectTypeField'];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -59,7 +61,7 @@
|
|||||||
let domToolStrip;
|
let domToolStrip;
|
||||||
|
|
||||||
$: if ($tabVisible && domEditor) {
|
$: if ($tabVisible && domEditor) {
|
||||||
domEditor?.getEditor()?.focus();
|
// domEditor?.getEditor()?.focus();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function find() {
|
export function find() {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
import SchemaSelector from './SchemaSelector.svelte';
|
import SchemaSelector from './SchemaSelector.svelte';
|
||||||
import { appliedCurrentSchema } from '../stores';
|
import { appliedCurrentSchema } from '../stores';
|
||||||
import AppObjectListHandler from './AppObjectListHandler.svelte';
|
import AppObjectListHandler from './AppObjectListHandler.svelte';
|
||||||
import { matchDatabaseObjectAppObject } from '../appobj/appObjectMatchers';
|
import { matchDatabaseObjectAppObject } from '../appobj/appObjectTools';
|
||||||
|
|
||||||
export let conid;
|
export let conid;
|
||||||
export let database;
|
export let database;
|
||||||
|
|||||||
Reference in New Issue
Block a user