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
- Keyboard shortcuts
+ Shortcuts
Code notes
@@ -22,6 +22,9 @@
Username & password
+
+ Backup
+
Sync
@@ -35,15 +38,16 @@
-
\ No newline at end of file
+