Bladeren bron

Onderzoek filterbalk op provinciepagina (taak 113)

Convert to Component werkt en is de route; recept + valkuilen in CLAUDE.md.
Ook vastgelegd: "Update Page on Changes" genereert updateOnChange: true.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 16 uur geleden
bovenliggende
commit
6a5557091b
2 gewijzigde bestanden met toevoegingen van 41 en 1 verwijderingen
  1. 40 0
      CLAUDE.md
  2. 1 1
      TASKS.md

+ 40 - 0
CLAUDE.md

@@ -2230,6 +2230,46 @@ gratis doorstart, elke reload kost een herhaling van stap 1.
   P0-3). Vuistregel blijft: 1-2 pogingen (incl. 1 reload), dan
   overdragen met exacte stappen — niet blijven proberen.
 
+**"Convert to Component" bestaat wél en werkt — het is de manier om een blok
+herbruikbaar te maken, want widget copy/paste kan niet.** Bewezen 2026-09-20 op
+`homeCopy` (de Home-filterbalk). Rechtsklik de node in de widget tree →
+**Convert to Component** (onderaan het menu, onder *Copy AI Selector*) → dialoog
+"New Component" met een al gefocust naamveld (meteen typen, niet eerst klikken) →
+*Create Component*. De builder springt naar het nieuwe component; op de pagina
+staat de node vervangen door een `wrapWithModel(...)`-instantie. Acties, custom
+functions, App State-schrijfacties en custom actions komen **allemaal schoon mee**.
+- ⚠️ **Wat NIET meekomt: alles wat naar buiten het geconverteerde blok wijst.**
+  Twee soorten, allebei gemeld in het Issues-paneel:
+  1. Een **page state**-veld wordt omgezet naar een *Update Component State*-actie
+     met veldnaam **"Removed Field"** — de actie blijft dus staan, alleen het veld
+     ontbreekt. Fix: op de component-root **+ Add Field** (Boolean, Initial Value
+     expliciet zetten) → in de actie *Remove* op de kapotte rij → *Add Field* →
+     het nieuwe veld → *Select Update Type* (bv. **Toggle Value**).
+  2. Een **"Clear Text Fields/Pin Codes"**-actie die een widget buiten het
+     component wist. Die geeft een **harde compile-error**
+     (`The getter 'textController' isn't defined`) terwijl **`export-code` gewoon
+     slaagt** — je merkt het dus pas bij de build. Draai na elke conversie
+     `dart analyze`, niet alleen een export.
+- **Vuistregel: converteer het hele samenhangende blok in één keer.** Hoort er een
+  `TextField` bij een knop, wrap ze eerst samen in een `Column` en converteer die —
+  dan wijst niets meer naar buiten en zijn beide fouten er nooit.
+- Een actie tijdelijk onschadelijk maken kan met **⋮ op de actie-node → Disable
+  Action** (netter dan verwijderen). Let op: een disabled actie zonder geldig doel
+  telt daarna als fout *"Action Configuration — Action not defined"*.
+
+**Een component zijn pagina laten herbouwen: "Update Page on Changes" op de
+INSTANTIE.** Staat in het rechterpaneel van de component-instantie onder
+**Component Properties** (naast *Use Hero Animation*), en genereert
+`updateOnChange: true` in de `wrapWithModel(...)`. Bewezen 2026-09-20. Dit is het
+mechanisme waarmee elk component al werkt: elke `*_widget.dart` override `setState`
+met `super.setState(callback); _model.onUpdate();`, en `onUpdate()` roept de
+pagina's `safeSetState` aan — **maar alleen als deze toggle aanstaat**. Stond in dit
+project tot 2026-09-20 nergens aan (0 treffers op `updateOnChange: true`).
+**Nodig zodra een component App State zet waar de pagina zelf op reageert** (een
+filterbalk die de lijstparameters van de pagina bepaalt, een conditie op een widget
+buiten het component). Zonder de toggle verandert de App State wel, maar bouwt de
+pagina niet opnieuw en zie je niets gebeuren.
+
 **Widget kopiëren/plakken werkt NIET via browser-automation — dood
 spoor, niet opnieuw proberen.** Bevestigd 2026-09-01: "Copy Widget" +
 "Paste Widget" uit het ⌘+K-palet, én de sneltoetsen Ctrl+C/Ctrl+V op

+ 1 - 1
TASKS.md

@@ -32,7 +32,7 @@ Google Play en één doorloop die alleen Bob kan doen.
 
 | **112** | `Selectprovinciegemeente` / `SelectStateDropDownComponent` opknappen | **Eigenaar: Claude — bezig (2026-09-20).** (a) hartje-tekst → "Maak favoriet" / "Favoriet"; (b) mailtekst `24bdnkhi` weg; (c) favorietenlijst van `Wrap` → `Column` met echte rijen (speldje + naam + chevron, witte rij, scheidingslijn) onder de kop "of kies een favoriet"; (d) hartje-status synchroniseren met de serverlijst (`favorieteGemeenteIds` wordt nu nooit vanaf de server gevuld); (e) kop+lijst achter de ingelogd-conditie; (f) lege `drupalRequest('GET','','','','','')` uit de On-Component-Load-keten |
 
-| **113** | Filterbalk (zoek + datum + chips) ook op `PUitgaanPage` | **Eigenaar: Claude — bezig (2026-09-20).** `PUitgaanPage` bedient **provincie én gemeente** (10 drawer-ingangen: 5 categorieën × `provincieSelectId`/`gemeenteSelectId`) — één keer bouwen dekt beide. Drupal is al klaar: gemeten op productie dat `townid` samen met `datum_van`/`datum_tot`/`zoek` werkt op plaats- (28695), gemeente- (28694) én provincie-tid (28666), mét tegencontrole `onzinparam=123` → ongewijzigd. Nog te doen in de app: (1) `UitgaanstabelCall` 3 variabelen + query-parameters erbij; (2) `PUitgaantabelKaartComponent` 3 parameters (Required **uit**) + binden in de Backend Query; (3) filterbalk op de pagina. Onderzoeksstap loopt: werkt *Convert to Component* op het filterblok in `homeCopy`? |
+| **113** | Filterbalk (zoek + datum + chips) ook op `PUitgaanPage` | **Eigenaar: Claude — bezig (2026-09-20).** `PUitgaanPage` bedient **provincie én gemeente** (10 drawer-ingangen: 5 categorieën × `provincieSelectId`/`gemeenteSelectId`) — één keer bouwen dekt beide. **Drupal is al klaar**: gemeten op productie dat `townid` samen met `datum_van`/`datum_tot`/`zoek` werkt op plaats- (28695), gemeente- (28694) én provincie-tid (28666), mét tegencontrole `onzinparam=123` → ongewijzigd. **Onderzoek af (2026-09-20): *Convert to Component* werkt** — bewezen op `homeCopy`, recept + valkuilen staan in `CLAUDE.md`. Ook bewezen: **"Update Page on Changes"** op de instantie genereert `updateOnChange: true` (nodig, anders rebuildt de pagina niet). Testcomponent `FilterBalkKanweg` staat er nog; project schoon achtergelaten (0 analyze-errors, Issues terug op 2). **Bouwstappen:** (1) op **Home** `Row` wrappen in een `Column` + `TextField` erin slepen, dán *Convert to Component* → `FilterBalkComponent`; (2) in dat component component-state `zoekOpen` (Boolean, false) + zoekknop → *Update Component State* → **Toggle Value**, en de *Clear Text Fields*-actie opnieuw op het TextField richten; (3) slider-verstopconditie op Home hangt aan `textFieldFocusNode.hasFocus` — die wijst na conversie naar buiten, dus omzetten naar een App State-boolean of naar `zoekOpen`; (4) `UitgaanstabelCall` 3 variabelen + query-parameters erbij; (5) `PUitgaantabelKaartComponent` 3 parameters (**Required uit**, anders `!`-crash) + binden in de Backend Query; (6) `PUitgaanPage`: component erin, waarden doorgeven via `filterDatumVan`/`filterDatumTot`, **Update Page on Changes aan**. Verifieer met `dart analyze`, niet alleen met een export — de conversiefout die de build brak liet de export gewoon slagen |
 
 ## 👤 BOB — OPEN, in volgorde van wat de livegang blokkeert