Forráskód Böngészése

TASKS.md: P1-26 nieuw (Drupal favorieten flag/unflag/is_flagged custom module, node+taxonomy_term) + open categorie-array-fix op Favorieten Tab 1 gedocumenteerd

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 3 hete
szülő
commit
5c1108a10d
1 módosított fájl, 121 hozzáadás és 1 törlés
  1. 121 1
      TASKS.md

+ 121 - 1
TASKS.md

@@ -1074,7 +1074,13 @@ lokale/UI-kant + look&feel oppakken zolang die niet op Drupal wacht.
   "Synced". Verifiëren met een verse export +
   `grep -n "drupalRequest(" lib/favorieten/favorieten_widget.dart` (beide
   treffers moeten `'GET'` tonen).
-- **Tab 2 "Favoriete gemeenten" vullen** — geen Drupal-blocker bekend:
+- **Tab 2 "Favoriete gemeenten" vullen** — **zie nu P1-26 hieronder**:
+  de ontbrekende taxonomy-term-favoriet-toggle (het structurele
+  probleem hieronder) krijgt daar een server-side oplossing
+  (Drupal Services `favorieten`-resource met `flag`/`unflag` op
+  `entity_type=taxonomy_term`). Rest van deze analyse blijft geldig
+  voor de FlutterFlow-kant zodra P1-26 werkt. Geen Drupal-blocker meer
+  bekend zodra P1-26 is afgerond:
   `gemeenteNaamById` (custom function) + `favorieteGemeenteIds` kunnen in
   principe al een lijst van gemeentenamen tonen, zodra er ooit iets in
   die lijst staat. **Uitgezocht (2026-08-13, Claude, code-audit): er
@@ -1188,6 +1194,31 @@ app zelf — twee losse client-side bugs bleken de resterende oorzaak:
 Lokale repo bijgewerkt via een verse `flutterflow export-code` in de
 projectmap + `flutter analyze` (geen nieuwe errors, alleen de
 gebruikelijke gegenereerde info/warnings).)*
+
+**Nog open (2026-08-20, na de `inhoud`-fix, live gevonden op
+emulator-5556):** vervolg-crash op Tab 1 — `NoSuchMethodError: Class
+'String' has no instance method 'toList'. Receiver: "Live/Concert"`.
+Oorzaak: `UitgaantabelKaartWidget` verwacht `categorie` als JSON-array
+(`widget!.categorie?.toList()`,
+`lib/uitgaanspaginas/uitgaantabel_kaart/uitgaantabel_kaart_widget.dart:219`
+— zelfde patroon als de al-werkende endpoints, zie `homeCategorie()` in
+`api_calls.dart:190-197`), maar `favorieten_agenda.json` levert
+`categorie` momenteel als kale string (`"Live/Concert"`, `cat.delta = 0`
+pakt maar 1 categorie). **SQL+PHP-patch gegeven aan Bob** (chat,
+2026-08-20) voor `custom.favorites_agenda.inc`: per branch (go_out_event
++ activity) een scalar subquery die alle gekoppelde categorieën als
+`<category>Naam</category>`-string aggregeert (`GROUP_CONCAT`, geen
+`delta`-restrictie meer), buiten-query geeft die string door als
+`category`, en `custom_favorites_agenda_data()` parseert 'm met de
+bestaande `_custom_parse_categories_to_array()`-helper (al elders in
+`custom.module` gebruikt) tot een echte array. Ook
+`_custom_favorites_agenda_block_content()` aangepast
+(`check_plain(implode(', ', $item['categorie']))` i.p.v. direct op de
+array). **Status: patch gegeven, nog niet bevestigd toegepast/getest
+door Bob** — verifiëren met curl (`categorie` moet een JSON-array
+teruggeven) en daarna een live app-rebuild vóórdat dit als afgerond
+geldt.
+
 *(Anonieme API-call-bug op Tab 3 afgerond 2026-08-19 — Claude, builder
 + verse-export-verificatie: `FavorietenAgendaCall`'s Backend Query op de
 ListView had geen `sessionName`/`sessionId` gebonden, dus de call ging
@@ -1306,6 +1337,95 @@ CachedNetworkImage/P1-15-patroon. Bevestigd via verse export:
 — de force-unwrap is nu veilig, want alleen bereikbaar binnen de
 guard. Uit deze lijst verwijderd.)*
 
+**P1-26 · Eigenaar: Bob (Drupal-kant: deployen + curl-testen; daarna
+samen FlutterFlow-kant).** Nieuwe Drupal Services-resource `favorieten`
+(acties `flag`/`unflag`/`is_flagged`) om favorieten server-side generiek
+te maken — niet meer alleen horeca-nodes (bestaande hartjes op
+`HorecagelegenheidoverzichtKaart`/`HorecagelegenheidCurrent` gebruiken
+nog hun eigen, oudere aanpak), maar ook **taxonomy terms (gemeenten)**,
+en ook de node-bundles `club`/`club_event`/`photo_book`. **Dit is de
+directe blocker-oplossing voor P1-7 Tab 2 "Favoriete gemeenten"**
+hierboven (die had nog geen enkel toggle-mechanisme voor taxonomy
+terms).
+
+**Aanleiding:** een collega had al een concept-`custom_services_resources()`
++ 3 callback-functies geschreven (flag/unflag/is_flagged via het
+Flag-module), werkte nog niet volledig. Chat-sessie 2026-08-20 heeft
+'m gereviewd, gefixt en uitgebreid.
+
+**Gevonden/gefixte bugs in het concept (Claude, code-review, niet zelf
+op de Drupal-server toegepast — Bob heeft geen git-toegang tot deze
+server-code, dus dit moet hij zelf plakken):**
+1. **Fataal:** de concept-code definieerde een tweede
+   `function custom_services_resources() {...}`, terwijl `custom.module`
+   die al één keer heeft (met `plaatsen` + `favorieten_agenda`) — twee
+   functies met dezelfde naam is een PHP fatal error, legt de hele site
+   plat zodra dit cachet wordt. Moet gemerged worden tot ÉÉN functie.
+2. Entity-type was hardcoded tot alleen `'node'` — geen taxonomy-support,
+   terwijl dat nou net het doel is.
+3. Flag-namen waren geraden i.p.v. gecontroleerd. Bob's screenshot van
+   `admin/structure/flags` gaf de echte namen: **`bookmarks`** (Flag
+   type `node`, bundles: `club`, `club_event`, `photo_book`,
+   `horecagelegenheid`, `activity`, `go_out_event`) en **`favorite_town`**
+   (Flag type `taxonomy_term`, bundle `town`). Code aangepast om deze
+   te gebruiken i.p.v. de placeholder `bookmarks_taxonomy`.
+4. Een hardcoded node-type-whitelist in de eigen code (los van de
+   Flag-config) werd losgelaten — `$flag->access()` kent de toegestane
+   bundles al uit de Flag's eigen "Entity bundles"-instelling, dus een
+   losse handmatige lijst zou steeds opnieuw uit sync kunnen raken met
+   wat Bob in de Flags-UI instelt.
+
+**Deliverable (in de chat gegeven, nog NIET door Bob gedeployed/getest):**
+- Nieuw bestand **`custom.favorites_flag.inc`** (zelfde opzet als het
+  bestaande `custom.favorites_agenda.inc`): helper
+  `_custom_favorites_flag_name_for_entity_type()` + de 3 callbacks
+  `_custom_favorites_flag()`, `_custom_favorites_unflag()`,
+  `_custom_favorites_is_flagged()`. Alle 3 accepteren
+  `entity_id` + optioneel `entity_type` (`'node'` default of
+  `'taxonomy_term'`), forceren altijd de **huidige ingelogde
+  gebruiker** (nooit een client-aangeleverde uid).
+- Twee toevoegingen aan het bestaande `custom.module`: (a) een
+  `module_load_include('inc', 'custom', 'custom.favorites_flag');`-regel
+  naast de bestaande includes, (b) een nieuwe `'favorieten'`-entry
+  (met `'actions' => array('flag' => ..., 'unflag' => ...,
+  'is_flagged' => ...)`) toegevoegd aan de **bestaande**
+  `$resources`-array in de al-aanwezige `custom_services_resources()`
+  — niet een 2e functie aanmaken.
+- Curl-testcommando's gegeven voor alle 6 combinaties (flag/unflag/
+  is_flagged × node/taxonomy_term), POST naar
+  `.../favorieten/<actie>.json` met sessie-cookie + `X-CSRF-Token`.
+
+**Nog open / vervolgstappen:**
+1. Bob plakt de 2 wijzigingen in `custom.module` +
+   `custom.favorites_flag.inc` op de Drupal-server.
+2. **Zelfde per-endpoint-activatie-valkuil als bij `favorieten_agenda`**
+   (zie `CLAUDE.md`): de nieuwe `favorieten`-resource moet apart
+   aangevinkt worden op
+   `admin/structure/services/list/<endpoint>/resources` — code alleen
+   is niet genoeg.
+3. Testen met de gegeven curl-commando's — met name de HTTP-methode
+   voor `is_flagged` staat nog niet vast (gedefinieerd als Services
+   `action`, vermoedelijk POST net als flag/unflag, maar niet
+   bevestigd — zelfde soort GET/POST-valkuil als eerder bij
+   `favorieten_agenda` gevonden).
+4. **FlutterFlow-kant:** de bestaande custom action
+   `lib/custom_code/actions/drupal_request.dart` werkt hiervoor
+   ongewijzigd (geen Dart-aanpassing nodig) — bevestigd via
+   code-review, twee aandachtspunten voor wie dit inbouwt:
+   - De respons bij succes is een **los JSON-object**
+     (`{"status":"flagged",...}`), geen array — dus binden via
+     **Set from Variable → JSON Path** (bv. `$.status`, `$.is_flagged`),
+     niet het `.toList()`/`List.generate`-patroon van
+     `favorieten_agenda`.
+   - `body` moet als kale JSON-string handmatig opgebouwd worden in de
+     builder, bv. `'{"entity_id": ' + nid + '}'` (node, `entity_type`
+     mag weg, default `'node'`) of `'{"entity_id": ' + tid + ',
+     "entity_type": "taxonomy_term"}'` (gemeente).
+5. Zodra bevestigd werkend: koppelen aan een hartje-toggle-UI voor
+   gemeenten (lost P1-7 Tab 2 op) en optioneel de bestaande
+   horeca-hartjes migreren naar dit nieuwe, generieke endpoint i.p.v.
+   hun huidige aparte implementatie.
+
 **P1-13 · Eigenaar: Bob (geblokkeerd op een bevestigd FlutterFlow-
 platformprobleem, geen Claude-taak meer totdat dat opgelost is).**
 **Live herbevestigd 2026-08-12 (Claude, verse build, telefoonformaat