Bläddra i källkod

TASKS.md: verouderde 'diff bewust niet gecommit'-notitie bijgewerkt na 98d46ad

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 2 veckor sedan
förälder
incheckning
bbb60b5866
1 ändrade filer med 124 tillägg och 16 borttagningar
  1. 124 16
      TASKS.md

+ 124 - 16
TASKS.md

@@ -15,13 +15,13 @@ dieperliggende code-inconsistentie op die pagina — de builder-bug is
 puur UI-side), P2-6's laatste stap-2-restpunt (Activiteiten/tab 0 via
 On Page Load) blijkt intussen al gebouwd, en de complete Page-State-laag
 (6x `alleXxx`/`zoektermXxx`/`categorieFilterXxx`) staat klaar.
-**Let op voor de volgende sessie:** de lokale werkkopie liep bij
-sessiestart achter op de builder (o.a. `fetch_alle_horecagelegenheden.dart`
-ontbrak lokaal) én had een grote ongecommitte diff staan van een
-eerdere sessie (Firebase/`mijn_profiel`/`stadsactiviteit_aanmaken`, dus
-P1-16/P2-15-werk) — bewust niet overheen gecommit zonder navraag, zie
-de concurrency-regel in `CLAUDE.md`. Een verse `ff-run-fvm.sh ... -s`
-(of gewoon een export + commit) ruimt dat in één keer op.
+**Opgelost (2026-08-31):** de grote ongecommitte diff die hier stond
+(Firebase/`mijn_profiel`/`stadsactiviteit_aanmaken`, dus P1-16/P2-15-werk,
+plus P2-6's `fetch_alle_horecagelegenheden.dart` en de drie
+`HorecagelegenhedenOverzichtCopy*`-werkkopieën) is op Bob's expliciete
+verzoek gecommit als `98d46ad` — werkboom is weer schoon, dus een
+`git status`-diff is vanaf nu weer een betrouwbaar "hier ligt vers,
+niet-afgerond werk"-signaal.
 
 ---
 
@@ -2982,15 +2982,123 @@ cosmetisch** (5 ongebruikte FlutterFlow-boilerplate-imports + 13
   Bij dit patroon (net als de eerdere clipping-gevallen): 1-2 pogingen,
   dan aan Bob overdragen — kostte hem in zijn eigen browser seconden.
 
-**Nog te bouwen:** de pagina "Stadsactiviteit aanmaken" zelf (het
-formulier dat `stadsactiviteitCreate` aanroept — zie de bouwvolgorde
-hierboven voor de veldenlijst), daarna dezelfde aanpak voor "Evenement
-aanmaken" (eigen custom action `evenementCreate` naar
-`evenementen/create.json`, zelfde 20-argumenten-aanpak, plus
-horecagelegenheid-picker gevuld via `mijn_horecagelegenheden`). **Check
-bij het oppakken eerst of de andere, parallelle sessie (zie
-waarschuwing bovenaan deze taak) hier intussen al iets aan gebouwd
-heeft** — nog niet herverifieerd sinds de eerdere check.
+**Bouwstap 3 (pagina `stadsactiviteitAanmaken`) — grotendeels af,
+2026-08-31.** Live pair-sessie (Bob bouwt in eigen browser, Claude
+verifieert per stap met verse export). Stand van zaken, alles
+exportgeverifieerd met **0 Dart-errors**:
+
+- **Pagina** `stadsactiviteitAanmaken` (`lib/stadsactiviteit_aanmaken/`),
+  Scaffold + AppBar (Background `Primary`, "Show Default Button" aan →
+  automatische terugknop, geen losse titel-widget) + scrollbare
+  `Column` (uniform padding 16).
+- **10 TextFields**, in volgorde, elk met zowel Label als Hint:
+  Titel · Omschrijving · Organisator · Contact · Adres · Postcode ·
+  Plaats · Entreeprijs · Toelichting Entree · WebsiteURL.
+- **2 datumvelden** (`TextFieldDatumStart` / `TextFieldDatumEind`),
+  beide `readOnly: true` + breedte `inf`, met On-Tap-actie
+  `showDatePicker` → `showTimePicker` → gecombineerd in één DateTime →
+  als tekst terug in het veld gezet. Werkt.
+- **Plaats-picker: eigen 3-traps cascade** met Page State (NIET het
+  bestaande `SelectStateDropDownComponent` — zie waarschuwing
+  hieronder). Page State-velden: `createProvincieID`,
+  `createGemeenteId`, `createPlaatsID` (let op de inconsistente
+  hoofdletters — zo staan ze er echt in).
+  - `DropDownProvincie` → Backend Query `provincies`, options
+    `$[:].provincieid` / labels `$[:].provinciename`, On Selected zet
+    `createProvincieID`.
+  - `DropDownGemeente` → Backend Query `gemeenten` met
+    `provincieid: createProvincieID`, options `$[:].gemeenteid` /
+    labels `$[:].gemeentename`, On Selected zet `createGemeenteId`.
+  - `DropDownPlaats` → Backend Query `PlaatsenBijGemeente` met
+    `gemeenteid: createGemeenteId`, options `$[:].plaatsid` / labels
+    `$[:].plaatsname`.
+
+**⚠️ Belangrijke ontwerpbeslissing (Bob, 2026-08-31) — corrigeert de
+oudere spec in het Artifact.** De plaats-picker mag **niet** aan de
+App State-velden `provincieSelectId`/`gemeenteSelectId` hangen: dat is
+de **browse**-state (welke gemeente de gebruiker nu in de app bekijkt)
+en staat volledig los van "in welke plaats maak ik een activiteit
+aan". Om dezelfde reden is het bestaande `SelectStateDropDownComponent`
+bewust **van deze pagina verwijderd** — dat component schrijft namelijk
+rechtstreeks naar die App State-velden en zou dus stilletjes de
+browse-selectie van de gebruiker overschrijven. Vandaar de eigen
+dropdowns met Page State hierboven.
+
+**Gekozen rechtenmodel: HYBRIDE** (Bob, 2026-08-31, via expliciete
+keuze). Het Artifact zei eerder "GEEN restrictie tot eigen steden —
+iedereen mag voor elke plaats voorstellen"; dat is nu bijgesteld naar:
+heeft de gebruiker stadsrechten (`mijn_stadsrechten`, gevuld vanuit
+`field_town_access`, gemeente-niveau sinds 2026-08-27), dan die eigen
+gemeenten **bovenaan als snelkoppeling**; daarnaast blijft de volledige
+Provincie→Gemeente→Plaats-cascade beschikbaar voor iedereen. Reden om
+niet volledig af te schermen: `mijn_stadsrechten` is leeg voor vrijwel
+alle gebruikers, en `stadsactiviteiten/create` doet server-side bewust
+geen rechtencheck — de review-flow (node komt **altijd** ongepubliceerd
+binnen, "wordt beoordeeld") is het vangnet.
+
+**Nieuw Drupal-endpoint gebouwd + live (2026-08-31):
+`plaatsen_bij_gemeente`/index** — `?gemeenteid=<tid>` → array van
+`{plaatsid, plaatsname, plaatsdescription}`. Bewust een **losse nieuwe
+resource** i.p.v. het bestaande `plaatsen.json` op te rekken (Bob's
+keuze, sluit aan bij hoe elk ander endpoint in dit project ook los
+werd toegevoegd): `plaatsen.json` bouwt alleen Provincie (diepte 0) en
+Gemeente (diepte 1) op en kan Plaats-niveau (diepte 2) principieel niet
+teruggeven, ook niet met `limit_levels=3`. Getest op devbob én
+**gedeployed naar productie**. Code staat in `custom.module`
+(`custom_plaatsen_bij_gemeente()` + `custom_plaatsen_bij_gemeente_access()`).
+
+**FlutterFlow API Group hernoemd: `kanweg` → `productie`** (Bob,
+2026-08-31), genereert nu `ProductieGroup` met base-URL
+`https://uitgaanskrant.com`. Bevat 3 calls: `PlaatsenBijGemeente`,
+`Entreeopties`, `Categorieen`. **Valkuil onderweg:** de call eerst als
+top-level aangemaakt mét een *relatief* pad (`/nl/flutterdrup/...`)
+→ geen host, call faalt. Binnen een groep hoort een relatief pad
+(`${baseUrl}` wordt voorgeplakt); top-level moet de volledige
+`https://uitgaanskrant.com/...`-URL.
+
+**Restpunten om mee te beginnen in de volgende sessie:**
+1. **`DropDownPlaats` → On Selected ontbreekt nog**: moet
+   `createPlaatsID` (Page State) zetten. De andere twee dropdowns doen
+   dit al; deze is als enige nog niet gewired. Kleinste eerstvolgende
+   stap.
+2. **Rechten-shortcut bouwen**: dropdown/rij bovenaan gevuld uit
+   `MijnStadsrechten`, die bij selectie direct `createGemeenteId` zet
+   (schrijft naar dezelfde Page State-variabele, dus de Plaats-dropdown
+   pikt 'm automatisch op). Sectie verbergen als de lijst leeg is.
+3. **Categorie-multiselect** (`Categorieen`, meerdere waarden →
+   `categorieTids`) en **entree-dropdown** (`Entreeopties` →
+   `entreeTid`).
+4. **Foto-upload** koppelen: `bestandUpload` (bestaat al, werkt) voor
+   logo (`logoFid`) + max 5 slideshow-foto's (`fotosFids`).
+5. **Verzendknop**: roept `stadsactiviteitCreate` aan (custom action
+   bestaat al, 20 argumenten). Let op: de datumvelden bevatten Dart's
+   kale `DateTime.toString()` (bv. `2026-08-28 14:30:00.000`) terwijl
+   de API `YYYY-MM-DD HH:MM:SS` verwacht — de `.000` moet er nog
+   afgeknipt worden in de verzendactie.
+6. Na succes: melding **"wordt beoordeeld"**, niet "geplaatst".
+
+**Losse observatie (niet blokkerend):** FlutterFlow's Issues-paneel
+toont 1 error "Property Override — return type mismatch" wijzend naar
+`DropDownProvincie`, terwijl de export 0 Dart-errors geeft en de
+gegenereerde code van die dropdown correct is. Vermoedelijk een stale
+builder-melding; een harde reload ruimt zo'n melding meestal op. Niet
+verder tijd in steken tenzij hij een export daadwerkelijk blokkeert.
+
+**Daarna nog te bouwen:** "Evenement aanmaken" — eigen custom action
+`evenementCreate` naar `evenementen/create.json` (zelfde
+20-argumenten-aanpak als `stadsactiviteitCreate`), plus
+horecagelegenheid-picker gevuld via `mijn_horecagelegenheden`
+(auto-select bij precies 1 resultaat).
+
+**Bijvangst deze sessie:** de custom function
+`filterHorecagelegenheden` gaf een compile-error omdat
+**`getJsonField()` niet beschikbaar is binnen Custom Functions** (die
+helper komt uit `/flutter_flow/flutter_flow_util.dart`, en dat
+import-blok is bij Custom Functions niet te bewerken — bij Custom
+*Actions* wordt het wél automatisch meegeïmporteerd). Opgelost door
+platte Map-toegang te gebruiken (`map?[key]`) met een `$.`-prefix-strip
+vooraf. **Generiek te onthouden: gebruik `getJsonField()` nooit in een
+Custom Function.**
 
 ---