소스 검색

Taak 129 genoteerd + 128-B wordt een vierde tab op mijnProfiel

Correctie op mijn eigen bewering: de sessie-verlopen-afhandeling bestaat
wel degelijk. Een verse export toont de 401/403-anonymous-logica in
drupal_request.dart en VerbindingsBanner in HeaderButtonsComponent -- het
zit alleen in de builder en niet in de gecommitte lib/, waar ik naar
keek. Als taak 129 genoteerd om in een andere chat te verifieren.

Daarbij gemeten: 86 bestanden verschil tussen de gecommitte lib/ en de
builder, waaronder de FilterBalk-familie en een tabindeling op
mijnProfiel die lokaal nog niet bestond. Niet gecommit -- er loopt een
andere sessie.

128-B aangepast naar Bobs wens: nieuwsbrieven wordt een losse tab. Dat
is eenvoudiger dan gedacht, want mijnProfiel heeft al een TabBar met
drie tabs. 128-C: de waarschuwingsknop gaat naar selectprovinciegemeente,
een pagina zonder parameters.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 16 시간 전
부모
커밋
9021d30998
1개의 변경된 파일77개의 추가작업 그리고 19개의 파일을 삭제
  1. 77 19
      TASKS.md

+ 77 - 19
TASKS.md

@@ -56,6 +56,7 @@ Google Play en één doorloop die alleen Bob kan doen.
 | **124-126** | Stadsrechten-cascade op `stadsactiviteitAanmaken` | Voorvullen van provincie/gemeente/plaats (124), een **crash** bij een lege plaatsenlijst (125) en een stille verkeerde plaats bij het wisselen van gemeente (126). Eigen blok hieronder |
 | **127** | **Kopie-knop op `MijnAanmeldingen`** (clonen) | Wens Bob 2026-09-20, **vóór de livegang**. Backend bestaat al; Drupal-patch voor 3 gaten staat klaar en is getest (127-A). App-deel in stappen B t/m F; het activiteitendeel (127-E) deelt de cascade met 124. Eigen blok hieronder |
 | **128-A** | ✅ **KLAAR** — nieuwsbrieven-resource staat live | Gedeployd en getest op productie 2026-09-21. Rest: één tikfout in de omschrijving van tid 36676 (*verstuurt* → verstuurd), zie het blok hieronder |
+| **129** | Sessie-verlopen-melding afmaken/verifiëren | **Niet in deze chat** (Bob 2026-09-21). De afhandeling bestaat: `drupalRequest` herkent 401 en 403-met-"anonymous", zet `sessieVerlopen` en `VerbindingsBanner` hangt in `HeaderButtonsComponent`. Staat alleen **in de builder, niet in de gecommitte `lib/`** — dus nooit geëxporteerd/gecommit. Nalopen of het af is en of de banner ook echt verschijnt. Eigen blok hieronder |
 
 ---
 #
@@ -242,25 +243,42 @@ ontbreekt), niet 404.
 bestaande Cloudflare Cache Rules (die matchen op `/flutterdrup/views/…`,
 `plaatsen`), dus dat gaat vanzelf goed; het mag er alleen nooit bij.
 
-### 128-B · App: blok "Nieuwsbrieven" op `mijnProfiel` · Eigenaar: Claude
-
-Derde blok onder "Mijn horecagelegenheden" en "Mijn redactierechten", in
-dezelfde vorm. Backend Query op de nieuwe call + **Generate Dynamic Children**,
-zodat een vierde nieuwsbrief vanzelf verschijnt. Per rij: naam, omschrijving
-eronder (`bodySmall`/`secondaryText`, het hulpregel-patroon van taak 91), rechts
-een **Switch**. On Toggle -> `drupalRequest` naar subscribe/unsubscribe met
-`{"tid": …}` — exact het patroon van het hartje op
-`HorecagelegenheidCurrent`.
-
-⚠️ **Predefined Path `items` (`$[:]`, Is List) gebruiken, geen JSON Path `$`** —
-anders crasht het blok bij een mislukte call (`jsonBody == null`).
-⚠️ **Testrespons in FlutterFlow moet gevuld zijn** vóór je `$.status` bindt,
-anders krijgt het pad type "Anything" en plakt de builder er `.toString()`
-achter.
-
-Bij status 2 een regeltje "Check je mail om je inschrijving te bevestigen"
-tonen (Visibility-conditie op `$.status == 2`). Bij `confirm = FALSE` komt die
-stand nooit voor, maar dan is de app al klaar als Bob later wisselt.
+### 128-B · App: vierde tab "Nieuwsbrieven" op `mijnProfiel` · Eigenaar: Claude
+
+**Bob 2026-09-21: het wordt een losse TAB op de profielpagina**, geen blok
+onderaan. Dat is gunstig, want `mijnProfiel` heeft al een `TabBar` met drie
+tabs — *Mijn evenementen*, *Stadseditor*, *Account* (controller
+`tabBarmijnevenementenController`, `TabBar` op regel 188 van de verse export).
+Een vierde toevoegen gaat via het bekende recept: `TabBar`-node selecteren →
+**"Active Tab"**-dropdown → onderaan **"+ Add Tab"** → hernoemen naar
+*Nieuwsbrieven*. Dat voegt meteen een bijpassende lege `TabBar Page` toe.
+
+In die tab:
+1. **API Call** `Nieuwsbrieven` (GET `/nl/flutterdrup/nieuwsbrieven.json`) met
+   de Cookie-header in het `[session_name]=[sessid]`-formaat — **rechte haken,
+   geen `{{ }}`** — en de aanroeper moet `sessionName`/`sessid` uit App State
+   meegeven, anders gaat er `Cookie: =` mee.
+2. **Backend Query + Generate Dynamic Children.** Bind via **Predefined Path**
+   (`$[:]`, Is List) en niet via JSON Path `$`, anders crasht de tab bij een
+   mislukte call.
+3. Per rij: naam + omschrijving eronder (`bodySmall` / `secondaryText`), rechts
+   een **Switch** met Initial Value op `$.geabonneerd`.
+4. **On Toggle → `drupalRequest`** naar `nieuwsbrieven/subscribe.json` resp.
+   `unsubscribe.json`, body `{"tid": <$.tid>}`.
+
+⚠️ **Geef de CSRF-token mee** (zie het blok bij 128-A): exact dezelfde vijf
+argumenten als het favorieten-hartje, inclusief `FFAppState().userToken`.
+Vergeet je die, dan komt er `["CSRF validation failed"]` terug, geeft
+`drupalRequest` stil `[]` en lijkt de switch te werken terwijl er niets gebeurt.
+
+⚠️ Doe "Test API Call" met een gevulde respons vóór je `$.status`/`$.geabonneerd`
+bindt, anders krijgt het pad type "Anything" en plakt de builder er
+`.toString()` achter.
+
+Bij `status == 2` een regel "Check je mail om je inschrijving te bevestigen"
+tonen. Die stand komt met de huidige instelling nooit voor (ingelogde
+gebruikers worden direct verwerkt), maar dan is de app al klaar als dat ooit
+verandert.
 
 ### 128-C · Waarschuwing bij 0 gevolgde gemeenten · Eigenaar: Claude
 
@@ -269,6 +287,10 @@ wekelijkse agenda hebben nul favoriete gemeenten**, en de laatste editie
 (nid 222817, 2026-09-17) ging naar `sent_subscriber_count: 3`. Wie die switch
 aanzet zonder gemeenten te volgen, krijgt dus niets — zonder enige uitleg.
 
+**Bestemming van de knop is uitgezocht:** pagina **`selectprovinciegemeente`**
+(`/selectprovinciegemeente`) — die heeft **geen parameters**, dus de actie is
+één kale `Navigate To` zonder bindingen.
+
 Onder de rij van tid 36676 een waarschuwing tonen wanneer
 `FFAppState().favorieteGemeenteIds` leeg is, met een knop naar het
 gemeente-keuzescherm. Visibility via de bekende route: App State-lijst ->
@@ -294,6 +316,42 @@ meenemen: *"Deze wordt donderdagavond **verstuurt**"* -> *verstuurd*.
 aangemeld maar nooit op de bevestigingslink geklikt en krijgen dus niets. Geen
 app-probleem, wel het sterkste argument voor `confirm = FALSE` in de app.
 
+## 🔔 129 · Sessie-verlopen-melding — verifiëren · Eigenaar: Bob (andere chat)
+
+**Bob 2026-09-21: niet in deze chat oppakken, alleen noteren.**
+
+**Het bestaat wél** — ik beweerde eerst van niet, op basis van de gecommitte
+`lib/`, en dat was te snel. Een verse export van 2026-09-21 toont:
+- `lib/custom_code/actions/drupal_request.dart` herkent **401**, en **403 mét
+  het woord "anonymous"**, maar alleen als er daadwerkelijk een cookie meeging
+  (een 403 zonder dat woord is een rechtenkwestie en mag niemand uitloggen);
+  hij zet dan `FFAppState().sessieVerlopen = true`.
+- `VerbindingsBanner` staat op `header_buttons_component_widget.dart:275`, dus
+  in de gedeelde header.
+
+**Wat er te verifiëren valt:** of de banner in de praktijk ook echt verschijnt
+bij een verlopen sessie, en of de overzichten dan niet leeg blijven (dat was de
+aanleiding). Reproduceren kan door `userSessionid` in App State te vervuilen en
+een pagina te openen die een `drupalRequest` doet (Favorieten, Mijn Profiel).
+
+⚠️ **Dit werk staat alleen in de builder, niet in git.** Zie de waarschuwing
+hieronder.
+
+### ⚠️ 86 bestanden verschil tussen de gecommitte `lib/` en de builder
+
+Gemeten 2026-09-21 met een verse export: `diff -rq lib/ /tmp/ff-nb/lib/` geeft
+**86 regels**. Daar zit onder meer in: de complete sessie-verlopen-afhandeling,
+`VerbindingsBanner` in de header, de `FilterBalkComponent`-familie, een vierde
+tab-indeling op `mijnProfiel` (*Mijn evenementen* / *Stadseditor* / *Account*,
+waar de gecommitte versie nog losse blokken zonder tabs heeft) en
+`crashlytics_test.dart`.
+
+**Niet gecommit door mij**, want er liep op dat moment een andere
+FlutterFlow-sessie en dat werk kan half af zijn (staande regel: niet over
+andermans werk heen committen). Zodra die sessie klaar is, is een verse export
++ commit waarschijnlijk op zijn plaats — dan loopt git weer gelijk met de
+builder en kloppen dit soort metingen weer.
+
 ## 🔭 VERSIE 2.0 — na de livegang · niet agenderen vóór release
 
 *Ideeën die af zijn onderzocht maar bewust wachten. Bob 2026-09-20: eerst live,