Explorar el Código

136: taalkeuze onder Mijn Profiel (LanguageSelector + Persist Selection)

App Settings > Languages > Persist Selection aan: main.dart krijgt nu
FFLocalizations.initialize(), getStoredLocale() en storeLocale(), dus een
taalkeuze overleeft het afsluiten. Daarvoor volgde de app blind de
toestelinstelling.

In de Account-tab van mijnProfiel (ColumnTab3), tussen userName en
"Wachtwoord wijzigen": label "Taal / Language" (Body Small, Secondary Text,
NL+EN gevuld) plus FlutterFlowLanguageSelector met hideFlags: false.
dart analyze 0 errors.

CLAUDE.md: recept voor de taalkiezer, plus de correctie dat de
appSettingsTab=languages-URL wel gewoon werkt.

TASKS.md: 136 afgerond op twee verificaties na, en een aparte regel voor de
export-blokkade ("Tooltip cannot have a Button as a descendant" op
MijnAanmeldingen, taak 133-werk) die elke sessie nu ophoudt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob hace 21 horas
padre
commit
360e28174b
Se han modificado 2 ficheros con 33 adiciones y 0 borrados
  1. 29 0
      CLAUDE.md
  2. 4 0
      TASKS.md

+ 29 - 0
CLAUDE.md

@@ -3929,6 +3929,35 @@ pagina's → `XWidget.routeName` / `XWidget(`); elke FlutterFlow-pagina staat in
 2026-09-16: **31 van de 50 widgets bereikbaar, 19 wezen** — de oude telling van
 134 lege vertalingen zat vol dode kopieën.
 
+**Een taalkiezer inbouwen: `LanguageSelector`-widget + "Persist Selection" — samen
+één sessie werk, recept 2026-09-23 in één ronde gelukt (taak 136).** Zonder deze twee
+volgt de app blind de toestelinstelling: `MaterialApp.locale` is bij start `null`, dus
+Flutter kiest uit `supportedLocales`, en bij geen match wint de **eerste** (hier `nl`).
+- **De persistentie is een aparte toggle en staat standaard UIT:** App Settings →
+  Languages → **Persist Selection**, rechts naast de knop *Translate All*. Herken het aan
+  de export: zonder die toggle ontbreken `FFLocalizations.initialize()`,
+  `getStoredLocale()` én `storeLocale()` volledig, en dan is een taalkeuze na het
+  afsluiten weer weg. Mét de toggle staan ze alle drie in `main.dart`. **De URL
+  `?tab=appSettings&appSettingsTab=languages` werkt gewoon** — de oudere notitie dat die
+  stil redirect klopt niet meer.
+- **De widget heet `LanguageSelector`** en staat in de gewone Insert-dropdown onder
+  *Base Elements*. Hij regelt alles zelf: `currentLanguage`, `languages()` en
+  `onChanged: (lang) => setAppLanguage(context, lang)`. Geen actieketen nodig.
+- **Zet `Hide Flags` UIT** (staat standaard aan). Zonder vlag én zonder label is het een
+  grijs vakje met "Nederlands" — en in déze app leest dat als een plaatskeuze, want Home
+  toont "Heel Nederland" in de header. Een los `Text`-label ("Taal / Language", Body
+  Small + Secondary Text) ervoor is om diezelfde reden de moeite waard; de widget heeft
+  zelf **geen** label-property (zoeken op `label` in het eigenschappenfilter geeft niets).
+- **Insert Widget landt achteraan, een sleep op de ouder-rij landt op positie 0** — dus
+  een widget op positie 1 krijgen kost precies **twee** sleepacties: sleep hem op de
+  ouder (→ 0), en sleep daarna het element dat bóven hem hoort óók op de ouder (→ 0).
+  Veel korter dan de "alle siblings in omgekeerde volgorde"-route.
+- **Zoek de juiste `Column` op via het CANVAS, niet via de boom:** klik in de tab en het
+  canvas toont de nodenaam als klein label linksboven het gemarkeerde vlak (zo bleek de
+  Account-tab van `mijnProfiel` `ColumnTab3` te heten). Daarna filtert het tree-zoekveld
+  er meteen naartoe. ⚠️ "+" op de `TabBar Page`-rij nooit gebruiken — die **vervangt** de
+  inhoud; je wilt de `Column` eronder.
+
 **Vertalingen invullen: het Settings → Languages-paneel SCROLLT NIET voor
 Claude — gebruik het globe-icoontje op het widget zelf.** Bevestigd
 2026-09-08 (P1-17, 22 vertalingen doorgezet). Het Languages-paneel

+ 4 - 0
TASKS.md

@@ -27,7 +27,11 @@ 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: alle VIER de upload-knoppen zijn om en export-geverifieerd** (logo + foto's op `uitgaansevenementAanmaken`, logo + foto's op `stadsactiviteitAanmaken`), `dart analyze` 0 errors. Elke knop: `Confirm Dialog` ("Waar komt het logo vandaan?" / "Waar komen de foto's vandaan?", knoppen **Mobiel** / **Fotoboek**) → conditional op `confirmDialogResponse` → TRUE = bottom sheet 85 % met `FotoboekGridComponent`, FALSE = de bestaande upload-keten. Bij de logo-knoppen zet de callback `createLogoFid`/`createLogoUrl`, bij de foto-knoppen doet hij *Add to List* op `createFotosFids`/`createFotosUrls` — dus meerdere keuzes vullen aan, net als de mobiele kiezer. ⚠️ Wegklikken van de dialoog telt als **Mobiel** (FlutterFlow genereert `?? false`). **Nog te doen:** (a) 5e tab "Mijn foto's" op `mijnProfiel` voor beheer/verwijderen (endpoint `mijn_fotos` + `mijn_fotos/verwijder` staan live); (b) cosmetica op het component: zoekveld boven de grid i.p.v. eronder (2 sleeppogingen mislukt), Hint Text "Zoek op bestandsnaam" + EN-vertaling; (c) **testen op een toestel** — Claude kan dat niet, want alle vier de pagina's vragen om ingelogd zijn. **Opruimen (Bob):** wegwerp-component `FotoboekGridComponentCopy`, en het callback-argument **`urlTekst`** op `FotoboekGridComponent` (door Claude toegevoegd toen `createFotosUrls` nog een `List<String>` leek; het is een `List<Image Path>`, dus `url` volstond — het argument is onschadelijk maar ongebruikt). Endpoint-spec + builder-recepten staan in `CLAUDE.md` |
+| **135** | Categorie-multiselect duidelijker maken (evenement + activiteit) | **Claude — bezig** (2026-09-23). De multiselect-dropdown sluit alleen door naast de lijst te tikken, en dat is onduidelijk. Drie deelacties op **beide** aanmaakpagina's: **(A)** `Max Height` op de categorie-dropdown (leeg = menu mag de volle schermhoogte pakken, dus er blijft geen zichtbaar "buiten" over); **(B)** de bestaande hulpregel onder het label uitbreiden met een zin over de bediening (NL + EN); **(C)** een `Text` onder het veld die toont hoeveel categorieen gekozen zijn — de knoptekst zelf staat in de gegenereerde widget op `maxLines: 1` en is niet instelbaar, dus bij meerdere keuzes zie je je selectie afgekapt. Context: 146 subcategorieen onder 7 hoofdcategorieen |
 | **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 |
+| **136** | Taalkeuze onder Mijn Profiel | **AF** (2026-09-23), op één verificatie na. **(1)** App Settings -> Languages -> **Persist Selection** staat aan; export bevestigt `await FFLocalizations.initialize()`, `Locale? _locale = FFLocalizations.getStoredLocale()` en `FFLocalizations.storeLocale(language)` in `main.dart` — zonder die drie overleefde een keuze het afsluiten niet. **(2)** In de **Account**-tab van `mijnProfiel` (`ColumnTab3`) staat nu, tussen `userName` en "Wachtwoord wijzigen": een `Text` **"Taal / Language"** (Body Small, Secondary Text, NL+EN beide gevuld, sleutel `zlpb2nvy`) plus **`FlutterFlowLanguageSelector`** met `hideFlags: false` (vlag erbij, want zonder label/vlag leest "Nederlands" in deze app als een plaatskeuze — Home toont "Heel Nederland"). Export: `currentLanguage: FFLocalizations.of(context).languageCode`, `languages: FFLocalizations.languages()`, `onChanged: (lang) => setAppLanguage(context, lang)`; `dart analyze` 0 errors. ⏳ **Nog te doen:** één verse export ter bevestiging van de EN-vertaling — die stap is alleen in de builder-UI geverifieerd (globe toont na een volledige paginaherlaad NL én EN op "Taal / Language"), omdat de export sinds ~15:00 projectbreed geblokkeerd is, zie de regel hieronder. ⏳ **En: testen op een toestel** — Claude kan dat niet, `mijnProfiel` vereist ingelogd zijn. Zet de app op Engels, sluit hem af (`force-stop`) en start opnieuw: de keuze hoort te blijven staan. ⚠️ Blijft Nederlands ook in de EN-UI: de content zelf, de server-geformatteerde `datum` (alle API-URL's zijn hardcoded `/nl/`, 10 bindingen in levende code), de 5 `LegeLijstComponent`-teksten (parameterwaarden, geen i18n-sleutel) en Drupal-foutmeldingen |
+| **136-blokkade** | ⚠️ Export projectbreed geblokkeerd (23-09 ~15:00) | **Eigenaar: wie aan taak 133 werkt.** `flutterflow export-code` faalt met `Status: 400` — vier keer achter elkaar, dus geen serverhikje. Issues -> Errors toont **"Widget Configuration — Tooltip cannot have a Button as a descendant"**, en een klik daarop springt naar **`MijnAanmeldingen`** -> de `Tooltip` om de oranje **Kopie**-knop. Dat is taak 133-werk, niet van taak 136. De andere drie errors (2× Property Override + 1 Custom Function) blokkeerden niet: met alleen die drie slaagde de export vandaag nog. **Fix:** de knop uit de `Tooltip` halen (of de tooltip op een niet-Button-ouder zetten). Zolang dit staat ligt élke sessie stil bij het verifiëren |
+| **132-G/D/E/L + tabnaam** | ProvinciePage 6 lege-lijst-meldingen · 4 foute EN-labels · agenda-knop-padding + hartje · `parent_titel`-binding · tabnaam Favorieten | **Claude — bezig** (2026-09-23 13:45, sessie 909fc0fd). Raakt `Favorieten`, `HorecagelegenhedenOverzichtProvinciePage`, `EvenementHorecagelegenheid`, `HorecagelegenheidCurrent`, `EventCurrent` — niet de aanmaakpagina's of `mijnProfiel` |
 | **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 |