Просмотр исходного кода

P2-46/99: organisator getoond op EventCurrent + builderlessen

- EvenementCall: JSON path $[0].organisator -> getter eventOrganisator (String)
- EvenementInfo: parameter organisator + TextOrganisator met is-set-guard
- EventCurrent: binding gelegd; export en toestel (profile, emulator-5554)
  geverifieerd op nid 214439 (toont) en 214689 (verborgen, geen "null")
- TASKS.md: resultaat + restpunten (i18n-label, ongebruikte organisatorTekst,
  voorloopkomma in adresregel) en de data-bevinding (2 van 10.000 records)
- CLAUDE.md: null-in-testrespons -> type Anything -> stille ".toString()",
  en de "+ Add JSON Path"-truc om bij de onderste rijen te komen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 10 часов назад
Родитель
Сommit
5cf69c3f1b
2 измененных файлов с 78 добавлено и 3 удалено
  1. 30 0
      CLAUDE.md
  2. 48 3
      TASKS.md

+ 30 - 0
CLAUDE.md

@@ -2624,6 +2624,36 @@ elke component-parameter `x`
 `grep -n "widget!\.x" <component>_widget.dart` — komt hij alleen in de
 `grep -n "widget!\.x" <component>_widget.dart` — komt hij alleen in de
 declaratie voor, dan wordt hij weggegooid.
 declaratie voor, dan wordt hij weggegooid.
 
 
+**⚠️ Een JSON Path waarvan de TESTRESPONS `null` is, krijgt type "Anything" — en dat
+levert stil een letterlijke tekst "null" op in de UI.** Bevestigd 2026-09-19
+(`$[0].organisator` op `EvenementCall`). De keten: het veld is `null` in de testrespons →
+FlutterFlow kan het type niet afleiden → de rij blijft **Anything** (de handmatige
+Data-Type-dropdown verschijnt dan niet, er staat alleen *"Click Test API Call to infer
+type"*) → de getter wordt `static dynamic x(...)` → en elke binding aan een **String**
+krijgt er `.toString()` achter geplakt. Bij een leeg veld toont het widget dan
+`Organisator: null`, en je Visibility-guard (`!= null && != ''`) ziet dat niet, want het
+ís een niet-lege string.
+- **Fix, en veel simpeler dan hij lijkt: zet de testvariabele op een record waar het veld
+  wél gevuld is en draai "Test API Call" opnieuw.** Het type springt vanzelf op String,
+  de getter wordt `castToType<String>(...)` en de `.toString()` verdwijnt uit de
+  bestaande binding — die hoef je dus niet opnieuw te leggen. Laat die testwaarde daarna
+  staan, anders keert het probleem terug bij de volgende test.
+- **Wat NIET werkt:** het pad tijdelijk naar een gevuld veld wijzen, daar String kiezen en
+  het pad terugzetten — FlutterFlow leidt het type bij élke padwijziging opnieuw af en
+  zet 'm dan weer op Anything. Ook `Is List` blijft bij zo'n omweg aan staan, wat een
+  `List?`-getter oplevert; controleer dat in de export.
+- **Herkennen in een verse export:** `grep -n "toString()," <pagina>_widget.dart` naast de
+  componentparameters. Een gezonde String-binding staat er kaal (`adres: EvenementCall.eventAdres(...)`).
+
+**De JSON-Paths-lijst in "Response & Test" scrollt niet met het muiswiel — klik
+"+ Add JSON Path" om bij de onderste rijen te komen.** De lijst heeft een vaste hoogte en
+klipt na ~11 rijen; muiswiel, scrollbar slepen en het inklappen van *Recommended* helpen
+geen van alle. Eén klik op **+ Add JSON Path** scrollt de lijst naar beneden (de nieuwe
+lege rij komt in beeld, en daarmee ook de laatste echte rijen). Handel daar je rij af en
+haal de lege rij daarna weg met zijn prullenbak-icoon ("Remove this JSON Path?" → Yes) —
+laat 'm nooit staan, een naamloze `$`-rij is vragen om exportproblemen. Vergeet daarna de
+**Save** onderaan niet (reken op twee klikken; de eerste landt vaak niet).
+
 **Een API Call een extra query-variabele geven (bv. om een hardcoded
 **Een API Call een extra query-variabele geven (bv. om een hardcoded
 `display_id` overrulebaar te maken) — werkend recept, 2026-09-06.**
 `display_id` overrulebaar te maken) — werkend recept, 2026-09-06.**
 API Calls-paneel (⌘+K → "api" → "Tabs: API Calls") → call kiezen →
 API Calls-paneel (⌘+K → "api" → "Tabs: API Calls") → call kiezen →

+ 48 - 3
TASKS.md

@@ -72,7 +72,9 @@ geen weergave. Het veld komt in de hele levende code alleen voor in
 "Stadsactiviteit aanmaken" dus een organisator in die daarna onzichtbaar is.
 "Stadsactiviteit aanmaken" dus een organisator in die daarna onzichtbaar is.
 **Fix (klein):** getter `$[0].organisator` op `EvenementCall` → parameter op
 **Fix (klein):** getter `$[0].organisator` op `EvenementCall` → parameter op
 `EvenementInfo` → een `Text` met een **Is Set**-conditie (bij een evenement is het
 `EvenementInfo` → een `Text` met een **Is Set**-conditie (bij een evenement is het
-veld leeg). *Nog niet uitgevoerd — wacht op Bob's besluit.*
+veld leeg). ✅ **Uitgevoerd 2026-09-19 na Bob's akkoord — zie het blok "99 / P2-46-deel ·
+`organisator` op `EventCurrent` — AF" verderop. Dit deel van taak 99 is daarmee dicht;
+alleen de kanttekening over `categorie`/`activity_category` hieronder staat nog open.**
 
 
 **Twee dingen die verdacht lijken maar in orde zijn (niet "fixen"):**
 **Twee dingen die verdacht lijken maar in orde zijn (niet "fixen"):**
 - `EvenementCall.eventLogog` en `eventWebsiteg` dragen nog de oude `g`-suffix van
 - `EvenementCall.eventLogog` en `eventWebsiteg` dragen nog de oude `g`-suffix van
@@ -1019,16 +1021,59 @@ op de Home-tabs), en de horeca-sortering (alfabetisch, live).
 ---
 ---
 
 
 
 
-### P2-46 · EventCurrent: restpunten na de ombouw van 2026-09-19 · Eigenaar: Claude — bezig
+### P2-46 · EventCurrent: restpunten na de ombouw van 2026-09-19 · Eigenaar: Claude
 **Gedaan (export- en toestel-geverifieerd, profile-build op emulator-5554):** backups `EventCurrentCopy`, `EvenementHorecagelegenheidCopy`, `EvenementInfoCopy`; event-kaart met logo 96×96 links en `EvenementInfo` (Expanded) + Maps-knop rechts; de 500 px-Container weg; `EvenementHorecagelegenheid` zonder tabs: `RowLogo` (logo 96×96 + `ColumnRechts`: titel, labels, adres/plaats, telefoon, e-mail), links in een `Wrap` (Menukaart/Website/Facebook/Instagram/X/"Op Uitgaanskrant.com" met host ervoor), `TextInhoud` (zaakbeschrijving), foto's, `ColumnOpening` en `ColumnBezorgen` met Visibility op `openingstijden`/`bezorgtijden`; e-mail leest nu `$[:]['e-mail']`; drie `phone: false`-vlaggen weg; telefoon-guard zonder `valueOrDefault`; Entree-blok alleen bij `entreeprijs`; roze/rode vulkleuren van Entree/Contact weg; EN-vertalingen "Opening hours"/"On Uitgaanskrant.com".
 **Gedaan (export- en toestel-geverifieerd, profile-build op emulator-5554):** backups `EventCurrentCopy`, `EvenementHorecagelegenheidCopy`, `EvenementInfoCopy`; event-kaart met logo 96×96 links en `EvenementInfo` (Expanded) + Maps-knop rechts; de 500 px-Container weg; `EvenementHorecagelegenheid` zonder tabs: `RowLogo` (logo 96×96 + `ColumnRechts`: titel, labels, adres/plaats, telefoon, e-mail), links in een `Wrap` (Menukaart/Website/Facebook/Instagram/X/"Op Uitgaanskrant.com" met host ervoor), `TextInhoud` (zaakbeschrijving), foto's, `ColumnOpening` en `ColumnBezorgen` met Visibility op `openingstijden`/`bezorgtijden`; e-mail leest nu `$[:]['e-mail']`; drie `phone: false`-vlaggen weg; telefoon-guard zonder `valueOrDefault`; Entree-blok alleen bij `entreeprijs`; roze/rode vulkleuren van Entree/Contact weg; EN-vertalingen "Opening hours"/"On Uitgaanskrant.com".
 **Nog te doen:**
 **Nog te doen:**
 - Verse profile-build op het toestel voor de láátste ronde (TextInhoud, Menukaart in de Wrap, adres-Row `[Icon, TextAdres, TextPlaats]` met spacing 6): route `uitgaanskrant://uitgaanskrant.com/eventCurrent?nid=214689&horecaid=50013` (A la Ferme, heeft openingstijden) en `horecaid=67233` (Carré, alles leeg).
 - Verse profile-build op het toestel voor de láátste ronde (TextInhoud, Menukaart in de Wrap, adres-Row `[Icon, TextAdres, TextPlaats]` met spacing 6): route `uitgaanskrant://uitgaanskrant.com/eventCurrent?nid=214689&horecaid=50013` (A la Ferme, heeft openingstijden) en `horecaid=67233` (Carré, alles leeg).
 - `ColumnBezorgen` is alleen in de "verborgen"-tak getest; geen Amsterdamse zaak met `bezorgtijden` gevonden op de eerste 40 van Eetgelegenheden. Zoek er een (`bezorgtijden`/`bestellink` niet null) en bekijk de sectie.
 - `ColumnBezorgen` is alleen in de "verborgen"-tak getest; geen Amsterdamse zaak met `bezorgtijden` gevonden op de eerste 40 van Eetgelegenheden. Zoek er een (`bezorgtijden`/`bestellink` niet null) en bekijk de sectie.
 - `TextInhoud` staat onderaan `ColumnInfo` (na het Contact-blok), Body Medium, zonder Max Lines — overweeg padding-top 8 en een kop "Over deze zaak".
 - `TextInhoud` staat onderaan `ColumnInfo` (na het Contact-blok), Body Medium, zonder Max Lines — overweeg padding-top 8 en een kop "Over deze zaak".
 - EN-vertaling van de nieuwe literal "Menukaart" (`22xoyrqe`) controleren in `internationalization.dart`.
 - EN-vertaling van de nieuwe literal "Menukaart" (`22xoyrqe`) controleren in `internationalization.dart`.
-- Niet getoond: `kvk` (zaak), `organisator` (event, vrijwel altijd leeg). Bewust overgeslagen.
+- Niet getoond: `kvk` (zaak). Bewust overgeslagen.
+- ✅ **`organisator` wordt nu wél getoond (2026-09-19, Bob's besluit, af en op toestel geverifieerd).**
+  Zie het eigen blok hieronder; taak 99 kan hiermee dicht.
 - Bob: de drie backup-kopieën (`EventCurrentCopy`, `EvenementHorecagelegenheidCopy`, `EvenementInfoCopy`) op de P2-7-opruimlijst zetten zodra de nieuwe pagina goedgekeurd is. Claude verwijdert niets.
 - Bob: de drie backup-kopieën (`EventCurrentCopy`, `EvenementHorecagelegenheidCopy`, `EvenementInfoCopy`) op de P2-7-opruimlijst zetten zodra de nieuwe pagina goedgekeurd is. Claude verwijdert niets.
 
 
+### ✅ 99 / P2-46-deel · `organisator` op `EventCurrent` — AF 2026-09-19 (Claude)
+
+Bob: "organisator wil ik wel getoond hebben bij activiteiten." Gebouwd, geëxporteerd
+en op `emulator-5554` (profile) in beide richtingen gecontroleerd.
+
+**Wat er nu staat:**
+- `EvenementCall` heeft een JSON-path `$[0].organisator` → getter **`eventOrganisator`**,
+  type **String** (`castToType<String>`, dus géén `.toString()` — zie de valkuil hieronder).
+- `EvenementInfo` heeft een 13e parameter **`organisator`** (String, niet verplicht) en
+  onderaan zijn Column een `Text` **`TextOrganisator`**: Combine Text `Organisator: ` +
+  parameter, Body Medium, Visibility *is set and not empty*.
+- `EventCurrent` bindt die parameter aan `EvenementCall.eventOrganisator(...)`.
+- Export: `if (widget!.organisator != null && widget!.organisator != '') Text('Organisator: ${widget!.organisator}', …)`.
+  `dart analyze` op een verse export: **0 errors**.
+- Toestel: activiteit **nid 214439** toont *"Organisator: Het Team van Klein Frankrijk"*;
+  evenement **nid 214689** toont de regel niet (en géén letterlijke "null").
+
+**Data-bevinding die je moet kennen vóór je dit test:** `organisator` is op productie
+**bijna nooit gevuld** — 2 treffers op 10.000 gescande records van
+`flutterflow_events.json` (services_1), en op devbob 0 van 750. De enige twee zijn
+**214439** (Brocante Markt Klein Frankrijk, Alblasserdam) en **214418** (Zonta Filmavond,
+Deventer); allebei activiteiten zonder `horecagelegenheidnid`. Gebruik die twee als
+testnode, anders lijkt het of de regel niet werkt. Het veld zelf is dus gewoon goed
+gekoppeld in de view — het wordt alleen zelden ingevuld.
+
+**Twee restpunten (klein, niet blokkerend):**
+1. De literal `Organisator: ` zit **in een Combine Text** en krijgt daardoor géén
+   i18n-sleutel — hij is dus niet vertaalbaar en duikt niet op in het Languages-paneel.
+   Wil je 'm wél in het Engels: het label als eigen `Text` naast de waarde zetten
+   (zoals "Entree:" met sleutel `gpbaiwi9` al doet). Hoort bij P1-17.
+2. Bob: de custom function **`organisatorTekst`** (Custom Code → Custom Functions) heb ik
+   gemaakt als vangnet tegen de `.toString()`-val hieronder, maar is **niet meer nodig en
+   wordt nergens aangeroepen** — mag weg. Claude verwijdert niets, dus hij staat er nog.
+   Ook aangepast: de testwaarde van de variabele `nid` op de API-call `Evenement` staat nu
+   op **214439** i.p.v. 206292; dat is bewust (zie de valkuil) — laat 'm zo staan.
+
+**Bijvangst, los van deze taak:** op een activiteit **zonder straat** toont de adresregel
+`, Alblasserdam` — met een voorloopkomma. Dat komt uit de Combine Text van de adres-Row in
+`EvenementInfo` (`'${widget!.adres}, ${widget!.plaats}'`) en raakt elke node met een lege
+`adres`. Nog niet gefixt.
+
 ## 🗄 Drupal / views — open
 ## 🗄 Drupal / views — open
 
 
 #
 #