Pārlūkot izejas kodu

133: Kopie-knop verkleind op drie plekken (A + B + tooltips)

mijnProfiel (2x): ListTile in een Container(oo) in een Stack, met een
FlutterFlowIconButton (34, primaryBackground, content_copy 20 in secondary)
rechts in de rij. Chevron weg, contentPadding rechts 12 -> 52. De Replace
van Button naar IconButton hield de hele actieketen intact, inclusief de
loop-item-bindingen.

MijnAanmeldingen: de knop blijft een FFButtonWidget maar is nu een compacte
chip (h28, padding 10, radius 14, oranje rand en tekst, content_copy 14),
rechts uitgelijnd met 12 px rechterpadding.

Alle drie de tooltips op long-press. Geverifieerd met een verse export:
0 analyse-errors, tellingen kloppen, actieketens en navigatieparameters intact.

Rest voor Bob: 2 Engelse tooltipteksten staan op "Copy to a new activity" en
moeten "Copy to a new event" worden -- het vertaalpaneel opende daar
consequent de verkeerde sleutel. Details in TASKS.md 133.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 dienu atpakaļ
vecāks
revīzija
036af097c5
2 mainītis faili ar 86 papildinājumiem un 102 dzēšanām
  1. 50 0
      CLAUDE.md
  2. 36 102
      TASKS.md

+ 50 - 0
CLAUDE.md

@@ -4905,6 +4905,56 @@ Insert-dropdown → `Button` typen → de kaart onder *Top Results*.
   volgende. Blind op de onthouden y klikken landde hier drie keer op *Insert
   Widget*, wat een heel ander paneel opent. `Ctrl+B` als sneltoets werkte niet.
 
+**✅ Maar in een `Stack` mag een `ListTile` WEL — mits je hem eerst in een
+`Container` met breedte ∞ wrapt. Zo zet je een knop ín een lijstregel in plaats
+van eronder.** Volledig recept, 2026-09-23 twee keer foutloos herhaald
+(taak 133, de Kopie-knoppen op `mijnProfiel`):
+1. `ListTile` → Wrap Widget → **Container**, Width op **∞** (het ∞-knopje in het
+   Width-veld; dat is een toggle, dus één klik). Die Container vangt precies op
+   waar de Row-variant hierboven op stukloopt.
+2. Die `Container` → Wrap Widget → **Stack**. Geen "Invalid Action", ook niet
+   met de ListTile erin.
+3. De bestaande knop de `Stack` in slepen (drop = positie 0), daarna de
+   `Container` óók op de `Stack`-rij droppen zodat de volgorde
+   `[Container, knop]` wordt — anders ligt de knop áchter de rij en vangt de
+   ListTile alle taps. Eén sleep per tool-aanroep, verse `zoom` ertussen; een
+   sleep die niet landt laat de bronrij gedimd achter en lukt bij de tweede keer.
+4. Verhoog de **`contentPadding` rechts** van de ListTile (hier 12 → 52), anders
+   loopt een lange titel onder de knop door.
+5. Het trailing-chevron kan dan weg: filter het rechterpaneel op `trailing` en
+   klik de **X** naast de icoonnaam (niet de icoonkiezer zelf).
+De Alignment van de knop (X=1, Y=0) regelt de plaatsing in de Stack; daar is
+geen aparte `Align`-wrap voor nodig, want elk widget heeft die sectie al.
+
+**✅ `Replace Widget` op een `Button` biedt `IconButton` én `Icon`, en behoudt de
+VOLLEDIGE actieketen — inclusief loop-item-bindingen.** Bevestigd 2026-09-23,
+twee keer: een `FFButtonWidget` met een Backend Call (`AanmeldingKloonbronCall`),
+een conditie en een `pushNamed` met parameters die allemaal aan
+`getJsonField(<loop-item>, …)` hingen, kwam er ongeschonden uit als
+`FlutterFlowIconButton`. Dit is dus de veilige route wanneer je een knop van type
+wilt wisselen — **nooit Copy/Paste Action Chain**, want dat verliest juist die
+loop-item-bindingen (zie de waarschuwing elders in dit bestand). Controleer na de
+Replace wel even de export op de `pushNamed`-parameters; het kostte hier één
+grep en bevestigde dat er niets weg was.
+
+**⚠️ Het vertaalpaneel achter de globe kan structureel een ANDERE i18n-sleutel
+tonen dan het properties-paneel — en een paginaherlaad helpt daar niet tegen.**
+Bevestigd 2026-09-23 op twee `Tooltip`-widgets die vlak na elkaar met Wrap Widget
+waren aangemaakt: het properties-paneel toonde *"Kopieer naar een nieuw
+evenement"*, de globe opende het record van *"Kopieer naar een nieuwe
+activiteit"*. Zes pogingen, waaronder een volledige herlaad en een geforceerde
+selectiewissel via een andere node, gaven elke keer hetzelfde. Dit is iets anders
+dan de bekende "klik de globe niet te snel na een selectiewissel"-valkuil (die
+herstelt wél na wachten). **Gevolg: typ in zo'n geval niets** — je bewerkt dan de
+verkeerde sleutel — maar noteer de sleutels uit een verse export en draag ze over
+aan Bob, die via App Settings → Languages wél bij alle records kan.
+- Bijvangst uit dezelfde sessie: **een nieuwe vertaalsleutel erft de Engelse
+  tekst van een eerder aangemaakte sleutel met dezelfde strekking**, en een
+  bewerking kan meerdere sleutels tegelijk raken. Controleer een vertaalronde dus
+  altijd met een `grep` op `internationalization.dart` per sleutel, niet op de
+  tekst — drie sleutels stonden hier op dezelfde Engelse waarde terwijl de
+  Nederlandse verschilden.
+
 **Een verse `ListTile` komt met `title: 'Title'` én `subtitle: 'Subtitle'` — die
 subtitle moet je expliciet leegmaken, anders staat er letterlijk "Subtitle" in de
 app.** De Subtitle-sectie valt bij een 935px-venster onder de vensterrand; klap

+ 36 - 102
TASKS.md

@@ -27,7 +27,7 @@ Google Play en één doorloop die alleen Bob kan doen.
 | # | Taak | Kort |
 |---|---|---|
 | **FOTOBOEK** | Fotoboek: foto's kiezen uit Drupal + beheren | **Claude — bezig** (2026-09-22/23). **Drupal AF.** **App: de logo-knop op `uitgaansevenementAanmaken` is KLAAR en export-geverifieerd** — één knop *Logo kiezen* → `Confirm Dialog` ("Waar komt het logo vandaan?", knoppen **Fotoboek** / **Mobiel**) → conditional op `confirmDialogResponse`: TRUE = bottom sheet 85 % met `FotoboekGridComponent` (callback `bijKeuze(fid, url)` zet `createLogoFid`/`createLogoUrl`), FALSE = de bestaande upload-keten. Let op: wegklikken van de dialoog telt als **Mobiel** (FlutterFlow genereert `?? false`). **⚠️ EERST (Bob, 2 kliks, dan is de dubbele knop weg): verwijder `ButtonFotoboekLogo`** (de knop *Uit fotoboek* naast *Logo kiezen*, staat in de tree onder `Row`) **en de dode inline `Container`** onderaan diezelfde Column (`if (_model.fotoboekOpen)`, 300 dp hoog, roept het component aan met een lege callback). Daarna mogen ook de page states **`fotoboekOpen`** en **`fotoboekDoel`** weg. **Rest:** (a) uitrollen naar de 3 andere upload-plekken — foto's hier (⚠️ vraagt een **derde callback-argument** `urlTekst` (String), want `createFotosUrls` is `List<String>` en het huidige `url`-argument is *Image Path*), plus logo + foto's op `stadsactiviteitAanmaken`; (b) 5e tab "Mijn foto's" op `mijnProfiel` voor beheer/verwijderen; (c) cosmetica: zoekveld boven de grid i.p.v. eronder (2 sleeppogingen mislukt) + Hint Text "Zoek op bestandsnaam" + EN-vertaling. **Opruimen (Bob):** wegwerp-component `FotoboekGridComponentCopy`. Endpoint-spec + builder-recepten staan in `CLAUDE.md` |
-| **133** | Kopie-knop verkleinen (mijnProfiel 2x + MijnAanmeldingen) | **Claude — bezig** (plan af 2026-09-22, wacht op groen licht voor de browser). Variant A (icoon in de rij) op `mijnProfiel`, variant B (compacte chip) op `MijnAanmeldingen`, tooltip erbij, kleuren meteen goed. Volledig plan + terugvalopties onderaan dit bestand |
+| **133** | Kopie-knop verkleinen — **AF**, één restpunt voor Bob | Variant A (icoonknop in de rij) op `mijnProfiel` 2×, variant B (oranje chip) op `MijnAanmeldingen`, tooltips op long-press, kleuren op thema-tokens. Geverifieerd met een verse export, 0 analyse-errors. **Rest: 2 Engelse tooltipteksten** die Claude via de globe niet kon corrigeren — zie het 133-blok onderaan |
 | **G0.6** | Play-screenshots | ✅ Nieuwe set van 10 klaar (2026-09-19 avond). Alleen `tel-04-horeca.png` moet over zodra *Show Test Ads* uit staat |
 
 | **112** | Restje zoek-stad: lege API-call opruimen | **Eigenaar: Bob.** `SelectStateDropDownComponent` → Actions → On Page Load → *Conditional Action 5* (`gemeenteSelectId is set/non-empty`) → TRUE-tak → **Action 13, Custom Action `drupalRequest`** met url/sessionName/sessionId/token/body allemaal Unset. Staat sinds 2026-09-20 op **disabled**; kan weg via ⋮ → Delete Action. Vlak eronder staat **Conditional Action 16** (`apiGemeenteResultInitalize -> Succeeded`) met twee lege takken — mag in dezelfde moeite weg |
@@ -1157,112 +1157,46 @@ Aandachtspunten die nu al bekend zijn:
    Nakijken of de Nederlandse labels via zijn eigen i18n-configuratie gaan (dus
    níét via de globe uit `internationalization.dart`).
 
-## 🔁 133 · Kopie-knop verkleinen (3 plekken) · Eigenaar: **Claude — bezig** (plan af 2026-09-22, wacht op groen licht voor de browser)
+## 🔁 133 · Kopie-knop verkleinen — **AF** (2026-09-23), één restpunt
 
-Besluit Bob 2026-09-22: de `Kopie`-knop onder de kaarten is te groot. **Variant A**
-(icoon ín de rij) op `mijnProfiel`, **variant B** (compacte chip) op
-`MijnAanmeldingen`, met tooltip, en de kleuren meteen goed.
+Besluit Bob 2026-09-22: de `Kopie`-knop onder de kaarten was te groot. Variant A
+(icoon ín de rij) op `mijnProfiel` 2×, variant B (compacte chip) op
+`MijnAanmeldingen`, tooltip erbij, kleuren op thema-tokens. Alles gebouwd en met
+een verse export geverifieerd (`dart analyze` 0 errors).
 
-**Waarom hij zo groot oogt:** alle drie de knoppen hebben
-`color: secondaryBackground` op een kaart die zelf óók `secondaryBackground` is —
-een onzichtbaar vlak van 40 dp met alleen het woord "Kopie" erin.
+**Wat er nu staat**
 
-### Waar het zit (verse export 2026-09-22)
+| plek | structuur | knop |
+|---|---|---|
+| `mijnProfiel` evenementen (r623) | `Stack [ Container(∞) > ListTile, Align(1,0) > Padding(r4) > Tooltip ]` | `FlutterFlowIconButton` 34, `primaryBackground`, `content_copy` 20 in `secondary` |
+| `mijnProfiel` stadsactiviteiten (r1466) | idem | idem |
+| `MijnAanmeldingen` (r394) | `Align(1,0) > Tooltip > Padding(r12) > FFButtonWidget` | chip h28, padding 10, radius 14, `borderSide` 1 px `secondary`, `bodySmall` + `secondary`, icoon `content_copy` 14 |
+
+Beide ListTiles: trailing chevron weg, `contentPadding` rechts 12 → **52** zodat
+een lange titel niet onder de knop loopt. Alle drie de tooltips staan op
+`TooltipTriggerMode.longPress` (niet tap — de knop heeft zelf een onTap).
+De actieketens zijn intact: `AanmeldingKloonbronCall` + `pushNamed` met de
+loop-item-bindingen (`aanmeldingItemItem`) er nog aan.
+
+### ⚠️ Restpunt · Eigenaar: **Bob** — twee Engelse tooltipteksten
 
-| # | Bestand | Structuur nu | i18n |
+Deze twee staan op de **verkeerde** Engelse tekst en moeten naar
+*"Copy to a new event"* (de Nederlandse is bij beide correct):
+
+| sleutel | staat op `mijnProfiel`/`MijnAanmeldingen` | nl | en (fout) |
 |---|---|---|---|
-| 1 | `mijn_profiel_widget.dart:617` (evenementen) | `Column [ ListTile(+chevron), Align(1,0) > Button ]` | `oxse6aci` |
-| 2 | `mijn_profiel_widget.dart:1430` (stadsactiviteiten) | idem | `wcyy4pao` |
-| 3 | `mijn_aanmeldingen_widget.dart:386` | `Column [ Padding>Column(logo/titel/datum/status), Button ]`, knop **gecentreerd** (geen `width`) | `g4pbs1et` |
-
-Knop-opties op alle drie identiek: `height 40`, `padding 16/0/16/0`,
-`color secondaryBackground`, `titleSmall` + `primaryText`, `elevation 0`,
-`borderRadius 8`.
-
-### Doelstijl
-
-- **A (plek 1 en 2):** `FlutterFlowIconButton`, `content_copy`, `buttonSize 34`,
-  `icon size 20`, `borderRadius 8`, **Fill Color `primaryBackground`**,
-  **Icon Color `secondary`** (#FF680D — merk-DNA: oranje = actie). Rechts ín de
-  rij, met **8 dp rechtermarge** (zie 132-E). De chevron (`arrow_forward_ios_rounded`)
-  vervalt: puur decoratief, de hele rij is al tikbaar.
-- **B (plek 3):** de `Button` blijft, maar `height 40 → 28`, `padding 16 → 10`,
-  `borderRadius 8 → 14` (pil), `titleSmall → bodySmall`, **tekstkleur `secondary`**,
-  **`borderSide` 1 px `secondary`**, Fill Color op **transparant**, en een
-  **icoon `content_copy`** vóór de tekst (`iconPadding` links 0, rechts 4).
-  Daarna `Align(1,0)` eromheen + 12 dp rechterpadding.
-- **Tooltip** op alle drie (Wrap Widget → 4e rij, 1e icoon), `triggerMode`
-  **longPress** (niet tap — de knop heeft zelf al een onTap, anders dan het
-  favorietenhartje op `HorecagelegenheidCurrent`).
-  Referentiepatroon: `horecagelegenheid_current_widget.dart:336-437`.
-
-### Teksten (nieuwe i18n-sleutels via de globe)
-
-| plek | NL | EN |
-|---|---|---|
-| 1 en 3 | Kopieer naar een nieuw evenement | Copy to a new event |
-| 2 | Kopieer naar een nieuwe activiteit | Copy to a new activity |
-
-Bij A verdwijnt de knoptekst; `oxse6aci` en `wcyy4pao` blijven dan leeg staan
-(niet erg — een lege `en` valt niet terug op NL, maar er is ook geen NL meer).
-Bij B blijft `g4pbs1et` = Kopie/Copy gewoon staan.
-
-### Stappen — plek 1 en 2 (variant A)
-
-1. Tree-filter `ListTile` → de juiste node (1e = evenementen, 2e = stadsactiviteiten).
-2. `ListTile` → Wrap Widget → **Container**, breedte op **∞** (het ∞-knopje in
-   het Width-veld; let op: dat is een toggle, één klik).
-3. Die `Container` → Wrap Widget → **Stack**.
-4. De bestaande `Align > Button` de `Stack` in slepen (drop op de `Stack`-rij =
-   positie 0), daarna de `Container`-rij óók op de `Stack`-rij droppen zodat de
-   volgorde `[Container, Align]` wordt — anders ligt de knop áchter de rij.
-   Eén sleep per tool-aanroep, verse `zoom` ertussen.
-5. `Align` op **(1.0, 0.0)** + rechterpadding 8.
-6. De `Button` → rechtsklik → **Replace** → `IconButton`. **Dit is de kritieke
-   stap**: Replace behoudt de actieketen. Zie de terugval hieronder als
-   `IconButton` niet in de Replace-lijst staat.
-7. Icoon + kleuren + maten uit "Doelstijl".
-8. `ListTile` → **Trailing Icon** weghalen (chevron) en `contentPadding` rechts
-   **12 → 52**, zodat een lange titel niet onder de knop loopt.
-9. Wrap de `IconButton` in een **Tooltip**, tekst + EN via de globe.
-
-⚠️ **Twee risico's, met terugval:**
-- **Een `ListTile` in een `Stack`** is in dit project nergens precedent, en
-  FlutterFlow weigert een `ListTile` in een `Row` ("Invalid Action") omdat die
-  geen intrinsieke breedte heeft. Stap 2 (de Container met breedte ∞) is er
-  juist om dat te voorkomen. Weigert stap 3 alsnog: **val voor plek 1 en 2 terug
-  op variant B** — dan is de hele taak één set knop-opties + tooltip, zonder
-  structuurwijziging.
-- **Replace → IconButton** is niet bevestigd (bij een `Text` biedt de dialoog
-  alleen RichText/TextField/Button). Lukt het niet: **NIET** Copy/Paste Action
-  Chain gebruiken — de keten hangt volledig aan het loop-item
-  (`$.nid`, `$.horecagelegenheidnid`) en die bindingen sneuvelen bij plakken.
-  Terugval dan: de bestaande `Button` houden en hem icoon-only maken (knoptekst
-  leeghalen via de globe + `content_copy` als icoon + `height/width 34`,
-  `padding 0`). Zelfde resultaat, nul risico op verloren bindingen.
-
-### Stappen — plek 3 (variant B)
-
-1. `Button` selecteren → knop-opties uit "Doelstijl" zetten.
-2. Icoon toevoegen (Add Icon → `content_copy`).
-3. Wrap Widget → **Align** (1.0, 0.0) + rechterpadding 12.
-4. Wrap Widget → **Tooltip**, tekst + EN via de globe.
-
-### Verificatie (verse export, nulmeting van 2026-09-22 erbij)
-
-| check | nu | na |
-|---|---|---|
-| `grep -c "FlutterFlowIconButton(" lib/mijn_profiel/mijn_profiel_widget.dart` | 2 | 4 |
-| `grep -c "arrow_forward_ios_rounded" lib/mijn_profiel/mijn_profiel_widget.dart` | 5 | 3 |
-| `grep -c "AlignedTooltip(" lib/mijn_profiel/mijn_profiel_widget.dart` | 0 | 2 |
-| `grep -c "Stack(" lib/mijn_profiel/mijn_profiel_widget.dart` | 0 | 2 |
-| `grep -c "AlignedTooltip(" lib/mijn_aanmeldingen/mijn_aanmeldingen_widget.dart` | 0 | 1 |
-| `grep -c "FFButtonWidget(" lib/mijn_aanmeldingen/mijn_aanmeldingen_widget.dart` | 1 | 1 |
-
-Plus: `height: 28.0` en `borderSide` in de opties van plek 3, en per plek dat de
-actieketen intact is — tel de navigatieparameters
-(`grep -c "serializeParam" ...` rond elke knop) en controleer dat `$.nid` en
-`$.horecagelegenheidnid` nog aan het **loop-item** hangen, niet aan de respons.
+| `8mxemaqc` | `mijn_profiel_widget.dart` r634 | Kopieer naar een nieuw evenement | Copy to a new activity |
+| `q8einmt3` | `mijn_aanmeldingen_widget.dart` r403 | Kopieer naar een nieuw evenement | Copy to a new activity |
+
+`adjt2leo` (r1476, *"Kopieer naar een nieuwe activiteit"* → *"Copy to a new
+activity"*) is **correct** en moet zo blijven.
+
+**Waarom Claude dit niet kon afmaken:** het vertaalpaneel achter de globe toont
+op deze tooltips structureel een **andere sleutel** dan het properties-paneel —
+bij de tooltip met "…nieuw evenement" opent de globe het record van
+"…nieuwe activiteit". Dat bleef zo na een volledige paginaherlaad en na een
+geforceerde selectiewissel (6 pogingen). In Bob's eigen browser is dit via
+**App Settings → Languages** (dat paneel scrollt daar wel) een halve minuut werk.
 
 ## 🅖 G · GOOGLE PLAY — volledige checklist · Eigenaar: Bob