Jelajahi Sumber

Sessie 2026-09-04/06: Drupal/infra-blok + horeca-detailpagina afgerond

TASKS.md:
- P1-29 root cause hard gemaakt (MySQL utf8 i.p.v. utf8mb4; emoji zijn
  4-byte en sneuvelen bij opslaan, U+FE0F/U+200D overleven). DB is
  inmiddels goed; alleen historische schade, 2 van 235 nodes.
- P1-30 klaar, bewust disabled tot livegang; custom rule 'flutterflow'
  skipt nu nog alle rate limiting rules op dezelfde paden.
- Minor-2 afgerond: $[:].bezorgdin bestond niet (heet bezorgtin),
  afhaalopties miste een guard, en drie velden zijn lists -> nieuwe
  custom function lijstAlsTekst.
- P0-11, P2-16, P2-16b, P2-18, P2-19, P1-41, P2-7 (2 items) afgerond.
- P1-5 uitgezocht: data bestaat (afhaalopties bevat "Bezorgen"), maar
  de establishments-view kan er niet bij -> views-werk nodig.
- P2-1 uitgezocht: geen exposed datumfilter (geverifieerd met een
  controle-parameter), datum is string zonder jaartal.
- Nieuw P1-42: lijsten tonen ~76% verlopen evenementen door sortering
  op created DESC i.p.v. eventdatum.
- Nieuw P1-43 (Claude): sorteer-/verlopen-audit over overige views.
- Wachtrij bovenaan toegevoegd.

CLAUDE.md: Services-JSON-sleutels volgen het views-label; multi-value
velden komen als lijst binnen; Custom Code verwacht alleen de body;
Entry Page = uitgelogde tak; utf8mb4-handtekening; controle-parameter
bij het testen van views-filters.
bob 1 Minggu lalu
induk
melakukan
f743d06a81
2 mengubah file dengan 119 tambahan dan 0 penghapusan
  1. 69 0
      CLAUDE.md
  2. 50 0
      TASKS.md

+ 69 - 0
CLAUDE.md

@@ -2398,6 +2398,75 @@ sessie:** nieuwe App State-velden/Constants zijn voor Claude niet
 zelfstandig toe te voegen — na 1-2 pogingen overdragen aan Bob met
 exacte veldnaam+type-specificatie (kost hem seconden per veld).
 
+**Een Drupal Services views-JSON leidt zijn sleutelnaam af van het
+views-LABEL, niet van de veldnaam — en dat is een veelgemaakte bron van
+"waarom is dit veld altijd null".** Bevestigd 2026-09-04: de app las
+`$[:].bezorgdin` terwijl de respons `bezorgtin` heet, omdat het label van
+`field_hor_bez_bezorgd_in_1` in de view op `Bezorgtin` (met een **t**)
+staat. `getJsonField` geeft dan gewoon `null` en de widget toont op élke
+node de tekst "null" — dus niet alleen bij lege data, wat het makkelijk
+laat verwarren met een ontbrekende Visibility-guard. **Vuistregel bij
+een veld dat altijd leeg blijft: haal één record met echte data op
+(`curl ... | jq`) en vergelijk de sleutelnamen letterlijk**, in plaats
+van de veldnaam uit Drupal over te nemen.
+
+**Een views-veld van het type "All taxonomy terms" of een multi-value
+referentie komt als LIJST binnen, en `.toString()` daarop geeft
+blokhaken.** De app toonde `[Afhaal, Bezorgen]` i.p.v. `Afhaal,
+Bezorgen`. FlutterFlow heeft geen ingebouwde join-transform voor een
+JSON-lijst (de "Available Options"-lijst kent alleen List Contains Item,
+Filter, Item at Index, e.d.). Gebruik de custom function
+**`lijstAlsTekst(dynamic items)`** die hiervoor in
+`custom_functions.dart` staat — die is bewust plat geschreven (geen
+`.map()`, geen lokale closure) omdat FlutterFlow's validator daarover
+struikelt. Let op: of een veld een lijst is zie je **niet** aan de
+formatter in de view-export; `taxonomy_term_reference_plain` levert een
+string bij single-value (`plaats`) en een lijst bij multi-value
+(`bezorgtin`). Alleen een echt record met data geeft uitsluitsel.
+
+**Custom Code-editor: FlutterFlow genereert de functiesignature zelf —
+plak alléén de body.** Bevestigd 2026-09-04: een compleet uitgeschreven
+functie (`String lijstAlsTekst(dynamic items) { ... }`) in het codeveld
+plakken levert een functie **in zichzelf** op
+(`String? lijstAlsTekst(...) { String lijstAlsTekst(...) { ... } }`) —
+de buitenste heeft dan geen `return` en geeft dus altijd `null` terug.
+Het glipt langs de validator (terwijl datzelfde geneste-functie-patroon
+elders juist "The function is empty or cannot be parsed" geeft) en komt
+gewoon in de export. Herstel via Cancel → "Discard new custom code?" →
+Yes en opnieuw beginnen; achteraf bewerken is onbetrouwbaar (zie het
+selectie-verwijderen-probleem elders in dit bestand).
+
+**App Settings → Initial Page: "Entry Page" is de tak voor UITGELOGDE
+bezoekers, "Logged In Page" die voor ingelogde.** Makkelijk te
+verwisselen, met een groot effect: 2026-09-04 kreeg daardoor juist de
+nieuwe, uitgelogde bezoeker een verplicht keuzescherm als eerste indruk.
+Genereert in `nav.dart` op **twee** plekken hetzelfde ternaire patroon
+(de `_initialize`-route én de `errorBuilder`) — controleer ze allebei.
+**Beide op dezelfde pagina zetten mag:** FlutterFlow toont dan "Warning:
+Entry Page and Logged In Page should be different", maar dat is een
+generiek advies, geen fout — de waarde slaat gewoon op (geverifieerd via
+verse export).
+
+**Emoji/4-byte tekens die als `?` in de database staan: kijk naar wat er
+NAAST de vraagtekens overleefde.** Blijft er een losse variatieselector
+(U+FE0F) of ZWJ (U+200D) staan, dan is het MySQL `utf8` (3-byte) i.p.v.
+`utf8mb4`: 4-byte sequenties worden bij het *opslaan* door `?` vervangen,
+3-byte tekens overleven. Dit raakt ook "fancy" letters uit het
+mathematical-alphanumeric-blok (U+1D400). De data is dan definitief weg —
+niets te decoderen, geen app-fix mogelijk. Snelste test of het nú nog
+gebeurt: een testnode met een emoji opslaan en herladen. Let op dat een
+tweede schrijfroute (bv. een Django-importer met een eigen
+databaseverbinding) zijn eigen `charset`-instelling heeft, ook al staat
+de kolom goed.
+
+**Bij het testen of een views-endpoint een filter-parameter accepteert:
+stuur altijd óók een verzonnen parameter mee als controle.** Drupal Views
+negeert onbekende query-parameters **stil** — zonder die controle bewijst
+"de resultaten veranderen niet" niets (het kan net zo goed de verkeerde
+parameternaam zijn). Bevestigd 2026-09-05: `onzin_param=123` gaf exact
+dezelfde 25 items als vijf serieuze kandidaat-filternamen, wat pas hard
+maakte dat er geen exposed datumfilter bestond.
+
 ## Domein/architectuurcontext
 
 - **Merk-DNA van uitgaanskrant.com (bron van waarheid voor look&feel;

+ 50 - 0
TASKS.md

@@ -1,5 +1,34 @@
 # Uitgaanskrant — takenlijst
 
+## ▶ Nu aan de beurt (stand 2026-09-06)
+
+Klaargezet aan het eind van sessie 2026-09-04/06. Volledige beschrijving
+staat bij de taak zelf verderop; dit is puur de wachtrij.
+
+**Voor Bob — drie taken, in willekeurige volgorde:**
+1. **P0-12 restpunt** — bij het gemeentehartje in
+   `select_state_drop_down_component_widget.dart` (regel ~340, label
+   "Toevoegen favoriet") de reden erbij zetten die de site wél geeft:
+   dat je die gemeente donderdags in de agendamail krijgt. Nu is
+   "gemeente volgen" een knop zonder zichtbaar nut. Engelse vertaling
+   niet vergeten (zie P1-17).
+2. **P2-20** — serif koppen (Noto Serif Bold) op kaart- en detailtitels,
+   interface blijft Roboto. Groter; verdient een eigen sessie, en daarna
+   alle kaarttitels nakijken op afbreken. "Niet doen" is een legitieme
+   uitkomst.
+3. **P1-17** — de resterende 108 Engelse vertalingen invullen. Bulkwerk,
+   per pagina-sectie te doen, ideaal als tussendoortje.
+
+**Voor Bob, zodra hij weer in Drupal/views zit:** **P1-42** (lijsten
+tonen ±76% verlopen evenementen door sortering op `created DESC`) en
+**P2-1** (datumfilter) — één ingreep in dezelfde view lost beide op.
+**P1-5** (Thuis bezorgen) vergt ook views-werk en kan in diezelfde ronde.
+
+**Voor Claude:** **P1-43** — de sorteer-/verlopen-audit afmaken over de
+overige lijstviews. Code- en API-only, geen builder nodig.
+
+---
+
 **Deze sessie (2026-08-30, zelfstandig, code-only — géén browser-
 tabgroep aanwezig bij sessiestart, dus aangenomen dat Bob niet actief
 achter zijn scherm zat en geen builder-UI geprobeerd):** P2-6's
@@ -2187,6 +2216,27 @@ services_1/2/3 — de views waar Home zijn tabs mee vult.
   (gemeten op de API, niet op een toestel), en of de horeca-/
   favorieten-lijsten dezelfde sortering hebben.
 
+**P1-43 · Eigenaar: Claude — bezig (sessie 2026-09-06)** (code/API-only, geen builder — dus ook
+geschikt als Bob niet achter zijn scherm zit). Afmaken van de audit die
+P1-42 opleverde: **is de sorteer-/verlopen-bug beperkt tot
+`flutterflowmobiel1`, of raakt hij meer lijsten?** Na te lopen:
+1. De overige evenement-displays (`flutterflowmobiel1` services_2 t/m
+   services_7, `flutterflow_events`, `flutterflowmobiel_establishment_events`,
+   `flutterfavorietenagenda`) op dezelfde manier meten: maandspreiding
+   over de eerste ~6 pagina's, en hoe diep de paginering teruggaat.
+   Recept staat bij P1-42; let op dat `/nl/` Nederlandse maandafkortingen
+   geeft (`sep`) en `/en/` Engelse (`Sep`) — parser daarop aanpassen.
+2. De **favorieten-agenda** apart bekijken: die is per gebruiker en
+   vraagt een sessiecookie, dus meten met
+   `-H "Cookie: <session_name>=<sessid>"`.
+3. Vaststellen of de horeca-overzichten hetzelfde probleem hebben — die
+   hebben geen datum, dus daar gaat het om de vraag of `created DESC`
+   een zinnige volgorde is of dat sortering op naam/relevantie beter is.
+4. Uitkomst als één lijstje "welke view, welke sortering, hoeveel
+   verlopen" bij P1-42 zetten, zodat Bob alle views in één Drupal-sessie
+   kan afwerken i.p.v. één voor één.
+
+
 **P2-2 · Eigenaar: Onbepaald, bewust v2 (herbevestigd 2026-08-25 door
 Bob).** Google Maps-**overzichtsweergave** (kaart met meerdere markers)
 van horecagelegenheden op de overzichtspagina — bewust niet vóór