Jelajahi Sumber

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 jam lalu
induk
melakukan
5cf69c3f1b
2 mengubah file dengan 78 tambahan dan 3 penghapusan
  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
 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
 `display_id` overrulebaar te maken) — werkend recept, 2026-09-06.**
 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.
 **Fix (klein):** getter `$[0].organisator` op `EvenementCall` → parameter op
 `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"):**
 - `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".
 **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).
 - `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".
 - 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.
 
+### ✅ 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
 
 #