浏览代码

P1-8: EventCurrent 'Alle evenementen'-knop naar PUitgaanPage (export)

Bevat ook Bob's gelijktijdige wijzigingen: nieuwe custom action
drupal_request.dart, aanpassingen aan HeaderButtonsComponent en
SelectStateDropDownComponent.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 1 月之前
父节点
当前提交
4cac03a385

+ 1 - 1
android/app/build.gradle

@@ -55,7 +55,7 @@ android {
     defaultConfig {
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
         applicationId "com.uitgaanskrant.app"
-        minSdkVersion 23
+        minSdkVersion flutter.minSdkVersion
         targetSdkVersion 36
         versionCode flutterVersionCode.toInteger()
         versionName flutterVersionName

+ 2 - 2
android/build.gradle

@@ -43,6 +43,6 @@ subprojects {
     project.evaluationDependsOn(':app')
 }
 
-task clean(type: Delete) {
-    delete rootProject.buildDir
+tasks.register("clean", Delete) {
+    delete rootProject.layout.buildDirectory
 }

+ 4 - 4
ios/Runner.xcodeproj/project.pbxproj

@@ -44,8 +44,8 @@
 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		6436409627A31CDC00820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		6436409927A31CD900820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409627A31CDB00820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409327A31CDB00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -225,8 +225,8 @@
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
-				6436409627A31CDC00820AF7 /* nl */,
-				6436409927A31CD900820AF7 /* en */,
+				6436409627A31CDB00820AF7 /* nl */,
+				6436409327A31CDB00820AF7 /* en */,
 			);
 			name = InfoPlist.strings;
 			sourceTree = "<group>";

+ 19 - 0
lib/components/header_buttons_component_widget.dart

@@ -92,6 +92,7 @@ class _HeaderButtonsComponentWidgetState
     DebugFlutterFlowModelContext.maybeOf(context)
         ?.parentModelCallback
         ?.call(_model);
+    context.watch<FFAppState>();
 
     return Align(
       alignment: AlignmentDirectional(0.0, 0.0),
@@ -195,6 +196,24 @@ class _HeaderButtonsComponentWidgetState
               ),
             ),
           ),
+          Text(
+            FFAppState().gemeenteSelectNaam != null &&
+                    FFAppState().gemeenteSelectNaam != ''
+                ? FFAppState().gemeenteSelectNaam
+                : FFAppState().provincieSelectName,
+            style: FlutterFlowTheme.of(context).bodyMedium.override(
+                  font: GoogleFonts.inter(
+                    fontWeight:
+                        FlutterFlowTheme.of(context).bodyMedium.fontWeight,
+                    fontStyle:
+                        FlutterFlowTheme.of(context).bodyMedium.fontStyle,
+                  ),
+                  letterSpacing: 0.0,
+                  fontWeight:
+                      FlutterFlowTheme.of(context).bodyMedium.fontWeight,
+                  fontStyle: FlutterFlowTheme.of(context).bodyMedium.fontStyle,
+                ),
+          ),
         ],
       ),
     );

+ 157 - 0
lib/custom_code/actions/drupal_request.dart

@@ -0,0 +1,157 @@
+// Automatic FlutterFlow imports
+import '/backend/schema/structs/index.dart';
+import '/flutter_flow/flutter_flow_theme.dart';
+import '/flutter_flow/flutter_flow_util.dart';
+import 'index.dart'; // Imports other custom actions
+import '/flutter_flow/custom_functions.dart'; // Imports custom functions
+import 'package:flutter/material.dart';
+// Begin custom action code
+// DO NOT REMOVE OR MODIFY THE CODE ABOVE!
+
+import 'dart:async';
+import 'dart:convert';
+import 'package:http/http.dart' as http;
+
+Future<dynamic> drupalRequest(
+  String method,
+  String url,
+  String sessionName,
+  String sessionId,
+  String token,
+  String body,
+) async {
+  try {
+    //--------------------------------------------------
+    // Headers
+    //--------------------------------------------------
+
+    final headers = <String, String>{
+      'Accept': 'application/json',
+      'Content-Type': 'application/json',
+    };
+
+    if (sessionName.trim().isNotEmpty && sessionId.trim().isNotEmpty) {
+      headers['Cookie'] = '$sessionName=$sessionId';
+    }
+
+    if (token.trim().isNotEmpty) {
+      headers['X-CSRF-Token'] = token;
+    }
+
+    //--------------------------------------------------
+    // DEBUG
+    //--------------------------------------------------
+
+    print('========================================');
+    print('DRUPAL REQUEST');
+    print('Method : $method');
+    print('URL    : $url');
+    print('Headers');
+    headers.forEach((k, v) => print('$k: $v'));
+
+    if (body.isNotEmpty) {
+      print('Body');
+      print(body);
+    }
+
+    print('========================================');
+
+    //--------------------------------------------------
+    // Request
+    //--------------------------------------------------
+
+    http.Response response;
+
+    switch (method.toUpperCase()) {
+      case 'POST':
+        response = await http
+            .post(
+              Uri.parse(url),
+              headers: headers,
+              body: body,
+            )
+            .timeout(const Duration(seconds: 30));
+        break;
+
+      case 'PUT':
+        response = await http
+            .put(
+              Uri.parse(url),
+              headers: headers,
+              body: body,
+            )
+            .timeout(const Duration(seconds: 30));
+        break;
+
+      case 'DELETE':
+        response = await http
+            .delete(
+              Uri.parse(url),
+              headers: headers,
+              body: body,
+            )
+            .timeout(const Duration(seconds: 30));
+        break;
+
+      default:
+        response = await http
+            .get(
+              Uri.parse(url),
+              headers: headers,
+            )
+            .timeout(const Duration(seconds: 30));
+    }
+
+    //--------------------------------------------------
+    // DEBUG RESPONSE
+    //--------------------------------------------------
+
+    print('========================================');
+    print('STATUS : ${response.statusCode}');
+    print('RESPONSE HEADERS');
+    response.headers.forEach((k, v) => print('$k: $v'));
+
+    print('BODY');
+    print(response.body);
+    print('========================================');
+
+    //--------------------------------------------------
+    // JSON of tekst
+    //--------------------------------------------------
+
+    dynamic data;
+
+    try {
+      data = jsonDecode(response.body);
+    } catch (_) {
+      data = response.body;
+    }
+
+    if (response.statusCode >= 200 && response.statusCode < 300) {
+      return data;
+    }
+
+    return {
+      'success': false,
+      'statusCode': response.statusCode,
+      'body': data,
+    };
+  } on TimeoutException {
+    return {
+      'success': false,
+      'statusCode': 408,
+      'error': 'Timeout',
+    };
+  } catch (e, stack) {
+    print(e);
+    print(stack);
+
+    return {
+      'success': false,
+      'statusCode': 500,
+      'error': e.toString(),
+    };
+  }
+}
+// Set your action name, define your arguments and return parameter,
+// and then add the boilerplate code using the `</>` button on the right!

+ 1 - 0
lib/custom_code/actions/index.dart

@@ -1 +1,2 @@
 export 'drupal_login.dart' show drupalLogin;
+export 'drupal_request.dart' show drupalRequest;

+ 8 - 0
lib/flutter_flow/internationalization.dart

@@ -272,6 +272,14 @@ final kTranslationsMap = <Map<String, Map<String, String>>>[
       'nl': 'Delen',
       'en': '',
     },
+    '89l5y9jd': {
+      'nl': 'Alle evenementen',
+      'en': '',
+    },
+    'n73u305o': {
+      'nl': '',
+      'en': '',
+    },
     '4qrjs6hg': {
       'nl': 'Home',
       'en': '',

+ 1 - 0
lib/horecagelegenhedenoverzicht/event_current/event_current_model.dart

@@ -8,6 +8,7 @@ import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
 import 'dart:ui';
+import '/index.dart';
 import 'event_current_widget.dart' show EventCurrentWidget;
 import 'package:aligned_tooltip/aligned_tooltip.dart';
 import 'package:carousel_slider/carousel_slider.dart';

+ 74 - 0
lib/horecagelegenhedenoverzicht/event_current/event_current_widget.dart

@@ -8,6 +8,7 @@ import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import '/shared/drawer_component/drawer_component_widget.dart';
 import 'dart:ui';
+import '/index.dart';
 import 'package:aligned_tooltip/aligned_tooltip.dart';
 import 'package:carousel_slider/carousel_slider.dart';
 import 'package:cached_network_image/cached_network_image.dart';
@@ -104,6 +105,7 @@ class _EventCurrentWidgetState extends State<EventCurrentWidget>
     DebugFlutterFlowModelContext.maybeOf(context)
         ?.parentModelCallback
         ?.call(_model);
+    context.watch<FFAppState>();
 
     return FutureBuilder<ApiCallResponse>(
       future: EvenementCall.call(
@@ -214,6 +216,29 @@ class _EventCurrentWidgetState extends State<EventCurrentWidget>
                             scaffoldKey.currentState!.openDrawer();
                           },
                         ),
+                        Text(
+                          FFLocalizations.of(context).getText(
+                            'n73u305o' /*  */,
+                          ),
+                          style:
+                              FlutterFlowTheme.of(context).bodyMedium.override(
+                                    font: GoogleFonts.inter(
+                                      fontWeight: FlutterFlowTheme.of(context)
+                                          .bodyMedium
+                                          .fontWeight,
+                                      fontStyle: FlutterFlowTheme.of(context)
+                                          .bodyMedium
+                                          .fontStyle,
+                                    ),
+                                    letterSpacing: 0.0,
+                                    fontWeight: FlutterFlowTheme.of(context)
+                                        .bodyMedium
+                                        .fontWeight,
+                                    fontStyle: FlutterFlowTheme.of(context)
+                                        .bodyMedium
+                                        .fontStyle,
+                                  ),
+                        ),
                       ],
                     ),
                   ),
@@ -786,6 +811,55 @@ class _EventCurrentWidgetState extends State<EventCurrentWidget>
                       }),
                     ),
                   ),
+                  FFButtonWidget(
+                    onPressed: () async {
+                      context.pushNamed(
+                        PUitgaanPageWidget.routeName,
+                        queryParameters: {
+                          'plaats': serializeParam(
+                            FFAppState().gemeenteSelectId,
+                            ParamType.String,
+                          ),
+                          'services': serializeParam(
+                            'services_1',
+                            ParamType.String,
+                          ),
+                        }.withoutNulls,
+                      );
+                    },
+                    text: FFLocalizations.of(context).getText(
+                      '89l5y9jd' /* Alle evenementen */,
+                    ),
+                    options: FFButtonOptions(
+                      height: 40.0,
+                      padding:
+                          EdgeInsetsDirectional.fromSTEB(16.0, 0.0, 16.0, 0.0),
+                      iconPadding:
+                          EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0),
+                      color: FlutterFlowTheme.of(context).primary,
+                      textStyle:
+                          FlutterFlowTheme.of(context).titleSmall.override(
+                                font: GoogleFonts.interTight(
+                                  fontWeight: FlutterFlowTheme.of(context)
+                                      .titleSmall
+                                      .fontWeight,
+                                  fontStyle: FlutterFlowTheme.of(context)
+                                      .titleSmall
+                                      .fontStyle,
+                                ),
+                                color: Colors.white,
+                                letterSpacing: 0.0,
+                                fontWeight: FlutterFlowTheme.of(context)
+                                    .titleSmall
+                                    .fontWeight,
+                                fontStyle: FlutterFlowTheme.of(context)
+                                    .titleSmall
+                                    .fontStyle,
+                              ),
+                      elevation: 0.0,
+                      borderRadius: BorderRadius.circular(8.0),
+                    ),
+                  ),
                 ],
               ),
             ),

+ 23 - 1
lib/kanweg/kanweg/kanweg_model.dart

@@ -1,15 +1,27 @@
-import '/backend/api_requests/api_calls.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import 'dart:ui';
+import '/custom_code/actions/index.dart' as actions;
 import 'kanweg_widget.dart' show KanwegWidget;
 import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
 import 'package:flutter_spinkit/flutter_spinkit.dart';
 import 'package:google_fonts/google_fonts.dart';
 import 'package:provider/provider.dart';
 
 class KanwegModel extends FlutterFlowModel<KanwegWidget> {
+  ///  State fields for stateful widgets in this page.
+
+  // Stores action output result for [Custom Action - drupalRequest] action in kanweg widget.
+  dynamic? _resultDrupalRequest;
+  set resultDrupalRequest(dynamic? value) {
+    _resultDrupalRequest = value;
+    debugLogWidgetClass(this);
+  }
+
+  dynamic? get resultDrupalRequest => _resultDrupalRequest;
+
   final Map<String, DebugDataField> debugGeneratorVariables = {};
   final Map<String, DebugDataField> debugBackendQueries = {};
   final Map<String, FlutterFlowModel> widgetBuilderComponents = {};
@@ -23,6 +35,16 @@ class KanwegModel extends FlutterFlowModel<KanwegWidget> {
 
   @override
   WidgetClassDebugData toWidgetClassDebugData() => WidgetClassDebugData(
+        actionOutputs: {
+          'resultDrupalRequest': debugSerializeParam(
+            resultDrupalRequest,
+            ParamType.JSON,
+            link:
+                'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kanweg',
+            name: 'dynamic',
+            nullable: true,
+          )
+        }.entries,
         generatorVariables: debugGeneratorVariables.entries,
         backendQueries: debugBackendQueries.entries,
         componentStates: {

+ 52 - 85
lib/kanweg/kanweg/kanweg_widget.dart

@@ -1,9 +1,10 @@
-import '/backend/api_requests/api_calls.dart';
 import '/flutter_flow/flutter_flow_theme.dart';
 import '/flutter_flow/flutter_flow_util.dart';
 import '/flutter_flow/flutter_flow_widgets.dart';
 import 'dart:ui';
+import '/custom_code/actions/index.dart' as actions;
 import 'package:flutter/material.dart';
+import 'package:flutter/scheduler.dart';
 import 'package:flutter_spinkit/flutter_spinkit.dart';
 import 'package:google_fonts/google_fonts.dart';
 import 'package:provider/provider.dart';
@@ -29,6 +30,18 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
   void initState() {
     super.initState();
     _model = createModel(context, () => KanwegModel());
+
+    // On page load action.
+    SchedulerBinding.instance.addPostFrameCallback((_) async {
+      _model.resultDrupalRequest = await actions.drupalRequest(
+        'GET',
+        'https://uitgaanskrant.com/nl/flutterdrup/views/flutterfavorietenagenda.json?display_id=services_1',
+        'SSESSfb38a72b665678c06dea69b92d0e88c6',
+        'nagC2i49GY6Wd4ENeD4-vKaQhryKcnKGL55orWbI7Dw',
+        'e21ntWRxYs1Q6sUHlA0xlX0nzLMf43UnsFHByfQaRaw',
+        '',
+      );
+    });
   }
 
   @override
@@ -87,7 +100,6 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
     DebugFlutterFlowModelContext.maybeOf(context)
         ?.parentModelCallback
         ?.call(_model);
-    context.watch<FFAppState>();
 
     return GestureDetector(
       onTap: () {
@@ -99,97 +111,52 @@ class _KanwegWidgetState extends State<KanwegWidget> with RouteAware {
         backgroundColor: FlutterFlowTheme.of(context).primaryBackground,
         body: SafeArea(
           top: true,
-          child: FutureBuilder<ApiCallResponse>(
-            future: FavorietenAgendaCall.call(
-              sessionName: FFAppState().userSessionname,
-              sessionId: FFAppState().userSessionid,
-            ),
-            builder: (context, snapshot) {
-              // Customize what your widget looks like when it's loading.
-              if (!snapshot.hasData) {
-                return Center(
-                  child: SizedBox(
-                    width: 80.0,
-                    height: 80.0,
-                    child: SpinKitFadingCircle(
-                      color: Color(0xFFB1061E),
-                      size: 80.0,
-                    ),
-                  ),
-                );
-              }
-              final columnFavorietenAgendaResponse = snapshot.data!;
-              _model.debugBackendQueries[
-                      'FavorietenAgendaCall_statusCode_Column_26my15h6'] =
+          child: Builder(
+            builder: (context) {
+              final item = getJsonField(
+                _model.resultDrupalRequest,
+                r'''$''',
+              ).toList();
+              _model.debugGeneratorVariables[
+                      'item${item.length > 100 ? ' (first 100)' : ''}'] =
                   debugSerializeParam(
-                columnFavorietenAgendaResponse.statusCode,
-                ParamType.int,
+                item.take(100),
+                ParamType.JSON,
+                isList: true,
                 link:
                     'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kanweg',
-                name: 'int',
-                nullable: false,
-              );
-              _model.debugBackendQueries[
-                      'FavorietenAgendaCall_responseBody_Column_26my15h6'] =
-                  debugSerializeParam(
-                columnFavorietenAgendaResponse.bodyText,
-                ParamType.String,
-                link:
-                    'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kanweg',
-                name: 'String',
+                name: 'dynamic',
                 nullable: false,
               );
               debugLogWidgetClass(_model);
 
-              return Builder(
-                builder: (context) {
-                  final items = getJsonField(
-                    columnFavorietenAgendaResponse.jsonBody,
-                    r'''$''',
-                  ).toList();
-                  _model.debugGeneratorVariables[
-                          'items${items.length > 100 ? ' (first 100)' : ''}'] =
-                      debugSerializeParam(
-                    items.take(100),
-                    ParamType.JSON,
-                    isList: true,
-                    link:
-                        'https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&page=kanweg',
-                    name: 'dynamic',
-                    nullable: false,
-                  );
-                  debugLogWidgetClass(_model);
-
-                  return Column(
-                    mainAxisSize: MainAxisSize.max,
-                    children: List.generate(items.length, (itemsIndex) {
-                      final itemsItem = items[itemsIndex];
-                      return Text(
-                        getJsonField(
-                          itemsItem,
-                          r'''$.title''',
-                        ).toString(),
-                        style: FlutterFlowTheme.of(context).bodyMedium.override(
-                              font: GoogleFonts.inter(
-                                fontWeight: FlutterFlowTheme.of(context)
-                                    .bodyMedium
-                                    .fontWeight,
-                                fontStyle: FlutterFlowTheme.of(context)
-                                    .bodyMedium
-                                    .fontStyle,
-                              ),
-                              letterSpacing: 0.0,
-                              fontWeight: FlutterFlowTheme.of(context)
-                                  .bodyMedium
-                                  .fontWeight,
-                              fontStyle: FlutterFlowTheme.of(context)
-                                  .bodyMedium
-                                  .fontStyle,
-                            ),
-                      );
-                    }),
+              return Column(
+                mainAxisSize: MainAxisSize.max,
+                children: List.generate(item.length, (itemIndex) {
+                  final itemItem = item[itemIndex];
+                  return Text(
+                    getJsonField(
+                      itemItem,
+                      r'''$.datum''',
+                    ).toString(),
+                    style: FlutterFlowTheme.of(context).bodyMedium.override(
+                          font: GoogleFonts.inter(
+                            fontWeight: FlutterFlowTheme.of(context)
+                                .bodyMedium
+                                .fontWeight,
+                            fontStyle: FlutterFlowTheme.of(context)
+                                .bodyMedium
+                                .fontStyle,
+                          ),
+                          letterSpacing: 0.0,
+                          fontWeight: FlutterFlowTheme.of(context)
+                              .bodyMedium
+                              .fontWeight,
+                          fontStyle:
+                              FlutterFlowTheme.of(context).bodyMedium.fontStyle,
+                        ),
                   );
-                },
+                }),
               );
             },
           ),

+ 1 - 0
lib/selecteer_plaats/select_state_drop_down_component/select_state_drop_down_component_model.dart

@@ -8,6 +8,7 @@ import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import 'dart:convert';
 import 'dart:ui';
+import '/flutter_flow/custom_functions.dart' as functions;
 import '/index.dart';
 import 'select_state_drop_down_component_widget.dart'
     show SelectStateDropDownComponentWidget;

+ 8 - 0
lib/selecteer_plaats/select_state_drop_down_component/select_state_drop_down_component_widget.dart

@@ -8,6 +8,7 @@ import '/flutter_flow/flutter_flow_widgets.dart';
 import '/flutter_flow/form_field_controller.dart';
 import 'dart:convert';
 import 'dart:ui';
+import '/flutter_flow/custom_functions.dart' as functions;
 import '/index.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/scheduler.dart';
@@ -201,6 +202,10 @@ class _SelectStateDropDownComponentWidgetState
                 // provincieidselect
                 // Action 2 update appstate provincie select
                 FFAppState().provincieSelectId = _model.dropDownProvincieValue!;
+                FFAppState().provincieSelectName = functions.provincieNaamById(
+                    FFAppState().provincielijst.toList(),
+                    FFAppState().provincieSelectId)!;
+                safeSetState(() {});
                 _model.apiGemeenteResultbutton = await GemeentenCall.call(
                   provincieid: FFAppState().provincieSelectId,
                 );
@@ -279,6 +284,9 @@ class _SelectStateDropDownComponentWidgetState
               onChanged: (val) async {
                 safeSetState(() => _model.dropDownGemeenteValue = val);
                 FFAppState().gemeenteSelectId = _model.dropDownGemeenteValue!;
+                FFAppState().gemeenteSelectNaam = functions.gemeenteNaamById(
+                    FFAppState().gemeentelijst.toList(),
+                    FFAppState().gemeenteSelectId)!;
                 safeSetState(() {});
               },
               width: 200.0,