From 83e5c9b4160db05746942c2d11670c5149fa522c Mon Sep 17 00:00:00 2001 From: PGAN-MIS Date: Wed, 21 Jun 2023 08:22:43 +0800 Subject: [PATCH] Finish implementing Pass check operations --- android/app/src/main/AndroidManifest.xml | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 1 + assets/fail.mp3 | Bin 0 -> 15885 bytes assets/invalid.mp3 | Bin 0 -> 20301 bytes assets/sounds/ScanFailed.mp3 | Bin 0 -> 4800 bytes assets/sounds/Successful.mp3 | Bin 0 -> 5760 bytes assets/success.mp3 | Bin 0 -> 18333 bytes ios/Podfile.lock | 38 +- ios/Runner.xcodeproj/project.pbxproj | 15 +- ios/Runner/Info.plist | 2 + lib/bloc/profile/family/family_bloc.dart | 3 + lib/bloc/profile/family/family_event.dart | 5 + .../learning_development_bloc.dart | 220 +++-- .../learning_development_state.dart | 7 - .../contact/contact_bloc.dart | 4 +- .../voluntary_works/voluntary_work_bloc.dart | 1 - lib/bloc/role/pass_check/pass_check_bloc.dart | 180 +++++ .../role/pass_check/pass_check_event.dart | 70 ++ .../role/pass_check/pass_check_state.dart | 67 ++ lib/bloc/user/user_bloc.dart | 6 +- lib/bloc/user/user_state.dart | 4 + .../roles/pass_check/agency_area_type.dart | 96 +++ .../pass_check/assign_role_area_type.dart | 52 ++ .../pass_check/barangay_assign_area.dart | 24 + lib/model/roles/pass_check/passer_info.dart | 120 +++ .../roles/pass_check/purok_assign_area.dart | 42 + .../roles/pass_check/station_assign_area.dart | 182 +++++ .../basic_information/address/edit_modal.dart | 33 + .../contact_information_screen.dart | 4 +- .../edit_basic_info_modal.dart | 2 +- .../family/spouse_edit_modal.dart | 3 - .../identification/edit_modal.dart | 33 +- .../identification_information_screen.dart | 2 +- .../primary_information_screen.dart | 9 +- .../components/eligibility/edit_modal.dart | 15 + .../components/family_background_screen.dart | 69 +- .../learning_and_development_screen.dart | 74 +- .../learning_development/add_modal.dart | 1 - .../learning_development/edit_modal.dart | 287 ++++--- .../components/reference/add_modal.dart | 1 - .../components/reference/edit_modal.dart | 441 +++++----- .../profile/components/references_screen.dart | 1 + .../voluntary_works/edit_modal.dart | 14 +- .../components/voluntary_works_screen.dart | 3 +- lib/screens/sos/components/add_mobile.dart | 20 +- lib/screens/sos/components/request_sos.dart | 2 +- lib/screens/sos/index.dart | 2 +- lib/screens/unit2/basic-info/basic-info.dart | 14 +- .../homepage.dart/components/dashboard.dart | 73 +- .../homepage.dart/components/menu-screen.dart | 68 +- .../unit2/homepage.dart/components/menu.dart | 5 +- .../unit2/homepage.dart/module-screen.dart | 3 + lib/screens/unit2/login/login.dart | 12 +- lib/screens/unit2/login/qr_login.dart | 22 +- .../roles/qr_code_scanner.dart/scan.dart | 460 ++++++++--- .../qr_code_scanner.dart/settings_screen.dart | 757 ++++++++++++++---- lib/sevices/profile/address_service.dart | 4 +- lib/sevices/profile/profile_service.dart | 2 +- lib/sevices/roles/pass_check_services.dart | 265 ++++++ lib/utils/app_router.dart | 16 +- lib/utils/global.dart | 2 + lib/utils/urls.dart | 18 +- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 8 + pubspec.lock | 276 ++++--- pubspec.yaml | 4 + .../flutter/generated_plugin_registrant.cc | 6 + windows/flutter/generated_plugins.cmake | 2 + 69 files changed, 3176 insertions(+), 1005 deletions(-) create mode 100644 assets/fail.mp3 create mode 100644 assets/invalid.mp3 create mode 100644 assets/sounds/ScanFailed.mp3 create mode 100644 assets/sounds/Successful.mp3 create mode 100644 assets/success.mp3 create mode 100644 lib/bloc/role/pass_check/pass_check_bloc.dart create mode 100644 lib/bloc/role/pass_check/pass_check_event.dart create mode 100644 lib/bloc/role/pass_check/pass_check_state.dart create mode 100644 lib/model/roles/pass_check/agency_area_type.dart create mode 100644 lib/model/roles/pass_check/assign_role_area_type.dart create mode 100644 lib/model/roles/pass_check/barangay_assign_area.dart create mode 100644 lib/model/roles/pass_check/passer_info.dart create mode 100644 lib/model/roles/pass_check/purok_assign_area.dart create mode 100644 lib/model/roles/pass_check/station_assign_area.dart create mode 100644 lib/sevices/roles/pass_check_services.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 390ee63..922eb2f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,7 +15,9 @@ android:authorities = "${applicationId}.fileprovider" android:exported = "false" android:grantUriPermissions = "true" -android:name = "androidx.core.content.FileProvider"> +android:name = "androidx.core.content.FileProvider" +android:usesCleartextTraffic="true"> + diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index cb24abd..ee64223 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +android.enableDexingArtifactTransform=false distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/assets/fail.mp3 b/assets/fail.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..6ad924121076544547ab8fb22a85e55445a8840f GIT binary patch literal 15885 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

K>1F-2&crWk$(CU9=xhdx|Xghkw> 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%0D(GgEtH|g+|6f4jEM4wVMQrJ594 z_ST?O&Jho?qU+_pO0%yuH{t^#v8B3-N!+q&(S-GN(S#$(-2_5h9JkU+~xu zSKm_g8AG?gvnnN2`Iyx{OFAEstu=A66O1OK9`8;4er;1oXgimWE`0E?TrwGf|NPjV zNwx)mpYFh{R3UpsL57oUL)(p7gSnsCrSW2yvvaQWtnk3#cKVMrsaI>uYEqi!Ufpd6Um|DU^*k*fg3!Yk;5D zOOR>I4p{gqC~D~Hpx8d4M0LHj?S4Y-=PtjzE_EZ7QKdS06a0JhVnO$908bn3J@&2E z-`pwdyWiY`?St%5VVn2A=QZWElno6H9}>}rsN(;t?ESefdV{H+79Xjua{J%=_}AnA rPjr9Ij{b`e!30bJ02u!Vj6K97|9Xf={%4f}{I~Z1RS)@pT>n1+n+Ra# literal 0 HcmV?d00001 diff --git a/assets/invalid.mp3 b/assets/invalid.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b7c5d3111d57935b2bbb4f02142c4cc2174ccd21 GIT binary patch literal 20301 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/ScanFailed.mp3 b/assets/sounds/ScanFailed.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7309226f6a682c576c5613df7c2e8412da30d693 GIT binary patch literal 4800 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/Successful.mp3 b/assets/sounds/Successful.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5fe691df844af6d35df6c7e4939a663ff0ff275e GIT binary patch literal 5760 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 2.7.5) - SwiftProtobuf (1.20.3) - Toast (4.0.0) DEPENDENCIES: + - assets_audio_player (from `.symlinks/plugins/assets_audio_player/ios`) + - assets_audio_player_web (from `.symlinks/plugins/assets_audio_player_web/ios`) + - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - device_info (from `.symlinks/plugins/device_info/ios`) - easy_app_installer (from `.symlinks/plugins/easy_app_installer/ios`) @@ -49,6 +60,7 @@ DEPENDENCIES: - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - platform_device_id (from `.symlinks/plugins/platform_device_id/ios`) + - rive_common (from `.symlinks/plugins/rive_common/ios`) - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) @@ -60,6 +72,12 @@ SPEC REPOS: - Toast EXTERNAL SOURCES: + assets_audio_player: + :path: ".symlinks/plugins/assets_audio_player/ios" + assets_audio_player_web: + :path: ".symlinks/plugins/assets_audio_player_web/ios" + audioplayers_darwin: + :path: ".symlinks/plugins/audioplayers_darwin/ios" barcode_scan2: :path: ".symlinks/plugins/barcode_scan2/ios" device_info: @@ -82,27 +100,33 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/permission_handler_apple/ios" platform_device_id: :path: ".symlinks/plugins/platform_device_id/ios" + rive_common: + :path: ".symlinks/plugins/rive_common/ios" shared_preferences_foundation: :path: ".symlinks/plugins/shared_preferences_foundation/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" SPEC CHECKSUMS: + assets_audio_player: edee322b9cb625571b830b35872ead1a295fd917 + assets_audio_player_web: 19826380c44375761aa0b9053665c1e3fbc3b86b + audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 easy_app_installer: 29abe397da7d86721fee853281202f414373f45c Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0 + fluttertoast: fafc4fa4d01a6a9e4f772ecd190ffa525e9e2d9c FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740 modal_progress_hud_nsn: f6fb744cd060653d66ed8f325360ef3650eb2fde MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e - path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 - permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce + path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8 + permission_handler_apple: 8f116445eff3c0e7c65ad60f5fef5490aa94b4e4 platform_device_id: 81b3e2993881f87d0c82ef151dc274df4869aef5 - shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472 - sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + rive_common: 60ae7896ab40f9513974f36f015de33f70d2c5c5 + shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c + sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a SwiftProtobuf: b02b5075dcf60c9f5f403000b3b0c202a11b6ae1 Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index db5f9c0..1372ea9 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -323,6 +323,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -341,7 +342,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -362,7 +363,7 @@ DEVELOPMENT_TEAM = 2WLSMMLG6W; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -404,6 +405,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -428,7 +430,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -459,6 +461,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -477,7 +480,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -500,7 +503,7 @@ DEVELOPMENT_TEAM = 2WLSMMLG6W; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -532,7 +535,7 @@ DEVELOPMENT_TEAM = 2WLSMMLG6W; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 06ce33a..67bed1a 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ +NSCameraUsageDescription + Camera permission is required for barcode scanning. CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/lib/bloc/profile/family/family_bloc.dart b/lib/bloc/profile/family/family_bloc.dart index f948ab6..96b13f8 100644 --- a/lib/bloc/profile/family/family_bloc.dart +++ b/lib/bloc/profile/family/family_bloc.dart @@ -120,5 +120,8 @@ class FamilyBloc extends Bloc { emit(FamilyErrorState(message: e.toString())); } }); + on((event,emit){ + emit(FamilyErrorState(message: state.toString())); + }); } } diff --git a/lib/bloc/profile/family/family_event.dart b/lib/bloc/profile/family/family_event.dart index ba6ff31..a9fb8c5 100644 --- a/lib/bloc/profile/family/family_event.dart +++ b/lib/bloc/profile/family/family_event.dart @@ -64,3 +64,8 @@ class AddEmergencyEvent extends FamilyEvent{ @override List get props => [profileId,token,relatedPersonId]; } + +class CallErrorState extends FamilyEvent{ + final String message; + const CallErrorState({required this.message}); +} diff --git a/lib/bloc/profile/learningDevelopment/learning_development_bloc.dart b/lib/bloc/profile/learningDevelopment/learning_development_bloc.dart index 1857b85..6ef27c0 100644 --- a/lib/bloc/profile/learningDevelopment/learning_development_bloc.dart +++ b/lib/bloc/profile/learningDevelopment/learning_development_bloc.dart @@ -1,14 +1,8 @@ import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; import 'package:unit2/model/location/country.dart'; import 'package:unit2/model/location/region.dart'; -import 'package:unit2/screens/profile/components/other_information/org_membership/add_modal.dart'; -import 'package:unit2/screens/unit2/login/components/update_required.dart'; import 'package:unit2/sevices/profile/learningDevelopment_service.dart'; -import 'package:unit2/test_data.dart'; -import 'package:unit2/utils/text_container.dart'; - import '../../../model/location/barangay.dart'; import '../../../model/location/city.dart'; import '../../../model/location/provinces.dart'; @@ -17,7 +11,6 @@ import '../../../model/utils/agency.dart'; import '../../../model/utils/category.dart'; import '../../../utils/location_utilities.dart'; import '../../../utils/profile_utilities.dart'; - part 'learning_development_event.dart'; part 'learning_development_state.dart'; @@ -40,17 +33,16 @@ class LearningDevelopmentBloc Province? currentProvince; CityMunicipality? currentCity; Barangay? currentBarangay; - - on((event, emit) async { - emit(LearningDevelopmentLoadingState()); - try { - List learnings = await LearningDevelopmentServices - .instance - .getLearningDevelopments(event.profileId, event.token); - learningsAndDevelopments = learnings; - emit(LearningDevelopmentLoadedState( - learningsAndDevelopment: learningsAndDevelopments)); + on((event, emit) async { + emit(LearningDevelopmentLoadingState()); + try { + List learnings = await LearningDevelopmentServices + .instance + .getLearningDevelopments(event.profileId, event.token); + learningsAndDevelopments = learnings; + emit(LearningDevelopmentLoadedState( + learningsAndDevelopment: learningsAndDevelopments)); } catch (e) { emit(LearningDevelopmentErrorState(message: e.toString())); } @@ -93,7 +85,6 @@ class LearningDevelopmentBloc await ProfileUtilities.instance.agencyCategory(); agencyCategory = categoryAgencies; } - emit(LearningDevelopmentAddingState( types: types, topics: topics, @@ -103,102 +94,103 @@ class LearningDevelopmentBloc sponsorAgencies: agencies, agencyCategory: agencyCategory)); } catch (e) { - emit(LeaningDevelopmentErrorState(message: e.toString())); + emit(LearningDevelopmentErrorState(message: e.toString())); } }); ////Show edit form on((event, emit) async { - try{ - if (globalRegions.isEmpty) { - List regions = await LocationUtils.instance.getRegions(); - globalRegions = regions; - } - if (globalCountries.isEmpty) { - List countries = await LocationUtils.instance.getCountries(); - globalCountries = countries; - } - currentCountry = globalCountries.firstWhere((Country country) => - event.learningDevelopment.conductedTraining!.venue!.country!.code == - country.code); - if (!event.isOverseas) { - //// if not overseas - currentRegion = globalRegions.firstWhere((Region region) => - event.learningDevelopment.conductedTraining!.venue! - .cityMunicipality!.province!.region!.code == - region.code); - - globalProvinces = await LocationUtils.instance - .getProvinces(regionCode: currentRegion!.code.toString()); - currentProvince = globalProvinces.firstWhere((Province province) => - event.learningDevelopment.conductedTraining!.venue! - .cityMunicipality!.province!.code == - province.code); - - globalCities = await LocationUtils.instance - .getCities(code: currentProvince!.code.toString()); - - currentCity = globalCities.firstWhere( - (CityMunicipality cityMunicipality) => - event.learningDevelopment.conductedTraining!.venue! - .cityMunicipality!.code == - cityMunicipality.code); - globalBarangay = await LocationUtils.instance - .getBarangay(code: currentCity!.code.toString()); - - if (event.learningDevelopment.conductedTraining?.venue?.barangay?.cityMunicipality != - null) { - currentBarangay = globalBarangay.firstWhere((Barangay barangay) => - event.learningDevelopment.conductedTraining!.venue!.barangay! - .code == - barangay.code); - } else { - currentBarangay = null; + try { + if (globalRegions.isEmpty) { + List regions = await LocationUtils.instance.getRegions(); + globalRegions = regions; } - } - if (topics.isEmpty) { - List newTopics = - await LearningDevelopmentServices.instance.getTrainingTopics(); - topics = newTopics; - } - if (types.isEmpty) { - List newTypes = - await LearningDevelopmentServices.instance - .getLearningDevelopmentType(); - types = newTypes; - } - if (agencies.isEmpty) { - List newAgencies = await ProfileUtilities.instance.getAgecies(); - agencies = newAgencies; - } - if (agencyCategory.isEmpty) { - List categoryAgencies = - await ProfileUtilities.instance.agencyCategory(); - agencyCategory = categoryAgencies; - } - emit(LearningDevelopmentUpdatingState( - cities: globalCities, - currentBarangay: currentBarangay, - barangay: globalBarangay, + if (globalCountries.isEmpty) { + List countries = await LocationUtils.instance.getCountries(); + globalCountries = countries; + } + currentCountry = globalCountries.firstWhere((Country country) => + event.learningDevelopment.conductedTraining!.venue!.country!.code == + country.code); + if (!event.isOverseas) { + //// if not overseas + currentRegion = globalRegions.firstWhere((Region region) => + event.learningDevelopment.conductedTraining!.venue! + .cityMunicipality!.province!.region!.code == + region.code); - provinces: globalProvinces, - types: types, - topics: topics, - training: event.learningDevelopment.conductedTraining!.title!, - learningDevelopement: event.learningDevelopment, - currentConductedBy: - event.learningDevelopment.conductedTraining!.conductedBy!, - currentSponsor: event.learningDevelopment.sponsoredBy, - conductedBy: agencies, - sponsorAgencies: agencies, - agencyCategory: agencyCategory, - countries: globalCountries, - regions: globalRegions, - currentRegion: currentRegion, - currentCountry: currentCountry!, - currentProvince: currentProvince, - currentCity: currentCity, - overseas: event.isOverseas)); - }catch(e){ + globalProvinces = await LocationUtils.instance + .getProvinces(regionCode: currentRegion!.code.toString()); + currentProvince = globalProvinces.firstWhere((Province province) => + event.learningDevelopment.conductedTraining!.venue! + .cityMunicipality!.province!.code == + province.code); + + globalCities = await LocationUtils.instance + .getCities(code: currentProvince!.code.toString()); + + currentCity = globalCities.firstWhere( + (CityMunicipality cityMunicipality) => + event.learningDevelopment.conductedTraining!.venue! + .cityMunicipality!.code == + cityMunicipality.code); + globalBarangay = await LocationUtils.instance + .getBarangay(code: currentCity!.code.toString()); + + if (event.learningDevelopment.conductedTraining?.venue?.barangay + ?.cityMunicipality != + null) { + currentBarangay = globalBarangay.firstWhere((Barangay barangay) => + event.learningDevelopment.conductedTraining!.venue!.barangay! + .code == + barangay.code); + } else { + currentBarangay = null; + } + } + if (topics.isEmpty) { + List newTopics = + await LearningDevelopmentServices.instance.getTrainingTopics(); + topics = newTopics; + } + if (types.isEmpty) { + List newTypes = + await LearningDevelopmentServices.instance + .getLearningDevelopmentType(); + types = newTypes; + } + if (agencies.isEmpty) { + List newAgencies = + await ProfileUtilities.instance.getAgecies(); + agencies = newAgencies; + } + if (agencyCategory.isEmpty) { + List categoryAgencies = + await ProfileUtilities.instance.agencyCategory(); + agencyCategory = categoryAgencies; + } + emit(LearningDevelopmentUpdatingState( + cities: globalCities, + currentBarangay: currentBarangay, + barangay: globalBarangay, + provinces: globalProvinces, + types: types, + topics: topics, + training: event.learningDevelopment.conductedTraining!.title!, + learningDevelopement: event.learningDevelopment, + currentConductedBy: + event.learningDevelopment.conductedTraining!.conductedBy!, + currentSponsor: event.learningDevelopment.sponsoredBy, + conductedBy: agencies, + sponsorAgencies: agencies, + agencyCategory: agencyCategory, + countries: globalCountries, + regions: globalRegions, + currentRegion: currentRegion, + currentCountry: currentCountry!, + currentProvince: currentProvince, + currentCity: currentCity, + overseas: event.isOverseas)); + } catch (e) { emit(LearningDevelopmentErrorState(message: e.toString())); } }); @@ -223,7 +215,7 @@ class LearningDevelopmentBloc emit(LearningDevelopmentErrorState(message: e.toString())); } }); - + ////Update on((event, emit) async { try { @@ -233,9 +225,11 @@ class LearningDevelopmentBloc token: event.token, profileId: event.profileId); if (status['success']) { - learningsAndDevelopments.removeWhere((LearningDevelopement element) => - element.conductedTraining!.id == event.learningDevelopement.conductedTraining!.id && - element.conductedTraining!.totalHours == event.learningDevelopement.conductedTraining!.totalHours); + learningsAndDevelopments.removeWhere((LearningDevelopement element) => + element.conductedTraining!.id == + event.learningDevelopement.conductedTraining!.id && + element.conductedTraining!.totalHours == + event.learningDevelopement.conductedTraining!.totalHours); LearningDevelopement learningDevelopement = LearningDevelopement.fromJson(status['data']); learningsAndDevelopments.add(learningDevelopement); @@ -270,7 +264,7 @@ class LearningDevelopmentBloc }); //// call errror on((event, emit) { - emit(LeaningDevelopmentErrorState(message: event.message)); + emit(LearningDevelopmentErrorState(message: event.message)); }); } } diff --git a/lib/bloc/profile/learningDevelopment/learning_development_state.dart b/lib/bloc/profile/learningDevelopment/learning_development_state.dart index bf0276b..e498dc9 100644 --- a/lib/bloc/profile/learningDevelopment/learning_development_state.dart +++ b/lib/bloc/profile/learningDevelopment/learning_development_state.dart @@ -16,13 +16,6 @@ class LearningDevelopmentLoadedState extends LearningDevelopmentState { List get props => [learningsAndDevelopment]; } -class LeaningDevelopmentErrorState extends LearningDevelopmentState { - final String message; - const LeaningDevelopmentErrorState({required this.message}); - @override - List get props => [message]; -} - class LearningDevelopmentLoadingState extends LearningDevelopmentState {} ////added State diff --git a/lib/bloc/profile/primary_information/contact/contact_bloc.dart b/lib/bloc/profile/primary_information/contact/contact_bloc.dart index 5753c70..e2e1ba2 100644 --- a/lib/bloc/profile/primary_information/contact/contact_bloc.dart +++ b/lib/bloc/profile/primary_information/contact/contact_bloc.dart @@ -107,11 +107,11 @@ class ContactBloc extends Bloc { ContactInfo contactInfo = ContactInfo.fromJson(responseStatus['data']['contact_info']); contactInformations.add(contactInfo); - emit(ContactEditedState( + emit(ContactAddedState( response: responseStatus)); } else { - emit(ContactEditedState( + emit(ContactAddedState( response: responseStatus)); } diff --git a/lib/bloc/profile/voluntary_works/voluntary_work_bloc.dart b/lib/bloc/profile/voluntary_works/voluntary_work_bloc.dart index b9e68e3..9d519eb 100644 --- a/lib/bloc/profile/voluntary_works/voluntary_work_bloc.dart +++ b/lib/bloc/profile/voluntary_works/voluntary_work_bloc.dart @@ -1,6 +1,5 @@ import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:unit2/sevices/profile/volunatary_services.dart'; import 'package:unit2/utils/profile_utilities.dart'; diff --git a/lib/bloc/role/pass_check/pass_check_bloc.dart b/lib/bloc/role/pass_check/pass_check_bloc.dart new file mode 100644 index 0000000..c1d157a --- /dev/null +++ b/lib/bloc/role/pass_check/pass_check_bloc.dart @@ -0,0 +1,180 @@ + +import 'package:barcode_scan2/model/scan_result.dart'; +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:unit2/model/roles/pass_check/passer_info.dart'; +import 'package:unit2/sevices/roles/pass_check_services.dart'; +import '../../../utils/scanner.dart'; +part 'pass_check_event.dart'; +part 'pass_check_state.dart'; + +class PassCheckBloc extends Bloc { + PassCheckBloc() : super(PassCheckInitial()) { + int? roleId; + String? uuid; + bool? otherInputs; + String? io; + dynamic assignedArea; + int? checkerId; + String? token; + int? stationId; + String? cpId; + on((event, emit) async { + try { + emit(PassCheckLoadingState()); + List response = await PassCheckServices.instance + .getPassCheckArea(roleId: event.roleId, userId: event.userId); + roleId = event.roleId; + emit(AssignAreaLoaded(assignedArea: response, roleId: roleId!)); + } catch (e) { + emit(PassCheckErrorState(message: e.toString())); + } + }); + on((event, emit) { + otherInputs = event.includeOtherInputs; + checkerId = event.checkerId; + io = event.entranceExit; + token = event.token; + roleId = event.roleId; + assignedArea = event.assignedArea; + emit(SettingSaved( + assignedArea: assignedArea, + checker: checkerId!, + io: io!, + otherInputs: otherInputs!, + roleId: roleId!, + token: token!)); + }); + on((event, emit) { + emit(SettingSaved( + assignedArea: assignedArea, + checker: checkerId!, + io: io!, + otherInputs: otherInputs!, + roleId: roleId!, + token: token!)); + }); + on((event, emit) { + add(PerformPostLogs( + checkerId: checkerId!, + cpId: cpId, + destination: null, + io: io!.toLowerCase() == "incoming" ? "i" : "o", + otherInputs: otherInputs!, + passerId: uuid!, + roleId: roleId!, + stationId: stationId, + temp: event.temp)); + }); + + on((event, emit) { + add(PerformPostLogs( + checkerId: checkerId!, + cpId: cpId, + destination: event.destination, + io: io!.toLowerCase() == "incoming" ? "i" : "o", + otherInputs: otherInputs!, + passerId: uuid!, + roleId: roleId!, + stationId: stationId, + temp: null)); + }); + on((event, emit) async { + ScanResult result = await QRCodeBarCodeScanner.instance.scanner(); + if (result.rawContent.toString().isNotEmpty) { + uuid = result.rawContent.toString(); + emit(PassCheckLoadingState()); + try { + PasserInfo? passerInfo = await PassCheckServices.instance + .getPasserInfo(uuid: uuid!, token: event.token); + if (roleId == 41 || roleId == 13 || roleId == 17 || roleId == 22) { + stationId = assignedArea.id; + } else if (roleId == 7) { + cpId = assignedArea.brgycode; + } else if (roleId == 10) { + cpId = assignedArea.purokdesc; + } else if (roleId == 16) { + cpId = assignedArea.id; + } + if (passerInfo == null) { + Fluttertoast.showToast( + msg: "QR CODE IS INVALID", + fontSize: 24, + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + backgroundColor: Colors.black, + textColor: Colors.white); + emit(QRInvalid(token: token!)); + } else { + if (otherInputs!) { + if (io?.toLowerCase() == 'incoming') { + emit(IncomingScanState()); + } else { + emit(OutGoingScanState()); + } + } else { + add(PerformPostLogs( + checkerId: checkerId!, + cpId: cpId, + destination: null, + io: io!.toLowerCase() == "incoming" ? "i" : "o", + otherInputs: otherInputs!, + passerId: uuid!, + roleId: roleId!, + stationId: stationId, + temp: null)); + } + } + } catch (e) { + emit(PassCheckErrorState(message: e.toString())); + } + } else { + emit(SettingSaved( + assignedArea: assignedArea, + checker: checkerId!, + io: io!, + otherInputs: otherInputs!, + roleId: roleId!, + token: token!)); + } + }); + on((event, emit) async { + emit(PassCheckLoadingState()); + try { + final bool success = await PassCheckServices.instance.performPostLogs( + passerId: event.passerId, + chekerId: event.checkerId, + temp: event.temp, + destination: event.destination, + io: event.io, + stationId: event.stationId, + cpId: event.cpId, + otherInputs: event.otherInputs, + roleid: event.roleId); + if (success) { + Fluttertoast.showToast( + msg: "SUCCESSFULLY SAVED", + fontSize: 24, + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + backgroundColor: Colors.black, + textColor: Colors.white); + emit(ScanSuccess(token: token!)); + } else { + Fluttertoast.showToast( + msg: "SCAN FAILED", + fontSize: 24, + toastLength: Toast.LENGTH_SHORT, + gravity: ToastGravity.CENTER, + backgroundColor: Colors.black, + textColor: Colors.white); + emit(ScanFailed(token: token!)); + } + } catch (e) { + emit(PassCheckErrorState(message: e.toString())); + } + }); + } +} diff --git a/lib/bloc/role/pass_check/pass_check_event.dart b/lib/bloc/role/pass_check/pass_check_event.dart new file mode 100644 index 0000000..0cfe95b --- /dev/null +++ b/lib/bloc/role/pass_check/pass_check_event.dart @@ -0,0 +1,70 @@ +part of 'pass_check_bloc.dart'; + +abstract class PassCheckEvent extends Equatable { + const PassCheckEvent(); + + @override + List get props => []; +} + +class GetPassCheckAreas extends PassCheckEvent { + final int roleId; + final int userId; + const GetPassCheckAreas({required this.roleId, required this.userId}); +} + +class SetScannerSettings extends PassCheckEvent { + final int roleId; + final String token; + final dynamic assignedArea; + final bool includeOtherInputs; + final String entranceExit; + final int checkerId; + const SetScannerSettings( + {required this.assignedArea, + required this.checkerId, + required this.entranceExit, + required this.includeOtherInputs, + required this.roleId, + required this.token}); +} + +class ScanQr extends PassCheckEvent { + final String token; + + const ScanQr({required this.token}); +} + +class PerformPostLogs extends PassCheckEvent { + final String passerId; + final int checkerId; + final String io; + final bool otherInputs; + final String? cpId; + final int? stationId; + final String? destination; + final double? temp; + final int roleId; + const PerformPostLogs( + {required this.checkerId, + required this.cpId, + required this.destination, + required this.io, + required this.otherInputs, + required this.passerId, + required this.roleId, + required this.stationId, + required this.temp}); +} + +class PerformIncomingPostLog extends PassCheckEvent{ + final double temp; + const PerformIncomingPostLog({required this.temp}); +} +class PerformOutgoingPostLog extends PassCheckEvent{ + final String destination; + const PerformOutgoingPostLog({required this.destination}); +} +class ScanError extends PassCheckEvent{ + +} \ No newline at end of file diff --git a/lib/bloc/role/pass_check/pass_check_state.dart b/lib/bloc/role/pass_check/pass_check_state.dart new file mode 100644 index 0000000..fe93067 --- /dev/null +++ b/lib/bloc/role/pass_check/pass_check_state.dart @@ -0,0 +1,67 @@ +part of 'pass_check_bloc.dart'; + +abstract class PassCheckState extends Equatable { + const PassCheckState(); + + @override + List get props => []; +} + +class PassCheckInitial extends PassCheckState {} + +class PassCheckErrorState extends PassCheckState { + final String message; + const PassCheckErrorState({required this.message}); +} + +class QRInvalid extends PassCheckState{ + final String token; + const QRInvalid({required this.token}); +} + +class PassCheckLoadingState extends PassCheckState {} + +class AssignAreaLoaded extends PassCheckState { + final List assignedArea; + final int roleId; + const AssignAreaLoaded({required this.assignedArea, required this.roleId}); +} + +class SettingSaved extends PassCheckState { + final dynamic assignedArea; + final String token; + final String io; + final int checker; + final bool otherInputs; + final int roleId; + const SettingSaved( + {required this.assignedArea, + required this.checker, + required this.io, + required this.otherInputs, + required this.roleId, + required this.token}); +} + +class IncomingScanState extends PassCheckState { + +} + +class OutGoingScanState extends PassCheckState { + +} + +class ScanSuccess extends PassCheckState{ + final String token; +const ScanSuccess({required this.token}); +} + +class ScanFailed extends PassCheckState{ + final String token; +const ScanFailed({required this.token}); +} + +class QRCodeInvalid extends PassCheckState{ + final String token; + const QRCodeInvalid({required this.token}); +} diff --git a/lib/bloc/user/user_bloc.dart b/lib/bloc/user/user_bloc.dart index 801930b..9fb227e 100644 --- a/lib/bloc/user/user_bloc.dart +++ b/lib/bloc/user/user_bloc.dart @@ -85,6 +85,8 @@ class UserBloc extends Bloc { emit(InternetTimeout(message: timeoutError)); } on SocketException catch (_) { emit(InternetTimeout(message: timeoutError)); + }on Error catch(e){ +emit(LoginErrorState(message: e.toString())); } }); on((event, emit) async { @@ -110,8 +112,8 @@ class UserBloc extends Bloc { emit(InternetTimeout(message: timeoutError)); } on SocketException catch (_) { emit(InternetTimeout(message: timeoutError)); - } on Error catch (_) { - emit(InvalidCredentials(message: "Invalid username or password")); + } on Error catch(e){ +emit(LoginErrorState(message: e.toString())); } }); on((event, emit) { diff --git a/lib/bloc/user/user_state.dart b/lib/bloc/user/user_state.dart index ab21f7f..3bb0873 100644 --- a/lib/bloc/user/user_state.dart +++ b/lib/bloc/user/user_state.dart @@ -66,3 +66,7 @@ class InvalidCredentials extends UserState{ final String message ; InvalidCredentials ({required this.message}); } +class LoginErrorState extends UserState{ + final String message; + LoginErrorState({required this.message}); +} diff --git a/lib/model/roles/pass_check/agency_area_type.dart b/lib/model/roles/pass_check/agency_area_type.dart new file mode 100644 index 0000000..260a7c9 --- /dev/null +++ b/lib/model/roles/pass_check/agency_area_type.dart @@ -0,0 +1,96 @@ + +class AgencyAssignedArea { + final bool? isactive; + final Area? area; + + AgencyAssignedArea({ + required this.isactive, + required this.area, + }); + + factory AgencyAssignedArea.fromJson(Map json) => AgencyAssignedArea( + isactive: json["isactive"], + area: json["area"] == null? null:Area.fromJson(json["area"]), + ); + + Map toJson() => { + "isactive": isactive, + "area": area?.toJson(), + }; +} + +class Area { + final int? id; + final String? name; + final Category? category; + final bool? privateEntity; + final String? contactInfo; + + Area({ + required this.id, + required this.name, + required this.category, + required this.privateEntity, + required this.contactInfo, + }); + + factory Area.fromJson(Map json) => Area( + id: json["id"], + name: json["name"], + category: json["category"]==null?null:Category.fromJson(json["category"]), + privateEntity: json["private_entity"], + contactInfo: json["contact_info"], + ); + + Map toJson() => { + "id": id, + "name": name, + "category": category?.toJson(), + "private_entity": privateEntity, + "contact_info": contactInfo, + }; +} + +class Category { + final int? id; + final IndustryClass? industryClass; + + Category({ + required this.id, + required this.industryClass, + }); + + factory Category.fromJson(Map json) => Category( + id: json["id"], + industryClass: json["industry_class"] == null?null:IndustryClass.fromJson(json["industry_class"]), + ); + + Map toJson() => { + "id": id, + "industry_class": industryClass?.toJson(), + }; +} + +class IndustryClass { + final int? id; + final String? name; + final String? description; + + IndustryClass({ + required this.id, + required this.name, + required this.description, + }); + + factory IndustryClass.fromJson(Map json) => IndustryClass( + id: json["id"], + name: json["name"], + description: json["description"], + ); + + Map toJson() => { + "id": id, + "name": name, + "description": description, + }; +} diff --git a/lib/model/roles/pass_check/assign_role_area_type.dart b/lib/model/roles/pass_check/assign_role_area_type.dart new file mode 100644 index 0000000..3b2df3e --- /dev/null +++ b/lib/model/roles/pass_check/assign_role_area_type.dart @@ -0,0 +1,52 @@ +// To parse this JSON data, do +// +// final assignRoleAreaType = assignRoleAreaTypeFromJson(jsonString); + + +class AssignRoleAreaType { + final String areaTypeName; + final Details details; + + AssignRoleAreaType({ + required this.areaTypeName, + required this.details, + }); + + factory AssignRoleAreaType.fromJson(Map json) => AssignRoleAreaType( + areaTypeName: json["area_type_name"], + details: Details.fromJson(json["details"]), + ); + + Map toJson() => { + "area_type_name": areaTypeName, + "details": details.toJson(), + }; +} + +class Details { + final String? table; + final String? schema; + final String? dataType; + final String? idColumn; + + Details({ + required this.table, + required this.schema, + required this.dataType, + required this.idColumn, + }); + + factory Details.fromJson(Map json) => Details( + table: json["table"], + schema: json["schema"], + dataType: json["data_type"], + idColumn: json["id_column"], + ); + + Map toJson() => { + "table": table, + "schema": schema, + "data_type": dataType, + "id_column": idColumn, + }; +} diff --git a/lib/model/roles/pass_check/barangay_assign_area.dart b/lib/model/roles/pass_check/barangay_assign_area.dart new file mode 100644 index 0000000..f86ddd5 --- /dev/null +++ b/lib/model/roles/pass_check/barangay_assign_area.dart @@ -0,0 +1,24 @@ + +class BaragayAssignArea { + final String? brgycode; + final String? brgydesc; + final String? citymuncode; + + BaragayAssignArea({ + required this.brgycode, + required this.brgydesc, + required this.citymuncode, + }); + + factory BaragayAssignArea.fromJson(Map json) => BaragayAssignArea( + brgycode: json["brgycode"], + brgydesc: json["brgydesc"], + citymuncode: json["citymuncode"], + ); + + Map toJson() => { + "brgycode": brgycode, + "brgydesc": brgydesc, + "citymuncode": citymuncode, + }; +} diff --git a/lib/model/roles/pass_check/passer_info.dart b/lib/model/roles/pass_check/passer_info.dart new file mode 100644 index 0000000..b841783 --- /dev/null +++ b/lib/model/roles/pass_check/passer_info.dart @@ -0,0 +1,120 @@ + +class PasserInfo { + final int personid; + final String familyname; + final String givenname; + final String? middlename; + final String sex; + final DateTime? birthdate; + final String? extension; + final String? civilstatus; + final double? heightM; + final double weightKg; + final String? bloodtype; + final String? photoPath; + final String? uuid; + final String? encryptionKey; + final bool? deceased; + final dynamic encryptedProfile; + final String? addedby; + final DateTime? addedat; + final String? updateby; + final DateTime? updatedat; + final String? deletedby; + final DateTime? deletedat; + final String? encryptSignature; + final String? esigPath; + final String? titlePrefix; + final String? titleSuffix; + final bool? showTitleId; + + PasserInfo({ + required this.personid, + required this.familyname, + required this.givenname, + required this.middlename, + required this.sex, + required this.birthdate, + required this.extension, + required this.civilstatus, + required this.heightM, + required this.weightKg, + required this.bloodtype, + required this.photoPath, + required this.uuid, + required this.encryptionKey, + required this.deceased, + required this.encryptedProfile, + required this.addedby, + required this.addedat, + required this.updateby, + required this.updatedat, + required this.deletedby, + required this.deletedat, + required this.encryptSignature, + required this.esigPath, + required this.titlePrefix, + required this.titleSuffix, + required this.showTitleId, + }); + + factory PasserInfo.fromJson(Map json) => PasserInfo( + personid: json["personid"], + familyname: json["familyname"], + givenname: json["givenname"], + middlename: json["middlename"], + sex: json["sex"], + birthdate: json['birthdate'] == null?null: DateTime.parse(json["birthdate"]), + extension: json["extension"], + civilstatus: json["civilstatus"], + heightM: json["height_m"]?.toDouble(), + weightKg: json["weight_kg"]?.toDouble(), + bloodtype: json["bloodtype"], + photoPath: json["photo_path"], + uuid: json["uuid"], + encryptionKey: json["encryption_key"], + deceased: json["deceased"], + encryptedProfile: json["encrypted_profile"], + addedby: json["addedby"], + addedat: json["addedat"] == null? null:DateTime.tryParse(json["addedat"]), + updateby:json["updateby"], + updatedat:json["updatedat"]==null?null: DateTime.tryParse(json["updatedat"]), + deletedby: json["deletedby"], + deletedat: json['deletedat'] == null?null:DateTime.tryParse(json["deletedat"]), + encryptSignature: json["encrypt_signature"], + esigPath: json["esig_path"], + titlePrefix: json["title_prefix"], + titleSuffix: json["title_suffix"], + showTitleId: json["show_title_id"], + ); + + Map toJson() => { + "personid": personid, + "familyname": familyname, + "givenname": givenname, + "middlename": middlename, + "sex": sex, + "birthdate": "${birthdate?.year.toString().padLeft(4, '0')}-${birthdate?.month.toString().padLeft(2, '0')}-${birthdate?.day.toString().padLeft(2, '0')}", + "extension": extension, + "civilstatus": civilstatus, + "height_m": heightM, + "weight_kg": weightKg, + "bloodtype": bloodtype, + "photo_path": photoPath, + "uuid": uuid, + "encryption_key": encryptionKey, + "deceased": deceased, + "encrypted_profile": encryptedProfile, + "addedby": addedby, + "addedat": addedat?.toIso8601String(), + "updateby": updateby, + "updatedat": updatedat?.toIso8601String(), + "deletedby": deletedby, + "deletedat": deletedat, + "encrypt_signature": encryptSignature, + "esig_path": esigPath, + "title_prefix": titlePrefix, + "title_suffix": titleSuffix, + "show_title_id": showTitleId, + }; +} diff --git a/lib/model/roles/pass_check/purok_assign_area.dart b/lib/model/roles/pass_check/purok_assign_area.dart new file mode 100644 index 0000000..883086f --- /dev/null +++ b/lib/model/roles/pass_check/purok_assign_area.dart @@ -0,0 +1,42 @@ + + +import 'barangay_assign_area.dart'; + +class Purok { + final String? purokid; + final String? purokdesc; + final BaragayAssignArea? brgy; + final dynamic purokLeader; + final bool? writelock; + final dynamic recordsignature; + + Purok({ + required this.purokid, + required this.purokdesc, + required this.brgy, + required this.purokLeader, + required this.writelock, + required this.recordsignature, + }); + + factory Purok.fromJson(Map json) => Purok( + purokid: json["purokid"], + purokdesc: json["purokdesc"], + brgy: json["brgy"]==null?null:BaragayAssignArea.fromJson(json["brgy"]), + purokLeader: json["purok_leader"], + writelock: json["writelock"], + recordsignature: json["recordsignature"], + ); + + Map toJson() => { + "purokid": purokid, + "purokdesc": purokdesc, + "brgy": brgy?.toJson(), + "purok_leader": purokLeader, + "writelock": writelock, + "recordsignature": recordsignature, + }; +} + + + diff --git a/lib/model/roles/pass_check/station_assign_area.dart b/lib/model/roles/pass_check/station_assign_area.dart new file mode 100644 index 0000000..4251403 --- /dev/null +++ b/lib/model/roles/pass_check/station_assign_area.dart @@ -0,0 +1,182 @@ +// To parse this JSON data, do +// +// final assignArea = assignAreaFromJson(jsonString); + +class StationAssignArea { + final bool? isactive; + final Area? area; + + StationAssignArea({ + required this.isactive, + required this.area, + }); + + factory StationAssignArea.fromJson(Map json) => StationAssignArea( + isactive: json["isactive"], + area: json["area"] == null?null: Area.fromJson(json["area"]), + ); + + Map toJson() => { + "isactive": isactive, + "area": area?.toJson(), + }; +} + +class Area { + final int? id; + final String? stationName; + final StationType? stationType; + final int? hierarchyOrderNo; + final String? headPosition; + final GovernmentAgency? governmentAgency; + final String? acronym; + final int? parentStation; + final String? code; + final String? fullcode; + final List? childStationInfo; + final bool? islocationUnderParent; + final int? mainParentStation; + final String? description; + final bool? ishospital; + final bool? isactive; + final bool? sellingStation; + + Area({ + required this.id, + required this.stationName, + required this.stationType, + required this.hierarchyOrderNo, + required this.headPosition, + required this.governmentAgency, + required this.acronym, + required this.parentStation, + required this.code, + required this.fullcode, + required this.childStationInfo, + required this.islocationUnderParent, + required this.mainParentStation, + required this.description, + required this.ishospital, + required this.isactive, + required this.sellingStation, + }); + + factory Area.fromJson(Map json) => Area( + id: json["id"], + stationName: json["station_name"], + stationType:json["station_type"] ==null?null: StationType.fromJson(json["station_type"]), + hierarchyOrderNo: json["hierarchy_order_no"], + headPosition: json["head_position"], + governmentAgency: json["government_agency"] == null?null:GovernmentAgency.fromJson(json["government_agency"]), + acronym: json["acronym"], + parentStation: json["parent_station"], + code: json["code"], + fullcode: json["fullcode"], + childStationInfo: json['child_station_info']==null?[]:List.from(json["child_station_info"].map((x) => ChildStationInfo.fromJson(x))), + islocationUnderParent: json["islocation_under_parent"], + mainParentStation: json["main_parent_station"], + description: json["description"], + ishospital: json["ishospital"], + isactive: json["isactive"], + sellingStation: json["selling_station"], + ); + + Map toJson() => { + "id": id, + "station_name": stationName, + "station_type": stationType?.toJson(), + "hierarchy_order_no": hierarchyOrderNo, + "head_position": headPosition, + "government_agency": governmentAgency?.toJson(), + "acronym": acronym, + "parent_station": parentStation, + "code": code, + "fullcode": fullcode, + "child_station_info": List.from(childStationInfo!.map((x) => x.toJson())), + "islocation_under_parent": islocationUnderParent, + "main_parent_station": mainParentStation, + "description": description, + "ishospital": ishospital, + "isactive": isactive, + "selling_station": sellingStation, + }; +} + +class ChildStationInfo { + final int? id; + final String? stationName; + final String? acroym; + bool? motherStation; + + ChildStationInfo({ + required this.id, + required this.stationName, + required this.acroym, + this.motherStation + }); + + factory ChildStationInfo.fromJson(Map json) => ChildStationInfo( + id: json["id"], + stationName: json["station_name"], + acroym: json["acroym"], + + ); + + Map toJson() => { + "id": id, + "station_name": stationName, + "acroym": acroym, + }; +} + +class GovernmentAgency { + final int? agencyid; + final String? agencyname; + final int? agencycatid; + final bool? privateEntity; + final int? contactinfoid; + + GovernmentAgency({ + required this.agencyid, + required this.agencyname, + required this.agencycatid, + required this.privateEntity, + required this.contactinfoid, + }); + + factory GovernmentAgency.fromJson(Map json) => GovernmentAgency( + agencyid: json["agencyid"], + agencyname: json["agencyname"], + agencycatid: json["agencycatid"], + privateEntity: json["private_entity"], + contactinfoid: json["contactinfoid"], + ); + + Map toJson() => { + "agencyid": agencyid, + "agencyname": agencyname, + "agencycatid": agencycatid, + "private_entity": privateEntity, + "contactinfoid": contactinfoid, + }; +} + +class StationType { + final int? id; + final String? typeName; + + StationType({ + required this.id, + required this.typeName, + }); + + factory StationType.fromJson(Map json) => StationType( + id: json["id"], + typeName: json["type_name"], + ); + + Map toJson() => { + "id": id, + "type_name": typeName, + }; +} diff --git a/lib/screens/profile/components/basic_information/address/edit_modal.dart b/lib/screens/profile/components/basic_information/address/edit_modal.dart index 29b3325..83901b5 100644 --- a/lib/screens/profile/components/basic_information/address/edit_modal.dart +++ b/lib/screens/profile/components/basic_information/address/edit_modal.dart @@ -8,6 +8,7 @@ import 'package:unit2/bloc/profile/primary_information/address/address_bloc.dart import 'package:unit2/model/location/address_category.dart'; import 'package:unit2/model/profile/basic_information/adress.dart'; import 'package:unit2/utils/global.dart'; +import 'package:unit2/utils/global_context.dart'; import '../../../../../model/location/barangay.dart'; import '../../../../../model/location/city.dart'; import '../../../../../model/location/country.dart'; @@ -281,12 +282,16 @@ class _EditAddressScreenState extends State { }); selectedRegion = region; //// GET PROVINCES + try{ provinces = await LocationUtils .instance .getProvinces( regionCode: selectedRegion!.code .toString()); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedProvince = provinces![0]; setState(() { @@ -294,11 +299,15 @@ class _EditAddressScreenState extends State { cityCall = true; }); //// GET CITIES + try{ citymuns = await LocationUtils .instance .getCities( code: selectedProvince! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedMunicipality = citymuns![0]; setState(() { @@ -306,23 +315,31 @@ class _EditAddressScreenState extends State { barangayCall = true; }); //// GET BARANGAY + try{ barangays = await LocationUtils .instance .getBarangay( code: selectedMunicipality! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedBarangay = barangays![0]; setState(() { barangayCall = false; }); ////GET CITY MUNICIPALITY + try{ citymuns = await LocationUtils .instance .getCities( code: selectedProvince! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedMunicipality = citymuns![0]; setState(() { @@ -330,12 +347,16 @@ class _EditAddressScreenState extends State { barangayCall = true; }); //// GET BARANGAYS + try{ barangays = await LocationUtils .instance .getBarangay( code: selectedMunicipality! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedBarangay = barangays![0]; setState(() { @@ -385,12 +406,16 @@ class _EditAddressScreenState extends State { }); //// GET CITIES + try{ citymuns = await LocationUtils .instance .getCities( code: selectedProvince! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedMunicipality = citymuns![0]; setState(() { @@ -398,12 +423,16 @@ class _EditAddressScreenState extends State { barangayCall = true; }); //// GET BARANGAY + try{ barangays = await LocationUtils .instance .getBarangay( code: selectedMunicipality! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedBarangay = barangays![0]; setState(() { @@ -453,12 +482,16 @@ class _EditAddressScreenState extends State { selectedMunicipality = city; selectedMunicipality = city; //// GET BARANGAYS + try{ barangays = await LocationUtils .instance .getBarangay( code: selectedMunicipality! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedBarangay = barangays![0]; setState(() { diff --git a/lib/screens/profile/components/basic_information/contact_information_screen.dart b/lib/screens/profile/components/basic_information/contact_information_screen.dart index 4f4e8bd..3e0f4d2 100644 --- a/lib/screens/profile/components/basic_information/contact_information_screen.dart +++ b/lib/screens/profile/components/basic_information/contact_information_screen.dart @@ -90,7 +90,7 @@ class ContactInformationScreen extends StatelessWidget { .add(LoadContacts()); }); } else { - errorAlert(context, "Update Failed", + errorAlert(context, "Adding Failed", "Something went wrong. Please try again.", () { Navigator.of(context).pop(); @@ -331,7 +331,7 @@ class ContactInformationScreen extends StatelessWidget { ); }); } else { - const EmptyData( + return const EmptyData( message: "You don't have contact information added. Please click + to add"); } diff --git a/lib/screens/profile/components/basic_information/edit_basic_info_modal.dart b/lib/screens/profile/components/basic_information/edit_basic_info_modal.dart index 6d33c67..253ea7d 100644 --- a/lib/screens/profile/components/basic_information/edit_basic_info_modal.dart +++ b/lib/screens/profile/components/basic_information/edit_basic_info_modal.dart @@ -157,7 +157,7 @@ class _EditBasicProfileInfoScreenState UpperCaseTextFormatter() ], name: "middlename", - initialValue: state.primaryInformation.middleName!, + initialValue: state.primaryInformation.middleName??'', decoration: normalTextFieldStyle("Middle name", ""), ), ), diff --git a/lib/screens/profile/components/basic_information/family/spouse_edit_modal.dart b/lib/screens/profile/components/basic_information/family/spouse_edit_modal.dart index 30012e4..df5e3d3 100644 --- a/lib/screens/profile/components/basic_information/family/spouse_edit_modal.dart +++ b/lib/screens/profile/components/basic_information/family/spouse_edit_modal.dart @@ -1,10 +1,8 @@ import 'package:date_time_picker/date_time_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; -import 'package:fluttericon/font_awesome_icons.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:searchfield/searchfield.dart'; - import '../../../../../bloc/profile/family/family_bloc.dart'; import '../../../../../model/profile/family_backround.dart'; import '../../../../../model/utils/agency.dart'; @@ -17,7 +15,6 @@ import '../../../../../theme-data.dart/form-style.dart'; import '../../../../../utils/formatters.dart'; import '../../../../../utils/global.dart'; import '../../../../../utils/text_container.dart'; -import '../../../../../utils/validators.dart'; import '../../../shared/add_for_empty_search.dart'; class SpouseEditAlert extends StatefulWidget { diff --git a/lib/screens/profile/components/basic_information/identification/edit_modal.dart b/lib/screens/profile/components/basic_information/identification/edit_modal.dart index eb6a8c9..626458a 100644 --- a/lib/screens/profile/components/basic_information/identification/edit_modal.dart +++ b/lib/screens/profile/components/basic_information/identification/edit_modal.dart @@ -146,17 +146,17 @@ class _EditIdentificationScreenState extends State { }); }, selectableDayPredicate: (date) { - if (expDate != null && - DateTime.parse(expDate!) + if ((expDate != "null" && expDate != null) && + DateTime.tryParse(expDate!)! .microsecondsSinceEpoch <= date.microsecondsSinceEpoch) { return false; } return true; }, - initialDate: expDate != null + initialDate: expDate == "null" || expDate == null ? DateTime.now() - : DateTime.parse(expDate!).subtract( + : DateTime.tryParse(expDate!)?.subtract( const Duration(days: 1)), )), @@ -187,17 +187,17 @@ class _EditIdentificationScreenState extends State { color: Colors.black87, )), selectableDayPredicate: (date) { - if (issuedDate != null && - DateTime.parse(issuedDate!) + if ((issuedDate != "null" && issuedDate != null) && + DateTime.tryParse(issuedDate!)! .microsecondsSinceEpoch >= date.microsecondsSinceEpoch) { return false; } return true; }, - initialDate: issuedDate != null + initialDate: issuedDate == null && issuedDate == "null" ? DateTime.now() - : DateTime.parse(issuedDate!).add( + : DateTime.tryParse(issuedDate!)?.add( const Duration(days: 1)), )), ], @@ -259,6 +259,14 @@ class _EditIdentificationScreenState extends State { selectedRegion! .code .toString()); + } catch (e) { + context + .read< + IdentificationBloc>() + .add(ShowErrorState( + message: + e.toString())); + } selectedProvince = provinces![0]; setState(() { @@ -287,14 +295,7 @@ class _EditIdentificationScreenState extends State { message: e .toString())); } - } catch (e) { - context - .read< - IdentificationBloc>() - .add(ShowErrorState( - message: - e.toString())); - } + } }, value: selectedRegion, diff --git a/lib/screens/profile/components/basic_information/identification_information_screen.dart b/lib/screens/profile/components/basic_information/identification_information_screen.dart index cd9836e..315189a 100644 --- a/lib/screens/profile/components/basic_information/identification_information_screen.dart +++ b/lib/screens/profile/components/basic_information/identification_information_screen.dart @@ -219,7 +219,7 @@ class IdentificationsScreen extends StatelessWidget { const SizedBox(height: 8,), Badge( backgroundColor: - success2, + government != true?success2:second, label: Text( government == true ? privateText diff --git a/lib/screens/profile/components/basic_information/primary_information_screen.dart b/lib/screens/profile/components/basic_information/primary_information_screen.dart index 875ca64..f574e08 100644 --- a/lib/screens/profile/components/basic_information/primary_information_screen.dart +++ b/lib/screens/profile/components/basic_information/primary_information_screen.dart @@ -1,15 +1,12 @@ -import 'package:date_time_picker/date_time_picker.dart'; + import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:intl/intl.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; -import 'package:unit2/model/profile/basic_information/primary-information.dart'; import 'package:unit2/screens/profile/components/basic_information/edit_basic_info_modal.dart'; -import 'package:unit2/theme-data.dart/btn-style.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/theme-data.dart/form-style.dart'; import 'package:unit2/utils/global.dart'; @@ -132,8 +129,8 @@ class _PrimaryInfoState extends State { child: FormBuilderTextField( enabled: enabled, name: middlename, - initialValue: - state.primaryBasicInformation.middleName!, + initialValue: state.primaryBasicInformation.middleName??'' + , decoration: normalTextFieldStyle("Middle name", ""), ), diff --git a/lib/screens/profile/components/eligibility/edit_modal.dart b/lib/screens/profile/components/eligibility/edit_modal.dart index ca4dadc..d161084 100644 --- a/lib/screens/profile/components/eligibility/edit_modal.dart +++ b/lib/screens/profile/components/eligibility/edit_modal.dart @@ -9,6 +9,7 @@ import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; import 'package:unit2/model/location/city.dart'; import 'package:unit2/model/profile/eligibility.dart'; import 'package:unit2/model/utils/eligibility.dart'; +import 'package:unit2/utils/global_context.dart'; import 'package:unit2/utils/location_utilities.dart'; import '../../../../bloc/profile/eligibility/eligibility_bloc.dart'; import '../../../../model/location/country.dart'; @@ -315,22 +316,30 @@ class _EditEligibilityScreenState extends State { provinceCall = true; }); selectedRegion = region; + try{ provinces = await LocationUtils .instance .getProvinces( regionCode: selectedRegion!.code .toString()); + }catch(e){ + context.read().add(CallErrorState()); + } selectedProvince = provinces![0]; setState(() { provinceCall = false; cityCall = true; }); + try{ citymuns = await LocationUtils .instance .getCities( code: selectedProvince! .code!); + }catch(e){ + NavigationService.navigatorKey.currentContext?.read().add(CallErrorState()); + } selectedMunicipality = citymuns![0]; setState(() { @@ -376,6 +385,9 @@ class _EditEligibilityScreenState extends State { cityCall = true; }); selectedProvince = province; + try{ + + citymuns = await LocationUtils .instance .getCities( @@ -383,6 +395,9 @@ class _EditEligibilityScreenState extends State { selectedProvince! .code .toString()); + }catch(e){ + context.read().add(CallErrorState()); + } selectedMunicipality = citymuns![0]; setState(() { diff --git a/lib/screens/profile/components/family_background_screen.dart b/lib/screens/profile/components/family_background_screen.dart index c0c6368..e680896 100644 --- a/lib/screens/profile/components/family_background_screen.dart +++ b/lib/screens/profile/components/family_background_screen.dart @@ -328,7 +328,7 @@ class _FamilyBackgroundScreenState extends State { vertical: -4), title: Text( - "${father?.relatedPerson?.firstName} ${father?.relatedPerson?.middleName??''} ${father?.relatedPerson!.lastName} ${father?.relatedPerson?.nameExtension ?? ''}", + "${father?.relatedPerson?.firstName} ${father?.relatedPerson?.middleName ?? ''} ${father?.relatedPerson!.lastName} ${father?.relatedPerson?.nameExtension ?? ''}", style: Theme.of( context) .textTheme @@ -612,7 +612,7 @@ class _FamilyBackgroundScreenState extends State { vertical: -4), title: Text( - "${mother?.relatedPerson?.firstName} ${mother?.relatedPerson?.middleName??''} ${mother?.relatedPerson?.lastName} ${mother?.relatedPerson?.nameExtension ?? ''}", + "${mother?.relatedPerson?.firstName} ${mother?.relatedPerson?.middleName ?? ''} ${mother?.relatedPerson?.lastName} ${mother?.relatedPerson?.nameExtension ?? ''}", style: Theme.of( context) .textTheme @@ -860,25 +860,38 @@ class _FamilyBackgroundScreenState extends State { context); progress!.showWithText( "Loading..."); - if (positions.isEmpty) { - positions = - await ProfileUtilities - .instance - .getAgencyPosition(); - } + try { + if (positions + .isEmpty) { + positions = + await ProfileUtilities + .instance + .getAgencyPosition(); + } - if (agencices.isEmpty) { - agencices = - await ProfileUtilities - .instance - .getAgecies(); - } - if (categories - .isEmpty) { - categories = - await ProfileUtilities - .instance - .agencyCategory(); + if (agencices + .isEmpty) { + agencices = + await ProfileUtilities + .instance + .getAgecies(); + } + if (categories + .isEmpty) { + categories = + await ProfileUtilities + .instance + .agencyCategory(); + } + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + FamilyBloc>() + .add(CallErrorState( + message: e + .toString())); } progress.dismiss(); showDialog( @@ -938,7 +951,7 @@ class _FamilyBackgroundScreenState extends State { vertical: -4), title: Text( - "${spouse?.relatedPerson?.firstName} ${spouse?.relatedPerson?.middleName??''} ${spouse?.relatedPerson!.lastName} ${spouse?.relatedPerson?.nameExtension ?? ''}", + "${spouse?.relatedPerson?.firstName} ${spouse?.relatedPerson?.middleName ?? ''} ${spouse?.relatedPerson!.lastName} ${spouse?.relatedPerson?.nameExtension ?? ''}", style: Theme.of( context) .textTheme @@ -1356,7 +1369,7 @@ class _FamilyBackgroundScreenState extends State { horizontal: -4, vertical: -4), title: Text( - "${child.relatedPerson?.firstName} ${child.relatedPerson?.middleName??''} ${child.relatedPerson?.lastName} ${child.relatedPerson?.nameExtension ?? ''}", + "${child.relatedPerson?.firstName} ${child.relatedPerson?.middleName ?? ''} ${child.relatedPerson?.lastName} ${child.relatedPerson?.nameExtension ?? ''}", style: Theme.of(context).textTheme.titleMedium!.copyWith(fontWeight: FontWeight.w500)), subtitle: const Text("fullname"), @@ -1859,9 +1872,15 @@ class _FamilyBackgroundScreenState extends State { ), ), ]); - }if(state is FamilyErrorState){ - return SomethingWentWrong(message: state.message, onpressed: (){context.read().add(GetFamilies(profileId: profileId!, token: token!));}); - } + } + if (state is FamilyErrorState) { + return SomethingWentWrong( + message: state.message, + onpressed: () { + context.read().add(GetFamilies( + profileId: profileId!, token: token!)); + }); + } return Container(); }, ); diff --git a/lib/screens/profile/components/learning_and_development_screen.dart b/lib/screens/profile/components/learning_and_development_screen.dart index 1ca5d34..fc8df3b 100644 --- a/lib/screens/profile/components/learning_and_development_screen.dart +++ b/lib/screens/profile/components/learning_and_development_screen.dart @@ -35,19 +35,39 @@ class LearningAndDevelopmentScreen extends StatelessWidget { DateFormat dteFormat2 = DateFormat.yMMMMd('en_US'); return Scaffold( appBar: AppBar( - title: context.watch().state is LearningDevelopmentAddingState? const FittedBox(child: Text("Add $learningAndDevelopmentScreenTitle")):context.watch().state is LearningDevelopmentUpdatingState?const FittedBox(child: Text("Edit $learningAndDevelopmentScreenTitle")):const FittedBox(child: Text(learningAndDevelopmentScreenTitle)), - centerTitle: true, - backgroundColor: primary, - actions: (context.watch().state is LearningDevelopmentLoadedState)?[ - AddLeading(onPressed: () { - context.read().add(ShowAddLearningDevelopmentForm()); - }) - ]:(context.watch().state is LearningDevelopmentAddingState || context.watch().state is LearningDevelopmentUpdatingState)?[ - CloseLeading(onPressed:() { - context.read().add(LoadLearniningDevelopment()); - }) - ]:[] - ), + title: context.watch().state + is LearningDevelopmentAddingState + ? const FittedBox( + child: Text("Add $learningAndDevelopmentScreenTitle")) + : context.watch().state + is LearningDevelopmentUpdatingState + ? const FittedBox( + child: Text("Edit $learningAndDevelopmentScreenTitle")) + : const FittedBox( + child: Text(learningAndDevelopmentScreenTitle)), + centerTitle: true, + backgroundColor: primary, + actions: (context.watch().state + is LearningDevelopmentLoadedState) + ? [ + AddLeading(onPressed: () { + context + .read() + .add(ShowAddLearningDevelopmentForm()); + }) + ] + : (context.watch().state + is LearningDevelopmentAddingState || + context.watch().state + is LearningDevelopmentUpdatingState) + ? [ + CloseLeading(onPressed: () { + context + .read() + .add(LoadLearniningDevelopment()); + }) + ] + : []), body: ProgressHUD( padding: const EdgeInsets.all(24), indicatorWidget: const SpinKitFadingCircle( @@ -56,11 +76,13 @@ class LearningAndDevelopmentScreen extends StatelessWidget { backgroundColor: Colors.black87, child: BlocBuilder( builder: (context, state) { + if (state is UserLoggedIn) { token = state.userData!.user!.login!.token!; profileId = state.userData!.user!.login!.user!.profileId!; return BlocBuilder( builder: (context, state) { + if (state is ProfileLoaded) { return BlocConsumer( @@ -73,7 +95,8 @@ class LearningAndDevelopmentScreen extends StatelessWidget { state is LearningDevelopmentErrorState || state is LearningDevelopmentAddingState || state is LearningDevelopmentAddedState || - state is LearningDevelopmentUpdatingState) { + state is LearningDevelopmentUpdatingState || + state is LearningDevelopmentUpdatedState) { final progress = ProgressHUD.of(context); progress!.dismiss(); } @@ -99,7 +122,7 @@ class LearningAndDevelopmentScreen extends StatelessWidget { } } ////Updated State - if (state is LearningDevelopmentUpdatedState) { + if (state is LearningDevelopmentUpdatedState) { if (state.response['success']) { successAlert(context, "Update Successfull!", state.response['message'], () { @@ -123,7 +146,8 @@ class LearningAndDevelopmentScreen extends StatelessWidget { if (state is DeleteLearningDevelopmentState) { if (state.success) { successAlert(context, "Deletion Successfull!", - "Learning Development Has Been Deleted Successfully", () { + "Learning Development Has Been Deleted Successfully", + () { Navigator.of(context).pop(); context .read() @@ -143,7 +167,9 @@ class LearningAndDevelopmentScreen extends StatelessWidget { // TODO: implement listener }, builder: (context, state) { + print(state); if (state is LearningDevelopmentLoadedState) { + if (state.learningsAndDevelopment.isNotEmpty) { return ListView.builder( padding: const EdgeInsets.symmetric( @@ -200,9 +226,9 @@ class LearningAndDevelopmentScreen extends StatelessWidget { .copyWith( fontWeight: FontWeight - .w600,color: primary), + .w600, + color: primary), ), - const SizedBox( height: 8, ), @@ -296,7 +322,7 @@ class LearningAndDevelopmentScreen extends StatelessWidget { isOverseas)); } }, - menuItems: [ + menuItems: [ popMenuItem( text: "Update", value: 1, @@ -305,11 +331,10 @@ class LearningAndDevelopmentScreen extends StatelessWidget { text: "Remove", value: 2, icon: Icons.delete), - popMenuItem( + popMenuItem( text: "Attach", value: 2, icon: Icons.attach_file), - ], icon: const Icon( Icons.more_vert, @@ -334,7 +359,12 @@ class LearningAndDevelopmentScreen extends StatelessWidget { } if (state is LearningDevelopmentErrorState) { return (SomethingWentWrong( - message: state.message, onpressed: () {context.read().add(GetLearningDevelopments(profileId: profileId, token: token));})); + message: state.message, + onpressed: () { + context.read().add( + GetLearningDevelopments( + profileId: profileId, token: token)); + })); } if (state is LearningDevelopmentAddingState) { return AddLearningAndDevelopmentScreen( diff --git a/lib/screens/profile/components/learning_development/add_modal.dart b/lib/screens/profile/components/learning_development/add_modal.dart index 14a945d..5a0e4f7 100644 --- a/lib/screens/profile/components/learning_development/add_modal.dart +++ b/lib/screens/profile/components/learning_development/add_modal.dart @@ -1,6 +1,5 @@ import 'package:date_time_picker/date_time_picker.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; diff --git a/lib/screens/profile/components/learning_development/edit_modal.dart b/lib/screens/profile/components/learning_development/edit_modal.dart index 7951297..ea5e04e 100644 --- a/lib/screens/profile/components/learning_development/edit_modal.dart +++ b/lib/screens/profile/components/learning_development/edit_modal.dart @@ -1,6 +1,5 @@ import 'package:date_time_picker/date_time_picker.dart'; import 'package:flutter/material.dart'; - import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; @@ -11,6 +10,7 @@ import 'package:searchfield/searchfield.dart'; import 'package:unit2/bloc/profile/learningDevelopment/learning_development_bloc.dart'; import 'package:unit2/model/profile/learning_development.dart'; import 'package:unit2/theme-data.dart/btn-style.dart'; +import 'package:unit2/utils/global_context.dart'; import 'package:unit2/utils/text_container.dart'; import 'package:unit2/utils/validators.dart'; import '../../../../model/location/barangay.dart'; @@ -379,7 +379,7 @@ class _EditLearningAndDevelopmentScreenState selectableDayPredicate: (date) { if (to != null && - to!.microsecondsSinceEpoch <= + to!.microsecondsSinceEpoch < date.microsecondsSinceEpoch) { return false; } @@ -388,14 +388,10 @@ class _EditLearningAndDevelopmentScreenState onChanged: (value) { setState(() { from = - DateTime.parse(value); + DateTime.tryParse(value); }); }, - initialDate: to == null - ? DateTime.now() - : to!.subtract( - const Duration( - days: 1)), + initialDate: to??=DateTime.now(), timeHintText: "Date of Examination/Conferment", decoration: @@ -442,7 +438,7 @@ class _EditLearningAndDevelopmentScreenState ), selectableDayPredicate: (date) { if (from != null && - from!.microsecondsSinceEpoch >= + from!.microsecondsSinceEpoch > date.microsecondsSinceEpoch) { return false; } @@ -450,13 +446,10 @@ class _EditLearningAndDevelopmentScreenState }, onChanged: (value) { setState(() { - to = DateTime.parse(value); + to = DateTime.tryParse(value); }); }, - initialDate: from == null - ? DateTime.now() - : from!.add(const Duration( - days: 1)), + initialDate: from??=DateTime.now() ), ), ], @@ -545,12 +538,21 @@ class _EditLearningAndDevelopmentScreenState selectedRegion = region; //// GET PROVINCES - provinces = await LocationUtils - .instance - .getProvinces( - regionCode: selectedRegion! - .code - .toString()); + try { + provinces = await LocationUtils + .instance + .getProvinces( + regionCode: selectedRegion! + .code + .toString()); + } catch (e) { + context + .read< + LearningDevelopmentBloc>() + .add(CallErrorState( + message: + e.toString())); + } selectedProvince = provinces![0]; setState(() { @@ -559,11 +561,22 @@ class _EditLearningAndDevelopmentScreenState cityCall = true; }); //// GET CITIES - citymuns = await LocationUtils - .instance - .getCities( - code: selectedProvince! - .code!); + try { + citymuns = await LocationUtils + .instance + .getCities( + code: selectedProvince! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + LearningDevelopmentBloc>() + .add(CallErrorState( + message: + e.toString())); + } selectedMunicipality = citymuns![0]; setState(() { @@ -573,11 +586,22 @@ class _EditLearningAndDevelopmentScreenState true; }); //// GET BARANGAY - barangays = await LocationUtils - .instance - .getBarangay( - code: selectedMunicipality! - .code!); + try { + barangays = await LocationUtils + .instance + .getBarangay( + code: selectedMunicipality! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + LearningDevelopmentBloc>() + .add(CallErrorState( + message: + e.toString())); + } selectedBarangay = barangays![0]; setState(() { @@ -585,11 +609,22 @@ class _EditLearningAndDevelopmentScreenState false; }); ////GET CITY MUNICIPALITY - citymuns = await LocationUtils - .instance - .getCities( - code: selectedProvince! - .code!); + try { + citymuns = await LocationUtils + .instance + .getCities( + code: selectedProvince! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + LearningDevelopmentBloc>() + .add(CallErrorState( + message: + e.toString())); + } selectedMunicipality = citymuns![0]; setState(() { @@ -599,11 +634,22 @@ class _EditLearningAndDevelopmentScreenState true; }); //// GET BARANGAYS - barangays = await LocationUtils - .instance - .getBarangay( - code: selectedMunicipality! - .code!); + try { + barangays = await LocationUtils + .instance + .getBarangay( + code: selectedMunicipality! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + LearningDevelopmentBloc>() + .add(CallErrorState( + message: + e.toString())); + } selectedBarangay = barangays![0]; setState(() { @@ -645,70 +691,79 @@ class _EditLearningAndDevelopmentScreenState .transparent, inAsyncCall: provinceCall, - child: DropdownButtonFormField< - Province?>( - autovalidateMode: - AutovalidateMode - .onUserInteraction, - validator: (value) => - value == null + child: + DropdownButtonFormField< + Province?>( + autovalidateMode: + AutovalidateMode + .onUserInteraction, + validator: (value) => value == null ? 'required' : null, - isExpanded: - true, - value: - selectedProvince, - onChanged: - (Province? - province) async { - if (selectedProvince != - province) { - selectedProvince = - province; - setState( - () { - cityCall = - true; - }); + isExpanded: + true, + value: + selectedProvince, + onChanged: + (Province? + province) async { + if (selectedProvince != + province) { + selectedProvince = + province; + setState( + () { + cityCall = + true; + }); - //// GET CITIES - citymuns = await LocationUtils - .instance - .getCities( - code: - selectedProvince!.code!); - selectedMunicipality = - citymuns![ - 0]; - setState( - () { - cityCall = - false; - barangayCall = - true; - }); - //// GET BARANGAY - barangays = await LocationUtils - .instance - .getBarangay( - code: - selectedMunicipality!.code!); - selectedBarangay = - barangays![ - 0]; - setState( - () { - barangayCall = - false; - }); - } - }, - items: - provinces == + //// GET CITIES + try { + citymuns = await LocationUtils + .instance + .getCities(code: selectedProvince!.code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read() + .add(CallErrorState(message: e.toString())); + } + selectedMunicipality = + citymuns![0]; + setState( + () { + cityCall = + false; + barangayCall = + true; + }); + //// GET BARANGAY + try { + barangays = await LocationUtils + .instance + .getBarangay(code: selectedMunicipality!.code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read() + .add(CallErrorState(message: e.toString())); + } + selectedBarangay = + barangays![0]; + setState( + () { + barangayCall = + false; + }); + } + }, + items: provinces == null ? [] - : provinces! - .map>((Province province) { + : provinces!.map>((Province + province) { return DropdownMenuItem( enabled: !enabled ? overseas : true, value: province, @@ -716,7 +771,13 @@ class _EditLearningAndDevelopmentScreenState child: Text(province.description!), )); }).toList(), - decoration: normalTextFieldStyle("Province*", "Province").copyWith(filled: !enabled ? !overseas : false, fillColor: Colors.grey.shade300)), + decoration: normalTextFieldStyle("Province*", "Province").copyWith( + filled: !enabled + ? !overseas + : false, + fillColor: Colors + .grey + .shade300)), ), ), ////CITY MUNICIPALITY @@ -729,7 +790,6 @@ class _EditLearningAndDevelopmentScreenState cityCall, child: DropdownButtonFormField< CityMunicipality>( - validator: FormBuilderValidators .required( errorText: @@ -746,13 +806,24 @@ class _EditLearningAndDevelopmentScreenState }); selectedMunicipality = city; - + //// GET BARANGAYS - barangays = await LocationUtils - .instance - .getBarangay( - code: - selectedMunicipality!.code!); + try { + barangays = await LocationUtils + .instance + .getBarangay( + code: + selectedMunicipality!.code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + LearningDevelopmentBloc>() + .add(CallErrorState( + message: + e.toString())); + } selectedBarangay = barangays![ 0]; @@ -805,7 +876,7 @@ class _EditLearningAndDevelopmentScreenState child: DropdownButtonFormField< Barangay>( - isExpanded: true, + isExpanded: true, onChanged: (Barangay? baragay) { diff --git a/lib/screens/profile/components/reference/add_modal.dart b/lib/screens/profile/components/reference/add_modal.dart index 5883898..cfd8ca3 100644 --- a/lib/screens/profile/components/reference/add_modal.dart +++ b/lib/screens/profile/components/reference/add_modal.dart @@ -110,7 +110,6 @@ class _AddReferenceScreenState extends State { inputFormatters: [ UpperCaseTextFormatter() ], - decoration: normalTextFieldStyle( "Middle name ", ""), name: "middlename", diff --git a/lib/screens/profile/components/reference/edit_modal.dart b/lib/screens/profile/components/reference/edit_modal.dart index 803d7cb..479bed8 100644 --- a/lib/screens/profile/components/reference/edit_modal.dart +++ b/lib/screens/profile/components/reference/edit_modal.dart @@ -4,6 +4,7 @@ import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_progress_hud/flutter_progress_hud.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart'; +import 'package:unit2/utils/global_context.dart'; import '../../../../bloc/profile/references/references_bloc.dart'; import '../../../../model/location/address_category.dart'; import '../../../../model/location/barangay.dart'; @@ -72,7 +73,7 @@ class _EditReferenceScreenState extends State { return FormBuilder( key: formKey, child: SizedBox( - height: screenHeight * .90, + height: screenHeight * .90, child: Padding( padding: const EdgeInsets.all(28), child: Column( @@ -87,9 +88,7 @@ class _EditReferenceScreenState extends State { Flexible( flex: 1, child: FormBuilderTextField( - inputFormatters: [ - UpperCaseTextFormatter() - ], + inputFormatters: [UpperCaseTextFormatter()], initialValue: state.ref.lastName, decoration: normalTextFieldStyle( "Last name *", "Last name *"), @@ -105,10 +104,7 @@ class _EditReferenceScreenState extends State { Flexible( flex: 1, child: FormBuilderTextField( - inputFormatters: [ - UpperCaseTextFormatter() - ], - + inputFormatters: [UpperCaseTextFormatter()], initialValue: state.ref.firstName, decoration: normalTextFieldStyle( "First name *", "First name *"), @@ -127,15 +123,11 @@ class _EditReferenceScreenState extends State { Flexible( flex: 1, child: FormBuilderTextField( - inputFormatters: [ - UpperCaseTextFormatter() - ], - + inputFormatters: [UpperCaseTextFormatter()], initialValue: state.ref.middleName, decoration: normalTextFieldStyle( "Middle name *", "Midlle name *"), name: "middlename", - ), ), const SizedBox( @@ -160,8 +152,8 @@ class _EditReferenceScreenState extends State { ), FormBuilderDropdown( name: 'category', - validator: - FormBuilderValidators.required(errorText: "This field is required"), + validator: FormBuilderValidators.required( + errorText: "This field is required"), decoration: normalTextFieldStyle( "Address Category", "Address Category"), items: state.categories @@ -209,62 +201,95 @@ class _EditReferenceScreenState extends State { ////REGION DROPDOWN DropdownButtonFormField( isExpanded: true, - autovalidateMode: AutovalidateMode - .onUserInteraction, - validator: - FormBuilderValidators.required( + autovalidateMode: + AutovalidateMode + .onUserInteraction, + validator: FormBuilderValidators + .required( errorText: "This field is required"), - onChanged: (Region? region) async { + onChanged: + (Region? region) async { setState(() { provinceCall = true; - + selectedRegion = region; }); //// GET PROVINCES - provinces = await LocationUtils - .instance - .getProvinces( - regionCode: selectedRegion! - .code - .toString()); - selectedProvince = provinces![0]; + try { + provinces = await LocationUtils + .instance + .getProvinces( + regionCode: + selectedRegion! + .code + .toString()); + } catch (e) { + context + .read() + .add(CallErrorState()); + } + selectedProvince = + provinces![0]; setState(() { provinceCall = false; cityCall = true; }); ////GET CITY MUNICIPALITY - citymuns = await LocationUtils - .instance - .getCities( - code: selectedProvince! - .code!); - selectedMunicipality = citymuns![0]; + try { + citymuns = await LocationUtils + .instance + .getCities( + code: + selectedProvince! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read() + .add(CallErrorState()); + } + selectedMunicipality = + citymuns![0]; setState(() { cityCall = false; barangayCall = true; }); //// GET BARANGAYS - barangays = await LocationUtils - .instance - .getBarangay( - code: selectedMunicipality! - .code!); - selectedBarangay = barangays![0]; + try { + barangays = await LocationUtils + .instance + .getBarangay( + code: + selectedMunicipality! + .code!); + selectedBarangay = + barangays![0]; + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read() + .add(CallErrorState()); + } setState(() { barangayCall = false; }); }, value: selectedRegion, - decoration: normalTextFieldStyle( - "Region*", "Region"), - items: state.regions - .map>( - (Region region) { - return DropdownMenuItem( + decoration: + normalTextFieldStyle( + "Region*", "Region"), + items: state.regions.map< + DropdownMenuItem< + Region>>( + (Region region) { + return DropdownMenuItem< + Region>( value: region, - child: - Text(region.description!)); + child: Text( + region.description!)); }).toList(), ), const SizedBox( @@ -286,19 +311,30 @@ class _EditReferenceScreenState extends State { ? 'required' : null, isExpanded: true, - onChanged: - (Province? province) async { - selectedProvince = province; + onChanged: (Province? + province) async { + selectedProvince = + province; setState(() { cityCall = true; }); //// GET CITIES - citymuns = await LocationUtils - .instance - .getCities( - code: - selectedProvince! - .code!); + try { + citymuns = + await LocationUtils + .instance + .getCities( + code: selectedProvince! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + ReferencesBloc>() + .add( + CallErrorState()); + } selectedMunicipality = citymuns![0]; setState(() { @@ -306,12 +342,22 @@ class _EditReferenceScreenState extends State { barangayCall = true; }); //// GET BARANGAY - barangays = await LocationUtils - .instance - .getBarangay( - code: - selectedMunicipality! - .code!); + try { + barangays = + await LocationUtils + .instance + .getBarangay( + code: selectedMunicipality! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + ReferencesBloc>() + .add( + CallErrorState()); + } selectedBarangay = barangays![0]; setState(() { @@ -324,12 +370,16 @@ class _EditReferenceScreenState extends State { : provinces!.map< DropdownMenuItem< Province>>( - (Province province) { + (Province + province) { return DropdownMenuItem( - value: province, - child: FittedBox( - child: Text(province - .description!), + value: + province, + child: + FittedBox( + child: Text( + province + .description!), )); }).toList(), decoration: @@ -344,46 +394,61 @@ class _EditReferenceScreenState extends State { child: ModalProgressHUD( color: Colors.white, inAsyncCall: cityCall, - child: DropdownButtonFormField< - CityMunicipality>( + child: + DropdownButtonFormField< + CityMunicipality>( validator: FormBuilderValidators .required( errorText: "This field is required"), isExpanded: true, - onChanged: (CityMunicipality? - city) async { + onChanged: + (CityMunicipality? + city) async { setState(() { barangayCall = true; }); - selectedMunicipality = city; + selectedMunicipality = + city; //// GET BARANGAYS - barangays = await LocationUtils - .instance - .getBarangay( - code: - selectedMunicipality! - .code!); + try { + barangays = + await LocationUtils + .instance + .getBarangay( + code: selectedMunicipality! + .code!); + } catch (e) { + NavigationService + .navigatorKey + .currentContext + ?.read< + ReferencesBloc>() + .add( + CallErrorState()); + } selectedBarangay = barangays![0]; setState(() { barangayCall = false; }); }, - decoration: normalTextFieldStyle( - "Municipality*", - "Municipality"), + decoration: + normalTextFieldStyle( + "Municipality*", + "Municipality"), value: selectedMunicipality, items: citymuns == null ? [] : citymuns!.map< DropdownMenuItem< CityMunicipality>>( - (CityMunicipality c) { + (CityMunicipality + c) { return DropdownMenuItem( value: c, - child: Text( - c.description!)); + child: Text(c + .description!)); }).toList(), ), ), @@ -394,25 +459,31 @@ class _EditReferenceScreenState extends State { child: ModalProgressHUD( color: Colors.white, inAsyncCall: barangayCall, - child: DropdownButtonFormField< - Barangay>( + child: + DropdownButtonFormField< + Barangay>( validator: FormBuilderValidators .required( errorText: "This field is required"), isExpanded: true, - onChanged: (Barangay? baragay) { - selectedBarangay = baragay; + onChanged: + (Barangay? baragay) { + selectedBarangay = + baragay; }, - decoration: normalTextFieldStyle( - "Barangay*", "Barangay"), + decoration: + normalTextFieldStyle( + "Barangay*", + "Barangay"), value: selectedBarangay, items: barangays == null ? [] : barangays!.map< DropdownMenuItem< Barangay>>( - (Barangay barangay) { + (Barangay + barangay) { return DropdownMenuItem( value: barangay, child: Text(barangay @@ -426,22 +497,28 @@ class _EditReferenceScreenState extends State { //// COUNTRY DROPDOWN : SizedBox( height: 60, - child: DropdownButtonFormField( + child: DropdownButtonFormField< + Country>( isExpanded: true, - value: selectedCountry?.id==175?null:selectedCountry, - validator: - FormBuilderValidators.required( + value: selectedCountry?.id == 175 + ? null + : selectedCountry, + validator: FormBuilderValidators + .required( errorText: "This field is required"), - items: state.countries - .map>( - (Country country) { - return DropdownMenuItem( + items: state.countries.map< + DropdownMenuItem< + Country>>( + (Country country) { + return DropdownMenuItem< + Country>( value: country, child: FittedBox( - child: Text(country.name!))); + child: Text( + country.name!))); }).toList(), - + decoration: normalTextFieldStyle( "Country*", "Country"), //// country dropdown @@ -454,93 +531,91 @@ class _EditReferenceScreenState extends State { ], ); }), - - - + const SizedBox( height: 20, ), ], ), ), - SizedBox( - width: double.infinity, - height: 60, - child: ElevatedButton( - style: - mainBtnStyle(primary, Colors.transparent, second), - child: const Text(submit), - onPressed: () { - PersonalReference? personalReference; - if (formKey.currentState!.saveAndValidate()) { - final progress = ProgressHUD.of(context); - progress!.showWithText("Please wait..."); - String lastname = - formKey.currentState!.value['lastname']; - String firstname = - formKey.currentState!.value['firstname']; - String? middlename = - formKey.currentState?.value['middlename']; - String mobile = - formKey.currentState!.value['mobile']; - - Region? region = selectedRegion; - Province? province = Province( - code: selectedProvince?.code, - description: selectedProvince?.description, - region: region, - psgcCode: selectedProvince?.psgcCode, - shortname: selectedProvince?.shortname); - CityMunicipality? city = CityMunicipality( - code: selectedMunicipality?.code, - description: - selectedMunicipality?.description, - province: province, - psgcCode: selectedMunicipality?.psgcCode, - zipcode: selectedMunicipality?.zipcode); - - ////IF IS OVERSEAS - if (overseas) { - personalReference = PersonalReference( - id: state.ref.id, - address: Address( - id: state.ref.address!.id, - addressCategory: selectedCategory, - country: selectedCountry, - barangay: null, - cityMunicipality: null, - addressClass: null), - lastName: lastname, - contactNo: mobile, - firstName: firstname, - middleName: middlename); - } else { - //// IF NOT OVERSEAS - personalReference = PersonalReference( - id: state.ref.id, - address: Address( - id: state.ref.address!.id, - addressCategory: selectedCategory, - country: Country( - id: 175, code: null, name: null), - barangay: selectedBarangay, - cityMunicipality: city, - addressClass: - state.ref.address?.addressClass), - lastName: lastname, - contactNo: mobile, - firstName: firstname, - middleName: middlename); - } - - context.read().add(EditReference( - profileId: widget.profileId, - reference: personalReference, - token: widget.token)); - } - }, - ), - ), + SizedBox( + width: double.infinity, + height: 60, + child: ElevatedButton( + style: + mainBtnStyle(primary, Colors.transparent, second), + child: const Text(submit), + onPressed: () { + PersonalReference? personalReference; + if (formKey.currentState!.saveAndValidate()) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + String lastname = + formKey.currentState!.value['lastname']; + String firstname = + formKey.currentState!.value['firstname']; + String? middlename = + formKey.currentState?.value['middlename']; + String mobile = + formKey.currentState!.value['mobile']; + + Region? region = selectedRegion; + Province? province = Province( + code: selectedProvince?.code, + description: selectedProvince?.description, + region: region, + psgcCode: selectedProvince?.psgcCode, + shortname: selectedProvince?.shortname); + CityMunicipality? city = CityMunicipality( + code: selectedMunicipality?.code, + description: + selectedMunicipality?.description, + province: province, + psgcCode: selectedMunicipality?.psgcCode, + zipcode: selectedMunicipality?.zipcode); + + ////IF IS OVERSEAS + if (overseas) { + personalReference = PersonalReference( + id: state.ref.id, + address: Address( + id: state.ref.address!.id, + addressCategory: selectedCategory, + country: selectedCountry, + barangay: null, + cityMunicipality: null, + addressClass: null), + lastName: lastname, + contactNo: mobile, + firstName: firstname, + middleName: middlename); + } else { + //// IF NOT OVERSEAS + personalReference = PersonalReference( + id: state.ref.id, + address: Address( + id: state.ref.address!.id, + addressCategory: selectedCategory, + country: Country( + id: 175, code: null, name: null), + barangay: selectedBarangay, + cityMunicipality: city, + addressClass: + state.ref.address?.addressClass), + lastName: lastname, + contactNo: mobile, + firstName: firstname, + middleName: middlename); + } + + context.read().add(EditReference( + profileId: widget.profileId, + reference: personalReference, + token: widget.token)); + } + }, + ), + ), ], ), ), diff --git a/lib/screens/profile/components/references_screen.dart b/lib/screens/profile/components/references_screen.dart index 1f53c27..a9731fe 100644 --- a/lib/screens/profile/components/references_screen.dart +++ b/lib/screens/profile/components/references_screen.dart @@ -71,6 +71,7 @@ class ReferencesScreen extends StatelessWidget { return BlocConsumer( //listener listener: (context, state) { + print(state); if (state is ReferencesLoadingState) { final progress = ProgressHUD.of(context); progress!.showWithText("Please wait..."); diff --git a/lib/screens/profile/components/voluntary_works/edit_modal.dart b/lib/screens/profile/components/voluntary_works/edit_modal.dart index 4ea1a6a..b841bda 100644 --- a/lib/screens/profile/components/voluntary_works/edit_modal.dart +++ b/lib/screens/profile/components/voluntary_works/edit_modal.dart @@ -578,6 +578,11 @@ class _EditVoluntaryWorkScreenState extends State { selectedRegion! .code .toString()); + }catch(e){ + context + .read() + .add(ShowErrorState(message: e.toString())); + } selectedProvince = provinces![0]; setState(() { @@ -606,14 +611,7 @@ class _EditVoluntaryWorkScreenState extends State { message: e .toString())); } - } catch (e) { - context - .read< - VoluntaryWorkBloc>() - .add(ShowErrorState( - message: e - .toString())); - } + } }, value: selectedRegion, diff --git a/lib/screens/profile/components/voluntary_works_screen.dart b/lib/screens/profile/components/voluntary_works_screen.dart index 4544fe5..c52dece 100644 --- a/lib/screens/profile/components/voluntary_works_screen.dart +++ b/lib/screens/profile/components/voluntary_works_screen.dart @@ -268,7 +268,8 @@ class VolunataryWorkScreen extends StatelessWidget { icon: Icons.edit), popMenuItem( text: "Remove", - value: 2,) + value: 2, + icon: Icons.delete) ], diff --git a/lib/screens/sos/components/add_mobile.dart b/lib/screens/sos/components/add_mobile.dart index 3025e92..cb2ec9b 100644 --- a/lib/screens/sos/components/add_mobile.dart +++ b/lib/screens/sos/components/add_mobile.dart @@ -36,16 +36,13 @@ class AddMobile extends StatelessWidget { Container( height: screenHeight, padding: isMobile() - ? const EdgeInsets.symmetric(horizontal: 24) + ? const EdgeInsets.symmetric(horizontal: 60) : const EdgeInsets.symmetric(horizontal: 60), width: double.infinity, child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox( - height: isMobile() - ? screenHeight * .12 - : screenHeight * .20), + const SizedBox(height: 100,), SvgPicture.asset( 'assets/svgs/add_mobile.svg', height: isMobile() @@ -56,13 +53,13 @@ class AddMobile extends StatelessWidget { const SizedBox( height: 24, ), - Text(addMobile, style: titleTextStyle()), + Text(addMobile,textAlign: TextAlign.center, style: titleTextStyle()), const SizedBox( height: 8, ), Text(addMobileCaption, textAlign: TextAlign.center, - style: Theme.of(context).textTheme.caption), + style: Theme.of(context).textTheme.bodySmall), const SizedBox( height: 24, ), @@ -78,9 +75,7 @@ class AddMobile extends StatelessWidget { maxLength: 11, decoration: normalTextFieldStyle(mobile1, "09")), - const SizedBox( - height: 12, - ), + //// Mobile number 2 FormBuilderTextField( autovalidateMode: AutovalidateMode.onUserInteraction, @@ -89,10 +84,7 @@ class AddMobile extends StatelessWidget { decoration: normalTextFieldStyle(mobile2, "09")), - SizedBox( - height: isMobile() - ? blockSizeVertical * 3 - : blockSizeHorizontal * 5), + const SizedBox(height: 30,), SizedBox( width: double.infinity, height: screenHeight * .06, diff --git a/lib/screens/sos/components/request_sos.dart b/lib/screens/sos/components/request_sos.dart index 990de3e..a7510a6 100644 --- a/lib/screens/sos/components/request_sos.dart +++ b/lib/screens/sos/components/request_sos.dart @@ -40,7 +40,7 @@ class _RequestSOSState extends State { return SingleChildScrollView( child: Container( height: screenHeight * .82, - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 42, vertical: 10), child: FormBuilder( key: formKey, child: Column( diff --git a/lib/screens/sos/index.dart b/lib/screens/sos/index.dart index f3bdb90..cb9dbcc 100644 --- a/lib/screens/sos/index.dart +++ b/lib/screens/sos/index.dart @@ -47,7 +47,7 @@ class _SosScreenState extends State { Widget build(BuildContext context) { return SafeArea( child: Scaffold( - appBar: AppBar(backgroundColor: primary), + appBar: AppBar(title:const Text("SOS"),backgroundColor: primary,centerTitle: true,), resizeToAvoidBottomInset: true, body: ProgressHUD( padding: const EdgeInsets.all(32), diff --git a/lib/screens/unit2/basic-info/basic-info.dart b/lib/screens/unit2/basic-info/basic-info.dart index c16824a..2194b21 100644 --- a/lib/screens/unit2/basic-info/basic-info.dart +++ b/lib/screens/unit2/basic-info/basic-info.dart @@ -42,7 +42,7 @@ class BasicInfo extends StatelessWidget { children: [ const CoverImage(), Positioned( - top: blockSizeVertical * 17.5, + top: blockSizeVertical * 15.5, child: Stack( alignment: Alignment.center, children: [ @@ -115,8 +115,8 @@ class BuildInformation extends StatelessWidget { final String firstName = userData.user!.login!.user!.firstName!.toUpperCase(); final String lastname = userData.user!.login!.user!.lastName!.toUpperCase(); - final String middlename = - userData.employeeInfo!.profile!.middleName!.toUpperCase(); + final String? middlename = userData.employeeInfo == null?'': + userData.employeeInfo!.profile?.middleName?.toUpperCase(); final String sex = userData.employeeInfo!.profile!.sex!.toUpperCase(); final DateTime? bday = userData.employeeInfo!.profile!.birthdate; final uuid = userData.employeeInfo!.uuid; @@ -129,11 +129,11 @@ class BuildInformation extends StatelessWidget { height: 25, ), Text( - "$firstName $middlename $lastname", + "$firstName ${middlename??''} $lastname", textAlign: TextAlign.center, style: Theme.of(context) .textTheme - .headline5! + .headlineSmall! .copyWith(fontWeight: FontWeight.bold), ), const SizedBox( @@ -141,7 +141,7 @@ class BuildInformation extends StatelessWidget { ), Text( "${dteFormat2.format(bday!)} | $sex", - style: Theme.of(context).textTheme.caption!.copyWith(fontSize: 18), + style: Theme.of(context).textTheme.bodySmall!.copyWith(fontSize: 18), ), const SizedBox( height: 15, @@ -162,7 +162,7 @@ class BuildInformation extends StatelessWidget { mainBtnStyle(third, Colors.transparent, Colors.white54), onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (BuildContext context){ - return SignaturePad(); + return const SignaturePad(); })); }, icon: const Icon( diff --git a/lib/screens/unit2/homepage.dart/components/dashboard.dart b/lib/screens/unit2/homepage.dart/components/dashboard.dart index 13bec9e..e1056ac 100644 --- a/lib/screens/unit2/homepage.dart/components/dashboard.dart +++ b/lib/screens/unit2/homepage.dart/components/dashboard.dart @@ -1,20 +1,18 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:fluttericon/font_awesome5_icons.dart'; -import 'package:unit2/screens/docsms/components/request_receipt.dart'; import 'package:unit2/screens/docsms/index.dart'; import 'package:unit2/screens/unit2/homepage.dart/module-screen.dart'; import 'package:unit2/theme-data.dart/colors.dart'; import 'package:unit2/utils/global.dart'; import 'package:unit2/utils/global_context.dart'; import 'package:unit2/utils/qr_scanner.dart'; -import 'package:unit2/utils/text_container.dart'; - import '../../../../bloc/docsms/docsms_bloc.dart'; class DashBoard extends StatelessWidget { final List roles; - const DashBoard({super.key, required this.roles}); + final int userId; + const DashBoard({super.key, required this.roles,required this.userId}); @override Widget build(BuildContext context) { List finishRoles = []; @@ -27,6 +25,7 @@ class DashBoard extends StatelessWidget { shrinkWrap: true, itemCount: roles.length, itemBuilder: (BuildContext context, int index) { + //// gridview.count return roles[index].roles.isNotEmpty ? SizedBox( @@ -53,25 +52,21 @@ class DashBoard extends StatelessWidget { padding: const EdgeInsets.symmetric( vertical: 5, horizontal: 5), children: roles[index].roles.map((role) { - //// if role name is qr code && finishRoles not contain security - //// this card will visible if the user has qr code scanner or security roleπurls if (role.role.name!.toLowerCase() == 'qr code scanner' && !finishRoles.contains("security")) { + print("1 true"); finishRoles.add('scanner'); - //// loop thru module to find unit module exist for (var element in role.role.modules!) { if (element!.name!.toLowerCase() == 'unit2') { for (var element in element.objects!) { - //// loop thru objects to find pass check exist - if (element!.id == 9 && - //// check if operations contains read and write + if (element!.id == 9 && element.operations! .contains("read")) { - //// if all conditions are true return card return CardLabel( ontap: () { - Navigator.pushNamed(context, '/pass-check'); + PassCheckArguments passCheckArguments = PassCheckArguments(roleId: role.role.id!, userId: userId); + Navigator.pushNamed(context, '/pass-check',arguments: passCheckArguments); }, icon: role.icon, title: "Pass Check", @@ -81,11 +76,10 @@ class DashBoard extends StatelessWidget { } } return Container(); - //// if role name is security - //// this card will visible if the user has qr code scanner or security role } else if (role.role.name!.toLowerCase() == 'security guard' && !finishRoles.contains('scanner')) { + print("2 true"); finishRoles.add('security'); for (var element in role.role.modules!) { if (element!.name!.toLowerCase() == 'unit2') { @@ -102,10 +96,10 @@ class DashBoard extends StatelessWidget { } } } - return Container(); - //// if role name is field surveyor + return Container(color: Colors.red,); } else if (role.role.name!.toLowerCase() == 'field surveyor') { + print("3 true"); for (var element in role.role.modules!) { if (element!.name!.toLowerCase() == 'rpass') { for (var element in element.objects!) { @@ -122,9 +116,9 @@ class DashBoard extends StatelessWidget { } } return Container(); - //// if role name is process server } else if (role.role.name!.toLowerCase() == 'process server') { + print("4 true"); for (var element in role.role.modules!) { if (element!.name!.toLowerCase() == 'document management') { @@ -158,15 +152,16 @@ class DashBoard extends StatelessWidget { } return Container(); } else if (role.role.name!.toLowerCase() == - 'establishment point person' && + 'establishment point-person' && !finishRoles.contains('superadmin')) { - finishRoles.add('establishment point person'); + finishRoles.add('establishment point-person'); for (var element in role.role.modules!) { + print("5 true"); if (element!.name!.toLowerCase() == 'unit2') { for (var element in element.objects!) { - if (element!.id == 9 && + if (element!.id == 7 && element.operations! - .contains("read")) { + .contains("upload")) { return CardLabel( ontap: () {}, icon: FontAwesome5.building, @@ -177,13 +172,33 @@ class DashBoard extends StatelessWidget { } } return Container(); - //// if role name is field surveyor - } - - - else { + + } else if (role.role.name!.toLowerCase() == + 'establishment point-person' && + !finishRoles.contains('superadmin')) { + finishRoles.add('establishment point-person'); + for (var element in role.role.modules!) { + if (element!.name!.toLowerCase() == 'unit2') { + for (var element in element.objects!) { + if (element!.id == 7 && + element.operations! + .contains("upload")) { + return CardLabel( + ontap: () {}, + icon: FontAwesome5.building, + title: "Establishment", + ); + } + } + } + } return Container(); + + } else{ + return Wrap(); } + + }).toList()), const SizedBox( height: 8, @@ -197,6 +212,12 @@ class DashBoard extends StatelessWidget { } } +class PassCheckArguments{ + final int roleId; + final int userId; + const PassCheckArguments({required this.roleId, required this.userId}); +} + // ignore: must_be_immutable class CardLabel extends StatelessWidget { final String title; diff --git a/lib/screens/unit2/homepage.dart/components/menu-screen.dart b/lib/screens/unit2/homepage.dart/components/menu-screen.dart index b9cedc2..0b712e3 100644 --- a/lib/screens/unit2/homepage.dart/components/menu-screen.dart +++ b/lib/screens/unit2/homepage.dart/components/menu-screen.dart @@ -27,50 +27,50 @@ class _MenuScreenState extends State { child: Column( mainAxisSize: MainAxisSize.max, children: [ - Flexible( - child: ListView( - // ignore: prefer_const_literals_to_create_immutables - children: [ - UserAccountsDrawerHeader( - decoration: const BoxDecoration( - color: primary, - image: DecorationImage( - image: AssetImage('assets/pngs/bg.png'), - fit: BoxFit.cover)), - accountName: Text("$firstName $lastname"), - accountEmail: null, - currentAccountPicture: CircleAvatar( - radius: 40, - backgroundColor: fifth, - child: CircleAvatar( - radius: 33, - backgroundColor: third, - child: //Icon(Icons.person, size: 40, color: fifth), - Text( - firstName[0].toUpperCase(), - style: const TextStyle(fontSize: 45.0, color: fifth), - ), + Column( + // ignore: prefer_const_literals_to_create_immutables + children: [ + UserAccountsDrawerHeader( + decoration: const BoxDecoration( + color: primary, + image: DecorationImage( + image: AssetImage('assets/pngs/bg.png'), + fit: BoxFit.cover)), + accountName: Text("$firstName $lastname"), + accountEmail: null, + currentAccountPicture: CircleAvatar( + radius: 40, + backgroundColor: fifth, + child: CircleAvatar( + radius: 33, + backgroundColor: third, + child: //Icon(Icons.person, size: 40, color: fifth), + Text( + firstName[0].toUpperCase(), + style: const TextStyle(fontSize: 45.0, color: fifth), ), ), ), - getTile(FontAwesome5.user, "Basic Info", '/basic-info', context, - widget.userData!), - const Divider(), - getTile(FontAwesome5.user_circle, "Profile", - '/profile', context, widget.userData!), - const Divider(), - getTile(FontAwesome5.life_ring, "Request SOS", '/sos', - context, widget.userData!), - - ], - ), + ), + getTile(FontAwesome5.user, "Basic Info", '/basic-info', context, + widget.userData!), + const Divider(), + getTile(FontAwesome5.user_circle, "Profile", + '/profile', context, widget.userData!), + const Divider(), + getTile(FontAwesome5.life_ring, "Request SOS", '/sos', + context, widget.userData!), + + ], ), + const Expanded(child: SizedBox()), const Divider(), Align( alignment: FractionalOffset.bottomLeft, child: getTile(WebSymbols.logout, "Logout", '/', context, widget.userData!), ), + const SizedBox(height: 10,), ], ), ), diff --git a/lib/screens/unit2/homepage.dart/components/menu.dart b/lib/screens/unit2/homepage.dart/components/menu.dart index 6288a3f..abb12bc 100644 --- a/lib/screens/unit2/homepage.dart/components/menu.dart +++ b/lib/screens/unit2/homepage.dart/components/menu.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:unit2/model/login_data/employee_info/employee_info.dart'; import 'package:unit2/model/login_data/user_info/user_data.dart'; import 'package:unit2/utils/alerts.dart'; -import '../../../../model/profile/basic_information/primary-information.dart'; +import 'package:unit2/utils/global_context.dart'; import '../../../../theme-data.dart/colors.dart'; import '../../../../utils/global.dart'; @@ -23,7 +22,7 @@ Widget getTile( confirmAlert(context, () async{ await CREDENTIALS!.clear(); await CREDENTIALS!.deleteAll(['username','password','saved']); - Navigator.pushReplacementNamed (context,"/"); + Navigator.pushReplacementNamed (NavigationService.navigatorKey.currentContext!,"/"); },"Logout","Are You sure you want to logout?"); }if(title.toLowerCase() == 'profile'){ ProfileArguments profileArguments = ProfileArguments(token: userData.user!.login!.token!, userID:userData.user!.login!.user!.profileId!); diff --git a/lib/screens/unit2/homepage.dart/module-screen.dart b/lib/screens/unit2/homepage.dart/module-screen.dart index aef990f..e8a9585 100644 --- a/lib/screens/unit2/homepage.dart/module-screen.dart +++ b/lib/screens/unit2/homepage.dart/module-screen.dart @@ -25,6 +25,7 @@ class _MainScreenState extends State { Module(name: 'DocSms module operations', roles: []), Module(name: "RPAss module operations",roles:[] ) ]; + int? userId; @override Widget build(BuildContext context) { return WillPopScope( @@ -33,6 +34,7 @@ class _MainScreenState extends State { }, child: BlocBuilder(builder: (context, state) { if (state is UserLoggedIn) { + userId = state.userData!.user!.login!.user!.id; for (var element in roles) { element.roles.clear(); } @@ -78,6 +80,7 @@ class _MainScreenState extends State { ), body: state.userData!.user!.login!.user!.roles!.isNotEmpty ? DashBoard( + userId: userId!, roles: roles, ) : const NoModule(), diff --git a/lib/screens/unit2/login/login.dart b/lib/screens/unit2/login/login.dart index 164a5c3..c0a0c03 100644 --- a/lib/screens/unit2/login/login.dart +++ b/lib/screens/unit2/login/login.dart @@ -273,7 +273,7 @@ class _UniT2LoginState extends State { SizedBox( height: blockSizeVertical * 1.5, ), - +//// Login via Scan QR SizedBox( height: blockSizeVertical * 7, child: SizedBox( @@ -367,6 +367,16 @@ class _UniT2LoginState extends State { if (state is SplashScreen) { return const UniTSplashScreen(); } + if(state is LoginErrorState){ + return SomethingWentWrong(message: state.message, onpressed: () { + BlocProvider.of( + NavigationService.navigatorKey.currentContext!) + .add(GetApkVersion()); + return MaterialPageRoute(builder: (_) { + return const UniT2Login(); + }); + },); + } return Container(); }), ), diff --git a/lib/screens/unit2/login/qr_login.dart b/lib/screens/unit2/login/qr_login.dart index 344b2bd..9fd52c5 100644 --- a/lib/screens/unit2/login/qr_login.dart +++ b/lib/screens/unit2/login/qr_login.dart @@ -15,8 +15,10 @@ import '../../../theme-data.dart/colors.dart'; import '../../../theme-data.dart/form-style.dart'; import '../../../utils/alerts.dart'; import '../../../utils/global.dart'; +import '../../../utils/internet_time_out.dart'; import '../../../utils/text_container.dart'; import '../../../utils/validators.dart'; +import '../../../widgets/error_state.dart'; class QRLogin extends StatefulWidget { const QRLogin({super.key}); @@ -96,7 +98,7 @@ class _QRLoginState extends State { bottom: 0, child: WaveReverse(height: blockSizeVertical * 8)), Container( - height: screenHeight * .90, + height: screenHeight * .87, padding: const EdgeInsets.symmetric(horizontal: 32), child: FormBuilder( key: _formKey, @@ -221,7 +223,23 @@ class _QRLoginState extends State { ], ), ); - } + } if (state is InternetTimeout) { + return SomethingWentWrong(message: state.message, onpressed: () { + context + .read() + .add(LoadUuid()); + Navigator.of(context).pop(); + },); + } + + if(state is LoginErrorState){ + return SomethingWentWrong(message: state.message, onpressed: () { + context + .read() + .add(LoadUuid()); + Navigator.of(context).pop(); + },); + } return Container(); }, ), diff --git a/lib/screens/unit2/roles/qr_code_scanner.dart/scan.dart b/lib/screens/unit2/roles/qr_code_scanner.dart/scan.dart index 8a26cb8..5e25ab4 100644 --- a/lib/screens/unit2/roles/qr_code_scanner.dart/scan.dart +++ b/lib/screens/unit2/roles/qr_code_scanner.dart/scan.dart @@ -1,148 +1,360 @@ +import 'package:assets_audio_player/assets_audio_player.dart'; +import 'package:audioplayers/audioplayers.dart'; +import 'package:cool_alert/cool_alert.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_progress_hud/flutter_progress_hud.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:fluttericon/entypo_icons.dart'; +import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:unit2/bloc/role/pass_check/pass_check_bloc.dart'; +import 'package:unit2/theme-data.dart/btn-style.dart'; +import 'package:unit2/theme-data.dart/form-style.dart'; import 'package:unit2/utils/text_container.dart'; - +import 'package:unit2/utils/validators.dart'; +import 'package:unit2/widgets/error_state.dart'; import '../../../../theme-data.dart/colors.dart'; import '../../../../utils/global.dart'; import 'components/save_settings.dart'; -class QRCodeScanner extends StatelessWidget { +class QRCodeScanner extends StatefulWidget { const QRCodeScanner({super.key}); + @override + State createState() => _QRCodeScannerState(); +} + +final GlobalKey scaffoldKey = GlobalKey(); +final formKey = GlobalKey(); +AudioPlayer? player; + +class _QRCodeScannerState extends State { + @override + void initState() { + player = AudioPlayer(); + super.initState(); + } + @override + void dispose() { + player?.dispose(); + super.dispose(); + } + + @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar( - title: const Text(qrScannerTitle), - centerTitle: true, - backgroundColor: primary, + key: scaffoldKey, + appBar: AppBar( + title: const Text(qrScannerTitle), + centerTitle: true, + backgroundColor: primary, + ), + body: ProgressHUD( + padding: const EdgeInsets.all(24), + indicatorWidget: const SpinKitFadingCircle( + color: Colors.white, ), - body: SizedBox( - height: screenHeight * 100, - width: double.infinity, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - const SizedBox( - height: 40, - ), - GestureDetector( - onTap: () {}, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 160, - child: Image.asset('assets/pngs/qr-scan.png')), - const SizedBox( - height: 8, - ), - Text( - tapToScanQR, - textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - fontSize: 22, - color: primary, - fontWeight: FontWeight.bold), - ), - const SizedBox( - height: 8, - ), - //TODO add API data - "INCOMING" == "INCOMING" - ? SizedBox( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - incoming, - textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - fontSize: 20, - color: success2, - fontWeight: FontWeight.bold), - ), - const Icon( - Entypo.down_bold, - color: success2, - ) - ], + backgroundColor: Colors.black87, + child: BlocConsumer( + listener: (context, state) { + if (state is PassCheckLoadingState) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + } + if (state is SettingSaved || + state is IncomingScanState || + state is OutGoingScanState || + state is ScanSuccess || + state is ScanFailed || + state is PassCheckErrorState) { + final progress = ProgressHUD.of(context); + progress!.dismiss(); + } + if (state is ScanSuccess) { + Future.delayed(const Duration(seconds: 1), () async{ + await player?.play(AssetSource("success.mp3")); + }); + context.read().add(ScanQr(token: state.token)); + } + if (state is QRInvalid) { + Future.delayed(const Duration(seconds: 1), ()async { + await player?.play(AssetSource("invalid.mp3")); + }); + context.read().add(ScanQr(token: state.token)); + } + if (state is ScanFailed) { + Future.delayed(const Duration(seconds: 1), ()async { + await player?.play(AssetSource("fail.mp3")); + }); + + context.read().add(ScanQr(token: state.token)); + } + if (state is IncomingScanState) { + CoolAlert.show( + barrierDismissible: false, + context: context, + type: CoolAlertType.loading, + text: "Enter Temperature", + widget: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: FormBuilder( + key: formKey, + child: Column( + children: [ + const SizedBox( + height: 24, ), - ) - : SizedBox( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - //TODO add API data - "INCOMING", - textAlign: TextAlign.center, - style: Theme.of(context) - .textTheme - .displayMedium! - .copyWith( - fontSize: 20, - color: second, - fontWeight: FontWeight.bold), - ), - const Icon( - Entypo.up_bold, - color: second, - ) - ], + FormBuilderTextField( + keyboardType: TextInputType.number, + name: "temp", + decoration: + normalTextFieldStyle("Temperature", ""), + validator: numericRequired), + const SizedBox( + height: 12, ), - ) - ], - ), - ), - Container( - padding: const EdgeInsets.only(top: 12), - decoration: const BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.black38, - blurRadius: 30, - offset: Offset(-5, 0), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(15), - topRight: Radius.circular(15))), + SizedBox( + height: 50, + width: double.infinity, + child: ElevatedButton( + style: mainBtnStyle( + primary, Colors.transparent, second), + child: const Text(submit), + onPressed: () { + if (formKey.currentState!.saveAndValidate()) { + double temperature = double.parse( + formKey.currentState!.value['temp']); + context.read().add( + PerformIncomingPostLog( + temp: temperature)); + Navigator.of(context).pop(); + } + }, + ), + ) + ], + )), + )); + } + if (state is OutGoingScanState) { + CoolAlert.show( + barrierDismissible: false, + context: context, + type: CoolAlertType.loading, + text: "Enter Destination", + widget: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: FormBuilder( + key: formKey, + child: Column( + children: [ + const SizedBox( + height: 24, + ), + FormBuilderTextField( + textCapitalization: + TextCapitalization.sentences, + name: "destination", + decoration: + normalTextFieldStyle("Destination", ""), + validator: FormBuilderValidators.required( + errorText: "This field is required")), + const SizedBox( + height: 12, + ), + SizedBox( + height: 50, + width: double.infinity, + child: ElevatedButton( + style: mainBtnStyle( + primary, Colors.transparent, second), + child: const Text(submit), + onPressed: () { + if (formKey.currentState!.saveAndValidate()) { + String destination = formKey + .currentState!.value['destination']; + context.read().add( + PerformOutgoingPostLog( + destination: destination)); + Navigator.of(context).pop(); + } + }, + ), + ) + ], + )), + )); + } + }, + builder: (context, state) { + if (state is SettingSaved) { + return SizedBox( + height: screenHeight * 100, width: double.infinity, child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - SelectedState( - //TODO add api data - - title: "Provincial Government of ADN", - subtitle: establishment, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const SizedBox( + height: 40, ), - Center( - child: SelectedState( - //TODO add api data - title: "Agusan Up", - subtitle: checkpointArea, + GestureDetector( + onTap: () {}, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 160, + child: GestureDetector( + child: Image.asset('assets/pngs/qr-scan.png'), + onTap: () { + context + .read() + .add(ScanQr(token: state.token)); + })), + const SizedBox( + height: 8, + ), + Text( + tapToScanQR, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .displayMedium! + .copyWith( + fontSize: 22, + color: primary, + fontWeight: FontWeight.bold), + ), + const SizedBox( + height: 8, + ), + //TODO add API data + state.io == "INCOMING" + ? SizedBox( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + incoming, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .displayMedium! + .copyWith( + fontSize: 20, + color: success2, + fontWeight: FontWeight.bold), + ), + const Icon( + Entypo.down_bold, + color: success2, + ) + ], + ), + ) + : SizedBox( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "OUTGOING", + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .displayMedium! + .copyWith( + fontSize: 20, + color: second, + fontWeight: FontWeight.bold), + ), + const Icon( + Entypo.up_bold, + color: second, + ) + ], + ), + ) + ], ), ), - SelectedState( - //TODO add api data - title: "INCOMING", - subtitle: scanMode, - ), + Container( + padding: const EdgeInsets.only(top: 12), + decoration: const BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.black38, + blurRadius: 30, + offset: Offset(-5, 0), + ), + ], + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(15), + topRight: Radius.circular(15))), + width: double.infinity, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SelectedState( + //TODO add api data + title: state.roleId == 41 || + state.roleId == 13 || + state.roleId == 17 || + state.roleId == 22 + ? state.assignedArea.stationName + : state.roleId == 7 + ? state.assignedArea.brgydesc + : state.roleId == 10 + ? state.assignedArea.purokdesc + : state.roleId == 16 + ? "Agency" + : "", + subtitle: state.roleId == 41 || + state.roleId == 13 || + state.roleId == 17 || + state.roleId == 22 + ? "Station" + : state.roleId == 7 + ? "Barangay" + : state.roleId == 10 + ? "Purok" + : state.roleId == 16 + ? "Agency" + : "", + ), + SelectedState( + //TODO add api data + + title: state.otherInputs ? "YES" : "NO", + subtitle: "Include other inputs", + ), + const SizedBox( + height: 54, + ), + ], + ), + ), + ) ], ), - ) - ], - ), - )); + ); + } + if (state is PassCheckErrorState) { + return SomethingWentWrong( + message: state.message, + onpressed: () { + context.read().add(ScanError()); + }); + } + return Container(); + }, + ), + ), + ); } } diff --git a/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart b/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart index 3610217..19df2b5 100644 --- a/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart +++ b/lib/screens/unit2/roles/qr_code_scanner.dart/settings_screen.dart @@ -1,19 +1,28 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; +import 'package:flutter_progress_hud/flutter_progress_hud.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_svg/svg.dart'; import 'package:fluttericon/entypo_icons.dart'; import 'package:fluttericon/modern_pictograms_icons.dart'; import 'package:form_builder_validators/form_builder_validators.dart'; +import 'package:unit2/bloc/role/pass_check/pass_check_bloc.dart'; +import 'package:unit2/bloc/user/user_bloc.dart'; +import 'package:unit2/screens/unit2/homepage.dart/components/dashboard.dart'; import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart'; -import 'package:unit2/test_data.dart'; +import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/scan.dart'; import 'package:unit2/utils/text_container.dart'; +import 'package:unit2/widgets/error_state.dart'; import '../../../../theme-data.dart/btn-style.dart'; import '../../../../theme-data.dart/colors.dart'; import '../../../../theme-data.dart/form-style.dart'; import '../../../../utils/global.dart'; class QRCodeScannerSettings extends StatefulWidget { - const QRCodeScannerSettings({super.key}); + final int roleId; + final int userId; + const QRCodeScannerSettings({super.key, required this.roleId, required this.userId}); @override State createState() => _QRCodeScannerSettingsState(); @@ -25,6 +34,9 @@ class _QRCodeScannerSettingsState extends State { String selectedLevel = ''; String selectedEstablishment = ''; String selectedArea = ''; + dynamic assignedArea; + int? checkerId; + String? token; final _formKey = GlobalKey(); @override Widget build(BuildContext context) { @@ -35,171 +47,584 @@ class _QRCodeScannerSettingsState extends State { centerTitle: true, backgroundColor: primary, ), - body: SingleChildScrollView( - child: Container( - height: screenHeight * .84, - padding: const EdgeInsets.symmetric(horizontal: 30,vertical: 10), - child: FormBuilder( - key: _formKey, - child: Column( - children: [ - const SizedBox( - height:24, - ), - SvgPicture.asset( - 'assets/svgs/switch.svg', - height: blockSizeVertical * 14, - allowDrawingOutsideViewBox: true, - ), - ListTile( - title: Text( - setQRScannerSettings, - style: Theme.of(context) - .textTheme - .titleLarge! - .copyWith(color: third), - textAlign: TextAlign.center, - ), - ), - Text(includeOtherInputs, - style: Theme.of(context).textTheme.titleMedium), - Text( - includeOtherInputsSubTitle, - style: Theme.of(context).textTheme.bodySmall, - ), - SizedBox( - child: FittedBox( - child: CostumToggleSwitch( - activeBGColors: [ - Colors.green[800]!, - Colors.red[800]! - ], - initialLabelIndex: _includeOtherInputs ? 0 : 1, - icons: const [Entypo.check, ModernPictograms.cancel], - labels: const ['YES', 'NO'], - onToggle: (value) { - value == 0 - ? _includeOtherInputs = true - : _includeOtherInputs = false; - }, - ), - ), - ), - // Incoming or outgoing - Text(incomingORoutgoing, - style: Theme.of(context).textTheme.titleMedium), - Text( - incomingORoutgoingSubTitle, - style: Theme.of(context).textTheme.bodySmall, - ), - FittedBox( - child: CostumToggleSwitch( - activeBGColors: [ Colors.red[800]!,Colors.green[800]!], - initialLabelIndex: scanMode == 'INCOMING' ? 0 : 1, - icons: const [ - Entypo.down_bold, - Entypo.up_bold, - ], - labels: const ['INCOMING', 'OUTGOING'], - onToggle: (value) { - value == 0 - ? scanMode = 'INCOMING' - : scanMode = 'OUTGOING'; - }, - ), - ), - const SizedBox( - height: 10, - ), + body: ProgressHUD( + padding: const EdgeInsets.all(24), + indicatorWidget: const SpinKitFadingCircle( + color: Colors.white, + ), + backgroundColor: Colors.black87, + child: BlocBuilder( + builder: (context, state) { + if (state is UserLoggedIn) { + token = state.userData!.user!.login!.token; + checkerId = state.userData!.user!.login!.user!.id; + return BlocConsumer( + listener: (context, state) { + if (state is PassCheckLoadingState) { + final progress = ProgressHUD.of(context); + progress!.showWithText("Please wait..."); + } + if (state is AssignAreaLoaded || + state is PassCheckErrorState) { + final progress = ProgressHUD.of(context); + progress!.dismiss(); + } + }, + builder: (context, state) { + if (state is AssignAreaLoaded) { + return Container( + height: screenHeight * .90, + padding: const EdgeInsets.symmetric( + horizontal: 42, vertical: 10), + child: FormBuilder( + key: _formKey, + child: Column( + children: [ + Flexible( + child: ListView( + children: [ + const SizedBox( + height: 32, + ), + SvgPicture.asset( + 'assets/svgs/switch.svg', + height: blockSizeVertical * 14, + allowDrawingOutsideViewBox: true, + ), + ListTile( + title: Text( + setQRScannerSettings, + style: Theme.of(context) + .textTheme + .titleLarge! + .copyWith(color: third), + textAlign: TextAlign.center, + ), + ), + Text(includeOtherInputs, + style: Theme.of(context) + .textTheme + .titleMedium), + Text( + includeOtherInputsSubTitle, + style: Theme.of(context) + .textTheme + .bodySmall, + ), + SizedBox( + child: FittedBox( + child: CostumToggleSwitch( + activeBGColors: [ + Colors.green[800]!, + Colors.red[800]! + ], + initialLabelIndex: + _includeOtherInputs ? 0 : 1, + icons: const [ + Entypo.check, + ModernPictograms.cancel + ], + labels: const ['YES', 'NO'], + onToggle: (value) { + value == 0 + ? _includeOtherInputs = true + : _includeOtherInputs = false; + }, + ), + ), + ), + // Incoming or outgoing + Text(incomingORoutgoing, + style: Theme.of(context) + .textTheme + .titleMedium), + Text( + incomingORoutgoingSubTitle, + style: Theme.of(context) + .textTheme + .bodySmall, + ), + FittedBox( + child: CostumToggleSwitch( + activeBGColors: [ + Colors.red[800]!, + Colors.green[800]! + ], + initialLabelIndex: + scanMode == 'INCOMING' ? 0 : 1, + icons: const [ + Entypo.down_bold, + Entypo.up_bold, + ], + labels: const [ + 'INCOMING', + 'OUTGOING' + ], + onToggle: (value) { + value == 0 + ? scanMode = 'INCOMING' + : scanMode = 'OUTGOING'; + }, + ), + ), + const SizedBox( + height: 24, + ), - //SELECT LEVEL - - FormBuilderDropdown( - name: 'level', - validator: FormBuilderValidators.required( - errorText: fieldIsRequired), - decoration: normalTextFieldStyle(selectLevel, "level"), - items: levels - .map((level) => DropdownMenuItem( - value: level, - child: Text(level), - )) - .toList(), - // value: selectedLevel, - onChanged: (value) async { - selectedLevel = value!; - }, - ), - - const SizedBox( - height: 8, - ), - - FormBuilderDropdown( - name: 'establishment', - decoration: normalTextFieldStyle( - selectedEstablishment, "establishments"), - isExpanded: true, - validator: FormBuilderValidators.required( - errorText: fieldIsRequired), - items: establishments - .map((est) => DropdownMenuItem( - value: est, - child: Text(est), - )) - .toList(), - // value: selectedArea, - onChanged: (value) async { - selectedArea = value!; - }), - const SizedBox( - height: 8, - ), - DropdownButtonFormField( - decoration: normalTextFieldStyle( - selectEstablishment, "establishments"), - isExpanded: true, - items: establishments - .map((est) => DropdownMenuItem( - value: est, - child: Text(est), - )) - .toList(), - // value: selectedArea, - onChanged: (value) async { - selectedArea = value!; - }), - const Expanded( - child: SizedBox(), - ), - SizedBox( - width: double.infinity, - height: 60, - child: ElevatedButton( - style: mainBtnStyle( - primary, Colors.transparent, Colors.white54), - child: const Text( - submit, - style: TextStyle(color: Colors.white), - ), - onPressed: () { - // if (_formKey.currentState.validate()) { - // _formKey.currentState.save(); - // BlocProvider.of(context) - // .add(UserWebLogin( - // password: password, - // username: username)); - // } - }, - ), - ), - - const SizedBox( - height: 8, - ), - ], - ), - ), + ////STATION + Container( + child: state.roleId == 41 + ? DropdownButtonFormField( + isExpanded: true, + validator: FormBuilderValidators + .required( + errorText: + fieldIsRequired), + decoration: + normalTextFieldStyle( + "station", "station"), + items: state.assignedArea + .map((station) { + if (station.motherStation) { + return DropdownMenuItem< + dynamic>( + enabled: false, + value: station, + child: Text( + station.stationName + .toUpperCase(), + style: + const TextStyle( + color: Colors + .grey), + ), + ); + } else { + return DropdownMenuItem< + dynamic>( + value: station, + child: Padding( + padding: + const EdgeInsets + .only( + left: 10), + child: Text(station + .stationName), + ), + ); + } + }).toList(), + // value: selectedLevel, + onChanged: (value) async { + assignedArea = value; + }, + ////BARANGAY + ) + : state.roleId == 7 + ? Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Text( + "Select Barangay", + textAlign: + TextAlign.start, + style: + Theme.of(context) + .textTheme + .titleMedium, + ), + const SizedBox( + height: 12, + ), + DropdownButtonFormField( + isExpanded: true, + decoration: + normalTextFieldStyle( + "Barangay", + "Barangay"), + items: state + .assignedArea + .map((barangay) { + return DropdownMenuItem< + dynamic>( + value: barangay, + child: Padding( + padding: + const EdgeInsets + .only( + left: + 5), + child: Text( + barangay + .brgydesc), + ), + ); + }).toList(), + onChanged: (value) { + assignedArea = + value; + }, + ), + ], + ) + : + ////PUROK + state.roleId == 10 + ? Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Text( + "Select Purok", + textAlign: + TextAlign + .start, + style: Theme.of( + context) + .textTheme + .titleMedium, + ), + const SizedBox( + height: 12, + ), + DropdownButtonFormField( + isExpanded: true, + decoration: + normalTextFieldStyle( + "Purok", + "Purok"), + items: state + .assignedArea + .map((purok) { + return DropdownMenuItem< + dynamic>( + value: purok, + child: + Padding( + padding: const EdgeInsets + .only( + left: + 5), + child: Text( + purok + .purokdesc), + ), + ); + }).toList(), + onChanged: + (value) { + assignedArea = + value; + }, + ), + ], + ) + : + ////Registration InCharge + state.roleId == 22 + ? Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Text( + "Select Station", + textAlign: + TextAlign + .start, + style: Theme.of( + context) + .textTheme + .titleMedium, + ), + const SizedBox( + height: 12, + ), + DropdownButtonFormField( + isExpanded: + true, + validator: FormBuilderValidators + .required( + errorText: + fieldIsRequired), + decoration: normalTextFieldStyle( + "station", + "station"), + items: state + .assignedArea + .map( + (station) { + if (station + .motherStation) { + return DropdownMenuItem< + dynamic>( + enabled: + false, + value: + station, + child: + Text( + station + .stationName + .toUpperCase(), + style: + const TextStyle(color: Colors.grey), + ), + ); + } else { + return DropdownMenuItem< + dynamic>( + value: + station, + child: + Padding( + padding: + const EdgeInsets.only(left: 5), + child: + Text(station.stationName), + ), + ); + } + }).toList(), + // value: selectedLevel, + onChanged: + (value) async { + assignedArea = + value; + }, + ), + ], + ) + : ////QR Code Scanner + state.roleId == 13 + ? Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Text( + "Select Station", + textAlign: + TextAlign + .start, + style: Theme.of( + context) + .textTheme + .titleMedium, + ), + const SizedBox( + height: + 12, + ), + DropdownButtonFormField( + isExpanded: + true, + validator: + FormBuilderValidators.required( + errorText: fieldIsRequired), + decoration: normalTextFieldStyle( + "station", + "station"), + items: state + .assignedArea + .map( + (station) { + if (station + .motherStation) { + return DropdownMenuItem< + dynamic>( + enabled: + false, + value: + station, + child: + Text( + station.stationName.toUpperCase(), + style: const TextStyle(color: Colors.grey), + ), + ); + } else { + return DropdownMenuItem< + dynamic>( + value: + station, + child: + Padding( + padding: const EdgeInsets.only(left: 5), + child: Text(station.stationName), + ), + ); + } + }).toList(), + // value: selectedLevel, + onChanged: + (value) async { + assignedArea = + value; + }, + ), + ], + ) + : + ////Establishment Point-Person + state.roleId == 16 + ? Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Text( + "Select Agency", + textAlign: + TextAlign.start, + style: Theme.of(context) + .textTheme + .titleMedium, + ), + const SizedBox( + height: + 12, + ), + DropdownButtonFormField( + isExpanded: + true, + validator: + FormBuilderValidators.required(errorText: fieldIsRequired), + decoration: normalTextFieldStyle( + "Agency", + "Agency"), + items: state + .assignedArea + .map((agency) { + return DropdownMenuItem( + value: agency, + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Text(agency.area.name), + ), + ); + }).toList(), + // value: selectedLevel, + onChanged: + (value) async { + assignedArea = + value; + }, + ), + ], + ) + : ////Office Branch Chief + state.roleId == + 17 + ? Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + "Select Station", + textAlign: TextAlign.start, + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox( + height: 12, + ), + DropdownButtonFormField( + isExpanded: true, + validator: FormBuilderValidators.required(errorText: fieldIsRequired), + decoration: normalTextFieldStyle("station", "station"), + items: state.assignedArea.map((station) { + if (station.motherStation) { + return DropdownMenuItem( + enabled: false, + value: station, + child: Text( + station.stationName.toUpperCase(), + style: const TextStyle(color: Colors.grey), + ), + ); + } else { + return DropdownMenuItem( + value: station, + child: Padding( + padding: const EdgeInsets.only(left: 5), + child: Text(station.stationName), + ), + ); + } + }).toList(), + // value: selectedLevel, + onChanged: (value) async { + assignedArea = value; + }, + ), + ], + ) + : Container()) + ], + ), + ), + SizedBox( + width: double.infinity, + height: 60, + child: ElevatedButton( + style: mainBtnStyle(primary, + Colors.transparent, Colors.white54), + child: const Text( + submit, + style: TextStyle(color: Colors.white), + ), + onPressed: () { + if (_formKey.currentState! + .saveAndValidate()) { + print(scanMode); + print(_includeOtherInputs); + print(checkerId); + print(assignedArea); + Navigator.push(context, + MaterialPageRoute(builder: + (BuildContext context) { + return BlocProvider< + PassCheckBloc>.value( + value: PassCheckBloc() + ..add(SetScannerSettings( + token: token!, + assignedArea: assignedArea, + checkerId: checkerId!, + entranceExit: scanMode, + includeOtherInputs: + _includeOtherInputs, + roleId: state.roleId)), + child: const QRCodeScanner(), + ); + })); + } + }, + ), + ), + const SizedBox( + height: 52, + ), + ], + ), + ), + ); + } + if (state is PassCheckErrorState) { + return SomethingWentWrong( + message: state.message, onpressed: () { + + context.read().add(GetPassCheckAreas(roleId: widget.roleId, userId: widget.userId)); + }); + } + return Container(); + }, + ); + } + return Container(); + }, ), )), ); diff --git a/lib/sevices/profile/address_service.dart b/lib/sevices/profile/address_service.dart index 5e0478b..cded751 100644 --- a/lib/sevices/profile/address_service.dart +++ b/lib/sevices/profile/address_service.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'package:unit2/theme-data.dart/colors.dart'; - import '../../model/profile/basic_information/adress.dart'; import '../../utils/request.dart'; import '../../utils/urls.dart'; @@ -123,7 +121,7 @@ class AddressService { try { http.Response response = await http.patch( Uri.parse( - 'http://${Url.instance.host()}${Url.instance.addressPath()}$profileId/'), + 'https://${Url.instance.host()}${Url.instance.addressPath()}$profileId/'), headers: headers, body: jsonEncode({ "id": address.id, diff --git a/lib/sevices/profile/profile_service.dart b/lib/sevices/profile/profile_service.dart index 1ed39fb..af057b1 100644 --- a/lib/sevices/profile/profile_service.dart +++ b/lib/sevices/profile/profile_service.dart @@ -106,7 +106,7 @@ class ProfileService { Map body = { "profile_id": profileId, "first_name": profileInfo.firstName, - "middle_name": profileInfo.middleName, + "middle_name": profileInfo.middleName!.isEmpty?null:profileInfo.middleName, "last_name": profileInfo.lastName, "name_extension": profileInfo.nameExtension, "birthdate": profileInfo.birthdate.toString(), diff --git a/lib/sevices/roles/pass_check_services.dart b/lib/sevices/roles/pass_check_services.dart new file mode 100644 index 0000000..3b076a6 --- /dev/null +++ b/lib/sevices/roles/pass_check_services.dart @@ -0,0 +1,265 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:audioplayers/audioplayers.dart'; +import 'package:flutter/services.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:unit2/model/location/barangay.dart'; +import 'package:unit2/model/roles/pass_check/agency_area_type.dart'; +import 'package:unit2/model/roles/pass_check/assign_role_area_type.dart'; +import 'package:unit2/model/roles/pass_check/barangay_assign_area.dart'; +import 'package:unit2/model/roles/pass_check/passer_info.dart'; +import 'package:unit2/utils/global.dart'; +import 'package:http/http.dart' as http; +import 'package:unit2/utils/request.dart'; +import '../../model/roles/pass_check/purok_assign_area.dart'; +import '../../model/roles/pass_check/station_assign_area.dart'; +import '../../utils/urls.dart'; + +class PassCheckServices { + static final PassCheckServices _instance = PassCheckServices(); + static PassCheckServices get instance => _instance; + + Future> getPassCheckArea( + {required int roleId, required int userId}) async { + String path = Url.instance.getAssignAreas(); + Map params = { + "assigned_role__role__id": roleId.toString(), + "assigned_role__user__id": userId.toString() + }; + List? statusResponse; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientSecret + }; + try { + http.Response response = await Request.instance + .getRequest(param: params, headers: headers, path: path); + if (response.statusCode == 200) { + Map data = jsonDecode(response.body); + AssignRoleAreaType assignRoleAreaType = AssignRoleAreaType.fromJson( + data['data'][0]['assigned_role_area_type']); + ////station + if (assignRoleAreaType.areaTypeName.toLowerCase() == "station") { + List assignedArea = []; + data['data'][0]['assigned_area'].forEach((element) { + StationAssignArea stationAssignArea = + StationAssignArea.fromJson(element); + ChildStationInfo headStation = ChildStationInfo( + id: stationAssignArea.area!.id, + stationName: stationAssignArea.area!.stationName, + acroym: stationAssignArea.area!.acronym, + motherStation: true); + ChildStationInfo childStationInfo = ChildStationInfo( + id: stationAssignArea.area!.id, + stationName: stationAssignArea.area!.stationName, + acroym: stationAssignArea.area!.acronym, + motherStation: false); + assignedArea.add(headStation); + assignedArea.add(childStationInfo); + if (stationAssignArea.area?.childStationInfo != null) { + for (var element in stationAssignArea.area!.childStationInfo!) { + ChildStationInfo newStationInfo = ChildStationInfo( + id: element.id, + stationName: element.stationName, + acroym: element.acroym, + motherStation: false); + assignedArea.add(newStationInfo); + } + } + }); + + statusResponse = assignedArea; + } + ////registration in-chage + if (assignRoleAreaType.areaTypeName.toLowerCase() == + "registration in-charge") { + List assignedArea = []; + data['data'][0]['assigned_area'].forEach((element) { + StationAssignArea stationAssignArea = + StationAssignArea.fromJson(element); + ChildStationInfo headStation = ChildStationInfo( + id: stationAssignArea.area!.id, + stationName: stationAssignArea.area!.stationName, + acroym: stationAssignArea.area!.acronym, + motherStation: true); + ChildStationInfo childStationInfo = ChildStationInfo( + id: stationAssignArea.area!.id, + stationName: stationAssignArea.area!.stationName, + acroym: stationAssignArea.area!.acronym, + motherStation: false); + assignedArea.add(headStation); + assignedArea.add(childStationInfo); + if (stationAssignArea.area?.childStationInfo != null) { + for (var element in stationAssignArea.area!.childStationInfo!) { + ChildStationInfo newStationInfo = ChildStationInfo( + id: element.id, + stationName: element.stationName, + acroym: element.acroym, + motherStation: false); + assignedArea.add(newStationInfo); + } + } + }); + statusResponse = assignedArea; + } + ////Barangay + if (assignRoleAreaType.areaTypeName.toLowerCase() == "baranggay") { + List assignedArea = []; + data['data'][0]['assigned_area'].forEach((var element) { + BaragayAssignArea baragayAssignArea = + BaragayAssignArea.fromJson(element['area']); + assignedArea.add(baragayAssignArea); + }); + statusResponse = assignedArea; + } + ////PUROK + if (assignRoleAreaType.areaTypeName.toLowerCase() == 'purok') { + List assignedArea = []; + data['data'][0]['assigned_area'].forEach((var element) { + Purok purok = Purok.fromJson(element['area']); + assignedArea.add(purok); + }); + statusResponse = assignedArea; + } + ////AGENCY + if (assignRoleAreaType.areaTypeName.toLowerCase() == 'agency') { + List assignedArea = []; + data['data'][0]['assigned_area'].forEach((var element) { + AgencyAssignedArea agencyAssignedArea = + AgencyAssignedArea.fromJson(element); + assignedArea.add(agencyAssignedArea); + }); + statusResponse = assignedArea; + } + } + } catch (e) { + throw e.toString(); + } + return statusResponse!; + } + + Future getPasserInfo( + {required String uuid, required String token}) async { + PasserInfo? passerInfo; + String path = Url.instance.getPasserInfo(); + String authtoken = "Token $token"; + Map params = {"uuid": uuid}; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': authtoken + }; + try { + http.Response response = await Request.instance + .getRequest(param: params, path: path, headers: headers); + if (response.statusCode == 200) { + Map body = jsonDecode(response.body); + passerInfo = PasserInfo.fromJson(body['data'][0]); + } + } catch (e) { + throw (e.toString()); + } + return passerInfo; + } + + Future performPostLogs( + {required String passerId, + required int chekerId, + required String io, + required bool otherInputs, + String? destination, + double? temp, + int? stationId, + String? cpId, + required int roleid}) async { + String path = Url.instance.postLogs(); + bool success; + Map headers = { + 'Content-Type': 'application/json; charset=UTF-8', + 'X-Client-Key': xClientKey, + 'X-Client-Secret': xClientSecret + }; + Map body; + if (otherInputs) { + if (roleid == 41 || roleid == 13 || roleid == 17 || roleid == 22) { + if (io == "i") { + print("1"); + body = { + "station_id": stationId, + "temperature": temp, + "passer": passerId, + "checkedby_user_id": chekerId, + "io": io + }; + } else { + print("2"); + body = { + "station_id": stationId, + "destination": destination, + "passer": passerId, + "checkedby_user_id": chekerId, + "io": io + }; + } + } else { + print("3"); + if (io == "i") { + body = { + "cp_id": cpId, + "temperature": temp, + "passer": passerId, + "checkedby_user_id": chekerId, + "io": io + }; + } else { + print("4"); + body = { + "cp_id": cpId, + "destination": destination, + "passer": passerId, + "checkedby_user_id": chekerId, + "io": io + }; + } + } + } else { + print("5"); + if (roleid == 41 || roleid == 13 || roleid == 17 || roleid == 22) { + body = { + "station_id": stationId, + "passer": passerId, + "checkedby_user_id": chekerId, + "io": io + }; + } else { + print("6"); + body = { + "cp_id": cpId, + "temperature": temp, + "passer": passerId, + "checkedby_user_id": chekerId, + "io": io + }; + } + } + try { + http.Response response = await Request.instance + .postRequest(path: path, headers: headers, body: body, param: {}); + if (response.statusCode == 201) { + success = true; + } else { + success = false; + } + } catch (e) { + throw e.toString(); + } + return success; + } +} + +Future setFailedAudio(AudioPlayer audioPlayer) async { + AudioCache player = AudioCache(); + + final url = await player.load("ScanFailed.mp3"); + audioPlayer.play(AssetSource(url.path)); +} diff --git a/lib/utils/app_router.dart b/lib/utils/app_router.dart index efc535b..3bf9c9b 100644 --- a/lib/utils/app_router.dart +++ b/lib/utils/app_router.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:unit2/bloc/profile/profile_bloc.dart'; +import 'package:unit2/bloc/role/pass_check/pass_check_bloc.dart'; import 'package:unit2/bloc/sos/sos_bloc.dart'; import 'package:unit2/screens/sos/index.dart'; +import 'package:unit2/screens/unit2/homepage.dart/components/dashboard.dart'; import 'package:unit2/screens/unit2/homepage.dart/components/menu.dart'; import 'package:unit2/screens/unit2/login/login.dart'; import 'package:unit2/utils/global_context.dart'; @@ -47,15 +49,19 @@ class AppRouter { }); case '/sos': return MaterialPageRoute(builder: (BuildContext context) { - return BlocProvider( + return BlocProvider( create: (_) => SosBloc()..add(LoadUserLocation()), child: const SosScreen(), ); }); - case '/pass-check': - return MaterialPageRoute(builder: (BuildContext context){ - return const QRCodeScannerSettings(); - }); + case '/pass-check': + PassCheckArguments arguments = routeSettings.arguments as PassCheckArguments; + return MaterialPageRoute(builder: (BuildContext context) { + return BlocProvider( + create: (context) => PassCheckBloc()..add(GetPassCheckAreas(roleId: arguments.roleId, userId: arguments.userId)), + child: QRCodeScannerSettings(roleId: arguments.roleId, userId: arguments.userId,), + ); + }); default: return MaterialPageRoute(builder: (context) { return Container(); diff --git a/lib/utils/global.dart b/lib/utils/global.dart index a58ef4a..0b427f7 100644 --- a/lib/utils/global.dart +++ b/lib/utils/global.dart @@ -9,6 +9,8 @@ double safeAreaVertical = 0; double safeBlockHorizontal = 0; double safeBlockVertical = 0; +const xClientKey = "unitK3CQaXiWlPReDsBzmmwBZPd9Re1z"; +const xClientSecret = "unitcYqAN7GGalyz"; diff --git a/lib/utils/urls.dart b/lib/utils/urls.dart index 64c4b21..5dea2f3 100644 --- a/lib/utils/urls.dart +++ b/lib/utils/urls.dart @@ -5,10 +5,10 @@ class Url { String host() { // return '192.168.10.183:3000'; - // return 'agusandelnorte.gov.ph'; + return 'agusandelnorte.gov.ph'; // return "192.168.10.219:3000"; // return "192.168.10.241"; - return "192.168.10.221:3004"; + // return "192.168.10.221:3004"; // return "playweb.agusandelnorte.gov.ph"; // return 'devapi.agusandelnorte.gov.ph:3004'; } @@ -190,6 +190,20 @@ String getGenders(){ return "/api/profile_app/gender/"; } +/////ROLES +// pass check +String getAssignAreas(){ + return "/api/account/auth/assigned_role_area/"; +} + +String getPasserInfo(){ + return "/api/profile_app/person_basicinfo/"; +} + +String postLogs(){ + return "/api/unit2_app/monitoring/pass_check/"; +} + //// location utils path String getCounties(){ diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 4b37fe9..41d8796 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,10 +6,14 @@ #include "generated_plugin_registrant.h" +#include #include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); g_autoptr(FlPluginRegistrar) modal_progress_hud_nsn_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "ModalProgressHudNsnPlugin"); modal_progress_hud_nsn_plugin_register_with_registrar(modal_progress_hud_nsn_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index f64d1cc..64b5f1f 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux modal_progress_hud_nsn platform_device_id_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 7a1cdf6..fa11536 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,22 +5,30 @@ import FlutterMacOS import Foundation +import assets_audio_player +import assets_audio_player_web +import audioplayers_darwin import location import modal_progress_hud_nsn import package_info_plus import path_provider_foundation import platform_device_id import platform_device_id_macos +import rive_common import shared_preferences_foundation import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AssetsAudioPlayerPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerPlugin")) + AssetsAudioPlayerWebPlugin.register(with: registry.registrar(forPlugin: "AssetsAudioPlayerWebPlugin")) + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) ModalProgressHudNsnPlugin.register(with: registry.registrar(forPlugin: "ModalProgressHudNsnPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin")) PlatformDeviceIdMacosPlugin.register(with: registry.registrar(forPlugin: "PlatformDeviceIdMacosPlugin")) + RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index b586442..43d40ba 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,26 @@ packages: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.2" + assets_audio_player: + dependency: "direct main" + description: + name: assets_audio_player + sha256: dcea8cd9c11cd9c34586f2446bfcdf099362159c56f97517ba941ac151974ea9 + url: "https://pub.dev" + source: hosted + version: "3.0.6" + assets_audio_player_web: + dependency: transitive + description: + name: assets_audio_player_web + sha256: "4575ec40033d818ff022d48f7d46e24c01bc632bd1cd36a4f8b58b38e9aa4a81" + url: "https://pub.dev" + source: hosted + version: "3.0.6" async: dependency: transitive description: @@ -57,6 +73,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.10.0" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c + url: "https://pub.dev" + source: hosted + version: "3.0.2" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 + url: "https://pub.dev" + source: hosted + version: "5.0.1" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" + url: "https://pub.dev" + source: hosted + version: "2.0.2" auto_size_text: dependency: "direct main" description: @@ -69,10 +141,10 @@ packages: dependency: "direct main" description: name: awesome_dialog - sha256: ac08268b991f228fc6b8880b68ec030d2941bcc8df8b6a6551fb79f2bd36b7da + sha256: "7da175ea284fa5da0a4d0cbdfe835c5b71d30c7b38c1770c0f27f48272ff5a08" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.0" azlistview: dependency: "direct main" description: @@ -85,10 +157,10 @@ packages: dependency: "direct main" description: name: badges - sha256: d33d4e07197d6e61ddc940640f2b4dc303d3c80887011344940e24d7522f8d26 + sha256: "6e7f3ec561ec08f47f912cfe349d4a1707afdc8dda271e17b046aa6d42c89e77" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.1.1" barcode_scan2: dependency: "direct main" description: @@ -101,10 +173,10 @@ packages: dependency: transitive description: name: bloc - sha256: "658a5ae59edcf1e58aac98b000a71c762ad8f46f1394c34a52050cafb3e11a80" + sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.1.2" boolean_selector: dependency: transitive description: @@ -157,10 +229,10 @@ packages: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e" url: "https://pub.dev" source: hosted - version: "7.2.7" + version: "7.2.7+1" built_collection: dependency: transitive description: @@ -173,10 +245,10 @@ packages: dependency: transitive description: name: built_value - sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" + sha256: "598a2a682e2a7a90f08ba39c0aaa9374c5112340f0a2e275f61b59389543d166" url: "https://pub.dev" source: hosted - version: "8.4.4" + version: "8.6.1" cached_network_image: dependency: "direct main" description: @@ -213,10 +285,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" clock: dependency: transitive description: @@ -229,10 +301,10 @@ packages: dependency: transitive description: name: code_builder - sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + sha256: "4ad01d6e56db961d29661561effde45e519939fdaeb46c351275b182eac70189" url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.5.0" collection: dependency: transitive description: @@ -269,10 +341,10 @@ packages: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" dart_style: dependency: transitive description: @@ -365,10 +437,10 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99 url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.0.2" file: dependency: transitive description: @@ -418,10 +490,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: "434951eea948dbe87f737b674281465f610b8259c16c097b8163ce138749a775" + sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.3" flutter_blurhash: dependency: transitive description: @@ -471,10 +543,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf + sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360" url: "https://pub.dev" source: hosted - version: "2.0.9" + version: "2.0.15" flutter_progress_hud: dependency: "direct main" description: @@ -487,10 +559,10 @@ packages: dependency: "direct main" description: name: flutter_spinkit - sha256: "77a2117c0517ff909221f3160b8eb20052ab5216107581168af574ac1f05dff8" + sha256: b39c753e909d4796906c5696a14daf33639a76e017136c8d82bf3e620ce5bb8e url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.2.0" flutter_svg: dependency: "direct main" description: @@ -529,18 +601,18 @@ packages: dependency: "direct main" description: name: fluttertoast - sha256: "2f9c4d3f4836421f7067a28f8939814597b27614e021da9d63e5d3fb6e212d25" + sha256: "474f7d506230897a3cd28c965ec21c5328ae5605fc9c400cd330e9e9d6ac175c" url: "https://pub.dev" source: hosted - version: "8.2.1" + version: "8.2.2" form_builder_validators: dependency: "direct main" description: name: form_builder_validators - sha256: d0a940d77231723fcb203ad6f5319ff30cd0c4412a6e74d29d826957b1f9afe0 + sha256: f2d90439c56345c23ad8d0c2912e4002cd02563d816f4387c9495051c10d3321 url: "https://pub.dev" source: hosted - version: "8.5.0" + version: "8.6.1" freezed_annotation: dependency: transitive description: @@ -561,10 +633,10 @@ packages: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" globbing: dependency: transitive description: @@ -577,10 +649,10 @@ packages: dependency: transitive description: name: graphs - sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" hive: dependency: "direct main" description: @@ -609,10 +681,10 @@ packages: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" http_multi_server: dependency: transitive description: @@ -665,10 +737,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.8.1" lints: dependency: transitive description: @@ -705,10 +777,10 @@ packages: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" lottie: dependency: transitive description: @@ -801,10 +873,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: cbff87676c352d97116af6dbea05aa28c4d65eb0f6d5677a520c11a69ca9a24d + sha256: "10259b111176fba5c505b102e3a5b022b51dd97e30522e906d6922c745584745" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" package_info_plus_platform_interface: dependency: transitive description: @@ -841,34 +913,34 @@ packages: dependency: "direct main" description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 + sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2" url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.15" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" + sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86" url: "https://pub.dev" source: hosted - version: "2.0.24" + version: "2.0.27" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "818b2dc38b0f178e0ea3f7cf3b28146faab11375985d815942a68eee11c2d0f7" + sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.3" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" + sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57 url: "https://pub.dev" source: hosted - version: "2.1.10" + version: "2.1.11" path_provider_platform_interface: dependency: transitive description: @@ -881,10 +953,10 @@ packages: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 + sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.1.7" pedantic: dependency: transitive description: @@ -897,34 +969,34 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8" + sha256: "1b6b3e73f0bcbc856548bbdfb1c33084a401c4f143e220629a9055233d76c331" url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "10.3.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + sha256: "8f6a95ccbca13766882f95d32684d7c9bfe6c45650c32bedba948ef1c6a4ddf7" url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "10.2.3" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: ee96ac32f5a8e6f80756e25b25b9f8e535816c8e6665a96b6d70681f8c4f7e85 + sha256: "08dcb6ce628ac0b257e429944b4c652c2a4e6af725bdf12b498daa2c6b2b1edb" url: "https://pub.dev" source: hosted - version: "9.0.8" + version: "9.1.0" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + sha256: de20a5c3269229c1ae2e5a6b822f6cb59578b23e8255c93fbeebfc82116e6b11 url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.10.0" permission_handler_windows: dependency: transitive description: @@ -1009,10 +1081,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" url: "https://pub.dev" source: hosted - version: "3.7.2" + version: "3.7.3" pool: dependency: transitive description: @@ -1049,18 +1121,18 @@ packages: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.3" qr: dependency: transitive description: @@ -1081,10 +1153,18 @@ packages: dependency: transitive description: name: rive - sha256: "22e3755b75f4ea4492d2fecf4fc2acf1c8d0073df39781d290a20cbfe74c3760" + sha256: bb7a16bc6a88484fe3136890030b71776ffea368edd2a8368fe99d6430e4a802 url: "https://pub.dev" source: hosted - version: "0.9.1" + version: "0.11.2" + rive_common: + dependency: transitive + description: + name: rive_common + sha256: "5a0dbf689527c51ee5430608181d81460c9c45ab6cc3bd52dd9bbb3d8c4455b6" + url: "https://pub.dev" + source: hosted + version: "0.0.9" rxdart: dependency: transitive description: @@ -1113,34 +1193,34 @@ packages: dependency: "direct main" description: name: searchfield - sha256: deb363c95b9e64ea9ffd1a3b69926b0fe0344daedab872fc42014755a8199de9 + sha256: "62b6653d7194de5a7ea724124846b996d0d211cd3eeeec2e5ca84423650f66f8" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.7.8" shared_preferences: dependency: transitive description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" + sha256: "396f85b8afc6865182610c0a2fc470853d56499f75f7499e2a73a9f0539d23d0" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" + sha256: "6478c6bbbecfe9aced34c483171e90d7c078f5883558b30ec3163cf18402c749" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.4" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: cf2a42fb20148502022861f71698db12d937c7459345a1bdaa88fc91a91b3603 + sha256: e014107bb79d6d3297196f4f2d0db54b5d1f85b8ea8ff63b8e8b391a02700feb url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.2" shared_preferences_linux: dependency: transitive description: @@ -1177,18 +1257,18 @@ packages: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" signature: dependency: "direct main" description: @@ -1201,10 +1281,10 @@ packages: dependency: "direct main" description: name: simple_chips_input - sha256: "522b2e715fe67f325693e003acfd09fc0b8ab25a2c0c87fb8e5ce5b23a8a2ec1" + sha256: "758c2439c74f9105ebb18407095c028e247631108195c38480ea3fb4967c8f6f" url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" sky_engine: dependency: transitive description: flutter @@ -1238,18 +1318,18 @@ packages: dependency: transitive description: name: sqflite - sha256: "500d6fec583d2c021f2d25a056d96654f910662c64f836cd2063167b8f1fa758" + sha256: b4d6710e1200e96845747e37338ea8a819a12b51689a3bcf31eff0003b37a0b9 url: "https://pub.dev" source: hosted - version: "2.2.6" + version: "2.2.8+4" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: "963dad8c4aa2f814ce7d2d5b1da2f36f31bd1a439d8f27e3dc189bb9d26bc684" + sha256: e77abf6ff961d69dfef41daccbb66b51e9983cdd5cb35bf30733598057401555 url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.4.5" stack_trace: dependency: transitive description: @@ -1286,10 +1366,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0" system_info2: dependency: "direct main" description: @@ -1326,18 +1406,18 @@ packages: dependency: "direct main" description: name: toggle_switch - sha256: "82c778c4bfe93af154a41e346ccd1d5b0cb6a50f8f187941412edd0a9bbf51ee" + sha256: "9e6af1f0c5a97d9de41109dc7b9e1b3bbe73417f89b10e0e44dc834fb493d4cb" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.0" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" uuid: dependency: transitive description: @@ -1366,18 +1446,18 @@ packages: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.0" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 + sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "4.1.4" xdg_directories: dependency: transitive description: @@ -1398,10 +1478,10 @@ packages: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: dart: ">2.19.0 <3.0.0" flutter: ">=3.7.0" diff --git a/pubspec.yaml b/pubspec.yaml index cc3557e..8bdae44 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -80,6 +80,9 @@ dependencies: platform_device_id: ^1.0.1 multi_dropdown: ^1.0.9 searchable_paginated_dropdown: ^1.2.0 + audioplayers: ^4.1.0 + assets_audio_player: ^3.0.6 + dev_dependencies: flutter_test: @@ -110,6 +113,7 @@ flutter: - assets/svgs/ - assets/pngs/ - assets/fonts/ + - assets/ # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 458cc68..362613e 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,15 +6,21 @@ #include "generated_plugin_registrant.h" +#include #include #include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); ModalProgressHudNsnPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ModalProgressHudNsnPlugin")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); PlatformDeviceIdWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PlatformDeviceIdWindowsPlugin")); + RivePluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RivePlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 4c970ab..8c00e3e 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,9 +3,11 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows modal_progress_hud_nsn permission_handler_windows platform_device_id_windows + rive_common ) list(APPEND FLUTTER_FFI_PLUGIN_LIST