Explorar el Código

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 hace 17 horas
padre
commit
16c51e1fff
Se han modificado 2 ficheros con 106 adiciones y 7 borrados
  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
 en niet Arnhem: Arnhem heeft zó weinig content dat je limieten en
 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
 `gemeenteSelectId` in `app_state.dart` is.) Vergeet
 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
 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
 endpoint rechtstreeks.** Bevestigd nuttig 2026-09-02 (een `horcat` was
 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 |
 | **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 |
 
 ## 👤 BOB — OPEN, in volgorde van wat de livegang blokkeert
@@ -33,6 +33,7 @@ oppakken.
 | **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 |
 | **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 |
 | **P1-17** | Engelse vertalingen, één ronde | 46 velden op de twee aanmaakpagina's + 3 losse |
 | **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
   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
 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.**
 Pagina: **`horecagelegenhedenOverzichtCurrent`**. P2-6 heeft het zoekveld op 5
 van de 6 tabs werkend en live op een toestel bevestigd (zie het