diff --git a/.env b/.env index 48d17e9..65b6be7 100644 --- a/.env +++ b/.env @@ -1,2 +1,6 @@ +# url = 'http://172.29.85.181:3002/' +# api_url = 'http://172.29.85.181:3002/' +# url = 'https://caleg_backend.kicap-karan.com/' +# api_url = 'https://caleg_backend.kicap-karan.com/' url = 'http://20.20.20.25:3002/' api_url = 'http://20.20.20.25:3002/' \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..d540c3c 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..d540c3c 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..d540c3c 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..d540c3c 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..d540c3c 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..238a7e8 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,29 @@ +PODS: + - Flutter (1.0.0) + - image_picker_ios (0.0.1): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - Flutter (from `Flutter`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + +SPEC CHECKSUMS: + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + +PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 + +COCOAPODS: 1.13.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 0bb604c..18e8888 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 191EFD557D1AA82364065725 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86A2B62E083E1CCEA02C1894 /* Pods_RunnerTests.framework */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 52B9F3E2D8CC4B3BDAE30DE7 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 669765FED0FBF3D5A5D095AD /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,10 +44,16 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 32EAA43DD0EC21E13333CA3F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 38FF4C71CB1F6E24EE8AD914 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 669765FED0FBF3D5A5D095AD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 86A2B62E083E1CCEA02C1894 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -53,8 +61,10 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + D54A41741A424BA45F116E16 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + D693721062B1E6271CFEC5FC /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + D9DACFAE8E13C1E8728992E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + F7845FB6AB2EEDC69026C811 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,12 +72,52 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 52B9F3E2D8CC4B3BDAE30DE7 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C7202CB6BB32706C66B62944 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 191EFD557D1AA82364065725 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1BC4B4463C92C0DB07F5E9AE /* Frameworks */ = { + isa = PBXGroup; + children = ( + 669765FED0FBF3D5A5D095AD /* Pods_Runner.framework */, + 86A2B62E083E1CCEA02C1894 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 404986265B2A745E0B5EA86D /* Pods */ = { + isa = PBXGroup; + children = ( + D54A41741A424BA45F116E16 /* Pods-Runner.debug.xcconfig */, + 32EAA43DD0EC21E13333CA3F /* Pods-Runner.release.xcconfig */, + D9DACFAE8E13C1E8728992E5 /* Pods-Runner.profile.xcconfig */, + F7845FB6AB2EEDC69026C811 /* Pods-RunnerTests.debug.xcconfig */, + 38FF4C71CB1F6E24EE8AD914 /* Pods-RunnerTests.release.xcconfig */, + D693721062B1E6271CFEC5FC /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -79,14 +129,6 @@ name = Flutter; sourceTree = ""; }; - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( @@ -94,6 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + 404986265B2A745E0B5EA86D /* Pods */, + 1BC4B4463C92C0DB07F5E9AE /* Frameworks */, ); sourceTree = ""; }; @@ -128,9 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + E4F3537B38546DAE3F3052CE /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, - 331C807E294A63A400263BE5 /* Frameworks */, 331C807F294A63A400263BE5 /* Resources */, + C7202CB6BB32706C66B62944 /* Frameworks */, ); buildRules = ( ); @@ -146,12 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + E86562CDABA920F1E832DA18 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + AEC0261403AB946B2D5AD936 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -254,6 +301,67 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + AEC0261403AB946B2D5AD936 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + E4F3537B38546DAE3F3052CE /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E86562CDABA920F1E832DA18 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -377,7 +485,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = F7845FB6AB2EEDC69026C811 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -395,7 +503,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = 38FF4C71CB1F6E24EE8AD914 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -411,7 +519,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = D693721062B1E6271CFEC5FC /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/lib/app/app.dart b/lib/app/app.dart index f324aa2..1420e1b 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -9,7 +9,6 @@ import '../services/other_function.dart'; import '../ui/views/admin_index_tracking/admin_first_page/admin_first_page_view.dart'; import '../ui/views/admin_index_tracking/admin_index_tracking_view.dart'; import '../ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart'; -import '../ui/views/admin_index_tracking/halaman_area/halaman_area_view.dart'; import '../ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view.dart'; import '../ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view.dart'; import '../ui/views/admin_index_tracking/halaman_pengaturan/halaman_pengaturan_view.dart'; @@ -29,9 +28,6 @@ import '../ui/views/splash_screen/splash_screen_view.dart'; page: AdminFirstPageView, initial: true, ), - MaterialRoute( - page: HalamanAreaView, - ), MaterialRoute( page: HalamanCalegView, ), diff --git a/lib/app/app.router.dart b/lib/app/app.router.dart index 3b0a2c0..4d6be18 100644 --- a/lib/app/app.router.dart +++ b/lib/app/app.router.dart @@ -9,21 +9,19 @@ import 'package:cek_suara/ui/views/admin_index_tracking/admin_first_page/admin_f as _i6; import 'package:cek_suara/ui/views/admin_index_tracking/admin_index_tracking_view.dart' as _i4; -import 'package:cek_suara/ui/views/admin_index_tracking/halaman_area/halaman_area_view.dart' - as _i7; import 'package:cek_suara/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view.dart' - as _i8; + as _i7; import 'package:cek_suara/ui/views/admin_index_tracking/halaman_pengaturan/halaman_pengaturan_view.dart' - as _i10; -import 'package:cek_suara/ui/views/admin_index_tracking/tim_survei/tim_survei_view.dart' as _i9; +import 'package:cek_suara/ui/views/admin_index_tracking/tim_survei/tim_survei_view.dart' + as _i8; import 'package:cek_suara/ui/views/login_screen/login_screen_view.dart' as _i3; import 'package:cek_suara/ui/views/splash_screen/splash_screen_view.dart' as _i2; import 'package:flutter/material.dart' as _i5; import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart' as _i1; -import 'package:stacked_services/stacked_services.dart' as _i11; +import 'package:stacked_services/stacked_services.dart' as _i10; class Routes { static const splashScreenView = '/'; @@ -86,8 +84,6 @@ class StackedRouter extends _i1.RouterBase { class AdminIndexTrackingViewRoutes { static const adminFirstPageView = ''; - static const halamanAreaView = 'halaman-area-view'; - static const halamanCalegView = 'halaman-caleg-view'; static const timSurveiView = 'tim-survei-view'; @@ -96,7 +92,6 @@ class AdminIndexTrackingViewRoutes { static const all = { adminFirstPageView, - halamanAreaView, halamanCalegView, timSurveiView, halamanPengaturanView, @@ -109,21 +104,17 @@ class AdminIndexTrackingViewRouter extends _i1.RouterBase { AdminIndexTrackingViewRoutes.adminFirstPageView, page: _i6.AdminFirstPageView, ), - _i1.RouteDef( - AdminIndexTrackingViewRoutes.halamanAreaView, - page: _i7.HalamanAreaView, - ), _i1.RouteDef( AdminIndexTrackingViewRoutes.halamanCalegView, - page: _i8.HalamanCalegView, + page: _i7.HalamanCalegView, ), _i1.RouteDef( AdminIndexTrackingViewRoutes.timSurveiView, - page: _i9.TimSurveiView, + page: _i8.TimSurveiView, ), _i1.RouteDef( AdminIndexTrackingViewRoutes.halamanPengaturanView, - page: _i10.HalamanPengaturanView, + page: _i9.HalamanPengaturanView, ), ]; @@ -134,27 +125,21 @@ class AdminIndexTrackingViewRouter extends _i1.RouterBase { settings: data, ); }, - _i7.HalamanAreaView: (data) { + _i7.HalamanCalegView: (data) { return _i5.MaterialPageRoute( - builder: (context) => const _i7.HalamanAreaView(), + builder: (context) => const _i7.HalamanCalegView(), settings: data, ); }, - _i8.HalamanCalegView: (data) { + _i8.TimSurveiView: (data) { return _i5.MaterialPageRoute( - builder: (context) => const _i8.HalamanCalegView(), + builder: (context) => const _i8.TimSurveiView(), settings: data, ); }, - _i9.TimSurveiView: (data) { + _i9.HalamanPengaturanView: (data) { return _i5.MaterialPageRoute( - builder: (context) => const _i9.TimSurveiView(), - settings: data, - ); - }, - _i10.HalamanPengaturanView: (data) { - return _i5.MaterialPageRoute( - builder: (context) => const _i10.HalamanPengaturanView(), + builder: (context) => const _i9.HalamanPengaturanView(), settings: data, ); }, @@ -167,7 +152,7 @@ class AdminIndexTrackingViewRouter extends _i1.RouterBase { Map get pagesMap => _pagesMap; } -extension NavigatorStateExtension on _i11.NavigationService { +extension NavigatorStateExtension on _i10.NavigationService { Future navigateToSplashScreenView([ int? routerId, bool preventDuplicates = true, @@ -225,21 +210,6 @@ extension NavigatorStateExtension on _i11.NavigationService { transition: transition); } - Future - navigateToNestedHalamanAreaViewInAdminIndexTrackingViewRouter([ - int? routerId, - bool preventDuplicates = true, - Map? parameters, - Widget Function(BuildContext, Animation, Animation, Widget)? - transition, - ]) async { - return navigateTo(AdminIndexTrackingViewRoutes.halamanAreaView, - id: routerId, - preventDuplicates: preventDuplicates, - parameters: parameters, - transition: transition); - } - Future navigateToNestedHalamanCalegViewInAdminIndexTrackingViewRouter([ int? routerId, @@ -342,21 +312,6 @@ extension NavigatorStateExtension on _i11.NavigationService { transition: transition); } - Future - replaceWithNestedHalamanAreaViewInAdminIndexTrackingViewRouter([ - int? routerId, - bool preventDuplicates = true, - Map? parameters, - Widget Function(BuildContext, Animation, Animation, Widget)? - transition, - ]) async { - return replaceWith(AdminIndexTrackingViewRoutes.halamanAreaView, - id: routerId, - preventDuplicates: preventDuplicates, - parameters: parameters, - transition: transition); - } - Future replaceWithNestedHalamanCalegViewInAdminIndexTrackingViewRouter([ int? routerId, diff --git a/lib/main.dart b/lib/main.dart index 6676385..b355da0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -11,12 +13,13 @@ import 'app/themes/app_theme.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - await Future.wait([ - dotenv.load(fileName: ".env"), - setupAllLocator(), - ]); - // await dotenv.load(fileName: ".env"); - // await setupAllLocator(); + HttpOverrides.global = MyHttpOverrides(); + // await Future.wait([ + // dotenv.load(fileName: ".env"), + // setupAllLocator(), + // ]); + await dotenv.load(fileName: ".env"); + await setupAllLocator(); runApp(const MyApp()); } @@ -43,3 +46,12 @@ Future setupAllLocator() async { setupBottomSheetUi(); // setupSnackbarUi(); } + +class MyHttpOverrides extends HttpOverrides { + @override + HttpClient createHttpClient(SecurityContext? context) { + return super.createHttpClient(context) + ..badCertificateCallback = + (X509Certificate cert, String host, int port) => true; + } +} diff --git a/lib/model/area_model.dart b/lib/model/area_model.dart index 94c5f76..ba3731c 100644 --- a/lib/model/area_model.dart +++ b/lib/model/area_model.dart @@ -1,14 +1,14 @@ -class AreaListModel { - List? area; +class KecamatanDetail { + List? kecamatan; int? jumlah; - AreaListModel({this.area, this.jumlah}); + KecamatanDetail({this.kecamatan, this.jumlah}); - AreaListModel.fromJson(Map json) { - if (json['area'] != null) { - area = []; - json['area'].forEach((v) { - area!.add(AreaModel.fromJson(v)); + KecamatanDetail.fromJson(Map json) { + if (json['kecamatan'] != null) { + kecamatan = []; + json['kecamatan'].forEach((v) { + kecamatan!.add(KecamatanModel.fromJson(v)); }); } jumlah = json['jumlah']; @@ -16,29 +16,77 @@ class AreaListModel { Map toJson() { final Map data = {}; - if (area != null) { - data['area'] = area!.map((v) => v.toJson()).toList(); + if (kecamatan != null) { + data['kecamatan'] = kecamatan!.map((v) => v.toJson()).toList(); } data['jumlah'] = jumlah; return data; } } -class AreaModel { - int? idArea; - String? namaArea; +class KecamatanModel { + String? kecamatanId; + String? name; - AreaModel({this.idArea, this.namaArea}); + KecamatanModel({this.kecamatanId, this.name}); - AreaModel.fromJson(Map json) { - idArea = json['id_area']; - namaArea = json['nama_area']; + KecamatanModel.fromJson(Map json) { + kecamatanId = json['kecamatan_id']; + name = json['name']; } Map toJson() { final Map data = {}; - data['id_area'] = idArea; - data['nama_area'] = namaArea; + data['kecamatan_id'] = kecamatanId; + data['name'] = name; + return data; + } +} + +class KelurahanDetail { + List? kelurahan; + int? jumlah; + + KelurahanDetail({this.kelurahan, this.jumlah}); + + KelurahanDetail.fromJson(Map json) { + if (json['kelurahan'] != null) { + kelurahan = []; + json['kelurahan'].forEach((v) { + kelurahan!.add(KelurahanModel.fromJson(v)); + }); + } + jumlah = json['jumlah']; + } + + Map toJson() { + final Map data = {}; + if (kelurahan != null) { + data['kelurahan'] = kelurahan!.map((v) => v.toJson()).toList(); + } + data['jumlah'] = jumlah; + return data; + } +} + +class KelurahanModel { + String? kelurahanId; + String? kecamatanId; + String? name; + + KelurahanModel({this.kelurahanId, this.kecamatanId, this.name}); + + KelurahanModel.fromJson(Map json) { + kelurahanId = json['kelurahan_id']; + kecamatanId = json['kecamatan_id']; + name = json['name']; + } + + Map toJson() { + final Map data = {}; + data['kelurahan_id'] = kelurahanId; + data['kecamatan_id'] = kecamatanId; + data['name'] = name; return data; } } diff --git a/lib/model/pemilih_model.dart b/lib/model/pemilih_model.dart index 25644a5..b06cbfe 100644 --- a/lib/model/pemilih_model.dart +++ b/lib/model/pemilih_model.dart @@ -1,13 +1,13 @@ import '../app/app.locator.dart'; import '../services/other_function.dart'; -class PemilihDetailModel { +class PemilihDetail { List? pemilihModel; int? jumlah; - PemilihDetailModel({this.pemilihModel, this.jumlah}); + PemilihDetail({this.pemilihModel, this.jumlah}); - PemilihDetailModel.fromJson(Map json) { + PemilihDetail.fromJson(Map json) { if (json['data'] != null) { pemilihModel = []; json['data'].forEach((v) { @@ -36,7 +36,9 @@ class PemilihModel { String? nikTimSurvei; String? namaTimSurvei; String? namaCaleg; - String? namaArea; + String? kecamatan; + String? kelurahan; + int? tps; String? createdAt; PemilihModel( @@ -46,7 +48,9 @@ class PemilihModel { this.nikTimSurvei, this.namaTimSurvei, this.namaCaleg, - this.namaArea, + this.kecamatan, + this.kelurahan, + this.tps, this.createdAt}); PemilihModel.fromJson(Map json) { @@ -56,7 +60,9 @@ class PemilihModel { nikTimSurvei = json['nik_tim_survei']; namaTimSurvei = json['nama_tim_survei']; namaCaleg = json['nama_caleg']; - namaArea = json['nama_area']; + kecamatan = json['kecamatan']; + kelurahan = json['kelurahan']; + tps = json['tps']; createdAt = myFunction.convertDateTime(json['created_at']); } @@ -68,7 +74,9 @@ class PemilihModel { data['nik_tim_survei'] = nikTimSurvei; data['nama_tim_survei'] = namaTimSurvei; data['nama_caleg'] = namaCaleg; - data['nama_area'] = namaArea; + data['kecamatan'] = kecamatan; + data['kelurahan'] = kelurahan; + data['tps'] = tps; data['created_at'] = createdAt; return data; } diff --git a/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view.dart b/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view.dart index 2193567..dff7959 100644 --- a/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view.dart +++ b/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view.dart @@ -34,143 +34,151 @@ class AdminFirstPageView extends StatelessWidget { child: SafeArea( child: Padding( padding: const EdgeInsets.all(20), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TopContainer( - title: 'Jumlah Area', - value: '${model.jumlahArea} Area', - icon: Icons.place_outlined, - background: warningColor, - ), - const SizedBox(height: 10), - TopContainer( - title: 'Jumlah Caleg', - value: '${model.jumlahCaleg} Caleg', - icon: Icons.co_present_outlined, - background: greenColor, - ), - const SizedBox(height: 10), - TopContainer( - title: 'Tim Survei', - value: '${model.jumlahTimSurvei} Tim Survei', - icon: Icons.co_present_outlined, - background: orangeColor, - ), - const SizedBox(height: 10), - const TopContainer( - title: 'Jumlah Pemilih', - value: '10 Pemilih', - icon: Icons.people_alt_outlined, - background: blueColor, - ), - const SizedBox( - height: 20, - ), - if (model.isBusy) - const Center(child: CircularProgressIndicator()), - if (!model.isBusy && model.status == true) - RichText( - text: TextSpan( - text: 'Selamat Datang, ', - style: regularTextStyle, - children: [ - const TextSpan( - text: 'Admin\n', - style: boldTextStyle, - ), - const TextSpan( - text: 'Silahkan tambahkan data ', - style: regularTextStyle, - ), - TextSpan( - text: 'Area ', - style: boldTextStyle.copyWith( - color: greenColor, - fontStyle: FontStyle.italic, - ), - ), - const TextSpan( - text: 'terlebih dahulu sebelum menambahkan data ', - style: regularTextStyle, - ), - TextSpan( - text: 'Caleg', - style: boldTextStyle.copyWith( - color: greenColor, - fontStyle: FontStyle.italic, - ), - ), - const TextSpan( - text: - '.\n\nData Pemilih akan diambil dari data yang dimasukkan oleh tim survei\n\n', - style: regularTextStyle, - ), - const TextSpan( - text: - 'Jika terjadi kesalahan pada data, silahkan hubungi ', - style: regularTextStyle, - ), - ], - ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // TopContainer( + // title: 'Jumlah\nArea', + // value: '${model.jumlahArea} Area', + // icon: Icons.place_outlined, + // background: warningColor, + // ), + // const SizedBox(height: 10), + TopContainer( + title: 'Jumlah\nCaleg', + value: '${model.jumlahCaleg} Caleg', + icon: Icons.co_present_outlined, + background: greenColor, ), - if (!model.isBusy && model.status == false) - RichText( - text: TextSpan( - text: 'Selamat Datang, ', - style: regularTextStyle, - children: [ - const TextSpan( - text: 'Admin\n', - style: boldTextStyle, - ), - const TextSpan( - text: 'Terjadi ', - style: regularTextStyle, - ), - TextSpan( - text: 'Error ', - style: boldTextStyle.copyWith( - color: redColor, - fontStyle: FontStyle.italic, - ), - ), - const TextSpan( - text: 'pada saat mengambil data\n', - style: regularTextStyle, - ), - const TextSpan( - text: 'Silahkan coba lagi dengan menekan icon', - style: regularTextStyle, - ), - TextSpan( - text: ' Pengaturan\n', - style: boldTextStyle.copyWith( - color: greenColor, - fontStyle: FontStyle.italic, - ), - ), - const TextSpan( - text: 'di pojok kanan bawah\n', - style: regularTextStyle, - ), - ], - ), + const SizedBox(height: 10), + TopContainer( + title: 'Tim\nSurvei', + value: '${model.jumlahTimSurvei} Tim Survei', + icon: Icons.co_present_outlined, + background: orangeColor, ), - ], + const SizedBox(height: 10), + const TopContainer( + title: 'Jumlah\nPemilih', + value: '10 Pemilih', + icon: Icons.people_alt_outlined, + background: blueColor, + ), + const SizedBox( + height: 20, + ), + if (model.isBusy) + const Center(child: CircularProgressIndicator()), + if (!model.isBusy && model.status == true) + RichText( + text: TextSpan( + text: 'Selamat Datang, ', + style: regularTextStyle, + children: [ + const TextSpan( + text: 'Admin\n', + style: boldTextStyle, + ), + const TextSpan( + text: 'Silahkan tambahkan data ', + style: regularTextStyle, + ), + TextSpan( + text: 'Area ', + style: boldTextStyle.copyWith( + color: greenColor, + fontStyle: FontStyle.italic, + ), + ), + const TextSpan( + text: + 'terlebih dahulu sebelum menambahkan data ', + style: regularTextStyle, + ), + TextSpan( + text: 'Caleg', + style: boldTextStyle.copyWith( + color: greenColor, + fontStyle: FontStyle.italic, + ), + ), + const TextSpan( + text: + '.\n\nData Pemilih akan diambil dari data yang dimasukkan oleh tim survei\n\n', + style: regularTextStyle, + ), + const TextSpan( + text: + 'Jika terjadi kesalahan pada data, silahkan hubungi ', + style: regularTextStyle, + ), + ], + ), + ), + if (!model.isBusy && model.status == false) + RichText( + text: TextSpan( + text: 'Selamat Datang, ', + style: regularTextStyle, + children: [ + const TextSpan( + text: 'Admin\n', + style: boldTextStyle, + ), + const TextSpan( + text: 'Terjadi ', + style: regularTextStyle, + ), + TextSpan( + text: 'Error ', + style: boldTextStyle.copyWith( + color: redColor, + fontStyle: FontStyle.italic, + ), + ), + const TextSpan( + text: 'pada saat mengambil data\n', + style: regularTextStyle, + ), + const TextSpan( + text: 'Silahkan coba lagi dengan menekan icon', + style: regularTextStyle, + ), + TextSpan( + text: ' Pengaturan\n', + style: boldTextStyle.copyWith( + color: greenColor, + fontStyle: FontStyle.italic, + ), + ), + const TextSpan( + text: 'di pojok kanan bawah\n', + style: regularTextStyle, + ), + ], + ), + ), + ], + ), ), ), ), ), // with setting icon floatingActionButton: FloatingActionButton( + backgroundColor: warningColor, onPressed: () { // model.gotoSetting(); + model.snackbarService.showSnackbar( + message: 'Fitur belum tersedia', + duration: const Duration(seconds: 2), + ); }, - child: const Icon(Icons.settings), + child: const Icon(Icons.settings, color: fontColor), ), - floatingActionButtonLocation: FloatingActionButtonLocation.miniEndTop, + floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, ); }, ); diff --git a/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view_model.dart b/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view_model.dart index 3427f6e..f6b4bcf 100644 --- a/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view_model.dart +++ b/lib/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view_model.dart @@ -1,6 +1,7 @@ +import 'package:cek_suara/model/area_model.dart'; + import '../../../../app/app.logger.dart'; import '../../../../app/core/custom_base_view_model.dart'; -import '../../../../model/area_model.dart'; import '../../../../model/caleg_model.dart'; import '../../../../model/my_response.model.dart'; import '../../../../model/tim_survei_model.dart'; @@ -24,11 +25,11 @@ class AdminFirstPageViewModel extends CustomBaseViewModel { setBusy(true); globalVar.backPressed = 'cantBack'; try { - var response = await httpService.get('area'); + var response = await httpService.get('area/kecamatan'); log.i(response.data); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - AreaListModel areaListModel = - AreaListModel.fromJson(myResponseModel.data); + KecamatanDetail areaListModel = + KecamatanDetail.fromJson(myResponseModel.data); jumlahArea = areaListModel.jumlah!; response = await httpService.get('caleg'); diff --git a/lib/ui/views/admin_index_tracking/admin_index_tracking_view.dart b/lib/ui/views/admin_index_tracking/admin_index_tracking_view.dart index a27db42..9926b48 100644 --- a/lib/ui/views/admin_index_tracking/admin_index_tracking_view.dart +++ b/lib/ui/views/admin_index_tracking/admin_index_tracking_view.dart @@ -26,6 +26,26 @@ class AdminIndexTrackingView extends StatelessWidget { ) { return SafeArea( child: Scaffold( + appBar: AppBar( + title: Text( + model.header, + style: const TextStyle( + color: fontColor, + fontSize: 20, + ), + ), + backgroundColor: warningColor, + elevation: 0, + automaticallyImplyLeading: false, + actions: [ + IconButton( + onPressed: () { + model.logout(); + }, + icon: const Icon(Icons.logout, color: fontColor), + ), + ], + ), extendBody: false, body: ExtendedNavigator( router: AdminIndexTrackingViewRouter(), diff --git a/lib/ui/views/admin_index_tracking/admin_index_tracking_view_model.dart b/lib/ui/views/admin_index_tracking/admin_index_tracking_view_model.dart index 2a58b6a..cc3aafd 100644 --- a/lib/ui/views/admin_index_tracking/admin_index_tracking_view_model.dart +++ b/lib/ui/views/admin_index_tracking/admin_index_tracking_view_model.dart @@ -11,13 +11,10 @@ class AdminIndexTrackingViewModel extends IndexTrackingViewModel { final log = getLogger('AdminIndexTrackingViewModel'); final globalVar = locator(); final navigationService = locator(); + final dialogService = locator(); + // final mySharedPrefs = locator(); final _bottomNavBarList = [ - { - 'name': 'Area', - 'icon': Icons.place_outlined, - 'header': 'Halaman Area', - }, { 'name': 'Caleg', 'icon': Icons.co_present_outlined, @@ -40,7 +37,6 @@ class AdminIndexTrackingViewModel extends IndexTrackingViewModel { List> get bottomNavBarList => _bottomNavBarList; final List _views = [ - AdminIndexTrackingViewRoutes.halamanAreaView, AdminIndexTrackingViewRoutes.halamanCalegView, AdminIndexTrackingViewRoutes.timSurveiView, AdminIndexTrackingViewRoutes.halamanPengaturanView, @@ -48,7 +44,7 @@ class AdminIndexTrackingViewModel extends IndexTrackingViewModel { Future init() async { globalVar.backPressed = 'exitApp'; - setIndex(3); + setIndex(2); // await super.init(); } @@ -65,4 +61,20 @@ class AdminIndexTrackingViewModel extends IndexTrackingViewModel { id: 2, ); } + + logout() async { + dialogService + .showConfirmationDialog( + title: 'Konfirmasi', + description: 'Apakah anda yakin ingin keluar?', + cancelTitle: 'Batal', + confirmationTitle: 'Keluar', + ) + .then((value) async { + if (value!.confirmed) { + // await mySharedPrefs.clear(); + navigationService.clearStackAndShow(Routes.loginScreenView); + } + }); + } } diff --git a/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart b/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart index 1054c0f..9f45a7e 100644 --- a/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart +++ b/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view.dart @@ -1,9 +1,9 @@ -import 'package:cek_suara/app/themes/app_colors.dart'; -import 'package:cek_suara/app/themes/app_text.dart'; import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import 'package:stacked_services/stacked_services.dart'; +import '../../../../app/themes/app_colors.dart'; +import '../../../../app/themes/app_text.dart'; import './detail_suara_bottom_sheet_view_model.dart'; class DetailSuaraBottomSheetView extends StatelessWidget { @@ -88,13 +88,22 @@ class DetailSuaraBottomSheetView extends StatelessWidget { CrossAxisAlignment.start, children: [ if (request!.description == 'Caleg') - Text( - model.listPemilih[i].namaTimSurvei!, - style: italicTextStyle, - ), - Text( - model.listPemilih[i].namaArea!, - ), + CardWidget( + title: 'Tim', + value: model + .listPemilih[i].namaTimSurvei!), + CardWidget( + title: 'Kec', + value: + model.listPemilih[i].kecamatan!), + CardWidget( + title: 'Kel / Desa', + value: + model.listPemilih[i].kelurahan!), + CardWidget( + title: 'TPS', + value: model.listPemilih[i].tps! + .toString()), ], ), trailing: IconButton( @@ -139,3 +148,48 @@ class DetailSuaraBottomSheetView extends StatelessWidget { ); } } + +class CardWidget extends StatelessWidget { + const CardWidget({ + super.key, + required this.title, + required this.value, + }); + + final String title; + final String value; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + flex: 3, + child: Text( + title, + style: italicTextStyle.copyWith( + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + ), + ), + const Expanded( + flex: 1, + child: Text( + ' : ', + ), + ), + Expanded( + flex: 6, + child: Text( + value, + style: boldTextStyle.copyWith( + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ); + } +} diff --git a/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart b/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart index fdcd55b..d986c15 100644 --- a/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart +++ b/lib/ui/views/admin_index_tracking/detail_suara_bottom_sheet/detail_suara_bottom_sheet_view_model.dart @@ -1,9 +1,8 @@ -import 'package:cek_suara/model/pemilih_model.dart'; - import '../../../../app/app.bottomsheets.dart'; import '../../../../app/app.logger.dart'; import '../../../../app/core/custom_base_view_model.dart'; import '../../../../model/my_response.model.dart'; +import '../../../../model/pemilih_model.dart'; class DetailSuaraBottomSheetViewModel extends CustomBaseViewModel { final log = getLogger('DetailSuaraBottomSheetViewModel'); @@ -23,13 +22,17 @@ class DetailSuaraBottomSheetViewModel extends CustomBaseViewModel { setBusy(true); try { - var response = await httpService.get('caleg/suara/$id'); + // var response = await httpService.get('caleg/suara/$id'); + var response = await httpService + .get('${status == 'Caleg' ? 'caleg' : 'survei'}/suara/$id'); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - PemilihDetailModel pemilihDetailModel = - PemilihDetailModel.fromJson(myResponseModel.data); + PemilihDetail pemilihDetail = + PemilihDetail.fromJson(myResponseModel.data); - listPemilih = pemilihDetailModel.pemilihModel!; - counter = pemilihDetailModel.jumlah!; + log.i(pemilihDetail.pemilihModel!); + + listPemilih = pemilihDetail.pemilihModel!; + counter = pemilihDetail.jumlah!; this.status = true; } catch (e) { this.status = false; diff --git a/lib/ui/views/admin_index_tracking/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart b/lib/ui/views/admin_index_tracking/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart index 13b8c36..bda790d 100644 --- a/lib/ui/views/admin_index_tracking/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart +++ b/lib/ui/views/admin_index_tracking/detail_suara_pemilih_bottom_sheet/detail_suara_pemilih_bottom_sheet_view.dart @@ -41,62 +41,83 @@ class DetailSuaraPemilihBottomSheetView extends StatelessWidget { topRight: Radius.circular(16.0), ), ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - request.title!, - style: boldTextStyle.copyWith( - fontSize: 16, - color: fontColor, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + request.title!, + style: boldTextStyle.copyWith( + fontSize: 16, + color: fontColor, + ), ), - ), - const SizedBox(height: 15), - Container( - height: 100, - width: 150, - decoration: BoxDecoration( - color: mainColor, - borderRadius: BorderRadius.circular(10), - ), - child: GestureDetector( - onTap: () { - model.showImage( - context, - dotenv.env['url']! + request.data!.img!, - ); - }, - child: ClipRRect( + const SizedBox(height: 15), + Container( + height: 100, + width: 150, + decoration: BoxDecoration( + color: mainColor, borderRadius: BorderRadius.circular(10), - child: Image.network( - dotenv.env['url']! + request.data!.img!, - fit: BoxFit.fill, - errorBuilder: (context, error, stackTrace) { - return const Center( - child: Icon( - Icons.error, - color: backgroundColor, - size: 50, - ), - ); - }, + ), + child: GestureDetector( + onTap: () { + model.showImage( + context, + dotenv.env['url']! + request.data!.img!, + ); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.network( + dotenv.env['url']! + request.data!.img!, + fit: BoxFit.fill, + errorBuilder: (context, error, stackTrace) { + return const Center( + child: Icon( + Icons.error, + color: backgroundColor, + size: 50, + ), + ); + }, + ), ), ), ), - ), - _DetailChildWidget( - title: 'Nama', - value: request.data!.namaPemilih!, - ), - _DetailChildWidget( - title: 'No KTP /\nNo HP', - value: request.data!.nikNomorHp!, - ), - _DetailChildWidget( - title: 'Tanggal/\nWaktu', - value: request.data!.createdAt!, - ), - ], + _DetailChildWidget( + title: 'Nama', + value: request.data!.namaPemilih!, + ), + _DetailChildWidget( + title: 'No KTP /\nNo HP', + value: request.data!.nikNomorHp!, + ), + _DetailChildWidget( + title: 'Tanggal/\nWaktu', + value: model.myFunction + .convertDateTime2(request.data!.createdAt!), + ), + _DetailChildWidget( + title: 'Caleg', value: request.data!.namaCaleg!), + _DetailChildWidget( + title: 'Tim Survei', + value: request.data!.namaTimSurvei!, + ), + _DetailChildWidget( + title: 'Kecamatan', + value: request.data!.kecamatan!, + ), + _DetailChildWidget( + title: 'Kelurahan', + value: request.data!.kelurahan!, + ), + _DetailChildWidget( + title: 'TPS', + value: request.data!.tps!.toString(), + ), + ], + ), ), ), ); diff --git a/lib/ui/views/admin_index_tracking/halaman_area/halaman_area_view.dart b/lib/ui/views/admin_index_tracking/halaman_area/halaman_area_view.dart deleted file mode 100644 index a434ca1..0000000 --- a/lib/ui/views/admin_index_tracking/halaman_area/halaman_area_view.dart +++ /dev/null @@ -1,143 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:stacked/stacked.dart'; -import 'package:validatorless/validatorless.dart'; - -import '../../../../app/themes/app_colors.dart'; -import '../../../widgets/my_button.dart'; -import '../../../widgets/my_textformfield.dart'; -import './halaman_area_view_model.dart'; - -class HalamanAreaView extends StatelessWidget { - const HalamanAreaView({super.key}); - - @override - Widget build(BuildContext context) { - return ViewModelBuilder.reactive( - viewModelBuilder: () => HalamanAreaViewModel(), - onViewModelReady: (HalamanAreaViewModel model) async { - await model.init(); - }, - builder: ( - BuildContext context, - HalamanAreaViewModel model, - Widget? child, - ) { - return Scaffold( - body: WillPopScope( - onWillPop: () async { - // model.log.i('backPressed: ${model.globalVar.backPressed}'); - if (model.globalVar.backPressed == 'exitApp') { - // model.back(); - model.quitApp(context); - } - return false; - }, - child: SafeArea( - child: Container( - height: MediaQuery.of(context).size.height, - padding: const EdgeInsets.all(20), - child: Form( - key: model.formKey, - child: Column( - children: [ - MyTextFormField( - hintText: 'Nama Area', - labelText: 'Nama Area', - controller: model.namaAreaController, - validator: Validatorless.required( - 'Nama Area tidak boleh kosong'), - ), - const SizedBox(height: 10), - SizedBox( - width: 250, - child: MyButton( - text: 'Tambah Area', - onPressed: () async { - if (model.formKey.currentState!.validate()) { - // close keyboard - FocusScope.of(context).unfocus(); - bool res = await model.addArea(); - model.log.i('res: $res'); - } - }, - ), - ), - const SizedBox(height: 10), - Expanded( - flex: 3, - child: Container( - height: double.infinity, - width: double.infinity, - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - border: Border.all(color: Colors.grey), - borderRadius: BorderRadius.circular(10), - color: warningColor, - ), - child: Column( - // mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Jumlah Area: ${model.jumlahArea} area', - textAlign: TextAlign.left, - ), - const SizedBox(height: 10), - if (model.isBusy) - const Center( - child: CircularProgressIndicator()), - if (!model.isBusy) - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - if (model.jumlahArea == 0) - Center( - child: model.status == true - ? const Text( - 'Belum ada area diinput') - : const Text( - 'Gagal mengambil data'), - ), - if (model.jumlahArea > 0) - for (var i = 0; - i < model.jumlahArea; - i++) - Card( - child: ListTile( - leading: Text('${i + 1}'), - title: Text( - '${model.listAreaModel[i].namaArea}'), - trailing: IconButton( - // trash bin icon - icon: const Icon( - Icons.delete, - color: Colors.red, - ), - onPressed: () { - model.deleteArea(model - .listAreaModel[i] - .idArea!); - }, - ), - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), - ], - ), - ), - ), - ), - ), - ); - }, - ); - } -} diff --git a/lib/ui/views/admin_index_tracking/halaman_area/halaman_area_view_model.dart b/lib/ui/views/admin_index_tracking/halaman_area/halaman_area_view_model.dart deleted file mode 100644 index 26d5a65..0000000 --- a/lib/ui/views/admin_index_tracking/halaman_area/halaman_area_view_model.dart +++ /dev/null @@ -1,110 +0,0 @@ -import 'package:dio/dio.dart'; -import 'package:flutter/material.dart'; - -import '../../../../app/app.logger.dart'; -import '../../../../app/core/custom_base_view_model.dart'; -import '../../../../app/themes/app_colors.dart'; -import '../../../../model/area_model.dart'; -import '../../../../model/my_response.model.dart'; - -class HalamanAreaViewModel extends CustomBaseViewModel { - final log = getLogger('HalamanAreaViewModel'); - - // variabel - List listAreaModel = []; - int jumlahArea = 0; - bool status = false; - - // add area form - final formKey = GlobalKey(); - TextEditingController namaAreaController = TextEditingController(); - - Future init() async { - globalVar.backPressed = 'exitApp'; - await getData(); - } - - getData() async { - log.i('getData'); - setBusy(true); - globalVar.backPressed = 'cantBack'; - try { - var response = await httpService.get('area'); - log.i(response.data); - MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - AreaListModel areaListModel = - AreaListModel.fromJson(myResponseModel.data); - listAreaModel = areaListModel.area!; - jumlahArea = areaListModel.jumlah!; - - log.i('listAreaModel: $listAreaModel'); - log.i('jumlahArea: $jumlahArea'); - status = true; - } catch (e) { - status = false; - log.e(e); - } finally { - globalVar.backPressed = 'exitApp'; - setBusy(false); - } - } - - Future addArea() async { - log.i('addArea'); - setBusy(true); - globalVar.backPressed = 'cantBack'; - easyLoading.customLoading('Tambah Area..'); - - var formData = FormData.fromMap({ - 'area': namaAreaController.text, - }); - - try { - var response = await httpService.postWithFormData('area', formData); - log.i(response.data); - await getData(); - // reset form - namaAreaController.clear(); - return true; - } catch (e) { - log.e(e); - return false; - } finally { - easyLoading.dismissLoading(); - globalVar.backPressed = 'exitApp'; - setBusy(false); - } - } - - deleteArea(int idArea) { - dialogService - .showDialog( - title: 'Hapus Area', - description: 'Apakah Anda yakin ingin menghapus area ini?', - buttonTitle: 'Hapus', - cancelTitle: 'Batal', - buttonTitleColor: dangerColor, - cancelTitleColor: mainColor, - ) - .then((value) async { - if (value!.confirmed) { - log.i('deleteArea id_area: $idArea'); - setBusy(true); - globalVar.backPressed = 'cantBack'; - easyLoading.customLoading('Hapus Area..'); - - try { - var response = await httpService.delete('area/$idArea'); - log.i(response.data); - await getData(); - } catch (e) { - log.e(e); - } finally { - easyLoading.dismissLoading(); - globalVar.backPressed = 'exitApp'; - setBusy(false); - } - } - }); - } -} diff --git a/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view.dart b/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view.dart index e1cef12..a809bef 100644 --- a/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view.dart +++ b/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view.dart @@ -47,6 +47,11 @@ class HalamanCalegView extends StatelessWidget { Expanded( // flex: 3, child: Container( + alignment: model.isBusy + ? Alignment.center + : (model.listCalegModel.isNotEmpty + ? Alignment.topCenter + : Alignment.center), height: double.infinity, width: double.infinity, padding: const EdgeInsets.all(10), @@ -66,9 +71,11 @@ class HalamanCalegView extends StatelessWidget { : MainAxisAlignment.center), children: [ if (model.isBusy) - const LinearProgressIndicator( - minHeight: 5, - color: mainColor, + const Center( + child: LinearProgressIndicator( + minHeight: 5, + color: mainColor, + ), ), if (!model.isBusy && model.listCalegModel.isNotEmpty) diff --git a/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view_model.dart b/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view_model.dart index 725c1a2..7d3dd51 100644 --- a/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view_model.dart +++ b/lib/ui/views/admin_index_tracking/halaman_caleg/halaman_caleg_view_model.dart @@ -1,9 +1,7 @@ -import 'package:cek_suara/app/themes/app_colors.dart'; - -// import '../../../../app/app.bottomsheets.dart'; import '../../../../app/app.dialogs.dart'; import '../../../../app/app.logger.dart'; import '../../../../app/core/custom_base_view_model.dart'; +import '../../../../app/themes/app_colors.dart'; import '../../../../model/caleg_model.dart'; import '../../../../model/my_response.model.dart'; @@ -58,7 +56,8 @@ class HalamanCalegViewModel extends CustomBaseViewModel { if (res!.confirmed) { snackbarService.showSnackbar( - message: 'Caleg berhasil ditambahkan', + message: + 'Caleg berhasil ditambahkan\nPassword default caleg : 12345678', title: 'Berhasil', duration: const Duration(seconds: 3), ); diff --git a/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view.dart b/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view.dart index 8883bf8..e8ef001 100644 --- a/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view.dart +++ b/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view.dart @@ -136,27 +136,39 @@ class TambahEditCalegView extends StatelessWidget { ], ), ), - if (model.calegModel == null) const SizedBox(height: 10), - if (model.calegModel == null) - MyTextFormField( - hintText: 'Area', - labelText: 'Pencarian Area', - controller: model.cariAreaController, - suffixIcon: GestureDetector( - onTap: () { - // remove keyboard focus - FocusScope.of(context).unfocus(); - model.cariArea(); - }, - child: const Icon(Icons.search), - ), + // if (model.calegModel == null) const SizedBox(height: 10), + // if (model.calegModel == null) + // MyTextFormField( + // hintText: 'Area', + // labelText: 'Pencarian Area', + // controller: model.cariAreaController, + // // suffixIcon: GestureDetector( + // // onTap: () { + // // // remove keyboard focus + // // FocusScope.of(context).unfocus(); + // // model.cariArea(); + // // }, + // // child: const Icon(Icons.search), + // // ), - // controller: model.partaiController, - ), - const SizedBox(height: 10), - SizedBox( + // // controller: model.partaiController, + // ), + const SizedBox(height: 20), + // create a horizontal divider + + const Text("Pilih Kecamatan"), + + Container( height: MediaQuery.of(context).size.height * 0.3, width: double.infinity, + // create a border + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey, + width: 1, + ), + borderRadius: BorderRadius.circular(10), + ), // create 10 random checkbox child: SingleChildScrollView( @@ -175,18 +187,19 @@ class TambahEditCalegView extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Checkbox( - value: model.listAreaId.contains( - model.listAreaModel[index].idArea!), + value: model.listAreaId.contains(model + .listAreaModel[index].kecamatanId!), onChanged: (value) { if (model.calegModel != null) return; model.tambahHapusArea( - model.listAreaModel[index].idArea!, + model.listAreaModel[index] + .kecamatanId!, ); }, ), Expanded( child: Text( - model.listAreaModel[index].namaArea!, + model.listAreaModel[index].name!, ), ), ], diff --git a/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view_model.dart b/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view_model.dart index a9ae3d0..53218be 100644 --- a/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view_model.dart +++ b/lib/ui/views/admin_index_tracking/halaman_caleg/tambah_edit_caleg/tambah_edit_caleg_view_model.dart @@ -19,15 +19,15 @@ class TambahEditCalegViewModel extends CustomBaseViewModel { final log = getLogger('TambahEditCalegViewModel'); // variabel list area - List listAreaModel = []; - List allListAreaModel = []; + List listAreaModel = []; + List allListAreaModel = []; // form variable final formKey = GlobalKey(); TextEditingController namaController = TextEditingController(); TextEditingController cariAreaController = TextEditingController(); TextEditingController nomorUrutController = TextEditingController(); - List listAreaId = []; + List listAreaId = []; // image picker String? _imagePath; @@ -58,13 +58,13 @@ class TambahEditCalegViewModel extends CustomBaseViewModel { var response = await httpService.get('caleg/relasi_area/$idCaleg'); log.i(response.data); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - var data = myResponseModel.data['area']; + var data = myResponseModel.data['kecamatan']; for (var item in data) { - listAreaId.add(item['id_area']); + listAreaId.add(item['kecamatan_id']); } listAreaModel = []; for (var item in allListAreaModel) { - if (listAreaId.contains(item.idArea)) { + if (listAreaId.contains(item.kecamatanId)) { listAreaModel.add(item); } } @@ -85,16 +85,19 @@ class TambahEditCalegViewModel extends CustomBaseViewModel { setBusy(true); globalVar.backPressed = 'cantBack'; try { - var response = await httpService.get('area'); + var response = await httpService.get('area/kecamatan'); log.i(response.data); MyResponseModel myResponseModel = MyResponseModel.fromJson(response.data); - AreaListModel areaListModel = - AreaListModel.fromJson(myResponseModel.data); - listAreaModel = areaListModel.area!; - allListAreaModel = areaListModel.area!; + // log.i(myResponseModel.data); + KecamatanDetail areaListModel = + KecamatanDetail.fromJson(myResponseModel.data); + listAreaModel = areaListModel.kecamatan!; + allListAreaModel = areaListModel.kecamatan!; + // listAreaModel = areaListModel.area!; + // allListAreaModel = areaListModel.area!; // jumlahArea = areaListModel.jumlah!; - log.i('listAreaModel: $listAreaModel'); + // log.i('listAreaModel: $listAreaModel'); // log.i('jumlahArea: $jumlahArea'); } catch (e) { log.e(e); @@ -120,33 +123,33 @@ class TambahEditCalegViewModel extends CustomBaseViewModel { } } - tambahHapusArea(int idArea) { + tambahHapusArea(String kecamatanId) { log.i('tambahHapusArea'); - if (listAreaId.contains(idArea)) { - listAreaId.remove(idArea); + if (listAreaId.contains(kecamatanId)) { + listAreaId.remove(kecamatanId); } else { - listAreaId.add(idArea); + listAreaId.add(kecamatanId); } notifyListeners(); } - cariArea() { - log.i('cariArea ${cariAreaController.text}'); + // cariArea() { + // log.i('cariArea ${cariAreaController.text}'); - if (cariAreaController.text.isEmpty) { - listAreaModel = allListAreaModel; - return; - } + // if (cariAreaController.text.isEmpty) { + // listAreaModel = allListAreaModel; + // return; + // } - listAreaModel = allListAreaModel - .where((element) => element.namaArea! - .toLowerCase() - .contains(cariAreaController.text.toLowerCase())) - .toList(); + // listAreaModel = allListAreaModel + // .where((element) => element.namaArea! + // .toLowerCase() + // .contains(cariAreaController.text.toLowerCase())) + // .toList(); - notifyListeners(); - } + // notifyListeners(); + // } Future addCaleg() async { log.i('addCaleg'); @@ -157,7 +160,7 @@ class TambahEditCalegViewModel extends CustomBaseViewModel { var formData = FormData.fromMap({ 'nama': namaController.text, 'nomor_urut': nomorUrutController.text, - 'area': const JsonEncoder().convert(listAreaId), + 'kecamatan': const JsonEncoder().convert(listAreaId), 'foto': await MultipartFile.fromFile( imageFile!.path, filename: imageFile!.name, diff --git a/lib/ui/views/admin_index_tracking/halaman_pengaturan/halaman_pengaturan_view.dart b/lib/ui/views/admin_index_tracking/halaman_pengaturan/halaman_pengaturan_view.dart index 99ab1c2..c8ade88 100644 --- a/lib/ui/views/admin_index_tracking/halaman_pengaturan/halaman_pengaturan_view.dart +++ b/lib/ui/views/admin_index_tracking/halaman_pengaturan/halaman_pengaturan_view.dart @@ -1,7 +1,7 @@ -import 'package:cek_suara/ui/views/admin_index_tracking/admin_first_page/admin_first_page_view.dart'; import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; +import '../admin_first_page/admin_first_page_view.dart'; import './halaman_pengaturan_view_model.dart'; class HalamanPengaturanView extends StatelessWidget { diff --git a/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view.dart b/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view.dart index 04db5e6..efa17b8 100644 --- a/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view.dart +++ b/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view.dart @@ -76,71 +76,70 @@ class TambahDetailTimSurveiView extends StatelessWidget { ), const SizedBox(height: 20), if (model.timSurveiModel == null) - Column( - children: [ - const Align( - alignment: Alignment.centerLeft, - child: Text( - ' Pilih Caleg', - ), + const Align( + alignment: Alignment.centerLeft, + child: Text( + ' Pilih Caleg', + ), + ), + if (model.isBusy && model.timSurveiModel == null) + const LinearProgressIndicator( + minHeight: 5, + color: mainColor, + ), + if (!model.isBusy && model.listCalegModel.isNotEmpty) + Container( + width: double.infinity, + height: 60, + padding: const EdgeInsets.symmetric(horizontal: 10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25), + border: Border.all( + color: sixthGrey, ), - if (model.isBusy) - const LinearProgressIndicator( - minHeight: 5, - color: mainColor, - ), - if (!model.isBusy && model.listCalegModel.isNotEmpty) - Container( - width: double.infinity, - height: 60, - padding: - const EdgeInsets.symmetric(horizontal: 10), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), - border: Border.all( - color: sixthGrey, - ), - ), - child: Expanded( - child: DropdownButtonHideUnderline( - child: DropdownButton( - isExpanded: true, - value: model.selectedCaleg!, - icon: const Icon(Icons.arrow_drop_down), - iconSize: 24, - elevation: 16, - style: - const TextStyle(color: Colors.black), - onChanged: (String? newValue) { - model.log.i(newValue); - model.selectedCaleg = newValue!; - model.selectedCalegId = model - .listCalegModel - .firstWhere((element) => - element.namaCaleg == - model.selectedCaleg) - .idCaleg; + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + isExpanded: true, + value: model.selectedCaleg!, + icon: const Icon(Icons.arrow_drop_down), + iconSize: 24, + elevation: 16, + style: const TextStyle(color: Colors.black), + onChanged: (String? newValue) { + model.log.i(newValue); + model.selectedCaleg = newValue!; + model.selectedCalegId = model.listCalegModel + .firstWhere((element) => + element.namaCaleg == + model.selectedCaleg) + .idCaleg; - model.log.i(model.selectedCalegId); + model.log.i(model.selectedCalegId); - model.notifyListeners(); - }, - items: model.listCalegString - .map>( - (String value) { - return DropdownMenuItem( - value: value, - child: Text(value, - overflow: TextOverflow.ellipsis), - ); - }).toList()), - ), - ), - ), - const SizedBox(height: 20), - ], + model.notifyListeners(); + }, + items: model.listCalegString + .map>( + (String value) { + return DropdownMenuItem( + value: value, + child: Text(value, + overflow: TextOverflow.ellipsis), + ); + }).toList()), + ), ), if (model.timSurveiModel == null) + const SizedBox(height: 20), + // Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + + // ], + // ), + if (model.timSurveiModel == null && + request.title! == 'Tambah Tim Survei') SizedBox( width: 200, child: MyButton( @@ -169,6 +168,7 @@ class TambahDetailTimSurveiView extends StatelessWidget { ), if (model.timSurveiModel != null) Column( + mainAxisSize: MainAxisSize.min, children: [ MyTextFormField( labelText: 'Caleg', @@ -185,11 +185,13 @@ class TambahDetailTimSurveiView extends StatelessWidget { width: 50, height: 50, decoration: BoxDecoration( - color: mainColor.withOpacity(0.5), + color: mainColor, borderRadius: BorderRadius.circular(50), ), child: IconButton( - onPressed: () {}, + onPressed: () { + model.checkSuara(model.timSurveiModel!); + }, icon: const Icon( Icons.list_alt_outlined, color: Colors.white, diff --git a/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view_model.dart b/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view_model.dart index f092dba..fd59276 100644 --- a/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view_model.dart +++ b/lib/ui/views/admin_index_tracking/tim_survei/tambah_detail_tim_survei/tambah_detail_tim_survei_view_model.dart @@ -1,6 +1,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; +import '../../../../../app/app.bottomsheets.dart'; import '../../../../../app/app.logger.dart'; import '../../../../../app/core/custom_base_view_model.dart'; import '../../../../../model/caleg_model.dart'; @@ -83,4 +84,16 @@ class TambahDetailTimSurveiViewModel extends CustomBaseViewModel { setBusy(false); } } + + checkSuara(TimSurveiModel timSurveiModel) async { + await bottomSheetService.showCustomSheet( + data: timSurveiModel.nik, + barrierDismissible: true, + isScrollControlled: true, + title: 'Detail Suara Tim Survei ${timSurveiModel.nama}', + description: 'Tim Survei', + ignoreSafeArea: false, + variant: BottomSheetType.detailSuaraBottomSheetView, + ); + } } diff --git a/lib/ui/views/admin_index_tracking/tim_survei/tim_survei_view.dart b/lib/ui/views/admin_index_tracking/tim_survei/tim_survei_view.dart index 4c13a1c..018378e 100644 --- a/lib/ui/views/admin_index_tracking/tim_survei/tim_survei_view.dart +++ b/lib/ui/views/admin_index_tracking/tim_survei/tim_survei_view.dart @@ -1,8 +1,8 @@ -import 'package:cek_suara/app/themes/app_text.dart'; import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; import '../../../../app/themes/app_colors.dart'; +import '../../../../app/themes/app_text.dart'; import '../../../widgets/top_container.dart'; import './tim_survei_view_model.dart'; diff --git a/lib/ui/views/login_screen/login_screen_view.dart b/lib/ui/views/login_screen/login_screen_view.dart index 474865f..85f3718 100644 --- a/lib/ui/views/login_screen/login_screen_view.dart +++ b/lib/ui/views/login_screen/login_screen_view.dart @@ -1,9 +1,10 @@ -import 'package:cek_suara/app/themes/app_colors.dart'; -import 'package:cek_suara/ui/widgets/my_button.dart'; -import 'package:cek_suara/ui/widgets/my_textformfield.dart'; import 'package:flutter/material.dart'; import 'package:stacked/stacked.dart'; +import 'package:validatorless/validatorless.dart'; +import '../../../app/themes/app_colors.dart'; +import '../../widgets/my_button.dart'; +import '../../widgets/my_textformfield.dart'; import './login_screen_view_model.dart'; class LoginScreenView extends StatelessWidget { @@ -37,59 +38,80 @@ class LoginScreenView extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10), child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox( - height: 50, - ), - Center( - child: Image.asset( - 'assets/logo.png', - width: 200, - height: 200, + child: Form( + key: model.formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + height: 50, ), - ), - const SizedBox( - height: 10, - ), - const Text( - 'Halaman Login', - ), - const SizedBox( - height: 20, - ), - const MyTextFormField( - // controller: model.usernameController, - hintText: 'Username', - // prefixIcon: Icons.person, - obscureText: false, - ), - const SizedBox( - height: 15, - ), - const MyTextFormField( - // controller: model.passwordController, - hintText: 'Password', - suffixIcon: Icon(Icons.lock), - obscureText: true, - ), - const SizedBox( - height: 20, - ), - SizedBox( - width: 250, - child: MyButton( - // theBackgroundColor: lightColor, - textColor: fontColor, - text: 'Login', - onPressed: () { - model.login(); - }, + Center( + child: Image.asset( + 'assets/logo.png', + width: 200, + height: 200, + ), ), - ), - ], + const SizedBox( + height: 10, + ), + const Text( + 'Halaman Login', + ), + const SizedBox( + height: 20, + ), + MyTextFormField( + controller: model.usernameController, + hintText: 'Username', + validator: Validatorless.required( + 'Username tidak boleh kosong'), + // prefixIcon: Icons.person, + obscureText: false, + ), + const SizedBox( + height: 15, + ), + MyTextFormField( + controller: model.passwordController, + hintText: 'Password', + validator: Validatorless.required( + 'Password tidak boleh kosong'), + suffixIcon: GestureDetector( + onTap: () { + model.isPasswordVisible = + !model.isPasswordVisible; + }, + child: Icon( + model.isPasswordVisible + ? Icons.visibility + : Icons.visibility_off, + color: fontColor, + ), + ), + obscureText: true, + ), + const SizedBox( + height: 20, + ), + SizedBox( + width: 250, + child: MyButton( + // theBackgroundColor: lightColor, + textColor: fontColor, + text: 'Login', + onPressed: () { + if (model.formKey.currentState!.validate()) { + model.login(); + } + // model.login(); + }, + ), + ), + ], + ), ), ), ), diff --git a/lib/ui/views/login_screen/login_screen_view_model.dart b/lib/ui/views/login_screen/login_screen_view_model.dart index 3390a9d..4ba2902 100644 --- a/lib/ui/views/login_screen/login_screen_view_model.dart +++ b/lib/ui/views/login_screen/login_screen_view_model.dart @@ -1,9 +1,16 @@ +import 'package:flutter/material.dart'; + import '../../../app/app.router.dart'; import '../../../app/app.logger.dart'; import '../../../app/core/custom_base_view_model.dart'; class LoginScreenViewModel extends CustomBaseViewModel { + bool isPasswordVisible = true; + final formKey = GlobalKey(); + TextEditingController usernameController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + final log = getLogger('LoginScreenViewModel'); Future init() async { globalVar.backPressed = 'backNormal'; @@ -11,11 +18,22 @@ class LoginScreenViewModel extends CustomBaseViewModel { login() async { easyLoading.customLoading('Login..'); - globalVar.backPressed = 'cantBack'; - await Future.delayed(const Duration(seconds: 2)); - easyLoading.dismissLoading(); - globalVar.backPressed = 'backNormal'; - // navigationService.pushNamedAndRemoveUntil('/home-screen'); - await navigationService.navigateToAdminIndexTrackingView(); + if (usernameController.text == 'admin' && + passwordController.text == 'admin123') { + await Future.delayed(const Duration(seconds: 2)); + easyLoading.dismissLoading(); + globalVar.backPressed = 'backNormal'; + // navigationService.pushNamedAndRemoveUntil('/home-screen'); + await navigationService.navigateToAdminIndexTrackingView(); + } else { + await Future.delayed(const Duration(seconds: 2)); + easyLoading.dismissLoading(); + globalVar.backPressed = 'backNormal'; + snackbarService.showSnackbar( + message: 'Username atau Password salah', + title: 'Login Gagal', + duration: const Duration(seconds: 2), + ); + } } }