diff --git a/CHANGELOG.md b/CHANGELOG.md index a043c8e..5cbc838 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +# v0.8.08-beta — Paden rechtzetten en er verandert niets + +Zet je in Instellingen → Paden je mappen goed, dan bleef de appslijst leeg. Niet +omdat er iets mis was — de API leverde de apps gewoon — maar omdat de pagina ze +nooit opnieuw ophaalde. `goto()` wisselt alleen van pagina, en `saveSettings()` +verversde niets. Je keek dus naar de lijst zoals die bij het laden van de pagina +was: leeg. Een herlaadactie loste het op, als je dat wist. + +Twee dingen daaraan: + +- Verandert een pad, dan worden de appslijst en de containers opnieuw + opgehaald. Alleen bij een padwijziging, zodat een gewone instelling niet + telkens twee verzoeken kost. +- **Een geweigerde opslag meldde zich als "opgeslagen".** `saveSettings()` gooide + het antwoord van de server weg en zette onvoorwaardelijk het vinkje. Sinds + v0.8.05 een pad buiten de gekoppelde map weigert, is dat het verschil tussen + "aangepast" en "er is niets gebeurd" — en je zag alleen het vinkje. De + foutmelding van de server komt nu in beeld. + # v0.8.07-beta — "Rondgang geslaagd" en toch een rode job De backup-rondgang doorliep alle vijf de stappen goed — dump, archief, alles diff --git a/VERSION b/VERSION index 18f96b0..dbbb9a4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.07-beta +0.8.08-beta diff --git a/server-up/templates/index.html b/server-up/templates/index.html index 28ab5f2..fe12332 100644 --- a/server-up/templates/index.html +++ b/server-up/templates/index.html @@ -2533,6 +2533,7 @@ function app() { filterOpen: false, filterTagQuery: '', stackMenu: '', stackFilterOpen: false, hoofdmap: '', afgeleidePaden: {}, padCheck: {}, padenVoorWijziging: {}, padWaarschuwing: '', + _padStand: null, padVelden: [ { sleutel: 'LIBRARY_DIR', label: 'library_dir' }, { sleutel: 'DATA_DIR', label: 'appdata_dir' }, @@ -3984,6 +3985,8 @@ function app() { BACKUP_DIR: this.settings.BACKUP_DIR, }; this.hoofdmap = this.settings.BASE_DIR || ''; + this._padStand = ['LIBRARY_DIR', 'DATA_DIR', 'BACKUP_DIR'] + .map(k => this.settings[k] || '').join('|'); await this.loadAppStore(); await this.loadUsers(); await this.loadNetworks(); @@ -3995,8 +3998,27 @@ function app() { async saveSettings() { if (this.saveTimer) { clearTimeout(this.saveTimer); this.saveTimer = null; } const body = { ...this.settings, LANGUAGE: this.settings.LANGUAGE, THEME: this.theme }; - await this.req('/api/settings', { method:'PUT', json: body }); + const d = await this.req('/api/settings', { method:'PUT', json: body }); + // De uitkomst werd weggegooid: een geweigerde opslag meldde zich net zo + // vrolijk als "opgeslagen". Sinds een pad buiten de gekoppelde map + // geweigerd wordt, is dat het verschil tussen "aangepast" en "er is + // niets gebeurd". + if (d && d.ok === false) { + this.toast(d.msg || this.t('error'), 'er'); + return false; + } this.saved = true; setTimeout(() => this.saved = false, 1500); + // De appslijst hangt aan LIBRARY_DIR. Zonder dit blijf je na een + // padwijziging kijken naar wat er bij het laden van de pagina stond — + // je zet je paden goed en er verandert zichtbaar niets. + const stand = ['LIBRARY_DIR', 'DATA_DIR', 'BACKUP_DIR'] + .map(k => this.settings[k] || '').join('|'); + if (stand !== this._padStand) { + this._padStand = stand; + await this.loadStacks(); + await this.loadHostContainers(); + } + return true; }, autoSave() { if (this.saveTimer) clearTimeout(this.saveTimer); diff --git a/tests/js/menu.test.js b/tests/js/menu.test.js index 8eac5d1..18464f5 100644 --- a/tests/js/menu.test.js +++ b/tests/js/menu.test.js @@ -424,6 +424,33 @@ check('balk staat halverwege', c.job.progress.pct === 50); check('en geen knop die apps belooft', c.storeVerborgen === 0); check('de teller is ook nul', c.storeResultaat === 0); + // ── Instellingen opslaan ────────────────────────────────────────────────── + // De uitkomst werd weggegooid: een geweigerde opslag meldde zich als + // "opgeslagen". En na een padwijziging werd niets herladen, dus je zette je + // paden goed en zag hetzelfde lege scherm. + let herladen = 0; + let getoast = ''; + c.loadStacks = async () => { herladen++; }; + c.loadHostContainers = async () => { herladen++; }; + c.toast = (m) => { getoast = m; }; + c.settings = {LIBRARY_DIR: '/opt/serverup/stacks', DATA_DIR: '/opt/a', BACKUP_DIR: '/opt/b'}; + c._padStand = ['LIBRARY_DIR','DATA_DIR','BACKUP_DIR'].map(k => c.settings[k]).join('|'); + + c.req = async () => ({ok: false, msg: 'Server Up kan niet bij /srv/x'}); + c.settings.LIBRARY_DIR = '/srv/x'; + check('een geweigerde opslag geeft false terug', (await c.saveSettings()) === false); + check('en meldt waarom', getoast.includes('/srv/x')); + check('en herlaadt niets', herladen === 0); + check('en zegt niet dat het opgeslagen is', c.saved !== true); + + c.req = async () => ({ok: true}); + check('een geslaagde opslag geeft true terug', (await c.saveSettings()) === true); + check('en haalt de lijst opnieuw op', herladen === 2); + + herladen = 0; + check('nog een keer opslaan zonder padwijziging lukt', (await c.saveSettings()) === true); + check('en herlaadt dan niet opnieuw', herladen === 0); + c.rpc = poortRpc; // ── Eén lijst voor beheerde en handmatig gestarte apps ────────────────────