Changeset 742ba7e in Klonkt for src/assets/js


Ignore:
Timestamp:
07/28/2026 07:58:26 PM (6 weeks ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
6c152a5
Parents:
70677e96
Message:

Een ward loslaten vraagt eerst, en zegt wat het doet

Loslaten zat achter een window.confirm met een lap tekst erin. Dat is precies
het soort dialoog dat mensen wegklikken om ervan af te zijn, terwijl dit de
zwaarste knop in de app is. Nu is het een stap in het paneel: eerst de gevolgen,
dan ja of nee, met nee links zodat de uitweg de makkelijke is om te raken.

De waarschuwing wordt opgebouwd uit wat er echt aan de hand is, niet uit een
vaste zin, want loslaten betekent twee verschillende dingen. Blijven er andere
guardians over, dan stap jij op en blijft het kind een ward (FEP-633c 3.3). Ben
je de laatste, dan is het emancipatie, en 3.4 zegt uitdrukkelijk dat geen enkele
guardian daar alleen over gaat: drie instemmende volwassenen, of een meerderheid
met twee getuigen. Een nieuwe route zoekt dat op het moment van drukken op, want
voor een ward die wij niet hosten moet daarvoor die server bevraagd worden en
dat hoort niet bij elke ververs-ronde.

En het derde ding dat er hoorde te staan: het Undo federeert nog niet (fase 4 in
relations.js), dus vandaag haalt de knop de band alleen hier weg terwijl de
server van het kind je gewoon als guardian blijft noemen. Zonder die regel drukt
een guardian erop in de overtuiging dat het kind losgelaten is.

Changed files:
src/routes/guardian.js

  • GET /guardian/wards/release-check: telt de guardians van dit kind (lokaal uit de relaties, remote uit shaer:guardians van de actor) en weigert een ward die niet van jou is
  • de nieuwe labels toegevoegd aan uiStrings

src/assets/js/guardian.js

  • releaseStep: de waarschuwing plus ja/nee, in plaats van window.confirm
  • de site gaat mee in de check, anders kijkt de server naar de verkeerde

src/assets/css/guardian.css

  • --danger toegevoegd; die bestond niet, waardoor het kader en de knop onzichtbaar bleven
  • opmaak voor het waarschuwingsblok

src/services/i18n.js

  • 24 strings voor de waarschuwing in nl, en, de

test/guardian-panel.test.js

  • loslaten gaat in twee stappen en niet via window.confirm
  • elke CSS-variabele die de PWA gebruikt is er ook een die hij definieert

remarks: alle vier de gevallen in de browser nagelopen: laatste guardian,
meerdere guardians, onbereikbare server, en een ward die niet van je is. Nee
zet de knop terug zonder iets te doen, ja verwijdert alleen die ene relatie.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/guardian.js

    r70677e96 r742ba7e  
    184184  }
    185185
     186  /**
     187   * The second step of releasing a ward: what it does, then yes or no.
     188   *
     189   * The warning is assembled from what the server found, not from a fixed
     190   * sentence, because releasing means two different things (FEP-633c): stepping
     191   * down while other guardians remain (§3.3), or being the last one, which is
     192   * emancipation and explicitly not one guardian's call (§3.4). And as long as
     193   * the Undo does not federate, the ward's server keeps listing you either way
     194   * — a guardian has to know that before pressing, not after.
     195   */
     196  function releaseStep(w, check, host, relBtn) {
     197    var uri = w.other_uri;
     198    var who = handleOf(uri, w.other_handle);
     199    var box = el('div', 'g-warn');
     200    box.appendChild(el('strong', null, (T.release_title || 'Release {who}?').replace('{who}', who)));
     201    box.appendChild(el('p', null, T.release_effect || ''));
     202    if (check.last === true) box.appendChild(el('p', 'grave', T.release_last || ''));
     203    else if (check.last === false) box.appendChild(el('p', null, T.release_step_down || ''));
     204    else box.appendChild(el('p', 'grave', T.release_unknown || ''));
     205    if (check.federates === false) box.appendChild(el('p', null, T.release_local || ''));
     206
     207    var row = el('div', 'row');
     208    var yes = el('button', 'danger small', T.release_yes || 'Yes');
     209    yes.addEventListener('click', function () { yes.disabled = true; remove(uri, yes); });
     210    var no = el('button', 'small', T.release_no || 'No');
     211    no.addEventListener('click', function () {
     212      host.removeChild(box);
     213      relBtn.hidden = false; relBtn.disabled = false;
     214    });
     215    // No first: the way out should be the easy one to hit.
     216    row.appendChild(no); row.appendChild(yes);
     217    box.appendChild(row);
     218    return box;
     219  }
     220
    186221  function wardPanel(w) {
    187222    var uri = w.other_uri;
     
    215250    actRow.appendChild(wave);
    216251    var rel = el('button', 'quiet small', T.release);
    217     // Releasing a ward is heavy and hard to undo (coming back needs a fresh
    218     // offer the ward accepts), so it asks first and spells out what changes.
     252    // Letting a child go is a decision, not a click. It opens a step that first
     253    // asks the server what releasing this particular ward actually does, then
     254    // says it plainly and asks yes or no. Never window.confirm: that hides a
     255    // long explanation behind an OK button people press to make it go away.
    219256    rel.addEventListener('click', function () {
    220       var who = handleOf(uri, w.other_handle);
    221       var msg = (T.release_confirm || 'Release {who}?').replace('{who}', who);
    222       if (window.confirm(msg)) remove(uri, rel);
     257      rel.disabled = true;
     258      // site matters: with several of your own sites the server would otherwise
     259      // check this ward against the wrong one and answer "not my ward".
     260      fetch('/guardian/wards/release-check?site=' + encodeURIComponent(S.site) + '&uri=' + encodeURIComponent(uri))
     261        .then(function (r) { return r.json(); })
     262        .then(function (c) {
     263          rel.hidden = true;
     264          act.appendChild(releaseStep(w, c || {}, act, rel));
     265        })
     266        .catch(function () { rel.disabled = false; });
    223267    });
    224268    actRow.appendChild(rel);
Note: See TracChangeset for help on using the changeset viewer.