Przeglądaj źródła

Sessie afgesloten: taken 98/98A/98B/99 af en uit TASKS.md verwijderd

Agenda-knop op EventCurrent werkt, door Bob bevestigd op een echt toestel
(tijden kloppen). Login navigeert na succes naar Favorieten.

Blijvende inzichten verhuisd naar CLAUDE.md:
- flutterflow_events levert datum_iso (Y-m-d H:i, lokaal, geen seconden)
- add_2_calendar moet ^3.0.1 blijven (Dart 3.9.2)
- de AOSP-kalender van beide AVD's is kapot: agenda-intents niet testbaar
- Custom Code-editor: cursor met pijltjestoetsen, niet met een klik
- Action Flow Editor + "|<" maakt ook het laatste argument bereikbaar

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 16 godzin temu
rodzic
commit
61732113ff
2 zmienionych plików z 50 dodań i 130 usunięć
  1. 50 0
      CLAUDE.md
  2. 0 130
      TASKS.md

+ 50 - 0
CLAUDE.md

@@ -453,6 +453,17 @@ van hem aan te nemen.
   en welk nid eruit kwam. Veruit de snelste manier om een indiening na te gaan;
   je hoeft de node niet eerst op de site te zoeken.
 
+**⚠️ De AOSP-kalender van BEIDE AVD's is kapot — een agenda-intent is daar niet
+te testen.** Bevestigd 2026-09-19: het manifest declareert
+`com.android.calendar/.EditEventActivity` mét de INSERT-filter (dus Android
+routeert de intent er netjes heen), maar de klasse zit niet in de APK →
+`ClassNotFoundException`, de kalender-app crasht en de eigen app komt gewoon
+weer op de voorgrond. `cmd package resolve-activity --brief -a
+android.intent.action.INSERT -d content://com.android.calendar/events` geeft op
+allebei "No activity found". Je kunt dus wél bewijzen dát de intent vertrekt
+(`adb logcat | grep "action.INSERT"`), maar niet hoe de dialoog eruitziet —
+daarvoor is een echt toestel nodig.
+
 **Screenshots van de website zelf (voor look&feel-vergelijkingen):
   headless Chromium werkt, maar met twee valkuilen.** (1) Snap-Chromium
   mag niet schrijven in `/tmp/claude-*` (Permission denied) — schrijf
@@ -3116,6 +3127,22 @@ Het `townid`-filter zelf is betrouwbaar, en dit is een bruikbaar
 positief/negatief controlepaar: Valkenburg `27301` geeft items, buurplaats
 Berg `27286` geeft er 0.
 
+**`flutterflow_events` services_1 levert sinds 2026-09-19 ook `datum_iso`** —
+`Y-m-d H:i`, lokale (Nederlandse) tijd, *start* only. ⚠️ **Zonder seconden**:
+de Date-module strippt de `s` uit het custom format omdat de granularity van
+`field_date` die niet kent. `DateTime.tryParse` accepteert dat gewoon (getest
+met en zonder seconden en met milliseconden). Er is **geen** eindtijd-veld —
+bewust, Bob 2026-09-19. Het oude `datum` (`zaterdag 19 sep, 9:00`) blijft
+ernaast bestaan voor weergave; gebruik dat nooit om op te rekenen.
+
+**De agenda-knop op `EventCurrent` draait op `add_2_calendar`, en die moet op
+`^3.0.1` blijven staan.** Versies vanaf 3.1.0 eisen Dart >= 3.11; dit project
+zit op Flutter 3.35.7 / Dart 3.9.2, dus `pub get` weigert dan met een
+misleidende "Try using the Flutter SDK version 3.47.5". De custom action
+`zetInAgenda` (7 argumenten) zet `eind = start` zodat de agenda-app zelf zijn
+standaardduur kiest, voegt adres + plaats samen en plakt `https://uitgk.com/<nid>`
+bovenaan de omschrijving (forward-domein naar `uitgaanskrant.com/node/<nid>`).
+
 **Twee views die allebei "events" heten doen iets anders — en het verschil
 is precies een datumfilter.** `flutterflow_events` (evenement-detail, param
 `nid`) bevat **alles**, ook verlopen events; `flutterflowmobiel_establishment_events`
@@ -3814,6 +3841,29 @@ verwachte regel, i.p.v. blind op de "Synced"-badge te vertrouwen.
   blijvende schade). Sluit dus eerst met Escape elk open contextmenu
   vóór je `⌘+K` gebruikt.
 
+**In de Custom Code-editor: positioneer de cursor met PIJLTJESTOETSEN, niet met
+een klik, als je midden in een regel moet invoegen.** Bevestigd 2026-09-19 bij
+het uitbreiden van een functiesignature: een klik die bedoeld was vlak vóór de
+`)` landde midden in `async`, waardoor er `plaats) as, String? nidync {` kwam te
+staan. Herstel is simpel (`BackSpace` met `repeat`), maar voorkomen is beter:
+klik ergens in de buurt, kijk met een `zoom` waar de cursor staat, en loop dan
+met `Left`/`Right` (die accepteren ook `repeat`) naar de exacte plek.
+- **Nieuwe parameters achteraan toevoegen is veilig**: FlutterFlow vraagt bij
+  Ctrl+S *"Parameters in the settings don't match…"* → **Yes**, en de al
+  gebonden argumenten blijven daarbij gewoon staan (2x geverifieerd). De
+  aanroepers missen dan alleen het nieuwe argument — `dart analyze` meldt dat
+  netjes met `N positional arguments expected, but M found`.
+- **Het laatste argument van een lange lijst is wél bereikbaar via de Action
+  Flow Editor**: knop *Edit* naast "Action Flow Editor", dan het
+  **"|<"-icoontje** linksboven om de trigger-kolom in te klappen, en desnoods de
+  argumenten erboven inklappen via hun chevron (van onder naar boven, dan
+  schuiven de nog te klikken chevrons niet). Zo waren 7 argumenten allemaal te
+  zetten — dit nuanceert de oudere `evenementCreate`-notitie hierboven.
+- ⚠️ **Batch nooit blind door in de Set-Variable-dialoog.** Eén blinde
+  vervolgklik landde op de rij `horecaid` in de bronnenlijst en bond dat aan het
+  verkeerde argument; dat kostte een hele herstelronde. Eén stap per
+  tool-aanroep, met een `zoom` ertussen.
+
 **⚠️ Het ⌘+K-commandopalet negeert de eerste typ-actie — en die tekst landt dan
 in de CUSTOM CODE-EDITOR eronder.** Bevestigd 2026-09-19: twee keer "home" getypt
 om naar de Home-pagina te springen; het palet bleef leeg en `home` `home` werd

+ 0 - 130
TASKS.md

@@ -20,7 +20,6 @@ oppakken.
 | # | Taak | Kort |
 |---|---|---|
 | ~~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** (2026-09-19). 98A en 98B zijn af; alleen de knop op `EventCurrent` rest nog |
 | **65** | Release-build doorloop | ✅ **Uitgelogde deel af 2026-09-19** (0 crashes; 65a, 65b en 65d-kleur opgelost; 65c + 65e open). Rest = ingelogd + Xiaomi → Bob |
 | ~~P2-24 B~~ | Categoriedropdown horeca-overzicht | ✅ **AF 2026-09-19** (Claude, export-geverifieerd): opties+labels per tab, On Selected zet de page state, On Tab Change reset beide, hint "Alle categorieën", volle breedte |
 | ~~99/100/101~~ | Loginvelden · drawer-logo · Crashlytics-console | ✅ **ALLE DRIE AF 2026-09-19** (export-geverifieerd). ⚠️ Crashtest-knop opruimen blijft open: staat op `Favorieten`, pagina van 88B |
@@ -150,134 +149,6 @@ bouw eerst evenementen helemaal af en kopieer daarna pas, niet allebei tegelijk.
 
 ---
 
-### 🆕 98 · "Zet in mijn agenda"-knop op een evenement · Claude — **BEZIG** (2026-09-19)
-
-Knop op `EventCurrent` die het evenement in de agenda van de telefoon zet, via
-het pub-pakket **`add_2_calendar` 3.1.1** (160/160 pub points, 364 likes, 134k
-downloads/maand, MIT). Zelf bouwen kan niet: iOS vereist EventKit in Swift via
-een platform channel, en dat kan FlutterFlow's Custom Code niet.
-
-**Blokkeert op 98A** — `flutterflow_events` levert alleen `datum` als
-Nederlandse weergavestring (`zaterdag 19 sep, 9:00`): geen jaartal, geen
-eindtijd. Gemeten op nid 214439, 2026-09-19.
-
-Stappen:
-1. **98A** (Bob, Drupal) — ISO start/eind aan de view toevoegen.
-2. ✅ **iOS-permissie uitgezocht (Claude, 2026-09-19): FlutterFlow heeft
-   gewoon een "Calendar"-rij** in App Settings → Permissions, dus de plist is
-   te regelen. ⚠️ **Maar het tekstveld ernaast is voor Claude onbruikbaar** —
-   het slaat elke toetsaanslag op als eigen plist-entry (69 dubbele keys in de
-   export, breekt de iOS-build). Zie de nieuwe notitie in `CLAUDE.md`. Het
-   project is weer schoon achtergelaten (permissie uit, 0 keys).
-   👉 **Overgedragen aan Bob — zie 98B.** Android heeft niets nodig.
-3. ✅ **Dependency staat erin (Claude, 2026-09-19): `add_2_calendar: ^3.0.1`**
-   via App Settings → Project Dependencies → Custom Pub Dependencies.
-   ⚠️ **Niet ^3.1.1**: versies vanaf 3.1.0 eisen Dart >= 3.11, en dit project
-   draait Flutter 3.35.7 / Dart 3.9.2. `pub get` lost 3.0.1 op.
-4. ✅ **Custom action `zetInAgenda` staat er** (Claude, 2026-09-19),
-   `Future<bool>`, 5 argumenten (`titel`, `startIso`, `eindIso?`, `locatie?`,
-   `omschrijving?`). Doet: ISO parsen, eindtijd = start + 2 uur als er geen is,
-   HTML uit de omschrijving strippen en afkappen op 500 tekens, lege titel →
-   "Evenement". Geverifieerd op een verse export: **0 analyse-errors** tegen het
-   echte pakket.
-5. ✅ **Knop staat op `EventCurrent`** (Claude, 2026-09-19) — naast de bestaande
-   deel-knop in de titel-`Row`, gemaakt door die `Tooltip > IconButton` te
-   **dupliceren** (stijl en tooltip komen dan gratis mee). Icoon
-   `Icons.event_available`, tooltip "Zet in mijn agenda". Bindingen, alle vijf
-   geverifieerd op een verse export:
-   `titel` -> `$[0].title` · `startIso` -> `$[0].datum_iso` · `eindIso` -> leeg
-   · `locatie` -> `$[0].adres` · `omschrijving` -> `$[0].body` ·
-   `plaats` -> `$[0].plaats`.
-   **Plus (Bob 2026-09-19): `nid` -> page parameter `nid`**, waarmee de action
-   `https://uitgk.com/<nid>` bovenaan de omschrijving zet (het forward-domein
-   dat doorstuurt naar `uitgaanskrant.com/node/<nid>`).
-   **Bob's besluiten 2026-09-19: GEEN eindtijd** (de action zet `eind = start`,
-   zodat de agenda-app zelf zijn standaardduur kiest i.p.v. dat wij 2 uur
-   verzinnen) en **locatie = adres + plaats** (de action voegt ze samen en slaat
-   een leeg deel over, dus nooit een losse komma).
-   **Geen Visibility-conditie** — gemeten op 300 productie-events: `datum_iso`
-   en de andere velden zijn er altijd, dus de knop werkt altijd; een conditie
-   zou alleen het P2-44-risico (bool-cast zonder null-check) introduceren.
-6. ⏳ **Laatste stap: één tik op een ECHT toestel** (Bob) — op beide AVD's niet
-   te testen, zie hieronder.
-7. ✅ **Engelse tooltip gecorrigeerd** (2026-09-19): sleutel `e08zfyf3` stond op
-   `en: "Share"` — geërfd van de gedupliceerde deel-knop (het bekende
-   `Duplicate`-patroon, zie `CLAUDE.md`). Nu `en: "Add to my calendar"`,
-   export-geverifieerd.
-
-**Wat wél bewezen is (profile-build, emulator-5554, 2026-09-19):** de knop
-rendert, een tik roept de action aan en die vuurt de juiste intent af
-(`act=android.intent.action.INSERT dat=content://com.android.calendar/…`).
-De app zelf geeft geen enkele fout en komt netjes terug op de voorgrond.
-⚠️ **Wat de AVD's niet kunnen:** hun AOSP-kalender is een kapotte stub — het
-manifest declareert `com.android.calendar/.EditEventActivity` mét de
-INSERT-filter (dus Android routeert de intent erheen), maar de klasse zit niet
-in de APK: `ClassNotFoundException`, de kalender-app crasht. Geldt voor
-**beide** AVD's (`cmd package resolve-activity` geeft op allebei "No activity
-found"). Emulator-defect, geen app-bug — maar de voorgevulde agenda-dialoog is
-daardoor alleen op een echt toestel te zien.
-
-### ✅ 98B · Calendar-permissietekst — AF (Bob, 2026-09-19)
-
-Verse export geeft precies 3 `UsageDescription`-keys, één `NSCalendarsUsageDescription`
-met de volledige zin. **Belangrijk nevenresultaat: het per-toetsaanslag-probleem
-dat Claude tegenkwam is Claude-specifiek, niet een FlutterFlow-bug** — zie de
-bijgewerkte notitie in `CLAUDE.md`.
-
-<details><summary>oorspronkelijke opdracht</summary>
-
-
-App Settings → Permissions → rij **Calendar**: toggle aan en als bericht
-`Deze app vraagt toegang tot je agenda om een evenement toe te voegen.`
-Controleer daarna op een **verse export**:
-`grep -c "UsageDescription" ios/Runner/Info.plist` → moet **3** geven (Camera,
-PhotoLibrary, Calendar). Geeft het er tientallen, dan heeft jouw browser
-hetzelfde per-toetsaanslag-probleem als Claude's; zet de toggle dan weer uit
-(dat ruimt alles op) en meld het.
-</details>
-
-### ✅ 98A · ISO-datum aan `flutterflow_events` — AF, STAAT OP PRODUCTIE (2026-09-19)
-
-Geverifieerd op productie mét én zonder cache-buster (dus cache geleegd):
-nid 214439 → `datum_iso: "2026-09-19 09:00"`, nid 222813 → `"2026-12-10 20:30"`.
-Repeat rule staat op *Hide*. Onderstaande devbob-meting blijft als naslag.
-
-
-Bob heeft veld `field_date_1` toegevoegd met label **`datum_iso`**, formatter
-Date and time → *custom*, format `Y-m-d H:i:s`, Display *Start date only*.
-**Geen eindtijd** (Bob's besluit 2026-09-19) — de custom action maakt er
-start + 2 uur van.
-
-**Getest door Claude op devbob (2026-09-19), 1200 unieke events gescand:**
-1200 schoon parseerbaar, 0 leeg, 0 afwijkend; de tijd komt exact overeen met
-het bestaande `datum`-veld, dus de tijdzone klopt.
-- ⚠️ **Let op: de output heeft GEEN seconden** (`2026-09-19 09:00`), ondanks
-  `H:i:s` in het format — de Date-module strippt `s` omdat de granularity van
-  `field_date` geen seconden kent. **Geen probleem:** `DateTime.tryParse` in
-  `zetInAgenda` accepteert dat, en ook mét seconden en milliseconden
-  (alle vier getest). Een leeg veld én het oude `datum`-formaat worden netjes
-  geweigerd (`false`, geen crash).
-- ⚠️ **Restpuntje voor Bob:** het nieuwe veld staat op
-  `'show_repeat_rule' => 'show'`, het bestaande `datum`-veld op `'hide'`. Bij
-  een event mét herhaalregel plakt Date die tekst achter de waarde en is
-  `datum_iso` onparseerbaar (gevolg is mild: knop doet niets). Geen van de 1200
-  events heeft er nu een. **Zet 'm bij de productie-ronde op "Hide repeat
-  rule".**
-
-**Nog te doen: naar productie**, daarna `drush cc all` **én** de Cloudflare-cache
-purgen (dit endpoint zit in de 5-minuten Cache Rule).
-
-
-### ✅ 99 · Na inloggen bleef je op het inlogscherm — OPGELOST (Claude, 2026-09-19)
-
-De Inloggen-knop op `login` deed `drupalLogin` + een snackbar en **navigeerde
-nergens heen**: in de hele actieketen stond geen enkele `goNamed`/`pushNamed`,
-dus je zag "Succesvol ingelogd!" en bleef staan waar je stond.
-**Fix:** in de TRUE-tak van de conditie (`resultDrupalLogin is set`), ná de
-snackbar, een **Navigate To → favorieten** met **Allow Back Navigation uit**.
-Export bevestigt `context.goNamed(FavorietenWidget.routeName);` binnen
-`if (_model.resultDrupalLogin != null)`, dus geen terugweg naar het inlogscherm.
-
 ### 🆕 102 · Ontbrekend asset + de asset-crash in Crashlytics · Eigenaar: Bob (upload) + Claude (meten)
 
 **Gevonden 2026-09-19 dankzij de zojuist ontsloten Crashlytics.** Het dashboard
@@ -479,7 +350,6 @@ ziet — en blijft alleen het provincie-geval scheef.
 verse export — zie de commit van die datum.)*
 
 
-
 ---
 
 ## 🅖 G · GOOGLE PLAY — volledige checklist · Eigenaar: Bob