Quellcode durchsuchen

Taak 65: uitgelogde doorloop af op een echte release-build + P2-24 B gemeten

Taak 65 — volledige functionele doorloop op een verse --release-build
(flags=0x0, met flutter_launcher_icons vooraf) op de telefoon-AVD:
- 0 FATAL / 0 E/flutter over de hele doorloop.
- Vliegtuigmodus: geen crash, VerbindingsBanner + Opnieuw-knop werken.
- Engels: chips en tabs vertalen; "Datum" blijft Nederlands (65e).
- Vijf nieuwe bevindingen 65a-65e, allemaal cosmetisch/UX (loginpagina links
  afgeknipt, header-verschuiving op HorecagelegenheidCurrent, leeg
  Favorieten-scherm bij uitgelogd, roze deelknop, onvertaald "Datum").
- Ingelogde deel blijft bij Bob: Claude voert geen wachtwoorden in.

P2-24 B — gemeten en verplaatst naar Bob: het kan niet in de app.
`categorieen.json` is sessie-only (403 anoniem) en het veld `categorie` van de
establishments-view bevat alle labels van een zaak over al zijn
hoofdcategorieen heen, dus de subcategorie per tab is er niet uit af te leiden.
Drie endpoint-opties uitgewerkt.

CLAUDE.md: contentstand Amsterdam hermeten (Activiteiten/Overnachten/
Verhuur/Cultuur stonden door elkaar) + de horcat-tids per tab vastgelegd.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob vor 23 Stunden
Ursprung
Commit
16c51e1fff
2 geänderte Dateien mit 106 neuen und 7 gelöschten Zeilen
  1. 22 2
      CLAUDE.md
  2. 84 5
      TASKS.md

+ 22 - 2
CLAUDE.md

@@ -1579,8 +1579,15 @@ cd /tmp/ff-checkN && fvm flutter run --profile -d <device> \
 (**28695 = Amsterdam — de vaste testplaats, Bob 2026-09-09.** Gebruik deze
 (**28695 = Amsterdam — de vaste testplaats, Bob 2026-09-09.** Gebruik deze
 en niet Arnhem: Arnhem heeft zó weinig content dat je limieten en
 en niet Arnhem: Arnhem heeft zó weinig content dat je limieten en
 overflow-problemen er niet mee vindt. Amsterdam op productie:
 overflow-problemen er niet mee vindt. Amsterdam op productie:
-Eetgelegenheden 245 items, Uitgaan 75, Activiteiten 42, Overnachten 42,
-Verhuur/catering 24, Cultuur 14 — tegen 20 als grootste tab in Arnhem.
+Eetgelegenheden 245 items, Uitgaan 75, Cultuur 42, Verhuur/catering 42,
+Activiteiten 24, Overnachten 14 — tegen 20 als grootste tab in Arnhem.
+*(Hermeten 2026-09-19; de vorige versie van deze regel had Activiteiten,
+Overnachten, Verhuur/catering en Cultuur door elkaar staan.)* De `horcat`-tids
+per tab, in de tabvolgorde van `horecagelegenhedenOverzichtCurrent`:
+Activiteiten `17969`, Cultuur `17963`, Eetgelegenheden `34`, Overnachten
+`17965`, Uitgaan `17967`, Verhuur/catering `17968` — dus **niet** oplopend, en
+de tabvolgorde is alfabetisch. Leid een tid nooit af uit de tabpositie; lees 'm
+uit de export (`grep -n "horcat:" <widget>.dart`).
 Gemeente-tid is `28694`, wat toevallig ook de default van
 Gemeente-tid is `28694`, wat toevallig ook de default van
 `gemeenteSelectId` in `app_state.dart` is.) Vergeet
 `gemeenteSelectId` in `app_state.dart` is.) Vergeet
 niet eerst `.fvmrc`, `.fvm/` en `pubspec.lock` naar de exportmap te kopiëren —
 niet eerst `.fvmrc`, `.fvm/` en `pubspec.lock` naar de exportmap te kopiëren —
@@ -3031,6 +3038,19 @@ events voor dezelfde zaak toont, dan is dat **geen bug** maar een verlopen
 agenda. Gebruik dat verschil ook andersom: tel per zaak beide views en je
 agenda. Gebruik dat verschil ook andersom: tel per zaak beide views en je
 weet meteen of een "lege" agenda aan de data of aan de view ligt.
 weet meteen of een "lege" agenda aan de data of aan de view ligt.
 
 
+**`categorieen.json` is SESSIE-ONLY (403 voor anonymous) — bruikbaar op de
+aanmaakpagina's, niet op een publieke overzichtspagina.** Gemeten 2026-09-19:
+`curl` zonder cookie geeft `["Toegang geweigerd voor gebruiker anonymous"]`.
+
+**En de `categorie`-waarden binnen één horeca-tab zijn NIET de subcategorieën
+van die tab.** Gemeten op Amsterdam over alle zes de tabs: het veld bevat álle
+categorie-labels van de zaak, over al zijn hoofdcategorieën heen. Daardoor duikt
+"Catering" op onder Eetgelegenheden (26×) en "Cafe" onder Cultuur. Een zaak die
+op twee tabs staat, is uit deze data **principieel niet** toe te wijzen aan de
+juiste hoofdcategorie — er is geen veld dat het verband legt. Een per-tab
+categoriefilter heeft dus een Drupal-endpoint nodig dat de taxonomie-kinderen van
+een `horcat`-tid teruggeeft; in de app is het niet af te leiden.
+
 **Een taxonomie-/categorie-id verifiëren zonder het te gokken: test het
 **Een taxonomie-/categorie-id verifiëren zonder het te gokken: test het
 endpoint rechtstreeks.** Bevestigd nuttig 2026-09-02 (een `horcat` was
 endpoint rechtstreeks.** Bevestigd nuttig 2026-09-02 (een `horcat` was
 naar een niet-bestaande categorie gezet; de tab bleef leeg zonder
 naar een niet-bestaande categorie gezet; de tab bleef leeg zonder

+ 84 - 5
TASKS.md

@@ -21,8 +21,8 @@ oppakken.
 |---|---|---|
 |---|---|---|
 | ~~88B~~ | Pagina "Mijn aanmeldingen" | ⚠️ **Al geclaimd** door de sessie 'taken-B1-B7' — niet oppakken |
 | ~~88B~~ | Pagina "Mijn aanmeldingen" | ⚠️ **Al geclaimd** door de sessie 'taken-B1-B7' — niet oppakken |
 | **98** | "Zet in mijn agenda"-knop op een evenement (`add_2_calendar`) | Claude — **BEZIG** (sessie 2026-09-19). Blokkeert op Drupal-deel bij Bob, zie 98A |
 | **98** | "Zet in mijn agenda"-knop op een evenement (`add_2_calendar`) | Claude — **BEZIG** (sessie 2026-09-19). Blokkeert op Drupal-deel bij Bob, zie 98A |
-| **65** | Functionele doorloop van de release-build | Build draait al op emulator-5556; de checklist is nog niet afgelopen |
-| **P2-24 B** | Categoriedropdown horeca-overzicht, tab-bewust (Bob 2026-09-19) | Custom function + dropdown op `horecagelegenhedenOverzichtCurrent`; zie P2-24 voor de hoofd-/subcategorie-nuance |
+| **65** | Release-build doorloop | ✅ **Uitgelogde deel af 2026-09-19** (0 crashes; 5 nieuwe bevindingen 65a-65e). Rest = ingelogd + Xiaomi → Bob |
+| ~~P2-24 B~~ | Categoriedropdown horeca-overzicht, tab-bewust | ⛔ **Geblokkeerd op Drupal — verplaatst naar Bob**, zie P2-24 B hieronder (gemeten 2026-09-19) |
 | **G0.6** | Play-screenshots schieten | Browserloos op beide AVD's, ±10 min — zeg het en het gebeurt |
 | **G0.6** | Play-screenshots schieten | Browserloos op beide AVD's, ±10 min — zeg het en het gebeurt |
 
 
 ## 👤 BOB — OPEN, in volgorde van wat de livegang blokkeert
 ## 👤 BOB — OPEN, in volgorde van wat de livegang blokkeert
@@ -33,6 +33,7 @@ oppakken.
 | **G** | Google Play-checklist G0–G4 | Volledige checklist hieronder, afvinkbaar |
 | **G** | Google Play-checklist G0–G4 | Volledige checklist hieronder, afvinkbaar |
 | **66** | Crashlytics: Firebase-console nakijken + Crashtest-knop opruimen | App-kant is bewezen (rapport met status 200); alleen de console-check en het opruimen zijn nog van jou |
 | **66** | Crashlytics: Firebase-console nakijken + Crashtest-knop opruimen | App-kant is bewezen (rapport met status 200); alleen de console-check en het opruimen zijn nog van jou |
 | **98A** | ISO-datum toevoegen aan `flutterflow_events` (2 velden) | 🔴 Blokkeert taak 98 — zonder start/eindtijd is er geen agenda-item te maken |
 | **98A** | ISO-datum toevoegen aan `flutterflow_events` (2 velden) | 🔴 Blokkeert taak 98 — zonder start/eindtijd is er geen agenda-item te maken |
+| **P2-24 B** | Endpoint voor subcategorieën per `horcat`-tid | Blokkeert de tab-bewuste categoriedropdown; drie opties uitgewerkt bij P2-24 B |
 | **98B** | Calendar-permissietekst in App Settings → Permissions | Claude kan dit veld niet zetten (elke toetsaanslag wordt een plist-entry); 10 seconden werk voor jou |
 | **98B** | Calendar-permissietekst in App Settings → Permissions | Claude kan dit veld niet zetten (elke toetsaanslag wordt een plist-entry); 10 seconden werk voor jou |
 | **P1-17** | Engelse vertalingen, één ronde | 46 velden op de twee aanmaakpagina's + 3 losse |
 | **P1-17** | Engelse vertalingen, één ronde | 46 velden op de twee aanmaakpagina's + 3 losse |
 | **Bij livegang** | Zes schakelaars en opruimklussen | Eigen blok hieronder |
 | **Bij livegang** | Zes schakelaars en opruimklussen | Eigen blok hieronder |
@@ -428,9 +429,58 @@ blijven. Hoort bij dezelfde ronde als taak 79.
 - Cosmetisch: het logo boven in het **menu (Drawer)** staat deels ónder de
 - Cosmetisch: het logo boven in het **menu (Drawer)** staat deels ónder de
   statusbalk — de klok valt erachter. Zie `rel-menu.png`.
   statusbalk — de klok valt erachter. Zie `rel-menu.png`.
 
 
-**Wat nog niet gedaan is van deze taak:** de volledige functionele doorloop
-(zaakpagina, hartje, login, Favorieten, evenement aanmaken, vliegtuigmodus,
-Engels) en Bob's Xiaomi. De app is daarvoor blijven staan op emulator-5556.
+**✅ Functionele doorloop GEDAAN 2026-09-19 (Claude), op een verse
+`--release`-build (`flags=0x0`) uit een export van diezelfde dag, mét
+`flutter_launcher_icons` vooraf, op de telefoon-AVD `emulator-5554`
+(1080x1920).** ⚠️ De poorten waren omgedraaid t.o.v. wat hierboven staat: 5554
+was de telefoon, 5556 de tablet — check dat altijd met `wm size`.
+
+**Geen enkele crash.** 0 `FATAL` / 0 `E/flutter` over de hele doorloop: opstarten,
+Home, datumfilter, evenement-detail, drawer, horeca-overzicht, zaakpagina,
+Favorieten (uitgelogd), loginpagina, vliegtuigmodus en Engels.
+
+**Wat werkt (geverifieerd op het scherm):** Home met slider, kaarten en foto's ·
+datumkiezer kiezen én annuleren (P2-45b, zie hieronder) · chips · alle vijf de
+tabs · drawer met alle iconen · horeca-overzicht met zoekveld, zes tabs en
+naast elkaar lopende categorielabels · zaakpagina met fotocarousel, vier tabs
+(Agenda eerst) en een nette lege-agenda-melding · AdMob-testadvertentie ·
+Favorieten-tab *Gebruiker* met uitleg + "Account aanmaken" + "Inloggen" ·
+loginpagina · **vliegtuigmodus: geen crash, de `VerbindingsBanner` verschijnt
+met "Geen verbinding met uitgaanskrant.com" en een knop *Opnieuw*, en de
+fallback-logo's vullen de lege lijsten** · **Engels: chips en tabs vertalen
+netjes** (All/Today/Weekend/This week, Go Out/Cityactivities/Culture & Info).
+
+**🔴 Nieuwe bevindingen uit deze doorloop — allemaal cosmetisch/UX, geen crash:**
+
+- **65a · De loginpagina is links afgeknipt en niet uitgelijnd.** De witte velden
+  *E-mailadres* en *Wachtwoord* beginnen links ván x=0 (afgeronde hoek valt weg),
+  "Nog geen account? Registreren" raakt de schermrand, en het hele formulier
+  staat links terwijl de rechterhelft leeg blijft. Op een P0-scherm is dat het
+  meest zichtbare punt van de hele doorloop. Screenshot: `scratchpad/`-map van
+  de sessie.
+- **65b · Op `HorecagelegenheidCurrent` schuift de header naar links en raakt de
+  hamburgerknop de schermrand.** Gemeten met `get_ui_tree`: knopcentrum op
+  **x=53** (elders op x=271 resp. x=340), dus de knop steekt links buiten beeld.
+  Nog net bruikbaar, maar het oogt kapot. Iets in die AppBar-`Row` neemt rechts
+  ruimte in die er op andere pagina's niet is.
+- **65c · Favorieten toont uitgelogd een volledig LEEG scherm.** De standaardtab
+  *Persoonlijke agenda* rendert niets: geen melding, geen uitleg, geen
+  inlogknop. De uitleg + inlogknop staan op tab 4 (*Gebruiker*), maar die valt
+  buiten beeld in de scrollende tabbalk — een uitgelogde bezoeker vindt 'm niet.
+  Suggestie: dezelfde login-uitleg als een Empty List Widget op tab 1-3.
+- **65d · De deelknop op de evenement-detailpagina is roze/magenta en valt half
+  buiten beeld.** Roze zit niet in het merkpalet (rood/oranje/leisteen/groen) en
+  de knop loopt rechts van het scherm af.
+- **65e · "Datum" blijft Nederlands in de Engelse modus.** Het label van de
+  kalenderknop komt uit de `valueOrDefault`-default `'Datum'` en is dus géén
+  vertaalsleutel. Hoort bij P1-17.
+- Bevestigd, al bekend: het **logo in de drawer staat deels onder de statusbalk**
+  (de klok valt erachter).
+
+**Nog steeds open van deze taak:** alles waarvoor je ingelogd moet zijn — hartje
+op een zaakpagina, Favorieten met inhoud, evenement aanmaken — plus Bob's Xiaomi.
+⚠️ **Claude voert geen wachtwoorden in, dus het ingelogde deel is per definitie
+Bob's stuk.** De loginpagina zelf is geverifieerd tot aan het invoerveld.
 ---
 ---
 
 
 #
 #
@@ -711,6 +761,35 @@ op Bob's verzoek geschrapt.
 De blokkade-verhalen hieronder zijn daarmee historie; ze staan er nog omdat de
 De blokkade-verhalen hieronder zijn daarmee historie; ze staan er nog omdat de
 meetmethode nuttig blijft.
 meetmethode nuttig blijft.
 
 
+**⛔ B · Stand 2026-09-19 (Claude, gemeten op productie): dit kan niet in de app,
+het heeft een Drupal-endpoint nodig.** Twee metingen, allebei hard:
+
+1. **`categorieen.json` is sessie-only.** Anoniem geeft hij HTTP 403 met
+   `["Toegang geweigerd voor gebruiker anonymous"]`. Het horeca-overzicht is een
+   publieke pagina, dus deze call is daar onbruikbaar — nog los van de vraag of
+   hij per `horcat`-tid kan filteren.
+2. **De opties zijn niet uit de tabdata af te leiden.** Het veld `categorie` van
+   `flutterflowmobiel_establishments` bevat *alle* categorie-labels van een zaak,
+   over al zijn hoofdcategorieën heen — niet alleen de subcategorie die bij de
+   opgevraagde `horcat` hoort. Gemeten over alle zes de tabs (Amsterdam): tab
+   *Eetgelegenheden* levert 57 verschillende labels op, met o.a. "Catering" (26×)
+   en "Zaalverhuur"; tab *Cultuur* levert "Cafe" (11×). Een zaak die op twee tabs
+   staat is uit deze respons **principieel niet** toe te wijzen aan de juiste
+   hoofdcategorie — er is geen veld dat dat verband legt. Bob's vermoeden
+   ("geeft een paar vreemde opties") is dus geen randgeval maar de regel.
+
+**Wat Bob nodig heeft om B mogelijk te maken — kies één:**
+- **(a) een publiek endpoint** `subcategorieen.json?horcat=<tid>` dat de
+  taxonomie-kinderen van die tid teruggeeft (`tid` + `naam`), of
+- **(b) `categorieen.json` publiek maken** *en* een `horcat`-parameter geven, of
+- **(c) een extra veld in `flutterflowmobiel_establishments`** dat per rij zegt
+  welke categorie-labels onder de opgevraagde `horcat` vallen (dan kan de app het
+  zelf afleiden en is er geen tweede call nodig — waarschijnlijk de goedkoopste).
+
+Zodra dat er is, is het app-deel klein: een dropdown boven de lijst, gevuld uit
+dat endpoint, plus een extra argument op `filterHorecagelegenheden(...)` — precies
+het patroon dat het zoekveld al gebruikt.
+
 **P2-24.**
 **P2-24.**
 Pagina: **`horecagelegenhedenOverzichtCurrent`**. P2-6 heeft het zoekveld op 5
 Pagina: **`horecagelegenhedenOverzichtCurrent`**. P2-6 heeft het zoekveld op 5
 van de 6 tabs werkend en live op een toestel bevestigd (zie het
 van de 6 tabs werkend en live op een toestel bevestigd (zie het