Forráskód Böngészése

Take(25)-limiet opgelost op alle zes horeca-tabs; stand van 13 sep vastgelegd

- Bevinding A afgesloten: niet alleen tab 6, ook de vijf
  filterHorecagelegenheden-tabs hadden .take(25). Amsterdam: 304 zaken
  waren onbereikbaar (Eetgelegenheden 245 -> 25). Nu 6x take(1000),
  geverifieerd in verse export.
- CLAUDE.md gecorrigeerd: het Generate Dynamic Children-paneel is niet
  stuk op die pagina; de blokkade is specifiek voor browser-automation.
- Architectuurbesluit vastgelegd: geen user-specifieke elementen op
  overzichtspagina's, zodat die calls cachebaar blijven.
- Taak 25 afgevoerd (granularity was al hour, gemeten per display).
- Contentstand hermeten: 9625 events, 38 komend, horizon 12 dagen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 napja
szülő
commit
1a5abadc8e
2 módosított fájl, 158 hozzáadás és 22 törlés
  1. 24 0
      CLAUDE.md
  2. 134 22
      TASKS.md

+ 24 - 0
CLAUDE.md

@@ -1880,6 +1880,17 @@ op een wegwerp-duplicaat):
   variabele hoogtes aankan. Dat is ook het patroon dat op
   `HorecagelegenhedenOverzicht` al draait.
 
+**⚠️ ACHTERHAALD PER 2026-09-13 — het lag aan Claude's browser, niet aan
+de pagina. Bob zette `Max Items` op alle zes de tabs van
+`horecagelegenhedenOverzichtCurrent` in één ronde van 25 naar 1000, en een
+verse export toonde 6× `.take(1000)`.** Het paneel werkt dus gewoon; de
+blokkade hieronder is specifiek voor browser-automation op dit paneel.
+**Wat wél blijft gelden is de diagnostische vuistregel** (zet één triviale
+waarde en draai een export vóór je tien pogingen in een moeilijke binding
+steekt) — alleen is de conclusie bij een mislukking niet meer "deze pagina
+is stuk", maar **"Claude komt hier niet bij, geef het aan Bob"**. Hieronder
+het oorspronkelijke verslag, bewaard omdat de meetmethode klopt.
+
 **Een paneel kan op ÉÉN pagina structureel niets meer wegschrijven —
 test dat met een triviale waarde vóór je een moeilijke binding de schuld
 geeft.** Bevestigd 2026-09-09 op `HorecagelegenhedenOverzichtCopy3`: het
@@ -2951,6 +2962,19 @@ maakte dat er geen exposed datumfilter bestond.
 
 ## Domein/architectuurcontext
 
+- **Geen user-specifieke elementen op overzichtspagina's — besluit Bob,
+  2026-09-13.** Concreet: géén favorietenhartje op de kaarten van een
+  overzicht/lijst; favoriet maken gebeurt op de **detailpagina**. De reden
+  is niet cosmetisch maar architectureel: zolang een overzichtscall
+  user-onafhankelijk is, is hij **cachebaar** (Drupal-page cache,
+  edge-cache, en FlutterFlow's eigen `cache: true`). Eén hartje per kaart
+  maakt het antwoord per gebruiker uniek en zet daarmee de hele caching-laag
+  buitenspel, plus het kost een extra lookup per kaart. Aanleiding: het
+  hartje op `HorecagelegenhedenoverzichtKaart` verdween bij taak 18 (commit
+  `7094b43`) en de vraag was of het terug moest — antwoord: nee, bewust
+  laten. **Gevolg dat je moet kennen:** op Favorieten tab 3 staan dus geen
+  hartjes en kun je niet ter plekke ontvolgen; dat is geen bug.
+
 - **Merk-DNA van uitgaanskrant.com (bron van waarheid voor look&feel;
   uitgelezen 2026-08-30 uit de live CSS + berekende stijlen).** Vier
   kleuren met elk één vaste rol, nergens door elkaar gebruikt:

+ 134 - 22
TASKS.md

@@ -5,6 +5,47 @@
 Twee echte bevindingen uit een browserloze audit; allebei nagemeten tegen
 productie, geen van beide eerder opgeschreven.
 
+**A · ✅ OPGELOST 2026-09-13 (Bob, builder) — en het bleek vijf keer groter
+dan deze bevinding beschreef.** Alle zes tabs van
+`horecagelegenhedenOverzichtCurrent` staan nu op `.take(1000)`, geverifieerd in
+een verse export (6x `.take(1000)`, regels 562/763/950/1184/1419/1647).
+
+⚠️ **De limiet zat niet alleen op tab 6.** Bij het verifiëren bleek dat óók de
+vijf `filterHorecagelegenheden`-tabs een `.take(25)` hadden. Gemeten per tab op
+Amsterdam (`townid=28695`), vóór de fix:
+
+| tab | zaken in de API | toonde | onbereikbaar |
+|---|---|---|---|
+| Eetgelegenheden | **245** | 25 | **220** |
+| Uitgaan | 75 | 25 | 50 |
+| Cultuur | 42 | 25 | 17 |
+| Verhuur, catering | 42 | 25 | 17 |
+| Activiteiten | 24 | 25 | — |
+| Overnachten | 14 | 25 | — |
+
+Samen **304 zaken** die een gebruiker niet kon bereiken. Dubbel zonde omdat
+`fetchAlleHorecagelegenheden` netjes doorpagineert tot alles binnen is (tot 10
+pagina's): de app haalde die 245 dus echt op — drie API-calls — en gooide er 220
+weg in de laatste regel. Op Arnhem viel het nooit op; daar heeft de grootste tab
+20 zaken.
+
+🔑 **En dit corrigeert een aanname die maanden standhield:** het
+**Generate Dynamic Children**-paneel is *niet* stuk op deze pagina. Bob zette
+alle zes de waarden in één ronde om. De blokkade (zes pogingen, byte-identieke
+export, `Duplicate Page` erft 'm) is dus **specifiek voor Claude's
+browser-automation**, niet voor de opgeslagen pagina-state. `CLAUDE.md` is
+hierop gecorrigeerd. Praktisch gevolg: loopt een paneel bij Claude vast, dan is
+de conclusie voortaan "geef het aan Bob", niet "deze pagina is stuk".
+
+**Wat van deze bevinding nog openstaat** (los van de limiet, en niet urgent):
+tab 6 leest nog steeds rechtstreeks uit zijn Backend Query in plaats van via
+`filterHorecagelegenheden`, en heeft daardoor (1) geen zoekveld — het bekende
+"5 van de 6"-restpunt uit P2-6, (2) het crashpatroon uit bevinding C, en (3)
+een dubbele fetch: `_model.alleVerhuurCatering` wordt gevuld maar nergens
+gelezen.
+
+<details><summary>Oorspronkelijke bevinding (2026-09-13, vóór de fix)</summary>
+
 **A · Tab 6 "Verhuur, catering" is niet meegemigreerd — en kapt content af.
 17 van de 42 Amsterdamse zaken zijn onbereikbaar.**
 Op `horecagelegenhedenOverzichtCurrent` bouwen vijf tabs hun lijst via
@@ -42,6 +83,8 @@ vrijwel zeker ook de reden dat deze tab destijds niet is meegegaan. **Dit is
 dus geen "even naklikken" — het is dezelfde blokkade, nu met een gemeten
 gevolg: er is content die een gebruiker niet kan zien.**
 
+</details>
+
 **B · ✅ AFGEHANDELD — geen hartje op het horecakaartje, Bob's besluit
 2026-09-13: "geeft te veel load".** Het favorietenhartje op de
 horeca-OVERZICHTSkaart is inderdaad verdwenen (gesneuveld in commit `7094b43`,
@@ -125,28 +168,97 @@ lijst.
 
 ### 🥇 ALLEEN JIJ KUNT DIT — Drupal/views, Claude komt er niet bij
 
-**Taak 25 · granularity op `flutterflowmobiel1` services_1 — 2 min.**
-De enige display die afwijkt: services_1 staat nog op de default
-`granularity = day`, de andere zes op `hour`. Gevolg: de Home-slider blijft een
-evenement een hele dag tonen terwijl de tabs het na 2 uur laten vallen. View →
-display **services_1** → datumfilter *Content: Datum - start date* → knop
-**"More"** onderin → **Granularity = `hour`**. ⚠️ Op de **display** zetten, niet
-op de Master — services_1 overridet zijn filters (`defaults['filters'] = FALSE`).
-
-**Taak 20 (P1-5) · "Thuis bezorgen".** Volledig uitgeschreven verderop onder
-*"Voor Bob — drie Drupal-taken"*. Kort: nieuwe Services-display op
-`flutterflowmobiel_establishments` (dupliceer `services_1`), **Filter criteria
-op override**, dan *Content: Has taxonomy terms* → vocabulaire
-`thuisbezorgen_afhaalbezorgen` → term **"Bezorgen"**. **Geef Claude daarna het
-`display_id` plus een `townid` waar bezorgers zitten** — dan verifieert die het
-endpoint en hangt het drawer-item eraan.
-
-**Taak 28 · 7 van de 58 komende events halen geen enkele tab.** Lijst met nid
-en titel staat verderop. Zes missen een categorie; de zevende heeft
-*"Tweedehands markt"*, de enige categorie in de hele voorraad zonder tab.
-
-**Taak 29 · HTML-entiteiten op de evenement-detailpagina.** Afgebakend, zie
-verderop.
+*Doorlopende chatnummering van 2026-09-13. Stand: 25 afgevoerd, 34/35/36/37
+afgerond (zie hierboven), 20 grotendeels rond.*
+
+**Taak 38 · de bezorg-display komt niet door op productie.** De view-export die
+Bob plakte bevat `services_2` ("thuisbezorgt", filter
+`field_hor_bez_ophaalbezorg_tid` = 36176, `horcat` er correct af), maar het
+endpoint antwoordt onveranderd `Display services_2 on view
+flutterflowmobiel_establishments could not be found`. Alleen `services_1`
+bestaat daar — `services_2` t/m `_5`, `services_8`, `thuisbezorgt`, `page_1` en
+`default` allemaal getest. Diagnose in deze volgorde:
+1. `drush @prod php-eval "\$v=views_get_view('flutterflowmobiel_establishments'); print implode(', ', array_keys(\$v->display)) . ' | type=' . \$v->type;"`
+   — kent Drupal de display, en is `type` *Normal/Database* of *Default*?
+2. Staat hij er niet in: is de view na de import ook echt **opgeslagen**? Views
+   UI toont een geïmporteerde view compleet zonder dat hij bewaard is.
+3. Staat er `type=Default`, dan wint een code-/feature-versie van de database —
+   dan moet de wijziging via die feature, niet via de UI.
+4. Staat hij er wél in maar blijft de JSON falen: `drush @prod cc all`. De
+   view-definitie zit in de ctools-cache, niet in de page cache, dus een
+   `_cb=`-parameter in de URL helpt daar niet tegen.
+
+Zodra hij draait: Claude meet hoeveel bezorgers er per plaats zijn en legt de
+ontwerpkeuze voor (losse lijstpagina vs. 7e tab). Op devbob gaf `horcat=17967`
+op deze display 0 resultaten, wat suggereert dat bezorgers nauwelijks in de zes
+tabcategorieën zitten — losse pagina ligt dus voor de hand. De pagina heeft nog
+géén `display_id`-parameter; die moet er eerst op.
+
+**Taak 29 · HTML-entiteiten op de evenement-detailpagina.** Bevestigd op nid
+214466 (13 sep): `flutterflow_events` geeft `Onno Innemee &amp; Ytwer Bosma`,
+`flutterflowmobiel1` op dezelfde node `Onno Innemee & Ytwer Bosma`. Eén
+database, twee views — dus viewconfig, geen data. Titels handmatig editen is
+zinloos: 837 stuks, en na de volgende import weer terug.
+**Body hoeft niet mee:** die gaat via `EvenementV2HTMLComponent` door een echte
+HTML-renderer en wordt vanzelf gedecodeerd; er is geen dubbele escaping (0
+gevallen `&amp;amp;`). Alleen de platte-tekstvelden, gemeten over 9625 events:
+`title` **837** (`&amp;` 695, `&#039;` 179, `&quot;` 54), `adres` **89**,
+`categorie` 22, `organisator` 1.
+Eerste verdachte: **`_custom_clean_html` in `custom.module`** — kijk of daar op
+viewnaam gefilterd wordt; staat `flutterflowmobiel1` er wel in en
+`flutterflow_events` niet, dan is dat de fix en is het één regel. Anders beide
+views exporteren (`drush @prod php-eval "print views_get_view('X')->export();"`)
+en aan Claude geven om te diffen.
+
+**Taak 31 · dubbele rijen in `flutterflow_events` → Distinct.** nid 214439 komt
+14x terug, 214441 3x. Alle 14 rijen zijn veld voor veld **identiek** — dus de
+vermenigvuldiging komt van een sort/filter op een multi-value veld dat niet in
+de output zit, vrijwel zeker `field_date` (die markt vindt 14x plaats). Fix:
+Advanced → Query settings → **Distinct**. Werkt dat niet: het datumfilter →
+*Multiple field settings* → "Display all values in the same row". Verificatie:
+`...flutterflow_events.json?display_id=services_1&nid=214439` moet 1 rij geven.
+Geen haast — de app vraagt deze view alleen per `nid` op en bouwt er nooit een
+lijst uit.
+
+**Taak 32 · de 5 komende events die in geen enkele tab komen.**
+*Deel A:* "Tweedehands markt" (nid 214439) raakt geen enkele display — hang 'm
+aan **services_5** (Cultuur & Info, de breedste met 11 categorieën). Filter
+criteria → categoriefilter → **override**, niet "All displays".
+*Deel B:* vier events zonder categorie (214455, 214456, 214474, 214476). Dit
+groeit mee met elke import. Structureel: default categorie bij import. In
+Views: OR-filtergroep met "Is empty (NULL)" op het categorieveld.
+
+**Taak 33 · exposed datumfilter (Vandaag / Dit weekend / Deze week), P2-1.**
+Volledig uitgeschreven verderop onder *"Voor Bob — drie Drupal-taken"*.
+
+**Taak 34 · twee wezen, gemarkeerd voor de schoonmaak (2026-09-13).**
+`flutterflowmobiel1` services_2 heet nu "ongebruikt" (machine name ongewijzigd,
+geeft nog 25 items — bewust bewaard). De view `flutterfavorietenagenda` is
+hernoemd; de API-call heet in de export `KANWEGFavorietenAgendaCall`. Er staat
+ook nog een `KANWEGFavorietenAgendaTESTKANWEGCall`, al op de P2-7-lijst.
+
+### ✅ Contentstand productie — hermeten 2026-09-13 17:49
+
+| | 09-11 | 09-12 | **09-13** |
+|---|---|---|---|
+| unieke events | 1010 | 2007 | **9625** |
+| **toekomstige** events | 4 | 61 | **38** |
+| laatste datum in voorraad | — | — | **25 sep** |
+
+⚠️ **De voorraad verviervoudigde, maar de horizon is 12 dagen en er staat nog
+steeds niets ná september.** De import voegt vrijwel uitsluitend verleden toe.
+Zodra dat verklaard is (publiceert de bron kort vooruit, of haalt de import maar
+een venster op?) is dat het laatste grote contentgat vóór livegang.
+
+Van de 38 komende events komen er **5** in geen enkele tab (zie taak 32); dat
+waren er 7 op 09-12, de twee andere zijn simpelweg verstreken. En 21% van de
+hele voorraad (2102 van 9625) heeft ergens een HTML-entiteit (taak 29).
+
+Methode om dit te herhalen: pagineer `flutterflow_events` volledig
+(`display_id=services_1&page=N&limit=100`), pagineer de zeven
+`flutterflowmobiel1`-displays, en leg de nids naast elkaar. Classificeer op
+**datum + tijd**, niet op datum alleen — en leid het jaar af uit de weekdag,
+want `datum` bevat er geen.
 
 ### 🤝 CLAUDE KAN DIT OVERNEMEN — zeg het en het gebeurt