|
|
@@ -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 & 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;`). Alleen de platte-tekstvelden, gemeten over 9625 events:
|
|
|
+`title` **837** (`&` 695, `'` 179, `"` 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
|
|
|
|