|
|
@@ -19,7 +19,7 @@ oppakken.
|
|
|
|
|
|
| # | Taak | Kort |
|
|
|
|---|---|---|
|
|
|
-| **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 |
|
|
|
+| ~~88B~~ | Pagina "Mijn aanmeldingen" | ✅ **Werkt 2026-09-19** (export-geverifieerd): header+drawer, gepagineerde StaggeredView 1/1/2/3, kaart met titel+datum, tik → `EventCurrent`. Vier kleine restpunten in het blok |
|
|
|
| ~~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 |
|
|
|
@@ -91,119 +91,82 @@ 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: claim vrij**
|
|
|
-
|
|
|
-**📍 Voortgang deel B (2026-09-19, sessie 'taken-B1-B7'):**
|
|
|
-1. ✅ **API Call `MijnAanmeldingen`** aangemaakt en export-geverifieerd —
|
|
|
- `sessionName`/`sessid` (String) + `page`/`limit` (Integer, default 0 en 50),
|
|
|
- header `Cookie: '${sessionName}=${sessid}'` (echte interpolatie), query-params
|
|
|
- `page`+`limit` From Variable, `cache: false`.
|
|
|
-2. ✅ **Pagina `MijnAanmeldingen`** aangemaakt (blanco), route `/mijnAanmeldingen`.
|
|
|
-3. ✅ **AppBar-slot** toegevoegd aan de Scaffold (leeg — eigenschappen nog te zetten
|
|
|
- volgens het header-recept in `CLAUDE.md`: Info / Elevation 2 / Show Default Button
|
|
|
- uit / 80 PX / Toolbar 25 % / Bottom Section / Center Title / Flexible Space /
|
|
|
- Background Widget → `HeaderButtonsComponent` met `showBackButton` **AAN**).
|
|
|
-4. ✅ **Drawer-slot** toegevoegd (leeg — `drawerComponent` moet er nog in via
|
|
|
- *Edit Drawer* → "+" op de Drawer-rij; zonder Edit Drawer registreert de klik niet).
|
|
|
- Widget tree nu: `MijnAanmeldingen → [Column, AppBar, Drawer]`.
|
|
|
-5. ⬜ StaggeredView 1/1/2/3 + Backend Query + Generate Dynamic Children
|
|
|
- (⚠️ JSON Path `$`, **niet** Predefined Path — gepagineerde lijst, zie `CLAUDE.md`)
|
|
|
-6. ⬜ Kaart: titel, datum, statuslabel, knop *Bekijken* → `EventCurrent` met **twee**
|
|
|
- parameters: `nid` → `$.nid` én `horecaid` → `$.horecagelegenheidnid`.
|
|
|
- ⚠️ **Geldt voor BEIDE types** — `EventCurrent` is generiek (zie het blok 99
|
|
|
- hieronder). Bij een activiteit is `horecagelegenheidnid` leeg en verdwijnt het
|
|
|
- horeca-blok vanzelf.
|
|
|
- ⚠️ **A1 geeft `horecagelegenheidnid` nog NIET terug** — één regel toevoegen aan
|
|
|
- `custom.mijn_aanmeldingen.inc` (het veld staat al in de veldkaart als `horeca`,
|
|
|
- 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)
|
|
|
-
|
|
|
-🔓 **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.
|
|
|
-⚠️ **Default limit is 50** — de app-lijst moet dus pagineren.
|
|
|
-
|
|
|
-Bob 2026-09-18: *"Ziet een horecagelegenheid-eigenaar of stadsrechten-eigenaar ook
|
|
|
-een overzicht van hun zelf aangemaakte dingen? En ik wil er een knop achter,
|
|
|
-klone, waardoor het formulier met de eerdere gegevens wordt gevuld."*
|
|
|
-
|
|
|
-**Antwoord op de eerste vraag: nee, dat bestaat nog niet.** Gemeten 2026-09-18 op
|
|
|
-de export: de enige "mijn"-endpoints zijn `mijn_horecagelegenheden.json` (vult de
|
|
|
-dropdown op `uitgaansevenementAanmaken`) en `mijn_stadsrechten.json`. Er is geen
|
|
|
-enkele call die teruggeeft *wat deze gebruiker heeft aangemaakt*. Na het indienen
|
|
|
-van een evenement verdwijnt het dus uit beeld: de gebruiker kan niet zien of het
|
|
|
-erop staat, niet of het al goedgekeurd is, en niets hergebruiken.
|
|
|
-
|
|
|
-**A · Drupal (Bob) — twee endpoints, allebei sessie-geauthenticeerd**
|
|
|
-
|
|
|
-- **A1 · `mijn_aanmeldingen.json`** (zelfde auth-patroon als
|
|
|
- `mijn_horecagelegenheden.json`). Alle nodes van type `go_out_event` **en**
|
|
|
- `activity` met `uid` = huidige gebruiker, nieuwste eerst. Per rij: `nid`,
|
|
|
- `type`, `title`, `datum_start` (rauw `yyyy-MM-dd HH:mm:ss`), `status` (0/1),
|
|
|
- `plaats`, `logo` (URL, voor een thumbnail).
|
|
|
-- **A2 · `aanmelding_kloonbron.json?nid=X`** — sessie-auth **plus een
|
|
|
- eigenaarscheck** (`$node->uid == $user->uid`, anders 403; zonder die check kan
|
|
|
- iemand andermans gegevens uitlezen). Levert de **rauwe** waarden, niet de
|
|
|
- weergavewaarden: `horecagelegenheid_nid`, `titel`, `omschrijving` (rauwe body),
|
|
|
- `entree_tid`, `entreeprijs`, `toelichting_entree`, `tickets_url`,
|
|
|
- `website_url`, `categorie_tids` (lijst), `logo_fid`, `fotos_fids` (lijst).
|
|
|
-
|
|
|
- *Waarom A2 een eigen endpoint moet zijn en `flutterflow_events.json` niet
|
|
|
- volstaat — gemeten op nid 214439:* die view geeft `categorie` als **labels**
|
|
|
- (`['Tweedehands markt']`) i.p.v. tids, `logo`/`fotos` als **URL's** i.p.v.
|
|
|
- fids, `datum` als `zaterdag 19 sep, 9:00` (geen jaar, niet parseerbaar),
|
|
|
- `website` verpakt in een `<a href=...>`-tag, en er zit **geen entree-tid** in.
|
|
|
- Daar is geen formulier mee te vullen.
|
|
|
-
|
|
|
- **✅ Besluit Bob 2026-09-19: een kloon hergebruikt dezelfde `fid`'s.** De
|
|
|
- gebruiker hoeft dus niet opnieuw te uploaden. Aan de Drupal-kant regelt
|
|
|
- `file_field_insert()`/`file_field_update()` de `file_usage`-registratie bij
|
|
|
- `node_save()` zelf zodra de fids op het veld staan; alleen controleren dat
|
|
|
- `_custom_evenement_create()` bestaande (permanente) fids accepteert en niet
|
|
|
- op `status = 0` filtert.
|
|
|
-
|
|
|
-**B · App (Claude, builder)**
|
|
|
-
|
|
|
-- **B1 · Nieuwe pagina `MijnAanmeldingen`** met de standaard header + Drawer
|
|
|
- (recept staat in `CLAUDE.md`), een `StaggeredView` over A1 met Cross Axis Count
|
|
|
- 1/1/2/3 en een Empty List Widget. Per kaart: titel, datum, **statuslabel**
|
|
|
- ("Gepubliceerd" bij `status: 1`, "Wacht op goedkeuring" bij `0`) en twee
|
|
|
- knoppen: *Bekijken* (Navigate → `EventCurrent` met `nid`) en *Klonen*.
|
|
|
-- **B2 · Ingang:** Favorieten tab 4 (Gebruiker), waar *Uitgaansevenement
|
|
|
- aanmaken* en *Stadsactiviteit aanmaken* al staan. Eén `ListTile` erbij,
|
|
|
- **binnen** de bestaande `userSessionid`-login-guard. Dupliceer een bestaande
|
|
|
- rij (Ctrl+D) — dat is hier het bewezen patroon, Insert Widget niet.
|
|
|
-- **B3 · Klonen.** De kloonknop haalt A2 op in zijn eigen actieketen (Backend
|
|
|
- Call) en geeft de waarden mee als **page parameters** aan de Navigate To naar
|
|
|
- `uitgaansevenementAanmaken`. **Niet** via een page state die je in On Page Load
|
|
|
- vult: `Initial Option Value` van een dropdown wordt tijdens de eerste build
|
|
|
- geëvalueerd en On Page Load draait pas in een `addPostFrameCallback` — dan is
|
|
|
- de `FormFieldController` al met de lege waarde geïnitialiseerd (staat zo in
|
|
|
- `CLAUDE.md`).
|
|
|
-
|
|
|
- Nieuwe parameters op `uitgaansevenementAanmaken`, **allemaal niet-verplicht**
|
|
|
- (een verplichte parameter genereert een `!` en laat de gewone "nieuw"-route
|
|
|
- crashen): `kloonHorecaNid`, `kloonTitel`, `kloonOmschrijving`, `kloonEntreeTid`,
|
|
|
- `kloonEntreeprijs`, `kloonToelichting`, `kloonTicketsUrl`, `kloonWebsiteUrl`
|
|
|
- (String), `kloonCategorieTids` + `kloonFotosFids` (List<String>), `kloonLogoFid`.
|
|
|
- Binden: elke `TextField` → *Initial Value*, elke dropdown → *Initial Option
|
|
|
- Value*.
|
|
|
+### 🆕 88 · "Mijn aanmeldingen" + kloonknop · deel A ✅ AF · deel B ✅ grotendeels af
|
|
|
+
|
|
|
+**Deel A (Drupal, Bob): AF** — beide endpoints draaien op productie, getest
|
|
|
+2026-09-19: `mijn_aanmeldingen.json` geeft 122 aanmeldingen voor `bobhoreca`,
|
|
|
+`aanmelding_kloonbron.json` geeft 200 op eigen nodes en 403 op andermans.
|
|
|
+`?limit=` en `?page=` werken allebei. **Default limit is 50**, dus de app-lijst
|
|
|
+pagineert.
|
|
|
+
|
|
|
+**Deel B (app, Claude): pagina `MijnAanmeldingen` staat en werkt** — afgerond
|
|
|
+2026-09-19, export-geverifieerd, `dart analyze` 0 errors:
|
|
|
+- ✅ API Call `MijnAanmeldingen` (`sessionName`/`sessid`/`page`/`limit`, header
|
|
|
+ `Cookie: '${sessionName}=${sessid}'`) + JSON-pad `items` = `$[:]` (Is List).
|
|
|
+- ✅ Standaard header (identiek aan `mijnProfiel`: PreferredSize 80, Primary
|
|
|
+ Text, Show Default Button uit, Toolbar 25 %, Bottom 70, Flexible Space,
|
|
|
+ `HeaderButtonsComponent` met `showBackButton` aan) + `drawerComponent` in de
|
|
|
+ Drawer.
|
|
|
+- ✅ `StaggeredView` met **Enable Infinite Scroll**, `page` → *Next Page Index*,
|
|
|
+ Cross Axis Count responsive **1/1/2/3**, en Generate Dynamic Children via
|
|
|
+ **JSON Path `$`** (bewust níet Predefined Path — bij een gepagineerde lijst
|
|
|
+ genereert die `items(...)! ?? []` met een null-check-operator; `$` geeft
|
|
|
+ `(getJsonField(...) ?? []).toList()`).
|
|
|
+- ✅ Kaart: `Column` met `$.title` en `$.datum_start`, tik → `EventCurrent`
|
|
|
+ met `nid` = `$.nid`.
|
|
|
+- ✅ Ingang: knop *Bekijk alles* op `MijnProfiel` (taak 104).
|
|
|
+
|
|
|
+**Nog open op deze pagina (allemaal klein):**
|
|
|
+- ⬜ **Statuslabel** "Gepubliceerd" / "Wacht op goedkeuring" uit `$.status`
|
|
|
+ (0/1). Vraagt één custom function (`getJsonField` mag niet in een Custom
|
|
|
+ Function — gebruik platte Map-toegang) en een derde `Text` in de kaart.
|
|
|
+- ⬜ **Empty List Widget** op de StaggeredView (nu een leeg scherm als je nog
|
|
|
+ niets hebt ingediend). Recept staat in `CLAUDE.md` bij P1-46.
|
|
|
+- ⬜ **Kaartopmaak**: de twee regels staan nu kaal onder elkaar; een `Container`
|
|
|
+ eromheen met witte vulling, padding en radius maakt er een kaart van.
|
|
|
+- ⬜ **`horecaid` meegeven** aan `EventCurrent` zodra `mijn_aanmeldingen.json`
|
|
|
+ het veld `horecagelegenheidnid` teruggeeft (zie hieronder). Nu blijft het
|
|
|
+ horeca-blok op de detailpagina leeg.
|
|
|
+- ⬜ **Ingang op Favorieten tab 4** (stap 7 uit de oorspronkelijke spec) —
|
|
|
+ optioneel, want het profiel linkt de pagina al.
|
|
|
+
|
|
|
+**Bob-stukje dat hier nog bij hoort:** één veld toevoegen in
|
|
|
+`custom.mijn_aanmeldingen.inc` → `_custom_mijn_aanmeldingen()`:
|
|
|
+`horecagelegenheidnid` uit de veldkaart-sleutel `horeca` (machine name
|
|
|
+`field_horecagelegeheid1`, let op de typo), als **lege string** bij een
|
|
|
+activiteit — niet `NULL`, want de app bindt het aan een String-parameter.
|
|
|
+De kolomnaam verschilt per veldtype, dus eerst `target_id` proberen en anders
|
|
|
+`nid`.
|
|
|
+
|
|
|
+**B3 · Klonen — nog helemaal open, eigen sessie waard.** De kloonknop haalt
|
|
|
+`aanmelding_kloonbron.json` op in zijn eigen actieketen en geeft de waarden als
|
|
|
+**page parameters** mee aan `uitgaansevenementAanmaken`. **Niet** via een page
|
|
|
+state die je in On Page Load vult: `Initial Option Value` van een dropdown wordt
|
|
|
+tijdens de eerste build geëvalueerd en On Page Load draait pas in een
|
|
|
+`addPostFrameCallback`.
|
|
|
+
|
|
|
+Nieuwe parameters op `uitgaansevenementAanmaken`, **allemaal niet-verplicht**
|
|
|
+(een verplichte parameter genereert een `!` en laat de gewone "nieuw"-route
|
|
|
+crashen): `kloonHorecaNid`, `kloonTitel`, `kloonOmschrijving`, `kloonEntreeTid`,
|
|
|
+`kloonEntreeprijs`, `kloonToelichting`, `kloonTicketsUrl`, `kloonWebsiteUrl`
|
|
|
+(String), `kloonCategorieTids` + `kloonFotosFids` (List<String>), `kloonLogoFid`.
|
|
|
+Binden: elke `TextField` → *Initial Value*, elke dropdown → *Initial Option
|
|
|
+Value*.
|
|
|
|
|
|
**Bewust NIET klonen: de twee datumvelden.** Je kloont juist om hetzelfde
|
|
|
evenement op een níeuwe datum te zetten, dus een overgenomen datum is per
|
|
|
-definitie fout en moet alsnog weg. Twee lege datumvelden zijn meteen ook de rem
|
|
|
-tegen per ongeluk twee keer exact dezelfde aanmelding publiceren.
|
|
|
-
|
|
|
-**Volgorde.** A1 + B1 + B2 (het overzicht) is op zichzelf al waardevol en veel
|
|
|
-kleiner dan de kloonknop — lever dat als eerste op, A2 + B3 daarna. Zonder het
|
|
|
-overzicht heeft de kloonknop trouwens geen plek om te staan.
|
|
|
+definitie fout. Twee lege datumvelden zijn meteen de rem tegen per ongeluk twee
|
|
|
+keer dezelfde aanmelding publiceren.
|
|
|
|
|
|
**Twee valkuilen vooraf.** (1) De `List<String>`-parameters zijn het fragiele
|
|
|
deel: een List-typed argument dat op `Unset` blijft staan blokkeert de héle
|
|
|
-export met een generieke 400 (zie `CLAUDE.md`) — loopt dat vast, dan is het een
|
|
|
-Bob-stukje. (2) `stadsactiviteitAanmaken` heeft exact hetzelfde formulierpatroon;
|
|
|
-bouw eerst evenementen helemaal af en kopieer daarna pas, niet allebei tegelijk.
|
|
|
+export met een generieke 400. (2) `stadsactiviteitAanmaken` heeft exact hetzelfde
|
|
|
+formulierpatroon; bouw eerst evenementen helemaal af en kopieer daarna pas.
|
|
|
+
|
|
|
+**✅ Besluit Bob 2026-09-19: een kloon hergebruikt dezelfde `fid`'s.** De
|
|
|
+gebruiker hoeft niet opnieuw te uploaden; controleer alleen dat
|
|
|
+`_custom_evenement_create()` bestaande (permanente) fids accepteert en niet op
|
|
|
+`status = 0` filtert.
|
|
|
|
|
|
---
|
|
|
|