Selaa lähdekoodia

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 5 päivää sitten
vanhempi
commit
93ce7a8990
2 muutettua tiedostoa jossa 87 lisäystä ja 18 poistoa
  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
   variabele hoogtes aankan. Dat is ook het patroon dat op
   `HorecagelegenhedenOverzicht` al draait.
   `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
 **Een component-parameter die wél gedeclareerd is maar nergens gelezen
 wordt, is een stille bug — en de builder waarschuwt er niet voor.**
 wordt, is een stille bug — en de builder waarschuwt er niet voor.**
 Gevonden 2026-09-06 (P1-44): `HomeUitgaantabelKaartComponent` kreeg per
 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
   "Toevoegen favoriet") de reden erbij die de site wél geeft: dat je die
   gemeente donderdags in de agendamail krijgt. Nu is "gemeente volgen"
   gemeente donderdags in de agendamail krijgt. Nu is "gemeente volgen"
   een knop zonder zichtbaar nut. Engelse vertaling niet vergeten.
   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`
 - **P1-17** — nog 46 velden, en alleen nog in `stadsactiviteitAanmaken`
   (27) en `uitgaansevenementAanmaken` (19): de twee aanmaak-formulieren
   (27) en `uitgaansevenementAanmaken` (19): de twee aanmaak-formulieren
   die alleen een stadseditor ziet. De hele publieksgerichte UI
   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.
   `flag.json`-POST met een lege `entity_id` en lege sessiewaarden.
   Nog niet live nagespeeld, dus niet bevestigd wat de server dan doet.
   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
 Favorieten-hartje werkt "gewoon" als je uitgelogd bent, maar de server
 krijgt niets — de app liegt dan tegen de gebruiker.**
 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 != '')`
    `if (FFAppState().userSessionid != null && FFAppState().userSessionid != '')`
    direct vóór de `Row`. Een diff tegen de vorige export toont exact
    direct vóór de `Row`. Een diff tegen de vorige export toont exact
    één gewijzigd bestand, dus er is niets anders meegekomen.
    éé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
 **Het gebruikte recept** (bewaard omdat punt 2 hetzelfde patroon nodig
 heeft als Bob voor "verbergen" kiest; werkte in één keer, geen enkele
 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
 keuze in zit. **Het werkende recept per `StaggeredView` en alle valkuilen
 staan bij P2-6; niet opnieuw uitzoeken.**
 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
 **A. Tab 6 (Verhuur, catering) alsnog koppelen.** De enige `StaggeredView` die
 nog op de rauwe API-respons staat; alle andere vijf draaien op
 nog op de rauwe API-respons staat; alle andere vijf draaien op
 `filterHorecagelegenheden(...)`. Recept staat bij P2-6, met
 `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,
 die nooit matchen. Aantallen in Arnhem: Activiteiten 2 items / 2 categorieën,
 Eetgelegenheden 20 / 19, Uitgaan 4 / 4.
 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
 **D. Route omzetten (was P2-6 stap 7) — bewust uitgesteld tot A en B klaar
 zijn.** Twee `Navigate To`-wijzigingen naar `HorecagelegenhedenOverzichtCopy3`:
 zijn.** Twee `Navigate To`-wijzigingen naar `HorecagelegenhedenOverzichtCopy3`: