Quellcode durchsuchen

Sessie 14 sep: standaard header+Drawer op 4 pagina's, datumvelden stadsactiviteit, media-knoppen, P1-44 bevestigd; TASKS/CLAUDE bijgewerkt

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bob vor 21 Stunden
Ursprung
Commit
b183c56009
2 geänderte Dateien mit 120 neuen und 116 gelöschten Zeilen
  1. 53 0
      CLAUDE.md
  2. 67 116
      TASKS.md

+ 53 - 0
CLAUDE.md

@@ -759,6 +759,59 @@ al bekende freeze aan (zie hieronder) — sleep 'm bij twijfel meteen
 omhoog (drag op de titelbalk) vóórdat je gaat zoeken, dat voorkwam de
 freeze in de 3e/4e poging elke keer.
 
+**De standaard header (AppBar + `HeaderButtonsComponent` + Drawer) op een
+pagina zetten — volledig recept, 2026-09-14 vier keer achter elkaar gelukt via
+browser-automation, geen slepen nodig.** Dit vervangt het sleep-recept
+hieronder. Referentie = de AppBar van `Login`/`Favorieten`:
+- **AppBar-eigenschappen** (AppBar-node selecteren, tree-filter `AppBar`):
+  Background Color → thema-token **Info**; Elevation **2**; **Show Default
+  Button uit**; AppBar Height **80 PX**; Toolbar Height **25 %** (klik eerst
+  het `%`-teken); **Add Bottom Section aan** (Bottom Height blijft 70); Center
+  Title aan; **Use Flexible Space aan**; **Add Background Widget aan**. Geeft in
+  de export exact `PreferredSize(80) > AppBar(info, automaticallyImplyLeading:
+  false, flexibleSpace: FlexibleSpaceBar(background: ...), bottom: 70,
+  toolbarHeight: height*0.25, elevation: 2)`.
+- **Component in de achtergrond:** "Add Background Widget" zet een
+  placeholder-`Image` in een nieuwe tree-node **AppBar Background**. Filter de
+  tree op `Image`, klik het **"+"-icoontje op de rij "AppBar Background"** →
+  compacte Insert-dropdown → **2e tab-icoon (Project Components)** → zoek
+  `HeaderButtons` → kaart aanklikken. Dat **vervangt** de placeholder in één
+  klik. Zet daarna in het rechterpaneel de Component Parameter
+  `showBackButton` aan (subpagina) of uit (drawer-bestemming).
+- **Drawer:** "+" op de **pagina-root** → zoek `Drawer` → kaart onder *Page
+  Elements* → er komt een lege Drawer-node. Klik **Edit Drawer** in het
+  rechterpaneel (het canvas toont dan "Empty Drawer"), dan "+" op de
+  Drawer-rij → Project Components → `drawerComponent`. **Zonder Edit Drawer
+  registreert de kaart-klik niet** (3x gezien op `wachtwoordVergeten`).
+- **Valkuilen in deze dropdown:** de eerste klik op het tab-icoon ná het
+  openen landt nooit — klik 'm twee keer met 3 s ertussen en zoom om te zien
+  dat de kaarten van Project Components zijn (anders zet je een kale `Column`
+  in de header, wat 1x gebeurde). Het zoekveld wil ook eerst een losse klik.
+- **Velden in het AppBar-paneel (AppBar Height, Toolbar Height, Elevation)
+  reageren alleen op `triple_click` + typen**, niet op `left_click`+`ctrl+a`.
+  Elevation liet bovendien in élke lange batch los; zet 'm in een eigen
+  tool-aanroep en commit met een klik op een label-tekst (niet op een
+  sectiekop, die klapt in).
+- Kleurdialoog: het "Search theme colors..."-veld pakt de eerste klik+typ
+  vaak niet — klik, wacht 2 s, typ `Info`, zoom, en klik pas dan het
+  resultaat. Landt de zoekterm niet, dan klik je "Primary" (bovenste rij) en
+  verandert er niets.
+
+**"Set Variable": `Date Picked N` (uitvoer van een Date/Time Picker) staat
+onder Widget State — zoek er NIET op.** De zoekterm `Date Picked` reduceert
+tot precies één bron en die rendert dan leeg (het bekende éénbron-probleem);
+`Date` geeft meer bronnen maar Widget State blijft ook dan leeg. Wat werkte
+(2026-09-14, 2x): zoekveld leeg laten, "Widget State" openklappen, 10 s
+wachten, en met `hover` over de rijen eronder gaan — dan verschijnen alle
+opties, ook `Date Picked 2`. Bij "DateTime Format Options" daarna
+**`triple_click` op het veld en dan `custom` typen**: een gewone klik zet de
+tekst midden in "relative => a moment ago".
+
+**Een verse exportmap bouwen: dit project heeft géén `.fvmrc` of `.fvm/`
+meer** — de notities elders die zeggen "kopieer die eerst" kloppen niet meer.
+`pubspec.lock` kopiëren + `fvm use 3.35.7 -f` in de exportmap volstaat
+(bevestigd 2026-09-14: analyze 0 errors, profile-APK gebouwd).
+
 **Een pagina die nog geen `Drawer`/`AppBar` heeft alsnog toevoegen
 (bv. een pagina zonder header/hamburger-menu): via slepen, niet via
 rechtsklik.** Gevonden 2026-08-19 (Favorieten-pagina miste een

+ 67 - 116
TASKS.md

@@ -6,6 +6,44 @@ stadsactiviteit, tijdzone, media), de `.take(25)`-limiet op alle zes
 horeca-tabs, en de code-audit op de export van 21:00 (0 nieuwe bevindingen,
 `dart analyze` 0 errors). De herbruikbare lessen staan in `CLAUDE.md`.*
 
+*Sessie 2026-09-14 (Claude, builder + verse export per stap, profile-build op
+de telefoon-emulator nagekeken): standaard header + Drawer op `mijnProfiel`,
+`wachtwoordVergeten`, `stadsactiviteitAanmaken`, `uitgaansevenementAanmaken`;
+datumvelden en API-datumargumenten op `stadsactiviteitAanmaken`; media-knoppen
+afgerond; P1-44 op toestel bevestigd (Uitgaan ≠ Cultuur & Info, geen grijze
+labels). Alles staat in de builder ("Synced") — **Bob: maak zelf even een
+FlutterFlow-commit op `main`**, de commit-knop in het Version Control-paneel
+reageerde niet op Claude's klik. `dart analyze` op de verse export: 0 errors.
+Emulator-5556 heeft nu de profile-APK van die export + per-app-locale `nl-NL`.*
+
+**Standaardzin voor de volgende chat:**
+
+> Pak de Favorieten-cluster uit `TASKS.md` op (sectie "Nieuw gevonden
+> 2026-09-14"), plus restpunt 4 op `stadsactiviteitAanmaken` als je tijd over
+> hebt. Je mag zelf in de Chrome-browser in de FlutterFlow-builder werken — ik
+> zit erachter. Stel eerst je 3-5 taken voor, wacht op mijn akkoord,
+> verifieer elke wijziging met een verse export en noem het taak-ID.
+
+### 🆕 Nieuw gevonden 2026-09-14 — Favorieten-cluster (kandidaat voor Claude)
+
+Gezien op de telefoon-emulator tijdens de eindcontrole, allemaal op
+`lib/favorieten/favorieten_widget.dart`, geen van alle blokkerend:
+1. **Losse tekst "Hello World" onderaan tab 1 (Persoonlijke agenda)** —
+   i18n-sleutel `wmho8j7h`, regel ±423, zichtbaar voor elke ingelogde
+   gebruiker onder de lijst. Staat er sinds export-commit `98d46ad`. Ofwel de
+   `Text` weghalen (Bob, Claude verwijdert niets) ofwel er een echte tekst van
+   maken; vermoedelijk een vergeten placeholder.
+2. **Knop "stadsactiviteit aanmaken" op tab 4 (Gebruiker) is logo-rood
+   (`primary`)** — tegen het merk-DNA ("rood is nooit knopkleur"); alle andere
+   knoppen zijn oranje (`secondary`). Fill Color → `secondary`. Sleutel
+   `fbl4ak2y`, regel ±1040. Ook de hoofdletter ("Stadsactiviteit aanmaken")
+   gelijktrekken met de andere labels.
+3. **Tekst "onbekend" direct onder die knop** — een gebonden waarde die leeg
+   is (Default Value `onbekend`); wat hij zou moeten tonen is niet af te lezen.
+   Bob: zeggen wat daar hoort, of de guard erop zetten (zelfde patroon als
+   P1-6).
+Niet gedaan omdat het buiten de afgesproken scope van 14 sep viel.
+
 ### ⛔ EERST DIT — de working tree compileert niet (2026-09-14)
 
 De export van vannacht heeft drie pagina's naar de map `kanweg` verplaatst,
@@ -46,6 +84,18 @@ Alle drie door Claude aangemaakt tijdens de P2-15-tests, met toestemming:
 
 ### 🔧 Restpunten uit het werk van 13 sep
 
+*Afgerond 2026-09-14 (Claude, builder + verse export per stap): restpunt 2 in
+gewijzigde vorm — Bob koos niet voor een losse banner maar voor de **standaard
+header** (AppBar 80 px / Info / elevation 2 / HeaderButtonsComponent met
+terugknop + Drawer met drawerComponent) op `mijnProfiel`, `wachtwoordVergeten`,
+`stadsactiviteitAanmaken` en `uitgaansevenementAanmaken`; daarmee staat de
+verbindingsbanner daar vanzelf ook. Restpunt 3 (datumvelden
+`stadsactiviteitAanmaken`: weergave `dd-MM-yyyy HH:mm`, API-argumenten
+rechtstreeks op `datePicked1/2` met `yyyy-MM-dd HH:mm:ss`) en het
+media-knoppen-deel van restpunt 4 (border radius 8, gelijk aan de
+evenementpagina). `datumVoorApi()` wordt nu nergens meer aangeroepen en kan
+bij P2-7 mee. Recept voor de header staat in `CLAUDE.md`.*
+
 **1 · Horeca tab 6 "Verhuur, catering" — Eigenaar: Bob (Claude komt niet in
 dat paneel op deze pagina).** De andere vijf tabs lopen via
 `filterHorecagelegenheden`; tab 6 leest nog rechtstreeks uit zijn Backend Query.
@@ -59,25 +109,9 @@ JSON-path staat al op `HorecagelegenheidoverzichtCall`; hij levert
 `?.toList() ?? []` in plaats van de crashende variant. Zie `CLAUDE.md` voor het
 volledige recept.
 
-**2 · Verbindingsbanner ontbreekt op vier pagina's.** Het widget zit alleen in
-`HeaderButtonsComponent`, dus niet op `mijnProfiel`, `wachtwoordVergeten`,
-`stadsactiviteitAanmaken` en `uitgaansevenementAanmaken`. Op de twee
-**aanmaakpagina's** is het zinvol (formulier verzenden zonder netwerk); het
-neemt geen ruimte in. ⚠️ Zet het daar **niet** in een constructie die de
-bestaande layout onbegrensde hoogte geeft — zie de header-valkuil in
-`CLAUDE.md`.
-
-**3 · `stadsactiviteitAanmaken`: datumveld toont de rauwe waarde — Claude kan
-dit.** Het veld toont `2026-09-25 21:04:00.000`. Zelfde fix als op
-`uitgaansevenementAanmaken` is 13 sep gedaan: Set Form Field → DateTime Format
-→ Custom `dd-MM-yyyy HH:mm`, en de argumenten `datumStart`/`datumEind` van
-`stadsactiviteitCreate` rechtstreeks aan `datePicked1`/`datePicked2` hangen met
-`yyyy-MM-dd HH:mm:ss`.
-
 **4 · Cosmetisch op `stadsactiviteitAanmaken`** (laag, geen actie nodig): de
 "Mijn gemeenten"-snelkoppeling vult de Stadseditor-keten eronder niet voor, dus
-je kiest twee keer dezelfde gemeente. En de Media-knoppen zijn daar hoekig,
-terwijl ze op de evenementpagina afgerond zijn.
+je kiest twee keer dezelfde gemeente. *(Media-knoppen zijn 14 sep afgerond.)*
 
 **5 · Media-flow, twee kleinigheden** (uit de live test): de bronkeuze-sheet
 zegt "Choose Source / Gallery / Camera" in het Engels — FlutterFlow-standaard,
@@ -3213,105 +3247,22 @@ horeca-overzicht niet gewoon alfabetisch moet.
 P1-42 is afgemaakt; de uitkomst staat hierboven bij P1-42 als tabel. Deze
 taak kan weg zodra Bob de view-ronde in Drupal gedaan heeft.
 
-**P1-44 · Eigenaar: Bob — alle vijf Home-tabs tonen dezelfde lijst.
-Fix is gebouwd, getest, en daarna BEWUST TERUGGEDRAAID; er ligt nog één
-blokkade, zie P1-45.** Gevonden en uitgezocht 2026-09-06 door Claude.
-- **Wat er mis is:** `home_widget.dart` geeft elke tab een eigen display
-  mee (`displayid: 'services_3'` t/m `'services_7'`, regels
-  303/328/365/402/439) aan `HomeUitgaantabelKaartComponentWidget`, maar
-  dat component gebruikt de parameter nergens: hij komt in
-  `home_uitgaantabel_kaart_component_widget.dart` alleen voor in de
-  declaratie (regels 25/28), en de enige aanroep is
-  `HomeTabelCall.call(page: ...)`. `HomeTabelCall` heeft
-  `display_id=services_2` hardcoded in de URL. Uitgaan / Activiteiten /
-  Cultuur & Info / Films / Jeugd tonen dus alle vijf `services_2`.
-  ("Cultuur & Info" klopt bij toeval — `services_2` en `services_5`
-  leveren dezelfde nids.)
-- **Wat er nu al klaarstaat in de builder (blijft staan, verandert niets
-  aan het gedrag):** de API Call `homeTabel` heeft een variabele
-  `display_id` (String, default `services_2`) plus een query-parameter
-  `display_id` die daaraan hangt. De hardcoded `?display_id=services_2`
-  in de URL mag blijven — de láátste query-parameter wint, los tegen
-  Drupal nagemeten.
-- **De enige resterende handeling:** Backend Query van de
-  `StaggeredView` in `HomeUitgaantabelKaartComponent` → "Set Additional
-  Variable" → Parameter Name `display_id` → Value = component-parameter
-  `displayid`. Dat is precies wat Claude gebouwd, geëxporteerd én op een
-  toestel geverifieerd heeft (Uitgaan toonde daarna services_3,
-  Activiteiten services_4 — allebei nagelegd tegen de API).
-- **Waarom het toch teruggedraaid is:** met de fix erin lopen de tabs
-  Activiteiten / Cultuur & Info / Films / Jeugd tegen P1-45 hieronder
-  aan. **Precieze schade, nagemeten:** de kaarten renderen gewoon, maar
-  in plaats van de groene categorielabels staat er een grijs blok. Geen
-  lege tabs dus. (Ik meldde eerst "Films werd volledig leeg" — dat klopte
-  niet: die tab was leeg omdat ik er met een *swipe* naartoe ging, en dat
-  gebeurt óók in de teruggedraaide staat. Zie het losse punt hieronder.)
-- **Dus: het terugdraaien is een keuze, geen noodzaak.** Wil je liever
-  meteen de juiste inhoud per tab en neem je grijze blokjes op de plek
-  van de labels voor lief tot je in Drupal zit — zet de binding dan
-  gerust terug, het is één handeling. Ik heb 'm eruit gehaald omdat de
-  app dan onberispelijk staat zoals je 'm kende, en omdat P1-45 toch in
-  dezelfde Drupal-ronde valt als P1-42.
-
-**Los punt, klein maar verwarrend bij het testen: naar een tab
-*swipen* laat 'm leeg; op het tablabel *tikken* niet.** Bevestigd
-2026-09-06 op de telefoon-AVD, in zowel de gefixte als de
-teruggedraaide staat — dus dit staat los van P1-44/P1-45 en zat er al.
-De tab blijft een leeg wit vlak tot je 'm opnieuw aantikt. Vermoedelijk
-haalt de `PagedMasonryGridView` zijn eerste pagina niet op bij een
-swipe-wissel. Niet uitgezocht; wel iets om te weten voordat je een lege
-tab als databug aanmerkt.
-
-**P1-45 · Eigenaar: Bob (Drupal/views) — `categorie` komt in de ene
-display als lijst en in de andere als komma-string, en daar crasht de
-Home-kaart op.** Gevonden 2026-09-06 tijdens P1-44.
-- Gemeten op `flutterflowmobiel1`, pagina 0 van elke display:
-  - **lijst** (goed): services_1, services_2, services_3 —
-    `"categorie": ["Kindvriendelijk", "Theater"]`
-  - **string** (fout): services_4, services_5, services_6, services_7 —
-    `"categorie": "Kindvriendelijk, Theater"`
-- ✅ **Hermeten 2026-09-12 — niet meer te reproduceren.** Met de nieuwe
-  vulling geven **alle zes meetbare displays een array**: services_1 (25 items),
-  _2 (25), _3 (17), _5 (25), _6 (1), _7 (7). De komma-string is weg. Alleen
-  **services_4 blijft ongemeten** — die staat op 0 items omdat
-  stadsactiviteiten handmatig worden aangemaakt en niet geïmporteerd. Controleer
-  bij die ene display de veldinstelling visueel en leg 'm gelijk aan
-  services_1; verder is deze taak klaar.
-- 🔎 *Eerdere hermeting 2026-09-11 — deels niet meer te reproduceren.*
-  `services_5` geeft nu wél een **lijst** terug (`["Voorstelling"]`), net als
-  1/2/3. Voor **services_4, _6 en _7 is het niet vast te stellen**: die geven
-  op dit moment landelijk 0 items, dus er is geen enkele waarde om naar te
-  kijken (zie de contentstand bovenaan deze lijst). Twee mogelijkheden en ik
-  kan er niet tussen kiezen: óf jij hebt services_5 al omgezet en 4/6/7 ook,
-  óf het formaat hing aan de data en niet aan de displayconfig.
-  **Praktisch advies:** controleer de veldinstelling van `categorie` op
-  services_4/_6/_7 gewoon visueel in de viewconfig en leg 'm gelijk aan die
-  van services_1 — dat kost je een minuut en is niet af te meten zolang die
-  tabs leeg zijn.
-- `HomeUitgaantabelKaartComponent` bouwt zijn groene categorielabels met
-  Generate Dynamic Children over `$.categorie`, wat in de export
-  `getJsonField(item, r'$.categorie').toList()` oplevert. Op een String
-  gooit dat `NoSuchMethodError: Class 'String' has no instance method
-  'toList'` — letterlijk zo in `logcat` gezien tijdens de P1-44-test.
-- In een **profile**-build is dat volledig stil: geen rood scherm, geen
-  overflow-streep, niets in `dart analyze`. De Films-tab was gewoon een
-  leeg wit vlak; Activiteiten toonde wél kaarten maar met een grijs blok
-  waar de labels horen.
-- **Beste fix, en meteen de goedkoopste: laat services_4 t/m services_7
-  hetzelfde lijstformaat teruggeven als services_1/2/3.** Dat is dezelfde
-  view, dus het is een veldinstelling per display — geen app-wijziging
-  nodig, en het lost het in één keer op voor élke plek die deze data
-  toont. Pak het mee in dezelfde ronde als P1-42.
-- **App-side alternatief is geprobeerd en loopt vast:** er staat nu een
-  custom function `categorieAlsLijst(dynamic categorie)` in het project
-  (geeft `List<dynamic>` terug, slikt zowel een lijst als een
-  komma-string). Die werkt, maar is **niet te binden**: de
-  "Generate Dynamic Children"-waardekiezer toont de bron "Custom
-  Functions" wel, maar klapt leeg open — geen enkele functie is
-  selecteerbaar voor het verwachte type `List<Anything>`. Vier pogingen,
-  ook na het return-type naar JSON+Is List te hebben gezet. De functie
-  mag blijven staan (kost niets) voor het geval jij 'm in jouw browser
-  wél gebonden krijgt.
+**P1-44 · AFGEROND (binding staat sinds commit `7094b43` weer in de export,
+`displayId: widget!.displayid` in `home_uitgaantabel_kaart_component_widget.dart`;
+2026-09-14 opnieuw geverifieerd op een verse export en op de telefoon-emulator).**
+Elke Home-tab geeft nu zijn eigen `services_3`..`_7` mee. De blokkade P1-45 is
+13 sep nagemeten weg (categorie is op alle zeven displays een lijst).
+
+**P1-45 · Eigenaar: Bob (Drupal/views) — één restpunt: `services_4` visueel
+nakijken.** Alle meetbare displays van `flutterflowmobiel1` geven `categorie`
+inmiddels als array (hermeten 12 en 13 sep). Alleen `services_4`
+(stadsactiviteiten) is niet te meten omdat hij landelijk 0 items heeft; leg de
+veldinstelling van `categorie` daar één keer visueel gelijk aan `services_1`.
+Ter herinnering waarom het ertoe doet: `HomeUitgaantabelKaartComponent` doet
+`getJsonField(item, r'$.categorie').toList()`, en op een String is dat een
+stille `NoSuchMethodError` (grijs blok i.p.v. labels). De custom function
+`categorieAlsLijst` mag blijven staan maar is niet te binden in Generate
+Dynamic Children.
 
 **P2-2 · Eigenaar: Onbepaald, bewust v2 (herbevestigd 2026-08-25 door
 Bob).** Google Maps-**overzichtsweergave** (kaart met meerdere markers)