Browse Source

P2-17/P2-21 onderzocht (code-only) + 2 nieuwe bugs: P1-37, P1-38

P2-17: inventarisatie geverifieerd — 11 shadow-treffers in 10 bestanden,
waarvan er maar 5 in live componenten staan. De andere 5 zitten in
componenten met 0 importeurs; die fixen heeft geen zichtbaar effect.
Exacte bestanden + regelnummers + builder-stappen opgenomen.

P2-21: klacht bevestigd met live screenshots op emulator-5556 (tablet,
1280x800 dp liggend / 800x1280 dp staand) en een telefoonreferentie.
- Horeca-overzicht (gemeente + provincie) is al responsief (1/1/2/3) —
  niets doen, en meteen het na te volgen patroon.
- Home is het echte werk: 5 tabs bouwen kaarten met List.generate in
  een gewone Column, dus altijd één kolom.
- Favorieten heeft crossAxisCount hardgecodeerd op 2.
- De "sliderband wordt een leeg vlak" blijkt geen tabletprobleem —
  losgetrokken naar P1-38.

P1-37 (nieuw): Home-kaart toont letterlijk "null" bij een evenement
zonder beschrijving. Live gezien op de startpagina. Ongeguard
getJsonField($.inhoud).toString() in
home_uitgaantabel_kaart_component_widget.dart:657. Andere plek dan het
al bekende geval in P1-15 punt 3.

P1-38 (nieuw): lichtroze vlak (#F5A2A2) met grijze rand rond de
Home-slider, home_widget.dart:187 — zichtbaar op elk schermformaat,
staat in geen enkel merkpalet.

P2-7: lib/components/uitgaantabel_kaart_widget.dart bevestigd als
verouderd duplicaat met 0 importeurs.

Bevat ook Bob's eigen lopende P2-15-notities uit dezelfde working tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 2 tuần trước cách đây
mục cha
commit
235434abb5
1 tập tin đã thay đổi với 211 bổ sung18 xóa
  1. 211 18
      TASKS.md

+ 211 - 18
TASKS.md

@@ -2462,6 +2462,19 @@ horeca-blok bij stadsactiviteiten op `EventCurrent`) blijft bewust
 liggen tot Bob erop terugkomt — geen eigen taak-ID.)*
 
 **P2-7 · Eigenaar: Bob.** Opschonen:
+- **Nieuw bevestigd dood (2026-08-31, Claude, code-only; geverifieerd
+  met `grep -rn "components/<bestand>" lib/` — 0 importeurs):**
+  `lib/components/uitgaantabel_kaart_widget.dart` +
+  `..._model.dart`. Dit is een **verouderd duplicaat** van het live
+  component `lib/uitgaanspaginas/uitgaantabel_kaart/` — zelfde
+  klassenaam `UitgaantabelKaartWidget`, maar de oude versie heeft nog
+  `parameter9` waar de live versie `nid` heeft, en mist het
+  blurhash-werk uit P2-12. Alle drie de gebruiksplekken (`favorieten`,
+  `favorieten_copy`, `p_uitgaantabel_kaart_component`) importeren de
+  `uitgaanspaginas`-versie. Ook 0 importeurs:
+  `lib/components/header_buttons_component_copymethartje_widget.dart`
+  (mogelijk relevant voor P0-12's dubbele-hartjes-vraag — eerst daar
+  checken vóór weggooien).
 - Merge `kaartTabelUitgaanComp` + `kaartTabelUitgaanSComp` — Bob doet
   dit zelf ("ik kijk er zelf naar").
 - `lib/kanweg` opnieuw leegmaken indien teruggekomen na een latere
@@ -2741,7 +2754,7 @@ overwegen bij een volgende theme-update:
 
 ---
 
-**P2-15 · Eigenaar: Bob (builder), Claude regisseert/verifieert.
+**P2-15 · Eigenaar: Bob (builder), Claude regisseert/verifieert — bezig (sessie 2026-08-31, bouwstap 3 restpunten).
 Bouwstap 1 afgerond en bevestigd (2026-08-27): custom action
 `bestandUpload` (`lib/custom_code/actions/bestand_upload.dart`) upload
 foto → fid, live getest tegen productie
@@ -3077,6 +3090,31 @@ top-level aangemaakt mét een *relatief* pad (`/nl/flutterdrup/...`)
    afgeknipt worden in de verzendactie.
 6. Na succes: melding **"wordt beoordeeld"**, niet "geplaatst".
 
+**Nieuwe restpunten (sessie 2026-08-31, live pair-fix):**
+7. **Verzendknop crasht bij ontbrekende plaats.** Argument #5 van
+   `stadsactiviteitCreate` genereert `_model.createPlaatsID!` (non-null
+   assertion) — indienen zonder een plaats te kiezen geeft een
+   `Null check operator used on a null value` vóórdat de custom action
+   zijn eigen nette "Ongeldige plaats"-melding kan tonen. Guard nodig:
+   knop uitschakelen/verbergen zolang `createPlaatsID` niet gezet is,
+   of een conditie vooraan de actieketen.
+8. **`field_town_access` bevat nog plaats-niveau tids (Drupal-kant).**
+   De omzetting naar gemeente-niveau (2026-08-27) wijzigde alleen de
+   widget-instellingen, niet de al opgeslagen waarden — bevestigd via
+   `mijn_stadsrechten` op Bob's eigen account (`tid` 29946
+   = 's-Gravendeel, een Plaats; `parent_titel` = Binnenmaas, de
+   gemeente). Gevolg: de rechten-shortcut op `stadsactiviteitAanmaken`
+   zet `createGemeenteID` op een plaats-tid en de Plaats-dropdown
+   blijft leeg. **De app-binding (`$[:].tid`) is correct; de data niet.**
+   Eenmalige drush-migratie nodig voor alle gebruikers met
+   `field_town_access`: tids waarvoor
+   `count(taxonomy_get_parents_all($tid)) === 3` vervangen door hun
+   gemeente-parent (`$parents[1]->tid`), dedupliceren, `user_save()`.
+   Eerst devbob, dan productie. Script is in de sessie aan Bob gegeven.
+9. **Categorie-dropdown toont de hele hiërarchie plat.** `categorieen`
+   geeft `diepte`/`parent_tid` mee; de multiselect toont nu ouder- én
+   kindtermen door elkaar zonder inspringing. Optionele verfijning.
+
 **Losse observatie (niet blokkerend):** FlutterFlow's Issues-paneel
 toont 1 error "Property Override — return type mismatch" wijzend naar
 `DropDownProvincie`, terwijl de export 0 Dart-errors geeft en de
@@ -3116,16 +3154,54 @@ Info/Opening/Map → openingstijden en kaart terug als eigen tab, "Links"
 onder Info. Let op: `evenement_horecagelegenheid` noemt dezelfde tab al
 wél "Openingstijden" — die twee schermen spreken elkaar nu tegen.
 
-**P2-17 · Eigenaar: Claude** (mechanisch). Slagschaduw onder
-titelteksten verwijderen (property-zoekbalk → "shadow"). Tien
-componenten: `uitgaantabel_kaart_widget.dart`,
-`kaart_tabel_uitgaan_comp_widget.dart`,
-`kaart_tabel_uitgaan_s_comp_widget.dart`,
-`kaart_slider_uitgaan_s_comp_widget.dart`,
-`home_uitgaantabel_kaart_component`, `p_uitgaan_slider_kaart_component`,
-`p_uitgaantabel_kaart_component_orgineel_met_kaartjeerin`,
-`event_current_widget.dart`, `horecagelegenheid_current_widget.dart`.
-De site gebruikt dit effect nergens.
+**P2-17 · Eigenaar: Claude (builder-stappen klaar, alleen nog
+uitvoeren).** Slagschaduw onder titelteksten verwijderen — de site
+gebruikt dit effect nergens.
+
+**Inventarisatie afgerond en aangescherpt (2026-08-31, Claude,
+code-only op de repo). De oorspronkelijke lijst van 10 bestanden is
+terug te brengen tot 5 plekken die daadwerkelijk zichtbaar zijn**; de
+andere 5 staan in componenten die door geen enkel bestand geïmporteerd
+worden, dus daar heeft de fix geen zichtbaar effect. Zoekpatroon voor
+hercontrole: `grep -rn "shadows: \[" lib/ --include=*.dart` (11
+treffers in 10 bestanden).
+
+**Wél doen — 5 plekken, allemaal live (regelnummers t.o.v. de export
+van 2026-08-31):**
+1. `HomeUitgaantabelKaartComponent` — titel-`AutoSizeText`
+   (`lib/uitgaanspaginas/home_uitgaantabel_kaart_component/..._widget.dart:413`,
+   bron `$.titel`). Zwaarste geval: staat 5x op de Home-pagina.
+2. `PUitgaanSliderKaartComponent` — titel-`Text`
+   (`lib/uitgaanspaginas/p_uitgaan_slider_kaart_component/..._widget.dart:274`,
+   bron `widget!.titel`). Gebruikt door zowel `HomeUitgaanSliderComponent`
+   als `PUitgaanSliderComponent`.
+3. `UitgaantabelKaart` — titel-`AutoSizeText`
+   (`lib/uitgaanspaginas/uitgaantabel_kaart/uitgaantabel_kaart_widget.dart:311`).
+   **Let op: dit is de map `uitgaanspaginas/uitgaantabel_kaart/`, niet
+   `lib/components/uitgaantabel_kaart_widget.dart`** — zie de
+   dode-lijst hieronder. Gebruikt door Favorieten en
+   `PUitgaantabelKaartComponent`.
+4. `EventCurrent` — **twee** plekken
+   (`..._widget.dart:354` én `:607`), niet één zoals de oude notitie
+   suggereerde.
+5. `HorecagelegenheidCurrent` — titel-`Text` (`..._widget.dart:469`).
+
+**Niet doen (geen zichtbaar effect — 0 importeurs, geverifieerd met
+`grep -rn "components/<bestand>" lib/`):**
+- `lib/components/kaart_tabel_uitgaan_comp_widget.dart` (0 importeurs)
+- `lib/components/kaart_tabel_uitgaan_s_comp_widget.dart` (0)
+- `lib/components/uitgaantabel_kaart_widget.dart` (0) — zie P2-7
+- `lib/components/kaart_slider_uitgaan_s_comp_widget.dart` — alleen
+  geïmporteerd door `slider_uitgaan_component_small_current`, en dát
+  component is zelf al als orphan bevestigd (zie P2-7)
+- `lib/uitgaanspaginas/p_uitgaantabel_kaart_component_orgineel_met_kaartjeerin/`
+  (0)
+
+**Builder-stappen per plek:** widget selecteren → "Search
+properties..." → typ `shadow` → de shadow-sectie uitzetten/verwijderen.
+Verifiëren met een verse export: het aantal `shadows: [`-treffers moet
+van 11 naar 6 gaan (de 5 dode blijven staan tot P2-7 die mappen
+opruimt).
 
 **P2-18 · Eigenaar: Claude** (mechanisch, ±12 iconen; pas ná P0-11).
 Eén icoon per categorie in het menu: "Cultuur" en "Jeugd" hebben nu
@@ -3151,11 +3227,128 @@ kaarttitels op afbreken/overlopen nakijken. Ook een legitieme uitkomst:
 niet doen — dan is de app herkenbaar op kleur maar mist hij de
 kranten-uitstraling.
 
-**P2-21 · Eigenaar: Claude.** Tabletweergave herschikken i.p.v.
-uitrekken: op tabletformaat blijven kaarten één kolom en rekken ze mee
-tot volledige schermbreedte (onleesbaar lange regels, sliderband wordt
-een leeg vlak). Fix: boven ±700px twee kolommen in de lijstweergaven +
-de tekstkolom in kaarten begrenzen. Verifiëren op `emulator-5556`
-(tablet) én telefoonformaat. Staat los van P1-11 (labels/overflow, al
-afgerond) — dit gaat puur over kolomindeling.
+**P2-21 · Eigenaar: Claude (analyse afgerond, builder-werk resteert).**
+Tabletweergave herschikken i.p.v. uitrekken. Verifiëren op
+`emulator-5556` (tablet) én telefoonformaat. Staat los van P1-11
+(labels/overflow, al afgerond) — dit gaat puur over kolomindeling.
+
+**Analyse afgerond 2026-08-31 (Claude, code-only + live screenshots op
+`emulator-5556`). Uitkomst: de klacht klopt, maar geldt voor minder
+pagina's dan gedacht — en één deel ervan (de sliderband) blijkt géén
+tabletprobleem te zijn.**
+
+*Meetgegevens.* FlutterFlow's breekpunten staan in
+`lib/flutter_flow/flutter_flow_util.dart:378-380`: `kBreakpointSmall`
+479, `kBreakpointMedium` 767, `kBreakpointLarge` 991 (logische px).
+`emulator-5556` is 2560x1600 @ 320dpi → **1280x800 dp liggend**,
+**800x1280 dp staand** (rotatie zit op `USER_ROTATION_LOCKED`; staand
+testen kan met `adb -s emulator-5556 shell wm size 1600x2560`, daarna
+`wm size reset`). Telefoon-referentie `emulator-5554`: 1080x1920 @
+420dpi → **411x731 dp**. Een tablet zit dus altijd in de bovenste twee
+breekpunt-treden, een telefoon altijd in de onderste.
+
+**1. Horeca-overzicht (gemeente én provincie) — al goed, niets doen.**
+Beide pagina's gebruiken een `MasonryGridView` met een responsieve
+`crossAxisCount` (1 / 1 / 2 / 3 per breekpunt, o.a.
+`horecagelegenheden_overzicht_widget.dart:598`). Op tablet staand geeft
+dat 2 kolommen, liggend 3. Dit is meteen het na te volgen patroon voor
+punt 2.
+
+**2. Home — dit is het echte werk.** De 5 tabs bouwen hun kaarten met
+`List.generate` in een gewone `Column` binnen een
+`SingleChildScrollView` (`home_widget.dart`, o.a. regels 314/338/375/
+412/449) — **geen grid, dus altijd één kolom, op elk schermformaat**.
+Live bevestigd: op 800 dp staand is elke kaart volle breedte met de
+rechterhelft grotendeels leeg. De kaart zelf
+(`home_uitgaantabel_kaart_component_widget.dart:230`) is een `Row` van
+`Expanded(flex: 3)` (foto) en `Expanded(flex: 6)` (tekst), met een
+responsieve vaste hoogte (160/200/240/280 dp, regel 198) — de hoogte
+schaalt dus wél mee met het breekpunt, de kolomindeling niet. Daardoor
+wordt de kaart op tablet zowel breder als hoger terwijl de tekst
+gelijk blijft.
+*Fix:* de `Column` per tab omzetten naar een grid met dezelfde
+responsieve `crossAxisCount` als punt 1. **Gebruik rechtsklik →
+"Replace", nooit "Wrap Widget" + "Remove Widget"** — zie de
+`CLAUDE.md`-notitie: die tweede route sloopt de `List.generate`-binding
+zonder foutmelding. Na afloop verifiëren dat `List.generate(` nog in de
+export staat.
+
+**3. Favorieten — kleine correctie, geen herbouw.**
+`favorieten_widget.dart:339` en `:663` hebben `crossAxisCount: 2`
+**hardgecodeerd**. Op tablet blijft het dus bij 2 kolommen waar 3 zou
+passen, en op telefoon staan er 2 naast elkaar in een kaart die op
+volle breedte ontworpen is. Zet dit om naar dezelfde responsieve
+uitdrukking als punt 1.
+
+**4. De sliderband is géén tabletprobleem — apart opgevoerd als
+P1-38.** De "leeg vlak"-indruk komt van een lichtroze container die
+óók op telefoonformaat zichtbaar is; zie P1-38 hieronder. Op tablet
+valt hij alleen meer op omdat het vlak breder wordt. Wat wel
+tablet-specifiek is: `viewportFraction: 0.75`
+(`home_uitgaan_slider_component_widget.dart:287` en
+`p_uitgaan_slider_component_widget.dart:280`) betekent op 1280 dp een
+kaart van 960 dp breed — één enorme kaart per scherm. Dat verdient
+dezelfde breekpunt-behandeling (bv. 0.75 / 0.5 / 0.35), maar pas
+nadat P1-38 de kleur heeft opgelost, anders kijk je naar twee
+problemen tegelijk.
+
+*Screenshots van deze meting staan in de sessie-scratchpad en zijn niet
+bewaard; opnieuw maken kost twee minuten met de `wm size`-truc
+hierboven.*
+
+---
+
+**P1-37 · Eigenaar: Claude of Bob (1 conditie).** De Home-kaart toont
+letterlijk de tekst **`null`** wanneer een evenement geen
+beschrijving heeft. Live gezien op 2026-08-31 op de Home-pagina, tab
+"Uitgaan", kaart "Micha Wertheim" — de regel onder de datum leest
+`null`.
+
+Oorzaak is het bekende patroon uit P1-6/P1-15: in
+`home_uitgaantabel_kaart_component_widget.dart:657-662` staat een kale
+`Expanded(child: Text(getJsonField(evenementenItem, r'''$.inhoud''')
+.toString(), ...))` zonder guard — `.toString()` op `null` levert de
+string `"null"`. **Dit is een andere plek dan het al bekende geval:**
+P1-15 punt 3 gaat over `UitgaantabelKaartWidget`'s
+`widget!.inhoud!.toString()`, een ander component. Deze zit op de
+startpagina van de app en is dus zichtbaarder.
+
+*Fix:* zelfde recept als P1-15 punt 3 — Visibility → Conditional op de
+`Text`-node, First Value = de rauwe `$.inhoud`-binding, operator
+**"Is Set"**, geen Second Value (dat vermijdt de bekende tweede-dialoog-
+freeze). Let op de `CLAUDE.md`-waarschuwing dat "Is Set and Not Empty"
+op een JSON-Path-binding tegen een raw loop-item **niet** beschikbaar
+is — "Is Set" is hier de haalbare optie.
+
+*Zelfde component, nog niet live waargenomen maar identiek onbeschermd:*
+`$.titel` (:385), `$.horecagelegenheid` (:442), `$.adres` (:497),
+`$.plaats` (:566), `$.datum` (:618). Meepakken als de conditie-route
+eenmaal werkt.
+
+---
+
+**P1-38 · Eigenaar: Bob (1 kleurwaarde) — past bij het P1-32/P1-33-
+kleurwerk.** Rond de slider op de Home-pagina staat een **lichtroze
+vlak met een grijze rand**, zichtbaar op élk schermformaat (bevestigd
+op zowel telefoon- als tabletformaat, 2026-08-31).
+
+`home_widget.dart:187-195`:
+```
+Container(
+  height: 250.0,
+  decoration: BoxDecoration(
+    color: Color(0xFFF5A2A2),
+    border: Border.all(color: Color(0xFFCAC3C3), width: 2.0),
+  ),
+```
+`#F5A2A2` en `#CAC3C3` komen in geen van beide merkpaletten voor (zie
+het merk-DNA in `CLAUDE.md`: #9A141D, #FF680D, #3E454C, #09B34A,
+#F2F2F2) en staan ook niet in `flutter_flow_theme.dart`. Ziet eruit als een
+achtergebleven hulpkleur om de slider-container zichtbaar te maken
+tijdens het bouwen. Omdat de carousel-kaarten de vaste hoogte van 250
+dp niet vullen, is het vlak er duidelijk omheen te zien.
+
+*Fix:* de `Fill Color` van deze container op transparant zetten (of op
+`#F2F2F2` als er bewust een rustvlak achter de slider moet), en de
+2px-rand weghalen. Eén widget, één eigenschap.