|
@@ -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 |
|
|
| **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 |
|
|
| **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 |
|
|
| **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/…`,
|
|
bestaande Cloudflare Cache Rules (die matchen op `/flutterdrup/views/…`,
|
|
|
`plaatsen`), dus dat gaat vanzelf goed; het mag er alleen nooit bij.
|
|
`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
|
|
### 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
|
|
(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.
|
|
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
|
|
Onder de rij van tid 36676 een waarschuwing tonen wanneer
|
|
|
`FFAppState().favorieteGemeenteIds` leeg is, met een knop naar het
|
|
`FFAppState().favorieteGemeenteIds` leeg is, met een knop naar het
|
|
|
gemeente-keuzescherm. Visibility via de bekende route: App State-lijst ->
|
|
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
|
|
aangemeld maar nooit op de bevestigingslink geklikt en krijgen dus niets. Geen
|
|
|
app-probleem, wel het sterkste argument voor `confirm = FALSE` in de app.
|
|
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
|
|
## 🔭 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,
|
|
*Ideeën die af zijn onderzocht maar bewust wachten. Bob 2026-09-20: eerst live,
|