Browse Source

Taak 127-B en 127-C: kloon-infra en de Kopie-knop staan

127-B (infra), alles geverifieerd met een verse export:
- App State kloonBron (JSON, niet persisted)
- custom functions kloonTekst/kloonLijst, beide non-nullable return
- API Call AanmeldingKloonbron met 'Cookie': '${sessionName}=${sessid}'

127-C: knop "Kopie" op de MijnAanmeldingen-kaart. De kaart-Column is eerst in
een Column gewrapt zodat de knop buiten de bestaande InkWell valt; anders had
een tik op de knop ook naar EventCurrent genavigeerd.

De actieketen: Backend Call -> (Succeeded) -> Update App State kloonBron ->
conditie op page parameter `type` -> Navigate naar uitgaansevenementAanmaken
(met horecagelegenheidNid) of stadsactiviteitAanmaken. dart analyze: 0 errors.

De nid-binding hangt aan aanmeldingItemItem (het loop-item), niet aan de hele
respons - precies de valkuil die in CLAUDE.md staat.

CLAUDE.md: staande regel vastgelegd dat Claude niet aan Drupal komt; alleen
lezen mag, elke schrijvende actie doet Bob zelf.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 5 hours ago
parent
commit
ca3fea1da4
2 changed files with 52 additions and 3 deletions
  1. 11 0
      CLAUDE.md
  2. 41 3
      TASKS.md

+ 11 - 0
CLAUDE.md

@@ -5239,6 +5239,17 @@ minder calls per scherm, niet in Views.
   betekent "route bestaat, sessie ontbreekt", 404 betekent "resource niet
   aangezet". Dat onderscheid scheelt zoeken in de verkeerde hoek.
 
+**⚠️ CLAUDE KOMT NIET AAN DRUPAL — staande regel, Bob expliciet 2026-09-21:
+"ik doe altijd drupal dingen. jij mag niet bij drupal!"** Claude mag op de server
+alléén **lezen** (`grep`/`sed`/`drush php-eval` voor metingen, een droogdraai die
+aantoonbaar niets wijzigt). Elke **schrijvende** actie — een `.inc`/`.module`
+patchen, `drush php-script ... doen`, `cc all`, een view of endpoint wijzigen —
+doet **Bob zelf**, ook als Claude schrijfrechten heeft (de ssh-gebruiker `o1` is
+eigenaar van die bestanden, dus "het kan" is geen argument). Claude levert een
+kant-en-klaar script mét droogdraai, backup en terugrol-regel, zet het in
+`~/tmp/` op de server, en geeft Bob het commando — verder niets. Dit geldt ook
+wanneer Bob in dezelfde sessie "ja" zei tegen bouwen aan de app-kant.
+
 **⚠️ Een drush-script dat Claude schrijft moet eerst NAAR AEGIR1 — drush draait
 niet op Bob's desktop.** Kostte 2026-09-20 een hele ronde: het script stond in
 `/home/bob/Projects/`, Bob draaide op de server het gelijknamige oude script uit

+ 41 - 3
TASKS.md

@@ -664,9 +664,47 @@ met taak 124 — samen oppakken.
 
 ### 127 · "Kopie"-knop op `MijnAanmeldingen` — evenement én activiteit klonen
 
-**Eigenaar: Claude — bezig** (sessie 2026-09-21). 127-A is AF: Bob heeft de
-Drupal-patch op productie gezet en runtime geverifieerd (`entree_tid 36197`,
-`logo_url` gevuld, `keten 28666|28737|28739`).
+**Eigenaar: Claude — bezig** (sessie 2026-09-21).
+
+**AF en export-geverifieerd:**
+- **127-A** (Drupal, door Bob): `entree_tid 36197`, `logo_url` gevuld,
+  `keten 28666|28737|28739`.
+- **127-B** (infra): App State **`kloonBron`** (JSON, niet persisted); custom
+  functions **`kloonTekst`** / **`kloonLijst`**, beide met een non-nullable
+  return; API Call **`AanmeldingKloonbron`** (top-level, GET, absolute URL) met
+  `'Cookie': '${sessionName}=${sessid}'` — echte interpolatie.
+- **127-C** (de knop): `Kopie` op de `MijnAanmeldingen`-kaart, buiten de
+  bestaande `InkWell` (de kaart-Column is gewrapt in een Column). Volledige
+  keten staat en `dart analyze` geeft **0 errors**:
+
+```dart
+_model.apiResulttzz = await AanmeldingKloonbronCall.call(
+  sessionName: FFAppState().userSessionname,
+  sessid: FFAppState().userSessionid,
+  nid: getJsonField(aanmeldingItemItem, r'$.nid').toString(),
+);
+if ((_model.apiResulttzz?.succeeded ?? true)) {
+  FFAppState().kloonBron = (_model.apiResulttzz?.jsonBody ?? '');
+  if (widget!.type == 'go_out_event') {
+    context.pushNamed(UitgaansevenementAanmakenWidget.routeName,
+      queryParameters: {'horecagelegenheidNid': ... r'$.horecagelegenheidnid' ...});
+  } else {
+    context.pushNamed(StadsactiviteitAanmakenWidget.routeName);
+  }
+}
+```
+
+ℹ️ FlutterFlow genereert bij een Backend Call **zelf** een
+`apiResulttzz -> Succeeded`-conditional; die is blijven staan, dus er wordt
+alleen genavigeerd als de call slaagt. Meegenomen winst, niet apart gebouwd.
+
+**Restpunten op 127-C:** de knop is nog FlutterFlow-rood (`primary`); voorstel is
+`secondaryBackground` + `primaryText` met Border Radius 8, zoals de chips op Home
+(rood is merk, niet actie — zie het merk-DNA in `CLAUDE.md`). En de i18n-sleutel
+`g4pbs1et` ("Kopie") heeft nog geen Engelse vertaling.
+
+**Nog te doen:** 127-D (evenementformulier, 14 bindingen), 127-E (activiteiten,
+na 124), 127-F (`kloonBron` wissen op 4 plekken).
 
 **Wens Bob (2026-09-20):** op elke kaart in *Mijn aanmeldingen* een knop **Kopie**.
 Eén tik opent het aanmaakformulier volledig ingevuld; de gebruiker vult de datum