Ver Fonte

TASKS.md: P2-6 uitgewerkt (naam-zoekveld per tab horeca-overzicht) + nieuwe P2-14 (Google Maps-deep-link-component per adres)

- P2-6: Bob's besluit vastgelegd (tekstveld op naam, client-side
  filter via nieuwe Custom Function, diacritics-genormaliseerd),
  wacht op groen licht omdat Bob actief op dezelfde pagina bezig is
- P2-14 (nieuw): herbruikbare GoogleMapsIconButton-component,
  Universal-URL-deep-link (geen API-key/billing nodig), voor
  horecagelegenheid/event/stadsactiviteit-detailpagina's
- P2-2 verduidelijkt: blijft bewust v2 (kaart-overzicht), niet te
  verwarren met P2-14's losse adres-icoontje

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob há 3 semanas atrás
pai
commit
185d188344
1 ficheiros alterados com 77 adições e 8 exclusões
  1. 77 8
      TASKS.md

+ 77 - 8
TASKS.md

@@ -1985,10 +1985,13 @@ in Drupal, geen uitputtende audit.
 **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-2 · Eigenaar: Onbepaald, bewust v2 (herbevestigd 2026-08-25 door
+Bob).** Google Maps-**overzichtsweergave** (kaart met meerdere markers)
+van horecagelegenheden op de overzichtspagina — bewust niet vóór
+livegang (Maps API-key + billing, onduidelijk of elke locatie al
+lat/long heeft, marker-UI — geen quick win). **Niet te verwarren met
+P2-14** (los Google Maps-deep-link-icoontje per adres, geen kaart/API-
+key nodig — dat pakken we wél nu op).
 
 **P2-3 · Eigenaar: Onbepaald.** "In de buurt"/geolocatie-browsen —
 aanvulling op het provincie/gemeente-model, geen vervanging.
@@ -2078,10 +2081,76 @@ overgeslagen, Bob's eigen Sort/Datatype-experiment op die pagina loopt
 nog (zie P2-6); oppakken zodra dat is afgerond, zelfde recept
 (kopieer de AdBanner-node vanaf een van de 3 al werkende pagina's).
 
-**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-6 · Eigenaar: Claude, wacht op groen licht van Bob (actief bezig
+op dezelfde pagina).** Tekstzoeken op naam, per tab van
+`horecagelegenheden_overzicht_widget.dart`/`..._provincie_page_widget.dart`
+(Bob's besluit 2026-08-25: "op naam kunnen selecteren, tekstveld voor
+overeenkomstige namen", nodig op elke tab). **Bouwplan (client-side
+filter, geen nieuwe Drupal-parameter nodig — de volledige lijst is al
+lokaal na de bestaande API-call):**
+1. Eén `TextField` boven de `TabBar` (filtert altijd de op dat moment
+   actieve tab, geen los veld per tab nodig — simpeler, en de
+   tabs delen toch hetzelfde zoekpatroon). Component/Page State
+   `zoekterm` (String), gebonden via `onChanged`.
+2. Nieuwe **Custom Function** `filterOpNaam(List<dynamic> items, String
+   query, String titelPad) -> List<dynamic>`: itereert `items`, haalt
+   per item `getJsonField(item, titelPad)` op, vergelijkt
+   case-insensitive én **diacritics-genormaliseerd** (bv. "café" moet
+   ook matchen op "cafe" — anders mist een zoekopdracht zonder accent
+   alsnog het juiste resultaat, veelvoorkomend bij horeca-namen).
+   Lege `query` → hele lijst ongewijzigd terug (geen filter-overhead
+   bij het openen van een tab).
+3. Elke tab's `Generate Dynamic Children`-"Value"-binding (nu
+   waarschijnlijk direct de rauwe API-response) wijzigen naar
+   `filterOpNaam(<rauwe lijst>, zoekterm, '$.titel')` (titel-JSON-path
+   per tab kan verschillen, per tab losstaand controleren).
+**Advies/aandachtspunten:**
+- Client-side filteren i.p.v. een nieuwe Drupal-endpoint-parameter: de
+  lijsten per tab zijn klein genoeg (geen paginering gezien in de
+  bestaande calls) — dus geen performance-reden om dit server-side te
+  doen, en dit blijft zo werkend ongeacht wat Bob's Sort/Datatype-
+  experiment uiteindelijk oplevert (orthogonale features, wel dezelfde
+  pagina — vandaar "wacht op groen licht" i.p.v. blind starten terwijl
+  Bob er middenin zit).
+- Debounce is hier niet nodig (puur client-side lijst-filter op een al
+  geladen array, geen API-call per toetsaanslag) — direct live filteren
+  op elke `onChanged` kan gewoon.
+- Style-tip: een "wis"-kruisje (`suffixIcon`) in het zoekveld is fijn
+  UX, maar val niet in de bekende `TextFormField`-`suffixIcon`-
+  Tooltip-beperking uit `CLAUDE.md` (geen Tooltip nodig op zo'n icoon,
+  gewoon een losse `onTap` die `zoekterm` leegt).
+
+**P2-14 · Eigenaar: Claude (nieuw, 2026-08-25, Bob's idee).**
+Google Maps-icoon achter elk adres — bij horecagelegenheid-,
+stadsactiviteit- en uitgaansevenement-detailpagina's, tikken opent
+Google Maps (native app indien geïnstalleerd, anders browser) met
+het adres + plaats voorgevuld. Bob's eigen suggestie: als **losse
+herbruikbare Project Component** bouwen, niet per pagina dupliceren.
+**Bouwplan — geen Google Maps API-key/billing nodig** (dat is alleen
+voor een ingesloten kaart-weergave zoals P2-2, niet voor een simpele
+deep-link):
+1. Nieuwe **Custom Function** `googleMapsUrl(String adres, String
+   plaats) -> String`, bouwt
+   `https://www.google.com/maps/search/?api=1&query=' +
+   Uri.encodeComponent('$adres, $plaats')` — dit is Google's
+   "Universal URL"-formaat: opent de native app op iOS/Android als die
+   geïnstalleerd is, valt anders terug op de browser-versie, werkt
+   zonder eigen API-key.
+2. Nieuwe **Project Component** `GoogleMapsIconButton` met twee String-
+   parameters (`adres`, `plaats`): een `Icon` (bv.
+   `Icons.location_on_outlined` of `Icons.map_outlined`) → On Tap →
+   **Launch URL** (categorie "Share", zie `CLAUDE.md`) → Value via Set
+   from Variable → Custom Functions → `googleMapsUrl` met beide
+   parameters gebonden.
+3. Component invoegen naast/achter het bestaande adres-`Text`-widget
+   op `horecagelegenheid_current_widget.dart` en `event_current_widget.dart`
+   (dekt uitgaansevenement; bevestig tijdens de bouw of stadsactiviteit
+   dezelfde detailpagina deelt met event of een eigen widget heeft —
+   nog niet met zekerheid vastgesteld welke pagina "stadsactiviteit"
+   toont).
+Nog te doen vóór bouwen: Bob geeft akkoord om te starten (zie vraag in
+de chat) — dit is nieuw, nog niet eerder besproken/gepland werk, geen
+losstaande blocker verder.
 
 **P2-7 · Eigenaar: Bob.** Opschonen:
 - Merge `kaartTabelUitgaanComp` + `kaartTabelUitgaanSComp` — Bob doet