diff --git a/app/src/electron.js b/app/src/electron.js index 4b658863c..2b4a46bab 100644 --- a/app/src/electron.js +++ b/app/src/electron.js @@ -22,6 +22,7 @@ let disableAutoUpgrade = false; // require('@electron/remote/main').initialize(); const configRootPath = path.join(app.getPath('userData'), 'config-root.json'); +let saveConfigOnExit = true; let initialConfig = {}; let apiLoaded = false; let mainModule; @@ -173,6 +174,21 @@ ipcMain.on('quit-app', async (event, arg) => { mainWindow.close(); } }); +ipcMain.on('reset-settings', async (event, arg) => { + try { + saveConfigOnExit = false; + fs.unlinkSync(configRootPath); + console.log('Deleted file:', configRootPath); + } catch (err) { + console.log('Error deleting config-root:', err.message); + } + + if (isMac()) { + app.quit(); + } else { + mainWindow.close(); + } +}); ipcMain.on('set-title', async (event, arg) => { mainWindow.setTitle(arg); }); @@ -364,15 +380,17 @@ function createWindow() { }); mainWindow.on('close', () => { try { - fs.writeFileSync( - configRootPath, - JSON.stringify({ - winBounds: mainWindow.getBounds(), - winIsMaximized: mainWindow.isMaximized(), - disableAutoUpgrade, - }), - 'utf-8' - ); + if (saveConfigOnExit) { + fs.writeFileSync( + configRootPath, + JSON.stringify({ + winBounds: mainWindow.getBounds(), + winIsMaximized: mainWindow.isMaximized(), + disableAutoUpgrade, + }), + 'utf-8' + ); + } } catch (err) { console.log('Error saving config-root:', err.message); } diff --git a/app/src/mainMenuDefinition.js b/app/src/mainMenuDefinition.js index 1548b23be..5d5cd1188 100644 --- a/app/src/mainMenuDefinition.js +++ b/app/src/mainMenuDefinition.js @@ -91,6 +91,7 @@ module.exports = ({ editMenu }) => [ { command: 'folder.showLogs', hideDisabled: true }, { command: 'folder.showData', hideDisabled: true }, { command: 'new.gist', hideDisabled: true }, + { command: 'app.resetSettings', hideDisabled: true }, ], }, { diff --git a/packages/api/src/controllers/config.js b/packages/api/src/controllers/config.js index d8f98bdab..a0bb9517c 100644 --- a/packages/api/src/controllers/config.js +++ b/packages/api/src/controllers/config.js @@ -102,6 +102,12 @@ module.exports = { return res; }, + deleteSettings_meta: true, + async deleteSettings() { + await fs.unlink(path.join(datadir(), 'settings.json')); + return true; + }, + fillMissingSettings(value) { const res = { ...value, diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts index ec1dfc882..d1b23a4dd 100644 --- a/packages/web/src/commands/stdCommands.ts +++ b/packages/web/src/commands/stdCommands.ts @@ -41,6 +41,8 @@ import { disconnectServerConnection } from '../appobj/ConnectionAppObject.svelte import UploadErrorModal from '../modals/UploadErrorModal.svelte'; import ErrorMessageModal from '../modals/ErrorMessageModal.svelte'; import NewCollectionModal from '../modals/NewCollectionModal.svelte'; +import ConfirmModal from '../modals/ConfirmModal.svelte'; +import localforage from 'localforage'; // function themeCommand(theme: ThemeDefinition) { // return { @@ -451,6 +453,28 @@ registerCommand({ onClick: () => electron.showItemInFolder(getCurrentConfig().connectionsFilePath), }); +registerCommand({ + id: 'app.resetSettings', + category: 'File', + name: 'Reset layout data & settings', + testEnabled: () => true, + onClick: () => { + showModal(ConfirmModal, { + message: `Really reset layout data? All opened tabs, settings and layout data will be lost. Connections and saved files will be preserved. After this, restart DbGate for applying changes.`, + onConfirm: async () => { + await apiCall('config/delete-settings'); + localStorage.clear(); + await localforage.clear(); + if (getElectron()) { + getElectron().send('reset-settings'); + } else { + window.location.reload(); + } + }, + }); + }, +}); + registerCommand({ id: 'file.import', category: 'File',