Explorar o código

TASKS.md: P1-24 volledig gesloten (widget 1 klaar + widget 2 Bob's besluit + hersteld); P1-7 op — bezig (sessie 43, gemeente-snelkeuzelijst)

bob hai 3 semanas
pai
achega
7279f7eba8
Modificáronse 1 ficheiros con 78 adicións e 66 borrados
  1. 78 66
      TASKS.md

+ 78 - 66
TASKS.md

@@ -1010,60 +1010,52 @@ losse P1-taak; de resterende mysterie-crash staat nu apart als
   `launchURL()` aan met de kale placeholder-string als URL (geen geldig
   schema/host → crash).
 
-**P1-24 · Eigenaar: Bob — laatste restpunt geblokkeerd op een echte
-FlutterFlow-operatorbeperking (zie hieronder), niet Claude-oplosbaar.**
-**Root cause:** content-item **nid 214339** heeft een daadwerkelijk
-**leeg `logo`-veld** in Drupal en verschijnt in meerdere Home-secties —
-raakte 2 widgets met een `CachedNetworkImage`/`Image.network` zonder
-(voldoende) leeg-string-guard.
-- *(`p_uitgaan_slider_kaart_component_widget.dart`'s `Image.network`
-  — **afgerond 2026-08-21, sessie 43, Claude, builder + verse export
-  bevestigd:** Wrap Widget → ConditionalBuilder, IF `logo != ''`
-  (Single Condition, First Value = rauwe `logo`-component-parameter,
-  operator "Not Equal To", Second Value = **letterlijke lege string**
-  — zie de nieuwe `CLAUDE.md`-notitie over hoe je dat literal-tekstveld
-  bereikt, dat bleek eerder onterecht "onmogelijk" gedocumenteerd voor
-  Json-typed bindingen maar werkt gewoon voor een String/Image-Path-
-  component-parameter). THEN = bestaande Image, ELSE = Icon
-  `image_not_supported`. Bevestigd via verse export:
-  `if (widget!.logo != '') { Image.network(widget!.logo!, ...) } else
-  { Icon(Icons.image_not_supported, ...) }` in
-  `p_uitgaan_slider_kaart_component_widget.dart:144-165`.)*
-- **`home_uitgaantabel_kaart_component_widget.dart`'s guard (regel
-  ~244-248) blijft open** — deze First Value is gebonden via **JSON
-  Path** (`$.logo`, type "Json"), en dat type biedt geen "Is Set and
-  Not Empty"-operator **en** geen letterlijke-tekst-Second-Value (de
-  literal-Value-truc hierboven werkt alleen bij een directe String/
-  Image-Path-parameter, niet bij een Json-Path-binding op een raw
-  loop-item — bevestigd, zie de uitgebreide poging-documentatie
-  hieronder). [HomeUitgaantabelKaartComponent](https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=widgetTree&component=HomeUitgaantabelKaartComponent) →
-  `ConditionalBuilder` (in Stack, boven `Wrap`/`tagCategorieCompo...`)
-  → IF-pill "`$.logo is set`" ombuigen naar "ook niet-leeg" — Bob kan
-  dit proberen in zijn eigen browser (mogelijk zonder de
-  clipping/freeze-problemen die Claude tegenkwam), of contact met
-  FlutterFlow-support over deze operator-beperking op Json-typed
-  bindingen. **Impact lager dan gedacht:** geen harde crash — Flutter's
-  Image Resource Service vangt de exceptie zelf op en toont een
-  fallback-icoon (zwart grijns-icoon op de "OOK LEUK"-kaart) i.p.v. de
-  app te laten crashen. Wel een echte visuele bug + een burst van
-  ~40-65 "Failed to decode image"-regels in logcat per page-load (zie
-  de kanttekening bij P1-25 hieronder).
-
-**⚠️ Uitgebreide poging-documentatie (2026-08-21, sessie 42, ~45 min,
-alleen op `home_uitgaantabel_kaart_component_widget.dart`).** Het
-probleem: First Value gebonden via **JSON Path** (`$.logo`, type
-"Json") — voor dat type biedt de Single-Condition-operator-lijst alleen
-`Equal To`/`Not Equal To`/`Is Set`/`Is Not Set`, **geen**
-"Is Set and Not Empty". Geprobeerd en allemaal doodgelopen:
+*(P1-24 volledig afgesloten. **Widget 1**
+(`p_uitgaan_slider_kaart_component_widget.dart`'s ongeguarde
+`Image.network`) — afgerond 2026-08-21, sessie 43, Claude, builder +
+verse export bevestigd: ConditionalBuilder, IF `logo != ''` (Single
+Condition, First Value = rauwe `logo`-component-parameter, operator
+"Not Equal To", Second Value = **letterlijke lege string** — zie de
+`CLAUDE.md`-notitie over hoe je dat literal-tekstveld bereikt op een
+String/Image-Path-parameter). THEN = bestaande Image, ELSE = Icon
+`image_not_supported`. **Widget 2**
+(`home_uitgaantabel_kaart_component_widget.dart`'s JSON-Path-guard,
+type "Json", biedt geen "Is Set and Not Empty"-operator en geen
+literal-Second-Value — zie de uitgebreide, hieronder gearchiveerde
+poging-documentatie voor het volledige waarom) — **Bob's besluit
+(sessie 44, 2026-08-21): geaccepteerd zoals-ie is, geen verdere actie**
+(`logo` is in Drupal een verplicht veld, kan in de praktijk niet leeg
+zijn; en zelfs als dat toch gebeurt vangt Flutter's Image Resource
+Service de exceptie zelf op — een fallback-icoon, geen app-crash, geen
+harde noodzaak). **Bijvangst sessie 43 (2e blok, zelfde dag):** buiten
+deze sessie om (vermoedelijk een losse builder-poging door Bob, niet
+gecommit) was de werkende `!= null`-conditie op widget 2 op enig moment
+gewijzigd naar een kale `if (getJsonField(...))` zonder vergelijking —
+compileert (dynamic omzeilt de statische check) maar **crasht bij
+runtime** (`type String is not a subtype of type bool`) zodra `$.logo`
+een string is, dus bij vrijwel elk event mét logo. Gevonden bij een
+routine-export-check, gemeld, en op Bob's akkoord teruggezet naar de
+werkende `Is Set`-conditie (Single Condition, First Value = JSON Path
+`$.logo`, operator "Is Set" — genereert weer `!= null`). Bevestigd via
+verse export + `flutter analyze` (0 errors). Uit deze lijst
+verwijderd.)*
+
+*(⚠️ Gearchiveerde poging-documentatie (2026-08-21, sessie 42, ~45 min,
+op widget 2) — bewaard voor het geval een toekomstige FlutterFlow-
+update deze operator-beperking oplost. Het probleem: First Value
+gebonden via **JSON Path** (`$.logo`, type "Json") — voor dat type
+biedt de Single-Condition-operator-lijst alleen `Equal To`/`Not Equal
+To`/`Is Set`/`Is Not Set`, **geen** "Is Set and Not Empty". Geprobeerd
+en allemaal doodgelopen:
 - Een 2e conditie toevoegen (AND, `$.logo != ''`) — de First Value liet
   zich wel op `$.logo` binden, maar de Second Value-picker bood **op
   dat moment** geen manier om een letterlijke lege string in te vullen
   (alleen een variabele-bronkiezer, geen "literal"-optie zichtbaar).
   **Correctie 2026-08-21 sessie 43:** dit bleek specifiek voor Json-
   typed First Values te gelden — bij een directe String/Image-Path-
-  component-parameter (zie `PUitgaanSliderKaartComponent` hierboven)
-  bestaat er wél een literal-tekstveld, alleen verstopt achter een
-  paar extra kliks (zie de nieuwe `CLAUDE.md`-notitie).
+  component-parameter (zie widget 1 hierboven) bestaat er wél een
+  literal-tekstveld, alleen verstopt achter een paar extra kliks (zie
+  de `CLAUDE.md`-notitie).
 - First Value omzetten naar **String** via "Predefined Path" i.p.v.
   "JSON Path" — `evenementenItem` heeft geen gekoppeld Custom Data
   Type/schema (raw JSON-loop-item via Generate Dynamic Children), dus
@@ -1074,7 +1066,7 @@ probleem: First Value gebonden via **JSON Path** (`$.logo`, type
 - Onderweg 2x per ongeluk een 2e conditie laten hangen/de pagina laten
   herladen na een vastgelopen geneste "Set Variable"-dialoog — **geen
   schade**, elke keer teruggezet naar de oorspronkelijke werkende
-  conditie.
+  conditie.)*
 
 *(P1-25 afgerond 2026-08-21, sessie 43 — Claude, code-audit + builder,
 bevestigd via verse export. Root cause gevonden zonder live emulator
@@ -1211,11 +1203,14 @@ widget-canvas-rechterpaneel). **Niet aanraken:** de "Translate All"/
 "Translate Page"-knoppen (betaalde Growth/Business-upgrade) en de 7
 gekoppelde sleutels hierboven (apart traject).
 
-**P1-7 · Eigenaar: Onbepaald.** "Favorieten pagina maken" (Bob's naam
-voor deze taak, 2026-08-13 — was P0-4, samengevoegd met het oude P1-7
-favorieten/profielscherm-werk + P2-8 gemeente-favoriet). Bob bouwt de
-Drupal-kant (views/endpoints) zelf, apart; Claude/deze sessie kan de
-lokale/UI-kant + look&feel oppakken zolang die niet op Drupal wacht.
+**P1-7 · Eigenaar: Claude — bezig (sessie 43, 2e blok, snelkeuzelijst
+favoriete gemeenten op de select-provincie/gemeente-pagina, zie
+"Nog open" onderaan voor scope/status).** "Favorieten pagina maken"
+(Bob's naam voor deze taak, 2026-08-13 — was P0-4, samengevoegd met het
+oude P1-7 favorieten/profielscherm-werk + P2-8 gemeente-favoriet). Bob
+bouwt de Drupal-kant (views/endpoints) zelf, apart; Claude/deze sessie
+kan de lokale/UI-kant + look&feel oppakken zolang die niet op Drupal
+wacht.
 
 **Al afgerond (2026-08-13, geverifieerd via verse export):**
 - App State-velden `favorieteGemeenteIds` en `favorieteHorecaNids`
@@ -1282,18 +1277,35 @@ verse export: beide `drupalRequest`-aanroepen in
 `favorieten_widget.dart` (regel 44 en 253) staan nu op `'GET'`.)*
 
 **Nog open:**
-- **Tab 2 "Favoriete gemeenten" — hartje-toggle afgerond via P1-26**
-  (Optie 1 hieronder, zie P1-26 voor de volledige implementatie: hartje
-  op `HeaderButtonsComponent` naast de gemeente-/provincienaam,
-  server-side gesynchroniseerd via de nieuwe `favorieten`-resource).
-  **Nog niet bevestigd of dit de hele Tab 2-scope dekt:** de tab zelf
-  (`favorieten_widget.dart`) toont nog steeds alleen de kale
-  beschrijvingstekst, geen daadwerkelijke lijst van
-  `favorieteGemeenteIds`-namen — check bij Bob of Optie 1 (hartje bij
-  de huidige keuze) bewust de hele feature is, of dat er alsnog een
-  lijstweergave op Tab 2 gewenst is (zou `gemeenteNaamById` + een
-  `List.generate` over `favorieteGemeenteIds` gebruiken, geen nieuwe
-  Drupal-afhankelijkheid).
+- **Snelkeuzelijst favoriete gemeenten — in aanbouw, sessie 43 (2e
+  blok, na Bob's antwoord op de scope-vraag hierboven).** Bob wil dit
+  **niet** op Favorieten-Tab 2 zelf, maar op de
+  "Select gemeente/provincie"-pagina
+  (`lib/selecteer_plaats/selectprovinciegemeente/`, component
+  `SelectStateDropDownComponent`): meteen bij binnenkomst je favoriete
+  gemeenten als snelkeuze zien, i.p.v. eerst provincie én gemeente los
+  te moeten kiezen. **Bob's keuzes (bevestigd in de chat):** tik op een
+  favoriet = **direct naar Home** met die gemeente actief gekozen (niet
+  alleen de dropdowns invullen); lijst komt **onderaan**, ná de
+  dropdowns/"Toepassen"-knop (niet bovenaan). **Technische aanpak:**
+  `favorieteGemeenteIds` bevat alleen ID's, geen namen/provincie — er
+  is geen "alle gemeenten van heel NL in 1 call"-Drupal-endpoint, dus
+  namen resolven vraagt een loop over alle provincies. **Nieuwe custom
+  action `getFavorieteGemeenten(List<String>? favorieteGemeenteIds) ->
+  List<GemeenteModelStruct>`** (`lib/custom_code/actions/
+  get_favoriete_gemeenten.dart`, afgerond + gecommit `c6c3439`): haalt
+  `ProvinciesCall`, loopt alle provincies langs met `GemeentenCall`, en
+  verzamelt de gemeenten waarvan `gemeenteid` in `favorieteGemeenteIds`
+  voorkomt. Bevestigd via verse export + `flutter analyze` (0 errors).
+  **Nog te doen:** in de builder op `SelectStateDropDownComponent` een
+  Local Component State Variable toevoegen (`List<GemeenteModel>`) +
+  "On Page Load"/na provincielijst-fetch de custom action aanroepen en
+  het resultaat daarin zetten, dan onderaan (na de "Toepassen"-knop)
+  een Wrap/ListView met "Generate Dynamic Children" over die variabele
+  (chips met gemeentenaam), en per chip een tik-actie die
+  `gemeenteSelectId`/`gemeenteSelectNaam` (en `provincieSelectId`/
+  `provincieSelectName`, voor consistentie met de bestaande
+  dropdown-flow) zet en naar Home navigeert.
 - **Tab 1 "Persoonlijke agenda" — bleek al gebouwd (niet door deze
   lijst gedekt, `TASKS.md` liep achter), en kreeg 2026-08-17 avond
   2 bugfixes (Claude, builder, bevestigd via verse export +