|
|
@@ -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.**
|
|
|
|
|
|
---
|
|
|
|