@page "/settings" @attribute [Authorize] @using Microsoft.AspNetCore.Components.Forms @using WorkTracker.Services.Storage @inject IAppSettingsService AppSettingsService @inject IDatabaseBackupService DatabaseBackupService @inject AppThemeState ThemeState @inject IJSRuntime JS Settings

Settings

Default values used to compute manual work-unit totals and income.

@if (settings is null) {

Loading...

} else {
@if (!string.IsNullOrWhiteSpace(statusMessage)) { @statusMessage }

Database backup

Export the full database as JSON or restore a previously exported JSON backup. Restore replaces the current database only when the backup format version and database schema version are supported.

Export JSON backup Current database schema version: @DatabaseSchemaVersion

Restore from JSON

This overwrites the existing database with the selected backup file.

@if (!string.IsNullOrWhiteSpace(selectedBackupFileName)) {
Selected file: @selectedBackupFileName
}
@if (!string.IsNullOrWhiteSpace(backupStatusMessage)) {
@backupStatusMessage
} @if (!string.IsNullOrWhiteSpace(backupErrorMessage)) {
@backupErrorMessage
}
} @code { private const long MaxBackupFileSize = 20 * 1024 * 1024; private AppSettingsDocument? settings; private string? statusMessage; private string? backupStatusMessage; private string? backupErrorMessage; private IBrowserFile? selectedBackupFile; private string? selectedBackupFileName; private bool isRestoring; private int DatabaseSchemaVersion => CouchbaseLiteDatabaseProvider.CurrentDatabaseSchemaVersion; protected override async Task OnInitializedAsync() { settings = await AppSettingsService.GetAsync(); } private async Task SaveAsync() { if (settings is null) { return; } settings = await AppSettingsService.SaveAsync(settings); ThemeState.SetThemeMode(settings.ThemeMode); statusMessage = $"Saved at {DateTime.Now:t}"; } private void OnRestoreFileSelected(InputFileChangeEventArgs args) { selectedBackupFile = args.File; selectedBackupFileName = args.File.Name; backupStatusMessage = null; backupErrorMessage = null; } private async Task RestoreAsync() { if (selectedBackupFile is null) { backupErrorMessage = "Select a JSON backup file first."; backupStatusMessage = null; return; } var confirmed = await JS.InvokeAsync("confirm", "Restore this backup and overwrite the current database?\nThis cannot be undone."); if (!confirmed) { return; } isRestoring = true; backupStatusMessage = null; backupErrorMessage = null; try { await using var stream = selectedBackupFile.OpenReadStream(MaxBackupFileSize); await DatabaseBackupService.ImportAsync(stream); settings = await AppSettingsService.GetAsync(); ThemeState.SetThemeMode(settings.ThemeMode); selectedBackupFile = null; selectedBackupFileName = null; backupStatusMessage = $"Backup restored at {DateTime.Now:t}."; } catch (DatabaseBackupException exception) { backupErrorMessage = exception.Message; } catch (IOException) { backupErrorMessage = "The selected backup file is too large or could not be read."; } finally { isRestoring = false; } } }