浏览代码

Taak 104 af: MijnProfiel is de accounthub (export-geverifieerd, analyze 0 errors)

Drawer-knop naar mijnProfiel, padding 16 + blokken in de juiste volgorde,
Wachtwoord wijzigen / Account verwijderen / Uitloggen erbij (blijven ook op
Favorieten tab 4 staan, op verzoek), en bovenaan een teaser "Mijn aanmeldingen"
met 5 rijen + knop naar /mijnAanmeldingen. API Call MijnAanmeldingen kreeg een
items-JSON-pad zodat de lijst null-veilig is.

Taak 105 (export-blokkade door een halve conditie op EvenementHorecagelegenheid)
is opgelost door de sessie die eraan werkte; als patroonherkenning bewaard.

CLAUDE.md: Copy Action Chain werkt ook tussen pagina's, en een verse ListTile
komt met een subtitle "Subtitle" die je expliciet moet wissen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 11 小时之前
父节点
当前提交
04a0a4448e
共有 2 个文件被更改,包括 75 次插入75 次删除
  1. 22 0
      CLAUDE.md
  2. 53 75
      TASKS.md

+ 22 - 0
CLAUDE.md

@@ -4127,6 +4127,28 @@ Actions-tab was het ontbrekende stuk voor P1-9/P1-15's knop-condities**
 — bij een volgende poging op die taken eerst hier proberen i.p.v. de
 Insert-Widget/Wrap-Widget-routes.
 
+**"Copy Action Chain" / "Paste Action(s)" werkt ook TUSSEN pagina's — en dat
+scheelt bij een uitlogknop tientallen kliks.** Bevestigd 2026-09-19 (taak 104):
+de uitlogketen van Favorieten tab 4 (7× `Update App State` → Clear Value, plus
+een `goNamed(Login)`) in één keer overgezet naar een nieuwe `ListTile` op
+`MijnProfiel`. Route: bron-widget → Actions-tab → het **⋮ naast de trigger**
+("On Tap · N actions") → *Copy Action Chain* → naar de doelpagina navigeren →
+doel-widget → Actions-tab → **Paste Action(s)**. Zit er al een actie op het
+doel, verwijder die eerst via het ⋮ naast *Action 1* → *Delete Action*; dán
+verschijnt de Paste-knop. Dit nuanceert het copy/paste-dode-spoor elders in dit
+bestand: dat gold voor **widgets**, niet voor actieketens. Let nog steeds op de
+bekende valkuil: bevat de keten een Custom Action met een *Action Output
+Variable Name*, dan moet je die na het plakken hernoemen (dubbele declaratie in
+het model).
+
+**Een verse `ListTile` komt met `title: 'Title'` én `subtitle: 'Subtitle'` — die
+subtitle moet je expliciet leegmaken, anders staat er letterlijk "Subtitle" in de
+app.** De Subtitle-sectie valt bij een 935px-venster onder de vensterrand; klap
+**Style Properties** en daarna **Title** in (klik op de sectiekop) en hij schuift
+in beeld. Leegmaken lukt met `triple_click` + `Delete`; `left_click` + `ctrl+a`
++ `Delete` landde daar juist regelmatig niet. Controleer op het **canvas**, niet
+in het rechterpaneel — dat blijft de oude waarde tonen.
+
 **Generate Dynamic Children — hoe je een `ListView`/`GridView`/
 `StaggeredView` een rij per API-response-item laat tonen (gevonden
 2026-08-14, bevestigd werkend via P1-7 Tab 3).** Dit is **niet**

+ 53 - 75
TASKS.md

@@ -19,8 +19,8 @@ oppakken.
 
 | # | Taak | Kort |
 |---|---|---|
-| **88B** | Pagina "Mijn aanmeldingen" | 🔒 **Eigenaar: Claude — bezig** (2026-09-19, sessie 'profiel-hub'). Onderdeel van taak 104 hieronder |
-| **104** | `MijnProfiel` wordt accounthub | 🔒 **Eigenaar: Claude — bezig** (2026-09-19). Drawer-knop, tab 4 leegtrekken, aanmeldingen-teaser. Eigen blok hieronder |
+| **88B** | Pagina "Mijn aanmeldingen" | 🔓 **Claim vrij** — stap 1-4 staan, plus de teaser op `MijnProfiel` (taak 104). Rest: de pagina zelf vullen, stap 5-7 |
+| ~~104~~ | `MijnProfiel` is accounthub | ✅ **AF 2026-09-19** (export-geverifieerd): drawer-knop, padding+volgorde, 3 accountopties, aanmeldingen-teaser. 2 kleine restpunten in het blok |
 | **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 |
@@ -91,7 +91,7 @@ alléén de vocabulary `go_out_event_category` aan, niet `activity_category`. Of
 activiteit daardoor een lege `categorie` krijgt is **niet** nagemeten — de gemeten
 activiteit had wel een categorie, maar dat bewijst niet dat het altijd goed gaat.
 
-### 🆕 88 · "Mijn aanmeldingen" + kloonknop · deel A ✅ AF · **deel B: Eigenaar Claude — bezig**
+### 🆕 88 · "Mijn aanmeldingen" + kloonknop · deel A ✅ AF · **deel B: claim vrij**
 
 **📍 Voortgang deel B (2026-09-19, sessie 'taken-B1-B7'):**
 1. ✅ **API Call `MijnAanmeldingen`** aangemaakt en export-geverifieerd —
@@ -118,7 +118,7 @@ activiteit had wel een categorie, maar dat bewijst niet dat het altijd goed gaat
    machine name `field_horecagelegeheid1`, let op de typo in die veldnaam).
 7. ⬜ Ingang op Favorieten tab 4 (Ctrl+D op een bestaande rij, binnen de login-guard)
 
-🔒 **GECLAIMD 2026-09-19 door sessie 'profiel-hub' — bezig** (zie taak 104). Deel A (beide Drupal-endpoints)
+🔓 **Claim weer vrij** (sessie 'profiel-hub' leverde taak 104 op: de teaser + het `items`-JSON-pad staan al). Deel A (beide Drupal-endpoints)
 draait op **productie**, getest 2026-09-19: A1 geeft 122 aanmeldingen voor
 `bobhoreca`, A2 geeft 200 op eigen nodes en **403 op andermans** (bevestigd op
 vier vreemde nids). `?limit=` en `?page=` werken allebei.
@@ -207,84 +207,62 @@ bouw eerst evenementen helemaal af en kopieer daarna pas, niet allebei tegelijk.
 
 ---
 
-### 🚨 105 · EXPORT PROJECT-BREED GEBLOKKEERD · halve Visibility-conditie op `EvenementHorecagelegenheid`
+### ✅ 105 · Export-blokkade — OPGELOST 2026-09-19
 
-**Gevonden 2026-09-19 door de sessie 'profiel-hub'. NIET van die sessie — dit hoort
-bij het `EventCurrent`/horeca-blok-werk.**
+De halve Visibility-conditie (`UNSET == Second Value`) op
+`EvenementHorecagelegenheid` → `TextBezorg-minorder` legde een half uur lang de
+export van het **hele project** plat (`Status: 400`, drie keer). Opgelost door de
+sessie die eraan werkte; daarna liep de export meteen weer.
 
-`flutterflow export-code` faalt sindsdien met `Status: 400 / Error generating code
-for the project` — drie keer achter elkaar, dus geen serverhikje. Exports van
-diezelfde sessie een kwartier eerder slaagden nog gewoon.
-
-**Oorzaak (aangeklikt in het Issues-paneel, error "Property Override — Condition
-configuration is invalid"):** component **`EvenementHorecagelegenheid`** →
-widget **`TextBezorg-minorder`** (een `Text Combination`) → sectie **Visibility**:
-*Conditional* staat AAN met een rode, onvolledige conditie **`UNSET == Second
-Value`**. Dat is exact het patroon dat in `CLAUDE.md` staat beschreven als
-project-brede exportblokkade.
-
-**Niet zelf gerepareerd, met opzet:** de conditie hoort bij andermans lopende werk,
-en de Conditional-toggle uitzetten is destructief (wist de conditie definitief, zie
-`CLAUDE.md`). **Fix = de First Value alsnog invullen** (of, als de conditie toch
-niet nodig blijkt, bewust de toggle uit).
-
-**Gevolg zolang dit staat:** geen enkele sessie kan exporteren, dus niemand kan een
-wijziging verifiëren of een build draaien.
+**Bewaren als patroonherkenning:** faalt `export-code` met een generieke 400
+terwijl je eigen werk niets bijzonders deed, klik dan meteen de rode
+Issues-teller → **Errors** → de regel *"Property Override — Condition
+configuration is invalid"* aan. De builder springt naar de exacte widget. De twee
+andere `Property Override`-errors in dit project (invalid API call configuration
+en return type mismatch, beide op `stadsactiviteitAanmaken`) blokkeren níet — die
+staan er permanent.
 
 ---
 
-### 🆕 104 · `MijnProfiel` wordt de accounthub · Eigenaar: Claude — bezig
+### ✅ 104 · `MijnProfiel` is de accounthub — AF 2026-09-19 (Claude, export-geverifieerd)
 
-**Aanleiding: Bob 2026-09-19** — *"Waar staat het overzicht van eigen
+Aanleiding: Bob 2026-09-19 — *"Waar staat het overzicht van eigen
 horecagelegenheden en eigen evenementen? In de drawer moet onderaan de user
-button naar het profiel gaan. De opties op Favorieten tab 'Gebruiker' moeten
-ook allemaal onder mijnprofiel komen."*
-
-**Gemeten op een verse export (2026-09-19):**
-- `MijnProfiel` (`/mijnProfiel`) bestaat, heeft al de standaard header +
-  Drawer, en toont twee `FutureBuilder`s: `MijnHorecagelegenhedenCall` (kaarten)
-  en `MijnStadsrechtenCall` (platte tekstregels `titel — parent_titel`). Elk met
-  een kop en een "+ Voeg toe"-knop.
-- **0 `Padding`-widgets** op die pagina: alles plakt tegen de schermrand.
-- Geen login-guard: uitgelogd draait hij twee calls met een lege cookie.
-- **De pagina is precies één keer gelinkt:** Favorieten tab 4 → ListTile
-  *Mijn profiel*. De drawer-knop onderaan gaat ingelogd naar **Favorieten**.
-- Tab 4 bevat: Uitloggen · Crashtest · Mijn profiel · Wachtwoord wijzigen
-  (→ `WachtwoordVergeten`) · Account verwijderen (→ `launchURL`
-  `https://uitgaanskrant.com/nl/support/mobieleapp`) · Stadsactiviteit aanmaken.
-
-**Besluiten Bob 2026-09-19:**
-- Aanmeldingen: **teaser van 5 op het profiel + knop naar de bestaande pagina
-  `MijnAanmeldingen`** (niet de volle lijst op het profiel — 122 rijen, en een
-  gepagineerde grid in de scrollende Column van het profiel rendert leeg).
-- Favorieten tab 4 **blijft bestaan maar wordt smal**: ingelogd alleen nog een
-  knop *Mijn profiel*, uitgelogd de bestaande uitleg + Account aanmaken /
-  Inloggen. Dat lost meteen **65c** op.
-
-**Stappen (in deze volgorde):**
-1. ⬜ Drawer-knop onderaan, ingelogde tak: `Navigate To` van `Favorieten` naar
-   `mijnProfiel`. Uitgelogde tak blijft `Login`.
-2. ⬜ `MijnProfiel`: login-guard op de inhoud + padding 16 + sectiekoppen.
-3. ⬜ De vier tab-4-opties naar `MijnProfiel` (Wachtwoord wijzigen, Account
-   verwijderen, Uitloggen, Stadsactiviteit aanmaken) — dupliceren van een
-   bestaande rij is hier het bewezen patroon, niet Insert Widget.
-4. ⬜ Sectie *Mijn aanmeldingen* op het profiel: `MijnAanmeldingenCall` met
-   `limit=5`, shrinkWrap-`ListView`, plus knop *Alle aanmeldingen* →
-   `/mijnAanmeldingen`.
-5. ⬜ 88B stap 5-7: de pagina `MijnAanmeldingen` afbouwen (StaggeredView 1/1/2/3,
-   JSON Path `$`, statuslabel, *Bekijken* → `EventCurrent`).
-6. ⬜ Favorieten tab 4 uitkleden tot één knop (ingelogd) — **Bob verwijdert**,
-   Claude gooit niets weg.
-
-**Bob-stukjes die hierbij horen:**
-- `mijn_aanmeldingen.json` geeft **`horecagelegenheidnid` nog niet terug** —
-  één veld erbij in `custom.mijn_aanmeldingen.inc` (machine name
-  `field_horecagelegeheid1`, let op de typo). Zonder dat mist het horeca-blok
-  op `EventCurrent` na doorklikken vanuit de lijst.
-- De **Crashtest-tile** op tab 4 (die je óók uitlogt) mag mee in stap 6.
-
-**Niet in deze ronde:** de kloonknop (88 B3, 11 nieuwe page parameters) — eigen
-sessie.
+button naar het profiel gaan."*
+
+**Gedaan, alles nagelegd op een verse export (`dart analyze` 0 errors):**
+1. ✅ **Drawer-knop onderaan** gaat ingelogd naar `mijnProfiel`
+   (`pushNamed(MijnProfielWidget.routeName)`); uitgelogd nog steeds `Login`.
+2. ✅ **`MijnProfiel` opgeruimd**: `EdgeInsets.all(16)` (stond overal tegen de
+   schermrand), en de blokken staan in de goede volgorde. Ze stonden als
+   kop-kop-lijst-lijst, waardoor "Mijn redactierechten" bóven de horeca-kaarten
+   hing.
+3. ✅ **Accountopties erbij**: *Wachtwoord wijzigen* → `WachtwoordVergeten`,
+   *Account verwijderen* → `launchURL(support/mobieleapp)`, *Uitloggen* → de
+   volledige App-State-wis + `goNamed(Login)`. Op Bob's verzoek **blijven ze óók
+   op Favorieten tab 4 staan** — daar is niets verwijderd.
+4. ✅ **Sectie "Mijn aanmeldingen"** bovenaan: `MijnAanmeldingenCall` met
+   `limit: 5`, sessie uit App State, `ListTile` per rij (titel `$.title`,
+   subtitle `$.datum_start`), tik → `EventCurrent` met `nid`. Plus knop
+   *Bekijk alles* → `/mijnAanmeldingen`.
+5. ✅ **API Call null-veilig gemaakt**: JSON-pad `items` = `$[:]` (Is List) op
+   `MijnAanmeldingen`, zodat de binding `items(...)?.toList() ?? []` oplevert in
+   plaats van een crash bij een mislukte call (het profiel heeft geen
+   login-guard).
+
+**Eindvolgorde van de pagina:** Mijn aanmeldingen (5 + knop) → Mijn
+horecagelegenheden → Mijn redactierechten → Wachtwoord wijzigen → Account
+verwijderen → Uitloggen.
+
+**Twee restpunten, allebei klein:**
+- ⬜ **`horecaid` meegeven aan `EventCurrent`** zodra
+  `mijn_aanmeldingen.json` het veld `horecagelegenheidnid` teruggeeft (zie het
+  88-blok). Nu gaat alleen `nid` mee, dus het horeca-blok op de detailpagina
+  blijft leeg. Bewust zo gelaten: een JSON-pad dat niet bestaat levert de
+  letterlijke tekst `"null"` op, en dat passeert de guard
+  `horecaid != null && != ''`.
+- ⬜ **Statuslabel** ("Gepubliceerd" / "Wacht op goedkeuring" uit `$.status`)
+  staat nog niet op de teaser. Hoort bij 88B.5, op de volledige pagina.
 
 ---