Преглед на файлове

Thuis bezorgen: pagina thuisBezorgen + menuknop gebouwd

- Nieuwe pagina thuisBezorgen (page param plaats), standaard header + drawer
- StaggeredView op establishments services_2, infinite scroll, pull-to-refresh,
  responsive 1/1/2/3, Empty List Widget (logo800px)
- drawerComponent: onTap op ListTileThuisbezorgen -> thuisBezorgen
- CLAUDE.md: Predefined Path is NIET null-veilig bij gepagineerde lijsten
  (genereert `items(...)! ?? []`), plus twee builder-invoerpatronen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob преди 8 часа
родител
ревизия
b16ed9cbb4
променени са 2 файла, в които са добавени 56 реда и са изтрити 8 реда
  1. 24 0
      CLAUDE.md
  2. 32 8
      TASKS.md

+ 24 - 0
CLAUDE.md

@@ -2428,6 +2428,30 @@ grep -c "return 0;" <widget>.dart          # lege tak in een Responsive Value
 Die laatste is een echte valkuil: een niet-ingevulde breekpunt-tak levert
 `return 0;` op, en dat gooit een assertion bij een MasonryGridView.
 
+**⚠️ Bij een GEPAGINEERDE lijst is Predefined Path juist NIET null-veilig — gebruik
+daar JSON Path `$`.** Bevestigd 2026-09-16 bij het bouwen van `thuisBezorgen`. Het
+`items`-recept hieronder klopt voor een gewone (FutureBuilder-)lijst, maar met
+*Enable Infinite Scroll* genereert FlutterFlow in het **model**:
+`final pageItems = (XCall.items(response.jsonBody)! ?? []).toList()` — let op de
+**`!` vóór de `??`**: bij een mislukte call (jsonBody `null`) crasht de null-check
+vóórdat de `?? []` iets kan opvangen. Kies je daar *JSON Path* `$`, dan komt er
+`(getJsonField(response.jsonBody, r'$') ?? []).toList()` uit — wél veilig, en
+precies wat alle bestaande gepagineerde lijsten in dit project doen. Snelle audit
+op een verse export: `grep -rn "! ??" lib/ --include=*_model.dart` hoort **0**
+treffers te geven.
+
+**Numerieke velden in het AppBar-paneel: `triple_click` werkt voor AppBar Height
+en Toolbar Height, maar Elevation wil `left_click` + `ctrl+a` + typen + `Tab`.**
+Bevestigd 2026-09-16: drie `triple_click`+typ-pogingen lieten Elevation onveranderd
+op 0 staan (geen foutmelding), de ctrl+a-variant zette 'm meteen op 2.
+
+**Dropdowns in het rechterpaneel en in Set-Variable-dialogen openen vaak pas bij de
+tweede klik — maar twee kliks in één `browser_batch` openen en sluiten hem weer.**
+Vaste werkwijze die 2026-09-16 tientallen keren werkte: één klik per tool-aanroep,
+daarna `zoom` om te zien of de lijst er staat, en pas dán de optie aanklikken.
+Zelfde geldt voor de bronregel in "Setting from Variable": de eerste klik ná het
+openen van die dialoog landt structureel niet.
+
 **Een lijstwidget null-veilig maken tegen een mislukte API-call, zónder custom
 action: Predefined Path `items` = `$[:]` (Is List) op de call, en Generate
 Dynamic Children daaraan binden.** Bevestigd 2026-09-13 (bevinding C, Home- en

+ 32 - 8
TASKS.md

@@ -404,14 +404,38 @@ kleur, terugknop-vorm en drawer-icoon staan daar al op de lijst.*
 
 *Artifact: https://claude.ai/artifact/QGVnHcfobrEQ9yioqoCawU — screenshots in `~/uk-shots/2026-09-16/`.*
 
-### 🔴 IN UITVOERING 2026-09-16 (Claude, sessie 47 "Drupal-opruim + Thuis bezorgen") — Eigenaar: Claude — bezig
-
-*Bob's opdracht 16 sep: "het menu item is er wel, maar de lijst niet. Maak deze
-ajb." Raakt — een andere sessie moet hier NIET tegelijk in bouwen:*
-- **nieuwe pagina `thuisBezorgen`** (losse lijst op establishments `services_2`).
-- **`drawerComponent`** — alléén de `onTap` op de bestaande ListTile "Thuis
-  bezorgen" (`t46xiboh`, regel 744). ⚠️ De sessie "zoekveld + look&feel" claimde
-  dit component ook (Zoek stad-icoon + Help-item) — afstemmen vóór de edit.
+### ✅ AFGEROND 2026-09-16 (Claude, sessie 47) — "Thuis bezorgen" is gebouwd
+
+Pagina **`thuisBezorgen`** + de menuknop staan in de builder ("Synced"),
+geverifieerd met drie verse exports en `dart analyze` (**0 errors**).
+FlutterFlow-commit: Bob.
+
+- **Pagina `thuisBezorgen`**, één page parameter `plaats` (String, required).
+  Standaard header (AppBar 80 px / Info / elevation 2 / Show Default Button uit
+  / flexible space met `HeaderButtonsComponent`) + Drawer met `drawerComponent`.
+- **Lijst:** `StaggeredView` in een niet-scrollende Column, **Expanded**, Shrink
+  Wrap uit, Cross Axis Count responsive **1/1/2/3**, pull-to-refresh aan.
+  Backend Query `Horecagelegenheidoverzicht` met `townid` = page parameter
+  `plaats`, `display_id` = **`services_2`**, `page` = Pagination Next Page
+  Number (infinite scroll aan). `horcat` blijft op zijn default en wordt door
+  de display genegeerd (gemeten).
+- **Item:** `HorecagelegenheidoverzichtKaart` via Generate Dynamic Children
+  (`bezorgerItem`), alle zes parameters gebonden met JSON Path
+  (`$.titel`, `$.logo`, `$.nid`, `$.adres`, `$.plaats`, `$.categorie`).
+- **Empty List Widget** aan: Image → Asset `logo800px.png`, Center Image aan
+  (`noItemsFoundIndicatorBuilder`), net als Home.
+- **Menuknop:** `ListTileThuisbezorgen` in `drawerComponent` heeft nu een
+  `onTap` → `ThuisBezorgenWidget.routeName` met `plaats` =
+  `FFAppState().gemeenteSelectId` — exact het patroon van de Horeca-knop
+  ernaast. Gemeten: de view accepteert zowel de gemeente-tid (28694) als de
+  plaats-tid (28695) en geeft in beide gevallen 19 bezorgers voor Amsterdam.
+
+**Nog te doen (klein):** op een toestel bekijken. De code volgt het bewezen
+patroon en analyze is schoon, maar er is geen profile-build gedraaid.
+Route om dat te doen: `fvm flutter run --profile -d <device>
+--route "/thuisBezorgen?plaats=28694"`.
+
+*Issues-teller stond voor én na dit werk op 3 — geen nieuwe fouten toegevoegd.*
 
 ### 📋 Bob's 7 — de geordende lijst van 2026-09-15 (laat), max. 7, niets anders oppakken