diff --git a/packages/web/src/appobj/DatabaseObjectAppObject.svelte b/packages/web/src/appobj/DatabaseObjectAppObject.svelte index daf58d4fd..11a578c08 100644 --- a/packages/web/src/appobj/DatabaseObjectAppObject.svelte +++ b/packages/web/src/appobj/DatabaseObjectAppObject.svelte @@ -42,6 +42,7 @@ functions: 'img function', queries: 'img query-data', triggers: 'icon trigger', + schedulerEvents: 'icon scheduler-event', }; const defaultTabs = { @@ -87,6 +88,8 @@ isDropCollection?: boolean; isRenameCollection?: boolean; isDuplicateCollection?: boolean; + isDisableEvent?: boolean; + isEnableEvent?: boolean; submenu?: DbObjMenuItem[]; } @@ -383,6 +386,21 @@ }, ...(driver?.getScriptTemplates?.('collections') || []), ]; + case 'schedulerEvents': + return [ + ...defaultDatabaseObjectAppObjectActions['schedulerEvents'], + { + divider: true, + }, + { + label: 'Disable', + isDisableEvent: true, + }, + { + label: 'Enable', + isEnableEvent: true, + }, + ]; } } @@ -479,6 +497,36 @@ x => x.schemaName == data.schemaName && x.pureName == data.pureName ); }); + } else if (menu.isDisableEvent) { + const { conid, database, disableSql } = data; + const driver = await getDriver(); + const dmp = driver.createDumper(); + dmp.put(disableSql); + + const sql = dmp.s; + + showModal(ConfirmSqlModal, { + sql, + onConfirm: async () => { + saveScriptToDatabase({ conid, database }, sql); + }, + engine: driver.engine, + }); + } else if (menu.isEnableEvent) { + const { conid, database, enableSql } = data; + const driver = await getDriver(); + const dmp = driver.createDumper(); + dmp.put(enableSql); + + const sql = dmp.s; + + showModal(ConfirmSqlModal, { + sql, + onConfirm: async () => { + saveScriptToDatabase({ conid, database }, sql); + }, + engine: driver.engine, + }); } else if (menu.isTruncate) { const { conid, database } = data; const driver = await getDriver(); @@ -939,6 +987,15 @@ if (data.objectTypeField === 'triggers') { res.push(`${data.tableName}, ${data.triggerTiming?.toLowerCase() ?? ''} ${data.eventType?.toLowerCase() ?? ''}`); } + + if (data.objectTypeField == 'schedulerEvents') { + if (data.eventType == 'RECURRING') { + res.push(`${data.status}, ${data.eventType}, ${data.intervalValue} ${data.intervalField}`); + } else { + res.push(`${data.status}, ${data.eventType}, ${data.executeAt}`); + } + } + if (data.objectComment) { res.push(data.objectComment); } diff --git a/packages/web/src/appobj/appObjectTools.ts b/packages/web/src/appobj/appObjectTools.ts index 7b3e0bb8c..346c94d23 100644 --- a/packages/web/src/appobj/appObjectTools.ts +++ b/packages/web/src/appobj/appObjectTools.ts @@ -85,4 +85,12 @@ export const defaultDatabaseObjectAppObjectActions = { }, }, ], + schedulerEvents: [ + { + label: 'Show SQL', + tab: 'SqlObjectTab', + defaultActionId: 'showSql', + icon: 'img sql-file', + }, + ], }; diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 77bed6e6c..bc080b50a 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -65,6 +65,7 @@ 'icon add-column': 'mdi mdi-table-column-plus-after', 'icon parameter': 'mdi mdi-at', 'icon trigger': 'mdi mdi-lightning-bolt', + 'icon scheduler-event': 'mdi mdi-calendar-blank', 'icon window-restore': 'mdi mdi-window-restore', 'icon window-maximize': 'mdi mdi-window-maximize', diff --git a/packages/web/src/utility/applyScriptTemplate.ts b/packages/web/src/utility/applyScriptTemplate.ts index ac2de4b0f..6644e2dac 100644 --- a/packages/web/src/utility/applyScriptTemplate.ts +++ b/packages/web/src/utility/applyScriptTemplate.ts @@ -173,6 +173,13 @@ export function getSupportedScriptTemplates(objectTypeField: string): { label: s scriptTemplate: 'CREATE OBJECT', }, ]; + case 'schedulerEvents': + return [ + { + label: 'CREATE SCHEDULER EVENT', + scriptTemplate: 'CREATE OBJECT', + }, + ]; } return []; diff --git a/packages/web/src/widgets/SqlObjectList.svelte b/packages/web/src/widgets/SqlObjectList.svelte index 7638f6cbd..77d926ff0 100644 --- a/packages/web/src/widgets/SqlObjectList.svelte +++ b/packages/web/src/widgets/SqlObjectList.svelte @@ -2,7 +2,7 @@ function generateObjectList(seed = 0) { const counts = [1000, 1200, 1100, 2100, 720]; const schemas = ['A', 'dev', 'public', 'dbo']; - const types = ['tables', 'views', 'functions', 'procedures', 'matviews', 'triggers']; + const types = ['tables', 'views', 'functions', 'procedures', 'matviews', 'triggers', 'schedulerEvents']; const res = _.range(1, counts[seed % counts.length]).map(i => ({ pureName: `name ${i}`, schemaName: schemas[i % schemas.length], @@ -80,11 +80,12 @@ // $: console.log('OBJECTS', $objects); $: objectList = _.flatten([ - ...['tables', 'collections', 'views', 'matviews', 'procedures', 'functions', 'triggers'].map(objectTypeField => - _.sortBy( - (($objects || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })), - ['schemaName', 'pureName'] - ) + ...['tables', 'collections', 'views', 'matviews', 'procedures', 'functions', 'triggers', 'schedulerEvents'].map( + objectTypeField => + _.sortBy( + (($objects || {})[objectTypeField] || []).map(obj => ({ ...obj, objectTypeField })), + ['schemaName', 'pureName'] + ) ), ...dbApps.map(app => app.queries.map(query => ({