Ver Fonte

Taal-cluster: chip-functies taalonafhankelijk + P1-17 werkblad + wezenlijst

- filterDatumVan/filterDatumTot herkennen nu NL+EN+sleutels op kernwoord;
  getest met fvm dart, identiek aan de oude versie op alle NL-invoer.
  Code staat klaar in TASKS.md, moet nog in de Custom Code-editor.
- TAAK-P1-17-vertalingen.md: 80 regels, deel A (nu) / deel B (na P2-29).
- 8 sleutels blijken een FOUTE Engelse vertaling te hebben (Duplicate-erfenis).
- Wezenlijst hermeten vanaf de startpagina: 31 bereikbaar, 19 wezen,
  3 nieuw t.o.v. P2-7 (EvenementComponent, HeaderCurrent, HomeUitgaanSliderComponentCopy).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob há 6 horas atrás
pai
commit
28453e93c9
2 ficheiros alterados com 299 adições e 10 exclusões
  1. 141 0
      TAAK-P1-17-vertalingen.md
  2. 158 10
      TASKS.md

+ 141 - 0
TAAK-P1-17-vertalingen.md

@@ -0,0 +1,141 @@
+# P1-17 · werkblad Engelse vertalingen
+
+*Gegenereerd 2026-09-16 door Claude uit `internationalization.dart`, gefilterd op
+schermen die vanaf de startpagina bereikbaar zijn (dode kopieën weggelaten).
+Vul in de builder per widget het globe-icoontje naast **Text** / **Title** /
+**Button Text** → veld **English**. Weggooien zodra de ronde af is.*
+
+## Deel A — nu al te doen (deze schermen veranderen niet meer)
+
+### EvenementHorecagelegenheid
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `5tdut8bf` | Bezorgen | Bezorgen | **Delivery** |
+
+### SelectStateDropDownComponent
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `elx7kse2` | Je volgt deze gemeente | Add to favorites | **You follow this municipality** |
+| `nosgkxy0` | Gemeente volgen | Add to favorites | **Follow municipality** |
+
+### drawerComponent
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `vnwx710y` | Terug | Favorite | **Back** |
+
+### home
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `8khvlnye` | Alles | *(leeg)* | **All** |
+| `g09d1fb5` | Alles | *(leeg)* | **All** |
+| `gco4jgol` | Dit weekend | *(leeg)* | **This weekend** |
+| `h6ou1q9q` | Deze week | *(leeg)* | **This week** |
+| `iov8u1yi` | Vandaag | *(leeg)* | **Today** |
+
+### horecagelegenhedenOverzichtCurrent
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `8gwyy71q` | Activiteiten | Activiteiten | **Activities** |
+| `b8oov17m` | Cultuur | Cultuur | **Culture** |
+| `er4hrrph` | Verhuur, catering | Verhuur, catering | **Rental, catering** |
+| `hnnqfnhk` | Eetgelegenheden | Eetgelegenheden | **Restaurants** |
+| `qqb1howd` | Zoek op naam | *(leeg)* | **Search by name** |
+| `waxjo567` | Uitgaan | Uitgaan | **Going out** |
+| `ykjsgvsf` | Overnachten | Overnachten | **Stay** |
+
+### login
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `n3cyffso` | Wachtwoord tonen/verbergen | Favorite | **Show/hide password** |
+| `pj545url` | Veld wissen | Favorite | **Clear field** |
+
+### selectprovinciegemeente
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `xsyz36fr` | Kies je gemeente | *(leeg)* | **Choose your municipality** |
+| `z0wynid6` | Je ziet dan het uitgaansnieuws van die gemeente in het menu. | *(leeg)* | **You'll then see that municipality's going-out news in the menu.** |
+
+### wachtwoordVergeten
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `503u6v73` | Vul je gebruikersnaam of e-mailadres in. … | Use your username or password to recieve an email to reset your password. | **Enter your username or email address. You'll receive an email to reset your password.** |
+
+## Deel B — pas ná P2-29 (de twee aanmaakpagina's zijn nog in bewerking)
+
+### stadsactiviteitAanmaken
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `06lh8r3a` | Contact | *(leeg)* | **Contact** |
+| `0brx7n79` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `1k52hayg` | Datum eind | Datum eind | **End date** |
+| `41moeajb` | Foto\'s kiezen | Foto\'s kiezen | **Choose photos** |
+| `4czd99zl` | Adres | Adres | **Address** |
+| `5ehouxlk` | Adres | Adres | **Address** |
+| `71z3uvd8` | Datum eind | Datum eind | **End date** |
+| `7dy1oyjr` | Organisator | Organisator | **Organiser** |
+| `7vogkwoh` | Datum | Datum | **Date** |
+| `825wzmk4` | Plaats | Plaats | **Town** |
+| `90c9lm1u` | Organisatie | *(leeg)* | **Organisation** |
+| `a2582hfp` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `ajotnz1f` | Select... | *(leeg)* | **Select...** |
+| `bhydpd6h` | Website van de activiteit | Website van de activiteit | **Website of the activity** |
+| `dfa8vusy` | Datum | Datum | **Date** |
+| `dq3j79df` | Wanneer | Wanneer | **When** |
+| `dqeuq7t8` | Select... | *(leeg)* | **Select...** |
+| `fyltb801` | Entreeprijs | Entreeprijs | **Admission price** |
+| `g6cr9u4n` | Activiteit indienen | Activiteit indienen | **Submit activity** |
+| `go2ky4mu` | Waar | *(leeg)* | **Where** |
+| `i66ori1d` | WebsiteURL | *(leeg)* | **Website URL** |
+| `j9h65a88` | Postcode | Postcode | **Postal code** |
+| `l9f37oxb` | Select... | *(leeg)* | **Select...** |
+| `ls6do5d5` | Mijn gemeenten | *(leeg)* | **My municipalities** |
+| `mfaz1x8u` | Entree | Entree | **Admission** |
+| `nfxdqk4i` | Media | Media | **Media** |
+| `np527mil` | Plaats activiteit | Plaats activiteit | **Activity town** |
+| `nxfif83l` | Organisator van de activiteit | Organisator van de activiteit | **Organiser of the activity** |
+| `oo7z1mp8` | Postcode | *(leeg)* | **Postal code** |
+| `p3rwq60m` | Contact email/telefoon | Contact email/telefoon | **Contact email/phone** |
+| `pftju36e` | Entreeprijs | Entreeprijs | **Admission price** |
+| `r6ckp0e0` | Logo kiezen | Logo kiezen | **Choose logo** |
+| `sv5qajjt` | Of kies zelf een plaats | *(leeg)* | **Or pick a town yourself** |
+| `tq77j4hk` | Entreeprijs | Entreeprijs | **Admission price** |
+| `xiba4gka` | Select... | *(leeg)* | **Select...** |
+
+### uitgaansevenementAanmaken
+
+| sleutel | Nederlands | staat nu in EN | zet op |
+|---|---|---|---|
+| `2hitlrxa` | Select... | *(leeg)* | **Select...** |
+| `3h3k4jh2` | Entreeprijs | Entreeprijs | **Admission price** |
+| `4a28vwlf` | Media | Media | **Media** |
+| `9qx16tm9` | Evenement indienen | Activiteit indienen | **Submit event** |
+| `df4oowbq` | Logo kiezen | Logo kiezen | **Choose logo** |
+| `e42lwmdh` | Datum eind | Datum eind | **End date** |
+| `e9n6cj1o` | WebsiteURL | *(leeg)* | **Website URL** |
+| `ge5o3gf7` | Entreeprijs | Entreeprijs | **Admission price** |
+| `gysg1wwq` | Wanneer | Wanneer | **When** |
+| `hqwm9set` | Foto\'s kiezen | Foto\'s kiezen | **Choose photos** |
+| `ht4toe4o` | Select... | *(leeg)* | **Select...** |
+| `nws4h1nz` | Datum | Datum | **Date** |
+| `nzaqrq0w` | Link om kaarten te kopen | Website van de activiteit | **Ticket link** |
+| `obaet4ky` | Entree | Entree | **Admission** |
+| `p0xm7daj` | Categorie evenement | *(leeg)* | **Event category** |
+| `qlzcyn78` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `qsf2va25` | Website van het evenement | Website van de activiteit | **Event website** |
+| `qtnlg7nd` | Search... | *(leeg)* | **Search...** |
+| `r9s46lo7` | Entreeprijs | Entreeprijs | **Admission price** |
+| `taujsjo7` | Toelichting Entree | Toelichting Entree | **Admission notes** |
+| `vkyrmq6a` | Organisatie | *(leeg)* | **Organisation** |
+| `wkn1mu1d` | Datum eind | Datum eind | **End date** |
+| `xceonmpt` | Datum | Datum | **Date** |
+| `zfofdq9a` | TicketsURL | *(leeg)* | **Tickets URL** |
+

+ 158 - 10
TASKS.md

@@ -43,14 +43,138 @@ tegelijk in bouwen:*
 
 *Niet geraakt (bewust): de twee aanmaakpagina's (P2-29, andere sessie).*
 
+### 🟢 AFGEROND 2026-09-16 (Claude, sessie "taal-cluster") — browserloos, geen builder aangeraakt
+
+*Geclaimd en uitgevoerd terwijl twee andere sessies in de builder zaten. Dit
+cluster raakt géén FlutterFlow-pagina en géén Chrome — alles is meting +
+kant-en-klare code. Er staat nog **één ding open dat Bob (of een sessie met de
+browser) moet doen**: de twee functie-bodies hieronder plakken.*
+
+**1 · `filterDatumVan` / `filterDatumTot` taalonafhankelijk — code klaar, moet
+nog in de Custom Code-editor.** Dit blokkeerde Bob's taak 3 (vertaalronde): de
+functies matchten letterlijk op `Vandaag`/`Dit weekend`/`Deze week`, dus zodra
+de chips een Engelse tekst krijgen doet het datumfilter niets meer. De nieuwe
+versie herkent op **kernwoord** i.p.v. op de hele zin, en dus NL + EN +
+hoofdletters/spaties + de interne sleutels (`vandaag`/`weekend`/`week`) tegelijk.
+Getest met `fvm dart` tegen de oude versie: **op elke Nederlandse invoer exact
+dezelfde uitkomst**, en `Today`/`This weekend`/`This week` werken er nu bij.
+Volgorde is belangrijk — `weekend` moet vóór `week` getest worden, want
+"This weekend" bevat ook "week".
+
+*Plakken in FlutterFlow → Custom Code → Functions → `filterDatumVan`. **Alleen de
+body**, FlutterFlow schrijft de signature zelf (zie `CLAUDE.md`). Daarna Ctrl+S.*
+```dart
+  final k = (keuze ?? '').toLowerCase().trim();
+  String soort = '';
+  if (k.contains('weekend')) {
+    soort = 'weekend';
+  } else if (k.contains('vandaag') || k.contains('today')) {
+    soort = 'vandaag';
+  } else if (k.contains('week')) {
+    soort = 'week';
+  }
+  if (soort == '') {
+    return '';
+  }
+  final nu = DateTime.now();
+  int extra = 0;
+  if (soort == 'weekend' && nu.weekday < 6) {
+    extra = 6 - nu.weekday;
+  }
+  final start = DateTime(nu.year, nu.month, nu.day + extra);
+  final maand = start.month.toString().padLeft(2, '0');
+  final dag = start.day.toString().padLeft(2, '0');
+  return '${start.year}-$maand-$dag 00:00:00';
+```
+*En in `filterDatumTot`:*
+```dart
+  final k = (keuze ?? '').toLowerCase().trim();
+  String soort = '';
+  if (k.contains('weekend')) {
+    soort = 'weekend';
+  } else if (k.contains('vandaag') || k.contains('today')) {
+    soort = 'vandaag';
+  } else if (k.contains('week')) {
+    soort = 'week';
+  }
+  if (soort == '') {
+    return '';
+  }
+  final nu = DateTime.now();
+  int extra = 0;
+  if (soort != 'vandaag' && nu.weekday < 7) {
+    extra = 7 - nu.weekday;
+  }
+  final eind = DateTime(nu.year, nu.month, nu.day + extra);
+  final maand = eind.month.toString().padLeft(2, '0');
+  final dag = eind.day.toString().padLeft(2, '0');
+  return '${eind.year}-$maand-$dag 23:59:59';
+```
+⚠️ **Koppeling met de vertaalronde:** de Engelse chip-teksten moeten
+**`All` / `Today` / `This weekend` / `This week`** worden. Elke andere Engelse
+formulering mag, zolang "today", "weekend" of "week" erin voorkomt — staat er
+iets als "Upcoming" dan filtert de chip niets. Dit staat ook in het werkblad.
+
+**2 · P1-17 volledig geïnventariseerd — werkblad ligt klaar in
+`TAAK-P1-17-vertalingen.md`.** Bob's taak 3 is daarmee puur uitvoerwerk: 80
+regels, elk met sleutel + Nederlandse tekst + wat er nu in EN staat + een
+voorgestelde Engelse tekst. Gesplitst in **Deel A (21 regels, nu al te doen —
+die schermen veranderen niet meer)** en **Deel B (59 regels, pas ná P2-29)**.
+Gemeten op de schermen die vanaf de startpagina bereikbaar zijn; de dode
+kopieën (`favorietenCopy`, `drawerComponentCopy`, `kanwegTestUpload`) zaten in
+de oude telling van 134/99 en zijn er nu uit.
+Werkelijke omvang in levende code: **26 leeg, 58 gelijk aan NL, 8 fout**.
+
+**3 · Nieuw gevonden: 8 sleutels hebben geen lege maar een FOUTE Engelse
+vertaling** — die vallen in geen enkele telling op en zijn erger dan leeg, want
+de gebruiker krijgt een tekst die iets anders betekent. Oorzaak is het bekende
+`Duplicate`-patroon (een kopie erft de EN-tekst van het origineel):
+| sleutel | scherm | Nederlands | staat er nu in EN |
+|---|---|---|---|
+| `vnwx710y` | drawerComponent | Terug | Favorite |
+| `pj545url` | login | Veld wissen | Favorite |
+| `n3cyffso` | login | Wachtwoord tonen/verbergen | Favorite |
+| `nosgkxy0` | SelectStateDropDown | Gemeente volgen | Add to favorites |
+| `elx7kse2` | SelectStateDropDown | Je volgt deze gemeente | Add to favorites |
+| `qsf2va25` | uitgaansevenementAanmaken | Website van het evenement | Website van de activiteit |
+| `nzaqrq0w` | uitgaansevenementAanmaken | Link om kaarten te kopen | Website van de activiteit |
+| `9qx16tm9` | uitgaansevenementAanmaken | Evenement indienen | Activiteit indienen |
+
+Plus één inhoudelijke fout op `wachtwoordVergeten` (`503u6v73`): de Engelse zin
+zegt *"Use your username or password to recieve an email"* — verkeerde betekenis
+én een typefout. Correctie staat in het werkblad.
+
+**4 · Wezenlijst opnieuw gemeten (aanvulling op P2-7 / Bob's taak 4).**
+Reproduceerbaar bepaald door vanaf de startpagina de widget-graaf te volgen:
+**31 van de 50 widgets zijn bereikbaar, 19 niet.** Drie namen die nog niet in
+de P2-7-lijst stonden: **`EvenementComponent`**, **`HeaderCurrent`** en
+**`HomeUitgaanSliderComponentCopy`**. De eerste twee worden *alleen* door de
+pagina `Event` gebruikt, dus die vallen vanzelf vrij zodra `Event` weg is.
+Handige volgorde voor de opruimronde — gooi eerst de pagina weg, dan de
+componenten die eraan hingen:
+- `Event` → daarna vallen `EvenementComponent` + `HeaderCurrent` vrij
+- `drawer_component_copy` + `kanweghorecagelegenheid_current_copy` → daarna
+  `KanwegHorecagelegenhedenOverzicht`
+- `slider_uitgaan_component_small_current` → daarna `KaartSliderUitgaanSComp`
+- zonder afhankelijkheden, kunnen meteen: `FavorietenCopy`, `HomeCopy`,
+  `KanwegHomeCopy`, `KanwegTestUpload`, `HeaderButtonsComponentCopymethartje`,
+  `KanwegHeaderButtonsComponentCopy`, `KaartTabelUitgaanComp`,
+  `KaartTabelUitgaanSComp`, `HomeUitgaantabelKaartComponentCopy`,
+  `HomeUitgaanSliderComponentCopy`, `PUitgaantabelKaartComponentOrgineelMetKaartjeerin`
+
+*Twee namen uit de oude P2-7-lijst bestaan niet meer op schijf
+(`kanwaeg_select_state_drop_down_component_copy`,
+`kanweg_home_uitgaantabel_kaart_component_copy`) — in de builder mogelijk nog
+wel, daar niet gecontroleerd (geen browser gebruikt).*
+
 ### 📋 Bob's 7 — de geordende lijst van 2026-09-15 (laat), max. 7, niets anders oppakken
 
 *Stand bij afsluiten 2026-09-15 23:30: taak 1 af; 2 t/m 7 zijn voor morgen,
-in deze volgorde. Voor Claude ligt er los één klein ding klaar (niet geclaimd):
-**`filterDatumVan`/`filterDatumTot` taalonafhankelijk maken** (nu matchen ze
-op de Nederlandse chip-labels `Vandaag`/`Dit weekend`/`Deze week`; met EN
-erbij moeten ook `Today`/`This weekend`/`This week` werken, of de chips
-moeten interne sleutels zetten) — nodig vóór taak 3. Standaardzin voor morgen:*
+in deze volgorde. **Update 2026-09-16: het losse klusje voor Claude
+(`filterDatumVan`/`filterDatumTot` taalonafhankelijk) is klaar** — de code staat
+in het groene blok hierboven en hoeft alleen nog geplakt te worden. Taak 3 is
+daarmee niet meer geblokkeerd en heeft nu een kant-en-klaar werkblad
+(`TAAK-P1-17-vertalingen.md`). Standaardzin voor morgen:*
 
 > Pak Bob's 7-lijst bovenin `TASKS.md` op, in volgorde. Ik doe de Drupal- en
 > Play-Console-stappen zelf; jij verifieert met een verse export/curl en noemt
@@ -79,11 +203,15 @@ moeten interne sleutels zetten) — nodig vóór taak 3. Standaardzin voor morge
    FlutterFlow-deploy (dan hoeft er lokaal niets) of lokaal (dan keystore +
    `android/key.properties`, want release staat op `signingConfigs.debug`).
    iOS wel/niet in scope.
-3. **P1-17 · Engelse vertalingen in één ronde** — pas ná P2-29 (aanmaak-
-   pagina's), anders vertaal je twee keer. Omvang:
-   134 lege + 99 gelijk aan NL. Zwaartepunt: `stadsactiviteitAanmaken`,
-   `uitgaansevenementAanmaken`, Home-chips, `Selectprovinciegemeente`.
-   Claude maakt vooraf de chip-functie taalonafhankelijk.
+3. **P1-17 · Engelse vertalingen** — werkblad ligt klaar in
+   **`TAAK-P1-17-vertalingen.md`** (sleutel + NL + huidige EN + voorgestelde EN
+   per regel). **Deel A (21 regels) kan nu al**: Home-chips, drawer, login,
+   horeca-overzicht, `Selectprovinciegemeente`, gemeentehartje. **Deel B (59
+   regels)** pas ná P2-29, want de twee aanmaakpagina's zijn nog in bewerking.
+   Echte omvang in levende code: 26 leeg + 58 gelijk aan NL + **8 fout** (de
+   oude telling 134/99 bevatte dode kopieën). De chip-functie is al
+   taalonafhankelijk gemaakt — mits de chips exact
+   `All`/`Today`/`This weekend`/`This week` krijgen.
 4. **Builder-opruimronde.** P2-7 (21 dode eenheden; begin met
    `drawer_component_copy` + `kanweghorecagelegenheid_current_copy`),
    `HorecagelegenhedenOverzichtCopy3Copy`, `homeCopy` (het datumfilter is af en op een toestel getest, dus mag weg),
@@ -1160,6 +1288,26 @@ aan de app-kant niets te veranderen.
 
 7. Geef Claude daarna het **`display_id`** door (= taak 26).
 
+✅ **Nagemeten op PRODUCTIE 2026-09-16 (Claude) — de Drupal-kant is af en live.**
+`display_id=services_2` + `townid=28695` geeft 19 bezorgers in Amsterdam,
+`categorie` komt als **array** (niet de P1-45-komma-string), titels schoon. Het
+`horcat`-filter is er echt af: `horcat=17967`, lege `horcat` en geen `horcat`
+geven alle drie 19 items. Aan Drupal hoeft niets meer.
+
+❌ **De app-kant is nog nergens aangesloten.** (a) De `ListTile` "Thuis
+bezorgen" (`t46xiboh`) in `lib/shared/drawer_component/drawer_component_widget.dart:744`
+heeft **geen** omhullende `InkWell`/`onTap` — alle 16 andere menu-items wél;
+tikken doet niets. (b) Geen enkele pagina vraagt `services_2` op:
+`horecagelegenhedenOverzichtCurrent` heeft alleen parameter `plaats` en
+hardcodeert 6× `'services_1'` (regels 57, 414, 430, 447, 464, 481). Let op: de
+`services_2` in `api_calls.dart:248` hoort bij **`flutterflowmobiel1`** (events,
+Home-tab) — ander ding, zelfde displaynummer.
+
+➡️ **De ontwerpvraag hieronder is hiermee beslecht: het moet een LOSSE
+lijstpagina worden.** Omdat `horcat` genegeerd wordt, zouden de zes
+categorietabs van de bestaande pagina alle zes dezelfde 19 items tonen; een
+`displayId`-page-parameter op die pagina is dus geen optie.
+
 **Open ontwerpvraag voor Bob:** "Thuis bezorgen" is één lijst, terwijl
 `horecagelegenhedenOverzichtCurrent` uit zes categorietabs bestaat. Wil je
 die tabs daar ook, of liever een aparte, simpele lijstpagina? Dat bepaalt of