|
|
@@ -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).
|