Parcourir la source

Taken 114/115/116 afgerond: conditie op ongepubliceerd + LegeLijstComponent

- 114: bool custom function isOngepubliceerd + conditionele actie op 3 plekken
  (mijnProfiel tab 1 en 2, MijnAanmeldingen) — ongepubliceerde node toont een
  snackbar i.p.v. te navigeren naar een lege EventCurrent.
- 115: nieuw LegeLijstComponent (shared, required param 'tekst') op de 4
  ListViews van mijnProfiel; Empty List Widget biedt alleen Image of Component.
- 116: hinttekst horecalijst op Body Small + Secondary Text.

Geverifieerd met een verse export, dart analyze 0 errors.
Taak 110 uit TASKS.md verwijderd; drie kleine restpunten toegevoegd
(ontbrekende horecaid-parameter, typo, ontbrekende EN-vertalingen).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob il y a 17 heures
Parent
commit
1361ee179c
2 fichiers modifiés avec 49 ajouts et 2 suppressions
  1. 32 0
      CLAUDE.md
  2. 17 2
      TASKS.md

+ 32 - 0
CLAUDE.md

@@ -1294,6 +1294,29 @@ er echt een ander widget (bv. een `Text`-label) tussen: dupliceer een bestaande
 `Text` en versleep 'm in de tree, of accepteer de volgorde. Verwijderen van de
 ongewenste kopie gaat gewoon via rechtsklik → "Remove Widget".
 
+**Een bestaande actie in een conditionele tak krijgen: Copy Action Chain →
+Delete Action → Add Conditional → Paste in de tak — en tel daarna de
+parameters.** Werkend recept, 2026-09-20 drie keer gebruikt (ongepubliceerde
+node mag niet naar een lege `EventCurrent` navigeren). Een Conditional splitst
+de keten, dus de bestaande actie móet een tak in; opnieuw opbouwen kost je alle
+bindingen, plakken niet. Volgorde: ⋮ naast de trigger → *Copy Action Chain* → ⋮
+op de actie → *Delete Action* → "+" → *Add Conditional* → conditie zetten → in
+de TRUE-tak de nieuwe actie → in de FALSE-tak **Paste Action(s)**.
+⚠️ **Een geplakte/heropgebouwde Navigate kan stil één parameter kwijtraken** —
+op `MijnAanmeldingen` bleef `nid` staan en verdween `horecaid`, zonder
+foutmelding en zonder dat de Issues-teller bewoog (beide zijn nullable, dus
+`serializeParam` compileert gewoon). Tel na élke ingreep de parameters in een
+verse export, niet in het paneel.
+**De conditie zelf hoort een bool custom function te zijn, geen JSON-Path-
+binding.** Een JSON-Path krijgt type *Json* en dan biedt de operatorlijst geen
+vergelijking met een letterlijke waarde; bind je de respons rechtstreeks, dan
+komt er `if (getJsonField(...))` uit — een `dynamic` als `bool` zonder
+null-check, die compileert en pas bij runtime crasht. Geef de functie het
+**rauwe loop-item** mee (Available Options *No Further Changes*, geen pad), zet
+het argument op type JSON en het return-type op **Boolean met Nullable uit** —
+dan is er ook geen "Default Variable Value" nodig. Voorbeeld in dit project:
+`isOngepubliceerd(dynamic item)` in `custom_functions.dart`.
+
 **Een `Navigate To`-actie naar een ANDERE pagina laten wijzen wist stil alle
 parameter-bindingen — zet ze altijd opnieuw.** Bevestigd 2026-09-11 (taak 18,
 twee plekken): na "Select Page" om te zetten van de ene naar de andere pagina
@@ -2071,6 +2094,15 @@ bevestigde pogingen stoppen en aan Bob vragen — geef het exacte pad
   **Bij verifiëren:** een gepagineerde lijst genereert
   `noItemsFoundIndicatorBuilder:`, geen `if (x.isEmpty)` — grep je alleen op
   `isEmpty`, dan lijkt een geslaagde wijziging ten onrechte mislukt.
+  ⚠️ **Widget Type biedt alleen *Image* of *Component* — géén Text** (bevestigd
+  2026-09-20 door Bob). Een lege lijst die moet uitleggen wáárom hij leeg is,
+  gaat dus via een component. Dat staat er sinds die datum als
+  **`LegeLijstComponent`** (`lib/shared/lege_lijst_component/`): Icon
+  `event_busy` + gecentreerde `Text` op `bodyMedium`/`secondaryText`, met één
+  **required** String-parameter `tekst`. Hergebruiken, niet opnieuw bouwen —
+  ook op de plekken waar nu nog een kaal `logo800px.png`/applogo als lege staat
+  staat. **Let op:** een parameterwaarde is een letterlijke string, geen
+  i18n-sleutel, dus zo'n melding krijgt géén globe en dus geen EN-vertaling.
 
 **Patroon: lege/ontbrekende afbeeldings-URL laat de app crashen.**
 `CachedNetworkImage` gooit een **synchrone** `ArgumentError` bij het

+ 17 - 2
TASKS.md

@@ -28,8 +28,6 @@ Google Play en één doorloop die alleen Bob kan doen.
 |---|---|---|
 | **G0.6** | Play-screenshots | ✅ Nieuwe set van 10 klaar (2026-09-19 avond). Alleen `tel-04-horeca.png` moet over zodra *Show Test Ads* uit staat |
 
-| **110** | `MijnProfiel` 3 tabs — restpunten | **Eigenaar: Bob.** De ombouw zelf is **af** (2026-09-20, FlutterFlow-commit "Taak 110", export 0 errors): TabBar *Mijn evenementen / Stadseditor / Account* (indicator `secondary`, EN-labels), tab 1 komende evenementen ≤5 + horecakaarten met knop "+ Evenement aanmaken" (→ `uitgaansevenementAanmaken.horecagelegenheidNid`) + hint "Een horecagelegenheid toevoegen kan alleen op uitgaanskrant.com." + knop "Zaak toevoegen" → support-pagina, tab 2 komende activiteiten ≤5 + gemeentekaarten met knop "+ Activiteit aanmaken" (→ `stadsactiviteitAanmaken.gemeenteTid`, voorselectie via `gemeenteVoorselectie`), tab 3 `userName` + Wachtwoord/Verwijderen/Uitloggen. Drupal `type`/`komend` staan op productie. **Nog te doen (klein, cosmetisch/optioneel):** (a) tik op een **ongepubliceerd** evenement in tab 1/2 opent nu `EventCurrent`, en die laadt leeg omdat `flutterflow_events.json` alleen gepubliceerde nodes geeft — gewenst: conditionele actie op `$.status` (== '0' → Show Snack Bar "Nog in beoordeling", anders Navigate). Zit op de `ListTile`s in `mijn_profiel_widget.dart` (2×) én op `MijnAanmeldingen`; heeft een bool custom function nodig (`isOngepubliceerd(dynamic item)`), ConditionalBuilder/conditionele actie → Bob. (b) Empty List Widget-teksten op de drie ListViews ("Geen komende evenementen", "Geen horecagelegenheden gekoppeld", "Geen gemeenten met stadsrechten"). (c) hint-tekst onder de horecalijst mag kleiner/grijs (Body Small + Secondary Text) — 2× niet geland via automation. |
-
 | **112** | `SelectStateDropDownComponent`: hartje bij tikken ook in het favorietenlijstje | **Eigenaar: Bob (of Claude in een eigen sessie).** De laadkant is af (2026-09-20): bij het openen vult `favorieteGemeenteIds` zich uit `favorieten_gemeenten.json`, dus het hartje klopt meteen. Wat nog ontbreekt: tik je op het hartje, dan verandert het lijstje eronder pas na opnieuw openen. Nodig: één custom function `favorietenLijstToggle(lijst, nid, titel, parentNid, parentTitel)` die het item toevoegt of verwijdert, plus in beide IconButton-ketens (If- én Else-tak van de `ConditionalBuilder`) een `Update Component State → favorieteGemeentenLijst` met die functie. ~10 argument-bindingen; kan ook met een extra `drupalRequest`-GET (6 argumenten per tak) i.p.v. de functie |
 
 
@@ -54,6 +52,23 @@ Google Play en één doorloop die alleen Bob kan doen.
 *(P2-45b, P2-45c en 76 zijn op 2026-09-19 afgerond en geverifieerd met een
 verse export — zie de commit van die datum.)*
 
+- ⬜ **`MijnAanmeldingen`: de Navigate naar `EventCurrent` mist de parameter
+  `horecaid`.** Verloren gegaan bij taak 114 (2026-09-20), toen de Navigate in
+  een conditionele tak opnieuw is opgebouwd; hij stuurt nu alleen `nid`. Geen
+  crash, maar op `EventCurrent` zit het zaak-blok achter
+  `visible: widget!.horecaid != null && != ''`, dus dat verdwijnt voor events
+  die aan een horecagelegenheid hangen. Fix: de `Column` in de lijst → Actions →
+  Action Flow Editor → de Navigate in de FALSE-tak → Parameters → `horecaid` →
+  Set from Variable → loop-item `aanmeldingItem Item` → Available Options
+  **JSON Path** → `$.horecagelegenheidnid`.
+- ⬜ **Typo in een lege-lijst-tekst op `mijnProfiel` tab 1** (horecalijst):
+  "op de **uitgaaskrant.com** website" mist een n → `uitgaanskrant.com`. Staat op
+  de `LegeLijstComponent`-instantie van de horeca-`ListView`, parameter `tekst`.
+- ⬜ **De vier lege-lijst-teksten op `mijnProfiel` hebben geen Engelse
+  vertaling.** Een component-parameterwaarde is een letterlijke string, geen
+  i18n-sleutel, dus er is geen globe. Bewuste keuze (2026-09-20); meepakken bij
+  de bredere vertaalronde (P1-17), niet los.
+
 - ⬜ **`MijnAanmeldingen`: de "Gepubliceerd"-tak is nooit met echte data gezien.**
   Alle testaanmeldingen op devbob staan op `status: 0`, dus de lijst toont
   uitsluitend "Wacht op goedkeuring". De tekst komt kant-en-klaar uit Drupal