ソースを参照

TASKS.md + CLAUDE.md: P1-7 volledig afgerond, nieuw Custom-Function-recept voor JSON-body-met-variabele vastgelegd

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 3 週間 前
コミット
0a9adb4b4b
2 ファイル変更75 行追加50 行削除
  1. 24 0
      CLAUDE.md
  2. 51 50
      TASKS.md

+ 24 - 0
CLAUDE.md

@@ -473,6 +473,30 @@ dat al bevestigd werkt.
 
 ## FlutterFlow-builder: bekende problemen & patronen
 
+**Een letterlijke tekst met 1 ingesloten variabele (bv. een JSON-body
+`{"entity_id": <nid>, "entity_type": "node"}`) als waarde van een
+Custom-Action-String-argument: geen concatenatie-optie in het
+argumentenpaneel — bouw een kleine Custom Function.** Bevestigd
+2026-08-24/25 (P1-7 Restpunt A, horeca-hartjes Drupal-sync): het
+"Value"-veld van een Custom Action-argument (bv. `drupalRequest`'s
+`body`) accepteert óf vrije typetekst (puur literal) óf een volledige
+vervanging door 1 variabele via het icoontje naast "Value" (Set
+Variable-dialoog) — nooit allebei tegelijk. De dialoog's "Source"-lijst
+toont wel een optie **"Combine Text"**, maar niet verder onderzocht
+(bleek niet nodig zodra de Custom-Function-route werkte). **Werkende
+oplossing:** een nieuwe Custom Function toevoegen (Custom Code-tab → 
+`+` → Function), bv. `String favorietenBodyNode(String nid) => '{"entity_id":
+' + nid + ', "entity_type": "node"}';` — daarna is die functie gewoon
+kiesbaar als waardebron in het Value-icoontje-dialoog (Source →
+**Custom Functions**), met een eigen geneste Set-Variable-stap per
+functie-argument om dat argument aan de juiste component-/page-
+parameter te binden. Zelfde procedure ook bruikbaar voor andere
+"body/URL met 1 variabele"-gevallen. **Bijvangst:** de geneste
+Set-Variable-dialoog (voor het functie-argument) liep hier 2x tegen de
+al bekende freeze aan (zie hieronder) — sleep 'm bij twijfel meteen
+omhoog (drag op de titelbalk) vóórdat je gaat zoeken, dat voorkwam de
+freeze in de 3e/4e poging elke keer.
+
 **Een pagina die nog geen `Drawer`/`AppBar` heeft alsnog toevoegen
 (bv. een pagina zonder header/hamburger-menu): via slepen, niet via
 rechtsklik.** Gevonden 2026-08-19 (Favorieten-pagina miste een

+ 51 - 50
TASKS.md

@@ -1,6 +1,26 @@
 # Uitgaanskrant — takenlijst
 
-**Deze sessie (2026-08-23, sessie 45, code-only + Bob aanwezig achter
+**Deze sessie (2026-08-24/25, sessie 46, builder via Bob's gedeelde
+Chrome na expliciet akkoord in de chat, Bob gelijktijdig zelf actief op
+P2-7):** P1-7 volledig afgerond — **Restpunt A** (horeca-hartjes op
+`HorecagelegenheidoverzichtKaart` + `HorecagelegenheidCurrent` syncen nu
+ook naar Drupal via het bestaande `favorieten`-endpoint, zelfde patroon
+als het gemeente-hartje) en **Restpunt B** ("Wachtwoord wijzigen"-link
+op de Gebruiker-tab). Nieuw herbruikbaar recept ontdekt en vastgelegd
+in `CLAUDE.md`: een JSON-body-string met 1 ingesloten variabele bouw je
+via een kleine Custom Function (`favorietenBodyNode`), niet via het
+Custom-Action-argumentenpaneel zelf (geen concatenatie-optie op een kaal
+String-argument). Bevestigd via verse export (`flutter analyze`: 0
+errors) + een live `ff-run-fvm.sh`-build/launch op emulator-5554 (geen
+exceptions). Onderweg 2x geblokkeerd op de bekende geneste-Set-Variable-
+freeze, beide keren opgelost met een page-reload zonder dataverlies.
+P1-7 blijft als taak staan (Tab 1's categorie-SQL-patch wacht nog op
+Bob's bevestiging, zie hieronder) maar heeft geen eigen openstaande
+Claude-actie meer.
+
+---
+
+**Vorige sessie (2026-08-23, sessie 45, code-only + Bob aanwezig achter
 zijn scherm, geen builder-automation zelf uitgevoerd — Bob pakt de
 resterende builder-stappen zelf op in een andere chat):** takenlijst
 doorgelopen op zoek naar zelfstandig oppakbaar werk — bleek vrijwel
@@ -1580,55 +1600,36 @@ leek overbodige scope-uitbreiding.)*
     dat hier geverifieerd is). Enige resterende twijfel over deze hele
     feature — verder geen actie nodig tenzij Bob over ~30 dagen wil
     controleren dat de sweep echt draait.
-- **Restpunt A — horeca-hartjes syncen nog niet naar Drupal (2026-08-24,
-  Claude, code-only geverifieerd via `grep`).** Het generieke
-  `favorieten`-Services-endpoint (flag/unflag, node + taxonomy_term)
-  bestaat sinds P1-26 en wordt al gebruikt door het gemeente-hartje op
-  `HeaderButtonsComponent` — maar de twee oudere horeca-hartjes
-  (`horecagelegenheidoverzicht_kaart_widget.dart:340`,
-  `horecagelegenheid_current_widget.dart:370`) doen nog steeds alleen
-  een lokale `FFAppState().favorieteHorecaNids`-add/remove, geen
-  `drupalRequest`-aanroep — botst met Bob's beslissing 1 hieronder
-  ("Drupal-gesynchroniseerd, niet puur lokaal"). **Kant-en-klaar
-  builder-recept (kopieer 1-op-1 het al werkende gemeente-hartje-
-  patroon), per widget in de If-tak (remove) en Else-tak (add) van de
-  bestaande `ConditionalBuilder` een extra actie toevoegen vóór/na de
-  bestaande `removeFromFavorieteHorecaNids`/`addToFavorieteHorecaNids`:**
-  - Add Action → Custom Action → `drupalRequest`, argumenten:
-    `method` = `'POST'`, `url` =
-    `'https://uitgaanskrant.com/nl/flutterdrup/favorieten/flag.json'`
-    (If-tak/add) of `.../favorieten/unflag.json` (Else-tak/remove),
-    `sessionName` = App State `userSessionname`, `sessionId` = App
-    State `userSessionid`, `token` = App State `userToken`, `body` =
-    letterlijk `{"entity_id": <nid-component-parameter>, "entity_type":
-    "node"}` (dubbele quotes escapen als `\"`, zelfde format als
-    `header_buttons_component_widget.dart:228`).
-  - **Let op:** dit vuurt nu ook voor een uitgelogde gebruiker (lege
-    sessie) — `drupalRequest` faalt dan stil (403, teruggegeven als
-    `[]`, geen crash) en de lokale toggle blijft gewoon werken, dus
-    functioneel geen regressie, maar wel een onnodige netwerkcall.
-    Desgewenst wrappen in een Conditional op `userSessionid` "Is Set",
-    net als elders in dit bestand — niet strikt noodzakelijk voor
-    correctheid.
-  - Bouw dit op **beide** widgets (overzicht-kaart én detailpagina) in
-    dezelfde sessie — zelfde patroon, twee plekken, past bij de
-    "groepeer per paginagebied"-vuistregel.
-  - Geen `is_flagged`-sync-on-load nodig (zelfde bewuste keuze als bij
-    het gemeente-hartje, zie de P1-26-notitie hierboven) — lokale lijst
-    blijft de bron van waarheid bij page-load, dit voegt alleen de
-    write-sync toe.
-- **Restpunt B — "Wachtwoord wijzigen" ontbreekt nog op de
-  Gebruiker-tab (2026-08-24, Claude, code-only geverifieerd).** Kleiner
-  dan gedacht: er bestaat al een volledig werkende
-  `lib/wachtwoord_vergeten/`-pagina (roept `RequestNewPasswordCall` aan,
-  POST naar `.../user/request_new_password.json`) — nergens in de app
-  aan een knop gekoppeld. **Simpelste/snelste route: geen nieuwe flow
-  bouwen, gewoon een `ListTile` "Wachtwoord wijzigen" op de
-  Gebruiker-tab toevoegen** (dupliceer de bestaande "Uitloggen"/
-  "Account verwijderen"-ListTile, zelfde styling, zie het bekende
-  Duplicate-recept in `CLAUDE.md`) met On Tap → Navigate To →
-  `wachtwoordVergeten`-pagina (geen parameters nodig). Kost een paar
-  minuten in de builder, geen Drupal-werk.
+*(Restpunt A — horeca-hartjes Drupal-sync — volledig afgerond
+2026-08-24/25, Claude, builder + verse-export-verificatie + live
+smoke-test op emulator-5554 (build/launch zonder exceptions).** Beide
+widgets (`horecagelegenheidoverzicht_kaart_widget.dart`,
+`horecagelegenheid_current_widget.dart`) roepen nu bij add/remove ook
+`actions.drupalRequest('POST', '.../favorieten/flag.json'` resp.
+`unflag.json', FFAppState().userSessionname, userSessionid, userToken,
+functions.favorietenBodyNode(widget!.nid!)!)` — zelfde patroon als het
+al werkende gemeente-hartje. **Nieuw hulpmiddel:** een letterlijke JSON-
+body met een ingesloten variabele (`{"entity_id": <nid>, "entity_type":
+"node"}`) bleek via de Custom-Action-argumentenpanel niet direct te
+bouwen (geen concatenatie-optie op een kaal String-argument, alleen een
+volledige literal-of-variabele-vervanging) — opgelost met een nieuwe
+kleine **Custom Function** `favorietenBodyNode(String nid) -> String`
+(`lib/flutter_flow/custom_functions.dart`, retourneert de body-string
+via Dart-stringconcatenatie), die vervolgens gewoon als waardebron voor
+het `body`-argument gekozen kan worden (Set Variable-dialoog → Custom
+Functions). Herbruikbaar patroon voor een volgend geval van
+"JSON-body met 1 variabele" — zie ook de bijgewerkte
+"Geneste Set-Variable-dialoog"-notitie hierboven. Onderweg 2x de bekende
+bevroren-geneste-dialoog-freeze geraakt (beide keren opgelost met een
+page-reload, geen dataverlies — de al bevestigde argumenten bleven
+staan). Uit deze lijst verwijderd.)*
+*(Restpunt B — "Wachtwoord wijzigen"-link — volledig afgerond
+2026-08-24/25, Claude, builder + verse-export-verificatie.** Nieuwe
+`ListTile` "Wachtwoord wijzigen" op de Gebruiker-tab (gedupliceerd van
+"Uitloggen"), On Tap → Navigate To → `wachtwoordVergeten`-pagina
+(Allow Back Navigation aan, geen parameters). Gebruikt de al bestaande
+`lib/wachtwoord_vergeten/`-pagina/`RequestNewPasswordCall`, geen nieuw
+Drupal-werk nodig. Uit deze lijst verwijderd.)*
 
 **Bob's beslissingen (2026-08-09, nog steeds leidend):**
 1. Favorieten (zowel horeca als gemeenten) worden **Drupal-gesynchroniseerd**,