|
|
@@ -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
|