Parcourir la source

P2-43 af (scrollbare tabbalk); P2-44 terug naar Bob met de valkuil erbij

- P2-43: Tab Bar Scrollable aan op HorecagelegenheidCurrent, export toont
  isScrollable: true — "Bezorgen" kapt niet meer af
- P2-44: niet gelukt. De Conditions -> Single Condition-submenu opent niet voor
  Claude; de omweg via de API-respons rechtstreeks genereert een bool-cast op
  dynamic zonder null-check (compileert, crasht bij runtime). Volledig
  teruggedraaid, export byte-identiek aan de uitgangsstaat.
- CLAUDE.md: die valkuil scherper opgeschreven, inclusief hoe je 'm in de export
  herkent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob il y a 4 heures
Parent
commit
ebca8fba77
2 fichiers modifiés avec 69 ajouts et 11 suppressions
  1. 19 2
      CLAUDE.md
  2. 50 9
      TASKS.md

+ 19 - 2
CLAUDE.md

@@ -3304,8 +3304,25 @@ runtime.** Bevestigd 2026-08-31: een Action-Flow-conditie op `$.nid`
 gaf een bool-cast op een String/`null` (`dart analyze` ziet dit niet,
 want `getJsonField` levert `dynamic`). Kies een sleutel die écht een
 bool is (bv. `$.success`), of bouw een Single Condition met een
-expliciete operator. Bij een **Visibility**-conditie genereert "Is Set"
-wél netjes `!= null` — het verschil zit in waar de conditie staat.
+expliciete operator.
+⚠️ **Scherper gesteld 2026-09-18 (P2-44): dit raakt óók een Visibility-conditie,
+en dáár is de valkuil verraderlijker.** Niet "Is Set" is de redding, maar de
+**route** waarlangs je de conditie bouwt:
+- Visibility → Conditional → **Conditions → Single Condition** → *Is Set* geeft
+  netjes `if (... != null)`. Dit is de enige goede route.
+- Visibility → Conditional → **de API-respons rechtstreeks als bron** (API
+  Response Options *JSON Body* → Available Options *JSON Path* → `$[0].veld`)
+  accepteert de builder zonder enige waarschuwing en genereert
+  `if (getJsonField(...))` — een `dynamic` als `bool`, **zonder null-check**.
+  Compileert, `dart analyze` 0 errors, crasht bij runtime zodra de widget bouwt.
+  De tweede "Available Options" biedt daar alleen *To Data Type* en *No Further
+  Changes*, dus er is langs die weg geen "Is Set"-transform om het te redden.
+**Controleer een nieuwe Visibility-conditie dus altijd in de export op de `!=
+null`**; staat die er niet, dan heb je de verkeerde route genomen. En let op: de
+*Conditions*-sectie in die dialoog rendert zijn twee subopties regelmatig niet
+(hij klapt open met een lege ruimte, en elke vervolgklik klapt 'm weer dicht) —
+lukt dat na een paar pogingen niet, dan is dit een taak voor Bob's eigen browser
+in plaats van een reden om de bovenstaande snelle route te nemen.
 
 **Een widget kan zijn EIGEN Backend-Query-response niet gebruiken in
 zijn eigen Visibility-conditie — wel in zijn Options.** De

+ 50 - 9
TASKS.md

@@ -42,6 +42,11 @@ half af** — node 220276 geeft 404, alleen de dblog-telling staat nog open.
    2026-09-18 op Bob's vraag, zie het uitgeschreven blok verderop. Feature, dus
    geen livegang-blokker; Claude kan dit zelf in de builder doen.
 
+11. **90 · zoekicoon vóór de datumchips op Home (variant A) · Eigenaar: Claude
+   — bezig** — nieuw 2026-09-18 op Bob's vraag (*"ik vind dat zoekveld en die
+   buttons eronder wat onoverzichtelijk"*). Deelt de Row met **P2-45**, zie het
+   blok verderop.
+
 11. **89 · logo boven de gemeentenaam in de gedeelde header** — nieuw
    2026-09-18 (Bob: *"bij groot scherm moet in de header de foto boven de
    plaats"*). Eén ingreep in `HeaderButtonsComponent`, zie het blok hieronder.
@@ -1043,15 +1048,51 @@ telefoon-emulator bekeken (zie screenshots in `~/uk-shots/2026-09-16/na-*.png`).
   herordenen voor Claude onmogelijk (zie `CLAUDE.md`). Drie opties: (a) tabs
   slepen in je eigen browser (Tab én bijbehorende TabBar Page); (b) `TabBar` →
   *Initial Tab Index* op 3, dan opent de pagina op Agenda; (c) zo laten.
-- **P2-43 · `HorecagelegenheidCurrent`: "Bezorgen" kapt af met vier tabs ·
-  Eigenaar: Bob (10 sec).** `TabBar` → Search properties "scroll" → **Tab Bar
-  Scrollable** aan. Export-check: `isScrollable: true`.
-- **P2-44 · `EventCurrent`: datum-icoon zonder datum · Eigenaar: Bob (klein,
-  cosmetisch).** De Visibility-conditie `$[0].datum is set` staat op `TextData`,
-  niet op de nieuwe `Row` eromheen; bij een event zonder datum blijft het
-  kalender-icoon alleen staan. Conditie noteren, op de `Row` zetten
-  (Visibility → Conditional → Set from Variable → API-response → JSON Path
-  `$[0].datum` → Is Set) en van de Text afhalen.
+- **P2-43 · ✅ AF 2026-09-18 (Claude, builder).** `TabBar` op
+  `HorecagelegenheidCurrent` → *Tab Bar Scrollable* aan; verse export toont
+  `isScrollable: true` (regel 479). De vier tabs (Info / Links / Bezorgen /
+  Agenda) scrollen nu horizontaal in plaats van "Bezorgen" af te kappen.
+- **P2-44 · `EventCurrent`: datum-icoon zonder datum · ⚠️ NIET GELUKT, terug naar
+  Bob (Claude 2026-09-18; mijn wijziging is volledig teruggedraaid).** Het
+  probleem staat nog: de conditie `$[0].datum is set` zit op `TextData` en niet
+  op de `Row` eromheen, dus bij een event zonder datum blijft het kalender-icoon
+  alleen staan.
+
+  *Waarom het niet lukte.* De juiste route is Visibility → Conditional →
+  **Conditions → Single Condition** (operator *Is Set*), precies zoals de `Text`
+  eronder 'm al heeft. Die submenu-regel **komt voor Claude niet tevoorschijn**:
+  "Conditions" klapt wel open (er ontstaat een lege ruimte onder de kop) maar
+  rendert zijn opties niet, en elke vervolgklik — ook een blinde klik midden in
+  die ruimte, ook na de hover-truc — klapt 'm weer dicht. Zes pogingen, inclusief
+  breder zoeken (de bekende "één bron rendert niet"-fix, hier zonder effect).
+
+  ⚠️ **De voor de hand liggende omweg maakt het ERGER — niet proberen.** Kies je
+  in diezelfde dialoog de bron **Evenement Response** rechtstreeks (API Response
+  Options *JSON Body* → Available Options *JSON Path* → `$[0].datum`), dan
+  accepteert de builder dat zonder morren en genereert hij:
+  ```dart
+  if (getJsonField(eventCurrentEvenementResponse.jsonBody, r'$[0].datum'))
+  ```
+  — een `dynamic` als `bool`, **zonder `!= null`**. Dat compileert, `dart analyze`
+  geeft 0 errors, en de pagina crasht bij runtime. De tweede "Available Options"
+  biedt daar alleen *To Data Type* en *No Further Changes*, dus er is via die
+  route geen "Is Set"-transform om het mee te redden. Teruggedraaid; een verse
+  export is **byte-identiek** aan de staat van vóór de wijziging en de bestaande
+  `!= null`-guard op de `Text` staat er nog gewoon.
+
+  **Voor Bob (eigen browser, ±1 min):** `EventCurrent` → widget tree → de
+  **tweede `Row`** (kinderen `Icon` + `TextData`; het is de enige Row met een
+  kalender-icoon) → Visibility → Conditional aan → **Conditions → Single
+  Condition** → First Value = *Evenement Response* → JSON Path `$[0].datum` →
+  operator **Is Set** → Confirm. Daarna op `TextData` de Conditional uit (dubbel).
+  Export-check: het `if (... != null)` moet vóór `Row(` staan, niet erbinnen.
+- **⚠️ P2-45 en taak 90 delen dezelfde Row.** Taak 90 zet een zoekicoon links
+  van de chips, P2-45 een datumknop rechts. Samen is dat 4 chips (~345 dp op
+  411 dp) + 2 icoonknoppen (~80 dp) = te breed; de chips wrappen dan naar een
+  tweede regel en de winst van taak 90 is weg. Er ligt dus een keuze voor Bob:
+  chiplabels inkorten ("Weekend" i.p.v. "Dit weekend"), of een chip laten
+  vervallen zodra de datumprikker er is. Bouw de Row één keer, voor beide.
+
 - **P2-45 · Home: knop "Selecteer datum" naast de datumchips · Eigenaar: Claude
   (builder + custom code), ontwerpbesluit bij Bob.** Vraag Bob 2026-09-18: *"Kan
   bij die choicechips ook een button, selecteer datum?"* Ja — en het past op de