*Opgeschoond 2026-09-19 (van 1924 naar ~800 regels). Afgeronde taken zijn
verwijderd, niet gearchiveerd — ze staan in de git-historie en de blijvende
inzichten in CLAUDE.md. Alles hieronder is open werk. Staat iets er niet
meer in, dan is het klaar of afgewezen — niet opnieuw agenderen.*
Voor een nieuwe sessie: pak een taak uit "Claude — open", zet er meteen
— bezig achter in dit bestand (een echte Edit, niet pas bij het afsluiten;
andere sessies delen deze working directory), en verifieer elke builder-wijziging
met een verse export. Taken onder "Bob — open" niet zelf oppakken.
De app-kant is vrijwel af. Op 2026-09-19 zijn o.a. afgerond: de
header-locatie-keten (Home toont Heel Nederland, provinciepagina de
provincienaam), het adaptive icon, de loginpagina, het drawer-logo, Crashlytics,
"Mijn aanmeldingen", de categoriedropdown op het horeca-overzicht, de
horeca-agenda-entiteiten en de opruimronde. Op 2026-09-20 kwamen daar het dichtgezette API-oppervlak (42 → 22 methodes,
het name-lek weg) en de feature graphic bij. Wat rest is livegang-werk:
Google Play en één doorloop die alleen Bob kan doen.
| # | Taak | Kort |
|---|---|---|
| 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 ListTiles 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 |
| 113 | Filterbalk (zoek + datum + chips) ook op PUitgaanPage | Eigenaar: Claude — bezig (2026-09-20). PUitgaanPage bedient provincie én gemeente (10 drawer-ingangen) — één keer bouwen dekt beide. Drupal is al klaar (gemeten: townid + datum_van/datum_tot/zoek werkt op plaats-, gemeente- én provincie-tid, mét tegencontrole). Recept + valkuilen van Convert to Component en Update Page on Changes staan in CLAUDE.md. ✅ Stap 5 af: UitgaanstabelCall heeft nu variabelen + query-parameters datum_van/datum_tot/zoek (lege defaults, dus geen gedragswijziging voor bestaande aanroepers). ✅ Stap 6 af: PUitgaantabelKaartComponent heeft datumVan/datumTot/zoekterm (Required uit → String?, geen !-crash) en die zijn gebonden in de Backend Query; page staat nog op Pagination - Next Page Number. Beide geverifieerd met verse export + dart analyze (0 errors). Nog te doen: (1) op Home de Row in een Column wrappen + TextField erin slepen, dán Convert to Component → FilterBalkComponent; (2) component-state zoekOpen (Boolean, false) + zoekknop → Update Component State → Toggle Value, en de Clear Text Fields-actie opnieuw op het TextField richten; (3) slider-verstopconditie op Home hangt aan textFieldFocusNode.hasFocus — wijst na conversie naar buiten, dus omzetten (ontwerpkeuze Bob); (4) PUitgaanPage: component erin, waarden doorgeven via filterDatumVan/filterDatumTot, Update Page on Changes aan. Testcomponent FilterBalkKanweg + homeCopy/PUitgaanPageCopy mogen na afloop op de opruimlijst |
| # | Taak | Waarom nu |
|---|---|---|
| G | Google Play-checklist G0–G4 | Volledige checklist hieronder |
| 65 | De ingelogde doorloop | Kernfuncties zijn nooit op een release-build getest. Claude kan dit niet (geen wachtwoorden) |
| AdMob | Show Test Ads uit |
App Settings → AdMob. Wacht op de Google-registratie |
| P1-17 | Laatste vertaling(en) | ✅ 1k52hayg → End date en 22xoyrqe → Menu gedaan (2026-09-19 avond, export-geverifieerd). Rest: tcyc3idz zodra "Mijn aanmeldingen" af is |
| Drupal | taak 56-restant · taak 28/109 | Cron-description op "xx days" ✅ gedaan · events zonder categorie gaat via de importer |
| Bij livegang | Schakelaars en opruimklussen | Eigen blok hieronder |
#
(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 "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
(status_label, een ternary op (int) $node->status === 1), dus het risico is
klein — één testnode publiceren en de lijst openen volstaat om dit af te
vinken.MijnAanmeldingen op Favorieten tab 4. Nu loopt
de enige route via MijnProfiel → Bekijk alles. Dat volstaat; alleen
oppakken als je 'm ook direct vanaf Favorieten wilt kunnen bereiken.*Opgesteld 2026-09-19. Account aangemaakt 2026-09-18 als Organisatie (Digital Force); wacht op verificatie. Vervangt taak 63 (a-i) en punt 2 van "Bob's 7" — die twee niet meer los afwerken. Vink hier af.*
Bevestigd via Google's eigen documentatie, 2026-09-19:
#
flutter_launcher_icons, en een crash op de splash zonder
--include-assets), plus een keystore die er nog niet is
(android/app/build.gradle:80 staat op signingConfigs.debug).
Sub-route: download het AAB in FlutterFlow en upload het handmatig in
Play Console. De directe "publish to Play"-koppeling vergt een Google
Play service-account-JSON; pas doen als handmatig uploaden gaat vervelen.
⚠️ Blijft staan als G4.3: controleer het icoon op het AAB dat je uploadt.~/uk-play-assets/play-teksten.md (gered uit een
vluchtige sessie-scratchpad, 2026-09-19 — stond nergens duurzaam).
⏳ Kan pas ingevoerd worden ná G1.1 (de app moet bestaan in Play Console).--release-build (export mét --include-assets,
flutter_launcher_icons vooraf, x64 voor de AVD's), uitgelogd (pm clear),
Nederlandse app-locale: 6 telefoon (1080x1731), 2x 7" tablet (1200x1812, AVD
tijdelijk op wm size 1200x1920 / density 240), 2x 10" tablet (2560x1456).
Status- én navigatiebalk weggecropt; alle ratio's onder 2:1.
📁 ~/uk-play-assets/screenshots/ + play-screenshots.zip; de oude set staat
in screenshots-oud-2026-09-19-middag/ (Claude gooit niets weg).
Opgelost t.o.v. de eerste set: header toont Heel Nederland i.p.v.
"Amsterdam (gemeente)"; de twee 10"-shots zijn nu echt verschillend (Home +
menu, md5 gecheckt); tel-05-zaak.png is het Bimhuis (nid 75459) mét
gevulde agenda.
🔴 Nog één keer over: tel-04-horeca.png toont nog de AdMob-testadvertentie
(showsTestAd: true in de export). Zodra Show Test Ads uit staat schiet
Claude die ene opnieuw — dat is 2 minuten werk, geen nieuwe build nodig
(deep link horecagelegenhedenOverzichtCurrent?plaats=28695).
🔸 Opgevallen, geen blokker: op de detailpagina's (tel-02-event,
tel-05/06-zaak) toont de header Amsterdam (de default
gemeenteSelectId), terwijl Home Heel Nederland zegt. Voor een event in
Steenwijk oogt dat wat vreemd; als je dat consequent wilt, is dat een aparte
taak op de header-keten.~/uk-play-assets/feature-graphic/DEFINITIEF-feature-graphic-1024x500.png
— 1024×500, RGB zonder alpha, 88 kB; voldoet aan de Play-eisen.
B = het complete app-icoon links als afgeronde tegel op leisteen
(#3E454C), rechts de naam + tagline + oranje accentstreep. Rood op
leisteen geeft het icoon contrast; de twee andere merkkleuren doen de rest.
Variant A (merkelement groot op merkrood) staat ernaast, niet gekozen.
feature.py staat erbij: tekst of kleur wijzigen is één regel + opnieuw
draaien. Rest nog: uploaden bij G3.2.#
com.uitgaanskrant.app — onveranderlijk na de eerste
upload, dus controleer 'm.#
https://uitgaanskrant.com/nl/support/privacybeleid
(anoniem 200, gemeten 2026-09-16).https://uitgaanskrant.com/nl/support/mobieleapp
⚠️ NIET /nl/account-verwijderen — die geeft anoniem 403 en reviewers
openen 'm uitgelogd. Taak 85 heeft de in-app-knop al naar dezelfde URL gezet.INTERNET, CAMERA, READ_EXTERNAL_STORAGE,
WRITE_EXTERNAL_STORAGE, plus via AdMob/Firebase ACCESS_NETWORK_STATE,
WAKE_LOCK, FOREGROUND_SERVICE, AD_ID en drie ACCESS_ADSERVICES_*.
Declareren: Advertising ID → JA (verplicht, AD_ID staat erin),
crashlogs/diagnostiek (Crashlytics), gebruikersnaam/e-mail (login), en
foto's (camera + galerij, voor de aanmaakpagina's). Transport is
versleuteld en verwijdering is mogelijk → beide aanvinken.#
assets/images/app_launcher_icon.png
(het volvlakse), niet de adaptive foreground.#
1.0.0+1
(pubspec.yaml:18). Bij de FlutterFlow-route: App Settings → App Details.flutter_launcher_icons wél? Lokaal
gebouwd draagt het bestand anders het Flutter-vogeltje. Niet aannemen.#
Ja, betaald — en anders dan Google een ABONNEMENT. Google Play is eenmalig $25; het Apple Developer Program kost ~$99 per jaar en moet elk jaar verlengd worden, anders verdwijnt de app uit de App Store. Verifieer het actuele bedrag bij inschrijving.
Wat je al hebt en meeneemt:
Info.plist staan al goed (Camera, PhotoLibrary,
Calendar) — geverifieerd 2026-09-19, precies 3 keys.Wat er nieuw bij komt:
ios/Runner.xcodeproj/project.pbxproj
beweegt mee in elke export.Route wanneer het zover is: FlutterFlow kan ook voor iOS bouwen, dus een Mac is niet strikt nodig. Punt 5 en 6 zijn het echte werk; de rest is administratie.
De uitgelogde doorloop is af (2026-09-19, --release, flags=0x0): 0 FATAL,
0 E/flutter, alle iconen renderen, vliegtuigmodus geeft netjes de
VerbindingsBanner, Engels vertaalt. 65a, 65b en 65d zijn opgelost en
export-geverifieerd.
Wat overblijft — en dat is per definitie Bob's stuk, want Claude voert geen wachtwoorden in:
Meenemen in die doorloop (nieuw, 2026-09-20): de gebruikersnaam wordt nu
onthouden na uitloggen. Verwacht gedrag: inloggen → uitloggen → het bovenste
veld op Login staat al ingevuld met wat je de vorige keer typte, het
wachtwoordveld is leeg. Overleeft ook het volledig afsluiten van de app
(persisted). Het kruisje in het veld wist het voor een andere gebruiker.
🔴 De ingelogde doorloop. Nooit op een release-build getest, en het raakt de kernfuncties: inloggen · hartje op een zaakpagina (aan én uit) · Favorieten met inhoud, alle vier de tabs · gemeente volgen · evenement aanmaken tot en met indienen · Mijn profiel inclusief uitloggen. Een Play-reviewer logt straks wél in.
65c · ✅ af (nagemeten 2026-09-19 avond in een verse export): Favorieten toont
uitgelogd nu een uitlegtekst met inlogknop, achter een guard op userSessionid
(sleutel zxbjvxzq). Gebouwd in een andere sessie als taak 107.
65e · "Datum" blijft Nederlands in de Engelse modus — het label komt uit de
valueOrDefault-default 'Datum' en is dus geen vertaalsleutel. Hoort bij P1-17.
Cosmetisch, al bekend: het logo in de drawer staat deels onder de statusbalk op de release-build (op de profile-build van 2026-09-19 is dat niet meer zo — taak 100 zette de padding op 40; opnieuw bekijken bij de volgende release-build).
https://uitgk.com/<nid> (deelknop op EventCurrent en
de tekst in zetInAgenda) redirect naar de juiste pagina op uitgaanskrant.com.
Getest op drie nids, inclusief een horecagelegenheid: 222338 -> "Scott Hamilton
& Rein de Graaff Trio…", 75459 -> "Bimhuis Amsterdam". Eind-URL is een nette
/nl/Noord-Holland/Amsterdam/...-alias./nl/support/mobieleapp (de Support-link in de
drawer én de data-deletion-URL voor Play) en /nl/support/privacybeleid.devbob staat niet meer in de levende app-code (alleen in dode kopieën).Fase 1 én 2 staan op productie en zijn nagemeten. Van 42 naar 22
methodes op endpoint flutterdrup. Het bewezen lek is weg: node/<nid>.json
gaf anoniem 200 met 46 velden inclusief name (de inlognaam van de auteur,
dus user enumeration) en geeft nu 404.
Dicht (404): node/retrieve + relationships/files · file/create +
file/retrieve · taxonomy_term · taxonomy_vocabulary · user/retrieve|create|
delete|logout|token|user_pass_reset|cancel|password_reset|resend_welcome_email ·
system/connect · geocoder · userestablishments.
Blijft aan (22): de app-resources (plaatsen, plaatsen_bij_gemeente,
horecacategorieen, views, de favorieten-, aanmaak- en upload-acties,
mijn_*, categorieen, entreeopties, accountdelete) plus user/login en
user/request_new_password.
Regressiecheck na afloop, devbob én productie: alle vijf views-endpoints 200 ·
plaatsen/plaatsen_bij_gemeente/horecacategorieen 200 · POST user/login.json
401 op onzin · een afbeelding uit een view 200 image/jpeg.
📁 Script: /home/bob/Projects/services-dicht-fase2.php (droogdraai is de default,
doen als argument voert uit). Bewaren voor als er ooit een resource bij komt.
Alleen de vijf app-views geven 200; user_contents, places, _town_tree,
thuis_bezorgen, front_block_go_ca, _for_search_page, establishment_calendar,
flutterfavorietenagenda, _block_go_ca_for_town, block_more_go_out,
latest_photobook en _search_ca_page geven 404.
⚠️ De foutmelding luidt ["Display block_1 on view user_contents could not be
found"] terwijl die view wél een block_1 heeft — dat betekent hier "view staat
niet op de toegestane lijst", niet "display bestaat niet".
AdMob: Show Test Ads uitzetten. App Settings → AdMob (niet een vinkje
op het AdBanner-widget — dat paneel heeft alleen Ad Properties en Ad Banner
Dimensions; de export schrijft de projectinstelling per widget uit).
Twee dingen bij het omzetten: (1) reken op lege ruimte i.p.v. advertenties
zolang de app niet gepubliceerd is — AdMob levert dan nauwelijks fills, dat is
normaal; (2) klik daarna niet zelf op je eigen advertenties, dat telt als
ongeldig verkeer. Zodra hij uit staat schiet Claude tel-04-horeca.png opnieuw.
Builder-opruimronde, laatste restanten. Nog in de export: componenten
SliderUitgaanComponentSmallCurrent en
PUitgaantabelKaartComponentOrgineelMetKaartjeerin en de custom function
dISABLEdatumVoorApi.
⚠️ Pagina Event: laten staan, dit is een doodlopend spoor. Bob bevestigde
2026-09-20 dat óók hernoemen afketst op "Invalid Action" — verwijderen,
verplaatsen en hernoemen falen dus alle drie, ook in zijn eigen browser.
Nagemeten op de export (2026-09-20): de pagina is onbereikbaar. De enige
verwijzingen zijn de twee die FlutterFlow automatisch voor élke pagina
genereert (index.dart en de route-registratie in nav.dart); er is nergens
een goNamed/pushNamed naartoe. Geen enkele gebruiker komt er dus, behalve
via een handmatige deep link. Kosten van laten staan: één dode route in
nav.dart en ~30 kB in de app. Niet opnieuw agenderen. Moet in de builder, niet met
git rm — anders staat alles na de volgende export terug.
P1-17 · laatste vertaling(en). 1k52hayg → End date en 22xoyrqe →
Menu zijn gedaan (2026-09-19 avond). Rest: tcyc3idz zodra "Mijn
aanmeldingen" af is (nu een lege NL-tekst).
⚠️ Tel geen sleutels mee waar EN == NL terwijl dat correct is (Select...,
Website, Facebook, Media, ", " — identiek in beide talen).
Titels met spaties vooraan/achteraan (was P1-47). Bob 2026-09-11: de
impact is te groot, we lopen de namen door bij de livegang. MySQL sorteert op
de rauwe node.title, dus zo'n node valt buiten de alfabetische volgorde
terwijl de JSON schoon oogt (_custom_clean_html poetst ná de query).
Telquery:
drush @prod sqlq "SELECT type, COUNT(*) FROM node WHERE title <> TRIM(BOTH ' ' FROM TRIM(BOTH CHAR(9) FROM TRIM(BOTH CHAR(10) FROM TRIM(BOTH CHAR(13) FROM TRIM(BOTH ' ' FROM title))))) GROUP BY type;"
De fix is een UPDATE met diezelfde geneste TRIM op node én
node_revision, idempotent, met vooraf een sql-dump van die twee tabellen.
URL-aliassen blijven ongemoeid.
Max items + tab 6 (P2-24 A en C) — ✅ opgelost, alle zes de tabs draaien
op filterHorecagelegenheden met .take(1000). Niets meer te doen.
(Afgerond en daarom verwijderd uit dit blok: taak 56 opruim-cron · P1-30
Cloudflare rate limiting · P2-25 debug-cleanup custom.module · de twee dode
KANWEG-API-calls · de opruimronde van 7 dode kopieën.)
Gedaan (export- en toestel-geverifieerd, profile-build op emulator-5554): backups EventCurrentCopy, EvenementHorecagelegenheidCopy, EvenementInfoCopy; event-kaart met logo 96×96 links en EvenementInfo (Expanded) + Maps-knop rechts; de 500 px-Container weg; EvenementHorecagelegenheid zonder tabs: RowLogo (logo 96×96 + ColumnRechts: titel, labels, adres/plaats, telefoon, e-mail), links in een Wrap (Menukaart/Website/Facebook/Instagram/X/"Op Uitgaanskrant.com" met host ervoor), TextInhoud (zaakbeschrijving), foto's, ColumnOpening en ColumnBezorgen met Visibility op openingstijden/bezorgtijden; e-mail leest nu $[:]['e-mail']; drie phone: false-vlaggen weg; telefoon-guard zonder valueOrDefault; Entree-blok alleen bij entreeprijs; roze/rode vulkleuren van Entree/Contact weg; EN-vertalingen "Opening hours"/"On Uitgaanskrant.com".
Nog te doen:
horecaid=157070).
RowLogo (logo 96×96 + titel + categorielabel), de adres-Row [Icon, TextAdres, TextPlaats]
met spacing 6 ("Westerstraat 95 Enkhuizen"), telefoon, e-mail, de links-Wrap
(Menukaart/Website/Facebook/Instagram/X/Twitter/Op Uitgaanskrant.com) en TextInhoud
renderen allemaal goed.
✅ "Contact"-label gefixt (2026-09-19 avond): de Row staat nu op Cross Axis
Alignment start met Items Spacing 8, dus het label lijnt uit met de eerste regel
links i.p.v. tussen de regels te hangen. Export: crossAxisAlignment: start +
.divide(SizedBox(width: 8.0)).ColumnBezorgen mét echte data bekeken en grotendeels opgeknapt (2026-09-19).
Testzaak: nid 157070 (Chinees-Indische restaurant Lotus, Enkhuizen) — die heeft
álle bezorgvelden gevuld (bezorgtijden, bestellink, bezorgkosten, minimaleorder,
bezorgtin, thuisbezorgtbetaalopties, cryptocoins, afhaalopties) én menukaart,
openingstijden, openingstijdenuitzondering en kvk. Route:
uitgaanskrant://uitgaanskrant.com/eventCurrent?nid=214689&horecaid=157070.
Wat er mis was: de sectie toonde elf kale regels zónder één label — "vanaf 17 uur",
"2 euro", "20 euro", "Contant" zonder context, de bestellink als kale URL, geen kop, en
lijstwaarden die aan elkaar plakten ("AfhaalBezorgen", "EnkhuizenBovenkarspel").
Gefixt en op emulator-5554 (profile) geverifieerd: kop "Bezorgen" (i18n jxlwje5u,
dezelfde stijl als "Openingstijden"); labels via Combine Text op Bezorgtijden:,
Bezorgkosten: en Minimale bestelling:; een Visibility-guard op
Textbezorg-minorder (establishmentMinimaleorder is set/non-empty) — die had er géén,
dus met label erbij zou hij anders "Minimale bestelling: null" tonen; en Wrap-spacing 8
op de drie lijsten, zodat de waarden niet meer aan elkaar plakken.TextInhoud heeft nu een kop "Over deze zaak" (EN About this venue, sleutel rko8u7a5, Body Medium 600) in een nieuwe ColumnInhoud met padding-top 8 (2026-09-19 avond, export-geverifieerd).22xoyrqe) staat nu op Menu (2026-09-19 avond).kvk (zaak). Bewust overgeslagen.organisator wordt nu wél getoond (2026-09-19, Bob's besluit, af en op toestel geverifieerd).
Zie het eigen blok hieronder; taak 99 kan hiermee dicht.EventCurrentCopy, EvenementHorecagelegenheidCopy, EvenementInfoCopy) op de P2-7-opruimlijst zetten zodra de nieuwe pagina goedgekeurd is. Claude verwijdert niets.#
Gemeten 2026-09-19 op de export; dit corrigeert een eerdere bewering van Claude
in deze sessie ("tot 60 requests per schermopening"). Die telling was fout: er
staan zes fetchAlleHorecagelegenheden-aanroepen in
horecagelegenheden_overzicht_current_widget.dart, maar ze worden niet samen
uitgevoerd.
addPostFrameCallback) doet er één — tab 0
(horcat 17969, Activiteiten, services_1).onTap: (i) async { [ () async {}, …vijf closures… ][i]() }
— dus per tab-tik precies één fetch, en tab 0 doet niets omdat die al geladen is.Een schermopening kost dus één fetchAlleHorecagelegenheden, en die loopt
door API-pagina's van 100 tot maxPaginas = 10. In Amsterdam heeft tab 0
(Activiteiten) 42 items → één HTTP-request. De 60 uit die eerdere schatting
komt in de praktijk nooit voor.
Gevolg voor de rate limit: 100 requests per 10 s is ruim voldoende; de verhoging naar 200 was niet nodig (schaadt ook niet).
Wat er wél nog te winnen valt, klein: elke tab-tik doet een verse fetch,
ook als je terugkeert naar een tab die je al bezocht hebt. Heen-en-weer klikken
tussen zes tabs haalt dus zes keer opnieuw op. Een guard ("sla de fetch over als
alleXxx al gevuld is") lost dat op, maar kost een conditie in vijf
actieketens — en juist die dialoog is op deze pagina fragiel. Niet gebouwd;
alleen doen als het in de praktijk hindert.
A, C, D en E zijn af (2026-09-19, export-geverifieerd): alle zes de
StaggeredViews draaien op filterHorecagelegenheden(...), .take(25) is weg
(6x .take(1000)), de routes wijzen naar ...Current, en de twee lege
TextField-placeholders zijn opgeruimd. F is geschrapt op Bob's verzoek.
B — categoriedropdown per tab: ✅ af (nagemeten 2026-09-19 avond): de
FlutterFlowDropDown op horecagelegenhedenOverzichtCurrent hangt aan
horcatOptiesVoorTab / horcatLabelsVoorTab met de TabBar-index. Daarmee is P2-24
helemaal rond; dit blok kan weg zodra Bob 'm op het toestel goedkeurt.
Niet oplosbaar, geaccepteerd: FlutterFlow zet op de On Change-trigger van
het zoekveld een EasyDebounce van 2000 ms die nergens instelbaar is. De
lijst ververst dus ~2 s nadat je stopt met typen.
Nagemeten door Claude op productie, 2026-09-19 17:44 (alle zeven displays
volledig gepagineerd, nids naast flutterflow_events gelegd, geclassificeerd op
datum + tijd tegen de >= -2 uur-grens van de master):
| echte toekomstige events | 6.684 |
| bereiken geen enkele tab | 618 (9 %) |
| ... daarvan zonder categorie | 618 — dus 100 % |
| ... daarvan mét categorie | 0 |
Twee dingen die dit uitwijst. (1) De zeven displays dekken alle categorieën correct af — er is geen categorie meer die nergens landt, dus dát deel van taak 28 is klaar. (2) Het hele resterende lek is één oorzaak: een event zonder categorie valt door elk display-filter heen en is in de app dus onvindbaar. Stand 12 sep: 597. Nu: 618. Het loopt dus licht op — de fix van 19 sep werkt kennelijk niet (of alleen voorwaarts, terwijl de bestaande nodes blijven staan).
Voorbeelden (allemaal ruim in de toekomst, dus geen datumkwestie):
222806 Steve 'n' Seagulls (20 dec, Weert) · 222737 Altruism Label Night
(21 nov, Maastricht) · 222703 BRECHTJE Maresa (1 okt, Groningen).
✅ Besluit Bob 2026-09-19: dit is een IMPORT-probleem en wordt bij de importer afgevangen. Geen Drupal-hook of extra display nodig; niet opnieuw agenderen. Wel bij een volgende contentmeting nakijken of het getal daalt (nu 618).
afgewezen alternatief
Voorstel — een default in custom_node_presave(). Die hook draait er al
voor go_out_event (adres/geo/plaats overnemen van de horecagelegenheid); één
blok erbij dat field_category2 vult met een vaste fallback-tid zodra het leeg
is, dekt alle nieuwe imports. De 618 bestaande haal je in één keer mee met een
drush php-eval die diezelfde tid zet en node_save() aanroept.
Wat Claude van Bob nodig heeft: welke tid de fallback moet zijn (een
bestaande categorie, of een nieuwe term "Overig"). De alternatieven — een achtste
display zonder categoriefilter, of de importer aanpassen — kosten meer en geven
een extra tab in de app.
⚠️ Meetles, kostte deze sessie een valse ronde: classificeer op datetime,
niet op datum. Op datum alleen leverde dezelfde meting 30 "bugs" op die in
werkelijkheid gewoon events van vandaag waren die al begonnen waren — precies wat
het >= -2 uur-filter hoort weg te laten. Staat ook al in CLAUDE.md; ik trapte
er alsnog in.
#
launchURL-aanroepen in
levende code hangen achter een guard op de rauwe waarde, niet op een
valueOrDefault.EstablishmentInfo geeft precies één rij per zaak (60 Amsterdamse zaken
getest). De zes $[:].veld-knoppen op de detailpagina leunen daarop; let op
zodra er een multi-value veld aan die view wordt toegevoegd.categorie is op alle zeven flutterflowmobiel1-
displays altijd een lijst (65 records gemeten).SliderUitgaanComponentSmallCurrent negeert zijn eigen
townid/displayid (P1-44-patroon), maar heeft nul gebruikers — geen
impact, alleen niet inzetten zonder dat eerst te repareren.fillColor op de twee aanmaakpagina's is al goed: zowel
stadsactiviteitAanmaken (18 widgets) als uitgaansevenementAanmaken (11)
staat volledig op primaryBackground. Het in CLAUDE.md voorspelde
secondaryBackground-defaultprobleem is dus niet meer aanwezig.$.categorie is op de Home-displays nooit leeg of afwezig (services_1/3/5,
Amsterdam, 25 items elk: altijd een lijst). De .toList() zonder true op
home_uitgaantabel_kaart_component_widget.dart:651 kan daardoor in de praktijk
niet crashen — events zonder categorie halen de displays sowieso niet.EvenementInfo (6 van de 12,
nagemeten en juist), de wees hierboven, en
HorecagelegenheidoverzichtKaart.nid (restant van het verwijderde hartje).node.title, een spatie komt
vóór de A). De eerste kaarten die een gebruiker ziet zijn dus willekeurig.android/ heeft geen ongecommitte
wijzigingen meer en de vastgelegde waarden zijn minSdkVersion
flutter.minSdkVersion (= 24) en tasks.register("clean", Delete) — precies
de moderne variant. Het punt is dus vanzelf beslecht; niemand hoeft hier nog
iets aan te doen.flutterflowmobiel1 opruimen (was taak 46): GESCHRAPT op Bob's verzoek.
services_2 bestaat nog (25 items) maar heet "ongebruikt" en blijft staan
tot een schoonmaakronde.| 09-14 | 09-19 | |
|---|---|---|
unieke events (flutterflow_events) |
16.065 | 17.123 |
| toekomstige events (op datum+tijd) | 6.202 | 6.684 |
| bereiken geen enkele app-tab | 622 (10 %) | 618 (9 %) |
| ... daarvan zonder categorie | 597 | 618 — dus 100 % |
| ... daarvan mét categorie | 25 | 0 |
De displays dekken alle categorieën nu volledig af — er is geen categorie meer die nergens landt. Het hele resterende lek is één oorzaak: een event zonder categorie valt door elk display-filter. Zie het blok bij taak 28/109; Bob vangt dat af bij de importer.
Ouderdomsverdeling (voor de opruim-cron van 180 dagen): 6.728 toekomstig · 8.107 jonger dan 180 dagen · 2.251 tussen 180 en 360 dagen · 14 ouder dan 360. Die 2.251 worden bij de eerstvolgende cronruns opgeruimd; met 1000 per run is dat ~3 dagen.
HTML-entiteiten: titels, adressen en de horeca-agenda zijn schoon (taak 129).
body heeft er nog 41 per 200 records, maar die gaat door de custom widget
FromHTML en rendert dus goed.
⚠️ Meetles: classificeer op datetime, niet op datum. Op datum alleen gaf
dezelfde meting 30 "bugs" die in werkelijkheid events van vandaag waren die al
begonnen waren — precies wat het >= -2 uur-filter hoort weg te laten.
flutterflow_events — bekend, geen impactNid 214439 ("Brocante Markt Klein Frankrijk") komt 14 keer identiek terug
in flutterflow_events; 214441 en 214420 elk 3x, 214367 2x. Op 2026-09-12
onveranderd (18 overtollige rijen op 2025).
✅ Maar het bereikt de app niet. Nagemeten 2026-09-12:
flutterflowmobiel1 heeft géén duplicaten: services_1/2/3/5/7 geven
allemaal evenveel rijen als unieke nids. Node 214439 komt er zelfs
helemaal niet in voor (zijn categorie "Tweedehands markt" valt onder geen
enkele display — dat is taak 28, niet deze).flutterflow_events wordt door de app alléén per nid bevraagd
(EvenementCall.call(nid: ...), vanuit evenement_component en
event_current). Er wordt nergens een lijst uit opgebouwd: de twee
iteraties in dat component lopen over fotoos en categories binnen één
event, niet over de rijen.Gevolg: geen zichtbare schade, geen haast. Het blijft wel iets om te weten:
bouwt er ooit iemand een lijst op deze view, dan komt zo'n node 14x in beeld.
De oorzaak is het klassieke Views-patroon "een veld met meerdere waarden krijgt
een eigen rij" — kijk op node 214439 welk veld 14 waarden heeft en zet
Multiple field settings → Display all values in the same row aan.