Kaynağa Gözat

TASKS.md: P0-8 afgerond (14/17 velden bevestigd correct via live pair-sessie export-verificatie); 3 bewuste non-blocker-restpunten verplaatst naar nieuwe Minor-sectie (bezorgtijden verkeerd-veld-bug, afhaalopties/bezorgdin nog te bouwen); tikbare-links-verbeterpunt verplaatst naar P1-23

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 1 ay önce
ebeveyn
işleme
a8a76fedf1
1 değiştirilmiş dosya ile 57 ekleme ve 108 silme
  1. 57 108
      TASKS.md

+ 57 - 108
TASKS.md

@@ -390,114 +390,52 @@ Info/Links/Bezorgen-tabs breekt de pagina zichtbaar (RenderFlex-overflow
 + letterlijke "null"-tekst), iets wat met de eerdere lege/placeholder-data
 niet zichtbaar was.)*
 
-**P0-8 · Eigenaar: Bob (het "null"-tekst-restpunt hieronder — Claude
-geblokkeerd, zie de nieuwe blocker-notitie; het RenderFlex-overflow-punt
-was al Bob's/Claude's gedeeld sinds eerder).** Nu P0-7 is opgelost en de horeca-detailpagina
-echte Drupal-data toont, blijken de Info/Links/Bezorgen-tabs zelf **kapot**
-te zijn — bevestigd live 2026-08-13 (Claude, emulator-5554, nid `91142`
-"De Beun", zie screenshots in scratchpad-sessie):
-- **RenderFlex-overflow op alle 3 tabs**, o.a. **"BOTTOM OVERFLOWED BY 209
-  PIXELS"** op de Info-tab — de linkerkolom (logo + adres/plaats/
-  telefoon/email/kvk/cryptocoins) wordt grotendeels **onzichtbaar achter
-  de gele/zwarte dev-overflow-band** geschoven, incl. het echte logo.
-  Root cause (`lib/horecagelegenhedenoverzicht/horecagelegenheid_current/horecagelegenheid_current_widget.dart:511-793`):
-  de Info-tab is een kale `Row` met twee `Column`s (`mainAxisSize.max`,
-  geen `Expanded`/`SingleChildScrollView`) direct in de `TabBarView`'s
-  `Expanded` (regel 507) — zelfde "kale Column/Row zonder scroll-wrapper
-  in een bounded-height ouder"-familie als het al bekende, nog open
-  P1-13 (`MasonryGridView` op `HorecagelegenhedenOverzicht`). Fix:
-  **Wrap Widget → SingleChildScrollView** om de Row (of om de hele
-  `TabBarView`'s children), zelfde patroon dat al elders in het project
-  werkt. **Let op:** probeer niet de Expanded/Shrink-Wrap/Scrollable-
-  toggle-route die bij P1-13 al 2x bevestigd niet doorzet naar de export
-  — ga hier direct voor de SingleChildScrollView-wrap.
-- **Letterlijke `"null"`-tekst op het scherm bij een leeg veld** — erger
-  dan het al bekende P1-6-patroon (dat toont tenminste een neutrale
-  placeholdertekst). Hier ontbreekt zelfs een `valueOrDefault`-fallback:
-  de code doet direct `getJsonField(..., r'''$[:].<veld>''').toString()`,
-  en `.toString()` op een `null`-resultaat geeft de string `"null"` —
-  live bevestigd op de Links-tab (`http://debeun.nl` gevolgd door een
-  losse regel **"null"**, daarna de Facebook-URL, dan weer **"null"**)
-  en op de Bezorgen-tab (**vier keer op rij "null"**, want De Beun heeft
-  geen bezorgopties ingevuld). **17 velden** in dit bestand hebben dit
-  exacte patroon, geen enkel met guard:
-  - Info-tab (regel ~538-687): `adres`, `plaats`, `telefoonnummer`,
-    `email`, `kvk`.
-  - Links-tab (regel ~798-947): `website`, `menukaart`, `facebook`,
-    `twitter`, `instagram`.
-  - Bezorgen-tab (regel ~953-1161): `afhaalopties`, `bestellink`,
-    `bezorgtijden`, `bezorgkosten`, `minimaleorder`,
-    `thuisbezorgtbetaalopties`, `bezorgdin`.
-  - **Fix (builder, per veld, mechanisch herhaalbaar):** zet op elk van
-    deze 17 `Text`-widgets een Visibility-conditie op het **rauwe**
-    API-veld (dezelfde JSON Path als de Text's eigen binding), operator
-    **"Is Set and Not Empty"** — zelfde recept als het
-    `CachedNetworkImage`/P1-15-patroon in `CLAUDE.md`. Zo verdwijnt de
-    hele regel i.p.v. "null" te tonen wanneer een gelegenheid dat veld
-    niet heeft ingevuld (waarschijnlijk de meeste, gezien de huidige
-    schaarse Drupal-content).
-    - **⚠️ Geblokkeerd voor Claude (2026-08-14, nieuw bevestigd
-      patroon): de Visibility → "Conditional"-toggle op deze pagina
-      reageert niet betrouwbaar op browser-automation-klikken.** 7+
-      pogingen op de `Text-adres`-widget (directe klik op de toggle op
-      meerdere x/y-posities, dubbel-toggelen, `left_click_drag` over de
-      track) leverden telkens **geen zichtbare statusverandering** op —
-      en herhaaldelijk **sprong de selectie terug naar de pagina-root**
-      (rechterpaneel toonde dan `Edit Drawer`/Scaffold-properties i.p.v.
-      de Text-widget). Ook de alternatieve route (rechtsklik → **Wrap
-      Widget (Ctrl+B)**) opende het contextmenu zichtbaar correct, maar
-      de vervolgklik op het menu-item landede door dezelfde bekende
-      tree-rij-offset-instabiliteit (zie `CLAUDE.md`) op een andere
-      tree-rij i.p.v. op "Wrap Widget" — offset bleek dit keer +79px op
-      één moment, +64px een moment later, dus niet met een vaste
-      correctie te compenseren zoals de kalibratietruc normaal
-      toestaat. Geen wijziging aangebracht, geen schade. **Dit is een
-      nieuw, apart bevestigd blocker-patroon** (niet identiek aan de
-      al bekende checkbox-clipping-lijst in `CLAUDE.md`) — zie de
-      toegevoegde notitie daar.
-    - **Kant-en-klaar recept voor Bob (seconden per veld in zijn eigen
-      browser, geen uitzoekwerk meer nodig):** open `HorecagelegenheidCurrent`,
-      selecteer per tab de widget in de Widget Tree, rechterpaneel →
-      **Visibility → Conditional aan** → **Add Condition → Single
-      Condition** → First Value = **hetzelfde databron-veld dat al aan
-      de Text gebonden is** (klik het Value-icoontje naast de Text-
-      property om te zien welke bron/veld dat is — voor alle 17 velden
-      hieronder is dat steeds dezelfde API-call-respons, in de code
-      `horecagelegenheidCurrentEstablishmentInfoResponse.jsonBody`, in
-      de builder waarschijnlijk zichtbaar als "Establishment Info
-      Response" o.i.d.) met JSON Path **exact gelijk aan de veldnaam**
-      → Operator **"Is Set and Not Empty"** → Confirm. Exacte
-      JSON-Path-waarde per veld (geverifieerd tegen de huidige
-      broncode, `$[:].` + veldnaam, dus letterlijk overtypen):
-      - Info-tab: `$[:].adres`, `$[:].plaats`, `$[:].telefoonnummer`,
-        `$[:].email`, `$[:].kvk`.
-      - Links-tab: `$[:].website`, `$[:].menukaart`, `$[:].facebook`,
-        `$[:].twitter`, `$[:].instagram`.
-      - Bezorgen-tab: `$[:].afhaalopties`, `$[:].bestellink`,
-        `$[:].bezorgtijden`, `$[:].bezorgkosten`, `$[:].minimaleorder`,
-        `$[:].thuisbezorgtbetaalopties`, `$[:].bezorgdin`.
-      Test na de eerste 2-3 velden even met een verse export/live-check
-      (nid `91142` "De Beun" heeft weinig ingevulde velden, dus een
-      goede test-case) vóór je alle 17 doorloopt.
-  - **Kanttekening:** geen van deze 17 `Text`-widgets heeft een
-    `launchURL`/`InkWell` eromheen in dit bestand (bevestigd, apart van
-    de al bekende P1-15-knoppen elders) — het zijn platte tekstregels,
-    dus geen crash-risico zoals P1-15, puur een zichtbaarheids-/
-    presentatieprobleem. Wel een gemiste kans dat `website`/`facebook`/
-    `bestellink` niet tikbaar zijn — zie het aparte verbeterpunt
-    hieronder.
-  - **Overlap met P1-5:** de 7 Bezorgen-velden bevestigen exact P1-5's
-    aanname (nog geen enkele gelegenheid heeft bruikbare bezorgdata) —
-    dit maakt P1-5's "koppel aan een echt leverbaar-veld" nog relevanter
-    zodra Drupal-kant die data ooit vult.
-- **Los verbeterpunt (geen bug, wel P1-waardig):** `website`, `facebook`,
-  `menukaart` en `bestellink` op deze pagina zijn nu platte tekst i.p.v.
-  tikbare links (in tegenstelling tot het vergelijkbare
-  `evenement_horecagelegenheid_widget.dart`, waar deze velden wél
-  `launchURL`-knoppen zijn, zie P1-15). Zodra de "null"-fix hierboven
-  staat, is dit een logische vervolgstap: dezelfde velden `InkWell` +
-  `launchURL` geven, met dezelfde "Is Set"-guard (voorkomt meteen ook
-  een nieuwe P1-15-achtige crash-bij-lege-URL).
+*(P0-8 grotendeels afgerond 2026-08-14 — live pair-sessie, Bob deed de
+builder-edits, Claude verifieerde elk veld met een verse export (zelfde
+werkwijze als de 2026-08-10-sessie). **Alle 10 Info-tab/Links-tab-velden
+bevestigd correct** (adres, plaats, telefoonnummer, email, kvk, website,
+menukaart, facebook, twitter, instagram — allemaal
+`!= null && != ''`). **Bezorgen-tab:** bestellink/bezorgkosten/
+minimaleorder ook bevestigd correct; thuisbezorgtbetaalopties werkt met
+een net iets andere maar functioneel prima variant ("Is Set" i.p.v.
+"Is Set and Not Empty" — laag risico, blijft zo staan). Onderweg 2x een
+per-ongeluk omgekeerde conditie (`== ''` i.p.v. `!= '' `) gevonden en
+gecorrigeerd op adres/kvk/website — zelfde soort verkeerde-operator-fout
+als hieronder bij Minor-1 blijvend openstaat. **3 restpunten bewust niet
+als launch-blocker behandeld (Bob's beslissing 2026-08-14)** —
+verplaatst naar "Minor — non-blockers" hieronder: bezorgtijden (conditie
+hangt aan het verkeerde veld), afhaalopties + bezorgdin (nog geen
+conditie, wacht op Bob's uitzoekwerk hoe deze twee velden uit de API
+komen). Het losse "tikbare links"-verbeterpunt is verplaatst naar P1-23.
+Uit de P0-lijst verwijderd.)*
+
+## Minor — non-blockers (launch mag hier niet op wachten)
+
+Bob's expliciete categorie (2026-08-14): kleine restpunten uit P0-8 die
+de livegang niet blokkeren, later oppakken.
+
+**Minor-1 · Eigenaar: Bob.** `HorecagelegenheidCurrent`
+(`horecagelegenheid_current_widget.dart`), Bezorgen-tab: de
+Visibility-conditie op de "bezorgtijden"-tekst controleert het
+verkeerde veld. Bevestigd 2026-08-14 via export:
+`if (EstablishmentInfoCall.establishmentOpeningstijden(...) != null && ... != '') Text(..., r'''$[:].bezorgtijden''', ...)`
+— de zichtbaarheid hangt dus af van het **Openingstijden**-veld i.p.v.
+bezorgtijden zelf (waarschijnlijk per ongeluk het verkeerde item
+gekozen uit de velden-lijst, namen lijken op elkaar). Fix: First Value
+van de Single Condition omzetten naar JSON Path `$[:].bezorgtijden`
+(dezelfde bron als de Text's eigen binding), operator blijft "Is Set
+and Not Empty". Geen crash, puur verkeerde zichtbaarheidslogica — Bob
+(2026-08-14): "moet ik later fixen, voor nu blijft er wat staan".
+
+**Minor-2 · Eigenaar: Bob.** `HorecagelegenheidCurrent`
+(`horecagelegenheid_current_widget.dart`), Bezorgen-tab: "afhaalopties"
+en "bezorgdin" hebben nog geen Visibility-conditie (kale
+`Text(getJsonField(..., r'''$[:].afhaalopties/bezorgdin''').toString())`)
+— tonen dus nog een letterlijke "null" bij een leeg veld. Bob moet
+eerst uitzoeken hoe deze twee velden uit de API komen (2026-08-14:
+"moet ik even kijken") voordat de standaard "Is Set and Not
+Empty"-fix (zelfde recept als de overige 15 velden van het
+oorspronkelijke P0-8) toegepast kan worden.
 
 ## Drupal dingen — verzamellijst, batchen bij Bob's eigen Drupal-sessie
 
@@ -548,6 +486,17 @@ toch al wachten op ander Drupal-werk hier verzamelen i.p.v. los oppakken
 
 ## P1 — snel na livegang
 
+**P1-23 · Eigenaar: Bob.** `HorecagelegenheidCurrent`
+(`horecagelegenheid_current_widget.dart`): `website`, `facebook`,
+`menukaart` en `bestellink` zijn platte tekst i.p.v. tikbare links (in
+tegenstelling tot het vergelijkbare `evenement_horecagelegenheid_widget.dart`,
+waar deze velden wél `launchURL`-knoppen zijn, zie P1-15). Nu de
+"null"-tekst-fix van het voormalige P0-8 staat, is dit een logische
+vervolgstap: dezelfde velden `InkWell` + `launchURL` geven, met
+dezelfde "Is Set"-guard (voorkomt meteen ook een nieuwe
+P1-15-achtige crash-bij-lege-URL). Geen van deze 4 `Text`-widgets
+heeft momenteel een `launchURL`/`InkWell` eromheen in dit bestand.
+
 *(P1-18 afgerond 2026-08-10 avond — Bob, builder + Custom Code, in
 twee stappen. Root cause was een dubbele bug: (1) `login_widget.dart`
 behandelde het `drupalLogin`-resultaat als `bool` i.p.v. een JSON-map