Explorar el Código

TASKS/CLAUDE: sessie afgesloten - afgeronde taken eruit, builder-lessen erin

TASKS.md: P2-1 (datumfilter) en P2-30 (EventCurrent) zijn af en dus volledig
verwijderd, inclusief het achterhaalde P2-1-blok van 5 sep dat nog beweerde dat
er geen exposed datumfilter bestond. Verwijzingen vanuit P1-17, P1-42, P2-26 en
de opruimlijst bijgewerkt zodat de resterende taken zelfstandig leesbaar zijn.

CLAUDE.md: zes herbruikbare inzichten uit deze sessie - een Column scrollbaar
maken vereist eerst het weghalen van elke Expanded (en een vaste hoogte voor een
kind met een eigen Expanded, anders weigert FlutterFlow met "Invalid Action");
de Gradient- en Box-Shadow-toggles reageren niet op browser-automation, met de
kleur-omweg die wel werkt; de twee sleepgrepen van de Set-Variable- en
Responsive-Value-dialogen; de "oneindig"-placeholder in Width/Height; de
logo800px-placeholder die een reuzenlogo in een AppBar achterlaat; en het
verschil tussen event-fotos en zaak-fotoos.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob hace 10 horas
padre
commit
a112e6f3b6
Se han modificado 2 ficheros con 90 adiciones y 109 borrados
  1. 61 0
      CLAUDE.md
  2. 29 109
      TASKS.md

+ 61 - 0
CLAUDE.md

@@ -2025,6 +2025,67 @@ spoor hierboven: kopiëren kan niet, **verplaatsen wel**.
   Y in één klik, en dán verdwijnt de `Align(...)` ook echt uit de export
   (X/Y handmatig op -1/0 zetten laat de wrapper staan).
 
+**Een niet-scrollende `Column` scrollbaar maken: haal EERST elke `Expanded` uit
+zijn kinderen, en geef een kind dat zelf een `Expanded` bevat een vaste hoogte.**
+Volledig doorlopen 2026-09-15 op `EventCurrent`. Wat je moet weten:
+- FlutterFlow genereert `SingleChildScrollView(child: Column(mainAxisSize: max))`
+  en dat is veilig: `RenderFlex` valt bij een onbegrensde hoogte terug op
+  `allocatedSize` (`canFlex == false`), dus `max` gedraagt zich daar als `min`.
+- Maar precies diezelfde `canFlex == false` laat élk flex-kind een assertion
+  gooien. Een `Expanded` in een scrollende Column is dus altijd fout.
+- **FlutterFlow bewaakt dat zelf en weigert de Expanded te verwijderen** met de
+  generieke toast *"Invalid Action: The most recent action would have caused a
+  crashing error"* zolang het kind een begrensde hoogte nodig heeft (een
+  component met eigen `Expanded`/TabBar). **Wrap dat kind eerst in een Container
+  met een vaste hoogte; daarna gaat de Expanded er zonder protest af.**
+- ⚠️ Die toast blijft staan én de **selectie springt terug naar de pagina-root**,
+  waardoor het lijkt alsof je klik niet landde. Soms is de wijziging tóch
+  doorgekomen — verifieer met een export in plaats van opnieuw te klikken.
+
+**De toggles van `Gradient` en `Box Shadow` in het Container-paneel reageren NIET
+op browser-automation — gebruik een omweg.** Bevestigd 2026-09-15: ~6 kliks op
+de toggle zelf (track links, track rechts, exacte knoppositie via `zoom`) en op
+de "Hide"-link ernaast veranderden niets, zonder foutmelding. Wat wél werkt:
+- gradient uitschakelen → zet **beide kleurstops op dezelfde themakleur**; de
+  kaart rendert dan vlak (de `LinearGradient` blijft in de code staan).
+- schaduw uitschakelen → zet **Shadow Color op `00000000`**; het veld toont
+  daarna "Transparent".
+Beide kleurvelden zijn gewone tekst/kleur-controls en die werken wél.
+
+**Twee dialoog-handgrepen die veel clipping oplossen (2026-09-15 bevestigd):**
+de **"Set Variable"-dialoog is aan zijn ONDERRAND groter te slepen** — nodig om
+een optie te bereiken die onderaan een lange bronnenlijst staat (bv. de laatste
+component-parameters; scrollen met het muiswiel doet daar niets). En de
+**Responsive-Value-dialoog sleep je aan de grijze pil bovenaan omhoog** vóór je
+"Responsive Value" kiest, anders vallen de onderste twee takken én Confirm weg.
+Mik exact op die pil (lees 'm af met een `zoom`): een sleep die ernaast begint
+sluit de dialoog en gooit je invoer weg.
+
+**Width/Height in het Container-paneel: de "∞" ín het veld is een PLACEHOLDER,
+geen ingeschakelde waarde.** Klik links in het veld (op de tekstpositie, niet op
+de ∞) en typ gewoon het getal; `ctrl+a` is niet nodig als het veld leeg is. Een
+klik op de ∞ zelf doet niets. Commit daarna met een klik op een **label**, niet
+op het bind-icoontje ernaast — dat opent de Set-from-Variable-dialoog.
+
+**⚠️ "Add Background Widget" op een AppBar laat een placeholder-`Image`
+(`logo800px.png`) achter — zet je de header in de `title`-slot, dan blijft die
+placeholder in de background staan en krijg je een reuzenlogo over je header.**
+Gevonden 2026-09-15 op `EventCurrent`: `FlexibleSpaceBar.background` bevatte nog
+`Image.asset('assets/images/logo800px.png', width: width * 0.7)` terwijl
+`HeaderButtonsComponent` in `title` zat. Op een tablet dekt dat de halve pagina.
+Elke andere pagina heeft het andersom (component ín de background, geen losse
+image) — dat is de norm; controleer dat bij een pagina die er "raar" uitziet.
+
+**Event-foto's en zaak-foto's zijn twee losse velden uit twee losse endpoints —
+identieke plaatjes zijn contentdubbels, geen bug.** Event:
+`flutterflow_events.json` veld `fotos` (`$[0].fotos`). Zaak:
+`flutterflowmobiel_establishment_info.json` veld **`fotoos`** (`$[:].fotoos`,
+let op de dubbele o). Gemeten 2026-09-15: Bimhuis (nid 75459) geeft
+`bimhuis.jpg` + `bimhuis2.jpg` naast één eigen eventfoto, en beide carousels
+tonen dus terecht iets anders. Bij MEZRAB zijn `s3/mazreb.jpg` (zaak) en
+`go_out/mazreb_27245.jpg` (event) dezelfde foto, twee keer geüpload in Drupal.
+Vergelijk dus de **bestandsnamen** vóór je "dezelfde foto's" als bug opschrijft.
+
 **Numerieke velden in het rechterpaneel (Padding, Border Radius, …):
 één `left_click` + `ctrl+a` + typen — `triple_click` focust ze niet.**
 Bevestigd 2026-09-04, nadat `triple_click` + typen 3x achter elkaar

+ 29 - 109
TASKS.md

@@ -28,6 +28,21 @@ 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`.*
 
+### 🔴 IN UITVOERING 2026-09-16 (Claude, sessie "zoekveld + look&feel") — Eigenaar: Claude — bezig
+
+*Geclaimd om 00:0x, vóór het builder-werk begon. Bob's opdracht: "maak van het
+zoekveld een taak, doe dat direct; pas ook de look & feel suggesties aan; je kunt
+bij de browser". Raakt deze onderdelen — een andere sessie moet hier NIET
+tegelijk in bouwen:*
+
+- **`home` (pagina)** — zoekveld boven de tabs, chip-kleur.
+- **API Call `homeTabel`** — nieuwe query-variabele `zoek`.
+- **`HomeUitgaantabelKaartComponent`** — nieuwe parameter `zoekterm` + Backend Query.
+- **`HeaderButtonsComponent`** — knopvorm terugknop.
+- **`drawerComponent`** — ontbrekend icoon "Zoek stad" + Help-menu-item.
+
+*Niet geraakt (bewust): de twee aanmaakpagina's (P2-29, andere sessie).*
+
 ### 📋 Bob's 7 — de geordende lijst van 2026-09-15 (laat), max. 7, niets anders oppakken
 
 *Stand bij afsluiten 2026-09-15 23:30: taak 1 af; 2 t/m 7 zijn voor morgen,
@@ -65,13 +80,13 @@ moeten interne sleutels zetten) — nodig vóór taak 3. Standaardzin voor morge
    `android/key.properties`, want release staat op `signingConfigs.debug`).
    iOS wel/niet in scope.
 3. **P1-17 · Engelse vertalingen in één ronde** — pas ná P2-29 (aanmaak-
-   pagina's) en P2-30 (`EventCurrent`), anders vertaal je twee keer. Omvang:
+   pagina's), anders vertaal je twee keer. Omvang:
    134 lege + 99 gelijk aan NL. Zwaartepunt: `stadsactiviteitAanmaken`,
    `uitgaansevenementAanmaken`, Home-chips, `Selectprovinciegemeente`.
    Claude maakt vooraf de chip-functie taalonafhankelijk.
 4. **Builder-opruimronde.** P2-7 (21 dode eenheden; begin met
    `drawer_component_copy` + `kanweghorecagelegenheid_current_copy`),
-   `HorecagelegenhedenOverzichtCopy3Copy`, `homeCopy` (zodra je P2-1 vertrouwt),
+   `HorecagelegenhedenOverzichtCopy3Copy`, `homeCopy` (het datumfilter is af en op een toestel getest, dus mag weg),
    en P2-22 (twee Property Override-fouten). Daarna één export + `dart analyze`
    door Claude.
 5. **Drupal-opruimronde.** P2-25 stap 4/5 (geen `print`/`var_dump` in de
@@ -110,9 +125,7 @@ af. Wat er nog tussen nu en de store zit, in volgorde van "raakt de gebruiker":*
    steeds geen `onTap` op. Display `services_2` op establishments is sinds
    taak 38 klaar. Keuze Bob: knop verbergen tot de pagina er is, of Claude
    bouwt de pagina (display_id-parameter + lijst) — kleine builder-taak.
-3. **`EventCurrent`-layout (P2-30)** — elke evenement-detailpagina; in
-   uitvoering door de andere sessie van 15 sep, moet landen vóór livegang.
-4. **Store-gereedheid** (nog nergens genoteerd): `build.gradle` release-build
+3. **Store-gereedheid** (nog nergens genoteerd): `build.gradle` release-build
    staat op `signingConfigs.debug`, geen `key.properties` — prima als de
    Play-upload via FlutterFlow's eigen deploy loopt, anders een keystore
    nodig. Play Console: privacy-policy-URL, Data-safety-formulier
@@ -120,40 +133,12 @@ af. Wat er nog tussen nu en de store zit, in volgorde van "raakt de gebruiker":*
    `uitgaanskrant.com/nl/account-verwijderen`). `version 1.0.0+1`,
    `targetSdk 36`, Crashlytics gekoppeld (`google-services.json` aanwezig).
    iOS: `project.pbxproj` beweegt mee in de export — is iOS in scope?
-5. **Al op de lijst, blijft staan:** AdMob *Show Test Ads* uit · P1-30 rate
+4. **Al op de lijst, blijft staan:** AdMob *Show Test Ads* uit · P1-30 rate
    limiting aan · P2-25 restant (stap 4/5, logging is al achter
    `_custom_flutterflow_debug()`) · P2-7 opruimronde (4 `kanweg`-mappen komen
    nog uit de export) · titel-trims · P2-22 (2 niet-blokkerende errors) ·
    taak 56 na livegang · P2-26 zoekveld + P2-29 zodra PRIO 0 gedeployed is.
 
-### 🆕 P2-30 · `EventCurrent` (evenementpagina) · ✅ AFGEROND 2026-09-15 (Claude, commits `00e5fb2` + `fa50ff5`)
-
-Structuur én styling af, getest met een profile-build op telefoon (411 dp) en
-tablet (1280 dp): geen overflow, geen RenderFlex in logcat, analyze 0 errors.
-- Reuzenlogo weg (placeholder-`Image` `logo800px.png` stond nog in
-  `FlexibleSpaceBar.background` terwijl de header in de `title`-slot zat).
-- Pagina scrolt; beide `Expanded`-kinderen eruit, `Row` → `Column` zodat de
-  beschrijving op de telefoon niet meer buiten beeld valt, horeca-blok in een
-  Container van 500 px (het heeft zelf een `Expanded`).
-- Knop "Alle evenementen" weg.
-- Witte kaart met `alternate`-rand 3 px, geen schaduw; `EvenementInfo` links
-  uitgelijnd; "Entree:" 16 px en verborgen zonder prijs; carousel responsive
-  0.75/0.75/0.5/0.35.
-
-**Punt 5 uit de eerste inventarisatie was mijn fout, geen bug.** Ik dacht dat de
-horeca-carousel onderaan dezelfde foto's toonde als de event-carousel bovenaan.
-Nagemeten: het zijn twee losse velden uit twee losse endpoints — het event komt
-uit `flutterflow_events` (`$[0].fotos`), de zaak uit
-`flutterflowmobiel_establishment_info` (`$[:].fotoos`). Bimhuis (nid 75459) geeft
-`bimhuis.jpg` + `bimhuis2.jpg` terwijl het event één eigen foto heeft, en dat
-rendert ook zo. Wat ik zag was MEZRAB, waar de zaakfoto (`s3/mazreb.jpg`) en de
-eventfoto (`go_out/mazreb_27245.jpg`) dezelfde afbeelding zijn — twee keer
-geüpload in Drupal. Contentkwestie, niets aan de app of de call.
-
-*Kleine restpunten, puur cosmetisch:* het logo in de kaart staat gecentreerd met
-een grote witruimte erboven, en "Amsterdam" springt een paar pixels in (padding
-van de geneste Column).
-
 ### 🆕 P2-29 · Aanmaakpagina's `uitgaansevenementAanmaken` + `stadsactiviteitAanmaken` — verbeterronde · Eigenaar: de sessie die op deze twee pagina's zit (Bob 2026-09-15 avond: "een andere sessie is bezig met de aanmaakpagina's") — niet nog een sessie erbij
 
 Bob's akkoord 2026-09-15 op blok A, daarna blok B. Alles hieronder is
@@ -500,55 +485,6 @@ tonen; alternatief is default "Amsterdam", te wisselen in dezelfde binding).
 Verifiëren op telefoonformaat (393 dp): hamburger + terugknop + logo + naam
 moeten op één regel passen, ook bij "'s-Hertogenbosch".
 
-**P2-1 · Datumfilter Vandaag / Dit weekend / Deze week · ✅ AFGEROND 2026-09-15
-(Drupal: Bob; app-kant: Claude, commits `f92c87c` + `4de72eb`) — werkend getest
-op een toestel.**
-
-*Wat er staat, export-geverifieerd:*
-- Drupal: `datum_van` / `datum_tot` op alle zeven `flutterflowmobiel1`-displays,
-  formaat `yyyy-MM-dd HH:mm:ss`, lokale tijd, beide grenzen inclusief. Een lege
-  waarde = geen filter. Opbrengst landelijk op Uitgaan:
-  **1525 → 637 (deze week) → 263 (dit weekend) → 37 (vandaag)**.
-- Custom functions `filterDatumVan` / `filterDatumTot`: mappen de Nederlandse
-  chip-labels (`Vandaag` / `Dit weekend` / `Deze week`) op de interne sleutels
-  en geven de grens terug; elke andere waarde, ook leeg, geeft `''` = geen
-  filter. De tot-grens is `23:59:59`, niet `00:00:00`.
-- API Call `homeTabel` + component `HomeUitgaantabelKaartComponent`: parameters
-  `datumVan` / `datumTot` tot in de Backend Query.
-- App State `datumFilter` (String, niet persisted, default leeg = Alles).
-- Home: een **ChoiceChips** (Alles / Vandaag / Dit weekend / Deze week, initieel
-  Alles) **tussen de slider en de TabBar**; On Selected → Update App State
-  `datumFilter`, update type "Rebuild Current Page".
-- Alle **5** `HomeUitgaantabelKaartComponent`-instanties (services_3 t/m _7):
-  `datumVan` = `filterDatumVan(datumFilter)`, `datumTot` =
-  `filterDatumTot(datumFilter)`, en **Value Key = `datumFilter`** op de
-  instantie (niet binnenin het component — de `pagingController` zit in het
-  `_model` van het component, dus alleen een key op de instantie vervangt het
-  hele model en dwingt een verse eerste pagina af).
-- `homeCopy` staat als vangnet klaar (Bob's verzoek vóór het Home-werk).
-  **Opruimen mag zodra je tevreden bent — dat is een taak voor Bob.**
-
-**Het herladen bij een filterwissel is opgelost met een custom action**
-(`herlaadLijsten`, commit `4de72eb`). Nodig omdat een Value Key op de
-component-instantie de `pagingController` níét reset — het componentmodel is
-pagina-eigendom (`wrapWithModel` + `disposeOnWidgetDisposal = false`), dus een
-nieuwe `State` pakt hetzelfde model met alle al geladen pagina's terug. Er is
-geen builder-actie die `pagingController.refresh()` genereert, en een
-`Navigate To` naar dezelfde pagina helpt niet (`nav.dart` gebruikt
-`key: state.pageKey`). De action wacht op de rebuild die de nieuwe
-`datumVan`/`datumTot` doorgeeft, loopt dan de element-tree af en roept
-`refresh()` aan op elke gemonteerde `PagedMasonryGridView`. Hij staat als
-tweede actie op de ChoiceChips, ná de Update App State.
-
-*Op de telefoon-emulator getest met een profile-build:* Alles → Dit weekend
-geeft meteen zaterdag 19 sep, Vandaag geeft dinsdag 15 sep, en een al geladen
-tab (Activiteiten) ververst ook in plaats. De slider blijft staan en er is geen
-paginaherlaad. Activiteiten/Vandaag is terecht leeg — nagemeten: `services_4`
-geeft vandaag 0 items, `services_3` er 9.
-
-*Losse opmerking, geen taak:* `homeCopy` staat er nog als vangnet; weg mag
-zodra je tevreden bent (Claude gooit niets weg).
-
 **P2-26 · Zoekveld op de evenementenlijsten · ⚠️ HERZIEN 2026-09-15 (Claude,
 gemeten) — het horeca-patroon kan hier NIET, dit begint bij jou in Drupal.**
 De aanname "zelfde patroon als horeca" gaat niet op. Horeca laadt zijn hele
@@ -564,7 +500,7 @@ begaanbare weg, en het zou de paginering die er nu netjes staat weggooien.
 pakken). Geef het een eigen filter-identifier (bv. `zoek`); daarna is de
 app-kant klein: één query-variabele op de API Call + een `TextField` boven de
 lijst dat bij On Change de page state zet, gevolgd door de bestaande custom
-action **`herlaadLijsten`** (gebouwd voor P2-1) — die ververst de
+action **`herlaadLijsten`** (gebouwd voor het datumfilter op Home) — die ververst de
 `pagingController`, dus dat stuk hoeft niet opnieuw bedacht te worden.
 Let op de 2000 ms `EasyDebounce` op On Change (bekend, niet instelbaar) — bij
 een server-side zoekopdracht is die vertraging juist prettig.
@@ -717,9 +653,11 @@ leg je een halfoude staat vast.
 ### 🧹 Voor Bob — opruimen op productie (testdata van 13 sep)
 
 Alle drie door Claude aangemaakt tijdens de P2-15-tests, met toestemming:
-- **nid 220906** — "TEST met foto Claude 13sep - niet echt" (gepubliceerd
-  evenement bij Café de Vriendschap), plus de drie geüploade bestanden
-  **fid 5509170 / 5509288 / 5509390** in `files/evenementen_uploads/`.
+- **nid 220906** — ✅ **node al weg** (nagemeten 2026-09-16 op productie:
+  `/node/220906` geeft 404, een bestaande-maar-ongepubliceerde geeft 403).
+  De drie geüploade bestanden **fid 5509170 / 5509288 / 5509390** in
+  `files/evenementen_uploads/` zijn niet via HTTP te controleren — nog wél
+  na te lopen met drush.
 - **nid 220276** — "TEST stadsactiviteit Claude 13sep - niet echt"; staat
   ongepubliceerd in de redactiewachtrij.
 - Nid 217916 en 219913 zijn al weg.
@@ -3855,25 +3793,6 @@ Omvang op de huidige agenda: 2 van 235 nodes.
 
 ## P2 — features & concept, na livegang
 
-**P2-1 · Eigenaar: Bob (Drupal/views-werk; app-werk pas daarna).**
-Datum-filter Vandaag / Dit weekend / Deze week. **Uitgezocht 2026-09-05
-(Claude, live `curl`) — dit kan niet in de app alleen:**
-- **Er is geen exposed datumfilter.** Getest op
-  `flutterflow_events.json` met `date`, `datum`, `field_date_value`,
-  `date_filter`, `date_filter[value][date]` — alle 25 items bleven
-  identiek. Controle met een verzonnen `onzin_param=123` gaf hetzelfde
-  resultaat, dus de view negeert onbekende parameters stil: "geen
-  verschil" bewijst hier écht dat de filter ontbreekt.
-- **Client-side filteren is geen alternatief.** (1) `datum` is een
-  geformatteerde string **zonder jaartal** (`"woensdag 9 sep, 20:00"` op
-  `/nl/`, `"Wednesday 9 Sep, 20:00"` op `/en/`) — parsen is fragiel en
-  rond de jaarwisseling ambigu. (2) De lijst is gepagineerd op 25 items,
-  dus je kunt alleen filteren binnen de pagina die je toevallig binnen
-  hebt.
-- **Benodigd:** een exposed date-filter (of aparte displays voor
-  vandaag/weekend/week) op `flutterflowmobiel1`. Pak dit samen met P1-42
-  hieronder — dat is dezelfde view en dezelfde sorteer/filter-laag.
-
 **P1-42 · Eigenaar: Bob (Drupal/views).** **De uitgaanslijsten tonen
 overwegend verlopen evenementen.** Gevonden 2026-09-05 (Claude, live
 `curl` tijdens P2-1-onderzoek), geldt voor `flutterflowmobiel1`
@@ -3893,9 +3812,10 @@ services_1/2/3 — de views waar Home zijn tabs mee vult.
 - **Fix, één ingreep in de view:** filter `datum >= vandaag` én sorteer
   **oplopend** op de datum-veldwaarde i.p.v. `created DESC`. Dan staat
   het eerstvolgende evenement bovenaan en loopt scrollen de toekomst in.
-- **Waarom dit vóór P2-1 moet:** een filter "Vandaag / Dit weekend /
-  Deze week" op een lijst die grotendeels uit verleden bestaat en op
-  aanmaakdatum sorteert, levert onvoorspelbare resultaten op.
+- **Stand 2026-09-15:** het datumfilter (Vandaag / Dit weekend / Deze
+  week) is inmiddels gebouwd en werkt, en de master van
+  `flutterflowmobiel1` filtert `>= -2 hours` en sorteert oplopend. Dit
+  punt gaat dus nog alleen over de vraag of dat overal doorwerkt.
 - ⚠️ **Nog te verifiëren door Bob:** of dit ook echt zo in de app oogt
   (gemeten op de API, niet op een toestel), en of de horeca-/
   favorieten-lijsten dezelfde sortering hebben.