Forráskód Böngészése

P2-6: zoekveld afgewerkt (volle breedte + hint), 4 taken vastgelegd voor Bob

Deze sessie zelf afgerond: Cultuur's categoriePad hersteld naar $.categorie,
zoekveld op double.infinity en hint 'Zoek op naam'. Geverifieerd met verse
export, dart analyze 0 errors, live pagina functioneel ongewijzigd.

TASKS.md: de vier resterende punten expliciet als taken opgeschreven -
tab Verhuur-catering (Claude geblokkeerd), de categoriedropdown (wacht op
een ontwerpkeuze van Bob, functie bewust nog niet aangemaakt), Max Items 25,
en de route-omzetting.

CLAUDE.md: drie bevindingen - triple_click werkt waar ctrl+a faalt in
rechterpaneel-tekstvelden, het infinity-knopje bij Width, en dat de 2000ms
EasyDebounce op On Change niet instelbaar is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 hete
szülő
commit
aee4f21c83
2 módosított fájl, 110 hozzáadás és 64 törlés
  1. 22 0
      CLAUDE.md
  2. 88 64
      TASKS.md

+ 22 - 0
CLAUDE.md

@@ -1160,6 +1160,28 @@ is veel toleranter en draait vaak door terwijl `export-code` weigert —
 "de build doet het toch gewoon" is dus geen bewijs dat de teller
 onschuldig is.
 
+**Rechterpaneel-tekstvelden: `triple_click` + typen werkt, `left_click` +
+`ctrl+a` + typen niet — en commit met een klik ergens neutraals, niet met
+Tab.** Bevestigd 2026-09-05 op een TextField's *Hint Text*: `ctrl+a` gevolgd
+door typen liet de oude waarde onaangeroerd staan, `triple_click` gevolgd door
+typen verving 'm meteen. Daarna Tab drukken draaide de waarde terug; klikken op
+een sectiekop in hetzelfde paneel legde 'm wél vast. (Dit nuanceert de oudere
+notitie dat typen in het rechterpaneel voor Claude "structureel onmogelijk" is —
+met de juiste combinatie lukt het gewoon.)
+
+**Een breedte op `double.infinity` zetten hoeft niet getypt te worden:** in het
+`Width`-veld staat rechts een **∞-knopje** dat het veld op `inf` zet. Zelfde
+geldt voor Height. Scheelt het gevecht met numerieke invoervelden.
+
+**FlutterFlow's `On Change`-trigger op een TextField krijgt automatisch een
+`EasyDebounce` van 2000 ms, en die is niet instelbaar.** Bevestigd 2026-09-05:
+geen `debounce`-eigenschap op het widget (zoeken op "debounce" in "Search
+properties..." geeft niets), en noch de trigger in de Action Flow Editor noch
+het "⋮"-menu op de actie-node biedt de optie. Bouw je een live zoekveld dat op
+een lokale lijst filtert, reken dan op ~2 s vertraging na de laatste
+toetsaanslag. Wil je sneller: laat de widget die je filtert rechtstreeks
+`_model.textControllerN.text` lezen én zorg voor een andere rebuild-trigger.
+
 **Bind een verplicht (non-nullable) String-argument van een Custom Function
 NOOIT aan een nullable Page State — dat genereert een `!` en crasht bij de
 eerste build.** Bevestigd 2026-09-05 (`filterHorecagelegenheden` op

+ 88 - 64
TASKS.md

@@ -2318,91 +2318,115 @@ nog (zie P2-6); oppakken zodra dat is afgerond, zelfde recept
 > met `Unexpected error from the server` (3x achter elkaar gezien op
 > 2026-09-04), en lukt daarna gewoon. Even wachten, niet gaan zoeken.
 
-> ### Stand na 2026-09-05 — stappen 1-3 klaar, stap 5 op 5 van de 6 tabs
+> ### Stand na 2026-09-05 — af op 5 van de 6 tabs; 4 taken over voor Bob
 >
-> Alles hieronder is per stap geverifieerd met een **verse export**. De live
-> `HorecagelegenhedenOverzicht` is functioneel ongewijzigd; `dart analyze` op
-> de verse export geeft **0 errors**.
+> Alles hieronder is per stap geverifieerd met een **verse export**;
+> `dart analyze` **0 errors**; de live `HorecagelegenhedenOverzicht` is
+> functioneel ongewijzigd (byte-diff alleen de Cultuur-tab, die nu dezelfde
+> `getJsonField(..., '$')`-schrijfwijze gebruikt als de andere vijf).
 >
-> **Klaar:**
-> - **Stap 1+2** — één `TextField` in de root-`Column` van Copy3, boven de
+> **AF:**
+> - **Stap 1+2** — één `TextField` in de root-`Column` van Copy3, bóven de
 >   `TabBar`. Insertie was puur additief (0 verwijderde regels). FlutterFlow
 >   hernummerde de controllers: dit veld is **`textController1`**.
-> - **Stap 3** — `On Change` → Update Page State `zoektermActiviteiten`
->   (= `_model.textController1.text`). ⚠️ FlutterFlow zet daar zelf een
->   **`EasyDebounce` van 2000 ms** op; veel te traag voor een lokaal filter,
->   moet naar ~300 ms.
-> - **Stap 5 op 5 tabs**: Activiteiten, Cultuur, Eetgelegenheden,
->   Overnachten, Uitgaan draaien op
+> - **Stap 3** — `On Change` → Update Page State `zoektermActiviteiten`.
+> - **Stap 5 op 5 tabs** — Activiteiten, Cultuur, Eetgelegenheden,
+>   Overnachten en Uitgaan draaien op
 >   `filterHorecagelegenheden(alleXxx, textController1.text,
->   categorieFilterActiviteiten, '$.titel', '$.categorie')` — alle vijf met
->   de juiste padwaarden (Cultuur's ontbrekende punt is 2026-09-05 hersteld).
+>   categorieFilterActiviteiten, '$.titel', '$.categorie')`, alle vijf met de
+>   juiste padwaarden.
+> - **Cosmetica zoekveld** — breedte `double.infinity` (was 200 px) en
+>   hint-tekst **"Zoek op naam"** (was "TextField").
 >
-> **Nog te doen op Copy3 — nog maar één punt:**
-> 1. **Tab 6 (Verhuur, catering)** — de enige `StaggeredView` die nog op de
->    rauwe API-respons staat. Zelfde recept als de andere vijf, met
->    `items` = `alleVerhuurCatering`.
->    ⚠️ **Claude komt hier niet doorheen — overdragen aan Bob.** Twee sessies,
->    ~15 pogingen: in de Set-Variable-dialoog van uitgerekend deze ene
->    `StaggeredView` rendert de bron **Custom Functions** zijn optielijst
->    nooit. Uitklappen lukt (chevron slaat om), maar de rij
->    `filterHorecagelegenheden` eronder verschijnt niet — niet na hoveren,
->    niet na blind klikken op de verwachte positie, niet na de dialoog te
->    sluiten en te heropenen, en niet na een volledige herlaad van de builder.
->    Op de andere vijf tabs werkte exact dezelfde reeks wél. Niets kapot: de
->    tab staat gewoon nog op zijn oorspronkelijke binding.
+> ---
 >
-> **⚠️ `categorieFilterActiviteiten` is bewust het GEDEELDE veld voor alle zes
-> tabs** — er komt één dropdown boven de `TabBar`, niet één per tab. Gebruik
-> dus niet `categorieFilterCultuur` e.d. De naam klopt niet meer, maar
-> hernoemen lukt niet (zie hieronder).
+> ### Openstaande taken
+>
+> **A. Tab 6 (Verhuur, catering) koppelen · Eigenaar: Bob**
+> De enige `StaggeredView` die nog op de rauwe API-respons staat. Recept staat
+> hieronder; `items` = **`alleVerhuurCatering`**.
+> ⚠️ **Claude komt hier niet doorheen.** Twee sessies, ~15 pogingen: in de
+> Set-Variable-dialoog van uitgerekend deze ene `StaggeredView` rendert de
+> bron **Custom Functions** zijn optielijst nooit. Uitklappen lukt (chevron
+> slaat om), maar de rij `filterHorecagelegenheden` eronder verschijnt niet —
+> niet na hoveren, niet na blind klikken op de verwachte positie, niet na
+> dialoog sluiten/heropenen, niet na een volledige herlaad van de builder. Op
+> de andere vijf tabs werkte exact dezelfde reeks wél. Niets kapot: de tab
+> staat gewoon nog op zijn oorspronkelijke binding en werkt zoals voorheen.
+>
+> **B. Stap 4 — categoriedropdown · Eigenaar: Bob (ontwerpkeuze) → daarna Claude**
+> Er is een custom function nodig die de unieke `categorie`-waarden uit de
+> dataset haalt. **Claude heeft die bewust nog NIET aangemaakt**, want er zit
+> een productkeuze in en een eenmaal aangemaakte custom function kan Claude
+> niet meer verwijderen (staande regel). Twee varianten:
+> - **Tab-bewust (volgt de oorspronkelijke spec):** functie krijgt de zes
+>   `alleXxx`-lijsten + `TabBar Current Index` (Widget State) + het pad = **8
+>   argumenten**. De dropdown toont dan precies de categorieën van de zichtbare
+>   tab. Nadeel: 8 bindingen in juist die dialoog die bij taak A vastliep.
+> - **Samengevoegd (simpeler):** functie krijgt de zes lijsten + het pad = **7
+>   argumenten**, en toont alle categorieën over alle tabs heen. Kiest de
+>   gebruiker er een die op de actieve tab niet voorkomt, dan is de lijst leeg.
+>   Fors minder bindwerk en minder kans op de dialoogblokkade.
+> Zeg welke je wilt, dan bouwt Claude de functie én de dropdown (invoegen in
+> de root-`Column` is bewezen werkend, net als bij het zoekveld).
+>
+> **C. `Max Items` staat per tab op 25 · Eigenaar: Bob (beslissing)**
+> Bestond al vóór deze taak. Filteren gebeurt vóór het afkappen, dus zoeken
+> werkt correct — maar zónder zoekterm zie je 25 van de volledige dataset die
+> `fetchAlleHorecagelegenheden` juist ophaalt. Limiet weghalen of laten staan?
+>
+> **D. Stap 7 — route omzetten · Eigenaar: Bob (bewust uitgesteld)**
+> Pas doen als A en B klaar zijn. Twee `Navigate To`-wijzigingen naar
+> `HorecagelegenhedenOverzichtCopy3`:
+> `lib/shared/drawer_component/drawer_component_widget.dart` en
+> `lib/horecagelegenhedenoverzicht/horecagelegenheid_current/horecagelegenheid_current_widget.dart`.
+> Daarna wordt de oude `HorecagelegenhedenOverzicht` een orphan → naar P2-7.
+>
+> **Niet oplosbaar, geaccepteerd:** FlutterFlow zet op de `On Change`-trigger
+> zelf een **`EasyDebounce` van 2000 ms**. Er is geen `debounce`-eigenschap op
+> het TextField-widget en de trigger/actie-menu's bieden 'm ook niet. Gevolg:
+> de lijst ververst ~2 s nadat je stopt met typen. Werkt correct, voelt traag.
+>
+> ---
 >
 > **Werkend recept per `StaggeredView`** (bewezen op 5 tabs):
-> 1. Zet het tree-zoekveld op **`StaggeredView`** — dan staan alle 6 grids
->    onder elkaar, in tabvolgorde. Veruit de betrouwbaarste navigatie.
+> 1. Zet het **tree-zoekveld** op `StaggeredView` — dan staan alle 6 grids
+>    onder elkaar in tabvolgorde. Veruit de betrouwbaarste navigatie.
 > 2. Node selecteren → **4e icoontje** (Generate Dynamic Children) → potlood
 >    naast **Value** → potlood naast **Variable** → zoekveld `filterHoreca` →
->    **Custom Functions** → **hover** op de rij eronder (rendert pas bij hover)
->    → `filterHorecagelegenheden`.
+>    **Custom Functions** → **hover** op de rij eronder → de functie.
 > 3. Argumenten: `items` = Page State `alleXxx` (*No Further Changes*);
 >    `zoekterm` = **Widget State → `TextField 1`**; `categorieFilter` = Page
 >    State `categorieFilterActiviteiten`; `titelPad` = `$.titel`;
 >    `categoriePad` = `$.categorie`.
 > 4. **Confirm** in de dialoog **én** daarna **Save** in het rechterpaneel.
 >
-> **Praktische valkuilen die deze sessie tijd kostten:**
+> **Valkuilen die tijd kostten:**
 > - **Bind `zoekterm` NOOIT aan de page state `zoektermActiviteiten`.** Die is
->   nullable en initialiseert op `null`; FlutterFlow genereert dan
->   `_model.zoektermActiviteiten!` → **gegarandeerde crash** zodra de tab
->   bouwt, en `dart analyze` ziet dat niet. Widget State geeft
->   `_model.textController1.text`, non-nullable.
+>   nullable en start op `null`; dat genereert `_model.zoektermActiviteiten!`
+>   → **gegarandeerde crash** zodra de tab bouwt, en `dart analyze` ziet het
+>   niet. Widget State geeft `_model.textController1.text`, non-nullable.
+> - **`categorieFilterActiviteiten` is bewust het GEDEELDE veld voor alle zes
+>   tabs** — er komt één dropdown boven de `TabBar`, niet één per tab. Gebruik
+>   dus niet `categorieFilterCultuur` e.d. De naam klopt niet meer, maar
+>   hernoemen lukt niet (zie hieronder).
+> - **Let op de punt in `$.categorie`.** Eén keer als `$categorie` ingevoerd;
+>   de functie strippt alleen een `$.`-prefix, dus het filter matcht dan nooit
+>   op die tab — zonder foutmelding. Hersteld, maar makkelijk te herhalen.
 > - **Het zoekveld in de Set-Variable-dialoog filtert over álle bronnen**,
->   inclusief Widget State. Typ gewoon `TextField 1` — veel sneller dan
->   Widget State uitklappen en hoveren.
-> - **De eerste klik op een icoon/potlood/zoekveld landt vaak niet** (paneel
->   herberekent nog). Reken op 2 pogingen per actie en verifieer met een zoom.
-> - **Het argumentenpaneel scrollt niet**, maar je komt er wel bij: onderrand
->   van de dialoog omlaag slepen én elk afgehandeld argument inklappen via
->   zijn chevron.
-> - Bij tab 6 rendert de optielijst onder "Custom Functions" structureel niet
->   (zie hierboven). Alleen daar; de andere vijf gingen probleemloos.
+>   inclusief Widget State. Typ `TextField 1` — veel sneller dan uitklappen.
+> - **De eerste klik op een icoon/potlood/zoekveld landt vaak niet.** Reken op
+>   2 pogingen per actie en verifieer met een zoom.
+> - **Rechterpaneel-tekstvelden: `triple_click` + typen werkt, `ctrl+a` +
+>   typen niet** (bevestigd op Hint Text). Commit door ergens neutraals te
+>   klikken, niet met Tab — Tab draaide de waarde terug.
 >
-> **⚠️ Het "Local Page State Variables"-paneel slaat wijzigingen niet op —
-> ook niet bij Bob.** Getest: veld hernoemen, Nullable uitvinken, Initial
-> Field Value vullen, en de "Default Variable Value" in de Set-Variable-
-> dialoog. Alle vier tonen de nieuwe waarde in de UI, header meldt "Synced",
-> maar een verse export toont de oude staat. Daarom houden de velden hun
+> **⚠️ Het "Local Page State Variables"-paneel slaat wijzigingen niet op — ook
+> niet bij Bob.** Getest: veld hernoemen, Nullable uitvinken, Initial Field
+> Value vullen, en "Default Variable Value" in de Set-Variable-dialoog. Alle
+> vier tonen de nieuwe waarde in de UI met "Synced" erboven, en een verse
+> export toont onveranderd de oude staat. Daarom houden de velden hun
 > misleidende `...Activiteiten`-namen.
->
-> **Ook nog open:** stap 4 (categoriedropdown boven de `TabBar` + de custom
-> function die unieke `categorie`-waarden uit de actieve dataset haalt),
-> stap 7 (route omzetten), de debounce, en de cosmetica van het zoekveld
-> (vaste `width: 200`, geen hint-tekst, geen wis-kruisje).
->
-> **Openstaande vraag aan Bob:** `Max Items` staat per tab op **25** (bestond
-> al vóór deze sessie). Filteren gebeurt vóór het afkappen, dus zoeken werkt —
-> maar zónder zoekterm zie je 25 van de volledige dataset die
-> `fetchAlleHorecagelegenheden` juist ophaalt. Limiet weghalen of laten staan?
 
 **Achtergrond en bewijs (Eigenaar: Claude)** (niet meer 'bezig' — de de-risk-test is
 gedaan, zie het kader hieronder; stappen 3/4/6 staan nog open).