diff --git a/CLAUDE.md b/CLAUDE.md index 4aef8f1a..aed9ddc7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -73,7 +73,7 @@ MijnOverheid Zakelijk (MOZa) is een HTML/CSS/JS prototype gebouwd met Eleventy e - Berichtenbox, datalaag en rendering gescheiden: `assets/javascript/berichtenbox/` bevat zes modules zonder DOM-kennis — `datum.js` (datumnotatie), `state.js` (localStorage-state en de vragen daarover), `lijst.js` (filteren, sorteren, pagineren als pure functies), `bron.js` (bronregister) `keten-bron.js` (het Federatief Berichtenstelsel als bron) en `dataset-bron.js` (de gegenereerde dataset als bron, inclusief het nagebootste federatieve gedrag: de ophaalanimatie bij het eerste bezoek, de binnendruppelende berichten en de gesimuleerde bronuitval). `berichtenbox.js` is de render-laag: die leest uit de datalaag en muteert de bron nooit. Een bron is `{ naam, geldtVoor(persona), laad(), start?(meld), inhoudVan?(berichtId), volgVoortgang?(kijker), herhaalOphalen?(klaar) }`. `inhoudVan` levert `{ inhoud, bijlagen }` of `{ fout }` en werpt niet: de detailpagina moet altijd iets kunnen tonen, en een lege pagina zou de bezoeker laten denken dat het bericht zelf leeg is. De berichtenuitvraag van het stelsel geeft alleen kopgegevens — afzender, onderwerp, datum; de inhoud staat achter een eigen adres per bericht (`GET /api/v1/berichten/{berichtId}`) en wordt pas opgehaald als de bezoeker het bericht opent. Dat is geen besparing maar het gedrag van een federatief stelsel: de inhoud blijft bij de organisatie tot iemand erom vraagt. Een bijlage is een gewone link naar `/api/v1/berichten/{berichtId}/bijlagen/{bijlageId}`, geen fetch: een `` en een `` kunnen geen eigen header meesturen, en het stelsel eist `X-Ontvanger`. De keten-bron zet die ontvanger daarom in een cookie (`ontvanger`, rauw en `SameSite=Strict`) en de proxy maakt er in `container/default.conf.template` weer een header van — zelfde patroon als `X-Test-User` bij de Digitale Assistent. In het cookie en niet in de URL: de ontvanger hoort bij de zitting, niet bij het adres van het document. Dat maakt niets veiliger; een cookie is net zo goed aan te passen als een header. `personas.js` wist het cookie bij een persona-wissel, anders haalt een klik de bijlage van de vorige persona op. Berichten uit de keten hebben geen server-gerenderde detailpagina — die worden bij de build uit de dataset gegenereerd — en landen daarom op `bericht-demo.html`. `volgVoortgang` meldt `{ bevraagd, klaar, gevonden }` zolang er opgehaald wordt en `null` als er niets meer te melden valt; de render-laag abonneert zich daarop vóór de bronkeuze, want `geldtVoor` wacht een ronde af. `herhaalOphalen` draait een nieuwe ronde op verzoek van de bezoeker. Beide zijn generiek: de dataset-bron vult ze met een nabootsing, het stelsel met gemeten getallen, en de render-laag hoort het verschil niet te kunnen zien; de volgorde van registreren is de voorrang en de dataset-bron staat achteraan als vangnet. Één weg naar het scherm: `toonBerichten()` filtert de berichten, neemt het paginavenster en bouwt die rijen. De inbox rendert geen rijen vooraf: de tbody begint leeg en wordt gevuld uit de datalaag, net als het archief en de prullenbak. Dat is een bewuste afwijking van principe 5 (HTML waar het kan): dit prototype simuleert een federatief stelsel dat berichten bij verschillende organisaties ophaalt, en die zijn er per definitie niet synchroon. Vooraf een volledige lijst renderen zou beweren dat ze dat wél waren — precies wat de voortgangsanimatie tegenspreekt. Wie geen JavaScript heeft krijgt een `