Просмотр исходного кода

P0-6 afronding + P1-13/P1-7/P0-hintText sessienotities: eerdere sessie had niet gecommit (afsluitroutine gemist)

- P0-6: 5 debug-navigatieknoppen op Login verwijderd, live geverifieerd op telefoon+tablet
- P1-18: root cause + fix voor login-crash/sessie-niet-opgeslagen gedocumenteerd
- P1-13: overflow-onderzoek (hypothese weerlegd, stack-trace-beperking gedocumenteerd)
- P1-7: favorieten-scope + App State-blokkade gedocumenteerd
- .gitignore: .claude/-uitsluiting hersteld (export had 'm overschreven)
- iOS pbxproj: UUID-churn van export (geen functionele wijziging)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 1 месяц назад
Родитель
Сommit
6352bb6fd3
3 измененных файлов с 90 добавлено и 19 удалено
  1. 25 0
      CLAUDE.md
  2. 61 15
      TASKS.md
  3. 4 4
      ios/Runner.xcodeproj/project.pbxproj

+ 25 - 0
CLAUDE.md

@@ -622,6 +622,31 @@ eerst hier verder zoeken vóór blind te herhalen wat hierboven al niet
 werkte, en anders vroeg overdragen aan Bob i.p.v. tijd te verliezen
 werkte, en anders vroeg overdragen aan Bob i.p.v. tijd te verliezen
 (kostte deze sessie ~1,5 uur zonder resultaat).
 (kostte deze sessie ~1,5 uur zonder resultaat).
 
 
+**"+ Add App State Variable"/"+ Add App Constant"-knop reageert niet
+op Claude's klikken (2026-08-09).** Op zowel `?tab=appValues&appValuesTab=state`
+als `...=constant` (bereikbaar via ⌘+K → typ een bestaande App
+State-naam → Enter, betrouwbaarder dan de linker-navigatierail
+klikken — zie hieronder): een klik op de knop opent **geen dialoog**,
+voegt **geen rij toe** (geverifieerd via de paneel-eigen zoekbalk erna
+— 0 resultaten), en blind doortypen na de klik komt nergens terecht.
+6+ pogingen (directe klik, exacte pixel-herpositionering op zowel
+tekst als "+"-icoon, klik+wachten 2s, klik+blind-typen) — geen
+resultaat, geen zichtbare foutmelding. Navigeren tussen "App State"/
+"Constants" in de linkerrail en het zoekveld typen werkten in dezelfde
+sessie wél probleemloos, dus dit is geen algemene klik-doodheid van de
+pagina, specifiek deze twee "Add"-knoppen. **Los probleem:** mogelijk
+gerelateerd aan de bekende `Confirm`-freeze-patronen elders in dit
+bestand, maar hier verscheen zelfs geen gedeeltelijke dialoog om
+vast te lopen — niets gebeurde. Ook: de rij-`✏️`-edit-iconen op
+bestaande App State-velden reageerden even onbewogen. **Nog niet
+geprobeerd:** browser-zoom (blijkt via keyboard-shortcut geblokkeerd,
+"page zoom keyboard shortcuts are not supported" — alleen de
+`zoom`-tool voor screenshots, niet de pagina zelf); Bob's eigen
+browser (geen bekende clipping daar). **Vuistregel voor volgende
+sessie:** nieuwe App State-velden/Constants zijn voor Claude niet
+zelfstandig toe te voegen — na 1-2 pogingen overdragen aan Bob met
+exacte veldnaam+type-specificatie (kost hem seconden per veld).
+
 ## Domein/architectuurcontext
 ## Domein/architectuurcontext
 
 
 - **Taal/locale volgt het toestel, niet hardcoded Nederlands** — zonder
 - **Taal/locale volgt het toestel, niet hardcoded Nederlands** — zonder

+ 61 - 15
TASKS.md

@@ -451,13 +451,63 @@ nl-NL` (betrouwbaardere per-app-locale-override dan de systeembrede
 emulator niet altijd doorwerkte zonder reboot) kwam de tekst meteen
 emulator niet altijd doorwerkte zonder reboot) kwam de tekst meteen
 terug — bevestigt dat dit puur een vertaalprobleem is, geen widget-bug.
 terug — bevestigt dat dit puur een vertaalprobleem is, geen widget-bug.
 
 
-**P1-7 · Eigenaar: Bob.** Account/profielscherm (wachtwoord wijzigen,
-uitloggen, account verwijderen). Bovenop de login/favorieten-P0-basis.
-Account verwijderen heeft mogelijk AVG-implicaties aan Drupal-kant.
-**Let op prioriteit:** dit is niet alleen "nice to have" — Apple's App
-Store Review Guideline 5.1.1(v) eist dat een app die accountaanmaak
-aanbiedt ook **in-app accountverwijdering** aanbiedt; zonder dit
-scherm is een iOS-store-submissie een blokkade, niet alleen P1.
+**P1-7 · Eigenaar: Claude — bezig (2026-08-09).** Favorieten-pagina +
+profielscherm — Bob heeft de scope + designbeslissingen 2026-08-09
+gegeven, absorbeert ook het oude P2-8 (gemeente-favoriet). **Belangrijke
+bevinding vooraf (code-audit, niet eerder gedocumenteerd):** de
+3-tabblad-structuur op `FavorietenWidget` bestaat al (`Persoonlijke
+agenda`/`Favoriete gemeenten`/`Favoriete Gelegenheden`), maar **alle 3
+tabs zijn pure placeholder-tekst — geen enkele API-call/FutureBuilder**.
+Én: het hartje op zowel de horeca-overzichtskaart als de
+horeca-detailpagina is een kale `print('IconButtonFavoriet pressed
+...')`-stub (`horecagelegenheidoverzicht_kaart_widget.dart:334`,
+`horecagelegenheid_current_widget.dart:364`) — **er bestaat nergens in
+de codebase een POST/toggle-call om een favoriet daadwerkelijk op te
+slaan**, alleen de GET-only `FavorietenAgendaCall` (ondanks de naam:
+geeft favoriete horecagelegenheden terug, geen agenda/events). De
+eerdere P0-4-aantekening "hartje... af" klopte dus alleen voor het
+zichtbare icoon, niet voor de functionaliteit erachter.
+
+**Bob's beslissingen (2026-08-09):**
+1. Favorieten (zowel horeca als gemeenten) worden **Drupal-gesynchroniseerd**,
+   niet puur lokaal — sync bij app-start én direct na elke
+   toevoegen/verwijderen-actie. Lokale opslag (`FFAppState`/
+   secureStorage) blijft daarnaast nodig als cache/snelle UI-state.
+2. "Persoonlijke agenda" (tab 1) = events in de door de gebruiker
+   **gefavoriete gemeente(n)** (niet de her-toegekende naam "agenda" op
+   de bestaande horeca-GET-call — dat is een aparte, nog te bouwen
+   view).
+3. "Gebruiker"-tab = het oude P1-7-scope (wachtwoord wijzigen,
+   uitloggen, account verwijderen), nu als tab i.p.v. aparte pagina.
+   Account verwijderen heeft mogelijk AVG-implicaties aan Drupal-kant.
+   **Let op prioriteit:** Apple's App Store Review Guideline 5.1.1(v)
+   eist in-app accountverwijdering voor een app met accountaanmaak —
+   zonder dit scherm blokkeert een iOS-submissie, niet alleen P1.
+
+**Open vraag aan Bob (blokkeert het schrijf-/sync-gedeelte):** bestaat
+er al een Drupal-endpoint om een favoriet (horeca of gemeente) toe te
+voegen/verwijderen voor een ingelogde gebruiker (bv. Flag-module of een
+custom Services-resource), of moet dat nog gebouwd worden? Zonder
+endpoint-naam/-vorm kan Claude alleen de lokale kant (state, UI,
+hartje-toggle-optimistic-update, logout) bouwen, niet de sync.
+**Onbelemmerd te bouwen, ongeacht antwoord:** `FFAppState`-velden voor
+lokale favorieten-lijsten (gemeenten + horeca), hartje-toggle die lokaal
+al werkt (optimistic UI), uitloggen op de Gebruiker-tab (geen backend
+nodig — alleen `FFAppState`-sessievelden wissen + terug naar Login).
+
+**Geblokkeerd voor Claude (2026-08-09), klein klusje voor Bob:** de
+"+ Add App State Variable"-knop (`?tab=appValues&appValuesTab=state`)
+reageert niet op Claude's klikken — geen dialoog, geen nieuwe rij, 6+
+pogingen zonder resultaat (zie `CLAUDE.md` voor details). **Bob: graag
+deze 2 App State-velden zelf toevoegen** (kost seconden in eigen
+browser):
+1. `favorieteGemeenteIds` — type `List<String>` (gemeente-ID's, zelfde
+   ID-vorm als `gemeenteSelectId`/`gemeentelijst`), Persisted: true.
+2. `favorieteHorecaNids` — type `List<String>` (horeca-`nid`'s, zelfde
+   vorm als `FavorietenAgendaCall.establishmentNid`), Persisted: true.
+
+Zodra deze 2 velden bestaan kan Claude verder (hartje-toggle, tab-content
+vullen) — de rest van de bouw hangt hier niet losstaand van vast.
 
 
 **P1-12 · Eigenaar: Bob (builder, gegenereerde code niet lokaal te
 **P1-12 · Eigenaar: Bob (builder, gegenereerde code niet lokaal te
 fixen).** `EventCurrent` crasht direct (Null check operator used on a
 fixen).** `EventCurrent` crasht direct (Null check operator used on a
@@ -795,11 +845,7 @@ code).
   wordt nergens meer aangeroepen — dode API-call-definitie (gevonden
   wordt nergens meer aangeroepen — dode API-call-definitie (gevonden
   bij de P1-10-performance-audit 2026-08-05).
   bij de P1-10-performance-audit 2026-08-05).
 
 
-**P2-8 · Eigenaar: Onbepaald.** Hartje-tap-actie op de getoonde
-gemeente-/provincienaam (favoriete plaats maken/markeren) — losgemaakt
-van P0-3 (2026-08-05, Bob: te veel voor de eerste release). Naam wordt
-inmiddels al getoond op de meeste pagina's via `HeaderButtonsComponent`
-(zie P0-3); dit punt is puur de hartje-tap-functionaliteit erbovenop.
-Hing af van de `FavorietenAgenda`-403-fout — die bleek onderdeel van
-de login-sessie-bug, root cause gevonden + functioneel gefixed
-(2026-08-09, zie P0-4/P1-18). Kan nu opgepakt worden.
+**P2-8 · Opgegaan in P1-7 (2026-08-09).** Hartje-tap op gemeente-/
+provincienaam om te favorieten is nu onderdeel van de bredere
+Favorieten-pagina/profielscherm-taak — zie P1-7 hierboven voor scope en
+status.

+ 4 - 4
ios/Runner.xcodeproj/project.pbxproj

@@ -44,8 +44,8 @@
 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		6436409E27A31CD600820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		6436409427A31CDF00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409A27A31CD500820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409F27A31CD500820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
@@ -225,8 +225,8 @@
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			isa = PBXVariantGroup;
 			children = (
 			children = (
-				6436409E27A31CD600820AF7 /* nl */,
-				6436409427A31CDF00820AF7 /* en */,
+				6436409A27A31CD500820AF7 /* nl */,
+				6436409F27A31CD500820AF7 /* en */,
 			);
 			);
 			name = InfoPlist.strings;
 			name = InfoPlist.strings;
 			sourceTree = "<group>";
 			sourceTree = "<group>";