diff --git a/runtime/src/js/pgadmin.js b/runtime/src/js/pgadmin.js index 68f26b43e23..5f2daf578b3 100644 --- a/runtime/src/js/pgadmin.js +++ b/runtime/src/js/pgadmin.js @@ -38,9 +38,22 @@ let docsURLSubStrings = ['www.enterprisedb.com', 'www.postgresql.org', 'www.pgad process.env['ELECTRON_ENABLE_SECURITY_WARNINGS'] = false; // Paths to the rest of the app - let [pythonPath, pgadminFile] = misc.getAppPaths(__dirname); +// Do not allow a second instance of pgAdmin to run. +const gotTheLock = app.requestSingleInstanceLock(); +if (!gotTheLock) { + app.quit(); +} else { + app.on('second-instance', () => { + // Someone tried to run a second instance, we should focus our window. + if (pgAdminMainScreen) { + if (pgAdminMainScreen.isMinimized()) pgAdminMainScreen.restore(); + pgAdminMainScreen.focus(); + } + }); +} + // Override the paths above, if a developer needs to if (fs.existsSync('dev_config.json')) { try { diff --git a/web/pgadmin/static/js/custom_hooks.js b/web/pgadmin/static/js/custom_hooks.js index 085660d57b7..ac80abb1140 100644 --- a/web/pgadmin/static/js/custom_hooks.js +++ b/web/pgadmin/static/js/custom_hooks.js @@ -211,7 +211,7 @@ export function useForceUpdate() { return React.useReducer(() => ({}), {})[1]; } -export function useBeforeUnload({enabled, isNewTab, beforeClose, closePanel }) { +export function useBeforeUnload({ enabled, isNewTab, beforeClose, closePanel }) { const onBeforeUnload = useCallback((e)=>{ e.preventDefault(); e.returnValue = 'prevent'; diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/components/BeforeUnload.jsx b/web/pgadmin/tools/erd/static/js/erd_tool/components/BeforeUnload.jsx index 0fd2f4e9faa..ac3eb65f4e4 100644 --- a/web/pgadmin/tools/erd/static/js/erd_tool/components/BeforeUnload.jsx +++ b/web/pgadmin/tools/erd/static/js/erd_tool/components/BeforeUnload.jsx @@ -1,19 +1,23 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import { useBeforeUnload } from '../../../../../../static/js/custom_hooks'; -export default function BeforeUnload({enabled, isNewTab, beforeClose, closePanel}) { - useBeforeUnload( +export default function BeforeUnload({onInit, enabled, isNewTab, beforeClose, closePanel}) { + const init = useBeforeUnload( {enabled, isNewTab, beforeClose, closePanel} ); + useEffect(()=>{ + onInit?.(init); + }, [init]); + return <>; } BeforeUnload.propTypes = { + onInit: PropTypes.func, enabled: PropTypes.bool, isNewTab: PropTypes.bool, beforeClose: PropTypes.func, - closePanel: PropTypes.func, - getForceClose: PropTypes.func, + closePanel: PropTypes.func }; diff --git a/web/pgadmin/tools/erd/static/js/erd_tool/components/ERDTool.jsx b/web/pgadmin/tools/erd/static/js/erd_tool/components/ERDTool.jsx index f78430260e5..2061654946a 100644 --- a/web/pgadmin/tools/erd/static/js/erd_tool/components/ERDTool.jsx +++ b/web/pgadmin/tools/erd/static/js/erd_tool/components/ERDTool.jsx @@ -357,7 +357,7 @@ export default class ERDTool extends React.Component { } } - confirmBeforeClose(forceClose) { + confirmBeforeClose() { let bodyObj = this; if(this.state.dirty) { this.closeOnSave = false; @@ -366,7 +366,7 @@ export default class ERDTool extends React.Component { closeModal={closeModal} text={gettext('The diagram has changed. Do you want to save changes?')} onDontSave={()=>{ - forceClose(); + this.forceClose(); }} onSave={()=>{ bodyObj.onSaveDiagram(false, true); @@ -375,7 +375,7 @@ export default class ERDTool extends React.Component { )); return false; } else { - forceClose(); + this.forceClose(); } } @@ -886,11 +886,10 @@ export default class ERDTool extends React.Component { return ( {this.forceClose = forceClose;}} enabled={this.state.is_close_tab_warning} isNewTab={this.state.is_new_tab} - beforeClose={(forceClose)=>{ - this.confirmBeforeClose(forceClose); - }} + beforeClose={this.confirmBeforeClose} closePanel={this.closePanel} />