From cb4525a774965b2395ea4ef48230d9ebed62f6d1 Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Tue, 14 Nov 2023 11:38:44 +0100 Subject: [PATCH] 1. Import --- .gitignore | 44 + .metadata | 33 + README.md | 16 + analysis_options.yaml | 29 + android/.gitignore | 13 + android/app/build.gradle | 72 + android/app/src/debug/AndroidManifest.xml | 8 + android/app/src/main/AndroidManifest.xml | 34 + .../de/assecutor/stadtbote/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 8 + android/build.gradle | 31 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle | 11 + assets/abmelden.png | Bin 0 -> 694 bytes assets/anfahrtsbereich.png | Bin 0 -> 1151 bytes assets/angenommene_auftraege.png | Bin 0 -> 1119 bytes assets/anmelden.png | Bin 0 -> 683 bytes assets/back_white.png | Bin 0 -> 5646 bytes assets/bus.png | Bin 0 -> 767 bytes assets/compass.png | Bin 0 -> 4913 bytes assets/erledigte_auftraege.png | Bin 0 -> 988 bytes assets/fahrrad.png | Bin 0 -> 1454 bytes assets/foto_aufnehmen.png | Bin 0 -> 1211 bytes assets/getrennt.png | Bin 0 -> 1677 bytes assets/grbus.png | Bin 0 -> 993 bytes assets/hamburger.png | Bin 0 -> 1986 bytes assets/help.png | Bin 0 -> 4926 bytes assets/image_back.png | Bin 0 -> 24607 bytes assets/image_forward.png | Bin 0 -> 10307 bytes assets/job.json | 343 +++ assets/kasten.png | Bin 0 -> 874 bytes assets/kombi.png | Bin 0 -> 793 bytes assets/lkw.png | Bin 0 -> 894 bytes assets/lkw_10.png | Bin 0 -> 1714 bytes assets/lkw_12.png | Bin 0 -> 1772 bytes assets/lkw_15.png | Bin 0 -> 1740 bytes assets/lkw_20.png | Bin 0 -> 2188 bytes assets/lkw_25.png | Bin 0 -> 2222 bytes assets/lkw_8.png | Bin 0 -> 1895 bytes assets/marker_destination.png | Bin 0 -> 4159 bytes assets/mein_bus.png | Bin 0 -> 1014 bytes assets/mein_fahrrad.png | Bin 0 -> 2504 bytes assets/mein_grbus.png | Bin 0 -> 1458 bytes assets/mein_kasten.png | Bin 0 -> 1170 bytes assets/mein_kombi.png | Bin 0 -> 1124 bytes assets/mein_lkw.png | Bin 0 -> 1144 bytes assets/mein_lkw_10.png | Bin 0 -> 1995 bytes assets/mein_lkw_12.png | Bin 0 -> 2034 bytes assets/mein_lkw_15.png | Bin 0 -> 1999 bytes assets/mein_lkw_20.png | Bin 0 -> 2504 bytes assets/mein_lkw_25.png | Bin 0 -> 2530 bytes assets/mein_lkw_8.png | Bin 0 -> 2316 bytes assets/mein_pkw.png | Bin 0 -> 1316 bytes assets/mein_service.png | Bin 0 -> 2256 bytes assets/mein_unbekannt.png | Bin 0 -> 2143 bytes assets/muelleimer.png | Bin 0 -> 13571 bytes assets/nachrichten.png | Bin 0 -> 620 bytes assets/neues_foto.png | Bin 0 -> 39136 bytes assets/ok.png | Bin 0 -> 10584 bytes assets/pkw.png | Bin 0 -> 880 bytes assets/sb_logo.png | Bin 0 -> 30804 bytes assets/sb_logo_signet.png | Bin 0 -> 30804 bytes assets/sb_logo_transparent.png | Bin 0 -> 87574 bytes assets/service.png | Bin 0 -> 1409 bytes assets/unbekannt.png | Bin 0 -> 1370 bytes assets/verbunden.png | Bin 0 -> 1450 bytes assets/zugewiesene_auftraege.png | Bin 0 -> 1162 bytes ios/.gitignore | 34 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 2 + ios/Podfile | 41 + ios/Podfile.lock | 131 + ios/Runner.xcodeproj/project.pbxproj | 554 +++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 51 + ios/Runner/Runner-Bridging-Header.h | 1 + lib/content_views/accepted_jobs_page.dart | 136 ++ lib/content_views/assigned_jobs_page.dart | 69 + lib/content_views/finished_jobs_page.dart | 69 + lib/content_views/main_page.dart | 142 ++ lib/content_views/task_list_page.dart | 169 ++ lib/content_views/tour_details_page.dart | 148 ++ lib/content_views/tour_list_page.dart | 170 ++ .../utils/content_view_widget.dart | 13 + lib/content_views/utils/header_info.dart | 11 + lib/content_views/utils/widget_stack.dart | 17 + lib/main.dart | 335 +++ lib/model/bootstrap_request.dart | 22 + lib/model/bootstrap_request.g.dart | 23 + lib/model/bootstrap_response_config.dart | 21 + lib/model/bootstrap_response_config.g.dart | 21 + lib/model/bootstrap_response_payload.dart | 19 + lib/model/bootstrap_response_payload.g.dart | 19 + lib/model/bootstrap_response_topics.dart | 22 + lib/model/bootstrap_response_topics.g.dart | 20 + lib/model/device_object.dart | 18 + lib/model/device_object.g.dart | 21 + lib/model/job.dart | 49 + lib/model/job.g.dart | 1474 +++++++++++ lib/model/job_tour.dart | 30 + lib/model/job_tour.g.dart | 1679 +++++++++++++ lib/model/short_poll.dart | 104 + lib/model/short_poll.g.dart | 2162 +++++++++++++++++ lib/model/short_poll_question.dart | 35 + lib/model/short_poll_question.g.dart | 342 +++ lib/model/status.dart | 31 + lib/model/status.g.dart | 1226 ++++++++++ lib/model/task_info.dart | 22 + lib/model/task_info.g.dart | 752 ++++++ lib/model/tour_position.dart | 18 + lib/model/tour_position.g.dart | 224 ++ lib/model/tour_task.dart | 32 + lib/model/tour_task.g.dart | 1151 +++++++++ lib/popups/infos_popup.dart | 56 + lib/popups/map_popup.dart | 198 ++ lib/tools/colored_safe_area.dart | 18 + lib/tools/connection_status.dart | 10 + lib/tools/constants.dart | 11 + lib/tools/mqtt_core.dart | 214 ++ lib/tools/page_base.dart | 5 + lib/tools/util.dart | 178 ++ pubspec.lock | 1186 +++++++++ pubspec.yaml | 122 + test/widget_test.dart | 30 + 165 files changed, 14763 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/de/assecutor/stadtbote/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/abmelden.png create mode 100644 assets/anfahrtsbereich.png create mode 100644 assets/angenommene_auftraege.png create mode 100644 assets/anmelden.png create mode 100644 assets/back_white.png create mode 100644 assets/bus.png create mode 100644 assets/compass.png create mode 100644 assets/erledigte_auftraege.png create mode 100644 assets/fahrrad.png create mode 100644 assets/foto_aufnehmen.png create mode 100644 assets/getrennt.png create mode 100644 assets/grbus.png create mode 100644 assets/hamburger.png create mode 100644 assets/help.png create mode 100644 assets/image_back.png create mode 100644 assets/image_forward.png create mode 100644 assets/job.json create mode 100644 assets/kasten.png create mode 100644 assets/kombi.png create mode 100644 assets/lkw.png create mode 100644 assets/lkw_10.png create mode 100644 assets/lkw_12.png create mode 100644 assets/lkw_15.png create mode 100644 assets/lkw_20.png create mode 100644 assets/lkw_25.png create mode 100644 assets/lkw_8.png create mode 100644 assets/marker_destination.png create mode 100644 assets/mein_bus.png create mode 100644 assets/mein_fahrrad.png create mode 100644 assets/mein_grbus.png create mode 100644 assets/mein_kasten.png create mode 100644 assets/mein_kombi.png create mode 100644 assets/mein_lkw.png create mode 100644 assets/mein_lkw_10.png create mode 100644 assets/mein_lkw_12.png create mode 100644 assets/mein_lkw_15.png create mode 100644 assets/mein_lkw_20.png create mode 100644 assets/mein_lkw_25.png create mode 100644 assets/mein_lkw_8.png create mode 100644 assets/mein_pkw.png create mode 100644 assets/mein_service.png create mode 100644 assets/mein_unbekannt.png create mode 100644 assets/muelleimer.png create mode 100644 assets/nachrichten.png create mode 100644 assets/neues_foto.png create mode 100644 assets/ok.png create mode 100644 assets/pkw.png create mode 100644 assets/sb_logo.png create mode 100644 assets/sb_logo_signet.png create mode 100644 assets/sb_logo_transparent.png create mode 100644 assets/service.png create mode 100644 assets/unbekannt.png create mode 100644 assets/verbunden.png create mode 100644 assets/zugewiesene_auftraege.png create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lib/content_views/accepted_jobs_page.dart create mode 100644 lib/content_views/assigned_jobs_page.dart create mode 100644 lib/content_views/finished_jobs_page.dart create mode 100644 lib/content_views/main_page.dart create mode 100644 lib/content_views/task_list_page.dart create mode 100644 lib/content_views/tour_details_page.dart create mode 100644 lib/content_views/tour_list_page.dart create mode 100644 lib/content_views/utils/content_view_widget.dart create mode 100644 lib/content_views/utils/header_info.dart create mode 100644 lib/content_views/utils/widget_stack.dart create mode 100644 lib/main.dart create mode 100644 lib/model/bootstrap_request.dart create mode 100644 lib/model/bootstrap_request.g.dart create mode 100644 lib/model/bootstrap_response_config.dart create mode 100644 lib/model/bootstrap_response_config.g.dart create mode 100644 lib/model/bootstrap_response_payload.dart create mode 100644 lib/model/bootstrap_response_payload.g.dart create mode 100644 lib/model/bootstrap_response_topics.dart create mode 100644 lib/model/bootstrap_response_topics.g.dart create mode 100644 lib/model/device_object.dart create mode 100644 lib/model/device_object.g.dart create mode 100644 lib/model/job.dart create mode 100644 lib/model/job.g.dart create mode 100644 lib/model/job_tour.dart create mode 100644 lib/model/job_tour.g.dart create mode 100644 lib/model/short_poll.dart create mode 100644 lib/model/short_poll.g.dart create mode 100644 lib/model/short_poll_question.dart create mode 100644 lib/model/short_poll_question.g.dart create mode 100644 lib/model/status.dart create mode 100644 lib/model/status.g.dart create mode 100644 lib/model/task_info.dart create mode 100644 lib/model/task_info.g.dart create mode 100644 lib/model/tour_position.dart create mode 100644 lib/model/tour_position.g.dart create mode 100644 lib/model/tour_task.dart create mode 100644 lib/model/tour_task.g.dart create mode 100644 lib/popups/infos_popup.dart create mode 100644 lib/popups/map_popup.dart create mode 100644 lib/tools/colored_safe_area.dart create mode 100644 lib/tools/connection_status.dart create mode 100644 lib/tools/constants.dart create mode 100644 lib/tools/mqtt_core.dart create mode 100644 lib/tools/page_base.dart create mode 100644 lib/tools/util.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24476c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..397befc --- /dev/null +++ b/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + - platform: android + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + - platform: ios + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..fb5bc28 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# stadtbote + +Stadtbote + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..6f3f455 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,72 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "de.assecutor.stadtbote" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + minSdkVersion 28 + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..94667a6 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7aab44d --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/de/assecutor/stadtbote/MainActivity.kt b/android/app/src/main/kotlin/de/assecutor/stadtbote/MainActivity.kt new file mode 100644 index 0000000..a3d9211 --- /dev/null +++ b/android/app/src/main/kotlin/de/assecutor/stadtbote/MainActivity.kt @@ -0,0 +1,5 @@ +package de.assecutor.stadtbote + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..94667a6 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..58a8c74 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.2.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3c472b9 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/assets/abmelden.png b/assets/abmelden.png new file mode 100644 index 0000000000000000000000000000000000000000..422b10cb723ebb54901c080f4372e0ace8f0756e GIT binary patch literal 694 zcmeAS@N?(olHy`uVBq!ia0vp^9zYzx!3HFEWf*S+Qk(@Ik;M!Q)_fq$cxKzeW}u*C ziEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}C&YmugAr*7p-f{F}aujg5 z$gh-hrJ3WNlmDXff|cIpQk`z^m0qcSVX0zPENnh_l);f@)y#D>=e=7wzvRw@Q&+g1 z1(ZMRS6;xshgmrxXruA0xZAoHq6`1FUS*VPkZ)BzWtIFuE<^mm$K`we|9?P z(JvZt>HD3Pt9`7M*4@s!E6E(2Dn0AK%`fS1-ZCt|G{plNDFKr+(uRGEz`v7V;8&;Z?oh zi(^QRZ-ASZpogetsDkN|DUBf$g4jQ~tzw=a9u(V9qA|L=AUUBS#er!OBc})37Dmlu_P?iGwOsOZ=9aYk3EOY%Dt@@j zLALRk1)Iu)9Xb!9U$pKmh!Ojs`{h!cg&y}0v8qCSndz)G+ec15+A`9_C2R5DLhfQ_397^yyHfse!6O{+y?cnv5$S z=xq3+GU^W} zC;e*u>Rp{6{Nsw8)CT^yjlKyBY)umUU3uP4tUWsK%g%tS=Orvcw#_V$Z)C0YkB?1V zX!aqdQT6jY#tp02Z3>zF=Cxh&uDi!l&d)hiDE6Ak{DAb$=!Od%r_(L=Zp-GXIXm+! Z_qz12^UDuy5(K6>22WQ%mvv4FO#qgnA|(I- literal 0 HcmV?d00001 diff --git a/assets/anfahrtsbereich.png b/assets/anfahrtsbereich.png new file mode 100644 index 0000000000000000000000000000000000000000..3499ef88abd8a51c8282502f49d6bfe3a10b861d GIT binary patch literal 1151 zcmV-_1c3XAP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11Pn<; zK~#90?VL@BjZqlKf7gsynCq)B!sH|QYA9J~KAMHFu#tq3#l)JOQi>f524yj08e?N6 zlBO^zC9<#~gpGyLC}V1n)VXY<~-=i}eG&pq!s=e^+0 z9N;wY3it&SYs|g^kAZGrMvA(F&*m*|TkZO?#4L7mE`8+|c+ zS&yJjW%C?;A$-|WL7mEC74QdrA$-{%V1<}kF(mz(9s)8k*WXTFuO)jIQ%45ao1j5O zBnf=ba{ZQcA_2H#xxPPW7E@@&{?*!`l~e_6MX62LIA=-djYcv;d?dc66TSl4T0{mo zVEL>T+e5@%%k|)GqK*1$4-p;M+r;vaiCncLQp@cD%r|zFz-{7R8i6mCB+i6N!Xy1C zKXmM}Bv9+^A!0YmZQ_O{fm&}55i@~tl-k5>V8Rmotnc7~nFp)}b^s@VVc?PPp!=}5 zhmF32R{>4F1Kg&*+k+}u>{~(gFnds^hx(p9s58QJd+^30Ajfoj@Wyeb+k;oCZQm`A zeX+mhXra3H-SWU;uN4R86#Al0wWEH^4bN-zMUCu|=UP?J7B#X*RLMyjX|#nc0%O1u z--T+SEp8EWJgaWe7Wbb25_NGEA_oir?U-e~Cd?+{AZBV+j<`8stx$fE{lq-p_fjPf zNv=Jzy@Zbr;G3hbsdh~$Kbz%&E0|pjHC#qnDRCn@NjH*z1Iq;RbFmQ=MNUd?Ace2% z4*nv$DU_e9T~1MlC`pO6rSN4t*b!$PLixE`4p^U}7T5R{JIJO;ChOp@NV+vINoTQ1!Fk+%kh*|^gTG;yq$;3P>=(lRM0#)o=3H%OiF>**XDVF$X>Ov9Xasfr1J@EUh5#RT~XED-ePY#Q_6 z?}6ie2KHc%tf~-t1kVbT? zf`(?hLd=NZ>%kcuhPf~WU@>MF+6SfT`9ZoJnk0XaFbyo{ELiAyrQ`qzJ(#NR586EQ zDRjX9P2dL_LDNpNsy#oO<$!e_;wNHzF*?pPR-~i^?hT!IM4w}V#mRd^BO&fX6pv12 zfe#4@7ANmXJH?Tp(zeix^5H))!u1i~F2*N6(-4=Ke3I-3=Dm{(ly_80l)oc#D*LB0 R#^?Y5002ovPDHLkV1iHj7(f63 literal 0 HcmV?d00001 diff --git a/assets/angenommene_auftraege.png b/assets/angenommene_auftraege.png new file mode 100644 index 0000000000000000000000000000000000000000..a885dc02cedfd9431e44c7fd25309d025e1daaef GIT binary patch literal 1119 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

8jxopNLgOd-wtusGoej zn{`f9n87;DPpdjlac+=VFF^X&XkyKZP+yRZJ?CLSAhIp*z__HU$;)hyy0&Od!F)4A@wzValm8eYRp RVA^G1@O1TaS?83{1OUMJQ(yo9 literal 0 HcmV?d00001 diff --git a/assets/compass.png b/assets/compass.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab27e70b5b61211f32d07dc548d3f409980a41a GIT binary patch literal 4913 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 literal 0 HcmV?d00001 diff --git a/assets/erledigte_auftraege.png b/assets/erledigte_auftraege.png new file mode 100644 index 0000000000000000000000000000000000000000..8beee334aa184eb5527cab8fcafecea0bda9b1d0 GIT binary patch literal 988 zcmV<210(#2P)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H118GS_ zK~#90?VK@B6hRb#KM?H1h(?Y7KuG)z7Frn^Lnv%D{sl_Ljz*Nw7#kA{e}p#v2E{@x zH8D{GiIQjla~69W&tq@*&Ai!tb9eJ4ui@s+d;2kaJGTcrgDqEpJHU0|8gRb<^Y6eL z;5G09_+rpo(p(0f1BXDbAr66Oz$KGT6J!P0r&-)^>;bn7`b~=az#shOm2nK*?Y!$m zSfLOQDzA(qrf?-*0KTG^SH?HsVy8!7%v0jYE8|J0M_|ZB;1}@){-(H^C&x1I2-pP< zh=1T!@d;Q3&h+Cp@S&sH2mNE+0+ux5P6Io{d87B0w^-57BJjE6UXFonU_M0NtB#v3 zW3{HQHKU$h;wf>*sL>w9DLaa@hJ8Jj%3G%U({?Zx5*2s^Ty2s!3)}-vH4SW$8#S-p z?5vBE%u%>$)NP_3I@wOctml3sjN?D#-$sWPwVuKqYe#=4jeyO*DB0D#-$sWPwVu zKqXnAk}Ob3jBU)h2y?W_ew&lW5V#j%jyBQkQ=Mc`(_L9@zIBB5zahvK3DD+SM@au- zc@hEIeCzP--%FlEfHvPceERp6ClR2{w+?ClLGmO5wE5N{=|5OrjBQM-`>YOl(2pQu zd@nrJ6U8ne;Wz+YV)NuH%{tX0! zrUgfUJOl%$0Y{)b1cN6Xhe95Lgp_gAd_oZBtK=a_N)^Y@mO_yqEDu3qia18>%M|%R z@(?7ahGTTE5{Y&B-trJkkP?pOe(NMk^1b9Cm?RY(@&m7u=#wv&hhU;qSjSJmphV}H zE0%{~vXpT6iEx2AUW}7K@L!3ot-O+P6A0}{43dXn;#7$#F<2gg$x|kVM3p?SeejOD zd2|wE)Mr=GfF@jw=KDCy`db0TQ&@S!_^iaJ^_S@O@pmp}^FuhR`rCrSsmm*I7WL;T z9(y_N@=BaV{dtPVULI8xA18Sw&Z_JA literal 0 HcmV?d00001 diff --git a/assets/fahrrad.png b/assets/fahrrad.png new file mode 100644 index 0000000000000000000000000000000000000000..4bfaf019dbe2f8efbcac266871b16e87796c33b1 GIT binary patch literal 1454 zcmV;f1yTBmP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11v^PZ zK~#90<(pe*Ttyhif7zJSBtlKphbB@Zy(1r@y1A}W^N@WFePQn4>8z6dHpZM_6h zv{t2v4~i8ZM6g&b2)4Dhrdn?;SRcH^d!rR&t!y+k?XC~Ahi+zP&Y78W=FIN)5A$%& zeEa|Y=i4(g-&_tf9tyxx-~*soDcgZtD|JUT+JQHLvZkyD+JdR813Za7I8k{ln7Y8| z0S=NJpb6mkteiGdo4o|l#F8)#xHK!LjTE46PqwjWqyYV7Vf&*u6?Keu;5U-{pi!E5 zBratU;;0($3F4Uvh1aL>z!dkK>bU+6p`MXk6 ze*m}u_`2#|KX3~$yK=n?SVt4~J)OWNlAFyZG}eHU2~2|%mE~b%hCwH=8S~(jfid93 z5MuL27qA7p;6&y50D5yp7w{f#!6^fW5gm3@q6^rHdvKb%!=4W8AboJ6a$COg{bD-s z5pIDfYVQ9|h7;0|NE4hDz*Rs=Q~z9!&*25#i2lMQI4i4o)@p1H0apM62Bq$BEbe{I zDv7HL_{xzhDs_i@aeI)5HGCHWla8Eq8K6DbKg1&moGTqT>o!3DV)p<;2AszLJ1u$Z zHbA48i(hNOdm1oq!JRrlzSe_Y1#U959RrpD8w~AF!G2rkGfR8#n1$UxT>_p(jDANA z<^z9W*A#XGXNC|P3jM_IrK`#~O*Ypu!F=Fb>;m;#5Tyap4&04?0$P{Dv&|^hgLo4z zLNuKdD)+~L9}rWEjliD?JOjWQU_r+E;&e^`zgEgl;2mJU1Gf_M5KE*css1Elt@&yL z-bKK734A_vZbHA+WQ5tITOQp43?}&K03Jf0dFP>Xvw_YUEQt|qQ~tp$VZ2lG`@D3H zW3gquDuJws$X7O2%5LI2-V#&ScT`xe`E8aucM+ewmVgHnd~$mX!3IRfs>*gdfQ7)@ zF~5(?ZEORSM&|-Vz;wS~rgJ)n+QS27L`Q0KV(T)*s3!9qM4S>+!6rai>6{az^J3Y! z75GwNJdE3J=1Hhm6u+qWl3^MkA3BE>e0yY_s#kWz(P@Mp#EA@(SJ*T_dFosm8MFZ3 zOO=O!vr{;YaBhW5ZVGY&Xc8cwItLXxMtD)`TnY)k^=TjxtEodrZj zE903A9Y3wOx7dNlx6ajydkX=!F*R!6Wau=)h~#6dRB!SI<)KqAJ5#?H>1D4~|ErYnOfX5IScRs69$@*n{Iq=~|TwB_V{)&I0habaRFW z$Gy_^0SAsCItz%rq#Cn4I6h0dmVKHa51n#OH3DL&tnRr>z|0Jt_ES4L$wU7%L?0uU zYJ|}F6u{+*3f&D;8m=219>SN--WZ+Q^=aK##YMycr?^pLCZa>ut@}PYo ze7xFNUYBVFUI(s;aqu}}WiU$h`+##e@@bL^ZvfYkUH0p$a}cpcrNesQS`u`&knXsf zT-M+=wMas6o!0}uq;U8%;@|L%pgKE&`w%DFO&#t-oO11Ob(*8jdy;gT9u88dBKTo$$Tz(rvumAu607*qo IM6N<$f?c?pga7~l literal 0 HcmV?d00001 diff --git a/assets/foto_aufnehmen.png b/assets/foto_aufnehmen.png new file mode 100644 index 0000000000000000000000000000000000000000..44a8147f91409c8ac7c55ce454fd9ef3df6c7c8f GIT binary patch literal 1211 zcmV;s1VsCZP)iae>0`CVdEn~tC0{ApNp1Qi;ZfkdzOMIwM1-YBW#F9LmF&^knV&^ z7R|h*{i=7C*O7RNTnhC-tfNZQ2abrS z3m6e~0V86D>i_~2fk(hS;0f>=_<&l6f*Rx&0V{x3U=y%`gmeIxv-uI=Akb7r+|9rt z;GN?foREG3b}`MOyb3e|dw|c5a*3VrGBC%2a8ofCxZ)t6*oek~own4ffZYLCO$qoN z*kVy69ohrVnh_2 zK45W3pI3!*6m$Fqm}i(|6VQ*^bI|!M0t3JjL*H|do#Kc&-es6z7pkNd*8dpLX~?lx zFi#PuBbZH+4-jn^un6=R@MMr%v4}W5XpmG_MDZqzXwnl83FT_tVFCTxwwdZ~+ke>@ zs@PBoi;>y$w(ju0CJ}%O0=(x8cpnPzT6cIOZJKMI*d~<_@QtQja#`1|X@6~-P(r|un)YP^oMkN4wCiFE4G97Bn)U?(oMq@n z|D0{YMC>V8#6;YL5(4T@IeZY{H1$2(Hlc)o3pMR;1vpK8>tYKH2?3XD+6M(V%ebLw zUtyb2LcsN!_G_pmm2DJ&>zZrY1bD5l2p$-4o)_TlH{g9Fz-!%M5&e>?2~_~F#rX~W z^Q{GeVuHjioCbDit{Dxku`%tK2z==#$=eZ{w%P81B~qPPdAlHsIw|z&=fy5y*{)(fI)}l0JNB zWqXf0F%b5|6~W&eMs9^+WJ!6|YXY?$I?V6a97g%`HHT(Yt+5UDnnNoI*pf(!fZoFS zf6#Z-1&oNgfDw^KV6*u@!dMzr{H&uojHH3vuA}f6w^FE|GkS{5k+WJx5m;OP(udm> ziI3JhS;=wOpXZ38wjh ZqF+b-&52`{HF5v|002ovPDHLkV1f%5B`W{` literal 0 HcmV?d00001 diff --git a/assets/getrennt.png b/assets/getrennt.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba8e2aa1a66bf80f6cbc5b3915eeb39530c55fd GIT binary patch literal 1677 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 NJYD@<);T3K0RTcYv(f+n literal 0 HcmV?d00001 diff --git a/assets/hamburger.png b/assets/hamburger.png new file mode 100644 index 0000000000000000000000000000000000000000..07e3642a9d6462d5c9a2e7a8c0a6a8691b81493b GIT binary patch literal 1986 zcmah~Yfuwc6kgDZ2Bo%YX&t95ON;nOHVFjHHXDQ_LTrK|i3O^tA=!|XB)d%(2~i8h z5i33hm?}!~#W)>0LV2iz)hZYfb>vYWgX5#cio;ZE)sA(rDzMr9|(c62rA(5(c$I{X?~44i;OU*EfhmJEfhVJz)M>U z!6O`je6MzK8R%CTtJVK)ZnM3VhLcgO1VRjo`ch0UHgM|mXady|PAbP?Bor$NI}_nm zg4G4nkS@ZSCMRu#-3ipi5rJ^-ztHs8p)$%!Idq_{2;k;*VztARHbWMXN}3pppUn@b z2z%BDgpJOc! z%1l}T=F}!8z)FQIRv?azeDBuecRAodp zASkLdr?hL9JZ19fIP){kq*ESG=G&jh)>hPO%oj9eZBc7G+M}uY9h)w%T3A-wxU;IY zt?rHdfW<`Z#w|rhb}q4sZ2C;prm7m`-5qJcDD8X zAnMZVlv8A`o5g!KtJG>uxAb0heXqJHWB;@7^J_mBkWreHS&|ydkr|RmNyCa2u~cwV z)a}Pr55BEmSRTyjx$5@(68g0+B>zfHVnjGC8n;T|Tz|u| z3nlFxs*kOq)JZsDJG`{*y$|IDOUDo)KdQs<#wykE=IwE38*j}NX4mXJATN%Il%}Na zb8D++y0!C*L`VP5f4ZW2U`_I)B3O^7cQ2lP$r>L{rSD$9ZPDDo{)i>F7W{QCi2s1+ zKE5yKuB>-VWyZFHts#|E!f$Kex!kKb%e|*v(+ z!hbD$xH-5-*pStErQz^8@WU8KC#5?fD0mY41V9y)?}7?NDdq8cSLN^58$vwr2 zPn)BYc_Hg6x?2Xic4TLIQiEEqP4)h8d_(>I-aA3=`vV(L55A@M@WF2`zPb4EvGyYV zqmolS7geL{@>jprEt=hWt-0xZUBR*fI&kdt;ls+n-~*G+l$_jCWyi-qnRw#K`yYio zk1RU0B*W#~U=McsgyNZdnpHYa&^L;n5!h6?v0`&e?Tsq)vQHld6i0^@=tgpa)$sN4 z3S1brM-*Pu+0z;@7;|Vsu^_CV`)Wt3XZG`5*E!}hs|#+n2i^Dz@{EHk{lm@{&)w0& pTm0(k#J*8qE??6(YFN_qw#*6Nx_m)J(IGv%s#GM)ze`wN_z$ksxK;oF literal 0 HcmV?d00001 diff --git a/assets/help.png b/assets/help.png new file mode 100644 index 0000000000000000000000000000000000000000..c040b679fe6fa46c2f8e7a6d7bdc85a937c630ce GIT binary patch literal 4926 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 literal 0 HcmV?d00001 diff --git a/assets/image_back.png b/assets/image_back.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec2f2765df9fa5b167595142e55ead7eba053eb GIT binary patch literal 24607 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

dg(?u-rq9`H8HqJK|mx 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 X$~>Nh&ctL_ILgdZ!S;! literal 0 HcmV?d00001 diff --git a/assets/image_forward.png b/assets/image_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..9512e23949dc078e81e4a6c36d7678bb9da77cce GIT binary patch literal 10307 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 UN;ubfS0I&+rh!I1`fk+!0mE23M*si- literal 0 HcmV?d00001 diff --git a/assets/job.json b/assets/job.json new file mode 100644 index 0000000..6850fc4 --- /dev/null +++ b/assets/job.json @@ -0,0 +1,343 @@ +{ + "recv": "sb", + "id": "0", + "payload": { + "jobs": [ + { + "id": 21084648, + "ver": 1685440133, + "state": 1, + "ordertime": "2023-05-30T07:51Z", + "offs_warn": 15, + "global": false, + "vht_id": 3, + "rem": [ + "Fuhrlohn: 41,70 EUR", + "Filter: SK", + "-------------------", + "30625 Hannover", + "30161 Hannover", + "30625 Hannover", + "30161 Hannover" + ], + "tours": [ + { + "id": 19002821, + "sort": 1, + "state": 1, + "mode": "pu", + "comp": "GHOTEL", + "person": "", + "phone": "040 000000", + "street": "Lathusenstr. 35", + "city": "30625 Hannover", + "com": "", + "pos": { + "lat": 52.3799, + "long": 9.79572 + }, + "rem": [], + "tasks": [ + { + "s_id": 1900282100, + "type": 3, + "topic": "Ankunft bestätigen", + "rt": true, + "track": true + }, + { + "s_id": 1900282101, + "type": 9, + "topic": "Kommissionsnummer", + "opt": true, + "reenter": true + }, + { + "s_id": 1900282102, + "type": 5, + "topic": "Barcodes scannen", + "opt": true, + "reenter": true, + "min": 0, + "max": 4, + "max_len": 30 + }, + { + "s_id": 1900282103, + "type": 4, + "topic": "Fotos", + "opt": false, + "reenter": false, + "min": 1, + "max": 3 + }, + { + "s_id": 1900282104, + "type": 3, + "topic": "Arbeit fertig", + "track": true + }, + { + "s_id": 1900282105, + "type": 8, + "topic": "Hinweis zur Station", + "opt": true, + "reenter": true + }, + { + "s_id": 1900282106, + "type": 7, + "topic": "Quittungsgeber" + }, + { + "s_id": 1900282107, + "type": 2, + "topic": "Unterschrift", + "txt": [ + "%comp% / %person%", + "%street%, %city%", + "Komm-#: %com%", + "Servicezeit: %service_time%", + "Quittungsgeber: %task_val#1900282106%" + ], + "term": true, + "task_arrival": 1900282100, + "task_fin_work": 1900282104 + } + ] + }, + { + "id": 19002822, + "sort": 2, + "state": 1, + "mode": "pu/del", + "comp": "KURS-Institut fuer betriebliche", + "person": "Herr Rosenthal 51516525", + "phone": "05115151650", + "street": "Roscherstr. 13a", + "city": "30161 Hannover", + "com": "", + "pos": { + "lat": 52.3775, + "long": 9.7475 + }, + "rem": [], + "tasks": [ + { + "s_id": 1900282200, + "type": 3, + "topic": "Ankunft bestätigen", + "rt": true, + "track": true + }, + { + "s_id": 1900282201, + "type": 9, + "topic": "Kommissionsnummer", + "opt": true, + "reenter": true + }, + { + "s_id": 1900282202, + "type": 5, + "topic": "Barcodes scannen", + "opt": true, + "reenter": true, + "min": 0, + "max": 4, + "max_len": 30 + }, + { + "s_id": 1900282203, + "type": 3, + "topic": "Arbeit fertig", + "track": true + }, + { + "s_id": 1900282204, + "type": 8, + "topic": "Hinweis zur Station", + "opt": true, + "reenter": true + }, + { + "s_id": 1900282205, + "type": 7, + "topic": "Quittungsgeber" + }, + { + "s_id": 1900282206, + "type": 2, + "topic": "Unterschrift", + "txt": [ + "%comp% / %person%", + "%street%, %city%", + "Komm-#: %com%", + "Servicezeit: %service_time%", + "Quittungsgeber: %task_val#1900282205%" + ], + "term": true, + "task_arrival": 1900282200, + "task_fin_work": 1900282203 + } + ] + }, + { + "id": 19003721, + "sort": 3, + "state": 1, + "mode": "del", + "comp": "GHOTEL", + "person": "", + "phone": "040 000000", + "street": "Lathusenstr. 35", + "city": "30625 Hannover", + "com": "", + "pos": { + "lat": 52.3799, + "long": 9.79572 + }, + "rem": [], + "tasks": [ + { + "s_id": 1900372100, + "type": 3, + "topic": "Ankunft bestätigen", + "rt": true, + "track": true + }, + { + "s_id": 1900372101, + "type": 9, + "topic": "Kommissionsnummer", + "opt": true, + "reenter": true + }, + { + "s_id": 1900372102, + "type": 5, + "topic": "Barcodes scannen", + "opt": true, + "reenter": true, + "min": 0, + "max": 4, + "max_len": 30 + }, + { + "s_id": 1900372103, + "type": 3, + "topic": "Arbeit fertig", + "track": true + }, + { + "s_id": 1900372104, + "type": 8, + "topic": "Hinweis zur Station", + "opt": true, + "reenter": true + }, + { + "s_id": 1900372105, + "type": 7, + "topic": "Quittungsgeber" + }, + { + "s_id": 1900372106, + "type": 2, + "topic": "Unterschrift", + "txt": [ + "%comp% / %person%", + "%street%, %city%", + "Komm-#: %com%", + "Servicezeit: %service_time%", + "Quittungsgeber: %task_val#1900372105%" + ], + "term": true, + "task_arrival": 1900372100, + "task_fin_work": 1900372103 + } + ] + }, + { + "id": 19003726, + "sort": 4, + "state": 0, + "mode": "del", + "comp": "KURS-Institut fuer betriebliche", + "person": "", + "phone": "05115151650", + "street": "Roscherstr. 13a", + "city": "30161 Hannover", + "com": "", + "pos": { + "lat": 52.3775, + "long": 9.7475 + }, + "rem": [ + "EUR2,50 Parkgebuehren es kann direkt vor der Schranke geparkt werden, Sackkarre erforderlich" + ], + "tasks": [ + { + "s_id": 1900372600, + "type": 3, + "topic": "Ankunft bestätigen", + "rt": true, + "track": true + }, + { + "s_id": 1900372601, + "type": 9, + "topic": "Kommissionsnummer", + "opt": true, + "reenter": true + }, + { + "s_id": 1900372602, + "type": 5, + "topic": "Barcodes scannen", + "opt": true, + "reenter": true, + "min": 0, + "max": 4, + "max_len": 30 + }, + { + "s_id": 1900372603, + "type": 3, + "topic": "Arbeit fertig", + "track": true + }, + { + "s_id": 1900372604, + "type": 8, + "topic": "Hinweis zur Station", + "opt": true, + "reenter": true + }, + { + "s_id": 1900372605, + "type": 7, + "topic": "Quittungsgeber" + }, + { + "s_id": 1900372606, + "type": 2, + "topic": "Unterschrift", + "txt": [ + "%comp% / %person%", + "%street%, %city%", + "Komm-#: %com%", + "Servicezeit: %service_time%", + "Quittungsgeber: %task_val#1900372605%" + ], + "term": true, + "task_arrival": 1900372600, + "task_fin_work": 1900372603 + } + ] + } + ] + } + ] + } +} diff --git a/assets/kasten.png b/assets/kasten.png new file mode 100644 index 0000000000000000000000000000000000000000..966fb290e3fcf2487548082bfb811b74fc4eb982 GIT binary patch literal 874 zcmV-w1C{)VP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10{2No zK~#90?V7)f6G0e;pUtUPm@5^;yTVF15z{EK5^O~L*((^Z6SelA5YbpDDgjIF1Unns zD-X0&5Do>qXigJjE*7)#PT9%M?#%4W?Ct{}x!df1-+OOnznh&2Kp&WT8rKM%hHC*S zv|S6(r2#~)Ma-cT2K&rWpy^tK4!#?_033HMLI>Yl1O(nDd>_G38*H864fef7?8off zx>KlnU|>LWNHGA87;#R45L$$3_5v^BSL=k(B5belu<04u;(N#2fTZYe({1$_-&P6NLa@>=W1 zRWlgijwH90eq2R^BjBYZf6q{jzYHaXd<|19Ax3OcjgG-Ol{FaPFv**~M*DG<4Fy$DVL_dtx`U%+msa>~gT(5mW=MiDfC>-7k>%lilz1G`)+DJg>p zv2?fKT1i={XAzdE4Yo`@i?B>Rf-O@UY#9>Rjee?tD%qYdEL zoZPMW9M`K{F7+p_=BvaoMchu2KJJXv_;$5ovXj_@+=_H=OEMnWlY~9AC{KPWax6xZ1ngF+KiBlj5{TIo1yY+$dw#6wBg#LYq#gegtunF*-VtZ~H zh3VJbk6Q*V0q1~2Y)@M@5EJ~@z^nLoAF;0g5B8&g9SdINIsgCw07*qoM6N<$f_@Bz As{jB1 literal 0 HcmV?d00001 diff --git a/assets/kombi.png b/assets/kombi.png new file mode 100644 index 0000000000000000000000000000000000000000..17166d5ae86d13cc21eab700d60f8e56b4c4765b GIT binary patch literal 793 zcmV+!1LpjRP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10;Wks zK~#90?VG)e6G0e&X3IO?9RM9`!Nr^MV6iS{q1je-^@-n@IULoGhhIWfuov5 zZ^1DaLL1lt5`(xp#28rfXVAoN2mEsd{%8PTB>8;n4UrxD9+TeBxWzMPOve+jGcm zq$vgi+%@DC>&Hzp7+~9wTcjU1&EPih-jLsWKW>`A0IR@PLyexNI$$Ug8fje{h8kY` zaZ?Qj^Fx-me%xe(PXO->wVeC$66G+n%KQNKfw#a*;N!nL=+0h@?2!P^fs=D{;}tB! zE^rN)wn8hZDOZ6f5U*fKegU0$1gnHmO(UFmT@##nAn4bi3ST34HhOEEKD?5 z7#{{tQEy{*f#q3rQERPJ5Ba4L*YC1=G(^36rK2<3C-f>;Nd377PEy4EDRNQ*Geham zJ@Bc8xH)Bf|E(zfxd&d(Ah7FbhC~#i-{n#HH0sw^8h}GTAxB<<>bEiYvu68!i?MU=X}0fW$dQ-Q>wn1N20lSe zVbbWJChUuHZ2AzGLh1FN2YzY_3{ym!ChCX4iVuM)R6_p?O_3wi+1=vrN6jl7KWgg6 zZTk{e2mR+z-l0yq&3Gj+ydu|$q>0fdbx&qt*ZU7fJp0*586Z|*8>)GcrBCh{8 XYgD<-0s~l$00000NkvXXu0mjf!jNvQ literal 0 HcmV?d00001 diff --git a/assets/lkw.png b/assets/lkw.png new file mode 100644 index 0000000000000000000000000000000000000000..15fd214805ddd4f0fcc19f8cb670efcf3fca217d GIT binary patch literal 894 zcmeAS@N?(olHy`uVBq!ia0vp^1wib;!3HD`&HDTdNO2Z;L>4nJSo47}n}LFo zC9V-A!TD(=<%vb94CUqJdYO6I#mR{Use1WE>9gP2NHH)lb9=fthE&XXJ9mG!h@;4H zdub-NqJyWLd|0#<#g=t#+!!GJF@62f#;`@#{t1g!nRz`p5M+JuQ2jxr*f(3axXPaM zTXa5;Jaf#uef-F5!JM;OB#iO#6Wa}ag2h_5T92L7`fz3G0xk*tSeawaZ=D{imD^nL zUr;aPe*4Ud-5h&Vo}WB$!9REF-55)jJ)3{L@Lw<1)-G(i(<%ow{AyycSB|DAPVw z`5?S){`&(f*KmRPhn>6E=NcV5e1SJ-_f$p3xX3?W|Le+t^lj2fv@49X+x?rnEid8r zS}yfQ$F}p#j}u?8ZM(awi229dhu_~HPf=S?3Ze<6Xz&coMfaDrTlZ{Cy%2-&t7VXTg|Y&nbzs{$=Ls2 zTwG~RTl(y`b*y~hUu0)3_*od~RLqvZ#jyDq%>4E)L2O5U!}XWHBac+q{bTTV_gkXyHlqQUcNjcf{an^L HB{Ts52s)KW literal 0 HcmV?d00001 diff --git a/assets/lkw_10.png b/assets/lkw_10.png new file mode 100644 index 0000000000000000000000000000000000000000..b254d4794fa56fd0744e2329540c47635f98d446 GIT binary patch literal 1714 zcmV;j22J^iP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H120uwe zK~#90?VaCi6jv0-Ka*8aY!i|t%Gyn(4{Askk_Ra^V4fnO_7}7wfi^U35v17s1NKc2 ziePE=B{hanM5JjX1VZdf5hK17Dl7h=SyNmRQ^=3i&8m#aW^W%RsU|bCJ2N}Gb2pg} z9G0BSxpVe>clOMkxtS>FX#~CoT7kEL?FQTUSVt+1+- z#onQhyHqT{{)8`HS)!ozyuWxQ=7u2<2oQ-x*tKgHH8nK^0s)fABr`KJ#9}d2Rdr)G zMel*<@V-yvw4+ClibNtIlF8&MyL|bwqw!i=TEx|>SH;t(PlXw(s*3B^uZ#Bfb`b~! zr0szK_X|j_sJ3Ir4$MUW*tv73 zFJLZH6vc8utqOSj_;J%QGMS9Hefzc;92^t_0|VmLty@A>RnzUeySse>bD5cd3kwU5 z1gxm25Dyyt)6DJSn^V`CgTbckp)%FN76L1XRRyI1Fn#bP89 ziM+833k!^ljOhG(_UtJrCpX!Yf0NQ8gdh@$u(-JB%6Qe))jD519=9AnHa4d7)zs7! zl#`oCc?7y89zbPfrOua5r!B|N&(G_8RaI35<>V$(3g{+^qQ4X=g!R^Bw5`#YxrVT5 zopuIa_X3t7=Ye;vZtM#vAKQUnvA7b#7f?mlFQDAy?T5aA#YeGd zJqEFP`=KwOJe&ajH1Ox_hrWRF@DlhOFuHcwiAg{71(b^kpdD>(?ph4{p)a6(`~iGt z;5Y1tzJPM_J@A`>U)K+P0p&yhQM46rwSMReC^vrtU!lLV z|9?O91(csb;0FVL18`otJMwO0bU&}6!usdd=-yv8o3)jKosDhMx$cj^R4S$O8QrBf z!|3k2(U@Mb?gdOHlR960eZA%QhK2^6Z*Fd`pq$)f-3$2O!2_Ky5{a;H-@d%D+qP}v z@ZrNc|NZ+$XZPN)?ghMYJ-6XQ0E^V9d#`~H}HHhuN8B; zuvbwOarf?B!xh%ou3Zz2jg7jPy1F{U{RtsNI-M55V9@h=tk{M)3q5n@41Illy5F_6 zwb9nr#^mHAi9~{>r6oe4P|k(B7cN|ost1AupCT*f^aup)4_rn@MhuTAJH+F0QB_st zc`a7GH(OGdDcNk6j*brQ+_~d;jOpoVjvP56)f56Yz)8#sv$L}_H#c+X(j{99djW3V zyvhFk`-#P3Mas@OWh3B=7cY47~_UxIhF`hqvPDe)vjg5_5ym*mEj~66iOfVQ+^_Y?I@p0Qnsuyf{0n44T`3m(h z#ti{qqCKkX0Px1L9YA}4&`TG_FL#PwpF-v#lW33XGNWmE8_(xU9$6{s<2X>wlice` zsuC2l)K;qcI1c>LLUJoe|2(!LSgGpcIPg6i2_7i080BassZSx(h&KVNGwCZOqotQ3Y?E7vfUE&^dU z67-m|s85f{P6XPg=Nzjq6}``^OGRdJ-EJi(0n*p!EwnQtx8_JGAmnC(9#aOWP>7uZI&9el2Tdd?Hpe*Y13C_MQQou*WPEG>KqCT}~7i$+SB(?l>Sq2-@9B1Nyye_q`N@k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H126;(D zK~#90?VVjn99I;_|I=L|s7(zhQmY#jL}DKr5@=GQf>1)1eno_!C@8HjmbH0Ed@Feg z2}DGx34xYigAgL_gHq^2L#UA?f(RuKp`j3y&8}!-jApwdaortnA7*XTx%2&{e>)!Ml zcp3KB30Y$phD0I}^8ER8va+(W!!BLAq}pG8em?2x=^?YTvt)B~lh9aQT_w?Il!U`! z!Z3^@YajsptuZjmtg5PtOioTxlS~L9LqkKV{GB*)g2dx-QGYb1r>99xO^qW3Olb(p z(zA|bS;^$85wN?vn{XVbO1v$S$s{>)<`9G?|*3B6D+dlH&~z5BmbjnV5hZ8ylJg z92gj&`de67AkEFqBoGMfIKH~NnoLYgh{jM-QsN6JWxEB8$K#}_sfpaaeOtAF1qB5p znM?}$EiNvS{rmTe_G1`^jE|2~MeOM4aD;%4pZjGp8T9w}qqepd>B+7>%O^ym#*&4j(>@-rioYEUVeiv17*sZLeOv zLNpqc?fdxgW5nZeL3>3-h30sSBq)D~JtPtdG&D4T5dBx7y1F_++sw=iGMS8`{>#hD z2!%pB+Vb=Bb;o4{jukMQ%^K#bzP?^p|I*S@LEFohFLn7e3P)c;oj_Sx8OqAa1nr4L zLa7V2H*lS5;`0TRp{c0}3?p2RzH{e}Swmg{@UhZ^eE}s11OhmH`m~@ul}cf1YRar( z3jmBk;Z6u&Knc3Kx=>wREodJe9!5HyHgo7&@MoedzJMZxLLv0^^$FTDnG6O82dxO9 z6AJ2~FCc|rFo+vBZcr!x0|Nt+lYfJet%tsV6fRu2K%G0rVlkXQe_pLSMxkA!^p&lL zzJR+3hr`t6vurkt_V#wHt*x0gbOgXGrCqWf`T}mFyu2JEBO}yl!?|< zZEZ&EPE*RC0Dh#ji`GNipZ%#ZEzbkxEF2C~ccyV1M~)vqt~X{aFaV+={(jwlpy$s( zsk+zK*N0oTZrKnO2!L9o#jy``%|xp1UA=l0qobon4yX4rDn+N~&OoX8-ou9varW$48=}&V=L8h1 zduwZJICbh2-n@BZLsZ)Flz>uoFA|C1(W6HeN2DLm2q;ze#>U2Q{rYw5gE9b5+{EPN z4@glh(#5b#~b7trOnt_HF!i`CWD9c^-Rw{$u!=wn12PJn^AOFcd&<6lBu zjxV6gF+#vJ_*Zou1yGo?qu^g4Wa|ENmtcB+^gL~z2mh)rF%IUAvHeNDO=d-YGkde!)n-+GG{PoC?ynv zeh9~m$7rH=rg=sDiZ7Wvr)l00LSO&Bk*@bM$M6u06sJ_K$~$z ze!>vHRH!iyz*j~G=Kx%hpC6#_r+GL4J!S>x09=uuuc7U7kp%Fi*}*vgSLCMz{9;0pkiczfGB4}OCCJAmJE|9cVB^Yb4Phdunulbn?R O0000k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H123bi& zK~#90?VVjrR7Vtmzg;09zaff-AeBa=VkH#=4H$z-tv{s2##T)fVo6(#X($isn>@&4 zqe)ZrrGx}S!b{}=n>0#Po_r#JCQ4)7)WyV5BXJYh^>4Q@eYl|1JIlSx&hDLM_e)NI zxpQXDo^$7(nLC%eF3fxkdZGubD_$LC0v*6KAX1`CVoKWV&rF~nsEu`p zDb(Vg{n<_`cnOIMBj=6qE|@9Q64M-*27Hg^!7D8-rK6*R%F0U9v5gxyGBGi+p#JI8 zr#XA}tP)%9-Mh!mojaAZrGhkIm(xas!{u^u{P=M$T)04PZmzVB+iiXBEnmKzf`S4i zHs$5zDQQO)X+Vk7M#v~FEv2)wlU=*CJ-@Ud4ajlYi1#^o@E~1XUF76wXPS0snfvzb z+m{NSP13BZ=s_qHB0W7_S$hv3KBTU$E@Hi4FsRH16(mFeuUxr8PfrhheSON>3nXfvMoxN6P>@MRs;fwmu`>erk%O@uUu5dU`s?jveFX&6~V<@q$1g zfDnSGPoHxA`gK}bT9n;_i-1eON0BHvz2Rv~YHDhPjMb}GTk5v9wwmQ?~Z4emiaL012{G|MsssBn>KA?<;s;* zR8-K`)XVcmMvmp zVnV7{R#p~??RLok2E(+`6;3H>N8s(-w>fm^5K~iA(&P8<->12`S$b^m-o3Ff=?(BT zAbUQfi3ReZxD{i-2c)eazpFKT2u^54Kd`*2S{h0iabBrZ~g+l!8{pyn-5a~)So`!XG!^H z;F6X*@;V`VBK+mcmytBFn5BeWnwES3^Yimrzka=`d}L$gsC8{V`7*Hz4K# ztgWq;>iT>>aq{Fzk(HJ8wyw+N5<7P65JN*lQk@469tfAq<+wkRDu96K@9&rD3n4@> z7!;$UqvFn;J7Kqw=4fneblew78Njt`*9xD{w_tFrxOVNDZlg~u`AN(ij~_p#zP=v6 z-@hpR;o)H#8X9aZJ>reyXOSIIwI5hkR%YvQ!ufP}cZc1%*FYRMz?M{1RSBQZXOhCg z!id{iwrrU=a^#4(b?cT027}U|J%9dOT)uo+R903x{@E82*IX2nmCVdcN=iy7Dk`F& zpa8$$kJsyEY-~)+%jNqdeE<`kq?yDlRa6A<4aTdwsxjVpku&@I#o1%YPR#uiO%i>A z@v5$HY@My+c(Qj$;^Ch~E55ccZoZMPHE?FUC0_nnwBj!|jGN-MY-Bk8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H12pLI4 zK~#90?Okn56I&X7rlkbDciT{0OwX)J19HANS9?A11D%$(2ahKWeV}OEgjA z5717@lL~91kwA#L$s(vXmf|L+%KA|Xv^Ea5&eVAzX7lqz;~27b5IUWFGD#1E&%uhfXo%mN=lJ6 z^O*zSp8z(c+Ta|tg=yyVZ&0ISH@V zi;0N|&Fz`ZW~^Sl8jBV!g57S1*=$B25Wu^4?=Unp1fJ)$Fq85e*bK&bqO7cpT)1$7 zym|A6Na5+zr=+p5kt|-kIB9#EHfDqn z1|-pvlaoW5o0~~A8kGzrEwBv@4J0coOSQecygcG|yA|8|`r;`mDKRX8p#&XEs#vX7 zGB7ZpI+&kv>((ujot>@Np2OiFUavP{ds9H zp2cDzeSLjN+k5ru6hwx3X| zrt!2PkmERP+qO+4_jo)Q8yjQbQOeK)piF7yv>|ZImMthLDG|xtZZ`vOQi|^Y{2dB+ zLZk(O7K;U^PMs3T1wlYtTN?w9QjSu@?nGIn1%XG89z}V1xk%pC)upOOnP#Ykf_!Lr z0xK&kapJ@Yk$if38pn?xXW)^pkj;mNCNM8A57(|;gT-PIeRuNYNq9US241NKr?9kB zbY=6QVF~0o4i_(8L{U+Z=(`6G9-yhIiGf!s#g72~MUltNhlVAvzP=t?w{8{5CnhGa zbLUP(A`u2&r4-Wu{siD1<-1x)OeSXo(#hK2^}cXf4jismuX6g~jE5Zjykb5Qf4 z;RuYE_nMoV;c~ecc%>`u0-*KIsQJ)P1jfsIj~_qAkt0VKc*O*N0dRvN7v)1k5h#`S z!r?HgtE&|)In5Ff0CkA%82mYE@l`%F41w|T-v0gj@$A_%ojqcX5P)p}#LFRHN3tXzO_7=eQ05M`8J$jV1 zjj5?Ak&L!VF9q7_JFQJtU`F8l`SWq*$`xc~i5~(kmka05pV!1rAP^AAXzPknC@n1& z$;QXWlk!Px=(?>C0O2@}xLhvk7D1oSNAmOYHM2$AhbjmHS-EnhtZr^@F7f;QBK-t* zXQ#60Z?wL?o=RRM5+P2fQ&U@IWo1-bZnsmo8OZ>~_1PJ&xnZlP6E8_Ii4HNO^g=NT;x{khHhAQ*}b2kfu+Fv?K80!-v$s zB!kAr#<({3?Aa4n-{Y+ZE9*_O&D7OrS67gAV;9dWFp<&-AUW= zdcDMEv#}=Z+y4z206`E?Q&WTC;o*eac>DG(wr}5Vs38Pkkf}61;P?AcRaJ${moKZ@ z*b4yt{ryTMpad9!V zuHWxRZ*MPJTU#YxsxbmM%p}50g~Q=MK|ulX^YgzsX5{(v=c?~i7RY!4(;XR;17|C= zAaEM7qq;T#_cceT%$&5o@B6d`l6e?!wFdr{5Dtg2xVMSiXxv!n% z4G>Jdi(c_bSn-?!=RSk^d29@dUhzp-@z*LG+>m52(y{0gpJav+zX0%FVcqW$+hvtW z&?P=ukU!5dG-DtcNcDDu0E}~DKw@ATA0@*GsTa`2dkv%^RrkLt+Au1Z#zzT(|B;aI zR-pSCKS;=*t7yZhFnoM|1U-TBh;@PGP=VNhmDa|7EgWPF!^fu(KvcrOOBpBQ4OAll z3bb&LG14MF?Gi=^VpmTyzMU%Ch%Zw`QhKxLcnQPD=U0gJh_o6bO#yId=^$gIMSOk> z=|_c{@(I8nw06z_NQ?L!L~=jP^9jIgep@9i;`2u&_PCe=@cUFdX8@!{e13`8WNk!& zW1j$YVs_;`Ip`LjWPcW>0KirNzXPxYU%I_75gXvT0sLd;?@UC>k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H12s=qc zK~#90?Okn56I&X7TB#+1LM0nTL~<)cd#`2zjdFw5#4L$=S2xip@$+g{qfuAAdfG=6z=7ocGLh(1D9T1Nb|DzW|s3AceBccL;}0sg9BXoCgpBK)#z~CM%K# zK9d351z?rC!|#w5`hm~W_%5C%p+jWMYsDuqnZjf;!D6u>Jv|+Iy&i!;03972=k8FCNG`1||Vm560r9rlw-Uh7DM~dNuO%^P$sm_u1$3p|-Xbm6esKt*sRmf7h;E z*uQ_jBwTGa8|KWJBS|c&@EaHo@{1NNA}*JUh(UdQJu#cjg8Mjd;DD(3(a_e`rm9Jd z9zeF-o$z7j&Yie^{W`{t8z;)oYPF)dxfulo1u`+y4)g$0S#-R7`EndTew=!_6atgU zgxj}oWAy0J5;M~ln2ddynVC3u?i{apKA#Vbjg7c}|32(?d(=2bjvSGTrY4XSdlTtV zQBi@kv@}k;)9J+4ty^*H)~zpQoRcR{#>tZ>F@OGij?cPv>rh@^j^5s0Q5>E>e@=}T z3;q55qJ89sqLY^N^mNkK*T+^XsIIP#>1(su z@cQ*@PWyxj6C~lLMJO)dtXZ=-ZH&9*UN5JOc18~sC_agqK7D#Z{$s|B;k0=? zo`hm*8LC+S6biH1Os)HzPNyXCQ&MEP^(l7JvsO%SO$oSo@nULwU0q#V@eBq7)~s2B zd-v|4udfe*Kmddgbai#%&Ye5hwrv|sCQ|~8=*@7_)HdcBhS+YS*=LNFIci0#<1gPP!@M~}wzm0~gb z+O=!MXf!Ih&lkTL0dsS6sm1@hckjs9v11hxkPt%7pFgkkzOU81fChtsJbLtqn$U`h z3PCZXyq#21QljMk2OwZPWG+%PJAL{zHIeP@?PU1y;Ry?9x7*2Ns~xMMh3~x z&nJfuA0~dkpSpcRLxb3T5Q+;t{xQcx<|6Ugk|j&1Nel*qq_D71a2!4XtE;QYs8OS+ zK2xSlAs&y1>SwW7=t*-UzRdZ-C3D=QNfizeWM2M=PN!KJ08 z)c&_`-!6xMK;-87Yo0i3`J9-G^|cv|M$**OL`~j}8#jnfr&EN7Uau#1yPd<~^5x5N z2?zjl0eqmu;T;c|3--0~jeAa~lVoIMD9WX>vXaB&@#DvG3J3uEcw$k zCs0&W#A)|YS+HOMQ*MmUz(Jhg ziG2|)lLLU{q*Gm=f*s){G53W6X_HcN;eEE_&uR&w-Sm7XyMkB6Vxk9~3+tkz~ z$?qA`($bKdo6Bi$ZEXc1u}_e!tSnBO*hd)U2D77wuioqF=^+y*PL!mNyu3VWA9;Cs zg8ZL6dBX9%di5&vGw(BF(=p$;M+hOMrKOVgMf>s0p+kpa`V|xuQ28A^c#ySdYz2%~ z?_IcXLGu2ps;W5s1Ofpvb?Q`JpOlmo>e)vKAw@++tVR21x;p21?V2pT_?f}%&v#*G_!FP-tCtE($!zjyE6<@N9H?UAlA$bLY;5&*zhgS^QAEkPilf=8G^Uus z`svfBm@#7pmMvR`_3PJT_Uzd(7z~{4d_Es;-n@ykXV0R!xmilOl0xxWsM?U6oQ&-3 zY-DC;!elbR@At!Qx1*z@Lv@!+8iu@pTE~zY1HVN`A>jWJc~w^tB5%A%9r*W|f$xSo zWY13`b;$3CysC>2`2*W9ua_8^68VYSF&Kl~=OlwFNT$-JRDR-i{HFkNgE%8olGJQU zLDe$kS0mkP0BaH7xByk^Cef_WLaTNc??je6!s*0JyJg z(iWKJM@Sjr=4t;?fN!jAUx|pJRxr(v5CQ+k)4oc8?;uw4w7(P)L#fCdqn z0>?r=A_Xfg#%3u9GKT8&lMVXMod_aDXf%@13f1=j#!EqvF*K2%fAe%g5IK6z;LD|= zpYds_h|lj|Qjt>uRG*(LL}o-%)kwVnGNmNQ7@Ek>eDGf?#8?QxLaE8A0Gi0pHYE0^ zc|rjGAs0CnKoj{{g!nEOy#W3yH#rqR6Z!cQB8#=}1rQ4XsKU23=EZ_y`APK8!i)#- wHvqo?_yM1$y}u(;;NAvsW8nWo5whp!4?k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H12J}fp zK~#90?Ok0=6ImEN#o9=qV4{c%6w;&y15H*VG3*P84KKjLZlVbftV*(P*sTxxfDb;K zNFrf1nq@aZiBE1~a1Dw3;Lkf|Q&3PeAQ}WA4J~x-52bwjFhybKPCL_f=1zZ3azeP= z@0+jZ^!DC6GaU>N<68hf184?N4WNk8ClC2BXmy}H00sd>0Z^W4qpC2*e(nMAH-IL! z512=KQ4st2EAr-LBn%Mdynpc3%$$M2U_ebx4Xjox%w{vz*Vp0m`SAMnYxsP=v>hg0 ziKK8H{O1Wx+0f8HLqkKfyu3_OaJ$`f>Cz?Izkk23=Rg3MO0mFB(li!) zJ|8)qPF)-5PgR&qpv`8Zxw$z-=55EFJ9ns{pg@-fau-)^mX?;%?CfmP=568X)vI{} zdGO}Vn{ka+9=GL!Li>PR-5DJ3bos z?%hl0&z~p1-_ML09UaXZs3k94xWF{x(W6IXGMOaf>~=e?t*wdTB9VyFm8t6BF0z`u zfB(M7gkUg82M!!a80&JmnC7>)x9i5htlzxbY&KEb!-o&Cyu6$+c6fLgkw`>VPF~1* z14~LuL~WCkld@ucJ|E`i=SA(MrKKs?l`dqxfd+&4OqP<gp24_Vx9NVm%&D-0er2I0*%JLU0#ZO`1$5diU;~$OyOFP5buklZGU;5V8)>20if7K8A)n6|*GLwg zJ$ptLizV6P%Ej*z@p0$FtY3w0$EQ!9lDbvm{rmUu`~50Zv;$56V~qAX2rE-ba32|3 z(CKtiG#XVr`nE7NHI?irR00ctWr;l9QbF9sRhylioyY}EmCTeYMrJkN1di?mYKh>z3LE0zj`s zF6Mm5U1T*Wbv6FMg9lVrRwfzea5(7W$B&}8Xf#Uo_4R5SXaMl1M82W_cjhj#S}ZOu zra&MdGU4gdr(`r56UHAsdXyPII5?=bfdF8JFydG_ySI1bF0@)adGaK4^x5rp**W_A z`$h2{kB1BfgW3iHKrMh(M$R4cA$OtG;*~2`MBQQOd(rp5=H>@GurC_+%Pi!kTobQEEKhU{`^@{jzAy) zA`)H1EhNy-+Ab z4u>Od?C#yW>Gtj0%s0Tu$O!k>mJ>GQDh&DDh=-RbwbolV$9sNxv6LoZS(Ad}* zGmeO;rKN@Y>&h7e?RGnbLLo^rh=`V!mS}u@oTjIznP*3ZOY4<8hrg3BAI0v!$qy?XUZk#U=wn{@Z?-MCjS z@&;;1qtQsGPMxBWkrB!701^?+%*@chz<^#y-4`0RT+Bu6+O-Q-s}(ghH87ja2#3R1 zTU*2Q^fWvk5AX71A*T(@24wZAv|Kj>6`Xn6~N>JSPB11Y5Q)_CaPtt({GK$+m&OMJ!Lw%ACl=m%30gWk& zk%`nqpH#LHW(apj$w4uMXR_rIG||V1#Lu(z#}1GRq*l9Y0QB?7hvdLjA358I1&Q`L z8L^4_E-J{OS8&xwj)Aih?LWzg-9nc{`;3AddWG)wae_U8h9E3~6X6Ji4J#{0PdWDLX38Mho(_NenkP-U0klMfIi30dVt>ScmjL@e8 z$$ea`0{C9-;&gzF(5DQ-$=ZmF!lD3%kzI3MB50;hst>-b0`LQXHUL(9UG~mH*x-%= h_$&5%E<$yE{sT9%v`ak0fTI8a002ovPDHLkV1g>KkYoS= literal 0 HcmV?d00001 diff --git a/assets/marker_destination.png b/assets/marker_destination.png new file mode 100644 index 0000000000000000000000000000000000000000..2591d9944576bf4a76c599a5103f45c246f6851f GIT binary patch literal 4159 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 M07*qoM6N<$f<+Ulg#Z8m literal 0 HcmV?d00001 diff --git a/assets/mein_kasten.png b/assets/mein_kasten.png new file mode 100644 index 0000000000000000000000000000000000000000..c64f8fd119396644167fdeb7169fb074b06e78d6 GIT binary patch literal 1170 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 Q%>V!Z07*qoM6N<$g0fZo7XSbN literal 0 HcmV?d00001 diff --git a/assets/mein_lkw_15.png b/assets/mein_lkw_15.png new file mode 100644 index 0000000000000000000000000000000000000000..08df320bfca8c60153ad1d20a2e9ab2da3cd030e GIT binary patch literal 1999 zcmV;=2Qc`FP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H12V6-+ zK~#90?VNjT97i3;KeM-Y=X4ZfATiQ&%@nJ6^uRf3Apy_@SmiP;Ek6~Ztho#h*g1VvHjnL85sQB(jecaLH z>cOGxm_WGPjhN4UtscIAw~ycgy{^vxapmK^zS&b3&mo2J>?I&&gIU1GZD3e<d1W7KhGSJb9n5U}a9(!r-X8CM1i&)dEIGgxyDz92>M*v&@yFec5rP zfbo>j-IHS9Kc`4qm*>6AOg|FY?C33G1pQi*315m0h6pZb4lC@?9%$1L?^sswf zDdT%;TWe%;Tee(v0dwHNHj_JVD4oe>{Nd_Md1`tR128luJoB#<$A>Jg#NoQI;$tly zcC?$?fclr#dO0@eJcjCYS6b^6lTVAtj(LC2`oj-h{F<83U02gR@Xt|;jlYcZ{HYZE z!@_WUdiMF_o+&o}I>B4<^x5Za%M4asUHBP|N;Px=J?ROV{b9`t*mJ?A>-R~5$bAJ)VW8aa_7aw3)Ubuaf>42=m*jdOe4`W1R3>iatyz6TsgOVIekx`0{G`N)Q1J07LP+YtC7B4;#-bNpdlz%1CBFlZ^l zYQ5Xlm>8Z-Afxls-nl-k3+Q47IvRSF;tRn1$LMW;SQpUc^mT*|BK#;VVa6ZU#4;iu zLYjS4@f=npxxNp~4YjT61#I*w-n%5-X`Q}gr;STGmW9%<9ZR}rH(S*UcufEfeb%4$ z|K0oJyfKnph}$%~;oP(xvFd$bbVRr~k#6w&Z_FMJYrEFaMqSQacF(4rsuvL8xF(vi zbB&jqu37l@gI?Hkm;U|V@xi))CFR*yQ)&J#=!F*^@bS=UbIx`O1$=P1!3z)gwY{%@ zSU7pnJpxv}4+MDqvdv!xEH<>v9X6Nv72o-Ym)+~UL`Q_AB`goCjG?l~i77{upHfj1 z0s?&d*c5B8GqeXiO@o9?)yA-$>uA6a#!zz z8WIrT9~W#k9f))KQf@x%x4jly4<#5b;r>vkRLl@+*=RS|>VnOgIQN$DnF9$vvC6}i zHj}l>4ehzZ;e_x?)aJR@QoQyb_e@&mqlz2qaX)?!EDtM|h7?!%6%$EeXiOLy71s@y zIx40I7K?;6z1WXBh|0K;n(~3wNFfAF2z1-R?Gv#;cp?@E+rsT4`~+~%7jeo*QSFnj z4?HiHy>Vby_*GrvipY4ofpG-5K94#onWEb#pB|XV)Hr}>XZWOz{Yh%GCzixMixyDe z$xMx#CE6K2so?3w)>EmJ%07$lfd>1XX0?>_yj4Sq?6YVAgLXi(n$~Y6%Mi?fX+1?e7dN$*1gcQ*Qe>>4E>&{TVYR+ZQ;Y`(zbRQ2p8ji-)saJBvrys!vgUPRnpB<+hK59w;wri&pGh5gBjKcJ+$Lc)JKY z^{KYD?8>6N_Q@)s0fzwHTTH)!aU@eC-(ILHbYH1U8J0Snt$w#tZu>ae<-amA@eC;a zhtY+kQaoiT_Rr3y5;A#|1F=K_sGL_Iao6?n`^{cfk6_HiWO`}W1IPuaW%g;*2hS@dThI>`xnc`ETrJ{3dF|tPA>Y>#dRYly1@d`4 zZ7ao>2RcK)%cBfeQZD=CeA2DuiHZA_sGpPba3P}zTl>30M{=#Rk|?!(at@^pbc7BY zmenfI4LCWcV=Kk;mdVZ4E*_NLK6#xrUDX|HvP}835@RDs3(z!^Gz6+2>=zA79X_`! hIFwI4l}ah>^FI+*3uMQ!09^n8002ovPDHLkV1no**t7ru literal 0 HcmV?d00001 diff --git a/assets/mein_lkw_20.png b/assets/mein_lkw_20.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb4c77c1ded9c4535672f635bd810f439f25aea GIT binary patch literal 2504 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 literal 0 HcmV?d00001 diff --git a/assets/mein_lkw_8.png b/assets/mein_lkw_8.png new file mode 100644 index 0000000000000000000000000000000000000000..261c9286e12efcd02cf9df8a8794fb0fe77153aa GIT binary patch literal 2316 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 literal 0 HcmV?d00001 diff --git a/assets/muelleimer.png b/assets/muelleimer.png new file mode 100644 index 0000000000000000000000000000000000000000..fef7c6fb2e0a76a7845eed2e9dde624fbc262cfb GIT binary patch literal 13571 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 ncwtq>w#WSr|C+7t3Evn!kLYkYWd?@ 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 H#vtuB literal 0 HcmV?d00001 diff --git a/assets/pkw.png b/assets/pkw.png new file mode 100644 index 0000000000000000000000000000000000000000..8e36791f9a71c701c96b8d2dadc87ce378a18596 GIT binary patch literal 880 zcmV-$1CRWPP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10{uxu zK~#90?V3Gn6j2n0pUnzEOoS8`lBBSSprG3*Yhfcc!OzY@i>)l;N9~`mh>M~q2)0%c ztb|}CVsBxgRWM*7tftr`Zr0-N5?$urxifRl+?in>IK>V#=e+yw?zv~~EXZ;P7#2J_ z!tXgZE&{uRH!v=?fRjodsIdh6B)oaP@fkRz;)DWoz!$=smNZ^!m?6yp;2q)3N*f(< zM}&Dyc$2b3q5H9GVt6W$-`oENO6VKBf2;7>%};QcsmVz@0_Ps?C{2bSDH`>|_ckXY0v z(KNULytd>I(vMvegVdrniKf8-vzTve@P6!?7$g_9Nwf_HI1cn8YUI|BT@!=!qBcn$ z1_N9N_9E)2_v5%d2I)m@lDrHCcxb7m){o1+$B<`iVZQCFz$ssY%f81DDh8N|%DL#T z6hLU%);(9Iy^7gwsz%=9L zjk^9U_uCu5X-DqX=$z2|0wMLMzOWx7?q8Ap0+<;}f9eZYJ;aUaDw&ie^3tFB!m|kk zwlkWc5xMBka;rRxd0gVd4DdT;9W8RvKZV&=bA_*nxH?h%@~EFRg6j7f)4p4dpGY9k zcJ5|^9BB!v-^bu@mgBcPt{rpJa{Oz89BC=M{<}ms@IGdQiKB%X*rRf+NC=Ff@cI{t z{=4T8GlaWDx(4-K@_9s63jHrEMTVG9x6A*xn&;TR)wEsrOiEl8^v`2fOsN^P2OO0Y zSOxvd*netCVgOu`7Uw}J^xq#9$Rh5ZmN*Yeq5mrBer`SBvbH!6N}>M20&oqu1RP_3Y}vpJ_-}zXqt``5UH@OAZa_a3dQs5;0000@ literal 0 HcmV?d00001 diff --git a/assets/sb_logo.png b/assets/sb_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9e38f46fbd600eb4de7dcbdfb7033c752a1c21e7 GIT binary patch literal 30804 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 literal 0 HcmV?d00001 diff --git a/assets/sb_logo_signet.png b/assets/sb_logo_signet.png new file mode 100644 index 0000000000000000000000000000000000000000..9e38f46fbd600eb4de7dcbdfb7033c752a1c21e7 GIT binary patch literal 30804 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 literal 0 HcmV?d00001 diff --git a/assets/sb_logo_transparent.png b/assets/sb_logo_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..70cf057197a281211ca09258fb506e8e742823a7 GIT binary patch literal 87574 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 YN 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 P00000NkvXXu0mjfECGm5 literal 0 HcmV?d00001 diff --git a/assets/unbekannt.png b/assets/unbekannt.png new file mode 100644 index 0000000000000000000000000000000000000000..719d36c86bacac3ec8800cc83660f5823e60bbbb GIT binary patch literal 1370 zcmV-g1*Q6lP)k8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11m{Ua zK~#90?VDeSRaF$me^+OQnlyA|Vx&yzp`?P8qQ;;Eq4F)7hf2t&BBLjZKuFLFJ?6_0 zNcA)l1r>}C7DR(TSMuNlJq3fcD&g3SxZG3T^Dl&A;zLm_L& z@=8#}oYS8K&WW}vMD1E$32bHdPzcchg`}O!D}h#KW4;7e0e>qb?Oa|7s+e<|0xRMmSw;SUf z|0{qu0{Lf%aqPa+kyAfIx>M1sU?T>PIGwu>|@s-GR#? z>8T?-fs2Jc;AcxLS4=bV z7NNw%63YiBr@RH)7b|-QhOp1oCV?AFj(H38WF!G> z=m9>p#BdRKP;<^(pr(E&5r}<`7+$nF=Pl5>jLEw&f-G3I{@=rK^q#js0~rOdVHx_q zbRGD`r~kYK3OZp3#PgPZ=a6-!6QK#U6HcJ#G3HBBR)N-H&%^p#)rBalK-W1|)+(KV zHOOzJrnpj=DdfrNNO8)1yLDy5OgN9M-a8sq^x@)wFG-nS^HI)oB#j-07*qoM6N<$f=NJ$&j0`b literal 0 HcmV?d00001 diff --git a/assets/verbunden.png b/assets/verbunden.png new file mode 100644 index 0000000000000000000000000000000000000000..7d1b29d98c38a2a49d5c2f46a920e94cd7bc3d84 GIT binary patch literal 1450 zcmV;b1y%ZqP)l z+8iv_n_WsOwe)Gxf zzS+rpYb3n^yakLh#D{g@u#t2L7;CzkK4r~FQqxuRGgs#x9|V4CqL3D{12_WQlY71c zjBGyAR`%6cU~7>yD(MS3ke`7AkEAi+GvEQ2_m336WpI!*3Vej4JQxbx#LD{^c%`c*{GQePZARddi!z@7)qGu%E&npSB%IFWNTyvM&s*zz})1-4=nZUdBk803HS= zNiH{+fdymCxstiAOO+1ryfNm~c44iXfs)20%}HACF)L0>x+O4s%(gFLL(+7Y_U%4| zCEY0LdxrroOPch|E+x-qv{#^{-I9KA7+}gpNw+&@2c7e}Hr zNjCv!fV~yOPXOOge4XC`o-@Y0U#7F#Hxnf72EL{mc_~HX5-?L%o=ZnjvGUH4T$(k7 zfR~Ih@5TtL?GToO!jIj(Z2qq zr2jnEcriFua$MCfq;;jdl(tBGy0rq;TV6^VB(BJD8?07=Dwdbh28lmQ+SwX`O5~mJ z7(g2&ey-$$u33TdmzT04X@4f?prp$IIc0dWQGp7Vm(sMvj-)3V5vWAoe1t(XE%8rD zH-rc*yO2Ik@^y!@j00b#676F98S1-Yxt`E*j270iStXX29MxXaH#Nqc~I zLfRJ4vHAnQ18UEw^D#w~XLD=$zwlfw%C2OK#41qa9qDczOam{+&UGZcV!5lX4xv(sH?*$gB?_P5MjXfoOjA0>nw1oY=1pi z0`99@9+VX5an4%=rho^5)iQl{;XH7_81sANTsLyd0H58MLrQ+tSj2*)YcuU)UiK|X zy15!NJ;z;s9jHKgnf5Ux)-KQ1UQS?Hd6}Ft5*v|c>kbzfOI{`~L}Fv|Y|UW;W6R6r z`bcb4o~_qkprmOfUjr-Rw2~V-_!f1iqzeVv-zvEYMWc8NtXf{CpPiCsCHk8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11Q$s} zK~#90?VL$#6hRb#zln*#g9f9C3y6v!nus@Z5L{6ZC5RGp2nZ5I{1-`nfSQnth#+|I zs^CRjKoCI?#1(fDO%#n9Q9;eZc&HhTKU|!+#kH9_P8gLeP=b*NVW+89}7z6SlF$SCl7C5Q20%-?E2^UuypMhNt>a8da z1CvCTSBweZVCq#@2<<2Vape_boD3d`^MMbT%PYnR(46WXIOZhwTP@FBfls4q$d6_5x2+`tI+AeLV)Wn24JR3}WXWeN=gkW$I}J zhElF&0vG`5;>f$4aQCHhe z)ag72bzyNWFJEvYk}GT&wv9wszH3bD7xQbP)#53|3pB(FG{g%u#0xaU3pB(FG^Ex- zA7SIHs>UCIhIoO7c!7p^frfa2hIoO7*cislwa`bBj3(K+4S}C6^pPYcVoaWXX=4& z;0kKVaJl^-18C3o?~;)7HA_D#EemPC9Ps%K zA!k;WZsmqiPmPvi0`&-OIi!o!mn;dqT8OAD5!!~bbPC5I2ka2qulxBxncct|q5VAA zyUJA?^{D5FgS__&{6O`x$s-sVOKKVMrw3ZhLTag{C3rh62 zati5o?Iv(5sL=~ltQXoYNQqvcVv*2xTT0B*be6rG{^q7nNDEHWT;Q0?--g1|cDxv*-M2Nnc^lGsoDm7CL59#|4sqy;#Ndimftq2p?i c2L=Lv0}P(TPs6+%2><{907*qoM6N<$g3O2%KL7v# literal 0 HcmV?d00001 diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9625e10 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 11.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..10f3c9b --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..41387a1 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,131 @@ +PODS: + - Alamofire (5.8.1) + - DKImagePickerController/Core (4.3.4): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.4) + - DKImagePickerController/PhotoGallery (4.3.4): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.4) + - DKPhotoGallery (0.0.17): + - DKPhotoGallery/Core (= 0.0.17) + - DKPhotoGallery/Model (= 0.0.17) + - DKPhotoGallery/Preview (= 0.0.17) + - DKPhotoGallery/Resource (= 0.0.17) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.17): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.17): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.17): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.17): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - Flutter (1.0.0) + - flutter_osm_plugin (0.0.1): + - Alamofire + - Flutter + - Polyline + - Tangram-es + - image_picker_ios (0.0.1): + - Flutter + - isar_flutter_libs (1.0.0): + - Flutter + - open_filex (0.0.2): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - permission_handler_apple (9.1.1): + - Flutter + - Polyline (5.1.0) + - SDWebImage (5.18.3): + - SDWebImage/Core (= 5.18.3) + - SDWebImage/Core (5.18.3) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - SwiftyGif (5.4.4) + - Tangram-es (0.17.1) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - Flutter (from `Flutter`) + - flutter_osm_plugin (from `.symlinks/plugins/flutter_osm_plugin/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`) + - open_filex (from `.symlinks/plugins/open_filex/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - Alamofire + - DKImagePickerController + - DKPhotoGallery + - Polyline + - SDWebImage + - SwiftyGif + - Tangram-es + +EXTERNAL SOURCES: + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + Flutter: + :path: Flutter + flutter_osm_plugin: + :path: ".symlinks/plugins/flutter_osm_plugin/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + isar_flutter_libs: + :path: ".symlinks/plugins/isar_flutter_libs/ios" + open_filex: + :path: ".symlinks/plugins/open_filex/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/ios" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7 + DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac + DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + file_picker: ce3938a0df3cc1ef404671531facef740d03f920 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_osm_plugin: 029b14f54485ced3190bb2c4444616b76e10c6a8 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 + isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073 + open_filex: 6e26e659846ec990262224a12ef1c528bb4edbe4 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + Polyline: 2a1f29f87f8d9b7de868940f4f76deb8c678a5b1 + SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958 + shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 + SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f + Tangram-es: 628b634f7fc09d2217469b9914de00d9de49ff9d + url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86 + +PODFILE CHECKSUM: cc1f88378b4bfcf93a6ce00d2c587857c6008d3b + +COCOAPODS: 1.14.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ef7b3aa --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,554 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + CC8D4507731EF6F87A591EB3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 27BA8A7C083F4CB270323C61 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 138A5211EE1BA3C7A8D472BD /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 27BA8A7C083F4CB270323C61 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BE5E08528391F393053A428 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 63ABFCD8701D66D342D334D0 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CC8D4507731EF6F87A591EB3 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 16EBC23B335D97A2C397BE3A /* Pods */ = { + isa = PBXGroup; + children = ( + 138A5211EE1BA3C7A8D472BD /* Pods-Runner.debug.xcconfig */, + 2BE5E08528391F393053A428 /* Pods-Runner.release.xcconfig */, + 63ABFCD8701D66D342D334D0 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 16EBC23B335D97A2C397BE3A /* Pods */, + D6EC5549CDF8EADFD7C26624 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + D6EC5549CDF8EADFD7C26624 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 27BA8A7C083F4CB270323C61 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 83826AD427057AA1EE475527 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 7178434CFEAFFCF18EE3B350 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 7178434CFEAFFCF18EE3B350 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 83826AD427057AA1EE475527 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = Y322FFQ9N6; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = de.assecutor.stadtbote; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = Y322FFQ9N6; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = de.assecutor.stadtbote; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = Y322FFQ9N6; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = de.assecutor.stadtbote; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..c87d15a --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..f723776 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Stadtbote + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + stadtbote + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/lib/content_views/accepted_jobs_page.dart b/lib/content_views/accepted_jobs_page.dart new file mode 100644 index 0000000..7d56679 --- /dev/null +++ b/lib/content_views/accepted_jobs_page.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; +import 'package:isar/isar.dart'; +import 'package:stadtbote/content_views/tour_list_page.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:intl/intl.dart'; + +import '../main.dart'; +import '../model/job.dart'; +import '../tools/constants.dart'; +import '../tools/util.dart'; + +class AcceptedJobsPage extends ContentViewWidget { + const AcceptedJobsPage({super.key}); + + @override + State createState() => _AcceptedJobsPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: const Text( + 'Angenommene Aufträge', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + rightButtonEnabled: false, + rightButtonVisible: false, + rightButtonImage: null, + rightButtonOnPressed: () async { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: EmployeeEditProfileWidget()); + }); + } +} + +class _AcceptedJobsPageState extends State { + late List _jobs; + + late bool _initCompleted = false; + + @override + void initState() { + Future.delayed(const Duration(seconds: 0), () async { + _jobs = await MyApp.isarInstance.jobs.filter().stateEqualTo(1).findAll(); + + _initCompleted = true; + + setState(() {}); + }); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (!_initCompleted) { + return Util.getWaitWidget(context); + } + + late List jobWidgets = _createjobWidgets(); + + return ListView( + children: jobWidgets + ); + } + + List _createjobWidgets() { + List jobWidgets = []; + + for (var job in _jobs) { + jobWidgets.add( + ListTile( + onTap: () { + _clicked(job); + }, + title: Container( + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: Colors.grey, width: 0.5), + borderRadius: const BorderRadius.all(Radius.circular(13)) + ), + padding: const EdgeInsets.all(15.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + DateFormat('dd.MM.yyyy HH:mm').format(DateTime.parse(job.ordertime)).toString(), + textAlign: TextAlign.left, + ), + Text( + job.crFilter != null ? job.crFilter.toString() : "Kein CR-Filter vorhanden", + textAlign: TextAlign.left, + ), + Row( + children: [ + const Icon(Icons.arrow_back, size: 30.0, color: Colors.black), + const SizedBox(width: 10), + Text( + job.vhtId.toString() + ), + ], + ), + Text( + job.id.toString(), + textAlign: TextAlign.left, + ), + Text( + job.tours[0].comp, + textAlign: TextAlign.left, + ), + Text( + job.tours[0].street, + textAlign: TextAlign.left, + ), + Text( + job.tours[0].city, + textAlign: TextAlign.left, + ), + ], + ), + ) + ), + ); + } + + return jobWidgets; + } + + void _clicked(Job job) { + BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: TourListPage(job: job)); + } +} diff --git a/lib/content_views/assigned_jobs_page.dart b/lib/content_views/assigned_jobs_page.dart new file mode 100644 index 0000000..1415562 --- /dev/null +++ b/lib/content_views/assigned_jobs_page.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; + +class AssignedJobsPage extends ContentViewWidget { + const AssignedJobsPage({super.key}); + + @override + State createState() => _AssignedJobsPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: const Text( + 'Startseite', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + rightButtonEnabled: false, + rightButtonVisible: false, + rightButtonImage: null, + rightButtonOnPressed: () async { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: EmployeeEditProfileWidget()); + }); + } +} + +class _AssignedJobsPageState extends State { + void sendMessage(Widget message) { + //Messaging.instance.sendMessage(message); + } + + void _clicked() { + //sendMessage(const InfoDetailsWidget()); + } + + @override + Widget build(BuildContext context) { + return ListView( + children: [ + ListTile( + title: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + Text( + 'Dies ist ein linksbündigerText', + textAlign: TextAlign.left, + ), + Text( + 'Dies ist ein linksbündiger Text', + textAlign: TextAlign.left, + style: TextStyle( + color: Colors.blue, + fontSize: 24.0, + ), + ), + ], + ), + onTap: () { + _clicked(); + }, + ), + ], + ); + } +} diff --git a/lib/content_views/finished_jobs_page.dart b/lib/content_views/finished_jobs_page.dart new file mode 100644 index 0000000..95815b1 --- /dev/null +++ b/lib/content_views/finished_jobs_page.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; + +class FinishedJobsPage extends ContentViewWidget { + const FinishedJobsPage({super.key}); + + @override + State createState() => _FinishedJobsPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: const Text( + 'Startseite', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + rightButtonEnabled: false, + rightButtonVisible: false, + rightButtonImage: null, + rightButtonOnPressed: () async { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: EmployeeEditProfileWidget()); + }); + } +} + +class _FinishedJobsPageState extends State { + void sendMessage(Widget message) { + //Messaging.instance.sendMessage(message); + } + + void _clicked() { + //sendMessage(const InfoDetailsWidget()); + } + + @override + Widget build(BuildContext context) { + return ListView( + children: [ + ListTile( + title: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + Text( + 'Dies ist ein linksbündigerText', + textAlign: TextAlign.left, + ), + Text( + 'Dies ist ein linksbündiger Text', + textAlign: TextAlign.left, + style: TextStyle( + color: Colors.blue, + fontSize: 24.0, + ), + ), + ], + ), + onTap: () { + _clicked(); + }, + ), + ], + ); + } +} diff --git a/lib/content_views/main_page.dart b/lib/content_views/main_page.dart new file mode 100644 index 0000000..cc8cd82 --- /dev/null +++ b/lib/content_views/main_page.dart @@ -0,0 +1,142 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; +import 'package:stadtbote/content_views/accepted_jobs_page.dart'; +import 'package:stadtbote/content_views/assigned_jobs_page.dart'; +import 'package:stadtbote/content_views/finished_jobs_page.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:stadtbote/popups/infos_popup.dart'; + +import '../main.dart'; +import '../model/job.dart'; +import '../tools/constants.dart'; +import '../tools/util.dart'; + +class MainPage extends ContentViewWidget { + const MainPage({super.key}); + + @override + State createState() => _MainPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: Container( + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 3), + child: Column(children: const [ + Text( + 'Zeile 1', + style: TextStyle( + color: Colors.white, + fontSize: 18.0, + ), + ), + SizedBox(height: 5), + Text( + 'Zeile 2', + style: TextStyle( + color: Colors.white, + fontSize: 18.0, + ), + ), + ]), + ), + rightButtonEnabled: true, + rightButtonVisible: true, + rightButtonImage: Util.fetchFutureIcon(const Icon(Icons.info_outline, size: 20.0, color: Colors.white)), + rightButtonOnPressed: () async { + showInfosPopup(context); + }); + } +} + +class _MainPageState extends State { + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + getDefaultButton( + 'Zugewiesene Aufträge', + image: Image.asset('assets/zugewiesene_auftraege.png', width: 30, height: 30), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const AssignedJobsPage())}), + const SizedBox(height: 10), + getDefaultButton( + 'Angenommene Aufträge', + image: Image.asset('assets/angenommene_auftraege.png', width: 30, height: 30), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const AcceptedJobsPage())}), + const SizedBox(height: 10), + getDefaultButton( + 'Erledigte Aufträge', + image: Image.asset('assets/erledigte_auftraege.png', width: 30, height: 30), + () => {BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage())}), + const SizedBox(height: 10), + getDefaultButton( + 'Nachrichten', + image: Image.asset('assets/nachrichten.png', width: 30, height: 30), + () => { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage()) + }), + const SizedBox(height: 10), + getDefaultButton( + 'Anfahrtsbereich', + image: Image.asset('assets/anfahrtsbereich.png', width: 30, height: 30), + () => { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage()) + }), + const SizedBox(height: 10), + getDefaultButton( + 'Abmelden', + image: Image.asset('assets/abmelden.png', width: 30, height: 30), + () => { + _test() + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: const FinishedJobsPage()) + }), + Expanded( + child: Container( + decoration: BoxDecoration( + color: Colors.transparent, + border: Border.all( + color: Colors.transparent, + width: 2.0, + ), + ), + ), + ), + Image.asset( + 'assets/sb_logo.png', + width: 100, + height: 100, + ), + ], + ), + ), + ], + ); + } + + void _test() async { + var json = await rootBundle.loadString('assets/job.json'); + var jsonMap = jsonDecode(json); + var payload = jsonMap["payload"]; + + var jobsPayload = JobsPayload.fromJson(payload); + + if (jobsPayload.jobs != null) { + MyApp.isarInstance.writeTxnSync(() { + for (var job in jobsPayload.jobs as List) { + MyApp.isarInstance.jobs.putSync(job); + } + }); + } + } +} diff --git a/lib/content_views/task_list_page.dart b/lib/content_views/task_list_page.dart new file mode 100644 index 0000000..0afc29e --- /dev/null +++ b/lib/content_views/task_list_page.dart @@ -0,0 +1,169 @@ +import 'package:flutter/material.dart'; +import 'package:isar/isar.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:stadtbote/model/job_tour.dart'; + +import '../main.dart'; +import '../model/task_info.dart'; +import '../tools/util.dart'; + +class TaskListPage extends ContentViewWidget { + const TaskListPage({super.key, required this.tour}); + + final JobTour tour; + + @override + State createState() => _TaskListPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: const Text( + 'Liste der Aufgaben', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + rightButtonEnabled: false, + rightButtonVisible: false, + rightButtonImage: null, + rightButtonOnPressed: () async { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: EmployeeEditProfileWidget()); + }); + } +} + +class _TaskListPageState extends State { + late bool _initCompleted = false; + + late List _taskList; + + @override + void initState() { + Future.delayed(const Duration(seconds: 0), () async { + _taskList = await _fetchTaskList(); + + _initCompleted = true; + + setState(() {}); + }); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (!_initCompleted) { + return Util.getWaitWidget(context); + } + + var steps = _initSteps(); + + return Padding( + padding: const EdgeInsets.all(8.0), + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + padding: const EdgeInsets.all(0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: steps, + ), + ), + ); + } + + List _initSteps() { + List steps = []; + for (int i=0; i<_taskList.length; i++) { + var taskInfo = _taskList[i]; + + steps.add( + ListTile( + minVerticalPadding: 0, + title: Container( + padding: const EdgeInsets.all(0), + height: 60, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Stack( + children: [ + Positioned( + left: 16.5, + top: i == 0 ? 5 : 0, + child: Container( + height: i == widget.tour.tasks.length - 1 ? 1: 60, + width: 6, + color: Colors.green + ), + ), + Column( + children: [ + Container( + width: 40, + height: 40, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.grey, + ), + child: const Icon(Icons.check, size: 30.0, color: Colors.white), + ), + ], + ), + ], + ), + const SizedBox(width: 20), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + taskInfo.task.topic, + textAlign: TextAlign.left, + style: const TextStyle( + color: Colors.blue, + fontSize: 15.0, + ), + ), + Text( + taskInfo.additionalText ?? '', + textAlign: TextAlign.left, + style: const TextStyle( + color: Colors.blue, + fontSize: 12.0, + ), + ), + ], + ), + ], + ), + ), + onTap: () { + print('1'); + }, + ), + ); + } + + return steps; + } + + Future> _fetchTaskList() async { + List taskList = []; + + for(var task in widget.tour.tasks) { + var taskInfo = await MyApp.isarInstance.taskInfos.filter().sIdEqualTo(task.sId).findFirst(); + taskInfo ??= TaskInfo(); + taskInfo.task = task; + + taskInfo.answer = null; + taskInfo.additionalText = null; + + taskList.add(taskInfo); + } + + return taskList; + } +} diff --git a/lib/content_views/tour_details_page.dart b/lib/content_views/tour_details_page.dart new file mode 100644 index 0000000..a07215b --- /dev/null +++ b/lib/content_views/tour_details_page.dart @@ -0,0 +1,148 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; +import 'package:stadtbote/content_views/task_list_page.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:stadtbote/model/job_tour.dart'; + +import '../model/job.dart'; +import '../popups/map_popup.dart'; +import '../tools/constants.dart'; +import '../tools/util.dart'; + +class TourDetailsPage extends ContentViewWidget { + const TourDetailsPage({super.key, required this.job, required this.tour}); + + final Job job; + final JobTour tour; + + @override + State createState() => _TourDetailsPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: const Text( + 'Details der Station', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + rightButtonEnabled: false, + rightButtonVisible: false, + rightButtonImage: null, + rightButtonOnPressed: () async { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: EmployeeEditProfileWidget()); + }); + } +} + +class _TourDetailsPageState extends State { + late bool _initCompleted = false; + + @override + void initState() { + Future.delayed(const Duration(seconds: 0), () async { + _initCompleted = true; + + setState(() {}); + }); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (!_initCompleted) { + return Util.getWaitWidget(context); + } + + var remark = ""; + if (widget.tour.rem.isNotEmpty) { + for (var remRow in widget.tour.rem) { + remark += "$remRow\n"; + } + } else { + remark = "* Keine Bemerkung vorhanden *"; + } + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Expanded( + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey, width: 0.5), + color: Colors.transparent, + borderRadius: const BorderRadius.all(Radius.circular(13)) + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "${"Station ${widget.tour.sort}"} ${mapTourMode(widget.tour.mode)}", + textAlign: TextAlign.left, + ), + Text( + widget.tour.comp, + textAlign: TextAlign.left, + ), + Text( + widget.tour.person, + textAlign: TextAlign.left, + ), + Text( + widget.tour.street, + textAlign: TextAlign.left, + ), + Text( + widget.tour.city, + textAlign: TextAlign.left, + ), + Text( + "Tel.: ${widget.tour.phone}", + textAlign: TextAlign.left, + ), + Text( + "Komm-#: ${widget.tour.com}", + textAlign: TextAlign.left, + ), + const SizedBox(height: 10), + getDefaultButton('Karte', () => + { + showMapPopup(context, widget.tour, widget.job.tours) + }), + ], + ), + ) + ), + const SizedBox(height: 10), + Expanded( + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey, width: 0.5), + color: Colors.transparent, + borderRadius: const BorderRadius.all(Radius.circular(13)) + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text(remark), + ] + ), + ), + ), + const SizedBox(height: 10), + getDefaultButton('Weiter', () => + { + BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: TaskListPage(tour: widget.tour)) + }), + ], + ), + ); + } +} diff --git a/lib/content_views/tour_list_page.dart b/lib/content_views/tour_list_page.dart new file mode 100644 index 0000000..227fb61 --- /dev/null +++ b/lib/content_views/tour_list_page.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; +import 'package:stadtbote/content_views/tour_details_page.dart'; +import 'package:stadtbote/content_views/utils/content_view_widget.dart'; +import 'package:stadtbote/content_views/utils/header_info.dart'; +import 'package:stadtbote/model/job_tour.dart'; + +import '../model/job.dart'; +import '../tools/constants.dart'; +import '../tools/util.dart'; + +class TourListPage extends ContentViewWidget { + const TourListPage({super.key, required this.job}); + + final Job job; + + @override + State createState() => _TourListPageState(); + + @override + Future getHeaderInfo(BuildContext context) async { + return HeaderInfo( + titleWidget: const Text( + 'Liste der Stationen', + style: TextStyle( + color: Colors.white, + fontSize: 24.0, + ), + ), + rightButtonEnabled: false, + rightButtonVisible: false, + rightButtonImage: null, + rightButtonOnPressed: () async { + //BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: EmployeeEditProfileWidget()); + }); + } +} + +class _TourListPageState extends State { + late List _tours; + + late bool _initCompleted = false; + + @override + void initState() { + Future.delayed(const Duration(seconds: 0), () async { + _tours = widget.job.tours; + + _initCompleted = true; + + setState(() {}); + }); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (!_initCompleted) { + return Util.getWaitWidget(context); + } + + late List jobWidgets = _createjobWidgets(); + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Container( + color: Colors.transparent, + child: Row( + children: [ + Text( + widget.job.id.toString(), + textAlign: TextAlign.left, + ), + ], + ), + ), + Row( + children: [ + Text( + widget.job.crFilter != null ? widget.job.crFilter.toString() : "Kein CR-Filter vorhanden", + textAlign: TextAlign.left, + ), + ], + ), + Row( + children: [ + const Icon(Icons.arrow_back, size: 30.0, color: Colors.black), + const SizedBox(width: 10), + Text( + widget.job.vhtId.toString() + ), + ], + ), + Expanded( + child: ListView( + padding: const EdgeInsets.all(0), + children: jobWidgets + ), + ) + + ], + ), + ); + } + + List _createjobWidgets() { + List jobWidgets = []; + + for (var tour in _tours) { + Color color = Colors.transparent; + switch(tour.state) { + case 1: + color = Colors.lightGreen; + break; + + default: + color = Colors.yellow; + break; + } + + jobWidgets.add( + ListTile( + contentPadding: const EdgeInsets.all(0), + onTap: () { + _clicked(tour); + }, + title: Container( + decoration: BoxDecoration( + border: Border.all(color: Colors.grey, width: 0.5), + color: color, + borderRadius: const BorderRadius.all(Radius.circular(13)) + ), + padding: const EdgeInsets.all(5.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "${"Station ${tour.sort}"} ${mapTourMode(tour.mode)}", + textAlign: TextAlign.left, + ), + Text( + tour.comp, + textAlign: TextAlign.left, + ), + Text( + tour.street, + textAlign: TextAlign.left, + ), + Text( + tour.city, + textAlign: TextAlign.left, + ), + ], + ), + ) + ), + ); + } + + return jobWidgets; + } + + void _clicked(JobTour tour) { + BroadcastReceiver().publish(Constants.messageTopicPushContentView, arguments: TourDetailsPage(job: widget.job, tour: tour)); + } +} diff --git a/lib/content_views/utils/content_view_widget.dart b/lib/content_views/utils/content_view_widget.dart new file mode 100644 index 0000000..ab1c854 --- /dev/null +++ b/lib/content_views/utils/content_view_widget.dart @@ -0,0 +1,13 @@ +import 'package:flutter/cupertino.dart'; + +import 'header_info.dart'; + +abstract class ContentViewWidget extends StatefulWidget { + const ContentViewWidget({super.key}); + + Future getHeaderInfo(BuildContext context); + + void close() { + close(); + } +} \ No newline at end of file diff --git a/lib/content_views/utils/header_info.dart b/lib/content_views/utils/header_info.dart new file mode 100644 index 0000000..bcb435b --- /dev/null +++ b/lib/content_views/utils/header_info.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; + +class HeaderInfo { + late Widget titleWidget; + late bool rightButtonEnabled; + late bool rightButtonVisible; + late Future? rightButtonImage; + late Function rightButtonOnPressed; + + HeaderInfo({required this.titleWidget, required this.rightButtonEnabled, required this.rightButtonVisible, this.rightButtonImage, required this.rightButtonOnPressed}); +} \ No newline at end of file diff --git a/lib/content_views/utils/widget_stack.dart b/lib/content_views/utils/widget_stack.dart new file mode 100644 index 0000000..13d9e86 --- /dev/null +++ b/lib/content_views/utils/widget_stack.dart @@ -0,0 +1,17 @@ +class WidgetStack { + final _list = []; + + void push(E value) => _list.add(value); + + E pop() => _list.removeLast(); + + E get peek => _list.last; + + bool get isEmpty => _list.isEmpty; + bool get isNotEmpty => _list.isNotEmpty; + + void clear() => _list.clear(); + + @override + String toString() => _list.toString(); +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..95878af --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,335 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; +import 'package:isar/isar.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:stadtbote/model/task_info.dart'; +import 'package:stadtbote/tools/colored_safe_area.dart'; +import 'package:stadtbote/model/status.dart'; +import 'package:stadtbote/tools/connection_status.dart'; + +import 'tools/mqtt_core.dart'; +import 'content_views/main_page.dart'; +import 'content_views/utils/content_view_widget.dart'; +import 'content_views/utils/widget_stack.dart'; +import 'model/job.dart'; +import 'tools/constants.dart'; +import 'tools/util.dart'; + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + + final dir = await getApplicationDocumentsDirectory(); + MyApp.isarInstance = await Isar.open([ + StatusSchema, + JobSchema, + TaskInfoSchema + ], directory: dir.path); + + runZonedGuarded(() { + }, (error, stackTrace) { + _traceUncaughtExceptions(error, stackTrace); + }); + + MqttCore.setup(); + + runApp(const MyApp()); +} + +void _traceUncaughtExceptions(Object error, StackTrace stackTrace) { + Util.logException('Ein Fehler ist aufgetreten: $error'); + Util.logException('Stack-Trace: $stackTrace'); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + static late Isar isarInstance; + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Stadtbote', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: const Main(), + ); + } +} + +class Main extends StatefulWidget { + const Main({super.key}); + + @override + State

createState() => _MainState(); +} + +class _MainState extends State
{ + late ContentViewWidget _currentContent; + late WidgetStack contentStack = WidgetStack(); + + late Widget _currentTitleWidget; + + late Widget _leftIconButton; + late Widget _rightIconButton; + + late bool _leftButtonVisible = false; + late bool _rightButtonVisible = false; + + late Function _rightButtonOnPressed; + late Function _leftButtonOnPressed; + + bool _initCompleted = false; + + final ValueNotifier _connectionLostValueNotifier = ValueNotifier(false); + + @override + void initState() { + super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + _initMessages(); + + _currentContent = const MainPage(); + + var headerInfo = await _currentContent.getHeaderInfo(context); + _currentTitleWidget = headerInfo.titleWidget; + + _leftButtonVisible = false; + _leftIconButton = const Icon(Icons.arrow_back, size: 20.0, color: Colors.white); + _leftButtonOnPressed = () { + _popContentView(); + }; + + _rightButtonVisible = headerInfo.rightButtonVisible; + _rightButtonOnPressed = headerInfo.rightButtonOnPressed; + if (headerInfo.rightButtonEnabled) { + _rightIconButton = await headerInfo.rightButtonImage as Widget; + } + + _initCompleted = true; + + setState(() {}); + }); + } + + @override + void dispose() { + super.dispose(); + + //_subscription.cancel(); + } + + @override + Widget build(BuildContext context) { + if (!_initCompleted) { + return Util.getWaitWidget(context); + } + + return ColoredSafeArea( + key: GlobalKey(), + child: WillPopScope( + onWillPop: () async { + return false; + }, + child: Scaffold( + appBar: PreferredSize( + preferredSize: const Size.fromHeight(70), + child: ColoredSafeArea( + key: const Key("appBar"), + child: SizedBox( + height: 80, + child: Padding( + padding: const EdgeInsets.all(8), + child: Stack( + alignment: Alignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Visibility( + visible: _leftButtonVisible, + child: Container( + width: 40, + height: 40, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + ), + child: FittedBox( + child: GestureDetector( + onTap: () async { + _leftButtonOnPressed(); + }, + child: CircleAvatar( + radius: 15, + child: Padding(padding: const EdgeInsets.all(1.0), child: _leftIconButton), + ), + ), + ), + ), + ), + Visibility( + visible: _rightButtonVisible, + child: Container( + width: 40, + height: 40, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.red, + ), + child: FittedBox( + child: GestureDetector( + onTap: () async { + _rightButtonOnPressed(); + }, + child: CircleAvatar( + radius: 15, + child: Padding(padding: const EdgeInsets.all(1.0), child: _rightIconButton), + ), + ), + ), + ), + ), + ], + ), + SizedBox( + height: 60, + width: 300, + child: Center( + heightFactor: 1, + child: _currentTitleWidget), + ), + ], + ), + ), + )), + ), + body: Column( + children: [ + ValueListenableBuilder( + valueListenable: _connectionLostValueNotifier, + builder: (context, value, child) { + return Visibility( + visible: value, + child: Container( + width: MediaQuery.of(context).size.width, + height: 30, + color: Colors.red, + child: const Center( + child: Text("*** OFFLINE ***", + style: TextStyle( + color: Colors.white, + fontSize: 15.0, + ),), + ), + ), + ); + }, + ), + Expanded(child: _currentContent), + ], + ),// This trailing comma makes auto-formatting nicer for build methods. + ), + ), + ); + } + + void _initMessages() { + BroadcastReceiver().subscribe(Constants.messageTopicPushContentView, (ContentViewWidget widget) { + _pushContentView(widget); + }); + BroadcastReceiver().subscribe(Constants.messageTopicPopContentView, (ContentViewWidget widget) { + _popContentView(); + }); + BroadcastReceiver().subscribe(Constants.messageTopicReplaceContentView, (ContentViewWidget widget) { + _replaceContentView(widget); + }); + BroadcastReceiver().subscribe(Constants.messageTopicHideRightButton, (hideButton) { + _hideRightButton(hideButton); + }); + BroadcastReceiver().subscribe(Constants.messageTopicConnectionStatusChanged, (ConnectionStatus connectionStatus) { + _connectionStatusChanged(connectionStatus); + }); + } + + void _replaceContentView(ContentViewWidget widget) async { + Future.delayed(const Duration(seconds: 0), () async { + contentStack.clear(); + + setState(() { + _currentContent = widget; + }); + + var headerInfo = await _currentContent.getHeaderInfo(context); + _currentTitleWidget = headerInfo.titleWidget; + _rightButtonVisible = headerInfo.rightButtonVisible; + _rightButtonOnPressed = headerInfo.rightButtonOnPressed; + + if (headerInfo.rightButtonEnabled) { + _rightIconButton = await headerInfo.rightButtonImage as Widget; + } + + _leftButtonVisible = false; + + setState(() {}); + }); + } + + void _popContentView() { + Future.delayed(const Duration(seconds: 0), () async { + var previousContentView = contentStack.pop(); + + _currentContent = previousContentView; + + var headerInfo = await _currentContent.getHeaderInfo(context); + _currentTitleWidget = headerInfo.titleWidget; + _rightButtonVisible = headerInfo.rightButtonVisible; + _rightButtonOnPressed = headerInfo.rightButtonOnPressed; + + if (headerInfo.rightButtonEnabled) { + _rightIconButton = await headerInfo.rightButtonImage as Widget; + } + + if (contentStack.isEmpty) { + _leftButtonVisible = false; + } + + setState(() {}); + }); + } + + void _pushContentView(ContentViewWidget widget) { + Future.delayed(const Duration(seconds: 0), () async { + contentStack.push(_currentContent); + + _currentContent = widget; + + var headerInfo = await _currentContent.getHeaderInfo(context); + + _currentTitleWidget = headerInfo.titleWidget; + _rightButtonVisible = headerInfo.rightButtonVisible; + _rightButtonOnPressed = headerInfo.rightButtonOnPressed; + + if (headerInfo.rightButtonEnabled) { + _rightIconButton = await headerInfo.rightButtonImage as Widget; + } + + _leftButtonVisible = true; + + setState(() {}); + }); + } + + void _hideRightButton(bool hideButton) { + setState(() { + _rightButtonVisible = !hideButton; + }); + } + + void _connectionStatusChanged(ConnectionStatus connectionStatus) { + _connectionLostValueNotifier.value = connectionStatus.status == ConnectionStatusEnum.notConnected; + } +} diff --git a/lib/model/bootstrap_request.dart b/lib/model/bootstrap_request.dart new file mode 100644 index 0000000..36dded5 --- /dev/null +++ b/lib/model/bootstrap_request.dart @@ -0,0 +1,22 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:stadtbote/model/device_object.dart'; + +part 'bootstrap_request.g.dart'; + +@JsonSerializable() +class BootstrapRequest { + late String app; + late int ver; + late String mqttClientId; + + @JsonKey(name: 'device') + late DeviceObject deviceObject; + + BootstrapRequest(); + + factory BootstrapRequest.fromJson(Map json) => _$BootstrapRequestFromJson(json); + + Map toJson() => _$BootstrapRequestToJson(this); +} + diff --git a/lib/model/bootstrap_request.g.dart b/lib/model/bootstrap_request.g.dart new file mode 100644 index 0000000..3818deb --- /dev/null +++ b/lib/model/bootstrap_request.g.dart @@ -0,0 +1,23 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bootstrap_request.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BootstrapRequest _$BootstrapRequestFromJson(Map json) => + BootstrapRequest() + ..app = json['app'] as String + ..ver = json['ver'] as int + ..mqttClientId = json['mqttClientId'] as String + ..deviceObject = + DeviceObject.fromJson(json['device'] as Map); + +Map _$BootstrapRequestToJson(BootstrapRequest instance) => + { + 'app': instance.app, + 'ver': instance.ver, + 'mqttClientId': instance.mqttClientId, + 'device': instance.deviceObject, + }; diff --git a/lib/model/bootstrap_response_config.dart b/lib/model/bootstrap_response_config.dart new file mode 100644 index 0000000..a6a487d --- /dev/null +++ b/lib/model/bootstrap_response_config.dart @@ -0,0 +1,21 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:stadtbote/model/bootstrap_response_topics.dart'; +import 'package:stadtbote/model/device_object.dart'; + +part 'bootstrap_response_config.g.dart'; + +@JsonSerializable() +class BootstrapResponseConfig +{ + late String broker; + + late BootstrapResponseTopics topics; + + BootstrapResponseConfig(); + + factory BootstrapResponseConfig.fromJson(Map json) => _$BootstrapResponseConfigFromJson(json); + + Map toJson() => _$BootstrapResponseConfigToJson(this); +} + diff --git a/lib/model/bootstrap_response_config.g.dart b/lib/model/bootstrap_response_config.g.dart new file mode 100644 index 0000000..edfa3da --- /dev/null +++ b/lib/model/bootstrap_response_config.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bootstrap_response_config.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BootstrapResponseConfig _$BootstrapResponseConfigFromJson( + Map json) => + BootstrapResponseConfig() + ..broker = json['broker'] as String + ..topics = BootstrapResponseTopics.fromJson( + json['topics'] as Map); + +Map _$BootstrapResponseConfigToJson( + BootstrapResponseConfig instance) => + { + 'broker': instance.broker, + 'topics': instance.topics, + }; diff --git a/lib/model/bootstrap_response_payload.dart b/lib/model/bootstrap_response_payload.dart new file mode 100644 index 0000000..d7b2ccf --- /dev/null +++ b/lib/model/bootstrap_response_payload.dart @@ -0,0 +1,19 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:stadtbote/model/bootstrap_response_config.dart'; +import 'package:stadtbote/model/device_object.dart'; + +part 'bootstrap_response_payload.g.dart'; + +@JsonSerializable() +class BootstrapResponsePayload +{ + late BootstrapResponseConfig config; + + BootstrapResponsePayload(); + + factory BootstrapResponsePayload.fromJson(Map json) => _$BootstrapResponsePayloadFromJson(json); + + Map toJson() => _$BootstrapResponsePayloadToJson(this); +} + diff --git a/lib/model/bootstrap_response_payload.g.dart b/lib/model/bootstrap_response_payload.g.dart new file mode 100644 index 0000000..552db65 --- /dev/null +++ b/lib/model/bootstrap_response_payload.g.dart @@ -0,0 +1,19 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bootstrap_response_payload.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BootstrapResponsePayload _$BootstrapResponsePayloadFromJson( + Map json) => + BootstrapResponsePayload() + ..config = BootstrapResponseConfig.fromJson( + json['config'] as Map); + +Map _$BootstrapResponsePayloadToJson( + BootstrapResponsePayload instance) => + { + 'config': instance.config, + }; diff --git a/lib/model/bootstrap_response_topics.dart b/lib/model/bootstrap_response_topics.dart new file mode 100644 index 0000000..43b4ae8 --- /dev/null +++ b/lib/model/bootstrap_response_topics.dart @@ -0,0 +1,22 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:stadtbote/model/device_object.dart'; + +part 'bootstrap_response_topics.g.dart'; + +@JsonSerializable() +class BootstrapResponseTopics +{ + @JsonKey(name: 'to_server') + late String toServer; + + @JsonKey(name: 'from_server') + late String fromServer; + + BootstrapResponseTopics(); + + factory BootstrapResponseTopics.fromJson(Map json) => _$BootstrapResponseTopicsFromJson(json); + + Map toJson() => _$BootstrapResponseTopicsToJson(this); +} + diff --git a/lib/model/bootstrap_response_topics.g.dart b/lib/model/bootstrap_response_topics.g.dart new file mode 100644 index 0000000..8f22eab --- /dev/null +++ b/lib/model/bootstrap_response_topics.g.dart @@ -0,0 +1,20 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'bootstrap_response_topics.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +BootstrapResponseTopics _$BootstrapResponseTopicsFromJson( + Map json) => + BootstrapResponseTopics() + ..toServer = json['to_server'] as String + ..fromServer = json['from_server'] as String; + +Map _$BootstrapResponseTopicsToJson( + BootstrapResponseTopics instance) => + { + 'to_server': instance.toServer, + 'from_server': instance.fromServer, + }; diff --git a/lib/model/device_object.dart b/lib/model/device_object.dart new file mode 100644 index 0000000..db2d2c7 --- /dev/null +++ b/lib/model/device_object.dart @@ -0,0 +1,18 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'device_object.g.dart'; + +@JsonSerializable() +class DeviceObject { + late String model; + late String manufacturer; + late String os; + late String osVer; + + DeviceObject(); + + factory DeviceObject.fromJson(Map json) => _$DeviceObjectFromJson(json); + + Map toJson() => _$DeviceObjectToJson(this); +} \ No newline at end of file diff --git a/lib/model/device_object.g.dart b/lib/model/device_object.g.dart new file mode 100644 index 0000000..bcd1f71 --- /dev/null +++ b/lib/model/device_object.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'device_object.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +DeviceObject _$DeviceObjectFromJson(Map json) => DeviceObject() + ..model = json['model'] as String + ..manufacturer = json['manufacturer'] as String + ..os = json['os'] as String + ..osVer = json['osVer'] as String; + +Map _$DeviceObjectToJson(DeviceObject instance) => + { + 'model': instance.model, + 'manufacturer': instance.manufacturer, + 'os': instance.os, + 'osVer': instance.osVer, + }; diff --git a/lib/model/job.dart b/lib/model/job.dart new file mode 100644 index 0000000..d14f389 --- /dev/null +++ b/lib/model/job.dart @@ -0,0 +1,49 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:stadtbote/model/job_tour.dart'; +import 'package:stadtbote/model/tour_position.dart'; +import 'package:stadtbote/model/tour_task.dart'; + +part 'job.g.dart'; + +@JsonSerializable() +class JobsPayload { + List? jobs; + + JobsPayload({this.jobs}); + + factory JobsPayload.fromJson(Map json) => _$JobsPayloadFromJson(json); + + Map toJson() => _$JobsPayloadToJson(this); +} + +@collection +@JsonSerializable() +class Job { + late Id id; + @JsonKey(name: 'ver') + late int ver; + @JsonKey(name: 'state') + late int state; + @JsonKey(name: 'cr_filter') + late String? crFilter; + @JsonKey(name: 'ordertime') + late String ordertime; + @JsonKey(name: 'offs_warn') + late int offsWarn; + @JsonKey(name: 'global') + late bool global; + @JsonKey(name: 'vht_id') + late int vhtId; + @JsonKey(name: 'rem') + late List rem; + @JsonKey(name: 'tours') + late List tours; + + Job(); + + factory Job.fromJson(Map json) => _$JobFromJson(json); + + Map toJson() => _$JobToJson(this); +} + diff --git a/lib/model/job.g.dart b/lib/model/job.g.dart new file mode 100644 index 0000000..675b7fc --- /dev/null +++ b/lib/model/job.g.dart @@ -0,0 +1,1474 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'job.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetJobCollection on Isar { + IsarCollection get jobs => this.collection(); +} + +const JobSchema = CollectionSchema( + name: r'Job', + id: -5961302972855324388, + properties: { + r'crFilter': PropertySchema( + id: 0, + name: r'crFilter', + type: IsarType.string, + ), + r'global': PropertySchema( + id: 1, + name: r'global', + type: IsarType.bool, + ), + r'offsWarn': PropertySchema( + id: 2, + name: r'offsWarn', + type: IsarType.long, + ), + r'ordertime': PropertySchema( + id: 3, + name: r'ordertime', + type: IsarType.string, + ), + r'rem': PropertySchema( + id: 4, + name: r'rem', + type: IsarType.stringList, + ), + r'state': PropertySchema( + id: 5, + name: r'state', + type: IsarType.long, + ), + r'tours': PropertySchema( + id: 6, + name: r'tours', + type: IsarType.objectList, + target: r'JobTour', + ), + r'ver': PropertySchema( + id: 7, + name: r'ver', + type: IsarType.long, + ), + r'vhtId': PropertySchema( + id: 8, + name: r'vhtId', + type: IsarType.long, + ) + }, + estimateSize: _jobEstimateSize, + serialize: _jobSerialize, + deserialize: _jobDeserialize, + deserializeProp: _jobDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: { + r'JobTour': JobTourSchema, + r'TourPosition': TourPositionSchema, + r'TourTask': TourTaskSchema + }, + getId: _jobGetId, + getLinks: _jobGetLinks, + attach: _jobAttach, + version: '3.1.0+1', +); + +int _jobEstimateSize( + Job object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.crFilter; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + bytesCount += 3 + object.ordertime.length * 3; + bytesCount += 3 + object.rem.length * 3; + { + for (var i = 0; i < object.rem.length; i++) { + final value = object.rem[i]; + bytesCount += value.length * 3; + } + } + bytesCount += 3 + object.tours.length * 3; + { + final offsets = allOffsets[JobTour]!; + for (var i = 0; i < object.tours.length; i++) { + final value = object.tours[i]; + bytesCount += JobTourSchema.estimateSize(value, offsets, allOffsets); + } + } + return bytesCount; +} + +void _jobSerialize( + Job object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.crFilter); + writer.writeBool(offsets[1], object.global); + writer.writeLong(offsets[2], object.offsWarn); + writer.writeString(offsets[3], object.ordertime); + writer.writeStringList(offsets[4], object.rem); + writer.writeLong(offsets[5], object.state); + writer.writeObjectList( + offsets[6], + allOffsets, + JobTourSchema.serialize, + object.tours, + ); + writer.writeLong(offsets[7], object.ver); + writer.writeLong(offsets[8], object.vhtId); +} + +Job _jobDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Job(); + object.crFilter = reader.readStringOrNull(offsets[0]); + object.global = reader.readBool(offsets[1]); + object.id = id; + object.offsWarn = reader.readLong(offsets[2]); + object.ordertime = reader.readString(offsets[3]); + object.rem = reader.readStringList(offsets[4]) ?? []; + object.state = reader.readLong(offsets[5]); + object.tours = reader.readObjectList( + offsets[6], + JobTourSchema.deserialize, + allOffsets, + JobTour(), + ) ?? + []; + object.ver = reader.readLong(offsets[7]); + object.vhtId = reader.readLong(offsets[8]); + return object; +} + +P _jobDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readBool(offset)) as P; + case 2: + return (reader.readLong(offset)) as P; + case 3: + return (reader.readString(offset)) as P; + case 4: + return (reader.readStringList(offset) ?? []) as P; + case 5: + return (reader.readLong(offset)) as P; + case 6: + return (reader.readObjectList( + offset, + JobTourSchema.deserialize, + allOffsets, + JobTour(), + ) ?? + []) as P; + case 7: + return (reader.readLong(offset)) as P; + case 8: + return (reader.readLong(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _jobGetId(Job object) { + return object.id; +} + +List> _jobGetLinks(Job object) { + return []; +} + +void _jobAttach(IsarCollection col, Id id, Job object) { + object.id = id; +} + +extension JobQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension JobQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension JobQueryFilter on QueryBuilder { + QueryBuilder crFilterIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'crFilter', + )); + }); + } + + QueryBuilder crFilterIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'crFilter', + )); + }); + } + + QueryBuilder crFilterEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'crFilter', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'crFilter', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'crFilter', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'crFilter', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'crFilter', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'crFilter', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'crFilter', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'crFilter', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder crFilterIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'crFilter', + value: '', + )); + }); + } + + QueryBuilder crFilterIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'crFilter', + value: '', + )); + }); + } + + QueryBuilder globalEqualTo(bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'global', + value: value, + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder offsWarnEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'offsWarn', + value: value, + )); + }); + } + + QueryBuilder offsWarnGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'offsWarn', + value: value, + )); + }); + } + + QueryBuilder offsWarnLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'offsWarn', + value: value, + )); + }); + } + + QueryBuilder offsWarnBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'offsWarn', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder ordertimeEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ordertime', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'ordertime', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'ordertime', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'ordertime', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'ordertime', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'ordertime', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'ordertime', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'ordertime', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder ordertimeIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ordertime', + value: '', + )); + }); + } + + QueryBuilder ordertimeIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'ordertime', + value: '', + )); + }); + } + + QueryBuilder remElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'rem', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'rem', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rem', + value: '', + )); + }); + } + + QueryBuilder remElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'rem', + value: '', + )); + }); + } + + QueryBuilder remLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder remIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder remIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder remLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder remLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder remLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder stateEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'state', + value: value, + )); + }); + } + + QueryBuilder stateGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'state', + value: value, + )); + }); + } + + QueryBuilder stateLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'state', + value: value, + )); + }); + } + + QueryBuilder stateBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'state', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder toursLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tours', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder toursIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tours', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder toursIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tours', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder toursLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tours', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder toursLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tours', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder toursLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tours', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder verEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'ver', + value: value, + )); + }); + } + + QueryBuilder verGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'ver', + value: value, + )); + }); + } + + QueryBuilder verLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'ver', + value: value, + )); + }); + } + + QueryBuilder verBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'ver', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder vhtIdEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'vhtId', + value: value, + )); + }); + } + + QueryBuilder vhtIdGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'vhtId', + value: value, + )); + }); + } + + QueryBuilder vhtIdLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'vhtId', + value: value, + )); + }); + } + + QueryBuilder vhtIdBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'vhtId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension JobQueryObject on QueryBuilder { + QueryBuilder toursElement( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'tours'); + }); + } +} + +extension JobQueryLinks on QueryBuilder {} + +extension JobQuerySortBy on QueryBuilder { + QueryBuilder sortByCrFilter() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crFilter', Sort.asc); + }); + } + + QueryBuilder sortByCrFilterDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crFilter', Sort.desc); + }); + } + + QueryBuilder sortByGlobal() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'global', Sort.asc); + }); + } + + QueryBuilder sortByGlobalDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'global', Sort.desc); + }); + } + + QueryBuilder sortByOffsWarn() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'offsWarn', Sort.asc); + }); + } + + QueryBuilder sortByOffsWarnDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'offsWarn', Sort.desc); + }); + } + + QueryBuilder sortByOrdertime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ordertime', Sort.asc); + }); + } + + QueryBuilder sortByOrdertimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ordertime', Sort.desc); + }); + } + + QueryBuilder sortByState() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'state', Sort.asc); + }); + } + + QueryBuilder sortByStateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'state', Sort.desc); + }); + } + + QueryBuilder sortByVer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ver', Sort.asc); + }); + } + + QueryBuilder sortByVerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ver', Sort.desc); + }); + } + + QueryBuilder sortByVhtId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.asc); + }); + } + + QueryBuilder sortByVhtIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.desc); + }); + } +} + +extension JobQuerySortThenBy on QueryBuilder { + QueryBuilder thenByCrFilter() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crFilter', Sort.asc); + }); + } + + QueryBuilder thenByCrFilterDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crFilter', Sort.desc); + }); + } + + QueryBuilder thenByGlobal() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'global', Sort.asc); + }); + } + + QueryBuilder thenByGlobalDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'global', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByOffsWarn() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'offsWarn', Sort.asc); + }); + } + + QueryBuilder thenByOffsWarnDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'offsWarn', Sort.desc); + }); + } + + QueryBuilder thenByOrdertime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ordertime', Sort.asc); + }); + } + + QueryBuilder thenByOrdertimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ordertime', Sort.desc); + }); + } + + QueryBuilder thenByState() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'state', Sort.asc); + }); + } + + QueryBuilder thenByStateDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'state', Sort.desc); + }); + } + + QueryBuilder thenByVer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ver', Sort.asc); + }); + } + + QueryBuilder thenByVerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'ver', Sort.desc); + }); + } + + QueryBuilder thenByVhtId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.asc); + }); + } + + QueryBuilder thenByVhtIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.desc); + }); + } +} + +extension JobQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByCrFilter( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'crFilter', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByGlobal() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'global'); + }); + } + + QueryBuilder distinctByOffsWarn() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'offsWarn'); + }); + } + + QueryBuilder distinctByOrdertime( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ordertime', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByRem() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'rem'); + }); + } + + QueryBuilder distinctByState() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'state'); + }); + } + + QueryBuilder distinctByVer() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'ver'); + }); + } + + QueryBuilder distinctByVhtId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'vhtId'); + }); + } +} + +extension JobQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder crFilterProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'crFilter'); + }); + } + + QueryBuilder globalProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'global'); + }); + } + + QueryBuilder offsWarnProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'offsWarn'); + }); + } + + QueryBuilder ordertimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ordertime'); + }); + } + + QueryBuilder, QQueryOperations> remProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'rem'); + }); + } + + QueryBuilder stateProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'state'); + }); + } + + QueryBuilder, QQueryOperations> toursProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'tours'); + }); + } + + QueryBuilder verProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'ver'); + }); + } + + QueryBuilder vhtIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'vhtId'); + }); + } +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +JobsPayload _$JobsPayloadFromJson(Map json) => JobsPayload( + jobs: (json['jobs'] as List?) + ?.map((e) => Job.fromJson(e as Map)) + .toList(), + ); + +Map _$JobsPayloadToJson(JobsPayload instance) => + { + 'jobs': instance.jobs, + }; + +Job _$JobFromJson(Map json) => Job() + ..id = json['id'] as int + ..ver = json['ver'] as int + ..state = json['state'] as int + ..crFilter = json['cr_filter'] as String? + ..ordertime = json['ordertime'] as String + ..offsWarn = json['offs_warn'] as int + ..global = json['global'] as bool + ..vhtId = json['vht_id'] as int + ..rem = (json['rem'] as List).map((e) => e as String).toList() + ..tours = (json['tours'] as List) + .map((e) => JobTour.fromJson(e as Map)) + .toList(); + +Map _$JobToJson(Job instance) => { + 'id': instance.id, + 'ver': instance.ver, + 'state': instance.state, + 'cr_filter': instance.crFilter, + 'ordertime': instance.ordertime, + 'offs_warn': instance.offsWarn, + 'global': instance.global, + 'vht_id': instance.vhtId, + 'rem': instance.rem, + 'tours': instance.tours, + }; diff --git a/lib/model/job_tour.dart b/lib/model/job_tour.dart new file mode 100644 index 0000000..8bf8e00 --- /dev/null +++ b/lib/model/job_tour.dart @@ -0,0 +1,30 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; +import 'package:stadtbote/model/tour_position.dart'; +import 'package:stadtbote/model/tour_task.dart'; + +part 'job_tour.g.dart'; + +@embedded +@JsonSerializable() +class JobTour { + late int id; + late int sort; + late int state; + late String mode; + late String comp; + late String person; + late String phone; + late String street; + late String city; + late String com; + late TourPosition? pos; + late List rem; + late List tasks; + + JobTour(); + + factory JobTour.fromJson(Map json) => _$JobTourFromJson(json); + + Map toJson() => _$JobTourToJson(this); +} diff --git a/lib/model/job_tour.g.dart b/lib/model/job_tour.g.dart new file mode 100644 index 0000000..cf299a9 --- /dev/null +++ b/lib/model/job_tour.g.dart @@ -0,0 +1,1679 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'job_tour.dart'; + +// ************************************************************************** +// IsarEmbeddedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const JobTourSchema = Schema( + name: r'JobTour', + id: -2365561616341050237, + properties: { + r'city': PropertySchema( + id: 0, + name: r'city', + type: IsarType.string, + ), + r'com': PropertySchema( + id: 1, + name: r'com', + type: IsarType.string, + ), + r'comp': PropertySchema( + id: 2, + name: r'comp', + type: IsarType.string, + ), + r'id': PropertySchema( + id: 3, + name: r'id', + type: IsarType.long, + ), + r'mode': PropertySchema( + id: 4, + name: r'mode', + type: IsarType.string, + ), + r'person': PropertySchema( + id: 5, + name: r'person', + type: IsarType.string, + ), + r'phone': PropertySchema( + id: 6, + name: r'phone', + type: IsarType.string, + ), + r'pos': PropertySchema( + id: 7, + name: r'pos', + type: IsarType.object, + target: r'TourPosition', + ), + r'rem': PropertySchema( + id: 8, + name: r'rem', + type: IsarType.stringList, + ), + r'sort': PropertySchema( + id: 9, + name: r'sort', + type: IsarType.long, + ), + r'state': PropertySchema( + id: 10, + name: r'state', + type: IsarType.long, + ), + r'street': PropertySchema( + id: 11, + name: r'street', + type: IsarType.string, + ), + r'tasks': PropertySchema( + id: 12, + name: r'tasks', + type: IsarType.objectList, + target: r'TourTask', + ) + }, + estimateSize: _jobTourEstimateSize, + serialize: _jobTourSerialize, + deserialize: _jobTourDeserialize, + deserializeProp: _jobTourDeserializeProp, +); + +int _jobTourEstimateSize( + JobTour object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.city.length * 3; + bytesCount += 3 + object.com.length * 3; + bytesCount += 3 + object.comp.length * 3; + bytesCount += 3 + object.mode.length * 3; + bytesCount += 3 + object.person.length * 3; + bytesCount += 3 + object.phone.length * 3; + { + final value = object.pos; + if (value != null) { + bytesCount += 3 + + TourPositionSchema.estimateSize( + value, allOffsets[TourPosition]!, allOffsets); + } + } + bytesCount += 3 + object.rem.length * 3; + { + for (var i = 0; i < object.rem.length; i++) { + final value = object.rem[i]; + bytesCount += value.length * 3; + } + } + bytesCount += 3 + object.street.length * 3; + bytesCount += 3 + object.tasks.length * 3; + { + final offsets = allOffsets[TourTask]!; + for (var i = 0; i < object.tasks.length; i++) { + final value = object.tasks[i]; + bytesCount += TourTaskSchema.estimateSize(value, offsets, allOffsets); + } + } + return bytesCount; +} + +void _jobTourSerialize( + JobTour object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.city); + writer.writeString(offsets[1], object.com); + writer.writeString(offsets[2], object.comp); + writer.writeLong(offsets[3], object.id); + writer.writeString(offsets[4], object.mode); + writer.writeString(offsets[5], object.person); + writer.writeString(offsets[6], object.phone); + writer.writeObject( + offsets[7], + allOffsets, + TourPositionSchema.serialize, + object.pos, + ); + writer.writeStringList(offsets[8], object.rem); + writer.writeLong(offsets[9], object.sort); + writer.writeLong(offsets[10], object.state); + writer.writeString(offsets[11], object.street); + writer.writeObjectList( + offsets[12], + allOffsets, + TourTaskSchema.serialize, + object.tasks, + ); +} + +JobTour _jobTourDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = JobTour(); + object.city = reader.readString(offsets[0]); + object.com = reader.readString(offsets[1]); + object.comp = reader.readString(offsets[2]); + object.id = reader.readLong(offsets[3]); + object.mode = reader.readString(offsets[4]); + object.person = reader.readString(offsets[5]); + object.phone = reader.readString(offsets[6]); + object.pos = reader.readObjectOrNull( + offsets[7], + TourPositionSchema.deserialize, + allOffsets, + ); + object.rem = reader.readStringList(offsets[8]) ?? []; + object.sort = reader.readLong(offsets[9]); + object.state = reader.readLong(offsets[10]); + object.street = reader.readString(offsets[11]); + object.tasks = reader.readObjectList( + offsets[12], + TourTaskSchema.deserialize, + allOffsets, + TourTask(), + ) ?? + []; + return object; +} + +P _jobTourDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readString(offset)) as P; + case 1: + return (reader.readString(offset)) as P; + case 2: + return (reader.readString(offset)) as P; + case 3: + return (reader.readLong(offset)) as P; + case 4: + return (reader.readString(offset)) as P; + case 5: + return (reader.readString(offset)) as P; + case 6: + return (reader.readString(offset)) as P; + case 7: + return (reader.readObjectOrNull( + offset, + TourPositionSchema.deserialize, + allOffsets, + )) as P; + case 8: + return (reader.readStringList(offset) ?? []) as P; + case 9: + return (reader.readLong(offset)) as P; + case 10: + return (reader.readLong(offset)) as P; + case 11: + return (reader.readString(offset)) as P; + case 12: + return (reader.readObjectList( + offset, + TourTaskSchema.deserialize, + allOffsets, + TourTask(), + ) ?? + []) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension JobTourQueryFilter + on QueryBuilder { + QueryBuilder cityEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'city', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'city', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'city', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'city', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'city', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'city', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'city', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'city', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder cityIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'city', + value: '', + )); + }); + } + + QueryBuilder cityIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'city', + value: '', + )); + }); + } + + QueryBuilder comEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'com', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'com', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'com', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'com', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'com', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'com', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'com', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'com', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder comIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'com', + value: '', + )); + }); + } + + QueryBuilder comIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'com', + value: '', + )); + }); + } + + QueryBuilder compEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'comp', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'comp', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'comp', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'comp', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'comp', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'comp', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'comp', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'comp', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder compIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'comp', + value: '', + )); + }); + } + + QueryBuilder compIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'comp', + value: '', + )); + }); + } + + QueryBuilder idEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder modeEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'mode', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'mode', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'mode', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'mode', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'mode', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'mode', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'mode', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'mode', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder modeIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'mode', + value: '', + )); + }); + } + + QueryBuilder modeIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'mode', + value: '', + )); + }); + } + + QueryBuilder personEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'person', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'person', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'person', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'person', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'person', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'person', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'person', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'person', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder personIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'person', + value: '', + )); + }); + } + + QueryBuilder personIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'person', + value: '', + )); + }); + } + + QueryBuilder phoneEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'phone', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'phone', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'phone', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'phone', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'phone', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'phone', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'phone', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'phone', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder phoneIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'phone', + value: '', + )); + }); + } + + QueryBuilder phoneIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'phone', + value: '', + )); + }); + } + + QueryBuilder posIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'pos', + )); + }); + } + + QueryBuilder posIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'pos', + )); + }); + } + + QueryBuilder remElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'rem', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'rem', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'rem', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder remElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rem', + value: '', + )); + }); + } + + QueryBuilder remElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'rem', + value: '', + )); + }); + } + + QueryBuilder remLengthEqualTo( + int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder remIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder remIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder remLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder remLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder remLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'rem', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder sortEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sort', + value: value, + )); + }); + } + + QueryBuilder sortGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'sort', + value: value, + )); + }); + } + + QueryBuilder sortLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'sort', + value: value, + )); + }); + } + + QueryBuilder sortBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'sort', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder stateEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'state', + value: value, + )); + }); + } + + QueryBuilder stateGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'state', + value: value, + )); + }); + } + + QueryBuilder stateLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'state', + value: value, + )); + }); + } + + QueryBuilder stateBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'state', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder streetEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'street', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'street', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'street', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'street', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'street', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'street', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'street', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'street', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder streetIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'street', + value: '', + )); + }); + } + + QueryBuilder streetIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'street', + value: '', + )); + }); + } + + QueryBuilder tasksLengthEqualTo( + int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tasks', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder tasksIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tasks', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder tasksIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tasks', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder tasksLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tasks', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder tasksLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tasks', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder tasksLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'tasks', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } +} + +extension JobTourQueryObject + on QueryBuilder { + QueryBuilder pos( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'pos'); + }); + } + + QueryBuilder tasksElement( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'tasks'); + }); + } +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +JobTour _$JobTourFromJson(Map json) => JobTour() + ..id = json['id'] as int + ..sort = json['sort'] as int + ..state = json['state'] as int + ..mode = json['mode'] as String + ..comp = json['comp'] as String + ..person = json['person'] as String + ..phone = json['phone'] as String + ..street = json['street'] as String + ..city = json['city'] as String + ..com = json['com'] as String + ..pos = json['pos'] == null + ? null + : TourPosition.fromJson(json['pos'] as Map) + ..rem = (json['rem'] as List).map((e) => e as String).toList() + ..tasks = (json['tasks'] as List) + .map((e) => TourTask.fromJson(e as Map)) + .toList(); + +Map _$JobTourToJson(JobTour instance) => { + 'id': instance.id, + 'sort': instance.sort, + 'state': instance.state, + 'mode': instance.mode, + 'comp': instance.comp, + 'person': instance.person, + 'phone': instance.phone, + 'street': instance.street, + 'city': instance.city, + 'com': instance.com, + 'pos': instance.pos, + 'rem': instance.rem, + 'tasks': instance.tasks, + }; diff --git a/lib/model/short_poll.dart b/lib/model/short_poll.dart new file mode 100644 index 0000000..992537c --- /dev/null +++ b/lib/model/short_poll.dart @@ -0,0 +1,104 @@ +import 'package:isar/isar.dart'; +import 'package:stadtbote/model/short_poll_question.dart'; + +part 'short_poll.g.dart'; + +@collection +class ShortPoll { + late Id id; + + late int type; + + late String text; + + late String title; + + late int validFrom; + + late int validTo; + + late int? imageWidth; + + late int? imageHeight; + + late String? imageModified; + + late bool? commentsAllowed; + + late bool read = false; + + late String? url; + + late String? pdfName; + + late bool voted; + + late int numberOfVotes; + + late List questions; + + ShortPoll({ + required this.id, + required this.type, + required this.text, + required this.title, + required this.validFrom, + required this.validTo, + this.imageWidth, + this.imageHeight, + this.imageModified, + this.commentsAllowed, + required this.read, + this.url, + this.pdfName, + required this.voted, + required this.numberOfVotes, + required this.questions, + }); + + /*factory ShortPoll.fromJson(Map json) { + List questions = []; + + if (json["answers"] != null) { + questions = List.from( + json["answers"].map((x) => ShortPollQuestion.fromJson(x))); + } + + return ShortPoll( + id: json["id"], + type: json["type"], + text: json["text"], + title: json["title"], + validFrom: json["validFrom"], + validTo: json["validTo"], + imageWidth: json["imageWidth"], + imageHeight: json["imageHeight"], + imageModified: json["imageModified"], + commentsAllowed: json["commentsAllowed"], + read: json["read"], + url: json["url"], + pdfName: json["pdfName"], + voted: json["voted"], + numberOfVotes: json["numberOfVotes"], + questions: questions, + ); + } + + Map toJson() => { + "id": id, + "type": type, + "text": text, + "title": title, + "validFrom": validFrom, + "validTo": validTo, + "imageWidth": imageWidth, + "imageHeight": imageHeight, + "imageModified": imageModified, + "commentsAllowed": commentsAllowed, + "read": read, + "url": url, + "pdfName": pdfName, + "voted": voted, + "numberOfVotes": numberOfVotes, + };*/ +} \ No newline at end of file diff --git a/lib/model/short_poll.g.dart b/lib/model/short_poll.g.dart new file mode 100644 index 0000000..2ab3865 --- /dev/null +++ b/lib/model/short_poll.g.dart @@ -0,0 +1,2162 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'short_poll.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetShortPollCollection on Isar { + IsarCollection get shortPolls => this.collection(); +} + +const ShortPollSchema = CollectionSchema( + name: r'ShortPoll', + id: -3233511297786412096, + properties: { + r'commentsAllowed': PropertySchema( + id: 0, + name: r'commentsAllowed', + type: IsarType.bool, + ), + r'imageHeight': PropertySchema( + id: 1, + name: r'imageHeight', + type: IsarType.long, + ), + r'imageModified': PropertySchema( + id: 2, + name: r'imageModified', + type: IsarType.string, + ), + r'imageWidth': PropertySchema( + id: 3, + name: r'imageWidth', + type: IsarType.long, + ), + r'numberOfVotes': PropertySchema( + id: 4, + name: r'numberOfVotes', + type: IsarType.long, + ), + r'pdfName': PropertySchema( + id: 5, + name: r'pdfName', + type: IsarType.string, + ), + r'questions': PropertySchema( + id: 6, + name: r'questions', + type: IsarType.objectList, + target: r'ShortPollQuestion', + ), + r'read': PropertySchema( + id: 7, + name: r'read', + type: IsarType.bool, + ), + r'text': PropertySchema( + id: 8, + name: r'text', + type: IsarType.string, + ), + r'title': PropertySchema( + id: 9, + name: r'title', + type: IsarType.string, + ), + r'type': PropertySchema( + id: 10, + name: r'type', + type: IsarType.long, + ), + r'url': PropertySchema( + id: 11, + name: r'url', + type: IsarType.string, + ), + r'validFrom': PropertySchema( + id: 12, + name: r'validFrom', + type: IsarType.long, + ), + r'validTo': PropertySchema( + id: 13, + name: r'validTo', + type: IsarType.long, + ), + r'voted': PropertySchema( + id: 14, + name: r'voted', + type: IsarType.bool, + ) + }, + estimateSize: _shortPollEstimateSize, + serialize: _shortPollSerialize, + deserialize: _shortPollDeserialize, + deserializeProp: _shortPollDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {r'ShortPollQuestion': ShortPollQuestionSchema}, + getId: _shortPollGetId, + getLinks: _shortPollGetLinks, + attach: _shortPollAttach, + version: '3.1.0+1', +); + +int _shortPollEstimateSize( + ShortPoll object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.imageModified; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.pdfName; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + bytesCount += 3 + object.questions.length * 3; + { + final offsets = allOffsets[ShortPollQuestion]!; + for (var i = 0; i < object.questions.length; i++) { + final value = object.questions[i]; + bytesCount += + ShortPollQuestionSchema.estimateSize(value, offsets, allOffsets); + } + } + bytesCount += 3 + object.text.length * 3; + bytesCount += 3 + object.title.length * 3; + { + final value = object.url; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _shortPollSerialize( + ShortPoll object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeBool(offsets[0], object.commentsAllowed); + writer.writeLong(offsets[1], object.imageHeight); + writer.writeString(offsets[2], object.imageModified); + writer.writeLong(offsets[3], object.imageWidth); + writer.writeLong(offsets[4], object.numberOfVotes); + writer.writeString(offsets[5], object.pdfName); + writer.writeObjectList( + offsets[6], + allOffsets, + ShortPollQuestionSchema.serialize, + object.questions, + ); + writer.writeBool(offsets[7], object.read); + writer.writeString(offsets[8], object.text); + writer.writeString(offsets[9], object.title); + writer.writeLong(offsets[10], object.type); + writer.writeString(offsets[11], object.url); + writer.writeLong(offsets[12], object.validFrom); + writer.writeLong(offsets[13], object.validTo); + writer.writeBool(offsets[14], object.voted); +} + +ShortPoll _shortPollDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = ShortPoll( + commentsAllowed: reader.readBoolOrNull(offsets[0]), + id: id, + imageHeight: reader.readLongOrNull(offsets[1]), + imageModified: reader.readStringOrNull(offsets[2]), + imageWidth: reader.readLongOrNull(offsets[3]), + numberOfVotes: reader.readLong(offsets[4]), + pdfName: reader.readStringOrNull(offsets[5]), + questions: reader.readObjectList( + offsets[6], + ShortPollQuestionSchema.deserialize, + allOffsets, + ShortPollQuestion(), + ) ?? + [], + read: reader.readBool(offsets[7]), + text: reader.readString(offsets[8]), + title: reader.readString(offsets[9]), + type: reader.readLong(offsets[10]), + url: reader.readStringOrNull(offsets[11]), + validFrom: reader.readLong(offsets[12]), + validTo: reader.readLong(offsets[13]), + voted: reader.readBool(offsets[14]), + ); + return object; +} + +P _shortPollDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readBoolOrNull(offset)) as P; + case 1: + return (reader.readLongOrNull(offset)) as P; + case 2: + return (reader.readStringOrNull(offset)) as P; + case 3: + return (reader.readLongOrNull(offset)) as P; + case 4: + return (reader.readLong(offset)) as P; + case 5: + return (reader.readStringOrNull(offset)) as P; + case 6: + return (reader.readObjectList( + offset, + ShortPollQuestionSchema.deserialize, + allOffsets, + ShortPollQuestion(), + ) ?? + []) as P; + case 7: + return (reader.readBool(offset)) as P; + case 8: + return (reader.readString(offset)) as P; + case 9: + return (reader.readString(offset)) as P; + case 10: + return (reader.readLong(offset)) as P; + case 11: + return (reader.readStringOrNull(offset)) as P; + case 12: + return (reader.readLong(offset)) as P; + case 13: + return (reader.readLong(offset)) as P; + case 14: + return (reader.readBool(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _shortPollGetId(ShortPoll object) { + return object.id; +} + +List> _shortPollGetLinks(ShortPoll object) { + return []; +} + +void _shortPollAttach(IsarCollection col, Id id, ShortPoll object) { + object.id = id; +} + +extension ShortPollQueryWhereSort + on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension ShortPollQueryWhere + on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension ShortPollQueryFilter + on QueryBuilder { + QueryBuilder + commentsAllowedIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'commentsAllowed', + )); + }); + } + + QueryBuilder + commentsAllowedIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'commentsAllowed', + )); + }); + } + + QueryBuilder + commentsAllowedEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'commentsAllowed', + value: value, + )); + }); + } + + QueryBuilder idEqualTo( + Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + imageHeightIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'imageHeight', + )); + }); + } + + QueryBuilder + imageHeightIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'imageHeight', + )); + }); + } + + QueryBuilder imageHeightEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'imageHeight', + value: value, + )); + }); + } + + QueryBuilder + imageHeightGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'imageHeight', + value: value, + )); + }); + } + + QueryBuilder imageHeightLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'imageHeight', + value: value, + )); + }); + } + + QueryBuilder imageHeightBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'imageHeight', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + imageModifiedIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'imageModified', + )); + }); + } + + QueryBuilder + imageModifiedIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'imageModified', + )); + }); + } + + QueryBuilder + imageModifiedEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'imageModified', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'imageModified', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'imageModified', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'imageModified', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'imageModified', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'imageModified', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'imageModified', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'imageModified', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + imageModifiedIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'imageModified', + value: '', + )); + }); + } + + QueryBuilder + imageModifiedIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'imageModified', + value: '', + )); + }); + } + + QueryBuilder imageWidthIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'imageWidth', + )); + }); + } + + QueryBuilder + imageWidthIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'imageWidth', + )); + }); + } + + QueryBuilder imageWidthEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'imageWidth', + value: value, + )); + }); + } + + QueryBuilder + imageWidthGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'imageWidth', + value: value, + )); + }); + } + + QueryBuilder imageWidthLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'imageWidth', + value: value, + )); + }); + } + + QueryBuilder imageWidthBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'imageWidth', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + numberOfVotesEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'numberOfVotes', + value: value, + )); + }); + } + + QueryBuilder + numberOfVotesGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'numberOfVotes', + value: value, + )); + }); + } + + QueryBuilder + numberOfVotesLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'numberOfVotes', + value: value, + )); + }); + } + + QueryBuilder + numberOfVotesBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'numberOfVotes', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder pdfNameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'pdfName', + )); + }); + } + + QueryBuilder pdfNameIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'pdfName', + )); + }); + } + + QueryBuilder pdfNameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'pdfName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'pdfName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'pdfName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'pdfName', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'pdfName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'pdfName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'pdfName', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'pdfName', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder pdfNameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'pdfName', + value: '', + )); + }); + } + + QueryBuilder + pdfNameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'pdfName', + value: '', + )); + }); + } + + QueryBuilder + questionsLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'questions', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder questionsIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'questions', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + questionsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'questions', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + questionsLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'questions', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + questionsLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'questions', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + questionsLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'questions', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder readEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'read', + value: value, + )); + }); + } + + QueryBuilder textEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'text', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'text', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder textIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'text', + value: '', + )); + }); + } + + QueryBuilder textIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'text', + value: '', + )); + }); + } + + QueryBuilder titleEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'title', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'title', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'title', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder titleIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder titleIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'title', + value: '', + )); + }); + } + + QueryBuilder typeEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder urlIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'url', + )); + }); + } + + QueryBuilder urlIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'url', + )); + }); + } + + QueryBuilder urlEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'url', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'url', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'url', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'url', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'url', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'url', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'url', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'url', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder urlIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'url', + value: '', + )); + }); + } + + QueryBuilder urlIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'url', + value: '', + )); + }); + } + + QueryBuilder validFromEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'validFrom', + value: value, + )); + }); + } + + QueryBuilder + validFromGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'validFrom', + value: value, + )); + }); + } + + QueryBuilder validFromLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'validFrom', + value: value, + )); + }); + } + + QueryBuilder validFromBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'validFrom', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder validToEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'validTo', + value: value, + )); + }); + } + + QueryBuilder validToGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'validTo', + value: value, + )); + }); + } + + QueryBuilder validToLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'validTo', + value: value, + )); + }); + } + + QueryBuilder validToBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'validTo', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder votedEqualTo( + bool value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'voted', + value: value, + )); + }); + } +} + +extension ShortPollQueryObject + on QueryBuilder { + QueryBuilder questionsElement( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'questions'); + }); + } +} + +extension ShortPollQueryLinks + on QueryBuilder {} + +extension ShortPollQuerySortBy on QueryBuilder { + QueryBuilder sortByCommentsAllowed() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'commentsAllowed', Sort.asc); + }); + } + + QueryBuilder sortByCommentsAllowedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'commentsAllowed', Sort.desc); + }); + } + + QueryBuilder sortByImageHeight() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageHeight', Sort.asc); + }); + } + + QueryBuilder sortByImageHeightDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageHeight', Sort.desc); + }); + } + + QueryBuilder sortByImageModified() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageModified', Sort.asc); + }); + } + + QueryBuilder sortByImageModifiedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageModified', Sort.desc); + }); + } + + QueryBuilder sortByImageWidth() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageWidth', Sort.asc); + }); + } + + QueryBuilder sortByImageWidthDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageWidth', Sort.desc); + }); + } + + QueryBuilder sortByNumberOfVotes() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfVotes', Sort.asc); + }); + } + + QueryBuilder sortByNumberOfVotesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfVotes', Sort.desc); + }); + } + + QueryBuilder sortByPdfName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pdfName', Sort.asc); + }); + } + + QueryBuilder sortByPdfNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pdfName', Sort.desc); + }); + } + + QueryBuilder sortByRead() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'read', Sort.asc); + }); + } + + QueryBuilder sortByReadDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'read', Sort.desc); + }); + } + + QueryBuilder sortByText() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'text', Sort.asc); + }); + } + + QueryBuilder sortByTextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'text', Sort.desc); + }); + } + + QueryBuilder sortByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder sortByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder sortByType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.asc); + }); + } + + QueryBuilder sortByTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.desc); + }); + } + + QueryBuilder sortByUrl() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'url', Sort.asc); + }); + } + + QueryBuilder sortByUrlDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'url', Sort.desc); + }); + } + + QueryBuilder sortByValidFrom() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validFrom', Sort.asc); + }); + } + + QueryBuilder sortByValidFromDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validFrom', Sort.desc); + }); + } + + QueryBuilder sortByValidTo() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validTo', Sort.asc); + }); + } + + QueryBuilder sortByValidToDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validTo', Sort.desc); + }); + } + + QueryBuilder sortByVoted() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'voted', Sort.asc); + }); + } + + QueryBuilder sortByVotedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'voted', Sort.desc); + }); + } +} + +extension ShortPollQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByCommentsAllowed() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'commentsAllowed', Sort.asc); + }); + } + + QueryBuilder thenByCommentsAllowedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'commentsAllowed', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByImageHeight() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageHeight', Sort.asc); + }); + } + + QueryBuilder thenByImageHeightDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageHeight', Sort.desc); + }); + } + + QueryBuilder thenByImageModified() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageModified', Sort.asc); + }); + } + + QueryBuilder thenByImageModifiedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageModified', Sort.desc); + }); + } + + QueryBuilder thenByImageWidth() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageWidth', Sort.asc); + }); + } + + QueryBuilder thenByImageWidthDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'imageWidth', Sort.desc); + }); + } + + QueryBuilder thenByNumberOfVotes() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfVotes', Sort.asc); + }); + } + + QueryBuilder thenByNumberOfVotesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'numberOfVotes', Sort.desc); + }); + } + + QueryBuilder thenByPdfName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pdfName', Sort.asc); + }); + } + + QueryBuilder thenByPdfNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'pdfName', Sort.desc); + }); + } + + QueryBuilder thenByRead() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'read', Sort.asc); + }); + } + + QueryBuilder thenByReadDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'read', Sort.desc); + }); + } + + QueryBuilder thenByText() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'text', Sort.asc); + }); + } + + QueryBuilder thenByTextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'text', Sort.desc); + }); + } + + QueryBuilder thenByTitle() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.asc); + }); + } + + QueryBuilder thenByTitleDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'title', Sort.desc); + }); + } + + QueryBuilder thenByType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.asc); + }); + } + + QueryBuilder thenByTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'type', Sort.desc); + }); + } + + QueryBuilder thenByUrl() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'url', Sort.asc); + }); + } + + QueryBuilder thenByUrlDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'url', Sort.desc); + }); + } + + QueryBuilder thenByValidFrom() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validFrom', Sort.asc); + }); + } + + QueryBuilder thenByValidFromDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validFrom', Sort.desc); + }); + } + + QueryBuilder thenByValidTo() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validTo', Sort.asc); + }); + } + + QueryBuilder thenByValidToDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'validTo', Sort.desc); + }); + } + + QueryBuilder thenByVoted() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'voted', Sort.asc); + }); + } + + QueryBuilder thenByVotedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'voted', Sort.desc); + }); + } +} + +extension ShortPollQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByCommentsAllowed() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'commentsAllowed'); + }); + } + + QueryBuilder distinctByImageHeight() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'imageHeight'); + }); + } + + QueryBuilder distinctByImageModified( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'imageModified', + caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByImageWidth() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'imageWidth'); + }); + } + + QueryBuilder distinctByNumberOfVotes() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'numberOfVotes'); + }); + } + + QueryBuilder distinctByPdfName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'pdfName', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByRead() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'read'); + }); + } + + QueryBuilder distinctByText( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'text', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByTitle( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'title', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'type'); + }); + } + + QueryBuilder distinctByUrl( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'url', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByValidFrom() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'validFrom'); + }); + } + + QueryBuilder distinctByValidTo() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'validTo'); + }); + } + + QueryBuilder distinctByVoted() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'voted'); + }); + } +} + +extension ShortPollQueryProperty + on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder commentsAllowedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'commentsAllowed'); + }); + } + + QueryBuilder imageHeightProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'imageHeight'); + }); + } + + QueryBuilder imageModifiedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'imageModified'); + }); + } + + QueryBuilder imageWidthProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'imageWidth'); + }); + } + + QueryBuilder numberOfVotesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'numberOfVotes'); + }); + } + + QueryBuilder pdfNameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'pdfName'); + }); + } + + QueryBuilder, QQueryOperations> + questionsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'questions'); + }); + } + + QueryBuilder readProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'read'); + }); + } + + QueryBuilder textProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'text'); + }); + } + + QueryBuilder titleProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'title'); + }); + } + + QueryBuilder typeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'type'); + }); + } + + QueryBuilder urlProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'url'); + }); + } + + QueryBuilder validFromProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'validFrom'); + }); + } + + QueryBuilder validToProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'validTo'); + }); + } + + QueryBuilder votedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'voted'); + }); + } +} diff --git a/lib/model/short_poll_question.dart b/lib/model/short_poll_question.dart new file mode 100644 index 0000000..20d9b92 --- /dev/null +++ b/lib/model/short_poll_question.dart @@ -0,0 +1,35 @@ +import 'package:isar/isar.dart'; + +part 'short_poll_question.g.dart'; + +@embedded +class ShortPollQuestion { + late int questionId; + + late int shortPollId; + + late String text; + + /*@Ignore() + late String imageName = "assets/radiobutton.png"; + + @Ignore() + late bool selected = false;*/ + + ShortPollQuestion(); + + /*factory ShortPollQuestion.fromJson(Map json) { + var shortPollQuestion = ShortPollQuestion(); + shortPollQuestion.questionId = json['id']; + shortPollQuestion.shortPollId = json["shortPollId"]; + shortPollQuestion.text = json["text"]; + + return shortPollQuestion; + } + + Map toJson() => { + "id": questionId, + "short_poll_id": shortPollId, + "text": text, + };*/ +} \ No newline at end of file diff --git a/lib/model/short_poll_question.g.dart b/lib/model/short_poll_question.g.dart new file mode 100644 index 0000000..c6b48f2 --- /dev/null +++ b/lib/model/short_poll_question.g.dart @@ -0,0 +1,342 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'short_poll_question.dart'; + +// ************************************************************************** +// IsarEmbeddedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const ShortPollQuestionSchema = Schema( + name: r'ShortPollQuestion', + id: 899576032619711410, + properties: { + r'questionId': PropertySchema( + id: 0, + name: r'questionId', + type: IsarType.long, + ), + r'shortPollId': PropertySchema( + id: 1, + name: r'shortPollId', + type: IsarType.long, + ), + r'text': PropertySchema( + id: 2, + name: r'text', + type: IsarType.string, + ) + }, + estimateSize: _shortPollQuestionEstimateSize, + serialize: _shortPollQuestionSerialize, + deserialize: _shortPollQuestionDeserialize, + deserializeProp: _shortPollQuestionDeserializeProp, +); + +int _shortPollQuestionEstimateSize( + ShortPollQuestion object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.text.length * 3; + return bytesCount; +} + +void _shortPollQuestionSerialize( + ShortPollQuestion object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.questionId); + writer.writeLong(offsets[1], object.shortPollId); + writer.writeString(offsets[2], object.text); +} + +ShortPollQuestion _shortPollQuestionDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = ShortPollQuestion(); + object.questionId = reader.readLong(offsets[0]); + object.shortPollId = reader.readLong(offsets[1]); + object.text = reader.readString(offsets[2]); + return object; +} + +P _shortPollQuestionDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLong(offset)) as P; + case 1: + return (reader.readLong(offset)) as P; + case 2: + return (reader.readString(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension ShortPollQuestionQueryFilter + on QueryBuilder { + QueryBuilder + questionIdEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'questionId', + value: value, + )); + }); + } + + QueryBuilder + questionIdGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'questionId', + value: value, + )); + }); + } + + QueryBuilder + questionIdLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'questionId', + value: value, + )); + }); + } + + QueryBuilder + questionIdBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'questionId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + shortPollIdEqualTo(int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'shortPollId', + value: value, + )); + }); + } + + QueryBuilder + shortPollIdGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'shortPollId', + value: value, + )); + }); + } + + QueryBuilder + shortPollIdLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'shortPollId', + value: value, + )); + }); + } + + QueryBuilder + shortPollIdBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'shortPollId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + textEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'text', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'text', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'text', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + textIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'text', + value: '', + )); + }); + } + + QueryBuilder + textIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'text', + value: '', + )); + }); + } +} + +extension ShortPollQuestionQueryObject + on QueryBuilder {} diff --git a/lib/model/status.dart b/lib/model/status.dart new file mode 100644 index 0000000..c9746da --- /dev/null +++ b/lib/model/status.dart @@ -0,0 +1,31 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'status.g.dart'; + +@collection +@JsonSerializable() +class Status { + final Id id = 0; + + @JsonKey(name: 'cust_id') + int? custId; + @JsonKey(name: 'hq_id') + int? hqId; + @JsonKey(name: 'usr_id') + int? usrId; + @JsonKey(name: 'cr_id') + int? crId; + @JsonKey(name: 'sid') + String? sid; + @JsonKey(name: 'vht_id') + int? vhtId; + @JsonKey(name: 'loc_zip') + String? locZip; + + Status({this.hqId, this.usrId, this.crId, this.sid, this.vhtId, this.locZip, this.custId}); + + factory Status.fromJson(Map json) => _$StatusFromJson(json); + + Map toJson() => _$StatusToJson(this); +} diff --git a/lib/model/status.g.dart b/lib/model/status.g.dart new file mode 100644 index 0000000..07345da --- /dev/null +++ b/lib/model/status.g.dart @@ -0,0 +1,1226 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'status.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetStatusCollection on Isar { + IsarCollection get status => this.collection(); +} + +const StatusSchema = CollectionSchema( + name: r'Status', + id: -8158262482337811485, + properties: { + r'crId': PropertySchema( + id: 0, + name: r'crId', + type: IsarType.long, + ), + r'custId': PropertySchema( + id: 1, + name: r'custId', + type: IsarType.long, + ), + r'hqId': PropertySchema( + id: 2, + name: r'hqId', + type: IsarType.long, + ), + r'locZip': PropertySchema( + id: 3, + name: r'locZip', + type: IsarType.string, + ), + r'sid': PropertySchema( + id: 4, + name: r'sid', + type: IsarType.string, + ), + r'usrId': PropertySchema( + id: 5, + name: r'usrId', + type: IsarType.long, + ), + r'vhtId': PropertySchema( + id: 6, + name: r'vhtId', + type: IsarType.long, + ) + }, + estimateSize: _statusEstimateSize, + serialize: _statusSerialize, + deserialize: _statusDeserialize, + deserializeProp: _statusDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _statusGetId, + getLinks: _statusGetLinks, + attach: _statusAttach, + version: '3.1.0+1', +); + +int _statusEstimateSize( + Status object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.locZip; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.sid; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _statusSerialize( + Status object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.crId); + writer.writeLong(offsets[1], object.custId); + writer.writeLong(offsets[2], object.hqId); + writer.writeString(offsets[3], object.locZip); + writer.writeString(offsets[4], object.sid); + writer.writeLong(offsets[5], object.usrId); + writer.writeLong(offsets[6], object.vhtId); +} + +Status _statusDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Status( + crId: reader.readLongOrNull(offsets[0]), + custId: reader.readLongOrNull(offsets[1]), + hqId: reader.readLongOrNull(offsets[2]), + locZip: reader.readStringOrNull(offsets[3]), + sid: reader.readStringOrNull(offsets[4]), + usrId: reader.readLongOrNull(offsets[5]), + vhtId: reader.readLongOrNull(offsets[6]), + ); + return object; +} + +P _statusDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLongOrNull(offset)) as P; + case 1: + return (reader.readLongOrNull(offset)) as P; + case 2: + return (reader.readLongOrNull(offset)) as P; + case 3: + return (reader.readStringOrNull(offset)) as P; + case 4: + return (reader.readStringOrNull(offset)) as P; + case 5: + return (reader.readLongOrNull(offset)) as P; + case 6: + return (reader.readLongOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _statusGetId(Status object) { + return object.id; +} + +List> _statusGetLinks(Status object) { + return []; +} + +void _statusAttach(IsarCollection col, Id id, Status object) {} + +extension StatusQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension StatusQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension StatusQueryFilter on QueryBuilder { + QueryBuilder crIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'crId', + )); + }); + } + + QueryBuilder crIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'crId', + )); + }); + } + + QueryBuilder crIdEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'crId', + value: value, + )); + }); + } + + QueryBuilder crIdGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'crId', + value: value, + )); + }); + } + + QueryBuilder crIdLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'crId', + value: value, + )); + }); + } + + QueryBuilder crIdBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'crId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder custIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'custId', + )); + }); + } + + QueryBuilder custIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'custId', + )); + }); + } + + QueryBuilder custIdEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'custId', + value: value, + )); + }); + } + + QueryBuilder custIdGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'custId', + value: value, + )); + }); + } + + QueryBuilder custIdLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'custId', + value: value, + )); + }); + } + + QueryBuilder custIdBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'custId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder hqIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hqId', + )); + }); + } + + QueryBuilder hqIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hqId', + )); + }); + } + + QueryBuilder hqIdEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hqId', + value: value, + )); + }); + } + + QueryBuilder hqIdGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'hqId', + value: value, + )); + }); + } + + QueryBuilder hqIdLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'hqId', + value: value, + )); + }); + } + + QueryBuilder hqIdBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'hqId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder locZipIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'locZip', + )); + }); + } + + QueryBuilder locZipIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'locZip', + )); + }); + } + + QueryBuilder locZipEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'locZip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'locZip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'locZip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'locZip', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'locZip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'locZip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'locZip', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'locZip', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder locZipIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'locZip', + value: '', + )); + }); + } + + QueryBuilder locZipIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'locZip', + value: '', + )); + }); + } + + QueryBuilder sidIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'sid', + )); + }); + } + + QueryBuilder sidIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'sid', + )); + }); + } + + QueryBuilder sidEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sid', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'sid', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'sid', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'sid', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'sid', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'sid', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'sid', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'sid', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder sidIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sid', + value: '', + )); + }); + } + + QueryBuilder sidIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'sid', + value: '', + )); + }); + } + + QueryBuilder usrIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'usrId', + )); + }); + } + + QueryBuilder usrIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'usrId', + )); + }); + } + + QueryBuilder usrIdEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'usrId', + value: value, + )); + }); + } + + QueryBuilder usrIdGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'usrId', + value: value, + )); + }); + } + + QueryBuilder usrIdLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'usrId', + value: value, + )); + }); + } + + QueryBuilder usrIdBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'usrId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder vhtIdIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'vhtId', + )); + }); + } + + QueryBuilder vhtIdIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'vhtId', + )); + }); + } + + QueryBuilder vhtIdEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'vhtId', + value: value, + )); + }); + } + + QueryBuilder vhtIdGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'vhtId', + value: value, + )); + }); + } + + QueryBuilder vhtIdLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'vhtId', + value: value, + )); + }); + } + + QueryBuilder vhtIdBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'vhtId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension StatusQueryObject on QueryBuilder {} + +extension StatusQueryLinks on QueryBuilder {} + +extension StatusQuerySortBy on QueryBuilder { + QueryBuilder sortByCrId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crId', Sort.asc); + }); + } + + QueryBuilder sortByCrIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crId', Sort.desc); + }); + } + + QueryBuilder sortByCustId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'custId', Sort.asc); + }); + } + + QueryBuilder sortByCustIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'custId', Sort.desc); + }); + } + + QueryBuilder sortByHqId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hqId', Sort.asc); + }); + } + + QueryBuilder sortByHqIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hqId', Sort.desc); + }); + } + + QueryBuilder sortByLocZip() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'locZip', Sort.asc); + }); + } + + QueryBuilder sortByLocZipDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'locZip', Sort.desc); + }); + } + + QueryBuilder sortBySid() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sid', Sort.asc); + }); + } + + QueryBuilder sortBySidDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sid', Sort.desc); + }); + } + + QueryBuilder sortByUsrId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'usrId', Sort.asc); + }); + } + + QueryBuilder sortByUsrIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'usrId', Sort.desc); + }); + } + + QueryBuilder sortByVhtId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.asc); + }); + } + + QueryBuilder sortByVhtIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.desc); + }); + } +} + +extension StatusQuerySortThenBy on QueryBuilder { + QueryBuilder thenByCrId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crId', Sort.asc); + }); + } + + QueryBuilder thenByCrIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'crId', Sort.desc); + }); + } + + QueryBuilder thenByCustId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'custId', Sort.asc); + }); + } + + QueryBuilder thenByCustIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'custId', Sort.desc); + }); + } + + QueryBuilder thenByHqId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hqId', Sort.asc); + }); + } + + QueryBuilder thenByHqIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hqId', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByLocZip() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'locZip', Sort.asc); + }); + } + + QueryBuilder thenByLocZipDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'locZip', Sort.desc); + }); + } + + QueryBuilder thenBySid() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sid', Sort.asc); + }); + } + + QueryBuilder thenBySidDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sid', Sort.desc); + }); + } + + QueryBuilder thenByUsrId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'usrId', Sort.asc); + }); + } + + QueryBuilder thenByUsrIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'usrId', Sort.desc); + }); + } + + QueryBuilder thenByVhtId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.asc); + }); + } + + QueryBuilder thenByVhtIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'vhtId', Sort.desc); + }); + } +} + +extension StatusQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByCrId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'crId'); + }); + } + + QueryBuilder distinctByCustId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'custId'); + }); + } + + QueryBuilder distinctByHqId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hqId'); + }); + } + + QueryBuilder distinctByLocZip( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'locZip', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctBySid( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'sid', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByUsrId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'usrId'); + }); + } + + QueryBuilder distinctByVhtId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'vhtId'); + }); + } +} + +extension StatusQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder crIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'crId'); + }); + } + + QueryBuilder custIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'custId'); + }); + } + + QueryBuilder hqIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hqId'); + }); + } + + QueryBuilder locZipProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'locZip'); + }); + } + + QueryBuilder sidProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'sid'); + }); + } + + QueryBuilder usrIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'usrId'); + }); + } + + QueryBuilder vhtIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'vhtId'); + }); + } +} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +Status _$StatusFromJson(Map json) => Status( + hqId: json['hq_id'] as int?, + usrId: json['usr_id'] as int?, + crId: json['cr_id'] as int?, + sid: json['sid'] as String?, + vhtId: json['vht_id'] as int?, + locZip: json['loc_zip'] as String?, + custId: json['cust_id'] as int?, + ); + +Map _$StatusToJson(Status instance) => { + 'cust_id': instance.custId, + 'hq_id': instance.hqId, + 'usr_id': instance.usrId, + 'cr_id': instance.crId, + 'sid': instance.sid, + 'vht_id': instance.vhtId, + 'loc_zip': instance.locZip, + }; diff --git a/lib/model/task_info.dart b/lib/model/task_info.dart new file mode 100644 index 0000000..ba5006d --- /dev/null +++ b/lib/model/task_info.dart @@ -0,0 +1,22 @@ +import 'package:isar/isar.dart'; +import 'package:stadtbote/model/tour_task.dart'; + +part 'task_info.g.dart'; + +@collection +class TaskInfo { + late Id id; + + late int sId; + + late String? additionalText; + + late String? answer; + + @ignore + late TourTask task; + + TaskInfo(); +} + + diff --git a/lib/model/task_info.g.dart b/lib/model/task_info.g.dart new file mode 100644 index 0000000..454cfa3 --- /dev/null +++ b/lib/model/task_info.g.dart @@ -0,0 +1,752 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'task_info.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetTaskInfoCollection on Isar { + IsarCollection get taskInfos => this.collection(); +} + +const TaskInfoSchema = CollectionSchema( + name: r'TaskInfo', + id: 3341968002652240051, + properties: { + r'additionalText': PropertySchema( + id: 0, + name: r'additionalText', + type: IsarType.string, + ), + r'answer': PropertySchema( + id: 1, + name: r'answer', + type: IsarType.string, + ), + r'sId': PropertySchema( + id: 2, + name: r'sId', + type: IsarType.long, + ) + }, + estimateSize: _taskInfoEstimateSize, + serialize: _taskInfoSerialize, + deserialize: _taskInfoDeserialize, + deserializeProp: _taskInfoDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _taskInfoGetId, + getLinks: _taskInfoGetLinks, + attach: _taskInfoAttach, + version: '3.1.0+1', +); + +int _taskInfoEstimateSize( + TaskInfo object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.additionalText; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + { + final value = object.answer; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _taskInfoSerialize( + TaskInfo object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.additionalText); + writer.writeString(offsets[1], object.answer); + writer.writeLong(offsets[2], object.sId); +} + +TaskInfo _taskInfoDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = TaskInfo(); + object.additionalText = reader.readStringOrNull(offsets[0]); + object.answer = reader.readStringOrNull(offsets[1]); + object.id = id; + object.sId = reader.readLong(offsets[2]); + return object; +} + +P _taskInfoDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + case 1: + return (reader.readStringOrNull(offset)) as P; + case 2: + return (reader.readLong(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _taskInfoGetId(TaskInfo object) { + return object.id; +} + +List> _taskInfoGetLinks(TaskInfo object) { + return []; +} + +void _taskInfoAttach(IsarCollection col, Id id, TaskInfo object) { + object.id = id; +} + +extension TaskInfoQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension TaskInfoQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension TaskInfoQueryFilter + on QueryBuilder { + QueryBuilder + additionalTextIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'additionalText', + )); + }); + } + + QueryBuilder + additionalTextIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'additionalText', + )); + }); + } + + QueryBuilder additionalTextEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'additionalText', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + additionalTextGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'additionalText', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + additionalTextLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'additionalText', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder additionalTextBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'additionalText', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + additionalTextStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'additionalText', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + additionalTextEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'additionalText', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + additionalTextContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'additionalText', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder additionalTextMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'additionalText', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + additionalTextIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'additionalText', + value: '', + )); + }); + } + + QueryBuilder + additionalTextIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'additionalText', + value: '', + )); + }); + } + + QueryBuilder answerIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'answer', + )); + }); + } + + QueryBuilder answerIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'answer', + )); + }); + } + + QueryBuilder answerEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'answer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'answer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'answer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'answer', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'answer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'answer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'answer', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'answer', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder answerIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'answer', + value: '', + )); + }); + } + + QueryBuilder answerIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'answer', + value: '', + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder sIdEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sId', + value: value, + )); + }); + } + + QueryBuilder sIdGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'sId', + value: value, + )); + }); + } + + QueryBuilder sIdLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'sId', + value: value, + )); + }); + } + + QueryBuilder sIdBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'sId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension TaskInfoQueryObject + on QueryBuilder {} + +extension TaskInfoQueryLinks + on QueryBuilder {} + +extension TaskInfoQuerySortBy on QueryBuilder { + QueryBuilder sortByAdditionalText() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'additionalText', Sort.asc); + }); + } + + QueryBuilder sortByAdditionalTextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'additionalText', Sort.desc); + }); + } + + QueryBuilder sortByAnswer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'answer', Sort.asc); + }); + } + + QueryBuilder sortByAnswerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'answer', Sort.desc); + }); + } + + QueryBuilder sortBySId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sId', Sort.asc); + }); + } + + QueryBuilder sortBySIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sId', Sort.desc); + }); + } +} + +extension TaskInfoQuerySortThenBy + on QueryBuilder { + QueryBuilder thenByAdditionalText() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'additionalText', Sort.asc); + }); + } + + QueryBuilder thenByAdditionalTextDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'additionalText', Sort.desc); + }); + } + + QueryBuilder thenByAnswer() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'answer', Sort.asc); + }); + } + + QueryBuilder thenByAnswerDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'answer', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenBySId() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sId', Sort.asc); + }); + } + + QueryBuilder thenBySIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'sId', Sort.desc); + }); + } +} + +extension TaskInfoQueryWhereDistinct + on QueryBuilder { + QueryBuilder distinctByAdditionalText( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'additionalText', + caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctByAnswer( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'answer', caseSensitive: caseSensitive); + }); + } + + QueryBuilder distinctBySId() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'sId'); + }); + } +} + +extension TaskInfoQueryProperty + on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder additionalTextProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'additionalText'); + }); + } + + QueryBuilder answerProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'answer'); + }); + } + + QueryBuilder sIdProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'sId'); + }); + } +} diff --git a/lib/model/tour_position.dart b/lib/model/tour_position.dart new file mode 100644 index 0000000..7bf3380 --- /dev/null +++ b/lib/model/tour_position.dart @@ -0,0 +1,18 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'tour_position.g.dart'; + +@embedded +@JsonSerializable() +class TourPosition { + late double lat; + late double long; + + TourPosition(); + + factory TourPosition.fromJson(Map json) => _$TourPositionFromJson(json); + + Map toJson() => _$TourPositionToJson(this); +} + diff --git a/lib/model/tour_position.g.dart b/lib/model/tour_position.g.dart new file mode 100644 index 0000000..903a2ac --- /dev/null +++ b/lib/model/tour_position.g.dart @@ -0,0 +1,224 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tour_position.dart'; + +// ************************************************************************** +// IsarEmbeddedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const TourPositionSchema = Schema( + name: r'TourPosition', + id: -30020497969214738, + properties: { + r'lat': PropertySchema( + id: 0, + name: r'lat', + type: IsarType.double, + ), + r'long': PropertySchema( + id: 1, + name: r'long', + type: IsarType.double, + ) + }, + estimateSize: _tourPositionEstimateSize, + serialize: _tourPositionSerialize, + deserialize: _tourPositionDeserialize, + deserializeProp: _tourPositionDeserializeProp, +); + +int _tourPositionEstimateSize( + TourPosition object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + return bytesCount; +} + +void _tourPositionSerialize( + TourPosition object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeDouble(offsets[0], object.lat); + writer.writeDouble(offsets[1], object.long); +} + +TourPosition _tourPositionDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = TourPosition(); + object.lat = reader.readDouble(offsets[0]); + object.long = reader.readDouble(offsets[1]); + return object; +} + +P _tourPositionDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readDouble(offset)) as P; + case 1: + return (reader.readDouble(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension TourPositionQueryFilter + on QueryBuilder { + QueryBuilder latEqualTo( + double value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'lat', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + latGreaterThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'lat', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder latLessThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'lat', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder latBetween( + double lower, + double upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'lat', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } + + QueryBuilder longEqualTo( + double value, { + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'long', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder + longGreaterThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'long', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder longLessThan( + double value, { + bool include = false, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'long', + value: value, + epsilon: epsilon, + )); + }); + } + + QueryBuilder longBetween( + double lower, + double upper, { + bool includeLower = true, + bool includeUpper = true, + double epsilon = Query.epsilon, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'long', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + epsilon: epsilon, + )); + }); + } +} + +extension TourPositionQueryObject + on QueryBuilder {} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +TourPosition _$TourPositionFromJson(Map json) => TourPosition() + ..lat = (json['lat'] as num).toDouble() + ..long = (json['long'] as num).toDouble(); + +Map _$TourPositionToJson(TourPosition instance) => + { + 'lat': instance.lat, + 'long': instance.long, + }; diff --git a/lib/model/tour_task.dart b/lib/model/tour_task.dart new file mode 100644 index 0000000..9bdc6f2 --- /dev/null +++ b/lib/model/tour_task.dart @@ -0,0 +1,32 @@ +import 'package:isar/isar.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'tour_task.g.dart'; + +@embedded +@JsonSerializable() +class TourTask { + @JsonKey(name: 's_id') + late int sId; + late int type; + late String topic; + late bool? opt; + late bool? reenter; + late int? min; + late int? max; + @JsonKey(name: 'max_len') + late int? maxLen; + late bool? rt; + late bool? track; + late List? txt; + @JsonKey(name: 'task_arrival') + late int? taskArrival; + @JsonKey(name: 'task_fin_work') + late int? taskFinWork; + + TourTask(); + + factory TourTask.fromJson(Map json) => _$TourTaskFromJson(json); + + Map toJson() => _$TourTaskToJson(this); +} \ No newline at end of file diff --git a/lib/model/tour_task.g.dart b/lib/model/tour_task.g.dart new file mode 100644 index 0000000..c87f620 --- /dev/null +++ b/lib/model/tour_task.g.dart @@ -0,0 +1,1151 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tour_task.dart'; + +// ************************************************************************** +// IsarEmbeddedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +const TourTaskSchema = Schema( + name: r'TourTask', + id: -3019997418839113825, + properties: { + r'max': PropertySchema( + id: 0, + name: r'max', + type: IsarType.long, + ), + r'maxLen': PropertySchema( + id: 1, + name: r'maxLen', + type: IsarType.long, + ), + r'min': PropertySchema( + id: 2, + name: r'min', + type: IsarType.long, + ), + r'opt': PropertySchema( + id: 3, + name: r'opt', + type: IsarType.bool, + ), + r'reenter': PropertySchema( + id: 4, + name: r'reenter', + type: IsarType.bool, + ), + r'rt': PropertySchema( + id: 5, + name: r'rt', + type: IsarType.bool, + ), + r'sId': PropertySchema( + id: 6, + name: r'sId', + type: IsarType.long, + ), + r'taskArrival': PropertySchema( + id: 7, + name: r'taskArrival', + type: IsarType.long, + ), + r'taskFinWork': PropertySchema( + id: 8, + name: r'taskFinWork', + type: IsarType.long, + ), + r'topic': PropertySchema( + id: 9, + name: r'topic', + type: IsarType.string, + ), + r'track': PropertySchema( + id: 10, + name: r'track', + type: IsarType.bool, + ), + r'txt': PropertySchema( + id: 11, + name: r'txt', + type: IsarType.stringList, + ), + r'type': PropertySchema( + id: 12, + name: r'type', + type: IsarType.long, + ) + }, + estimateSize: _tourTaskEstimateSize, + serialize: _tourTaskSerialize, + deserialize: _tourTaskDeserialize, + deserializeProp: _tourTaskDeserializeProp, +); + +int _tourTaskEstimateSize( + TourTask object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + bytesCount += 3 + object.topic.length * 3; + { + final list = object.txt; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } + return bytesCount; +} + +void _tourTaskSerialize( + TourTask object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.max); + writer.writeLong(offsets[1], object.maxLen); + writer.writeLong(offsets[2], object.min); + writer.writeBool(offsets[3], object.opt); + writer.writeBool(offsets[4], object.reenter); + writer.writeBool(offsets[5], object.rt); + writer.writeLong(offsets[6], object.sId); + writer.writeLong(offsets[7], object.taskArrival); + writer.writeLong(offsets[8], object.taskFinWork); + writer.writeString(offsets[9], object.topic); + writer.writeBool(offsets[10], object.track); + writer.writeStringList(offsets[11], object.txt); + writer.writeLong(offsets[12], object.type); +} + +TourTask _tourTaskDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = TourTask(); + object.max = reader.readLongOrNull(offsets[0]); + object.maxLen = reader.readLongOrNull(offsets[1]); + object.min = reader.readLongOrNull(offsets[2]); + object.opt = reader.readBoolOrNull(offsets[3]); + object.reenter = reader.readBoolOrNull(offsets[4]); + object.rt = reader.readBoolOrNull(offsets[5]); + object.sId = reader.readLong(offsets[6]); + object.taskArrival = reader.readLongOrNull(offsets[7]); + object.taskFinWork = reader.readLongOrNull(offsets[8]); + object.topic = reader.readString(offsets[9]); + object.track = reader.readBoolOrNull(offsets[10]); + object.txt = reader.readStringList(offsets[11]); + object.type = reader.readLong(offsets[12]); + return object; +} + +P _tourTaskDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLongOrNull(offset)) as P; + case 1: + return (reader.readLongOrNull(offset)) as P; + case 2: + return (reader.readLongOrNull(offset)) as P; + case 3: + return (reader.readBoolOrNull(offset)) as P; + case 4: + return (reader.readBoolOrNull(offset)) as P; + case 5: + return (reader.readBoolOrNull(offset)) as P; + case 6: + return (reader.readLong(offset)) as P; + case 7: + return (reader.readLongOrNull(offset)) as P; + case 8: + return (reader.readLongOrNull(offset)) as P; + case 9: + return (reader.readString(offset)) as P; + case 10: + return (reader.readBoolOrNull(offset)) as P; + case 11: + return (reader.readStringList(offset)) as P; + case 12: + return (reader.readLong(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +extension TourTaskQueryFilter + on QueryBuilder { + QueryBuilder maxIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'max', + )); + }); + } + + QueryBuilder maxIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'max', + )); + }); + } + + QueryBuilder maxEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'max', + value: value, + )); + }); + } + + QueryBuilder maxGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'max', + value: value, + )); + }); + } + + QueryBuilder maxLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'max', + value: value, + )); + }); + } + + QueryBuilder maxBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'max', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder maxLenIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'maxLen', + )); + }); + } + + QueryBuilder maxLenIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'maxLen', + )); + }); + } + + QueryBuilder maxLenEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'maxLen', + value: value, + )); + }); + } + + QueryBuilder maxLenGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'maxLen', + value: value, + )); + }); + } + + QueryBuilder maxLenLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'maxLen', + value: value, + )); + }); + } + + QueryBuilder maxLenBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'maxLen', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder minIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'min', + )); + }); + } + + QueryBuilder minIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'min', + )); + }); + } + + QueryBuilder minEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'min', + value: value, + )); + }); + } + + QueryBuilder minGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'min', + value: value, + )); + }); + } + + QueryBuilder minLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'min', + value: value, + )); + }); + } + + QueryBuilder minBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'min', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder optIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'opt', + )); + }); + } + + QueryBuilder optIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'opt', + )); + }); + } + + QueryBuilder optEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'opt', + value: value, + )); + }); + } + + QueryBuilder reenterIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'reenter', + )); + }); + } + + QueryBuilder reenterIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'reenter', + )); + }); + } + + QueryBuilder reenterEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'reenter', + value: value, + )); + }); + } + + QueryBuilder rtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'rt', + )); + }); + } + + QueryBuilder rtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'rt', + )); + }); + } + + QueryBuilder rtEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'rt', + value: value, + )); + }); + } + + QueryBuilder sIdEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'sId', + value: value, + )); + }); + } + + QueryBuilder sIdGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'sId', + value: value, + )); + }); + } + + QueryBuilder sIdLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'sId', + value: value, + )); + }); + } + + QueryBuilder sIdBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'sId', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder taskArrivalIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'taskArrival', + )); + }); + } + + QueryBuilder + taskArrivalIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'taskArrival', + )); + }); + } + + QueryBuilder taskArrivalEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'taskArrival', + value: value, + )); + }); + } + + QueryBuilder + taskArrivalGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'taskArrival', + value: value, + )); + }); + } + + QueryBuilder taskArrivalLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'taskArrival', + value: value, + )); + }); + } + + QueryBuilder taskArrivalBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'taskArrival', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder taskFinWorkIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'taskFinWork', + )); + }); + } + + QueryBuilder + taskFinWorkIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'taskFinWork', + )); + }); + } + + QueryBuilder taskFinWorkEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'taskFinWork', + value: value, + )); + }); + } + + QueryBuilder + taskFinWorkGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'taskFinWork', + value: value, + )); + }); + } + + QueryBuilder taskFinWorkLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'taskFinWork', + value: value, + )); + }); + } + + QueryBuilder taskFinWorkBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'taskFinWork', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder topicEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'topic', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'topic', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'topic', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'topic', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'topic', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'topic', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'topic', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'topic', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder topicIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'topic', + value: '', + )); + }); + } + + QueryBuilder topicIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'topic', + value: '', + )); + }); + } + + QueryBuilder trackIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'track', + )); + }); + } + + QueryBuilder trackIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'track', + )); + }); + } + + QueryBuilder trackEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'track', + value: value, + )); + }); + } + + QueryBuilder txtIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'txt', + )); + }); + } + + QueryBuilder txtIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'txt', + )); + }); + } + + QueryBuilder txtElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'txt', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'txt', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'txt', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementBetween( + String lower, + String upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'txt', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'txt', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'txt', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementContains( + String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'txt', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'txt', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder txtElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'txt', + value: '', + )); + }); + } + + QueryBuilder + txtElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'txt', + value: '', + )); + }); + } + + QueryBuilder txtLengthEqualTo( + int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'txt', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder txtIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'txt', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder txtIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'txt', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder txtLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'txt', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder txtLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'txt', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder txtLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'txt', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + + QueryBuilder typeEqualTo( + int value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeGreaterThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeLessThan( + int value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'type', + value: value, + )); + }); + } + + QueryBuilder typeBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'type', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } +} + +extension TourTaskQueryObject + on QueryBuilder {} + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +TourTask _$TourTaskFromJson(Map json) => TourTask() + ..sId = json['s_id'] as int + ..type = json['type'] as int + ..topic = json['topic'] as String + ..opt = json['opt'] as bool? + ..reenter = json['reenter'] as bool? + ..min = json['min'] as int? + ..max = json['max'] as int? + ..maxLen = json['max_len'] as int? + ..rt = json['rt'] as bool? + ..track = json['track'] as bool? + ..txt = (json['txt'] as List?)?.map((e) => e as String).toList() + ..taskArrival = json['task_arrival'] as int? + ..taskFinWork = json['task_fin_work'] as int?; + +Map _$TourTaskToJson(TourTask instance) => { + 's_id': instance.sId, + 'type': instance.type, + 'topic': instance.topic, + 'opt': instance.opt, + 'reenter': instance.reenter, + 'min': instance.min, + 'max': instance.max, + 'max_len': instance.maxLen, + 'rt': instance.rt, + 'track': instance.track, + 'txt': instance.txt, + 'task_arrival': instance.taskArrival, + 'task_fin_work': instance.taskFinWork, + }; diff --git a/lib/popups/infos_popup.dart b/lib/popups/infos_popup.dart new file mode 100644 index 0000000..272942a --- /dev/null +++ b/lib/popups/infos_popup.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:kumi_popup_window/kumi_popup_window.dart'; + +void showInfosPopup(BuildContext context) { + showPopupWindow( + context, + //childSize:Size(240, MediaQuery.of(context).size.width * 0.8), + gravity: KumiPopupGravity.center, + //curve: Curves.elasticOut, + bgColor: Colors.grey.withOpacity(0.5), + clickOutDismiss: true, + clickBackDismiss: true, + customAnimation: false, + customPop: false, + customPage: false, + // targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox), + //needSafeDisplay: true, + underStatusBar: false, + underAppBar: false, + //offsetX: -180, + //offsetY: 50, + duration: const Duration(milliseconds: 200), + onShowStart: (pop) {}, + onShowFinish: (pop) {}, + onDismissStart: (pop) {}, + onDismissFinish: (pop) {}, + onClickOut: (pop) {}, + onClickBack: (pop) {}, + childFun: (pop) { + return SizedBox( + key: GlobalKey(), + height: MediaQuery.of(context).size.height * 0.6, + width: MediaQuery.of(context).size.width * 0.8, + child: Container( + height: 100, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.red, + border: Border.all( + color: Colors.grey, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + children: const [ + Text('Dies sind die Infos\nBla') + ], + ), + ), + ) + ); + }, + ); +} \ No newline at end of file diff --git a/lib/popups/map_popup.dart b/lib/popups/map_popup.dart new file mode 100644 index 0000000..f28b742 --- /dev/null +++ b/lib/popups/map_popup.dart @@ -0,0 +1,198 @@ +import 'dart:async'; + +import 'package:animated_toggle_switch/animated_toggle_switch.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:kumi_popup_window/kumi_popup_window.dart'; +import 'package:latlong2/latlong.dart'; + +import '../model/job_tour.dart'; + +void showMapPopup(BuildContext context, JobTour currentTour, List tourList) { + showPopupWindow( + context, + //childSize:Size(240, 800), + gravity: KumiPopupGravity.center, + //curve: Curves.elasticOut, + bgColor: Colors.grey.withOpacity(0.5), + clickOutDismiss: true, + clickBackDismiss: true, + customAnimation: false, + customPop: false, + customPage: false, + // targetRenderBox: (btnKey.currentContext.findRenderObject() as RenderBox), + //needSafeDisplay: true, + underStatusBar: false, + underAppBar: false, + //offsetX: -180, + //offsetY: 50, + duration: const Duration(milliseconds: 300), + onShowStart: (pop) {}, + onShowFinish: (pop) {}, + onDismissStart: (pop) {}, + onDismissFinish: (pop) {}, + onClickOut: (pop) {}, + onClickBack: (pop) {}, + childFun: (pop) { + var mapController = MapController(); + Map> streamController = {}; + + List tourWidgets = []; + for(JobTour tour in tourList) { + var currentStreamController = StreamController(); + streamController[tour.sort] = currentStreamController; + + tourWidgets.add( + GestureDetector( + onTap: () async { + mapController.move(LatLng(tour.pos!.lat, tour.pos!.long), mapController.zoom); + + streamController[currentTour.sort]!.sink.add(false); + + currentTour = tour; + streamController[tour.sort]!.sink.add(true); + }, + child: SizedBox( + width: 70, + height: 80, + child: Column( + children: [ + Container( + height: 50, + width: 70, + color: Colors.transparent, + child: const Icon( + Icons.person_pin_circle, + color: Colors.blue, + size: 56, + ), + ), + const SizedBox(height: 2), + SizedBox( + height: 12.0, + width: 70, + child: Text( + "Tour ${tour.sort}", + softWrap: true, + textAlign: TextAlign.center, + style: const TextStyle( + color: Colors.black, + fontSize: 10.0, + ), + ), + ), + StreamBuilder( + stream: currentStreamController.stream, + builder: (context, snapshot) { + bool tourSelected = tour.sort == currentTour.sort; + if (snapshot.hasData) { + tourSelected = snapshot.data as bool; + } + + return Container( + height: 2, + color: tourSelected ? Colors.green : Colors.transparent, + ); + } + ), + ], + ), + ), + ), + ); + } + + final ValueNotifier valueNotifier = ValueNotifier(true); + + return Container( + padding: const EdgeInsets.fromLTRB(30, 0, 30, 0), + key: GlobalKey(), + height: MediaQuery.of(context).size.height * 0.6, + child: Container( + height: 100, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white, + border: Border.all( + color: Colors.grey, + width: 0.5, + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + SizedBox( + height: 80, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: tourWidgets, + ), + ) + ), + Row( + children: [ + Expanded( + child: ValueListenableBuilder( + valueListenable: valueNotifier, + builder: (context, value, child) { + return AnimatedToggleSwitch.dual( + current: value, + first: true, + second: false, + dif: 0.0, + borderColor: Colors.transparent, + borderWidth: 5.0, + height: 25, + boxShadow: const [ + BoxShadow( + color: Colors.black26, + spreadRadius: 1, + blurRadius: 2, + offset: Offset(0, 1.5), + ), + ], + onChanged: (b) { + valueNotifier.value = b; + mapController.move(mapController.center, b ? 14.0 : 16.0); + }, + colorBuilder: (b) => b ? Colors.red : Colors.green, + textBuilder: (value) => value + ? const Center(child: Text('Fern')) + : const Center(child: Text('Nah')), + ); + }, + ), + ), + ], + ), + const SizedBox(height: 10), + Expanded( + child: + AbsorbPointer( + absorbing: true, + child: FlutterMap( + mapController: mapController, + options: MapOptions( + center: LatLng(currentTour.pos!.lat, currentTour.pos!.long), + zoom: 14, + ), + children: [ + TileLayer( + urlTemplate: 'https://google-maps.assecutor.de/vt/lyrs=m@130&hl=en&x={x}&y={y}&z={z}', + userAgentPackageName: 'com.example.app', + ), + ], + ), + ), + ), + ], + ), + ), + ) + ); + }, + ); +} \ No newline at end of file diff --git a/lib/tools/colored_safe_area.dart b/lib/tools/colored_safe_area.dart new file mode 100644 index 0000000..6169652 --- /dev/null +++ b/lib/tools/colored_safe_area.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; + +class ColoredSafeArea extends StatelessWidget { + final Widget child; + + const ColoredSafeArea({required Key key, required this.child}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.primaryContainer, + child: SafeArea( + child: child, + ), + ); + } +} \ No newline at end of file diff --git a/lib/tools/connection_status.dart b/lib/tools/connection_status.dart new file mode 100644 index 0000000..f7f8b27 --- /dev/null +++ b/lib/tools/connection_status.dart @@ -0,0 +1,10 @@ + +enum ConnectionStatusEnum { + notConnected, + connected +} +class ConnectionStatus { + ConnectionStatus({required this.status}); + + final ConnectionStatusEnum status; +} \ No newline at end of file diff --git a/lib/tools/constants.dart b/lib/tools/constants.dart new file mode 100644 index 0000000..5fa6b76 --- /dev/null +++ b/lib/tools/constants.dart @@ -0,0 +1,11 @@ +class Constants { + static const String messageTopicConnectionStatusChanged = "connection_status_changed"; + static const String messageTopicPushContentView = "push_content_view"; + static const String messageTopicPopContentView = "pop_content_view"; + static const String messageTopicReplaceContentView = "replace_content_view"; + static const String messageTopicHideRightButton = "hide_right_button"; + static const String messageShowPopup = "show_popup"; + + //static const String topicToServer = "/app/100/2/208738/to_server"; + //static const String topicFromServer = "/app/100/2/208738/from_server"; +} \ No newline at end of file diff --git a/lib/tools/mqtt_core.dart b/lib/tools/mqtt_core.dart new file mode 100644 index 0000000..b333ff1 --- /dev/null +++ b/lib/tools/mqtt_core.dart @@ -0,0 +1,214 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter_broadcast_receiver/flutter_broadcast_receiver.dart'; +import 'package:mqtt_client/mqtt_client.dart'; +import 'package:mqtt_client/mqtt_server_client.dart'; +import 'package:stadtbote/model/bootstrap_request.dart'; +import 'package:stadtbote/model/bootstrap_response_payload.dart'; +import 'package:stadtbote/model/device_object.dart'; +import 'package:stadtbote/model/job.dart'; +import 'package:stadtbote/tools/connection_status.dart'; +import 'package:typed_data/typed_buffers.dart'; +import 'package:http/http.dart' as http; + +import '../main.dart'; +import '../model/status.dart'; +import 'constants.dart'; +import 'util.dart'; + +class MqttCore { + static late MqttCore instance; + + late String _brokerUri; + late int _brokerPort; + late String _fromServerTopic; + late String _toServerTopic; + + late MqttServerClient _mqttClient; + + late int _reconnectDelay = 0; + + MqttCore() { + _processBootstrap(); + } + + static setup() { + instance = MqttCore(); + } + + _connectToBroker() async { + try { + String clientId = await Util.getAppUuid(); + Util.logInfo("client id: $clientId"); + + _mqttClient = MqttServerClient.withPort(_brokerUri, clientId, _brokerPort); + _mqttClient.logging(on: false); + _mqttClient.keepAlivePeriod = 20; + _mqttClient.autoReconnect = false; + _mqttClient.onDisconnected = _clientDisconnected; + + _mqttClient.connectionMessage = MqttConnectMessage() + .withClientIdentifier('clientId') + .withWillQos(MqttQos.atMostOnce) + .withWillTopic('willTopic') + .withWillMessage('willMessage') + .authenticateAs("app", "apppwd"); + + await _mqttClient.connect(); + + if (_mqttClient.connectionStatus?.state == MqttConnectionState.connected) { + Util.logInfo('Verbunden mit dem MQTT-Broker!'); + + _reconnectDelay = 0; + + _setupSubscriptions(); + } else { + Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!'); + + BroadcastReceiver().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); + + _startReconnectTimer(); + } + + } catch (ex) { + _startReconnectTimer(); + + Util.logInfo('Verbindung zum MQTT-Broker fehlgeschlagen!: $ex'); + + BroadcastReceiver().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); + } + } + + publishText(String topic, String text) { + try { + var buffer = Uint8Buffer(); + buffer.addAll(text.codeUnits); + + _mqttClient.publishMessage(topic, MqttQos.exactlyOnce, buffer); + } catch (e) { + Util.logException(e.toString()); + } + } + + void _setupSubscriptions() async { + Util.logInfo('_setupSubscriptions called'); + + _mqttClient.updates?.listen((List> c) { + try { + final MqttPublishMessage message = c[0].payload as MqttPublishMessage; + final payload = MqttPublishPayload.bytesToStringAsString(message.payload.message); + var topic = message.variableHeader?.topicName; + + Util.logInfo('message received'); + Util.logInfo('topic: $topic'); + Util.logInfo('payload: $payload'); + + Map messageData = jsonDecode(payload); + + for (var entry in messageData.keys) { + if (entry == 'payload') { + var payload = messageData[entry]; + for (var payloadEntry in payload.keys) { + var payloadData = payload[payloadEntry]; + + switch(payloadEntry) { + case 'session': + _sessionMessageReceived(payloadData); + break; + + case 'jobs': + _jobMessageReceived(payloadData); + break; + + default: + Util.logInfo('Unknown topic: $payloadEntry'); + break; + } + } + } + } + } catch(ex) { + Util.logException(ex.toString()); + } + }); + + _mqttClient.subscribe(_fromServerTopic, MqttQos.exactlyOnce); + Util.logInfo('subscribed to topic: $_fromServerTopic'); + + BroadcastReceiver().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.connected)); + } + + void _sessionMessageReceived(payloadData) async { + var statusMessage = Status.fromJson(payloadData['status']); + + await MyApp.isarInstance.writeTxn(() async { + await MyApp.isarInstance.status.put(statusMessage); + }); + } + + void _jobMessageReceived(payloadData) async { + for (var foundJobData in payloadData) { + var newJob = Job.fromJson(foundJobData); + + await MyApp.isarInstance.writeTxn(() async { + await MyApp.isarInstance.jobs.put(newJob); + }); + } + } + + void _startReconnectTimer() { + Util.logInfo("_startReconnectTimer called"); + + _reconnectDelay = min(_reconnectDelay + 1, 30); + + Timer(Duration(seconds: _reconnectDelay), () { + _processBootstrap(); + }); + } + + void _clientDisconnected() { + Util.logInfo("_clientDisconnected called"); + + BroadcastReceiver().publish(Constants.messageTopicConnectionStatusChanged, arguments: ConnectionStatus(status: ConnectionStatusEnum.notConnected)); + + _startReconnectTimer(); + } + + void _processBootstrap() async { + try { + var deviceObject = DeviceObject(); + deviceObject.manufacturer = "sven"; + deviceObject.model = "emulator"; + deviceObject.os = "hat es"; + deviceObject.osVer = "0.0"; + + var handshakeMessage = BootstrapRequest(); + handshakeMessage.app = "sb"; + handshakeMessage.mqttClientId = "12345"; + handshakeMessage.deviceObject = deviceObject; + handshakeMessage.ver = 200; + + var jsonMap = handshakeMessage.toJson(); + var json = jsonEncode(jsonMap); + var uri = "https://init-x.assecutor.de/bootstrap?get_mqtt_broker=$json"; + print("Bootstrap request: $uri"); + + var response = await http.get(Uri.parse(uri)); + var responseText = response.body; + + var bootstrapResponsePayload = BootstrapResponsePayload.fromJson(jsonDecode(responseText)["payload"]); + + var brokerUriAndPortArray = bootstrapResponsePayload.config.broker.replaceFirst("mqtt://", "").split(":"); + _brokerUri = brokerUriAndPortArray[0]; + _brokerPort = int.parse(brokerUriAndPortArray[1]); + _fromServerTopic = bootstrapResponsePayload.config.topics.fromServer; + _toServerTopic = bootstrapResponsePayload.config.topics.toServer; + + _connectToBroker(); + } catch (ex) { + _startReconnectTimer(); + } + } +} diff --git a/lib/tools/page_base.dart b/lib/tools/page_base.dart new file mode 100644 index 0000000..2a1476f --- /dev/null +++ b/lib/tools/page_base.dart @@ -0,0 +1,5 @@ +import 'package:flutter/cupertino.dart'; + +abstract class PageBase extends StatelessWidget { + const PageBase({super.key}); +} \ No newline at end of file diff --git a/lib/tools/util.dart b/lib/tools/util.dart new file mode 100644 index 0000000..9032fc5 --- /dev/null +++ b/lib/tools/util.dart @@ -0,0 +1,178 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:uuid/uuid.dart'; + +import '../Tools/colored_safe_area.dart'; + +class Util { + static Future preferencesContainsKey(String key) async { + var prefs = await SharedPreferences.getInstance(); + return prefs.containsKey(key); + } + + static void preferencesSaveString(String key, String value) async { + var prefs = await SharedPreferences.getInstance(); + await prefs.setString(key, value); + } + + static Future preferencesGetString( + String key, String? defaultValue) async { + if (await preferencesContainsKey(key)) { + var prefs = await SharedPreferences.getInstance(); + return prefs.getString(key); + } + + return defaultValue; + } + + static void preferencesSaveInt(String key, int value) async { + var prefs = await SharedPreferences.getInstance(); + await prefs.setInt(key, value); + } + + static Future preferencesGetInt(String key, int? defaultValue) async { + if (await preferencesContainsKey(key)) { + var prefs = await SharedPreferences.getInstance(); + return prefs.getInt(key); + } + + return defaultValue; + } + + static void preferencesSaveBool(String key, bool value) async { + var prefs = await SharedPreferences.getInstance(); + await prefs.setBool(key, value); + } + + static Future preferencesGetBool(String key, bool defaultValue) async { + if (await preferencesContainsKey(key)) { + var prefs = await SharedPreferences.getInstance(); + return prefs.getBool(key) as bool; + } + + return defaultValue; + } + + static Future getAppUuid() async { + var currentUuid = await preferencesGetString('uuid', null); + + if (currentUuid == null) { + currentUuid ??= const Uuid().v4(); + + preferencesSaveString("uuid", currentUuid); + } + + return currentUuid; + } + + static logInfo(String message) { + if (kDebugMode) { + print('Message: $message'); + } + } + + static logException(String message) { + if (kDebugMode) { + print('Exception: $message'); + } + } + + static int fastHash(String string) { + var hash = 0xcbf29ce484222325; + + var i = 0; + while (i < string.length) { + final codeUnit = string.codeUnitAt(i++); + hash ^= codeUnit >> 8; + hash *= 0x100000001b3; + hash ^= codeUnit & 0xFF; + hash *= 0x100000001b3; + } + + return hash; + } + + static Widget getWaitWidget(context) { + return ColoredSafeArea( + key: const Key('value'), + child: Container( + width: 10, + height: 10, + color: Colors.white, + ), + ); + } + + static Future fetchFutureIcon(icon) { + return Future.delayed(const Duration(seconds: 0), () async { + return icon; + }); + } +} + +Widget getDefaultButton(String text, Function() onPressed, {Image? image}) { + return SizedBox( + height: 60, + child: Stack( + children: [ + Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: 60, + child: ElevatedButton( + style: ButtonStyle( + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + side: const BorderSide(color: Colors.grey), + ), + ), + backgroundColor: MaterialStateProperty.all(const Color.fromARGB(255, 220, 220, 220)), + foregroundColor: MaterialStateProperty.all(Colors.black), + ), + onPressed: () { + onPressed(); + }, + child: Text(text) + ), + ), + ), + ), + ], + ), + Positioned( + left: 20, + top: 15, + child: Center( + child: image + ) + ) + ], + ), + ); +} + +String mapTourMode(String mode) +{ + var text = ""; + switch (mode) + { + case "pu": + text += "/ Abholung"; + break; + + case "del": + text += "/ Auslieferung"; + break; + + case "pudel": + text += "/ Abholung/Auslieferung"; + break; + } + + return text; +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..d0f0505 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1186 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + url: "https://pub.dev" + source: hosted + version: "61.0.0" + analyzer: + dependency: "direct dev" + description: + name: analyzer + sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + url: "https://pub.dev" + source: hosted + version: "5.13.0" + animated_toggle_switch: + dependency: "direct main" + description: + name: animated_toggle_switch + sha256: "3c6d98dcd53cb93253a9418b888b3fcd9452a55fe1a7a390bd48c0a410a41634" + url: "https://pub.dev" + source: hosted + version: "0.6.2" + another_stepper: + dependency: "direct main" + description: + name: another_stepper + sha256: "04f5166c57f2412c612b17101e8a3d819f210c53f6bc1b5be541dc4c6987c681" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + archive: + dependency: transitive + description: + name: archive + sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" + url: "https://pub.dev" + source: hosted + version: "3.4.9" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" + source: hosted + version: "2.10.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "0713a05b0386bd97f9e63e78108805a4feca5898a4b821d6610857f10c91e975" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" + source: hosted + version: "2.3.3" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e" + url: "https://pub.dev" + source: hosted + version: "7.2.7+1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + url: "https://pub.dev" + source: hosted + version: "8.7.0" + characters: + dependency: transitive + description: + name: characters + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" + source: hosted + version: "1.2.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://pub.dev" + source: hosted + version: "4.7.0" + collection: + dependency: transitive + description: + name: collection + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" + source: hosted + version: "1.17.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "445db18de832dba8d851e287aff8ccf169bed30d2e94243cb54c7d2f1ed2142c" + url: "https://pub.dev" + source: hosted + version: "0.3.3+6" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + dartx: + dependency: transitive + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dio: + dependency: transitive + description: + name: dio + sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7" + url: "https://pub.dev" + source: hosted + version: "5.3.3" + easy_stepper: + dependency: "direct main" + description: + name: easy_stepper + sha256: "167e45561275a5866d6fd18c13ce16fb66230104764c313e2336461422b5ded4" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + event_bus: + dependency: transitive + description: + name: event_bus + sha256: "44baa799834f4c803921873e7446a2add0f3efa45e101a054b1f0ab9b95f8edc" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 + url: "https://pub.dev" + source: hosted + version: "2.0.2" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + file_picker: + dependency: "direct main" + description: + name: file_picker + sha256: "9d6e95ec73abbd31ec54d0e0df8a961017e165aba1395e462e5b31ea0c165daf" + url: "https://pub.dev" + source: hosted + version: "5.3.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "0aa47a725c346825a2bd396343ce63ac00bda6eff2fbc43eabe99737dede8262" + url: "https://pub.dev" + source: hosted + version: "2.6.1" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_broadcast_receiver: + dependency: "direct main" + description: + name: flutter_broadcast_receiver + sha256: "710f3be5b55098bb85dc4eca3f5a33c007f0849a153f0aa338929ff4e5d36c1b" + url: "https://pub.dev" + source: hosted + version: "1.0.0+2" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: "52c65a977daae42f9aae6748418dd1535eaf27186e9bac9bf431843082bc75a3" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + flutter_osm_interface: + dependency: transitive + description: + name: flutter_osm_interface + sha256: "68a4c0280413a0491b9ed7bc8f035ffa954579fc277d8daf4c12bbc395110fcc" + url: "https://pub.dev" + source: hosted + version: "0.3.5" + flutter_osm_plugin: + dependency: "direct main" + description: + name: flutter_osm_plugin + sha256: "7b7d22a91832b49072e5959297513eeae161264293e5a7cbb5d437f52cdf7b53" + url: "https://pub.dev" + source: hosted + version: "0.53.4+1" + flutter_osm_web: + dependency: transitive + description: + name: flutter_osm_web + sha256: c57e49a2a01303b4464edf4a5c0095e46d3e9655ebd65e91375080ede51170b4 + url: "https://pub.dev" + source: hosted + version: "0.2.7" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" + source: hosted + version: "2.0.17" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + google_polyline_algorithm: + dependency: transitive + description: + name: google_polyline_algorithm + sha256: "357874f00d3f93c3ba1bf4b4d9a154aa9ee87147c068238c1e8392012b686a03" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + http: + dependency: "direct main" + description: + name: http + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" + source: hosted + version: "0.13.6" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: b6951e25b795d053a6ba03af5f710069c99349de9341af95155d52665cb4607c + url: "https://pub.dev" + source: hosted + version: "0.8.9" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d6a6e78821086b0b737009b09363018309bbc6de3fd88cc5c26bc2bb44a4957f + url: "https://pub.dev" + source: hosted + version: "0.8.8+2" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "76ec722aeea419d03aa915c2c96bf5b47214b053899088c9abb4086ceecf97a7" + url: "https://pub.dev" + source: hosted + version: "0.8.8+4" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: ed9b00e63977c93b0d2d2b343685bed9c324534ba5abafbb3dfbd6a780b1b514 + url: "https://pub.dev" + source: hosted + version: "2.9.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + isar: + dependency: "direct main" + description: + name: isar + sha256: "99165dadb2cf2329d3140198363a7e7bff9bbd441871898a87e26914d25cf1ea" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + isar_flutter_libs: + dependency: "direct main" + description: + name: isar_flutter_libs + sha256: bc6768cc4b9c61aabff77152e7f33b4b17d2fc93134f7af1c3dd51500fe8d5e8 + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + isar_generator: + dependency: "direct dev" + description: + name: isar_generator + sha256: "76c121e1295a30423604f2f819bc255bc79f852f3bc8743a24017df6068ad133" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + json_serializable: + dependency: "direct main" + description: + name: json_serializable + sha256: "43793352f90efa5d8b251893a63d767b2f7c833120e3cc02adad55eefec04dc7" + url: "https://pub.dev" + source: hosted + version: "6.6.2" + kumi_popup_window: + dependency: "direct main" + description: + name: kumi_popup_window + sha256: "3159a2ee307850ab3520cfb162efc1e330aac2e560569e20227bf2ac93ec06d5" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "08ef7282ba9f76e8495e49e2dc4d653015ac929dce5f92b375a415d30b407ea0" + url: "https://pub.dev" + source: hosted + version: "0.8.2" + lints: + dependency: transitive + description: + name: lints + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + lottie: + dependency: transitive + description: + name: lottie + sha256: "23522951540d20a57a60202ed7022e6376bed206a4eee1c347a91f58bd57eb9f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + matcher: + dependency: transitive + description: + name: matcher + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" + source: hosted + version: "0.12.13" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + meta: + dependency: transitive + description: + name: meta + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mime: + dependency: "direct main" + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + mqtt_client: + dependency: "direct main" + description: + name: mqtt_client + sha256: ba10ec490ded55dc4e77bbc992529d823fb15d0d5ec68c2895f960312060c541 + url: "https://pub.dev" + source: hosted + version: "9.8.1" + open_filex: + dependency: "direct main" + description: + name: open_filex + sha256: a6c95237767c5647e68b71a476602fcf4f1bfc530c126265e53addae22ef5fc2 + url: "https://pub.dev" + source: hosted + version: "4.3.4" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" + source: hosted + version: "1.8.2" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + url: "https://pub.dev" + source: hosted + version: "2.1.1" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + permission_handler: + dependency: transitive + description: + name: permission_handler + sha256: bc56bfe9d3f44c3c612d8d393bd9b174eb796d706759f9b495ac254e4294baa5 + url: "https://pub.dev" + source: hosted + version: "10.4.5" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "59c6322171c29df93a22d150ad95f3aa19ed86542eaec409ab2691b8f35f9a47" + url: "https://pub.dev" + source: hosted + version: "10.3.6" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" + url: "https://pub.dev" + source: hosted + version: "9.1.4" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" + url: "https://pub.dev" + source: hosted + version: "3.12.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + url: "https://pub.dev" + source: hosted + version: "0.1.3" + platform: + dependency: transitive + description: + name: platform + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + url: "https://pub.dev" + source: hosted + version: "2.1.6" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + routing_client_dart: + dependency: "direct main" + description: + name: routing_client_dart + sha256: "00089e5009dd00b137d6c47c398ce29ce1b53dd3bba5a721499ce185c9301de9" + url: "https://pub.dev" + source: hosted + version: "0.4.3" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + url: "https://pub.dev" + source: hosted + version: "2.3.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: "direct dev" + description: + name: source_gen + sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" + url: "https://pub.dev" + source: hosted + version: "1.3.2" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" + source: hosted + version: "1.9.1" + split_view: + dependency: "direct main" + description: + name: split_view + sha256: "7ad0e1c40703901aa1175fd465dec5e965b55324f9cc8e51526479a4a96d01a4" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" + source: hosted + version: "0.4.16" + time: + dependency: transitive + description: + name: time + sha256: "83427e11d9072e038364a5e4da559e85869b227cf699a541be0da74f14140124" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + tuple: + dependency: transitive + description: + name: tuple + sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 + url: "https://pub.dev" + source: hosted + version: "2.0.2" + typed_data: + dependency: "direct main" + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 + url: "https://pub.dev" + source: hosted + version: "6.1.11" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2 + url: "https://pub.dev" + source: hosted + version: "2.0.19" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + uuid: + dependency: "direct main" + description: + name: uuid + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" + source: hosted + version: "3.0.7" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" + url: "https://pub.dev" + source: hosted + version: "4.1.4" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + xxh3: + dependency: transitive + description: + name: xxh3 + sha256: a92b30944a9aeb4e3d4f3c3d4ddb3c7816ca73475cd603682c4f8149690f56d7 + url: "https://pub.dev" + source: hosted + version: "1.0.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=2.19.6 <3.0.0" + flutter: ">=3.7.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..a745f79 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,122 @@ +name: stadtbote +description: Stadtbote +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=2.19.6 <3.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + uuid: ^3.0.7 + file_picker: ^5.2.7 + http: ^0.13.5 + image_picker: ^0.8.7+1 + mime: ^1.0.4 + open_filex: ^4.3.2 + path_provider: ^2.0.14 + split_view: ^3.2.1 + mqtt_client: ^9.8.1 + isar_flutter_libs: ^3.1.0+1 + isar: ^3.1.0+1 + json_serializable: ^6.6.2 + json_annotation: ^4.8.1 + shared_preferences: ^2.1.1 + typed_data: ^1.3.2 + flutter_broadcast_receiver: ^1.0.0+2 + intl: ^0.18.0 + another_stepper: ^1.2.2 + easy_stepper: ^0.6.0 + kumi_popup_window: ^2.0.1 + flutter_osm_plugin: ^0.53.4+1 + routing_client_dart: ^0.4.2 + animated_toggle_switch: ^0.6.2 + flutter_map: ^4.0.0 + latlong2: ^0.8.2 + +dev_dependencies: + flutter_test: + sdk: flutter + source_gen: ^1.3.1 + build_runner: ^2.3.3 + analyzer: ^5.12.0 + isar_generator: ^3.1.0+1 + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + assets: + - assets/ + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..6ff2d41 --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:stadtbote/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +}