Explorar o código

Taak 74 af: horeca-agenda van GridView naar StaggeredView (1/1/2/3)

- Replace naar StaggeredView; childAspectRatio 3.0 is daarmee weg, dat was de
  oorzaak van de 63 dp cellen en de overlappende items. crossAxisCount is nu
  een Responsive Value 1/1/2/3, geen lege tak (return 0).
- Op een toestel geverifieerd (profile-APK, 411 dp, Bitterzoet), dart analyze 0.
- Taak 75 blijkt NIET in de builder oplosbaar: het Generate Dynamic Children-
  paneel biedt alleen "To Data Type"/"No Further Changes", geen Is List. En de
  vlag zou het maar half oplossen (bij een ontbrekend veld geeft getJsonField
  alsnog null). Nette fix hoort in de view: [] i.p.v. null. Naar Bob.
- Nieuw gezien na de fix (taak 76): geen linkerpadding op de agendakaart, en
  rauwe <p>-tags in `inhoud` van establishment_events (P2-27b-patroon).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob hai 12 horas
pai
achega
fd037546be
Modificáronse 1 ficheiros con 62 adicións e 50 borrados
  1. 62 50
      TASKS.md

+ 62 - 50
TASKS.md

@@ -100,56 +100,68 @@ de website-homepage; `/nl/user/register` is anoniem bereikbaar (200).
   `https://uitgaanskrant.com/nl/support/mobieleapp` laten wijzen (sectie "Je
   account verwijderen"). (a) is netter, (b) is 1 minuut.
 
-- **74 · P1-62 · De evenementen-agenda op een horecapagina is op een telefoon
-  onleesbaar: de items lopen over elkaar heen. Eigenaar: Claude — bezig
-  (sessie 2026-09-17, akkoord Bob; pakt taak 75 in dezelfde ronde mee, zelfde
-  component) — gevonden 2026-09-16 laat (Claude, profile-build op
-  emulator-5556, 411 dp).** Screenshot:
-  `~/uk-shots/2026-09-16/bug-horeca-agenda-gridview.png` (zaak Bitterzoet,
-  Info-tab).
-  **Oorzaak, hard:** `horecagelegenheid_event_tabel_component_copy_widget.dart`
-  r.172-178 is een `GridView.builder` met **`crossAxisCount: 2`** en
-  **`childAspectRatio: 3.0`**. De celhoogte volgt daarmee de celbreedte:
-
-  | scherm | cel | hoogte |
-  |---|---|---|
-  | telefoon 411 dp | 188 dp breed | **63 dp** |
-  | tablet staand 800 dp | 383 dp | 128 dp |
-  | tablet liggend 1280 dp | 623 dp | 208 dp |
-
-  De inhoud van zo'n cel (afbeelding van 60 dp + titel over meerdere regels +
-  datum + categorielabels) heeft er ~180 nodig. Op een telefoon tekent elke kaart
-  dus ver buiten zijn cel en over de volgende rij heen. Op een tablet valt het
-  mee — daarom is het nooit opgevallen.
-  ⚠️ **En het meldt zichzelf niet:** géén gele overflow-streep, niets in
-  `dart analyze`, niets in `logcat`. Een `GridView`-cel klipt niet, dus Flutter
-  ziet geen fout. Alleen een screenshot op telefoonformaat laat het zien.
-  **Recept (staat al in `CLAUDE.md`):** `GridView` → **StaggeredView**, met
-  `Cross Axis Count` als Responsive Value **1/1/2/3**. Een StaggeredView geeft
-  elk kind zijn eigen hoogte en kent `childAspectRatio` niet eens — precies
-  waarom Home en het horeca-overzicht die al gebruiken. Let op het
-  pagination-recept in `CLAUDE.md` als er Infinite Scroll op zit (hier niet: het
-  is een gewone `GridView.builder` op een `FutureBuilder`).
-  ⚠️ **Niet zomaar oppakken:** dit component hangt aan `HorecagelegenheidCurrent`,
-  en daar zit P2-35 al op een andere sessie. Stem af wie 'm doet.
-  *Niet nieuw:* de instelling staat er al sinds vóór `bfeb0db`, dus dit is geen
-  regressie van de look&feel-ronde van 16 sep.
-
-- **75 · Drie events per 92 hebben `categorie: null` — de agenda-code rekent
-  daar niet op. Eigenaar: Claude — bezig (sessie 2026-09-17, samen met 74).** Gevonden bij dezelfde controle:
-  `flutterflowmobiel_establishment_events` gaf op 92 events van 120 Amsterdamse
-  zaken **3× `"categorie": null`** (alle drie bij horecanid 75457,
-  Natuurtheater Zeddam). Dezelfde regel als hierboven doet
-  `getJsonField(evenementenItem, r'$.categorie').toList()` **zonder** de
-  lijst-forcering, en `.toList()` op `null` gooit een `NoSuchMethodError`. In een
-  profile-build is dat een stil grijs vlak op die plek.
-  **Fix:** in de builder bij *Generate Dynamic Children* het derde argument
-  (Is List) aanzetten, zodat de export `getJsonField(..., true)` genereert —
-  precies zoals `mijn_profiel`, `p_uitgaan_slider_component` en `thuisBezorgen`
-  het al doen voor hetzelfde veld. Meeliften op taak 74, zelfde component.
-  *Ter info:* dezelfde constructie op `home_uitgaantabel_kaart_component`
-  r.664 is wél veilig — daar is `$.categorie` op alle zeven Home-displays
-  gemeten en altijd een lijst.
+- **74 · P1-62 · ✅ AF 2026-09-17 (Claude, builder + verse export, akkoord Bob).**
+  De evenementen-agenda op een horecapagina liep op een telefoon over elkaar heen.
+  **Opgelost:** de `GridView` is via *Replace Widget* een **StaggeredView**
+  geworden, met `Cross Axis Count` als **Responsive Value 1/1/2/3**. Export:
+  `MasonryGridView.builder` met `crossAxisCount` als functie die 1/1/2/3
+  teruggeeft, **geen `childAspectRatio` meer** (die bestaat niet op een
+  StaggeredView — dat was de hele oorzaak) en **geen `return 0;`** in een tak.
+  `shrinkWrap` is er bij de Replace vanzelf afgegaan, wat hier klopt: het
+  component hangt op de pagina in een `Expanded`, dus het heeft een begrensde
+  hoogte en scrollt voortaan zelf.
+  *Waarom dit de goede vorm is:* een StaggeredView geeft elk kind zijn eigen
+  hoogte, dus een kaart met een lange titel duwt niet meer over de buur heen.
+  Dezelfde vorm draait al op Home en het horeca-overzicht.
+  ⚠️ **Tijdens dit werk is het component door iemand anders hernoemd** van
+  `HorecagelegenheidEventTabelComponentCopy` naar `...Current`. De export heeft
+  alleen de nieuwe map, dus geen `ambiguous_import`; controleer wel of de oude
+  map `lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy/`
+  nog in de projectmap/git staat (hoort bij de opruimronde, Claude gooit niets weg).
+  **Op een toestel nagekeken** (profile-APK, telefoon-emulator 411 dp, zaak
+  Bitterzoet): `~/uk-shots/2026-09-16/na-horeca-agenda-staggered.png` naast de
+  oude situatie in `bug-horeca-agenda-gridview.png`. De items staan nu onder
+  elkaar, titel en datum zijn volledig leesbaar. `dart analyze`: 0 errors.
+  *Terzijde:* de events hebben inmiddels een eigen **Agenda**-tab gekregen (werk
+  van een andere sessie) — de Info-tab is daardoor ook rustig geworden.
+
+- **76 · Twee restpunten die pas zichtbaar werden ná taak 74. Eigenaar:
+  onbepaald, allebei klein.**
+  1. **De agenda-tekst raakt de linker schermrand** — de kaart heeft geen
+     linkerpadding, waardoor "Bubble House – Special Dance Edition" op x=0
+     begint. Op de kaarten elders in de app zit 12 px. Eén padding-waarde op de
+     kaart-`Row` in `HorecagelegenheidEventTabelComponentCurrent`.
+  2. **`<p>`-tags staan letterlijk in de omschrijving** ("‹p›It's been a year
+     since…"). Gemeten aan de bron: `flutterflowmobiel_establishment_events`
+     levert `inhoud` met rauwe HTML. Dit is hetzelfde patroon als P2-27b —
+     het veld staat niet in `$fields_to_clean` van dat display-blok in
+     `custom_services_request_postprocess_alter()`. **Drupal-werk (Bob):** voeg
+     `'inhoud'` toe aan de lijst voor dit endpoint, net zoals dat op 15 sep voor
+     `flutterflowmobiel1`/`services_1` is gedaan. Let op de valkuil uit
+     `CLAUDE.md`: dat blok hoort **binnen** de `foreach ($result as &$item)`.
+- **75 · `categorie: null` op sommige events — ⚠️ NIET op te lossen in de
+  builder, hoort in Drupal. Eigenaar: Bob (Drupal/views).** Onderzocht
+  2026-09-17 (Claude). Gemeten: `flutterflowmobiel_establishment_events` gaf op
+  92 events van 120 Amsterdamse zaken **3× `"categorie": null`** (alle drie bij
+  horecanid 75457, Natuurtheater Zeddam). De agenda-code doet
+  `getJsonField(evenementenItem, r'$.categorie').toList()`, en `.toList()` op
+  `null` is een `NoSuchMethodError` — in een profile-build een stil grijs vlak.
+  **Wat ik geprobeerd heb en waarom het niet kan:** de `true`-vlag (`isForList`)
+  is in het *Generate Dynamic Children*-paneel niet te zetten. De enige
+  transform-opties in die dialoog zijn **"To Data Type"** en **"No Further
+  Changes"** — geen "Is List". Het menu naast de variabele biedt alleen
+  *Copy Variable*. Niets gewijzigd; de binding staat onveranderd op `$.categorie`.
+  **En de vlag zou het probleem toch maar half oplossen** — dat is de
+  belangrijkste uitkomst van dit uitzoekwerk. `getJsonField` (zie
+  `flutter_flow_util.dart`) doet bij `isForList: true` en waarde `null` →
+  `[null]`, dus géén crash maar wél een leeg/"null"-label; en bij een
+  **ontbrekend** veld geeft hij `null` terug ongeacht de vlag, dus dan crasht
+  `.toList()` alsnog.
+  **De nette fix zit dus aan de bron:** laat de view voor een event zonder
+  categorie een **lege array** `[]` teruggeven in plaats van `null`. Dan klopt
+  het overal, ook op de plekken die de vlag wél hebben. Hoort logisch samen met
+  taak 32B (events zonder categorie).
+
 
 **🟠 Vóór livegang, één ronde**