diff --git a/app/src/electron.js b/app/src/electron.js
index 6a403a8d7..9e2ab2956 100644
--- a/app/src/electron.js
+++ b/app/src/electron.js
@@ -1,6 +1,6 @@
const electron = require('electron');
const os = require('os');
-const { Menu } = require('electron');
+const { Menu, ipcMain } = require('electron');
const { fork } = require('child_process');
const { autoUpdater } = require('electron-updater');
const Store = require('electron-store');
@@ -20,6 +20,7 @@ const store = new Store();
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow;
let splashWindow;
+let mainMenu;
log.transports.file.level = 'debug';
autoUpdater.logger = log;
@@ -51,6 +52,22 @@ function buildMenu() {
mainWindow.webContents.executeJavaScript(`dbgate_openFile()`);
},
},
+ {
+ label: 'Save',
+ click() {
+ mainWindow.webContents.executeJavaScript(`dbgate_tabCommand('save')`);
+ },
+ accelerator: 'Ctrl+S',
+ id: 'save',
+ },
+ {
+ label: 'Save As',
+ click() {
+ mainWindow.webContents.executeJavaScript(`dbgate_tabCommand('saveAs')`);
+ },
+ accelerator: 'Ctrl+Shift+S',
+ id: 'saveAs',
+ },
{ type: 'separator' },
{ role: 'close' },
],
@@ -134,6 +151,13 @@ function buildMenu() {
return Menu.buildFromTemplate(template);
}
+ipcMain.on('update-menu', async (event, arg) => {
+ const commands = await mainWindow.webContents.executeJavaScript(`getCurrentTabCommands()`);
+ console.log('getCurrentTabCommands', commands);
+ mainMenu.getMenuItemById('save').enabled = !!commands.save;
+ mainMenu.getMenuItemById('saveAs').enabled = !!commands.saveAs;
+});
+
function createWindow() {
const bounds = store.get('winBounds');
@@ -150,7 +174,8 @@ function createWindow() {
},
});
- mainWindow.setMenu(buildMenu());
+ mainMenu = buildMenu();
+ mainWindow.setMenu(mainMenu);
function loadMainWindow() {
const startUrl =
diff --git a/packages/web/src/TabsPanel.js b/packages/web/src/TabsPanel.js
index 1da14e220..60891ee2b 100644
--- a/packages/web/src/TabsPanel.js
+++ b/packages/web/src/TabsPanel.js
@@ -10,6 +10,7 @@ import useTheme from './theme/useTheme';
import usePropsCompare from './utility/usePropsCompare';
import { useShowMenu } from './modals/showMenu';
import { setSelectedTabFunc } from './utility/common';
+import getElectron from './utility/getElectron';
// const files = [
// { name: 'app.js' },
@@ -219,6 +220,16 @@ export default function TabsPanel() {
);
};
+ React.useEffect(() => {
+ const electron = getElectron();
+ if (electron) {
+ const { ipcRenderer } = electron;
+ const activeTab = tabs.find(x => x.selected);
+ window['activeTabId'] = activeTab ? activeTab.tabid : null;
+ ipcRenderer.send('update-menu');
+ }
+ }, [tabs]);
+
// console.log(
// 't',
// tabs.map(x => x.tooltip)
diff --git a/packages/web/src/index.js b/packages/web/src/index.js
index eea7e10fa..29e524d25 100644
--- a/packages/web/src/index.js
+++ b/packages/web/src/index.js
@@ -1,5 +1,6 @@
import React from 'react';
import ReactDOM from 'react-dom';
+import _ from 'lodash';
import './index.css';
import '@mdi/font/css/materialdesignicons.css';
import App from './App';
@@ -22,6 +23,17 @@ import localStorageGarbageCollector from './utility/localStorageGarbageCollector
// import 'ace-builds/src-noconflict/snippets/mysql';
localStorageGarbageCollector();
+window['tabExports'] = {};
+window['getCurrentTabCommands'] = () => {
+ const tabid = window['activeTabId'];
+ return _.mapValues(window['tabExports'][tabid] || {}, v => !!v);
+};
+window['dbgate_tabCommand'] = cmd => {
+ const tabid = window['activeTabId'];
+ const commands = window['tabExports'][tabid];
+ const func = (commands || {})[cmd];
+ if (func) func();
+};
ReactDOM.render(, document.getElementById('root'));
diff --git a/packages/web/src/modals/SaveTabModal.js b/packages/web/src/modals/SaveTabModal.js
index 3161292b2..34b4f0d91 100644
--- a/packages/web/src/modals/SaveTabModal.js
+++ b/packages/web/src/modals/SaveTabModal.js
@@ -1,6 +1,7 @@
import React from 'react';
import axios from '../utility/axios';
import { changeTab } from '../utility/common';
+import getElectron from '../utility/getElectron';
import { useOpenedTabs, useSetOpenedTabs } from '../utility/globalState';
import keycodes from '../utility/keycodes';
import SaveFileToolbarButton from '../utility/SaveFileToolbarButton';
@@ -72,6 +73,23 @@ export default function SaveTabModal({
}
}, [tabVisible, handleKeyboard, canSave]);
+ React.useEffect(() => {
+ const electron = getElectron();
+ if (electron) {
+ const { ipcRenderer } = electron;
+ window['tabExports'][tabid] = {
+ save: handleSaveRef.current,
+ saveAs: saveFileModalState.open,
+ };
+ ipcRenderer.send('update-menu');
+
+ return () => {
+ delete window['tabExports'][tabid];
+ ipcRenderer.send('update-menu');
+ };
+ }
+ }, []);
+
return (
<>