# Uitgaanskrant — takenlijst Bijgewerkt: 2026-08-04. Zie `CLAUDE.md` voor werkinstructies/conventies. Elke openstaande taak hieronder is zelfstandig te begrijpen zonder de chat gelezen te hebben waarin hij ontstond. **Formaat van elke taak:** `**P0-1 · Eigenaar: ...**` als eerste regel — een stabiel nummer (verandert niet als andere taken worden afgerond/verwijderd) + wie 'm oppakt. Volgorde binnen elke prioriteit = geschatte ernst/impact, hoogste eerst. **Eigenaar-waarden:** - **Bob** — sneller/simpeler voor hem zelf (meestal builder-UI met een bekend fragiele dialoog, zie `CLAUDE.md`). - **Claude** — zelfstandig/via browser-automation te doen, nog onbeklaimd. - **Claude — bezig (sessie )** / **Bob — bezig** — een sessie/persoon is hier *nu* actief mee bezig. - **Onbepaald** — nog geen eigenaar gekozen. **⚠️ Voorkom dubbel werk:** Bob start elke taak in een nieuwe, aparte chat — er kunnen dus meerdere sessies tegelijk actief zijn op hetzelfde project. **Voordat je een taak oppakt: check of de Eigenaar-regel al "— bezig" zegt.** Zo ja: niet zelfstandig ook gaan zitten werken aan hetzelfde bestand/component — vraag Bob eerst wie 'm afmaakt (dit gebeurde op 2026-08-04: twee sessies pakten onafhankelijk P0-2 op; Bob moest scheidsrechteren). Zet zelf "— bezig" in de Eigenaar-regel zodra je serieus aan een taak begint, en haal het weer weg (of verwijder de taak, zie hieronder) zodra je stopt. **Afronden:** een volledig afgeronde taak wordt **verwijderd** uit deze lijst (niet gearchiveerd). Bij gedeeltelijke voortgang: taak laten staan met bijgewerkte inhoud die alleen het resterende werk beschrijft. ## Status: actief bij Bob (geen Claude-actie nodig, ter info) - **FavorietenAgenda 403-fout** — **Eigenaar: Bob — bezig.** Bob troubleshoot dit zelf. FlutterFlow-requests komen bij nginx binnen met een lege Cookie-header; zijn eigen browser/curl (via dezelfde Cloudflare-edge) sturen de sessie-cookie wél mee. Cloudflare Cache Rule voor `SSESS*` staat al goed (bypass, eerste regel). Werkhypothese: Cloudflare Bot Management behandelt FlutterFlow's server-side traffic anders op basis van IP-reputatie/ TLS-fingerprint. Niet opnieuw diagnosticeren zonder navraag — check eerst of Bob al verder is. ## P0 — blokkeert livegang **P0-1 · Eigenaar: Bob (10 sec klusje) — bevestigd nog open (2026-08-05).** Home-slider crasht (RangeError) bij 0 API-resultaten. Bob koos: bij 0 resultaten component overslaan (niets tonen), geen melding. `CarouselSlider.builder` met `itemCount: 0` crasht. Native fix: `Carousel`-widget (component `HomeUitgaanSliderComponent` → Widget Tree → ConditionalBuilder → If → Container → **Carousel**) → rechterpaneel → **"Empty List Widget"** → vink **"Show Empty List Widget"** aan → **Widget Type** instellen (bv. Image → Asset "logo800px.png", zelfde als het werkende patroon op `HorecagelegenhedenOverzicht`, zie P1-1). **2026-08-05, read-only gecheckt in de builder (Claude, geen klik op de checkbox zelf i.v.m. clipping-risico): "Widget Type" staat nog op "Unset".** Bob dacht dit al ingesteld te hebben ("volgens mij heb ik dat ingesteld, bij geen gegevens dan een plaatje") — dat klopt dus nog niet, of de instelling ging niet door. De checkbox zelf viel niet af te lezen (rechterpaneel- clipping, zie `CLAUDE.md`), maar "Unset" bij Widget Type is op zichzelf al genoeg bewijs dat de configuratie niet compleet is. **Bob: graag opnieuw instellen en dit keer een Widget Type kiezen (niet alleen de checkbox).** **P0-3 · Eigenaar: gesplitst — zie onder.** Hartje-icoon op gemeente. **2026-08-05: hartje-tap-actie (favoriet maken) verplaatst naar P2** (Bob: te veel voor de eerste release, wacht toch op de FavorietenAgenda-403-fix) — voor nu alleen **naam tonen**, geen hartje-functie. Bob akkoord met bouwplan: 1. App State opschonen/uitbreiden: dode dubbele `provincieSelectNaam` verwijderen (nergens gebruikt), `provincieSelectName` hergebruiken, `gemeenteSelectNaam` (bestond al, ook dood) hergebruiken voor gemeente — **inconsistente spelling Name/Naam is bewust geaccepteerd** (hergebruik bestaande var i.p.v. nieuwe duplicaat aanmaken). 2. `SelectStateDropDownComponent`, dropdown-onChanged-acties zetten naast Id ook de Naam (opzoeken in de al-geladen lijst, via `provincieNaamById`/`gemeenteNaamById`). - **Provincie-dropdown: Claude, klaar en bevestigd opgeslagen** (2026-08-05) — Action 3 op `DropDownProvincie` → On Selected zet `provincieSelectName = provincieNaamById(provincielijst, provincieSelectId)`. - **Gemeente-dropdown: Claude, klaar en bevestigd opgeslagen (2026-08-05, na computer-restart).** Op `DropDownGemeente` → Actions → On Selected → Action 1 → Set Fields → veld `gemeenteSelectNaam` = `gemeenteNaamById(gemeentelijst, gemeenteSelectId)`. Eerdere 3x freeze bij het 2e argument bleek inderdaad omgevingsinstabiliteit i.p.v. een harde blocker — na computer-herstart in één poging gelukt. Bevestigd via Issues-paneel: errors 2 → 1. - Component-load default-toewijzing (eerste app-start, id `28666`/`28694`) krijgt **nog geen** bijbehorende naam mee — apart punt, laag risico (viel al terug op lege naam tot iemand handmatig een provincie/gemeente kiest), niet blokkerend voor livegang. 3. **Grotendeels gedaan (2026-08-05, Claude):** `HeaderButtonsComponent` (propageert naar Home, PUitgaanPage, HorecagelegenhedenOverzicht+varianten, HorecagelegenheidCurrent, SelectProvincieGemeente, Login) heeft nu een Text-widget na de twee knoppen met If/Then/Else: toont `gemeenteSelectNaam` als die gezet/niet-leeg is, anders `provincieSelectName`. **Restpunt — Eigenaar: Bob (kleine polish, clipping-blokkade voor Claude):** de Text-widget heeft nog **Expansion: None** (zou **Flexible** moeten zijn) — de rechterpaneel-Expansion-control was niet bereikbaar (zelfde bekende clipping, zie `CLAUDE.md`). Zonder Flexible kan een lange gemeente/provincienaam in combinatie met de twee knoppen een `RenderFlex overflowed`-fout geven op smalle schermen. Component `HeaderButtonsComponent` → Widget Tree → node "Text" (3e kind van de Row, na de twee Tooltips) → rechterpaneel → **Expansion → Flexible**. **Restpunt — Eigenaar: Bob, losse toevoeging aan `EventCurrent`** (heeft geen gedeeld header-component, AppBar → Row met IconButtonBack/IconButtonDrawer). **Claude heeft dit nu in totaal 5x geprobeerd** (2x vóór, 2x ná de computer-restart, en nog 1x na de restart als laatste poging) — steeds bevroren bij het Confirm-en van de If/Then/Else-conditie (soms al bij de binnenste Single-Condition-Confirm), reload verliest de voortgang. In tegenstelling tot de Gemeente-dropdown hierboven (die na de restart wél in één keer lukte) blijft dit specifieke widget/actie-type stabiel blokkerend — **niet meer opnieuw proberen door Claude, definitief bij Bob.** Laatste stand vóór het laatste freeze: IF `gemeenteSelectNaam` Is Set and Not Empty was al succesvol opgebouwd, alleen de outer Confirm-klik faalde. **Exacte stappen (bevestigd werkend patroon van `HeaderButtonsComponent`, hier alleen de laatste Confirm-klik lukt niet):** 1. `EventCurrent` → Widget Tree → `AppBar` → `Row` (kind van AppBar, bevat al IconButtonBack + IconButtonDrawer) → rechterpaneel insert-icoon → **Text** toevoegen als 3e kind. 2. Nieuwe Text-widget → **Text**-property → bind-icoontje → **Conditional Value (If/Then/Else)** (evt. eerst zoeken op "conditional" als 'ie niet direct in de lijst staat). 3. **IF**: Single Condition → First Value = App State `gemeenteSelectNaam` → operator **Is Set and Not Empty** (geen Second Value nodig). 4. **THEN**: App State `gemeenteSelectNaam`. 5. **ELSE**: App State `provincieSelectName`. 6. Confirm. Optioneel: Expansion → Flexible (zelfde clipping-risico als bij `HeaderButtonsComponent`, zie daarboven). 4. Hartje-tap-actie (favoriete plaats) als losse taak vastgelegd — zie **P2-8**. - Blocker die dit voorstel moet oplossen: **geen enkele pagina toont de geselecteerde gemeente-náám als tekst** — alleen het numerieke ID (`FFAppState().gemeenteSelectId`) wordt doorgegeven als filter (bv. `plaats`/`townid` param op `PUitgaanPageWidget`). `GemeentenCall. gemeenteName()` in `lib/backend/api_requests/api_calls.dart` bestaat al maar is ongebruikt. - Bekende valkuil als dit gebouwd wordt: bind de naam niet live via een `List`-typed lookup function-argument (bv. `provincieNaamById`/`gemeenteNaamById` in `lib/flutter_flow/custom_functions.dart`, al gebouwd, compileert, nog niet gekoppeld) — dat argument-bindingsdialoog loopt vast op de geneste Set Variable-bug (zie `CLAUDE.md`). Simpeler: naam vastleggen in een plain String App State-variabele op moment van selectie i.p.v. 'm live op te zoeken. **P0-4 · Eigenaar: Bob.** Werkende login + favorieten — resterende deeltjes. Basis is af: login gekoppeld, wachtwoord-vergeten-flow, favorieten drawer-link + 3-tabblad-pagina, hartje op horeca-kaart + -detailpagina. Nog open: - Lege-lijst empty-state op de favorietenpagina (nu kale/lege Container als er nog geen favorieten zijn). `lib/favorieten/favorieten_widget.dart`. - Bevestigen dat favorieten écht syncen via Drupal bij inloggen — hangt af van FavorietenAgenda-403 hierboven. **P0-5 · Eigenaar: Bob.** Drupal: anonieme leestoegang onderzoeken voor browse-endpoints. Drupal-niveau, geen Claude-taak. ## P1 — snel na livegang **P1-1 · Eigenaar: Bob (mechanisch, ~10 sec per stuk) — audit compleet, wachtend op Bob.** Loading/foutafhandeling-patroon uitrollen naar overige lijst-/detailpagina's. Referentiepatroon bevestigd (2026-08-04, builder): rechterpaneel → **"Empty List Widget"** → **"Show Empty List Widget"** aan → **Widget Type: Image → Asset "logo800px.png"**. **Op `HorecagelegenhedenOverzicht` zelf al op alle 5 tabs aanwezig** (geverifieerd via verse export 2026-08-04/05). **2026-08-05: volledige audit afgerond (Claude) van resterende Carousel-widgets zonder deze fix — allemaal read-only bevestigd "Widget Type: Unset"/leeg:** 1. `HomeUitgaanSliderComponent` → Carousel (= P0-1, zie daar) 2. `PUitgaanSliderComponent` → Carousel — **ontbreekt zelfs de `ConditionalBuilder`-wrapper om de Carousel** (i.t.t. de andere 3), dus mogelijk P0-ernstig: dezelfde itemCount:0-RangeError-crash als P0-1 kan hier nog optreden zonder enige vangnet. 3. `EvenementComponent` → Carousel (foto-carousel van één evenement) 4. `horecagelegenheidCurrent` → Carousel (foto-carousel van één horecagelegenheid) - **Waarom bij Bob i.p.v. Claude:** de "Show Empty List Widget"- checkbox is **structureel onbereikbaar via Claude's browser-automation-viewport** (bevestigd op alle 4 hierboven, zie `CLAUDE.md` bekende problemen) — geen per-component toeval, dus verder proberen door Claude heeft geen zin. Bob: dezelfde twee klikken (checkbox aan + Widget Type instellen) 4x herhalen op bovenstaand lijstje, kost in eigen browser seconden per stuk. **P1-3 · Eigenaar: Bob — geblokkeerd op rechterpaneel-clipping.** Sliderkaartje: datumregel mist de Flexible-wrap. Bevestigd nog open (2026-08-04: regels 310/351 in `p_uitgaan_slider_kaart_component_widget.dart` hebben `Flexible` om de Text, regel 273-281 niet). **Fix zit in builder:** component `PUitgaanSliderKaartComponent` → Widget Tree → node **"Text-datum"** (Text-widget, kind van de Row met `Icons.calendar_month`, tussen "Text-title" en de horecagelegenheid-Row) → rechterpaneel → property **"Expansion"** → moet net als bij "Text-horecagelegenheid"/"Text-adres" op **Flexible** gezet worden i.p.v. None. **Geblokkeerd:** de 3 Expansion-type-iconen (None/Expanded/Flexible) renderen net buiten het zichtbare/klikbare canvas rechts van het "Flex"-invoerveld — bekend rechterpaneel-clippingprobleem (zie `CLAUDE.md`). Geprobeerd: directe klik op geschatte positie, paneel-scroll, paneel-drag-resize, "Wrap Widget"-dialoog (geen Flexible-optie daarin, alleen structurele widgets) — geen succes. Kost Bob vermoedelijk seconden op zijn eigen scherm. **P1-4 · Eigenaar: Bob.** EstablishmentsCall crasht zonder categoriefilter. `horcat ??= null!;` — bevestigd nog aanwezig, regel 1443. Nu geen probleem omdat elke aanroep toevallig altijd een filter meegeeft, wel een landmijn voor de toekomst. `lib/backend/api_requests/api_calls.dart`. Fix zit vermoedelijk in de FlutterFlow API-call-configuratie (default parameterwaarde), niet in lokale code. **P1-5 · Eigenaar: Bob.** "Thuis bezorgen" koppelen aan een echt leverbaar-veld per horecagelegenheid. Wacht op Bob: eerst het API-endpoint aan Drupal-kant configureren. Daarna tonen/verbergen op basis van het echte veld i.p.v. de huidige dode tap. **P1-6 · Eigenaar: Bob (mechanisch, maar groot — spreid over sessies).** Letterlijke veldnaam i.p.v. nette placeholder bij ontbrekende data. **2026-08-05: audit herhaald (Claude, verse grep) — scope flink groter dan de eerdere 13 treffers van 2026-08-04, met name `evenement_horecagelegenheid_widget.dart` bleek nog niet meegenomen.** Patroon overal hetzelfde: `valueOrDefault(, '')` waarbij de default gelijk is aan de veld-/functienaam. Fix is mechanisch (Default Value-tekst aanpassen in de builder op het Text-widget), maar raakt dezelfde "Set from Variable"-property als de Empty-URL-fix — zelfde risico-inschatting als het CachedNetworkImage-patroon. **Niet in één sessie proberen af te maken** gezien de omvang hieronder (~45 treffers); pak het file-voor-file op. - `horecagelegenheidoverzicht_kaart_widget.dart:359/383/410` — titel/adres/plaats - `evenement_info_widget.dart:136/158/213/238/293` — adres/plaats/entreeprijs/entreetoelichting/contact - `evenement_component_widget.dart:221/242/317/339` — title/eventDate/adres/plaats (317/339 zijn **nieuw t.o.v. de 2026-08-04-audit**, waren toen nog niet aanwezig of gemist) - `horecagelegenheid_current_widget.dart:377/500/747` — title/logo/content (**volledig nieuw gevonden, stond niet in de vorige audit**) - `event_current_widget.dart:327/418/442` — title/nid/date (327 en 442 zijn **nieuw t.o.v. de 2026-08-04-audit**, alleen nid stond er al in) - `evenement_horecagelegenheid_widget.dart` — **grootste blok, ~30 treffers, volledig nieuw t.o.v. de vorige audit** (waarschijnlijk pas zichtbaar geworden na de P1-image-crash-fix-uitbreiding van dit component): regels 178(HorecaNaam), 418(establishmentnid), 445(email), 476(Logo), 499(Plaats), 533(Adres), 577/586/597 (Telefoon, 3x — icoon/tekst/tooltip-varianten), 642(menukaart), 710(entreeprijs), 743(EntreeToelichting), 818/827/843(facebook, 3x), 885/894/910(instagram, 3x), 952/961(twitter, 2x), 1016/1025/1041(Website, 3x), 1083/1092/1108(urluk, 3x), 1194(Openingstijden), 1222(OpeningstijdenUitzondering), 1310(Bezorgtijden), 1337(bezorgkosten), 1364(bestellink). - Grensgeval (geen letterlijke veldnaam maar wel technische/zinloze placeholder, zelfde fix-aanpak): `p_uitgaan_slider_kaart_component_widget.dart:284` toont `'def'` als datum ontbreekt. - Niet-verdachte gevallen bewust genegeerd (echte inhoudelijke fallback, geen technische naam): `'Evenement'` (`kaart_tabel_uitgaan_comp_widget.dart:216`, `kaart_tabel_uitgaan_s_comp_widget.dart:123`) en `'Uitgaan'` (`tag_categorie_component_widget.dart:113`). **P1-7 · Eigenaar: Bob.** Account/profielscherm (wachtwoord wijzigen, uitloggen, account verwijderen). Bovenop de login/favorieten-P0-basis. Account verwijderen heeft mogelijk AVG-implicaties aan Drupal-kant. **P1-8 · Eigenaar: Onbepaald (2 losse restpunten, zie onder).** Toegankelijkheid & navigatie, restpunten: - Login-pagina: 2 icon-only knoppen zonder tooltip (veld wissen + wachtwoord tonen/verbergen) — `login_widget.dart` (suffixIcon van een `TextFormField` — standaard Tooltip-wrap werkt daar niet op, zie `CLAUDE.md`; bevestigd nog open, geen fix geprobeerd — vraagt een andere aanpak dan Wrap Widget, bv. het hele veld i.p.v. alleen het icoon wrappen). - ~~Overige icon-only knoppen buiten de header van tooltip voorzien~~ — **gecheckt 2026-08-04: al gedekt.** Hartje op kaarten en drawer-menu-items hebben al `AlignedTooltip`. De per-pagina AppBar-knoppen (hamburger/terug) zijn qua functie ook "header", zowel via de gedeelde `HeaderButtonsComponent` (heeft al tooltips) als de losstaande inline kopieën op sommige pagina's (bv. `home_widget.dart`, `event_current_widget.dart`) — buiten scope van dit punt. - ~~Bevestig-stap toevoegen aan de provincie/gemeente-kiezer~~ — **gedaan 2026-08-04.** `SelectStateDropDownComponent` → Column onder de twee dropdowns → nieuwe **Button "Toepassen"** → actie **Navigate To → home**. Relevant: dit scherm is niet alleen via het drawer-menu bereikbaar, het is ook het **allereerste scherm na inloggen** (`nav.dart:117/124`) — stond zonder deze knop zonder duidelijke vervolgstap. "Replace Route"-toggle (voorkomt dat Home bovenop dit scherm gestapeld wordt i.p.v. het te vervangen) kon niet aangezet worden door rechterpaneel-clipping — functioneel geen probleem (back-knop vanaf Home gaat dan terug naar dit scherm i.p.v. waar de gebruiker vandaan kwam), maar Bob kan 'm zelf aanzetten: component `SelectStateDropDownComponent` → Button "Toepassen" → Actions → "Navigate To home" → **Replace Route** aanvinken. - ~~Vaste "terug naar hoofdlijst"-snelkoppeling op detailpagina's~~ — **`HorecagelegenheidCurrent` gedaan 2026-08-04.** Nieuwe Button "Alle horecagelegenheden" onderaan de pagina-Column (na `TabBar`) → actie **Navigate To → HorecagelegenhedenOverzicht**, parameter `plaats` = App State `gemeenteSelectId`. Plek is bewust onderaan i.p.v. in de AppBar: het invoegen van een widget in de AppBar-Row (naast `HeaderButtonsComponent`) faalde herhaaldelijk stil (geen foutmelding, gewoon geen insertie) — zowel via de kleine inline widget-picker als via de grote centrale "Insert"-modal; de kleine inline-picker op een gewone body-`Column` werkte wel meteen. Builder-observatie, geen bevestigde bug — als Bob de knop liever in de AppBar wil, eerst dat invoegen zelf proberen. ~~`EventCurrent`~~ — **gedaan 2026-08-05 (Claude).** Nieuwe Button "Alle evenementen" onderaan de body-Column (na `EvenementHorecagelegenheid` component) → **Navigate To → PUitgaanPage**, parameter `plaats` = App State `gemeenteSelectId`, parameter `services` = `services_1` (letterlijke tekst — zelfde conventie als de algemene "Uitgaan"-link op de loginpagina, `login_widget.dart:694`, voor "geen categoriefilter"; `services` is verplicht — `PUitgaanPageWidget` gebruikt `widget!.services!` met force-unwrap, dus oningevuld laten had een null-crash gegeven). Bevestigd opgeslagen ("Synced"). Insert-widget-dialoog werkte hier via de kleine inline widget-picker op de Widget Tree-rij (rechtsklik component → "Insert Widget", of het "+"-icoon naast een tree-node) i.p.v. de grote centrale "Insert"-modal (die opende wel maar liet geen klik op een widget-kaart doorkomen) — zelfde inline-picker-voorkeur als hierboven bij `HorecagelegenheidCurrent` genoteerd. - Deep-link/query-param robuustheid checken (ongeldig/verlopen `nid`) — **grotendeels gecheckt 2026-08-04, code-niveau, geruststellend.** `HorecagelegenheidCurrentWidget` en `EventCurrentWidget` gebruiken consequent `?.toList() ?? []` en `valueOrDefault<...>` rond `jsonBody`-velden (i.t.t. de `HorecagelegenhedenOverzicht`-lijstpagina's die wél crashten, zie P1-1) — bij een ongeldige/lege `nid` toont dit fallback-tekst (`'title'`, `'logo'`, letterlijke veldnaam — het bekende P1-6-patroon) i.p.v. een crash. `EventCurrent` heeft zelfs al een correcte `if (getJsonField(...) != null)`-guard vóór een `CachedNetworkImage` (regel 621-626) — het juiste patroon uit `CLAUDE.md`. **Niet getest:** het live gedrag in de emulator/app zelf (alleen code gelezen, geen `flutter run` gedaan) — als iemand dit ooit live wil verifiëren, `horecagelegenheidCurrent`/`eventCurrent` openen met een bewust niet-bestaand `nid` in de deep-link. **P1-9 · Eigenaar: Onbepaald.** Visuele polish (los, per pagina): Uitgaan-pagina (typografie/contrast/spacing), Event-pagina, HorecagelegenhedenOverzicht, tabel-kaartje-afstemming met slider-kaartje, categorie-tag mag titel/datum niet overstemmen. **P1-10 · Eigenaar: Onbepaald.** Performance. **2026-08-05: audit afgerond (Claude, code-niveau), concrete bevindingen:** 1. **Eager-TabBarView bevestigd op 4 pagina's, niet alleen de 3 al genoemde:** Flutter's `TabBarView` bouwt altijd alle tabs meteen (geen lazy-tabs), dus bij page-load vuren alle tabs hun eigen `FutureBuilder`-API-call tegelijk af, ook de 5-6 tabs die de gebruiker nog niet ziet: - `horecagelegenheden_overzicht_widget.dart`: 6 tabs, elk `EstablishmentsCall.call(horcat: '', ...)` met een eigen categorie-id (17969/17963/34/17965/17967/17968 — echt verschillende calls, geen letterlijke duplicaten). - `horecagelegenheden_overzicht_sort_page_widget.dart`: 7 tabs, zelfde patroon. - `horecagelegenheden_overzicht_page_data_type_widget.dart`: 6 tabs, zelfde patroon. - **Nieuw gevonden, stond nog niet in de vorige documentatie:** `home_widget.dart` heeft hetzelfde patroon — 6 tabs, elk met een eigen `HomeUitgaantabelKaartComponentWidget` → eigen `HomeTabelCall`-aanroep, dus ook hier 6 gelijktijdige requests bij het openen van Home (plus 1 losse `HomeUitgaanSliderComponent` bovenaan, buiten de tabs, geen probleem). 2. **`EstablishmentsCall` heeft al `cache: true`** (`api_calls.dart:1458`) en `ApiCallOptions extends Equatable` met `params`/`headers` in de `props`-lijst (`api_manager.dart:124-138`) — caching werkt dus functioneel correct op basis van echte parameterwaarden (geen reference-equality-bug). Dit voorkomt herhaalde netwerkcalls bij een **rebuild** van dezelfde tab (bv. na een `setState` elders op de pagina), maar lost de **initiële burst** van 6-7 gelijktijdige calls bij eerste page-load niet op — caching helpt pas ná de eerste keer. 3. **Nieuwe bevinding: `HomeTabelCall` heeft `cache: false`** (`api_calls.dart:465`) — in tegenstelling tot de Establishments- pagina's vuurt Home dus bij *elke* rebuild opnieuw alle 6 tab-requests af, niet alleen bij de eerste page-load. Fix: `cache: true` zetten in de FlutterFlow API-call-config (Response & Test-tabblad) — geen codewijziging nodig, low-risk (resultaten zijn read-only lijstdata, geen sessie-afhankelijke content). 4. **Nieuwe bevinding: `GemeentenCall`/`ProvinciesCall` hebben `cache: false`** (`api_calls.dart:1274/1306`), aangeroepen vanuit `select_state_drop_down_component_widget.dart`. Dit scherm is het verplichte eerste scherm na inloggen (`nav.dart:117/124`) én apart bereikbaar via het drawer-menu (2x, zie het "dubbele blok"-punt bij P2-7) — elke keer dat het scherm opent, worden beide provincie/gemeente-lijsten opnieuw over het netwerk opgehaald, terwijl deze data binnen een sessie feitelijk statisch is. Zelfde low-risk fix: `cache: true` in de builder, geen codewijziging. 5. **Bijvangst, geen performance-impact maar wel opschoon-kandidaat:** `EstablishmentsNewCall` (`api_calls.dart:845`, `cache: false`) wordt nergens meer aangeroepen — dode API-call-definitie, toevoegen aan de P2-7-opschoonlijst. - **Niet opgelost, apart punt voor Bob om te beoordelen:** de eager-TabBarView-burst zelf (punt 1) is in de FlutterFlow-builder-UI niet direct te fixen — `cache: true` helpt alleen bij herhaling, niet bij de eerste gelijktijdige burst. Echte fix vraagt lazy tab-content (bv. een `IndexedStack` met on-demand `FutureBuilder` per tab- activatie i.p.v. `TabBarView`), wat een structurele herbouw is — vermoedelijk custom code nodig, buiten scope van deze audit. Geen bekend rate-limit-probleem op de Drupal-API, dus mogelijk lage prioriteit ondanks de N×-overhead. **P1-11 · Eigenaar: Onbepaald.** Responsive/screensize. **2026-08-05: venue-event-grid-bug uitgezocht (Claude, code-niveau) — root cause gevonden, mechanische builder-fix, nog niet uitgevoerd:** - Component: `HorecagelegenheidEventTabelComponentCopy` (`lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy/...widget.dart`), gebruikt op de "Events"-tab van `HorecagelegenheidCurrent` (enige gebruiksplek — geen niet-"_copy"-variant meer aanwezig om simpel in te wisselen). - `GridView` (regel 165-172): `crossAxisCount: 2`, `childAspectRatio: 3.0` → elke grid-cel wordt ≈ (schermbreedte/2) breed × (celbreedte/3) hoog — op een telefoon van 390px breed dus ≈190×63px per cel. - Binnen elke cel (regel 178-315): een `Row` met twee `Container`s die **beide hardcoded `width: 200.0, height: 200.0`** hebben (tekst-tegel regel 186-187, afbeeldings-tegel regel 294-295/311-312 incl. de `CachedNetworkImage` zelf). De tekst-Container zit wel in `Expanded` (dus de breedte krimpt mee), maar **de hoogte (200) niet** — `Expanded` in een `Row` regelt alleen de hoofdas (breedte), niet de dwarsas (hoogte). De afbeeldings-Container zit zelfs helemaal niet in `Expanded` — noch breedte noch hoogte passen zich aan. - Gevolg: content wil 200px hoog zijn in een cel van ≈63px hoog, en de afbeeldings-tegel wil alléén al 200px breed zijn terwijl de hele cel maar ≈190px breed is (gedeeld met de tekst-tegel ernaast) — `RenderFlex overflowed`-fouten/afgeknipte layout op de Events-tab van elke horecagelegenheid-detailpagina. - **Voorgestelde fix (mechanisch, builder-property-wijzigingen, geen nieuwe widgets nodig):** in de builder op `HorecagelegenheidEventTabelComponentCopy` → Widget Tree → de twee Containers binnen de Row (tekst- en afbeeldings-tegel): (1) hoogte 200 vervangen door een responsieve waarde (bv. Expanded ook op de dwarsas laten werken via een buitenste `AspectRatio`, of de vaste `height: 200` gewoon verwijderen en de Row's hoogte laten bepalen door `childAspectRatio`), (2) de afbeeldings-Container ook in `Expanded` wrappen zodat beide tegels de celbreedte delen i.p.v. allebei 200px te claimen. Niet zelf uitgevoerd in deze sessie (audit- taak, wijziging raakt geneste Row/Container/Expanded-structuur — kost focus in de builder om zonder bijwerkingen te doen). ## P2 — features & concept, na livegang **P2-1 · Eigenaar: Bob — testen in de API, komt terug.** Datum-filter: Vandaag / Dit weekend / Deze week. **P2-2 · Eigenaar: Onbepaald.** Google Maps-weergave van horecagelegenheden — bewust niet vóór livegang (Maps API-key + billing, onduidelijk of elke locatie al lat/long heeft, marker-UI — geen quick win). **P2-3 · Eigenaar: Onbepaald.** "In de buurt"/geolocatie-browsen — aanvulling op het provincie/gemeente-model, geen vervanging. **P2-4 · Eigenaar: Onbepaald.** Overige feature-ideeën, geen van alle uitgewerkt: "Wat is er vanavond"-melding/widget · deel-knop op eventpagina · "toevoegen aan agenda" (native kalender) · "events op deze locatie" prominenter op de horeca-detailpagina · reviews/ waardering voor horecagelegenheden (groot, vraagt nieuw Drupal content-type + moderatie, eigen project). **P2-5 · Eigenaar: Onbepaald.** Ad-banners op horeca-overzicht, horeca-detail, event-detail; vaste regel: geen ads op locatie-kiezer/login/account. **P2-6 · Eigenaar: Onbepaald.** Tekstzoeken op titel op de horeca-overzichtspagina (los van de Datatype/Sort-experimenten die Bob daar zelf op test — die zijn actief werk-in-uitvoering, geen dode code). **P2-7 · Eigenaar: Bob.** Opschonen: - Merge `kaartTabelUitgaanComp` + `kaartTabelUitgaanSComp` — Bob doet dit zelf ("ik kijk er zelf naar"). - `lib/kanweg` opnieuw leegmaken indien teruggekomen na een latere export-pull, plus eventuele nieuwe losse dode componenten in `lib/evenement/`. - Eén browse-by-category-patroon i.p.v. twee: nu Home landelijk is, bepalen hoe Home's categorieën en `PUitgaanPage`'s provincie/ gemeente-gescoopte categorieën zich tot elkaar verhouden. - Dubbele Provincie/Gemeente-blok in het menu opruimen (12 menu-items waar 6 zouden volstaan). - `EventWidget`-route: heraansluiten of definitief schrappen (losse orphan-route). - `EstablishmentsNewCall` (`lib/backend/api_requests/api_calls.dart:845`) wordt nergens meer aangeroepen — dode API-call-definitie (gevonden bij de P1-10-performance-audit 2026-08-05). **P2-8 · Eigenaar: Onbepaald.** Hartje-tap-actie op de getoonde gemeente-/provincienaam (favoriete plaats maken/markeren) — losgemaakt van P0-3 (2026-08-05, Bob: te veel voor de eerste release). Naam wordt inmiddels al getoond op de meeste pagina's via `HeaderButtonsComponent` (zie P0-3); dit punt is puur de hartje-tap-functionaliteit erbovenop. Hangt af van de `FavorietenAgenda`-403-fix (zie "Status: actief bij Bob" bovenaan dit bestand) — niet oppakken vóórdat die opgelost is.