diff --git a/frontend/src/routes/settings/panels/Data.svelte b/frontend/src/routes/settings/panels/Data.svelte
index 766c883..c1b6ea1 100644
--- a/frontend/src/routes/settings/panels/Data.svelte
+++ b/frontend/src/routes/settings/panels/Data.svelte
@@ -22,6 +22,7 @@
let autoPruneOption = { enabled: false, companies: [] };
let autoPruneEnabled = false;
let autoPruneError = '';
+ let isSavingAutoPrune = false;
// backup
let isBackupModalVisible = false;
@@ -74,10 +75,12 @@
}
}
- async function setAutoPruneValue(enabled) {
+ // save the auto-prune setting, only applied when the user clicks Save
+ async function saveAutoPrune() {
autoPruneError = '';
+ isSavingAutoPrune = true;
// read-modify-write: preserve per-company entries
- const updated = { ...autoPruneOption, enabled };
+ const updated = { ...autoPruneOption, enabled: autoPruneEnabled };
try {
const res = await api.option.setAutoPrune(updated);
if (!res.success) {
@@ -85,11 +88,12 @@
return;
}
autoPruneOption = updated;
- autoPruneEnabled = enabled;
addToast('Auto-prune setting saved', 'Success');
} catch (e) {
autoPruneError = 'Failed to save auto-prune setting';
console.error('failed to set auto-prune setting', e);
+ } finally {
+ isSavingAutoPrune = false;
}
}
@@ -319,16 +323,21 @@
checked={autoPruneEnabled}
label="Enabled"
description="Orphaned recipients are deleted automatically each hour"
- on:change={() => setAutoPruneValue(true)}
+ on:change={() => (autoPruneEnabled = true)}
/>
- How long deprovisioned recipients are kept (disabled) before being permanently removed. -
{/if} diff --git a/frontend/src/routes/settings/panels/System.svelte b/frontend/src/routes/settings/panels/System.svelte index da9fcec..f8a204b 100644 --- a/frontend/src/routes/settings/panels/System.svelte +++ b/frontend/src/routes/settings/panels/System.svelte @@ -7,7 +7,10 @@ import SettingsCard from '$lib/components/SettingsCard.svelte'; import SettingsLoading from '$lib/components/SettingsLoading.svelte'; import Button from '$lib/components/Button.svelte'; + import Alert from '$lib/components/Alert.svelte'; import Form from '$lib/components/Form.svelte'; + import FormButton from '$lib/components/FormButton.svelte'; + import FormError from '$lib/components/FormError.svelte'; import TextFieldSelect from '$lib/components/TextFieldSelect.svelte'; const logLevels = ['debug', 'info', 'warn', 'error']; @@ -16,12 +19,15 @@ let loaded = false; let logLevel = ''; let dbLogLevel = ''; + let logError = ''; + let isSavingLog = false; let version = ''; let updateAvailable = false; let isCheckingUpdate = false; let isWipingBrowserCache = false; + let isWipeAlertVisible = false; onMount(async () => { try { @@ -47,14 +53,22 @@ } } - async function setLogLevel() { + // save both log levels together, only applied when the user clicks Save + async function saveLogLevel() { + logError = ''; + isSavingLog = true; try { const res = await api.log.setLevel(logLevel, dbLogLevel); if (!res.success) { - console.error(res); + logError = res.error || 'Failed to update logging'; + return; } + addToast('Logging updated', 'Success'); } catch (err) { + logError = 'Failed to update logging'; console.error(err); + } finally { + isSavingLog = false; } } @@ -109,11 +123,13 @@ const response = await api.reportTemplate.wipeBrowserCache(); if (response.success) { addToast('Browser cache wiped', 'Success'); - } else { - addToast(response.error || 'Failed to wipe browser cache', 'Error'); + return { success: true }; } + addToast(response.error || 'Failed to wipe browser cache', 'Error'); + return { success: false }; } catch (e) { addToast('Failed to wipe browser cache', 'Error'); + return { success: false }; } finally { isWipingBrowserCache = false; } @@ -125,12 +141,11 @@ {:else}+ Chromium will be deleted and downloaded again on the next PDF report or remote browser session, + which can take a few minutes. +
+