Bladeren bron

P1-37 gefixt in de builder; P2-21 gecorrigeerd + geblokkeerd op pagination

P1-37 afgerond en met een verse export bevestigd: de Text-node voor
$.inhoud op HomeUitgaantabelKaartComponent heeft nu een Visibility-
conditie "$.inhoud is set". Gegenereerde code:
  if (getJsonField(evenementenItem, r'$.inhoud') != null) Expanded(...)
De letterlijke tekst "null" kan daar niet meer verschijnen. Taak
verwijderd uit de lijst. Let op: dit staat nu alleen in FlutterFlow,
nog niet in deze repo — komt mee met de eerstvolgende app-code-export.

P2-21 diagnose gecorrigeerd. Home's tabs bouwen hun kaarten NIET met
List.generate in een Column; die Column heeft één kind, en de lijst
wordt binnen HomeUitgaantabelKaartComponent gebouwd door een
PagedListView. De Column-naar-StaggeredView-omzetting is geprobeerd,
bleek een no-op (itemCount: 1) en is volledig teruggedraaid —
bevestigd byte-identiek aan het origineel via een verse export.

De echte ingreep is geblokkeerd: FlutterFlow weigert Replace op een
widget met pagination. De volledige Backend Query-configuratie is
uitgelezen en in de taak vastgelegd zodat ze exact te herstellen is,
met twee opties voor Bob (doorzetten vs. alleen een maximumbreedte).

P1-38 opnieuw opgenomen — die was bij een eerdere bewerking uit het
bestand verdwenen, ondanks dat de vorige commit-boodschap hem noemde.

Minor-3 toegevoegd: in de huidige builder-staat staat
HorecagelegenheidCurrent's AppBar op automaticallyImplyLeading: true,
wat volgens het bekende patroon een tweede hamburger-knop geeft.
Gevonden in een verse export, niet door mij veroorzaakt.

P2-7: de twee vangnet-kopieën van deze sessie opgevoerd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 2 weken geleden
bovenliggende
commit
ef28f00d8d
1 gewijzigde bestanden met toevoegingen van 120 en 82 verwijderingen
  1. 120 82
      TASKS.md

+ 120 - 82
TASKS.md

@@ -2111,7 +2111,7 @@ in Drupal, geen uitputtende audit.
 Volledige onderbouwing met screenshots: [Designbrug-rapport](https://claude.ai/code/artifact/29f3412a-305f-49f3-971c-cd9bd310beb1).
 Afvinkbare werklijst: [Designbrug werklijst](https://claude.ai/code/artifact/0c0c7347-d681-417d-83d7-7feb1de6457d).)*
 
-**P1-39 · Eigenaar: Claude/Bob — restpunt van het kleurwerk van
+**P1-39 · Eigenaar: Claude — bezig (sessie 2026-08-31 avond) — restpunt van het kleurwerk van
 2026-08-31.** Drie knoppen op `stadsactiviteit_aanmaken_widget.dart`
 staan nog op thema-`primary` (rood): "Logo kiezen" (:2458), "Foto's
 kiezen" (:2547) en "Activiteit indienen" (:2650). Bewust overgeslagen
@@ -2120,7 +2120,7 @@ pagina bouwde. Fix per knop: Button-node selecteren → rechterpaneel
 **Fill Color** → swatch → **Theme Colors → Secondary**. Vuistregel
 blijft: rood = merk en chroom, oranje = wat je aanklikt.
 
-**P1-33 · Eigenaar: Claude** (mechanisch, ±1 sessie; P1-32 is
+**P1-33 · Eigenaar: Claude — bezig (sessie 2026-08-31 avond)** (mechanisch, ±1 sessie; P1-32 is
 afgerond 2026-08-31, dus dit kan nu).
 Drie bijna-gelijke hardcoded roden vervangen door thema-`primary`:
 `#B1061E` (42×), `#B50808` (15×), `#B12727` (8×) — geen daarvan is het
@@ -2454,6 +2454,16 @@ horeca-blok bij stadsactiviteiten op `EventCurrent`) blijft bewust
 liggen tot Bob erop terugkomt — geen eigen taak-ID.)*
 
 **P2-7 · Eigenaar: Bob.** Opschonen:
+- **Twee kopieën uit de sessie van 2026-08-31 (Claude), aangemaakt als
+  vangnet vóór het P2-21-werk:** `homeCopy`
+  (`lib/uitgaanspaginas/home_copy/`) en
+  `HomeUitgaantabelKaartComponentCopy`
+  (`lib/uitgaanspaginas/home_uitgaantabel_kaart_component_copy/`).
+  **`homeCopy` kan weg** — de Home-pagina is volledig teruggedraaid en
+  met een verse export byte-identiek aan het origineel bevonden, dus dat
+  vangnet is niet meer nodig. **`HomeUitgaantabelKaartComponentCopy`
+  bewaren zolang P2-21 openstaat** (herstelpunt als de
+  pagination-omzetting misgaat); daarna ook weg.
 - **Nieuw bevestigd dood (2026-08-31, Claude, code-only; geverifieerd
   met `grep -rn "components/<bestand>" lib/` — 0 importeurs):**
   `lib/components/uitgaantabel_kaart_widget.dart` +
@@ -3270,101 +3280,129 @@ 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 (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.
+**P2-21 · Eigenaar: Claude (analyse af; uitvoering wacht op een besluit
+van Bob, zie de blokkade bij punt 3).** Tabletweergave herschikken
+i.p.v. uitrekken. Verifiëren op `emulator-5556` (tablet) én
+telefoonformaat. Staat los van P1-11 (labels/overflow, al afgerond).
 
-**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
+**Meetgegevens (2026-08-31, Claude).** 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.
+`wm size reset`). Telefoon-referentie: 1080x1920 @ 420dpi → **411x731 dp**.
 
 **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.**
+Beide gebruiken een `MasonryGridView` met responsieve `crossAxisCount`
+(1/1/2/3 per breekpunt, o.a. `horecagelegenheden_overzicht_widget.dart:598`).
+Dit is meteen het na te volgen patroon.
+
+**2. Home — gecorrigeerde diagnose. Zit NIET op de Home-pagina zelf.**
+Een eerdere lezing van deze taak ging ervan uit dat Home's tabs hun
+kaarten met `List.generate` in een `Column` bouwen. **Dat klopt niet:**
+de `Column` per tab bevat precies één kind, namelijk het component
+`HomeUitgaantabelKaartComponent`. De kaartenlijst wordt *binnen* dat
+component gebouwd, door een **`PagedListView`**
+(`home_uitgaantabel_kaart_component_widget.dart:132`) met infinite
+scroll. Dáár moet de kolomindeling dus veranderen — en dat is gunstig:
+één wijziging raakt alle 5 de tabs tegelijk (het component wordt
+alleen door `home_widget.dart` gebruikt, 5x).
+
+*(Getest en teruggedraaid op 2026-08-31: de `Column` op Home omzetten
+naar een `StaggeredView` via rechtsklik → Replace werkt technisch prima
+— geen "Invalid Action", het kind blijft behouden — maar levert alleen
+`itemCount: 1` op, dus functioneel een no-op. Volledig teruggedraaid en
+met een verse export bevestigd byte-identiek aan het origineel. Let op
+bij een Replace: de **Scrollable**-instelling van de `Column` gaat
+verloren en moet handmatig terug.)*
+
+**3. BLOKKADE op stap 2 — besluit van Bob nodig.** Rechtsklik → Replace
+op de `ListView` weigert met een expliciete, informatieve melding:
+> "Can't replace a widget that has pagination enabled. Go to the
+> 'Backend Query' pane and remove pagination before proceeding."
+
+Pagination weghalen en weer opbouwen raakt het datapad van de
+startpagina. **Huidige configuratie, uitgelezen en hier vastgelegd
+zodat ze exact te herstellen is** (Backend Query-paneel + de export):
+- Query Type **API Call**, call **`homeTabel`**
+- **Enable Infinite Scroll: aan**; variabele `page` → Value =
+  **Next Page Number** (genereert
+  `HomeTabelCall.call(page: nextPageMarker.nextPageNumber)`)
+- **Enable Pull to Refresh: aan** (genereert `onRefresh` +
+  `waitForOnePageForListView()`)
+- Twee eigen laadindicatoren (first page én next page):
+  `SpinKitFadingCircle`, kleur **`#B1061E`**, size **80**
+- Verder: `shrinkWrap: true`, `reverse: false`, `Axis.vertical`
+
+Het risico zit niet in de grid-omzetting zelf maar in het opnieuw
+opbouwen van die vijf instellingen — vooral de twee custom
+laadindicatoren — op de live Home-datastroom. **Vangnet staat klaar:**
+`HomeUitgaantabelKaartComponentCopy` is een complete, onbeschadigde
+kopie van dit component (aangemaakt 2026-08-31, vóór alle wijzigingen).
+
+*Twee opties, aan Bob:*
+- **(a) doorzetten** — pagination uit, `ListView` → `GridView`,
+  `Cross Axis Count` responsief 1/1/2/3 (via het icoontje naast het
+  veld → Source **"Responsive Value"**; dat bouwt de 4-traps if/else
+  zelf, bevestigd werkend deze sessie), daarna alle vijf instellingen
+  hierboven terugzetten en met een verse export controleren dat
+  `PagedGridView` + `nextPageNumber` + beide `SpinKitFadingCircle`-
+  blokken er weer staan.
+- **(b) kleinere ingreep zonder pagination aan te raken** — de kaart
+  een maximumbreedte geven en centreren. Lost de onleesbaar lange
+  regels op, maar geeft geen twee kolommen.
+
+**4. Favorieten — kleine correctie, los van het bovenstaande.**
 `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 — het lichtroze vlak
-eromheen is opgelost (2026-08-31: fill- en randkleur van de container
-op `home_widget.dart` gewist).** Wat wel
+**hardgecodeerd**. Zet dit om naar dezelfde responsieve uitdrukking als
+punt 1. Geen pagination in de weg hier.
+
+**5. De sliderband is géén tabletprobleem — zie P1-38.** 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).
-
-*Screenshots van deze meting staan in de sessie-scratchpad en zijn niet
-bewaard; opnieuw maken kost twee minuten met de `wm size`-truc
-hierboven.*
+`p_uitgaan_slider_component_widget.dart:280`) geeft op 1280 dp een
+kaart van 960 dp breed. Verdient dezelfde breekpunt-behandeling
+(bv. 0.75 / 0.5 / 0.35), maar pas ná P1-38.
 
 ---
 
-**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.
 
 ---
 
+**Minor-3 · Eigenaar: Bob — even zelf nakijken (gevonden 2026-08-31 door
+Claude, in een verse export; niet door Claude veroorzaakt).** In de
+huidige builder-staat van `HorecagelegenheidCurrent` staat de AppBar op
+`automaticallyImplyLeading: true` (was `false` in de laatst gecommitte
+code). Volgens het bestaande `CLAUDE.md`-patroon geeft dat een
+**tweede, overbodige hamburger-knop** naast de knop die
+`HeaderButtonsComponent` zelf al bevat. Waarschijnlijk een neveneffect
+van het lopende kleurwerk op diezelfde AppBar (`iconTheme` ging in
+dezelfde wijziging van `Color(0xFFB12727)` naar
+`FlutterFlowTheme.of(context).secondary`). Fix indien bevestigd:
+AppBar-node → Visibility → **"Show Default Button" uit**.