From 8bd7b657f8da1252ff434f2a69e42c2c53dda4bd Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 11 Oct 2021 22:30:23 +0200 Subject: [PATCH] added option to disable backup, #2210 --- src/public/app/dialogs/options.js | 9 ++- src/public/app/dialogs/options/advanced.js | 12 --- src/public/app/dialogs/options/backup.js | 78 +++++++++++++++++++ .../{keyboard_shortcuts.js => shortcuts.js} | 2 +- src/routes/api/options.js | 5 +- src/services/backup.js | 20 +++-- src/services/options_init.js | 3 + src/views/dialogs/options.ejs | 12 ++- 8 files changed, 114 insertions(+), 27 deletions(-) create mode 100644 src/public/app/dialogs/options/backup.js rename src/public/app/dialogs/options/{keyboard_shortcuts.js => shortcuts.js} (98%) diff --git a/src/public/app/dialogs/options.js b/src/public/app/dialogs/options.js index a5223c447..1109847e8 100644 --- a/src/public/app/dialogs/options.js +++ b/src/public/app/dialogs/options.js @@ -11,13 +11,14 @@ export async function showDialog() { utils.openDialog($dialog); (await Promise.all([ - import('./options/advanced.js'), import('./options/appearance.js'), + import('./options/shortcuts.js'), import('./options/code_notes.js'), import('./options/credentials.js'), - import('./options/other.js'), + import('./options/backup.js'), import('./options/sync.js'), - import('./options/keyboard_shortcuts.js'), + import('./options/other.js'), + import('./options/advanced.js') ])) .map(m => new m.default) .forEach(tab => { @@ -25,4 +26,4 @@ export async function showDialog() { tab.optionsLoaded(options) } }); -} \ No newline at end of file +} diff --git a/src/public/app/dialogs/options/advanced.js b/src/public/app/dialogs/options/advanced.js index 2bb8d9901..930fa5669 100644 --- a/src/public/app/dialogs/options/advanced.js +++ b/src/public/app/dialogs/options/advanced.js @@ -24,12 +24,6 @@ const TPL = `

-

Backup database

- -

Trilium has automatic backup (daily, weekly, monthly), but you can also trigger a manual backup here.

- -

-

Vacuum database

This will rebuild the database which will typically result in a smaller database file. No data will be actually changed.

@@ -70,12 +64,6 @@ export default class AdvancedOptions { } }); - this.$backupDatabaseButton.on('click', async () => { - const {backupFile} = await server.post('database/backup-database'); - - toastService.showMessage("Database has been backed up to " + backupFile, 10000); - }); - this.$vacuumDatabaseButton.on('click', async () => { await server.post('database/vacuum-database'); diff --git a/src/public/app/dialogs/options/backup.js b/src/public/app/dialogs/options/backup.js new file mode 100644 index 000000000..8a360250f --- /dev/null +++ b/src/public/app/dialogs/options/backup.js @@ -0,0 +1,78 @@ +import server from "../../services/server.js"; +import toastService from "../../services/toast.js"; + +const TPL = ` +

Automatic backup

+ +

Trilium can back up the database automatically:

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +

It's recommended to keep the backup turned on, but this can make application startup slow with large databases and/or slow storage devices.

+ +
+ +

Backup now

+ +

+`; + +export default class BackupOptions { + constructor() { + $("#options-backup").html(TPL); + + this.$backupDatabaseButton = $("#backup-database-button"); + + this.$backupDatabaseButton.on('click', async () => { + const {backupFile} = await server.post('database/backup-database'); + + toastService.showMessage("Database has been backed up to " + backupFile, 10000); + }); + + this.$dailyBackupEnabled = $("#daily-backup-enabled"); + this.$weeklyBackupEnabled = $("#weekly-backup-enabled"); + this.$monthlyBackupEnabled = $("#monthly-backup-enabled"); + + this.$dailyBackupEnabled.on('change', () => { + const opts = { 'dailyBackupEnabled': this.$dailyBackupEnabled.is(":checked") ? "true" : "false" }; + server.put('options', opts).then(() => toastService.showMessage("Options change have been saved.")); + + return false; + }); + + this.$weeklyBackupEnabled.on('change', () => { + const opts = { 'weeklyBackupEnabled': this.$weeklyBackupEnabled.is(":checked") ? "true" : "false" }; + server.put('options', opts).then(() => toastService.showMessage("Options change have been saved.")); + + return false; + }); + + this.$monthlyBackupEnabled.on('change', () => { + const opts = { 'monthlyBackupEnabled': this.$monthlyBackupEnabled.is(":checked") ? "true" : "false" }; + server.put('options', opts).then(() => toastService.showMessage("Options change have been saved.")); + + return false; + }); + } + + optionsLoaded(options) { + this.$dailyBackupEnabled.prop("checked", options['dailyBackupEnabled'] === 'true'); + this.$weeklyBackupEnabled.prop("checked", options['weeklyBackupEnabled'] === 'true'); + this.$monthlyBackupEnabled.prop("checked", options['monthlyBackupEnabled'] === 'true'); + } +} diff --git a/src/public/app/dialogs/options/keyboard_shortcuts.js b/src/public/app/dialogs/options/shortcuts.js similarity index 98% rename from src/public/app/dialogs/options/keyboard_shortcuts.js rename to src/public/app/dialogs/options/shortcuts.js index 2fecdeeb5..290f90789 100644 --- a/src/public/app/dialogs/options/keyboard_shortcuts.js +++ b/src/public/app/dialogs/options/shortcuts.js @@ -35,7 +35,7 @@ let globActions; export default class KeyboardShortcutsOptions { constructor() { - $("#options-keyboard-shortcuts").html(TPL); + $("#options-shortcuts").html(TPL); $("#options-keyboard-shortcuts-reload-app").on("click", () => utils.reloadFrontendApp()); diff --git a/src/routes/api/options.js b/src/routes/api/options.js index 3bc73d10b..6d7780df1 100644 --- a/src/routes/api/options.js +++ b/src/routes/api/options.js @@ -50,7 +50,10 @@ const ALLOWED_OPTIONS = new Set([ 'autoCollapseNoteTree', 'autoReadonlySizeText', 'autoReadonlySizeCode', - 'overrideThemeFonts' + 'overrideThemeFonts', + 'dailyBackupEnabled', + 'weeklyBackupEnabled', + 'monthlyBackupEnabled', ]); function getOptions() { diff --git a/src/services/backup.js b/src/services/backup.js index e5fbf0df2..f43ead594 100644 --- a/src/services/backup.js +++ b/src/services/backup.js @@ -20,12 +20,22 @@ function regularBackup() { }); } -function periodBackup(optionName, fileName, periodInSeconds) { - const now = new Date(); - const lastDailyBackupDate = dateUtils.parseDateTime(optionService.getOption(optionName)); +function isBackupEnabled(backupType) { + const optionName = `${backupType}BackupEnabled`; - if (now.getTime() - lastDailyBackupDate.getTime() > periodInSeconds * 1000) { - backupNow(fileName); + return optionService.getOptionBool(optionName); +} + +function periodBackup(optionName, backupType, periodInSeconds) { + if (!isBackupEnabled(backupType)) { + return; + } + + const now = new Date(); + const lastBackupDate = dateUtils.parseDateTime(optionService.getOption(optionName)); + + if (now.getTime() - lastBackupDate.getTime() > periodInSeconds * 1000) { + backupNow(backupType); optionService.setOption(optionName, dateUtils.utcNowDateTime()); } diff --git a/src/services/options_init.js b/src/services/options_init.js index d9e2a5a0b..b6cb1db7b 100644 --- a/src/services/options_init.js +++ b/src/services/options_init.js @@ -87,6 +87,9 @@ const defaultOptions = [ { name: 'autoCollapseNoteTree', value: 'true', isSynced: true }, { name: 'autoReadonlySizeText', value: '10000', isSynced: false }, { name: 'autoReadonlySizeCode', value: '30000', isSynced: false }, + { name: 'dailyBackupEnabled', value: 'true', isSynced: false }, + { name: 'weeklyBackupEnabled', value: 'true', isSynced: false }, + { name: 'monthlyBackupEnabled', value: 'true', isSynced: false } ]; function initStartupOptions() { diff --git a/src/views/dialogs/options.ejs b/src/views/dialogs/options.ejs index fae031ae2..844f63706 100644 --- a/src/views/dialogs/options.ejs +++ b/src/views/dialogs/options.ejs @@ -14,7 +14,7 @@ Appearance + @@ -35,15 +38,16 @@
-
+
-
+
+
- \ No newline at end of file +