Explorar o código

127-E en 127-F af: kloon vult nu ook het activiteitenformulier

127-E (activiteitenformulier voorvullen)
- On Page Load -> Update Page State uitgebreid van 6 naar 8 velden:
  createLogoUrl = kloonBeeld(kloonBron,'logo_url') en
  createFotosUrls = kloonBeelden(kloonBron,'fotos_urls').
- Initial Option Value op vijf dropdowns, zodat de gekloonde keuze ook
  zichtbaar is: categorieen/provincie/entree aan App State (die bestaan al
  bij de eerste build), gemeente/plaats aan page state (die zitten achter
  een Visibility-conditie en bouwen pas na de On-Page-Load-safeSetState).
- Op mijnProfiel hing de gemeenteTid-navigatieparameter aan apiResultvpn
  (de On-Page-Load-call) i.p.v. aan apiResultAct van de Kopie-knop zelf;
  dat gaf stil gemeenteTid="null" en een lege plaats-cascade. Gefixt.

127-D restpunt (logo-/fotopreview) opgelost
- Twee nieuwe custom functions met ImagePath als returntype:
  kloonBeeld (Image Path) en kloonBeelden (Image Path + Is List). Daarmee
  is geen typewijziging van de page states nodig; op beide aanmaakpagina's
  tonen logo en foto's nu een preview bij een kloon.

127-F (kloonBron wissen)
- Update App State -> Clear Value op alle vier de "nieuw aanmaken"-ingangen
  (3x mijnProfiel, 1x favorieten), zodat een vers formulier leeg is.

Geverifieerd: verse export, dart analyze 0 errors, en op emulator-5556
(profile-build) end-to-end getest. Ingediende kloon gaf STATUS 200 met
categorie_tids, logo_fid, fotos_fids en entree_tid compleet (nid 222823).
bob hai 13 horas
pai
achega
6cb5a2f3b2

+ 80 - 64
TASKS.md

@@ -1123,13 +1123,20 @@ Dat is nodig omdat een voorgeselecteerde dropdown geen `onChanged` vuurt.
 Daarnaast is de weergave van beide dropdowns voorgevuld via *Initial Option
 Value(s)*.
 
-⚠️ **Restpunt 127-D: de logo-preview blijft leeg.** `createLogoUrl` is van het
-type **Image Path**, en in die Set-Variable-dialoog staat `kloonTekst` **grijs**
-(niet selecteerbaar) — het bekende Image-Path-typeprobleem uit `CLAUDE.md`. Het
-logo zelf gaat wél mee bij indienen (`logo_fid` staat er). Oplossing zou zijn:
-het page-state-veld omzetten van Image Path naar String, maar dan moet de
-`Image`-widget die eraan hangt (regel ~2767 in de export) opnieuw gebonden
-worden. Keuze aan Bob.
+✅ **Restpunt 127-D (logo-/fotopreview) is OPGELOST** (2026-09-22). Geen
+typewijziging nodig geweest: er zijn twee custom functions bij gekomen met
+**ImagePath** als returntype — `kloonBeeld(bron, sleutel)` → *Image Path* en
+`kloonBeelden(bron, sleutel)` → *Image Path + Is List*. Die staan in de
+Set-Variable-dialoog wél gewoon selecteerbaar. Op **beide** aanmaakpagina's is
+in de On-Page-Load → Update Page State nu `createLogoUrl` =
+`kloonBeeld(kloonBron,'logo_url')` en `createFotosUrls` =
+`kloonBeelden(kloonBron,'fotos_urls')` gezet. De bestaande guards
+(`!= null && != ''` resp. `.length > 0`) blijven werken, want de functies geven
+`''` / `[]` terug als er niets te klonen valt.
+**Les voor later:** ImagePath/VideoPath/AudioPath staan gewoon in de
+return-type-dropdown van een Custom Function — een String-functie aan een
+Image-Path-veld binden lukt niet, maar een functie *van het juiste type*
+schrijven lost het in één keer op.
 
 **127-G IS KLAAR** (2026-09-21): dezelfde Kopie-knop staat nu ook op
 `mijnProfiel`, in béide lijsten — onder *Mijn evenementen* en onder
@@ -1137,16 +1144,13 @@ worden. Keuze aan Bob.
 (`type: 'go_out_event'` resp. `'activity'`) is er géén type-conditie nodig:
 elke knop navigeert rechtstreeks naar het juiste formulier.
 
-**127-E opnieuw bevestigd op het toestel (2026-09-21):** de Kopie-knop onder
-*Eigen activiteiten* op `mijnProfiel` navigeert netjes naar
-`stadsactiviteitAanmaken`, maar het formulier is **helemaal leeg** (titel,
-categorie, plaats). Dat is geen regressie — `stadsactiviteit_aanmaken_widget.dart`
-heeft simpelweg nog 0 treffers op `kloonBron`, terwijl het evenementformulier er
-14 heeft.
+**127-E IS KLAAR** (2026-09-22): het activiteitenformulier vult zich nu net zo
+volledig als het evenementformulier — negen tekstvelden, vijf dropdowns, logo- en
+fotopreview. Zie het eigen blok hieronder.
 
-**Nog te doen:** 127-E (activiteitenformulier vullen, na 124), 127-F
-(`kloonBron` wissen op 4 plekken), plus de twee restpunten hierboven
-(knopkleur op `MijnAanmeldingen`, logo-preview).
+**Nog te doen:** alleen nog het restpunt **knopkleur** op `MijnAanmeldingen`
+(de Kopie-knop is nog FlutterFlow-rood `primary`). 127-E en 127-F zijn af
+(2026-09-22), de logo-/fotopreview ook.
 
 **Wens Bob (2026-09-20):** op elke kaart in *Mijn aanmeldingen* een knop **Kopie**.
 Eén tik opent het aanmaakformulier volledig ingevuld; de gebruiker vult de datum
@@ -1326,77 +1330,89 @@ selecteert de dropdown wél de juiste waarde maar verstuurt de create-actie leeg
 De page states worden pas bij het indienen gelezen, dus die mogen gewoon in
 On Page Load — daar speelt het timingprobleem niet.
 
-#### 127-E · Activiteitenformulier voorvullen · Eigenaar: Claude — bezig (2026-09-22, preview logo/foto's)
+#### 127-E · Activiteitenformulier voorvullen · ✅ AF (2026-09-22)
+
+Geverifieerd in een verse export, `dart analyze` 0 fouten.
 
-**Af en geverifieerd in een verse export (0 analyse-fouten):**
 - **On Page Load → Update Page State** (Action 3, ná de bestaande
-  `gemeenteVoorselectie`-conditional) met zes velden:
+  `gemeenteVoorselectie`-conditional) met acht velden:
   `createProvincieID`→`provincie_tid`, `createPlaatsID`→`plaats_tid`,
   `createEntreeTid`→`entree_tid`, `createLogoFid`→`logo_fid`,
   `createCategorieTids`→`categorie_tids` (kloonLijst),
-  `createFotosFids`→`fotos_fids` (kloonLijst).
+  `createFotosFids`→`fotos_fids` (kloonLijst),
+  `createLogoUrl`→`logo_url` (**kloonBeeld**),
+  `createFotosUrls`→`fotos_urls` (**kloonBeelden**).
 - **Initial Value op negen TextFields**: `titel`, `omschrijving`, `adres_straat`,
   `adres_postcode`, `organisator`, `contact`, `website_url`,
   `toelichting_entree`, `entree_prijs`. (Datum bewust niet — je kloont juist om
   een nieuwe datum te kiezen.)
+- **Initial Option Value op vijf dropdowns**, zodat de gebruiker de gekloonde
+  keuze ook *ziet*: `DropDownCategorieen` = `kloonLijst(kloonBron,
+  'categorie_tids')`, `DropDownProvincie` = `kloonTekst(kloonBron,
+  'provincie_tid')`, `DropDownEntree` = `kloonTekst(kloonBron,'entree_tid')` —
+  die drie bestaan al bij de eerste build en moeten dus aan **App State**
+  hangen, niet aan page state. `DropDownGemeente` = `createGemeenteID` en
+  `DropDownPlaats` = `createPlaatsID` mogen wél page state, want die zitten
+  achter een Visibility-conditie en worden pas ná de On-Page-Load-`safeSetState`
+  voor het eerst gebouwd.
 - **`gemeenteTid`-navigatieparameter** op beide Kopie-knoppen
   (`MijnAanmeldingen` Action 4 en `mijnProfiel` Action 3), gebonden aan
   `apiResult… → JSON Body → $.gemeente_tid`. `gemeenteVoorselectie()` geeft die
   parameter voorrang, dus `createGemeenteID` klopt bij een kloon en de
   plaats-dropdown wordt zichtbaar.
+  ⚠️ **Valkuil die hier één keer toesloeg:** op `mijnProfiel` stond die binding
+  eerst op `apiResultvpn` — de output van de On-Page-Load-call
+  (`MijnHorecagelegenheden`), niet van de Kopie-knop zelf. Dat compileert
+  gewoon, geeft stil `gemeenteTid = "null"` en dus een lege plaats-cascade.
+  Controleer bij zo'n binding altijd de **naam** van de action output, niet
+  alleen het JSON-pad. De bronnenlijst rendert daar leeg tot je de hover-truc
+  gebruikt; zoekterm `apiResult` + hover toont de drie outputs wél.
+
+**Volledig af**: zowel de indiening (alle waarden komen uit page state) als de
+weergave (tekstvelden, dropdowns, logo- en fotopreview).
+
+**Op het toestel bewezen (2026-09-22, profile-build x86_64 op emulator-5556,
+account `bobcity`):** Kopie op *Eigen activiteiten* → formulier met titel,
+omschrijving, drie categorieën, provincie/gemeente/plaats (Noord-Holland /
+Drechterland / Hoogkarspel), adres, postcode, entree-type én logo- + fotopreview;
+datumvelden leeg. Ingediend met STATUS 200:
+
+```
+BODY : {"titel":"gggg","plaats_tid":28739,"datum_start":"2026-09-26 17:02:00",
+        "omschrijving":"...","adres":{"thoroughfare":"yyy","postal_code":"gggg",
+        "country":"NL"},"categorie_tids":[36190,36194,36484],
+        "logo_fid":5513220,"fotos_fids":[5513221],"entree_tid":36197}
+→ {"status":"created_pending_review","nid":"222823"}
+```
 
-**De indiening is hiermee compleet**: alle waarden die `stadsactiviteitCreate`
-meekrijgt komen uit de page states, en die zijn nu gezet.
+⚠️ **Op te ruimen door Bob: testnodes 222822 en 222823 op productie** (beide door
+Claude aangemaakt tijdens deze tests; 222823 staat ongepubliceerd).
 
-**Nog te doen — alleen nog zichtbaarheid, geen functionaliteit:**
-- **Initial Option Value op vijf dropdowns**, zodat de gebruiker de gekloonde
-  keuze ook *ziet* staan: `DropDownProvincie` (aan **App State**:
-  `kloonTekst(kloonBron,'provincie_tid')` — dit is de enige die al bij de eerste
-  build bestaat, dus niet aan page state hangen), `DropDownGemeente`
-  (`createGemeenteID`), `DropDownPlaats` (`createPlaatsID`), `DropDownEntree`
-  (`createEntreeTid`), `DropDownCategorieen` (`createCategorieTids`).
-  Zonder deze tonen de dropdowns "Selecteer…" terwijl de onderliggende waarde
-  wel goed staat — verwarrend, maar niet fout.
-- ⚠️ **`createFotosUrls` is type `List < Image Path >` en `createLogoUrl` is
-  `Image Path`** — daar is `kloonLijst`/`kloonTekst` (String) niet aan te binden.
-  Zelfde restpunt als op het evenementformulier: de **preview** van logo en
-  foto's ontbreekt bij een kloon, de fids gaan wél mee naar Drupal. Oplossing
-  vraagt om het type van die twee page states om te zetten naar String (en dan
-  de Image-widgets opnieuw binden) — besluit aan Bob.
-
-⚠️ **127-F is nu urgent geworden**: zolang `kloonBron` niet gewist wordt bij
-"nieuw aanmaken", krijgt een verse activiteit het vorige kloonformulier te zien.
-Dat raakt o.a. de knop "+ Activiteit aanmaken" per stadsrecht op `mijnProfiel`.
-
-#### 127-F · `kloonBron` wissen · Eigenaar: Claude — bezig (2026-09-22)
-
-Zonder dit blijft een kloon hangen: wie daarna een **vers** evenement aanmaakt,
-krijgt het vorige formulier opnieuw ingevuld.
-
-Zet vóór elke bestaande "nieuw aanmaken"-navigatie een `Update App State` met
-`kloonBron` op **Clear Value** (zelfde patroon als de uitlogknop). Vier plekken in
-een verse export van 2026-09-20:
-
-| bestand | regel | doel |
+#### 127-F · `kloonBron` wissen · ✅ AF (2026-09-22)
+
+Vóór elke "nieuw aanmaken"-navigatie staat nu een `Update App State` met
+`kloonBron` op **Clear Value** (genereert `FFAppState().kloonBron = null;`).
+Vier plekken, alle vier geverifieerd in een verse export:
+
+| bestand | knop | doel |
 |---|---|---|
-| `mijn_profiel_widget.dart` | 823 | `UitgaansevenementAanmaken` |
-| `mijn_profiel_widget.dart` | 1317 | `StadsactiviteitAanmaken` |
-| `mijn_profiel_widget.dart` | 1506 | `StadsactiviteitAanmaken` |
-| `favorieten_widget.dart` | 1042 | `StadsactiviteitAanmaken` |
+| `mijn_profiel_widget.dart` | `+ Evenement aanmaken` | `UitgaansevenementAanmaken` |
+| `mijn_profiel_widget.dart` | `+ Activiteit` | `StadsactiviteitAanmaken` |
+| `mijn_profiel_widget.dart` | `+ Activiteit aanmaken` (per stadsrecht) | `StadsactiviteitAanmaken` |
+| `favorieten_widget.dart` | `Stadsactiviteit aanmaken` | `StadsactiviteitAanmaken` |
 
 Dit zijn **alle** ingangen: de aanmaakpagina's zijn verder nergens vanuit de app
 bereikbaar (wel via een directe route).
 
-#### Volgorde en omvang
+**Op het toestel bewezen (2026-09-22):** ná een kloon levert "+ Activiteit
+aanmaken" bij een stadsrecht een volledig leeg formulier op (titel, omschrijving,
+categorie "Selecteer…", entree "Select…", geen media), mét de juiste gemeente
+voorgeselecteerd uit `gemeenteTid`.
 
-1. **127-A** (Drupal) — code staat klaar, ±15 min, blokkeert alles.
-2. **127-B** (App State + call + 2 functies) — ±30 min.
-3. **127-C + 127-D + 127-F** (evenementen, end-to-end werkend) — één sessie.
-4. **124/125/126** (cascade) en daarna **127-E** (activiteiten) — eigen sessie.
+#### Stand
 
-Stap 1-3 leveren al een werkende kloonknop voor evenementen; de knop op een
-activiteitenkaart verbergen tot 127-E klaar is, is één Visibility-conditie op de
-page parameter `type`.
+A t/m G zijn **allemaal af** (127-A Drupal door Bob, B t/m G in de builder).
+Open restpunt: alleen de **kleur** van de Kopie-knop, zie hieronder.
 
 #### Testen
 

+ 3 - 0
lib/favorieten/favorieten_widget.dart

@@ -1070,6 +1070,9 @@ class _FavorietenWidgetState extends State<FavorietenWidget>
                                     ),
                                     FFButtonWidget(
                                       onPressed: () async {
+                                        FFAppState().kloonBron = null;
+                                        safeSetState(() {});
+
                                         context.pushNamed(
                                             StadsactiviteitAanmakenWidget
                                                 .routeName);

+ 27 - 0
lib/flutter_flow/custom_functions.dart

@@ -526,3 +526,30 @@ List<String> kloonLijst(
   for (final item in waarde) if (item != null) uit.add(item.toString());
   return uit;
 }
+
+bool nieuwsbriefAan(dynamic item) {
+  if (item is! Map) return false;
+  return item['geabonneerd'] == true;
+}
+
+String kloonBeeld(
+  dynamic bron,
+  String sleutel,
+) {
+  if (bron == null || bron is! Map) return '';
+  final waarde = bron[sleutel];
+  if (waarde == null) return '';
+  return waarde.toString();
+}
+
+List<String> kloonBeelden(
+  dynamic bron,
+  String sleutel,
+) {
+  final uit = <String>[];
+  if (bron == null || bron is! Map) return uit;
+  final waarde = bron[sleutel];
+  if (waarde is! List) return uit;
+  for (final item in waarde) if (item != null) uit.add(item.toString());
+  return uit;
+}

+ 18 - 6
lib/flutter_flow/internationalization.dart

@@ -443,7 +443,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
     },
     'oxse6aci': {
       'nl': 'Kopie',
-      'en': '',
+      'en': 'Copy',
     },
     'aiokgolu': {
       'nl': 'Mijn horecagelegenheden',
@@ -476,7 +476,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
     },
     'wcyy4pao': {
       'nl': 'Kopie',
-      'en': '',
+      'en': 'Copy',
     },
     '5iw84w8w': {
       'nl': 'Mijn gemeenten (stadsrechten)',
@@ -496,7 +496,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
     },
     '0sxtqp61': {
       'nl': 'Wachtwoord wijzigen',
-      'en': '',
+      'en': 'Change password',
     },
     '373wjou2': {
       'nl': '',
@@ -504,7 +504,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
     },
     '4sjzjw0j': {
       'nl': 'Account verwijderen',
-      'en': '',
+      'en': 'Delete account',
     },
     'c8f4rdv0': {
       'nl': '',
@@ -512,7 +512,7 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
     },
     'owegb3ht': {
       'nl': 'Uitloggen',
-      'en': '',
+      'en': 'Log out',
     },
     'rflzqa3z': {
       'nl': '',
@@ -520,7 +520,19 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
     },
     '9s07bzb1': {
       'nl': 'Nieuwsbrieven',
-      'en': '',
+      'en': 'Newsletters',
+    },
+    '13hlbqrf': {
+      'nl':
+          'Je volgt nog geen gemeenten, dus de wekelijkse agenda blijft leeg. Tik hier om gemeenten te kiezen.',
+      'en':
+          'You don\'t follow any municipalities yet, so the weekly agenda stays empty. Tap here to choose municipalities.',
+    },
+    'jmzi90pc': {
+      'nl':
+          'De wekelijkse uitgaansagenda gebruikt de gemeenten die je volgt. Tik hier om ze te kiezen.',
+      'en':
+          'The weekly agenda uses the municipalities you follow. Tap here to choose them.',
     },
     'k800peag': {
       'nl': 'Home',

+ 12 - 2
lib/mijn_aanmeldingen/mijn_aanmeldingen_widget.dart

@@ -422,8 +422,18 @@ class _MijnAanmeldingenWidgetState extends State<MijnAanmeldingenWidget>
                                       );
                                     } else {
                                       context.pushNamed(
-                                          StadsactiviteitAanmakenWidget
-                                              .routeName);
+                                        StadsactiviteitAanmakenWidget.routeName,
+                                        queryParameters: {
+                                          'gemeenteTid': serializeParam(
+                                            getJsonField(
+                                              (_model.apiResulttzz?.jsonBody ??
+                                                  ''),
+                                              r'''$.gemeente_tid''',
+                                            ).toString(),
+                                            ParamType.String,
+                                          ),
+                                        }.withoutNulls,
+                                      );
                                     }
                                   }
 

+ 32 - 17
lib/mijn_profiel/mijn_profiel_model.dart

@@ -1,5 +1,6 @@
 import '/backend/api_requests/api_calls.dart';
 import '/components/header_buttons_component_widget.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
@@ -7,6 +8,7 @@ import '/horecagelegenhedenoverzicht/horecagelegenheidoverzicht_kaart/horecagele
 import '/shared/drawer_component/drawer_component_widget.dart';
 import '/shared/lege_lijst_component/lege_lijst_component_widget.dart';
 import 'dart:ui';
+import '/custom_code/actions/index.dart' as actions;
 import '/flutter_flow/custom_functions.dart' as functions;
 import '/index.dart';
 import 'mijn_profiel_widget.dart' show MijnProfielWidget;
@@ -40,6 +42,25 @@ class MijnProfielModel extends FlutterFlowModel<MijnProfielWidget> {
   void updateMijnHorecaResponsAtIndex(int index, Function(dynamic) updateFn) =>
       mijnHorecaRespons[index] = updateFn(mijnHorecaRespons[index]);
 
+  late LoggableList<dynamic> _favGemeenten = LoggableList([]);
+  set favGemeenten(List<dynamic> value) {
+    if (value != null) {
+      _favGemeenten = LoggableList(value);
+    }
+
+    debugLogWidgetClass(this);
+  }
+
+  List<dynamic> get favGemeenten =>
+      _favGemeenten?..logger = () => debugLogWidgetClass(this);
+  void addToFavGemeenten(dynamic item) => favGemeenten.add(item);
+  void removeFromFavGemeenten(dynamic item) => favGemeenten.remove(item);
+  void removeAtIndexFromFavGemeenten(int index) => favGemeenten.removeAt(index);
+  void insertAtIndexInFavGemeenten(int index, dynamic item) =>
+      favGemeenten.insert(index, item);
+  void updateFavGemeentenAtIndex(int index, Function(dynamic) updateFn) =>
+      favGemeenten[index] = updateFn(favGemeenten[index]);
+
   ///  State fields for stateful widgets in this page.
 
   // Stores action output result for [Backend Call - API (MijnHorecagelegenheden)] action in mijnProfiel widget.
@@ -82,15 +103,6 @@ class MijnProfielModel extends FlutterFlowModel<MijnProfielWidget> {
 
   ApiCallResponse? get apiResultAct => _apiResultAct;
 
-  // State field(s) for Switch widget.
-  bool? _switchValue;
-  set switchValue(bool? value) {
-    _switchValue = value;
-    debugLogWidgetClass(this);
-  }
-
-  bool? get switchValue => _switchValue;
-
   // Model for HeaderButtonsComponent component.
   late HeaderButtonsComponentModel headerButtonsComponentModel;
   // Model for drawerComponent component.
@@ -128,6 +140,17 @@ class MijnProfielModel extends FlutterFlowModel<MijnProfielWidget> {
                 'reference=QiIKGgoRbWlqbkhvcmVjYVJlc3BvbnMSBWoyczNxcgQSAggJUAFaEW1pam5Ib3JlY2FSZXNwb25zYgttaWpuUHJvZmllbA==',
             name: 'dynamic',
             nullable: false,
+          ),
+          'favGemeenten': debugSerializeParam(
+            favGemeenten,
+            ParamType.JSON,
+            isList: true,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=mijnProfiel',
+            searchReference:
+                'reference=Qh0KFQoMZmF2R2VtZWVudGVuEgU4dmQza3IEEgIICVABWgxmYXZHZW1lZW50ZW5iC21pam5Qcm9maWVs',
+            name: 'dynamic',
+            nullable: false,
           )
         }.entries,
         widgetStates: {
@@ -146,14 +169,6 @@ class MijnProfielModel extends FlutterFlowModel<MijnProfielWidget> {
                 'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=mijnProfiel',
             name: 'int',
             nullable: true,
-          ),
-          'switchValue': debugSerializeParam(
-            switchValue,
-            ParamType.bool,
-            link:
-                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=mijnProfiel',
-            name: 'bool',
-            nullable: true,
           )
         }.entries,
         actionOutputs: {

+ 234 - 64
lib/mijn_profiel/mijn_profiel_widget.dart

@@ -1,5 +1,6 @@
 import '/backend/api_requests/api_calls.dart';
 import '/components/header_buttons_component_widget.dart';
+import '/flutter_flow/flutter_flow_icon_button.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
@@ -7,6 +8,7 @@ import '/horecagelegenhedenoverzicht/horecagelegenheidoverzicht_kaart/horecagele
 import '/shared/drawer_component/drawer_component_widget.dart';
 import '/shared/lege_lijst_component/lege_lijst_component_widget.dart';
 import 'dart:ui';
+import '/custom_code/actions/index.dart' as actions;
 import '/flutter_flow/custom_functions.dart' as functions;
 import '/index.dart';
 import 'package:flutter/material.dart';
@@ -941,6 +943,10 @@ class _MijnProfielWidgetState extends State<MijnProfielWidget>
                                                   }),
                                                   FFButtonWidget(
                                                     onPressed: () async {
+                                                      FFAppState().kloonBron =
+                                                          null;
+                                                      safeSetState(() {});
+
                                                       context.pushNamed(
                                                         UitgaansevenementAanmakenWidget
                                                             .routeName,
@@ -1429,8 +1435,21 @@ class _MijnProfielWidgetState extends State<MijnProfielWidget>
                                                         safeSetState(() {});
 
                                                         context.pushNamed(
-                                                            StadsactiviteitAanmakenWidget
-                                                                .routeName);
+                                                          StadsactiviteitAanmakenWidget
+                                                              .routeName,
+                                                          queryParameters: {
+                                                            'gemeenteTid':
+                                                                serializeParam(
+                                                              getJsonField(
+                                                                (_model.apiResultAct
+                                                                        ?.jsonBody ??
+                                                                    ''),
+                                                                r'''$.gemeente_tid''',
+                                                              ).toString(),
+                                                              ParamType.String,
+                                                            ),
+                                                          }.withoutNulls,
+                                                        );
                                                       }
 
                                                       safeSetState(() {});
@@ -1539,6 +1558,9 @@ class _MijnProfielWidgetState extends State<MijnProfielWidget>
                                       ),
                                       FFButtonWidget(
                                         onPressed: () async {
+                                          FFAppState().kloonBron = null;
+                                          safeSetState(() {});
+
                                           context.pushNamed(
                                               StadsactiviteitAanmakenWidget
                                                   .routeName);
@@ -1728,6 +1750,10 @@ class _MijnProfielWidgetState extends State<MijnProfielWidget>
                                                       ),
                                                       FFButtonWidget(
                                                         onPressed: () async {
+                                                          FFAppState()
+                                                              .kloonBron = null;
+                                                          safeSetState(() {});
+
                                                           context.pushNamed(
                                                             StadsactiviteitAanmakenWidget
                                                                 .routeName,
@@ -2137,109 +2163,159 @@ class _MijnProfielWidgetState extends State<MijnProfielWidget>
                                             final nieuwsbriefItemItem =
                                                 nieuwsbriefItem[
                                                     nieuwsbriefItemIndex];
-                                            return Row(
-                                              mainAxisSize: MainAxisSize.max,
-                                              children: [
-                                                Column(
-                                                  mainAxisSize:
-                                                      MainAxisSize.max,
-                                                  children: [
-                                                    Text(
-                                                      getJsonField(
-                                                        nieuwsbriefItemItem,
-                                                        r'''$.naam''',
-                                                      ).toString(),
-                                                      style:
-                                                          FlutterFlowTheme.of(
-                                                                  context)
-                                                              .bodyMedium
+                                            return Padding(
+                                              padding: EdgeInsetsDirectional
+                                                  .fromSTEB(
+                                                      16.0, 10.0, 16.0, 10.0),
+                                              child: Row(
+                                                mainAxisSize: MainAxisSize.max,
+                                                children: [
+                                                  Expanded(
+                                                    child: Column(
+                                                      mainAxisSize:
+                                                          MainAxisSize.max,
+                                                      crossAxisAlignment:
+                                                          CrossAxisAlignment
+                                                              .start,
+                                                      children: [
+                                                        Text(
+                                                          getJsonField(
+                                                            nieuwsbriefItemItem,
+                                                            r'''$.naam''',
+                                                          ).toString(),
+                                                          style: FlutterFlowTheme
+                                                                  .of(context)
+                                                              .titleSmall
                                                               .override(
                                                                 font:
                                                                     GoogleFonts
                                                                         .roboto(
                                                                   fontWeight: FlutterFlowTheme.of(
                                                                           context)
-                                                                      .bodyMedium
+                                                                      .titleSmall
                                                                       .fontWeight,
                                                                   fontStyle: FlutterFlowTheme.of(
                                                                           context)
-                                                                      .bodyMedium
+                                                                      .titleSmall
                                                                       .fontStyle,
                                                                 ),
                                                                 letterSpacing:
                                                                     0.0,
                                                                 fontWeight: FlutterFlowTheme.of(
                                                                         context)
-                                                                    .bodyMedium
+                                                                    .titleSmall
                                                                     .fontWeight,
                                                                 fontStyle: FlutterFlowTheme.of(
                                                                         context)
-                                                                    .bodyMedium
+                                                                    .titleSmall
                                                                     .fontStyle,
                                                               ),
-                                                    ),
-                                                    Text(
-                                                      getJsonField(
-                                                        nieuwsbriefItemItem,
-                                                        r'''$.omschrijving''',
-                                                      ).toString(),
-                                                      style:
-                                                          FlutterFlowTheme.of(
-                                                                  context)
-                                                              .bodyMedium
+                                                        ),
+                                                        Text(
+                                                          getJsonField(
+                                                            nieuwsbriefItemItem,
+                                                            r'''$.omschrijving''',
+                                                          ).toString(),
+                                                          style: FlutterFlowTheme
+                                                                  .of(context)
+                                                              .bodySmall
                                                               .override(
                                                                 font:
                                                                     GoogleFonts
                                                                         .roboto(
                                                                   fontWeight: FlutterFlowTheme.of(
                                                                           context)
-                                                                      .bodyMedium
+                                                                      .bodySmall
                                                                       .fontWeight,
                                                                   fontStyle: FlutterFlowTheme.of(
                                                                           context)
-                                                                      .bodyMedium
+                                                                      .bodySmall
                                                                       .fontStyle,
                                                                 ),
+                                                                color: FlutterFlowTheme.of(
+                                                                        context)
+                                                                    .secondaryText,
                                                                 letterSpacing:
                                                                     0.0,
                                                                 fontWeight: FlutterFlowTheme.of(
                                                                         context)
-                                                                    .bodyMedium
+                                                                    .bodySmall
                                                                     .fontWeight,
                                                                 fontStyle: FlutterFlowTheme.of(
                                                                         context)
-                                                                    .bodyMedium
+                                                                    .bodySmall
                                                                     .fontStyle,
                                                               ),
+                                                        ),
+                                                      ],
                                                     ),
-                                                  ],
-                                                ),
-                                                Switch.adaptive(
-                                                  value: _model.switchValue ??=
-                                                      nieuwsbriefItemItem,
-                                                  onChanged: (newValue) async {
-                                                    safeSetState(() =>
-                                                        _model.switchValue =
-                                                            newValue!);
-                                                  },
-                                                  activeColor:
-                                                      FlutterFlowTheme.of(
-                                                              context)
-                                                          .primary,
-                                                  activeTrackColor:
-                                                      FlutterFlowTheme.of(
-                                                              context)
-                                                          .primary,
-                                                  inactiveTrackColor:
-                                                      FlutterFlowTheme.of(
-                                                              context)
-                                                          .alternate,
-                                                  inactiveThumbColor:
-                                                      FlutterFlowTheme.of(
-                                                              context)
-                                                          .secondaryBackground,
-                                                ),
-                                              ],
+                                                  ),
+                                                  if (!functions.nieuwsbriefAan(
+                                                      nieuwsbriefItemItem))
+                                                    FlutterFlowIconButton(
+                                                      borderRadius: 8.0,
+                                                      buttonSize: 40.0,
+                                                      icon: Icon(
+                                                        Icons.toggle_off,
+                                                        color:
+                                                            FlutterFlowTheme.of(
+                                                                    context)
+                                                                .secondaryText,
+                                                        size: 32.0,
+                                                      ),
+                                                      onPressed: () async {
+                                                        await actions
+                                                            .drupalRequest(
+                                                          'POST',
+                                                          'https://uitgaanskrant.com/nl/flutterdrup/nieuwsbrieven/subscribe.json',
+                                                          FFAppState()
+                                                              .userSessionname,
+                                                          FFAppState()
+                                                              .userSessionid,
+                                                          FFAppState()
+                                                              .userToken,
+                                                          '{\"tid\": ${getJsonField(
+                                                            nieuwsbriefItemItem,
+                                                            r'''$.tid''',
+                                                          ).toString()}}',
+                                                        );
+                                                        safeSetState(() {});
+                                                      },
+                                                    ),
+                                                  if (functions.nieuwsbriefAan(
+                                                      nieuwsbriefItemItem))
+                                                    FlutterFlowIconButton(
+                                                      borderRadius: 8.0,
+                                                      buttonSize: 40.0,
+                                                      icon: Icon(
+                                                        Icons.toggle_on,
+                                                        color:
+                                                            FlutterFlowTheme.of(
+                                                                    context)
+                                                                .primary,
+                                                        size: 32.0,
+                                                      ),
+                                                      onPressed: () async {
+                                                        await actions
+                                                            .drupalRequest(
+                                                          'POST',
+                                                          'https://uitgaanskrant.com/nl/flutterdrup/nieuwsbrieven/unsubscribe.json',
+                                                          FFAppState()
+                                                              .userSessionname,
+                                                          FFAppState()
+                                                              .userSessionid,
+                                                          FFAppState()
+                                                              .userToken,
+                                                          '{\"tid\": ${getJsonField(
+                                                            nieuwsbriefItemItem,
+                                                            r'''$.tid''',
+                                                          ).toString()}}',
+                                                        );
+                                                        safeSetState(() {});
+                                                      },
+                                                    ),
+                                                ],
+                                              ),
                                             );
                                           },
                                         );
@@ -2247,6 +2323,100 @@ class _MijnProfielWidgetState extends State<MijnProfielWidget>
                                     );
                                   },
                                 ),
+                                if (!(FFAppState()
+                                    .favorieteGemeenteIds
+                                    .isNotEmpty))
+                                  Padding(
+                                    padding: EdgeInsetsDirectional.fromSTEB(
+                                        16.0, 8.0, 16.0, 24.0),
+                                    child: InkWell(
+                                      splashColor: Colors.transparent,
+                                      focusColor: Colors.transparent,
+                                      hoverColor: Colors.transparent,
+                                      highlightColor: Colors.transparent,
+                                      onTap: () async {
+                                        context.pushNamed(
+                                            SelectprovinciegemeenteWidget
+                                                .routeName);
+                                      },
+                                      child: Text(
+                                        FFLocalizations.of(context).getText(
+                                          '13hlbqrf' /* Je volgt nog geen gemeenten, d... */,
+                                        ),
+                                        style: FlutterFlowTheme.of(context)
+                                            .bodyMedium
+                                            .override(
+                                              font: GoogleFonts.roboto(
+                                                fontWeight:
+                                                    FlutterFlowTheme.of(context)
+                                                        .bodyMedium
+                                                        .fontWeight,
+                                                fontStyle:
+                                                    FlutterFlowTheme.of(context)
+                                                        .bodyMedium
+                                                        .fontStyle,
+                                              ),
+                                              color:
+                                                  FlutterFlowTheme.of(context)
+                                                      .primary,
+                                              letterSpacing: 0.0,
+                                              fontWeight:
+                                                  FlutterFlowTheme.of(context)
+                                                      .bodyMedium
+                                                      .fontWeight,
+                                              fontStyle:
+                                                  FlutterFlowTheme.of(context)
+                                                      .bodyMedium
+                                                      .fontStyle,
+                                            ),
+                                      ),
+                                    ),
+                                  ),
+                                Padding(
+                                  padding: EdgeInsetsDirectional.fromSTEB(
+                                      16.0, 8.0, 16.0, 24.0),
+                                  child: InkWell(
+                                    splashColor: Colors.transparent,
+                                    focusColor: Colors.transparent,
+                                    hoverColor: Colors.transparent,
+                                    highlightColor: Colors.transparent,
+                                    onTap: () async {
+                                      context.pushNamed(
+                                          SelectprovinciegemeenteWidget
+                                              .routeName);
+                                    },
+                                    child: Text(
+                                      FFLocalizations.of(context).getText(
+                                        'jmzi90pc' /* De wekelijkse uitgaansagenda g... */,
+                                      ),
+                                      style: FlutterFlowTheme.of(context)
+                                          .bodyMedium
+                                          .override(
+                                            font: GoogleFonts.roboto(
+                                              fontWeight:
+                                                  FlutterFlowTheme.of(context)
+                                                      .bodyMedium
+                                                      .fontWeight,
+                                              fontStyle:
+                                                  FlutterFlowTheme.of(context)
+                                                      .bodyMedium
+                                                      .fontStyle,
+                                            ),
+                                            color: FlutterFlowTheme.of(context)
+                                                .secondary,
+                                            letterSpacing: 0.0,
+                                            fontWeight:
+                                                FlutterFlowTheme.of(context)
+                                                    .bodyMedium
+                                                    .fontWeight,
+                                            fontStyle:
+                                                FlutterFlowTheme.of(context)
+                                                    .bodyMedium
+                                                    .fontStyle,
+                                          ),
+                                    ),
+                                  ),
+                                ),
                               ],
                             ),
                           ],

+ 64 - 14
lib/stadsactiviteit_aanmaken/stadsactiviteit_aanmaken_widget.dart

@@ -59,15 +59,40 @@ class _StadsactiviteitAanmakenWidgetState
             (_model.mijnStadsrechtenResp?.jsonBody ?? ''), widget!.gemeenteTid);
         safeSetState(() {});
       }
+      _model.createProvincieID =
+          functions.kloonTekst(FFAppState().kloonBron, 'provincie_tid');
+      _model.createPlaatsID =
+          functions.kloonTekst(FFAppState().kloonBron, 'plaats_tid');
+      _model.createEntreeTid =
+          functions.kloonTekst(FFAppState().kloonBron, 'entree_tid');
+      _model.createLogoFid =
+          functions.kloonTekst(FFAppState().kloonBron, 'logo_fid');
+      _model.createCategorieTids = functions
+          .kloonLijst(FFAppState().kloonBron, 'categorie_tids')
+          .toList()
+          .cast<String>();
+      _model.createFotosFids = functions
+          .kloonLijst(FFAppState().kloonBron, 'fotos_fids')
+          .toList()
+          .cast<String>();
+      _model.createLogoUrl =
+          functions.kloonBeeld(FFAppState().kloonBron, 'logo_url');
+      _model.createFotosUrls = functions
+          .kloonBeelden(FFAppState().kloonBron, 'fotos_urls')
+          .toList()
+          .cast<String>();
+      safeSetState(() {});
     });
 
-    _model.textFieldTitelTextController ??= TextEditingController()
+    _model.textFieldTitelTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'titel'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldTitelFocusNode ??= FocusNode();
 
-    _model.textFieldOmschrijvingTextController ??= TextEditingController()
+    _model.textFieldOmschrijvingTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'omschrijving'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
@@ -85,43 +110,51 @@ class _StadsactiviteitAanmakenWidgetState
       });
     _model.textFieldDatumEindFocusNode ??= FocusNode();
 
-    _model.textFieldAdresTextController ??= TextEditingController()
+    _model.textFieldAdresTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'adres_straat'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldAdresFocusNode ??= FocusNode();
 
-    _model.textFieldPostcodeTextController ??= TextEditingController()
+    _model.textFieldPostcodeTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'adres_postcode'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldPostcodeFocusNode ??= FocusNode();
 
-    _model.textFieldOrganisatorTextController ??= TextEditingController()
+    _model.textFieldOrganisatorTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'organisator'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldOrganisatorFocusNode ??= FocusNode();
 
-    _model.textFieldContactTextController ??= TextEditingController()
+    _model.textFieldContactTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'contact'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldContactFocusNode ??= FocusNode();
 
-    _model.textFieldWebsiteURLTextController ??= TextEditingController()
+    _model.textFieldWebsiteURLTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'website_url'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldWebsiteURLFocusNode ??= FocusNode();
 
-    _model.textFieldToelichtingEntreeTextController ??= TextEditingController()
+    _model.textFieldToelichtingEntreeTextController ??= TextEditingController(
+        text:
+            functions.kloonTekst(FFAppState().kloonBron, 'toelichting_entree'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
     _model.textFieldToelichtingEntreeFocusNode ??= FocusNode();
 
-    _model.textFieldEntreeprijsTextController ??= TextEditingController()
+    _model.textFieldEntreeprijsTextController ??= TextEditingController(
+        text: functions.kloonTekst(FFAppState().kloonBron, 'entree_prijs'))
       ..addListener(() {
         debugLogWidgetClass(_model);
       });
@@ -705,7 +738,14 @@ class _StadsactiviteitAanmakenWidgetState
                                   return FlutterFlowDropDown<String>(
                                     multiSelectController: _model
                                             .dropDownCategorieenValueController ??=
-                                        FormListFieldController<String>(null),
+                                        FormListFieldController<String>(
+                                            _model.dropDownCategorieenValue ??=
+                                                List<String>.from(
+                                      functions.kloonLijst(
+                                              FFAppState().kloonBron,
+                                              'categorie_tids') ??
+                                          [],
+                                    )),
                                     options: List<String>.from(
                                         functions.categorieSubTids(
                                             dropDownCategorieenCategorieenResponse
@@ -1764,7 +1804,12 @@ class _StadsactiviteitAanmakenWidgetState
                                       return FlutterFlowDropDown<String>(
                                         controller: _model
                                                 .dropDownProvincieValueController ??=
-                                            FormFieldController<String>(null),
+                                            FormFieldController<String>(
+                                          _model.dropDownProvincieValue ??=
+                                              functions.kloonTekst(
+                                                  FFAppState().kloonBron,
+                                                  'provincie_tid'),
+                                        ),
                                         options: List<String>.from(
                                             (getJsonField(
                                           dropDownProvincieProvinciesResponse
@@ -1897,7 +1942,8 @@ class _StadsactiviteitAanmakenWidgetState
                                           controller: _model
                                                   .dropDownGemeenteValueController ??=
                                               FormFieldController<String>(
-                                            _model.dropDownGemeenteValue ??= '',
+                                            _model.dropDownGemeenteValue ??=
+                                                _model.createGemeenteID,
                                           ),
                                           options: List<String>.from(
                                               (getJsonField(
@@ -2038,7 +2084,8 @@ class _StadsactiviteitAanmakenWidgetState
                                           controller: _model
                                                   .dropDownPlaatsValueController ??=
                                               FormFieldController<String>(
-                                            _model.dropDownPlaatsValue ??= '',
+                                            _model.dropDownPlaatsValue ??=
+                                                _model.createPlaatsID,
                                           ),
                                           options: List<String>.from(
                                               (getJsonField(
@@ -2958,7 +3005,10 @@ class _StadsactiviteitAanmakenWidgetState
                                       controller: _model
                                               .dropDownEntreeValueController ??=
                                           FormFieldController<String>(
-                                        _model.dropDownEntreeValue ??= '',
+                                        _model.dropDownEntreeValue ??=
+                                            functions.kloonTekst(
+                                                FFAppState().kloonBron,
+                                                'entree_tid'),
                                       ),
                                       options: List<String>.from((getJsonField(
                                         dropDownEntreeEntreeoptiesResponse

+ 6 - 0
lib/uitgaansevenement_aanmaken/uitgaansevenement_aanmaken_widget.dart

@@ -68,6 +68,12 @@ class _UitgaansevenementAanmakenWidgetState
           .kloonLijst(FFAppState().kloonBron, 'fotos_fids')
           .toList()
           .cast<String>();
+      _model.createLogoUrl =
+          functions.kloonBeeld(FFAppState().kloonBron, 'logo_url');
+      _model.createFotosUrls = functions
+          .kloonBeelden(FFAppState().kloonBron, 'fotos_urls')
+          .toList()
+          .cast<String>();
       safeSetState(() {});
     });