Ver Fonte

P0-13 afgerond; P2-24 A/C geblokkeerd met nieuwe diagnose

P0-13: hartje weg van de horeca-overzichtskaart (Bob's keuze: favorieten
alleen op de establishment-pagina zelf), login-guard op het hartje van de
detailpagina. Beide geverifieerd, dart analyze 0 errors.

P2-24: het Generate Dynamic Children-paneel schrijft op Copy3 niets meer
weg. Aangetoond door Max Items van 25 naar leeg en naar 1000 te zetten -
beide bleven in de export op take(25) staan, bestand byte-identiek. Dat
verklaart ook waarom tab 6 koppelen bij zowel Bob als Claude structureel
faalt; de "Custom Functions rendert niet"-observatie was een symptoom.

CLAUDE.md: de test die dit uitwees, als vuistregel bij vastlopende
bindingen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob há 5 dias atrás
pai
commit
93ce7a8990
2 ficheiros alterados com 87 adições e 18 exclusões
  1. 24 0
      CLAUDE.md
  2. 63 18
      TASKS.md

+ 24 - 0
CLAUDE.md

@@ -1772,6 +1772,30 @@ op een wegwerp-duplicaat):
   variabele hoogtes aankan. Dat is ook het patroon dat op
   `HorecagelegenhedenOverzicht` al draait.
 
+**Een paneel kan op ÉÉN pagina structureel niets meer wegschrijven —
+test dat met een triviale waarde vóór je een moeilijke binding de schuld
+geeft.** Bevestigd 2026-09-09 op `HorecagelegenhedenOverzichtCopy3`: het
+**Generate Dynamic Children**-paneel accepteerde daar geen enkele
+wijziging meer. Maandenlang leek dat "de bron *Custom Functions* rendert
+zijn optielijst niet" (~15 pogingen Claude, 2x Bob), maar dat was een
+symptoom. **De test die het uitwees:** verander iets triviaals in
+hetzelfde paneel — hier `Max Items` van `25` naar leeg, en daarna naar
+`1000`. Beide toonden in de UI netjes de nieuwe waarde (compleet met de
+placeholder *"Leave empty for no limit…"*), en beide kwamen **niet** in de
+export: zes keer onveranderd `.take(25)`, bestand byte-identiek. Committen
+via lege paneelruimte, via een ander invoerveld én via een selectiewissel
+in de tree maakte geen verschil.
+- **Belangrijk onderscheid:** de *pagina* was niet bevroren — widgets
+  verwijderen en de automatische controller-hernummering die daarop volgde
+  kwamen op dezelfde dag wél gewoon door. Het is dus paneel-specifiek per
+  pagina, niet pagina-breed.
+- **Vuistregel:** loopt een binding herhaald vast, verspil dan geen tien
+  pogingen aan de dialoog. Zet één triviale waarde in datzelfde paneel en
+  draai een export. Komt die ook niet door, dan is de dialoog niet je
+  probleem en heeft doorproberen geen enkele zin.
+- Beste onbeproefde herstelroute: de pagina opnieuw `Duplicate Page`-en en
+  kijken of het paneel in de kopie wél wegschrijft.
+
 **Een component-parameter die wél gedeclareerd is maar nergens gelezen
 wordt, is een stille bug — en de builder waarschuwt er niet voor.**
 Gevonden 2026-09-06 (P1-44): `HomeUitgaantabelKaartComponent` kreeg per

+ 63 - 18
TASKS.md

@@ -43,12 +43,11 @@ Wat er nog ligt, allemaal in dezelfde views:
   "Toevoegen favoriet") de reden erbij die de site wél geeft: dat je die
   gemeente donderdags in de agendamail krijgt. Nu is "gemeente volgen"
   een knop zonder zichtbaar nut. Engelse vertaling niet vergeten.
-- **P0-13 (nieuw, 2026-09-08) · Eigenaar: Bob — wacht op één
-  ontwerpbesluit** — **de favorieten-hartjes hadden geen login-guard**,
-  waardoor een uitgelogde gebruiker een hartje kan aanzetten dat de
-  server nooit ontvangt. **Het gemeente-hartje is 2026-09-08 gefixt en
-  via export geverifieerd.** De twee horeca-hartjes wachten op Bob's
-  keuze tussen "verbergen" en "naar Login sturen". Zie de taak zelf.
+- ~~**P0-13** — favorieten-hartjes zonder login-guard.~~ **AFGEROND
+  2026-09-09.** Gemeente-hartje en horeca-detailpagina hebben nu een
+  `userSessionid`-guard; het hartje op de horeca-overzichtskaart is op
+  Bob's beslissing volledig verwijderd (favorieten alleen nog op de
+  establishment-pagina zelf).
 - **P1-17** — nog 46 velden, en alleen nog in `stadsactiviteitAanmaken`
   (27) en `uitgaansevenementAanmaken` (19): de twee aanmaak-formulieren
   die alleen een stadseditor ziet. De hele publieksgerichte UI
@@ -1089,8 +1088,7 @@ taakomschrijving stonden:**
   `flag.json`-POST met een lege `entity_id` en lege sessiewaarden.
   Nog niet live nagespeeld, dus niet bevestigd wat de server dan doet.
 
-**P0-13 · Eigenaar: Bob — nog één ontwerpbesluit (gemeente-hartje al
-gefixt door Claude, sessie 71, 2026-09-08).
+**P0-13 · AFGEROND 2026-09-09 (Claude + Bob, sessie 71).
 Favorieten-hartje werkt "gewoon" als je uitgelogd bent, maar de server
 krijgt niets — de app liegt dan tegen de gebruiker.**
 
@@ -1143,12 +1141,19 @@ echte gat is uitsluitend het uitgelogde geval.
    `if (FFAppState().userSessionid != null && FFAppState().userSessionid != '')`
    direct vóór de `Row`. Een diff tegen de vorige export toont exact
    één gewijzigd bestand, dus er is niets anders meegekomen.
-2. De twee horeca-hartjes zijn **een ontwerpbesluit voor Bob**, geen
-   mechanische herhaling: die zitten midden in de hoofd-UI (elke
-   overzichtskaart), dus "verbergen als uitgelogd" verandert het beeld
-   van de belangrijkste lijst in de app. Alternatief is het hartje laten
-   staan en bij een tik naar Login navigeren — betere UX, maar meer werk
-   (actieketen met een conditional). **Niet aangeraakt tot Bob kiest.**
+2. ~~De twee horeca-hartjes zijn een ontwerpbesluit voor Bob.~~
+   **BESLIST EN AFGEROND 2026-09-08/09.** Bob's keuze: *"die horeca-hartjes
+   moeten niet op overzichtspagina's. Die favorieten alleen op de pagina van
+   de establishment zelf, anders wordt het te rommelig."* Dus:
+   - **`HorecagelegenheidoverzichtKaart`** — hartje volledig verwijderd
+     (Bob, builder). Geverifieerd: 0 verwijzingen naar `favorieteHorecaNids`
+     of `flag.json` in dat bestand.
+   - **`horecagelegenheidCurrent`** — hartje blijft, maar met login-guard
+     (Claude, builder). Verse export toont
+     `if (FFAppState().userSessionid != null && FFAppState().userSessionid != '')`
+     rond de `Align` > `AlignedTooltip` op regel ~336. `dart analyze` 0 errors.
+
+**P0-13 is hiermee volledig afgerond.**
 
 **Het gebruikte recept** (bewaard omdat punt 2 hetzelfde patroon nodig
 heeft als Bob voor "verbergen" kiest; werkte in één keer, geen enkele
@@ -3213,6 +3218,38 @@ Bob nodig — óf omdat Claude er aantoonbaar niet doorheen komt, óf omdat er e
 keuze in zit. **Het werkende recept per `StaggeredView` en alle valkuilen
 staan bij P2-6; niet opnieuw uitzoeken.**
 
+**⛔ A en C zijn geblokkeerd door één en dezelfde oorzaak — lees dit
+eerst (2026-09-09, Claude, hard gemeten).**
+
+Het **Generate Dynamic Children-paneel schrijft op deze pagina niets meer
+weg.** Dat is een nieuwe, veel bruikbaardere diagnose dan het oude verhaal
+("de bron Custom Functions rendert zijn optielijst niet") — dat was een
+symptoom, niet de oorzaak. Het bewijs:
+- De **Max Items**-waarde (25) is op **zes** StaggeredViews aangepast. In de
+  UI toonde het veld daarna netjes leeg (*"Leave empty for no limit…"*), en
+  bij een tweede test de waarde `1000`. **Een verse export toonde in beide
+  gevallen onveranderd `.take(25)`, zes keer.** Leeg én een getal komen dus
+  allebei niet door — het ligt niet aan een lege waarde.
+- Committen via een klik op lege paneelruimte, via een klik in het
+  `Variable Name`-veld, én via een selectiewissel in de widget tree: alle
+  drie geen verschil.
+- **De pagina zelf is níét bevroren:** Bob's verwijdering van de twee lege
+  `TextField`s (punt E) kwam op dezelfde dag wél gewoon door, net als de
+  hernummering van `textController1` → `textController` die FlutterFlow
+  daarbij zelf doorvoerde.
+
+**Gevolg:** zowel punt A (tab 6 koppelen) als punt C (`Max Items` weghalen)
+lopen via dit paneel en zijn daarmee niet uitvoerbaar. Bob heeft A twee keer
+geprobeerd, Claude ~15 keer plus zes keer op Max Items; het bestand kwam elke
+keer **byte-identiek** terug uit de export.
+
+**Onbeproefd idee met de beste kans:** maak met `Duplicate Page` een verse
+kopie van Copy3 en kijk of het paneel daar wél wegschrijft. Zit de blokkade in
+de opgeslagen pagina-data, dan lost een duplicaat 'm op. Kost wel het
+opnieuw omzetten van de route (punt D) en een controle van de zes tabs.
+Alternatief: melden bij FlutterFlow-support. **Niet zelf gedaan — een
+pagina dupliceren is een grote ingreep en Bob's beslissing.**
+
 **A. Tab 6 (Verhuur, catering) alsnog koppelen.** De enige `StaggeredView` die
 nog op de rauwe API-respons staat; alle andere vijf draaien op
 `filterHorecagelegenheden(...)`. Recept staat bij P2-6, met
@@ -3248,10 +3285,18 @@ unieke-categorieën-functie moet de binnenlijst **plat slaan** en niet
 die nooit matchen. Aantallen in Arnhem: Activiteiten 2 items / 2 categorieën,
 Eetgelegenheden 20 / 19, Uitgaan 4 / 4.
 
-**C. `Max Items` staat per tab op 25 — beslissing Bob.** Bestond al vóór P2-6.
-Filteren gebeurt vóór het afkappen, dus zoeken werkt correct — maar zónder
-zoekterm zie je 25 van de volledige dataset die `fetchAlleHorecagelegenheden`
-juist ophaalt. Limiet weghalen of laten staan?
+**C. `Max Items` staat per tab op 25 — Bob's besluit 2026-09-09: weghalen.
+⛔ Geblokkeerd, zie het kader hierboven.** Onderbouwing van het besluit, voor
+als de blokkade ooit opgelost is: er is al een harde begrenzing elders
+(`fetchAlleHorecagelegenheden` loopt door API-pagina's van 100 met
+`maxPaginas = 10`, dus **max 1000 per tab**), en alle zes de grids zijn
+`MasonryGridView.builder` — lazy, dus alleen zichtbare kaarten worden gebouwd.
+Er is **geen paginering/infinite scroll meer** op deze pagina (0
+`PagingController`s); dat is bewust, want client-side filteren kan alleen met
+de volledige dataset. In de praktijk is de grootste tab in Arnhem 20 items,
+dus `take(25)` kapt daar niets af — het risico is een plaats mét meer dan 25
+zaken, waar zoekresultaten dan stilletjes incompleet zijn. Wil je ooit
+strakker begrenzen, doe dat in `maxPaginas`, niet in de weergavelimiet.
 
 **D. Route omzetten (was P2-6 stap 7) — bewust uitgesteld tot A en B klaar
 zijn.** Twee `Navigate To`-wijzigingen naar `HorecagelegenhedenOverzichtCopy3`: