diff --git a/app/icon.ico b/app/icon.ico new file mode 100644 index 000000000..dd0ba6487 Binary files /dev/null and b/app/icon.ico differ diff --git a/app/package.json b/app/package.json index 7fa2b37c9..df8293b4a 100644 --- a/app/package.json +++ b/app/package.json @@ -4,7 +4,8 @@ "private": true, "author": "Jan Prochazka ", "dependencies": { - "electron-store": "^5.1.1" + "electron-store": "^5.1.1", + "electron-updater": "^4.3.1" }, "build": { "appId": "com.jenasoft.dbgate", @@ -13,11 +14,16 @@ }, "linux": { "target": [ - "AppImage" + "AppImage", + "deb" ] }, "win": { - "target": "nsis" + "target": [ + "nsis", + "portable" + ], + "icon": "icon.ico" }, "files": [ "packages", diff --git a/app/src/electron.js b/app/src/electron.js index 0a5741ce1..6fc1bef55 100644 --- a/app/src/electron.js +++ b/app/src/electron.js @@ -1,5 +1,7 @@ const electron = require('electron'); +const { Menu } = require('electron'); const { fork } = require('child_process'); +var { autoUpdater } = require('electron-updater'); const Store = require('electron-store'); // Module to control application life. const app = electron.app; @@ -24,11 +26,95 @@ function hideSplash() { mainWindow.show(); } +function buildMenu() { + const template = [ + { + label: 'File', + submenu: [ + { + label: 'Connect to database', + click() { + mainWindow.webContents.executeJavaScript(`dbgate_createNewConnection()`); + }, + }, + { + label: 'New query', + click() { + mainWindow.webContents.executeJavaScript(`dbgate_newQuery()`); + }, + }, + ], + }, + { + label: 'Edit', + submenu: [ + { role: 'copy' }, + { role: 'paste' }, + ], + }, + { + label: 'View', + submenu: [ + { role: 'reload' }, + { role: 'forcereload' }, + { role: 'toggledevtools' }, + { type: 'separator' }, + { role: 'resetzoom' }, + { role: 'zoomin' }, + { role: 'zoomout' }, + { type: 'separator' }, + { role: 'togglefullscreen' }, + ], + }, + { + role: 'window', + submenu: [ + { + label: 'Close all tabs', + click() { + mainWindow.webContents.executeJavaScript('dbgate_closeAll()'); + }, + }, + { type: 'separator' }, + { role: 'minimize' }, + { role: 'close' }, + ], + }, + { + role: 'help', + submenu: [ + { + label: 'dbgate.org', + click() { + require('electron').shell.openExternal('https://dbgate.org'); + }, + }, + { + label: 'DbGate on GitHub', + click() { + require('electron').shell.openExternal('https://github.com/dbshell/dbgate'); + }, + }, + { + label: 'DbGate on docker hub', + click() { + require('electron').shell.openExternal('https://hub.docker.com/r/dbgate/dbgate'); + }, + }, + ], + }, + ]; + + return Menu.buildFromTemplate(template); +} + function createWindow() { const bounds = store.get('winBounds'); mainWindow = new BrowserWindow({ width: 1200, height: 800, + title: 'DbGate', + icon: 'icon.ico', ...bounds, show: false, webPreferences: { @@ -36,6 +122,8 @@ function createWindow() { }, }); + mainWindow.setMenu(buildMenu()); + function loadMainWindow() { const startUrl = process.env.ELECTRON_START_URL || @@ -95,10 +183,15 @@ function createWindow() { }); } +function onAppReady() { + autoUpdater.checkForUpdatesAndNotify(); + createWindow(); +} + // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. -app.on('ready', createWindow); +app.on('ready', onAppReady); // Quit when all windows are closed. app.on('window-all-closed', function () { diff --git a/app/yarn.lock b/app/yarn.lock index 46bc7b20f..adb96cbfa 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -70,6 +70,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.30.tgz#3501e6f09b954de9c404671cefdbcc5d9d7c45f6" integrity sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg== +"@types/semver@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.2.0.tgz#0d72066965e910531e1db4621c15d0ca36b8d83b" + integrity sha512-TbB0A8ACUWZt3Y6bQPstW9QNbhNeebdgLX4T/ZfkrswAfUzRiXrgd9seol+X379Wa589Pu4UEx9Uok0D4RjRCQ== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -174,6 +181,11 @@ async-exit-hook@^2.0.1: resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -231,6 +243,14 @@ builder-util-runtime@8.6.2: debug "^4.1.1" sax "^1.2.4" +builder-util-runtime@8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.0.tgz#e48ad004835c8284662e8eaf47a53468c66e8e8d" + integrity sha512-G1AqqVM2vYTrSFR982c1NNzwXKrGLQjVjaZaWQdn4O6Z3YKjdMDofw88aD9jpyK9ZXkrCxR0tI3Qe9wNbyTlXg== + dependencies: + debug "^4.1.1" + sax "^1.2.4" + builder-util@22.4.1, builder-util@~22.4.1: version "22.4.1" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.4.1.tgz#49cce9f06a62cdccda66d5efa82077040fa1f462" @@ -572,6 +592,19 @@ electron-store@^5.1.1: conf "^6.2.1" type-fest "^0.7.1" +electron-updater@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7" + integrity sha512-UDC5AHCgeiHJYDYWZG/rsl1vdAFKqI/Lm7whN57LKAk8EfhTewhcEHzheRcncLgikMcQL8gFo1KeX51tf5a5Wg== + dependencies: + "@types/semver" "^7.1.0" + builder-util-runtime "8.7.0" + fs-extra "^9.0.0" + js-yaml "^3.13.1" + lazy-val "^1.0.4" + lodash.isequal "^4.5.0" + semver "^7.1.3" + electron@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/electron/-/electron-8.1.1.tgz#737a5af03c7b4af60b49dff7bfe1203fcbd5bf89" @@ -679,6 +712,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -948,6 +991,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -982,6 +1034,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash@^4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -1602,6 +1659,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + update-notifier@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" diff --git a/packages/api/.env b/packages/api/.env index 8d6ae5376..26afcf6a0 100644 --- a/packages/api/.env +++ b/packages/api/.env @@ -1,4 +1,5 @@ -CONNECTIONS=mysql +CONNECTIONS=mysql,postgres + LABEL_mysql=MySql localhost SERVER_mysql=localhost USER_mysql=root @@ -6,6 +7,13 @@ PASSWORD_mysql=test PORT_mysql=3307 ENGINE_mysql=mysql +LABEL_postgres=Postgres localhost +SERVER_postgres=localhost +USER_postgres=postgres +PASSWORD_postgres=test +PORT_postgres=5433 +ENGINE_postgres=postgres + TOOLBAR=home ICON_home=fas fa-home TITLE_home=Home diff --git a/packages/web/src/widgets/Toolbar.js b/packages/web/src/widgets/Toolbar.js index 23979c808..5be65cd54 100644 --- a/packages/web/src/widgets/Toolbar.js +++ b/packages/web/src/widgets/Toolbar.js @@ -21,6 +21,12 @@ export default function ToolBar({ toolbarPortalRef }) { const setOpenedTabs = useSetOpenedTabs(); const openedTabs = useOpenedTabs(); + React.useEffect(() => { + window['dbgate_createNewConnection'] = modalState.open; + window['dbgate_newQuery'] = newQuery; + window['dbgate_closeAll'] = () => setOpenedTabs([]); + }); + function openTabFromButton(button) { if (openedTabs.find((x) => x.tabComponent == 'InfoPageTab' && x.props && x.props.page == button.page)) { setOpenedTabs((tabs) =>