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