Jelajahi Sumber

P2-28 af: Selectprovinciegemeente met standaardheader, kop+uitleg, volle-breedte velden en Navigate Back

- TASKS: P2-28 afgerond + restpunt (gemeentenaam in header is dode fallback
  doordat app_state gemeenteSelectId al default 28694 geeft) - keuze voor Bob
- TASKS: P2-26 herzien, client-side zoeken kan niet (937/497/450 items per
  Home-display voor Amsterdam, server-side paginering) - begint bij Drupal
- CLAUDE: Set-Variable-dialoog in de Action Flow Editor sluit bij typen

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 4 jam lalu
induk
melakukan
8dfaf11e41
2 mengubah file dengan 82 tambahan dan 23 penghapusan
  1. 24 0
      CLAUDE.md
  2. 58 23
      TASKS.md

+ 24 - 0
CLAUDE.md

@@ -1129,6 +1129,30 @@ Staat de rij er nog steeds niet, klik dan **blind op de verwachte positie**
 altijd aan de ontvangende kant (de Value-rij in het rechterpaneel), niet aan
 de lijst zelf.
 
+**⚠️ In de Action Flow Editor sluit de "Set Variable"-dialoog zodra je typt —
+en het "Value to set"-veld is soms een dialoog-opener en soms een gewoon
+tekstveld.** Bevestigd 2026-09-15 op een `Update App State`-actie (4 pogingen,
+opgegeven). Drie dingen lopen bij hetzelfde veld door elkaar:
+1. Een klik op het `Unset`-veld opent **soms** de Set-Variable-overlay en zet
+   het veld **soms** gewoon in tekstinvoer-modus. In dat tweede geval landt je
+   zoekterm als **letterlijke waarde** (hier: `gemeenteSelectNaam = 'gemeente'`).
+   Wis dat meteen met het kruisje rechts in het veld en controleer met een `zoom`
+   dat er weer `Unset` staat.
+2. Staat de overlay wél open (zoekveld met blauwe rand), dan sluit **elke**
+   `type`-actie hem weer — met of zonder voorafgaande klik op dat zoekveld. De
+   bronnenlijst (Component Parameters … Combine Text) blijft klikbaar, maar
+   *Custom Functions* staat eronder, buiten de zichtbare rand, en de overlay
+   scrollt niet. Slepen aan de greep bovenaan verschuift het **canvas** zodra de
+   overlay net gesloten is.
+3. Het icoontje naast het label "Value to set" is **niet** de variabele-kiezer —
+   de tooltip zegt "Clear Default Value".
+**Praktisch: een actie-argument dat een custom function met meerdere argumenten
+nodig heeft, is via de Action Flow Editor voor Claude niet te zetten.** Ruim je
+halve actie op (⋮ op de actie-node → *Delete Action*) vóór je verdergaat: een
+`Update App State` met *Set Value* en waarde `Unset` genereert een lege string en
+zou een bestaande waarde juist wissen. Draag de binding daarna over aan Bob.
+
+
 **⚠️ "Set from Variable": een zoekterm die tot precies ÉÉN bron reduceert
 rendert zijn optielijst NIET — zoek breder.** Dit is de simpelste verklaring
 voor het bekende lege-optielijst-probleem, gevonden 2026-09-11. Zoeken op

+ 58 - 23
TASKS.md

@@ -32,16 +32,42 @@ Value "Kies je gemeente"** (`valueOrDefault(FFAppState().gemeenteSelectNaam,
 "Amsterdam" — wil je dat anders, het is één tekstveld in dezelfde binding.
 FlutterFlow-commit: Bob.*
 
-**P2-28 · `Selectprovinciegemeente` opknappen · Eigenaar: Claude (volgende).**
-Door P2-19 is dit de eerste pagina waar een nieuwe gebruiker heen tikt, en hij
-oogt onaf: titel **"Select gemeente/provincie"** (Engels/Nederlands gemengd),
-een eigen oude AppBar (rood) met een hamburger die half onder de balk uitsteekt
-(zelfde statusbalk-patroon als P1-49, maar hier op de pagina zelf), en de twee
-dropdowns + "Toepassen" in een klein wit blok linksboven zonder uitleg. Plan:
-standaardheader (recept in `CLAUDE.md`, `showBackButton` aan), titel "Kies je
-gemeente", korte uitleg ("Je ziet dan het uitgaansnieuws van die gemeente in
-het menu"), dropdowns op volle breedte, en na *Toepassen* terug naar de vorige
-pagina. Kost één sessie-blok.
+**P2-28 · `Selectprovinciegemeente` opknappen · ✅ AFGEROND 2026-09-15 (Claude,
+builder + verse export per stap + profile-build op de telefoon-emulator).**
+*Gedaan: standaardheader (PreferredSize 80 / `info` / elevation 2 / toolbar 25% /
+bottom 70 / flexibleSpace met `HeaderButtonsComponent`, `showBackButton: true`)
+in plaats van de oude rode AppBar met de half onder de statusbalk geklemde
+hamburger; de oude titel-`Text` en de leading-`Row` zijn weg. In de body een kop
+**"Kies je gemeente"** (`titleLarge`) + uitleg "Je ziet dan het uitgaansnieuws
+van die gemeente in het menu.", beide in de al bestaande lege `Column` met
+padding 16. Beide dropdowns én de Toepassen-knop op `double.infinity`, en
+Toepassen doet nu `context.safePop()` (Navigate Back, met "Navigate to Root Page
+on Failure" aan) i.p.v. `pushNamed(Home)`. Live nagelopen op de telefoon-AVD:
+header past op één regel, Toepassen brengt je terug naar Home met de Amsterdamse
+lijst. `dart analyze` op de verse export: 0 errors. FlutterFlow-commit: Bob.*
+
+**Restpunt uit P2-28 — keuze voor Bob: de header blijft "Kies je gemeente"
+zeggen, ook nadat je Toepassen hebt gebruikt.** Oorzaak precies gevonden:
+`SelectStateDropDownComponent` heeft in zijn On-Component-Load een fallback die
+`gemeenteSelectId = '28694'` **én** `gemeenteSelectNaam = 'Amsterdam (gemeente)'`
+zet — maar die staat achter `if (gemeenteSelectId is leeg)`, en `app_state.dart`
+geeft `_gemeenteSelectId` al de default `'28694'`. Die tak vuurt dus nooit en de
+naam blijft `''`, waardoor P2-19's `valueOrDefault(...)` "Kies je gemeente"
+toont tot je de gemeente-dropdown daadwerkelijk *wijzigt*. Twee opties:
+(a) laten zoals het is (de uitnodiging blijft staan, bewuste keuze bij P2-19);
+(b) in App State de default van `gemeenteSelectId` leegmaken — dan vult de
+bestaande fallback bij de eerste start id **en** naam, en toont de header meteen
+"Amsterdam (gemeente)".
+*Claude probeerde variant (c) — een `Update App State`-actie vóór Navigate Back
+die `gemeenteSelectNaam` met `gemeenteNaamById()` vult — maar de Set-Variable-
+dialoog in de Action Flow Editor viel bij elke poging dicht zodra er in het
+zoekveld getypt werd (4 pogingen, zie `CLAUDE.md`). De halve actie is weer
+verwijderd; de keten is weer alleen `Navigate Back`.*
+
+**Niet gewijzigd, ter info:** de favoriete-gemeente-chips onderaan dezelfde
+component navigeren nog steeds naar Home (`pushNamed`) i.p.v. terug. Dat is
+verdedigbaar ("ga naar deze gemeente") en viel buiten de opdracht — zeg het als
+je ze ook op `safePop` wilt.
 
 **Oude planbeschrijving P2-19 (ter referentie):**
 `HeaderButtonsComponent` bevat al een 200×200 logo-`Image` en een `Text` op
@@ -61,14 +87,23 @@ tijdsfilter scrolt niemand daar doorheen. Drupal-kant: twee exposed filters op
 recept in `CLAUDE.md` bij "exposed date-filter"). App-kant daarna: twee
 query-variabelen op de call + drie chips boven de lijst die de datums zetten.
 
-**P2-26 · Zoekveld op de evenementenlijsten · Eigenaar: Claude (na P2-19).**
-Horeca heeft een zoekveld (`filterHorecagelegenheden` over een `_model`-lijst),
-de events-tabs niet. Zelfde patroon: On Page Load de display in een page-state-
-lijst laden, `TextField` + custom function `filterEvenementen(lijst, zoekterm)`
-op titel/plaats/categorie, `StaggeredView` over het resultaat. Let op de
-2000 ms `EasyDebounce` op On Change (bekend, niet instelbaar). Alternatief als
-de lijsten te groot worden voor client-side: een `title`-contains exposed
-filter in de view.
+**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
+lijst in `_model.alleX` en filtert client-side; de Home-tabs draaien op een
+`PagedMasonryGridView` met een `pagingController` (server-side paginering, 25
+per keer). Client-side filteren zou betekenen: eerst álles ophalen. Gemeten op
+productie voor Amsterdam (`townid=28695`, volledig gepagineerd):
+`services_1` **937** items (38 pagina's), `services_3` **497**, `services_5`
+**450**. Dat zijn 38 calls voordat de eerste letter getypt kan worden — geen
+begaanbare weg, en het zou de paginering die er nu netjes staat weggooien.
+**Wat wel werkt: een exposed `title`-contains filter op `flutterflowmobiel1`**
+(zelfde soort ingreep als de twee datumfilters van P2-1, dus goed samen op te
+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 en de pagingController ververst.
+Let op de 2000 ms `EasyDebounce` op On Change (bekend, niet instelbaar) — bij
+een server-side zoekopdracht is die vertraging juist prettig.
 
 **P2-27 · Twee zichtbare oneffenheden op Home · Eigenaar: Bob beslist, Claude bouwt.**
 (a) De grijze band om de Home-slider — niet in `HomeUitgaanSliderComponent`
@@ -92,11 +127,11 @@ initialisatie in `main.dart`). Beslissing voor Bob; Claude kan (b) uitvoeren.
 
 **Standaardzin voor de volgende chat:**
 
-> Pak P2-28 (`Selectprovinciegemeente` opknappen) uit de 🚀-sectie van
-> `TASKS.md` op, en daarna P2-26 (zoekveld op de evenementenlijsten). Je mag
-> zelf in de Chrome-browser in de FlutterFlow-builder werken — ik zit erachter.
-> Stel eerst je stappen voor, wacht op mijn akkoord, verifieer elke wijziging
-> met een verse export en noem het taak-ID.
+> P2-28 is af. Pak nu P2-27 (de grijze band om de Home-slider lokaliseren en
+> wegwerken) uit de 🚀-sectie van `TASKS.md` op. Je mag zelf in de Chrome-
+> browser in de FlutterFlow-builder werken — ik zit erachter. Verifieer elke
+> wijziging met een verse export en noem het taak-ID. P2-1 en P2-26 wachten
+> allebei eerst op exposed filters in `flutterflowmobiel1` (mijn kant).
 
 *Stand 2026-09-14 avond: `lib/` in git is gelijk aan FlutterFlow (laatste
 export 22:20). Nog te doen door Bob: FlutterFlow-commit op `main` voor