|
|
@@ -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 +
|