Browse Source

Sessie afgesloten: taken 74/76/77 en het taal-cluster afgerond en opgeruimd

TASKS.md: afgeronde taken verwijderd (74 horeca-agenda naar StaggeredView,
76 padding, 77 account aanmaken, taal-cluster). Open blijft taak 82 (deploy naar
productie) en de P2-7-opruimlijst, nu met favorietenCopy2 en het hernoemde
event-tabel-component erbij.

CLAUDE.md: vijf herbruikbare lessen toegevoegd
- TabBar Page heeft precies een kind: Insert Widget vervangt daar
- Duplicate na een verse conditie hernummert stil de i18n-sleutels
- werkende route: Wrap Widget -> Column, dan '+' op de buitenste Column
- een onderbroken conditie-dialoog blokkeert de export van het hele project
- eerst oefenen in een paginakopie (Bob's werkwijze)
- GridView childAspectRatio kan op telefoonformaat stil onleesbaar worden
- wat een vertaal-audit wel en niet vindt + bereikbaarheid via de widget-graaf
bob 5 hours ago
parent
commit
68f8f82df2
1 changed files with 70 additions and 0 deletions
  1. 70 0
      CLAUDE.md

+ 70 - 0
CLAUDE.md

@@ -2063,6 +2063,61 @@ Component"** (maakt een volledige, werkende kopie inclusief Backend
 Query en pagination), en **"Copy Action Chain"/"Paste Action(s)"** voor
 losse actieketens (zie de valkuil daarbij elders in dit bestand).
 
+**Een tweede blok naast een bestaand blok zetten (bv. een ingelogde én een
+uitgelogde variant op dezelfde tab): Wrap Widget → Column, dán "+" op die nieuwe
+buitenste Column.** Volledig bewezen 2026-09-17 (taak 77, Favorieten tab 4).
+De twee routes die je zou verwachten werken allebei níet, en allebei richten ze
+schade aan die je pas in de export ziet:
+- ⚠️ **Een `TabBar Page` heeft precies ÉÉN kind.** "+"/Insert Widget op die rij
+  **vervangt** wat erin zit in plaats van toe te voegen — zonder waarschuwing.
+  Eén klik maakte zo een hele tab leeg (1104 → 766 regels). Herstel: de
+  **undo-knop in de werkbalk** (linksboven); **Ctrl+Z werkte niet**.
+- ⚠️ **`Duplicate` op een widget waar je net een Visibility-conditie op hebt
+  gezet, hernummert stil alle i18n-sleutels eronder.** In de tree lijkt de
+  duplicatie te mislukken (geen tweede node), maar de bestaande sleutels zijn
+  vervangen door verse — met een **lege Engelse vertaling**, en de oude sleutels
+  zijn uit `internationalization.dart` verdwenen. Wil je zo'n blok toch
+  dupliceren: doe dat **vóór** je de conditie zet.
+**Werkende volgorde:** (1) rechtsklik het bestaande blok → *Wrap Widget* →
+**Column**; (2) **"+" op die nieuwe buitenste Column** — een Column accepteert
+wél meerdere kinderen; (3) conditie op elk van de twee blokken. Voor de
+omgekeerde conditie is geen "opposite"-truc nodig: de operatorlijst bevat
+gewoon **"Is Not Set or Is Empty"** naast "Is Set and Not Empty".
+*Let op de positie in de Insert-dropdown:* rij 1 is Text / Column / Row, rij 2
+is Container / Image / Button — de derde kolom is dus Row resp. Button, niet
+Column.
+
+**⚠️ Een onderbroken conditie-dialoog blokkeert de export van het HELE project,
+niet alleen die pagina.** Bevestigd 2026-09-17: Chrome viel weg terwijl de
+Set-Variable-dialoog openstond, en liet een Conditional achter die aanstond met
+een lege First Value. `flutterflow export-code` faalde daarna met
+`Error generating code for the project` — twee keer, dus geen serverhikje. Alle
+sessies zaten vast tot de conditie was afgemaakt (of de toggle uit). Herkenbaar
+aan een rood **`UNSET == Second Value`**-veld in de Visibility-sectie. Raak je
+onderweg de browser kwijt met zo'n dialoog open: **meld het meteen**, want
+anderen lopen er ook op vast.
+
+**Bob's werkwijze bij een riskante structuurwijziging: maak eerst een kopie van
+de pagina en oefen daarin.** Voorgesteld door Bob op 2026-09-17 nadat twee
+bouwroutes op de echte pagina schade hadden aangericht; het trok de taak in één
+keer vlot. *Duplicate Page* op de pagina in de lijst → oefen de volledige route
+in de kopie → verifieer met een export dat de structuur klopt → pas 'm dan pas
+toe op het origineel. Kost één export extra en een dode pagina (die op de
+P2-7-opruimlijst gaat), en het scheelt undo-rondes op productiecode.
+
+**Een `GridView` met `childAspectRatio` kan op een telefoon stil onleesbaar
+worden — en niets meldt dat.** Gevonden 2026-09-16 op de horeca-agenda:
+`crossAxisCount: 2` + `childAspectRatio: 3.0` geeft op 411 dp een cel van
+**63 dp** terwijl de inhoud er ~180 nodig heeft, dus de kaarten tekenden over
+elkaar heen. Géén gele overflow-streep, niets in `dart analyze`, niets in
+`logcat` — een GridView-cel klipt niet, dus Flutter ziet geen fout. Op een
+tablet valt het mee (623 dp breed → 208 dp hoog), waardoor het jaren onopgemerkt
+bleef. **Vaste fix: `Replace Widget` → StaggeredView met Cross Axis Count als
+Responsive Value 1/1/2/3** — die kent `childAspectRatio` niet eens en geeft elk
+kind zijn eigen hoogte. Zat er geen pagination op, dan is de Replace zonder
+voorbereiding te doen en gaat `shrinkWrap` er vanzelf af (wat klopt zodra de
+ouder een begrensde hoogte geeft, bv. een `Expanded`).
+
 **Een widget VERPLAATSEN lukt wél — sleep de rij in de Widget Tree, en
 een drop op een container-rij voegt hem er altijd als EERSTE kind in.**
 Bevestigd 2026-09-03 (P1-36, `HorecagelegenheidoverzichtKaart`): een
@@ -2960,6 +3015,21 @@ modal.
   wrappen) blijft de Insert-modal het enige pad — dan na 1-2 pogingen
   stoppen en aan Bob overdragen, zoals altijd.
 
+**Een vertaal-audit op `internationalization.dart` vindt drie dingen — maar
+géén slecht Engels.** Script-matig te vinden zijn: *lege* `en`, `en == nl`, en
+een `en` die over meerdere verschillende `nl` is hergebruikt (het
+`Duplicate`-patroon: een kopie erft de tekst van het origineel, dus "Terug" komt
+als *Favorite* in het Engels terecht). **Wat een script niet ziet is een
+vertaling die er keurig uitziet maar fout is** — "Eetgelegenheden" → *Eatings*,
+"Overnachten" → *Overnight* telden allebei als "vertaald". Een menselijke blik
+over de labels blijft dus nodig; de audit vervangt dat niet.
+⚠️ **Tel alleen sleutels die in bereikbare schermen gebruikt worden.** Bepaal
+dat door vanaf de startpagina de widget-graaf te volgen (`nav.dart` → entry-
+pagina's → `XWidget.routeName` / `XWidget(`); elke FlutterFlow-pagina staat in
+`nav.dart`, dus "staat in nav.dart" zegt niets over bereikbaarheid. Stand
+2026-09-16: **31 van de 50 widgets bereikbaar, 19 wezen** — de oude telling van
+134 lege vertalingen zat vol dode kopieën.
+
 **Vertalingen invullen: het Settings → Languages-paneel SCROLLT NIET voor
 Claude — gebruik het globe-icoontje op het widget zelf.** Bevestigd
 2026-09-08 (P1-17, 22 vertalingen doorgezet). Het Languages-paneel