Merge pull request 'feature/unit2/UNIT2-#7-Implement-Profile-API' (#8) from feature/unit2/UNIT2-#7-Implement-Profile-API into develop
Reviewed-on: http://git.agusandelnorte.gov.ph:3000/SoftwareDevelopmentSection/unit2-null-safety-repository/pulls/8feature/passo/PASSO-#1-Sync-data-from-device-to-postgre-and-vice-versa
commit
2ef9151258
|
@ -0,0 +1,93 @@
|
||||||
|
PODS:
|
||||||
|
- barcode_scan2 (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- MTBBarcodeScanner
|
||||||
|
- SwiftProtobuf
|
||||||
|
- easy_app_installer (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- Flutter (1.0.0)
|
||||||
|
- fluttertoast (0.0.2):
|
||||||
|
- Flutter
|
||||||
|
- Toast
|
||||||
|
- FMDB (2.7.5):
|
||||||
|
- FMDB/standard (= 2.7.5)
|
||||||
|
- FMDB/standard (2.7.5)
|
||||||
|
- modal_progress_hud_nsn (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- MTBBarcodeScanner (5.0.11)
|
||||||
|
- package_info_plus (0.4.5):
|
||||||
|
- Flutter
|
||||||
|
- path_provider_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- permission_handler_apple (9.0.4):
|
||||||
|
- Flutter
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- sqflite (0.0.2):
|
||||||
|
- Flutter
|
||||||
|
- FMDB (>= 2.7.5)
|
||||||
|
- SwiftProtobuf (1.20.3)
|
||||||
|
- Toast (4.0.0)
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
|
||||||
|
- easy_app_installer (from `.symlinks/plugins/easy_app_installer/ios`)
|
||||||
|
- Flutter (from `Flutter`)
|
||||||
|
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||||
|
- modal_progress_hud_nsn (from `.symlinks/plugins/modal_progress_hud_nsn/ios`)
|
||||||
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
|
||||||
|
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||||
|
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||||
|
|
||||||
|
SPEC REPOS:
|
||||||
|
trunk:
|
||||||
|
- FMDB
|
||||||
|
- MTBBarcodeScanner
|
||||||
|
- SwiftProtobuf
|
||||||
|
- Toast
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
barcode_scan2:
|
||||||
|
:path: ".symlinks/plugins/barcode_scan2/ios"
|
||||||
|
easy_app_installer:
|
||||||
|
:path: ".symlinks/plugins/easy_app_installer/ios"
|
||||||
|
Flutter:
|
||||||
|
:path: Flutter
|
||||||
|
fluttertoast:
|
||||||
|
:path: ".symlinks/plugins/fluttertoast/ios"
|
||||||
|
modal_progress_hud_nsn:
|
||||||
|
:path: ".symlinks/plugins/modal_progress_hud_nsn/ios"
|
||||||
|
package_info_plus:
|
||||||
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
|
path_provider_foundation:
|
||||||
|
:path: ".symlinks/plugins/path_provider_foundation/ios"
|
||||||
|
permission_handler_apple:
|
||||||
|
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
|
||||||
|
sqflite:
|
||||||
|
:path: ".symlinks/plugins/sqflite/ios"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
|
||||||
|
easy_app_installer: 29abe397da7d86721fee853281202f414373f45c
|
||||||
|
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||||
|
fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0
|
||||||
|
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||||
|
modal_progress_hud_nsn: f6fb744cd060653d66ed8f325360ef3650eb2fde
|
||||||
|
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
|
||||||
|
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
||||||
|
path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852
|
||||||
|
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
||||||
|
shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca
|
||||||
|
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||||
|
SwiftProtobuf: b02b5075dcf60c9f5f403000b3b0c202a11b6ae1
|
||||||
|
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
|
||||||
|
|
||||||
|
COCOAPODS: 1.11.3
|
|
@ -3,11 +3,12 @@
|
||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 50;
|
objectVersion = 54;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
|
28FEB91C01FFFF1F3AF03958 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
|
@ -31,7 +32,11 @@
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||||
|
24CA4A0209E683A311335098 /* 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 = "<group>"; };
|
||||||
|
2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||||
|
74181747FCF55E0339265087 /* 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 = "<group>"; };
|
||||||
|
7435055C04EA907D4DF9DEFB /* 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 = "<group>"; };
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
|
@ -49,12 +54,23 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
28FEB91C01FFFF1F3AF03958 /* Pods_Runner.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
53E3B75A4BA5D03DDDC74903 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
74181747FCF55E0339265087 /* Pods-Runner.debug.xcconfig */,
|
||||||
|
7435055C04EA907D4DF9DEFB /* Pods-Runner.release.xcconfig */,
|
||||||
|
24CA4A0209E683A311335098 /* Pods-Runner.profile.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -72,6 +88,8 @@
|
||||||
9740EEB11CF90186004384FC /* Flutter */,
|
9740EEB11CF90186004384FC /* Flutter */,
|
||||||
97C146F01CF9000F007C117D /* Runner */,
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
97C146EF1CF9000F007C117D /* Products */,
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
|
53E3B75A4BA5D03DDDC74903 /* Pods */,
|
||||||
|
B81885F5B040F93E6F30E902 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
@ -98,6 +116,14 @@
|
||||||
path = Runner;
|
path = Runner;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
B81885F5B040F93E6F30E902 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
@ -105,12 +131,14 @@
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
961512EDE7FE1573CFAF92FB /* [CP] Check Pods Manifest.lock */,
|
||||||
9740EEB61CF901F6004384FC /* Run Script */,
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
97C146EA1CF9000F007C117D /* Sources */,
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
97C146EC1CF9000F007C117D /* Resources */,
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
|
CC94AAA4981E9E5E5B1BC9E4 /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
|
@ -171,6 +199,7 @@
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
|
@ -183,8 +212,31 @@
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||||
};
|
};
|
||||||
|
961512EDE7FE1573CFAF92FB /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
|
@ -197,6 +249,23 @@
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||||
};
|
};
|
||||||
|
CC94AAA4981E9E5E5B1BC9E4 /* [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;
|
||||||
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
@ -288,13 +357,14 @@
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
|
DEVELOPMENT_TEAM = 2WLSMMLG6W;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.unit2;
|
PRODUCT_BUNDLE_IDENTIFIER = "uniT-App";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
@ -416,13 +486,14 @@
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
|
DEVELOPMENT_TEAM = 2WLSMMLG6W;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.unit2;
|
PRODUCT_BUNDLE_IDENTIFIER = "uniT-App";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
@ -438,13 +509,14 @@
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
|
DEVELOPMENT_TEAM = 2WLSMMLG6W;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.unit2;
|
PRODUCT_BUNDLE_IDENTIFIER = "uniT-App";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
|
|
|
@ -4,4 +4,7 @@
|
||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Runner.xcodeproj">
|
location = "group:Runner.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
<true/>
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
|
@ -24,6 +26,8 @@
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
|
<true/>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIMainStoryboardFile</key>
|
<key>UIMainStoryboardFile</key>
|
||||||
|
@ -43,9 +47,5 @@
|
||||||
</array>
|
</array>
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
import 'package:barcode_scan2/barcode_scan2.dart';
|
|
||||||
import 'package:bloc/bloc.dart';
|
|
||||||
import 'package:equatable/equatable.dart';
|
|
||||||
import 'package:unit2/model/login_data/user_info/user_data.dart';
|
|
||||||
import 'package:unit2/model/login_data/version_info.dart';
|
|
||||||
import 'package:unit2/screens/unit2/login/functions/get_app_version.dart';
|
|
||||||
import 'package:unit2/sevices/login_service/auth_service.dart';
|
|
||||||
|
|
||||||
import '../../utils/scanner.dart';
|
|
||||||
|
|
||||||
part 'user_event.dart';
|
|
||||||
part 'user_state.dart';
|
|
||||||
|
|
||||||
class UserBloc extends Bloc<UserEvent, UserState> {
|
|
||||||
UserData? _userData;
|
|
||||||
VersionInfo? _versionInfo;
|
|
||||||
UserBloc() : super(UserInitial()) {
|
|
||||||
// this event is called when opening the app to check if
|
|
||||||
// there is new app version
|
|
||||||
on<GetApkVersion>((event, emit) async {
|
|
||||||
try {
|
|
||||||
emit(SplashScreen());
|
|
||||||
VersionInfo versionInfo = await AuthService.instance.getVersionInfo();
|
|
||||||
_versionInfo = versionInfo;
|
|
||||||
String apkVersion = await getAppVersion();
|
|
||||||
emit(VersionLoaded(versionInfo: _versionInfo,apkVersion: apkVersion));
|
|
||||||
} catch (e) {
|
|
||||||
emit(UserError(
|
|
||||||
message: e.toString(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
on<LoadVersion>((event, emit) {
|
|
||||||
emit(VersionLoaded(versionInfo: _versionInfo));
|
|
||||||
});
|
|
||||||
on<UserLogin>((event, emit) async {
|
|
||||||
try {
|
|
||||||
UserData? userData = await AuthService.instance
|
|
||||||
.webLogin(username: event.username, password: event.password);
|
|
||||||
_userData = userData;
|
|
||||||
emit(UserLoggedIn(userData: _userData));
|
|
||||||
} catch (e) {
|
|
||||||
emit(UserError(message: e.toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
on<UuidLogin>((event, emit) async {
|
|
||||||
try {
|
|
||||||
UserData? userData = await AuthService.instance
|
|
||||||
.qrLogin(uuid: event.uuid, password: event.password);
|
|
||||||
_userData = userData;
|
|
||||||
emit(UserLoggedIn(userData: _userData));
|
|
||||||
} catch (e) {
|
|
||||||
emit(UserError(message: e.toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
on<LoadLoggedInUser>((event, emit) {
|
|
||||||
emit(UserLoggedIn(userData: _userData));
|
|
||||||
});
|
|
||||||
on<GetUuid>((event, emit) async {
|
|
||||||
ScanResult result = await QRCodeBarCodeScanner.instance.scanner();
|
|
||||||
if (result.rawContent.toString().isNotEmpty) {
|
|
||||||
emit(UuidLoaded(uuid: result.rawContent.toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/model/profile/educational_background.dart';
|
||||||
|
import 'package:unit2/sevices/profile/education_services.dart';
|
||||||
|
|
||||||
|
part 'education_event.dart';
|
||||||
|
part 'education_state.dart';
|
||||||
|
|
||||||
|
class EducationBloc extends Bloc<EducationEvent, EducationState> {
|
||||||
|
List<EducationalBackground> educationalBackgrounds = [];
|
||||||
|
EducationBloc() : super(EducationInitial()) {
|
||||||
|
on<GetEducationalBackground>((event, emit) async {
|
||||||
|
emit(EducationalBackgroundLoadingState());
|
||||||
|
try {
|
||||||
|
List<EducationalBackground> educations = await EducationService.instace
|
||||||
|
.getEducationalBackground(event.profileId, event.token);
|
||||||
|
educationalBackgrounds = educations;
|
||||||
|
emit(EducationalBackgroundLoadedState(
|
||||||
|
educationalBackground: educationalBackgrounds));
|
||||||
|
} catch (e) {
|
||||||
|
emit(EducationalBackgroundErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
part of 'education_bloc.dart';
|
||||||
|
|
||||||
|
abstract class EducationEvent extends Equatable {
|
||||||
|
const EducationEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
class GetEducationalBackground extends EducationEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetEducationalBackground({required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token];
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
part of 'education_bloc.dart';
|
||||||
|
|
||||||
|
abstract class EducationState extends Equatable {
|
||||||
|
const EducationState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EducationInitial extends EducationState {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class EducationalBackgroundLoadedState extends EducationState{
|
||||||
|
final List<EducationalBackground> educationalBackground;
|
||||||
|
const EducationalBackgroundLoadedState({required this.educationalBackground});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [educationalBackground];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EducationalBackgroundErrorState extends EducationState{
|
||||||
|
final String message;
|
||||||
|
const EducationalBackgroundErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
class EducationalBackgroundLoadingState extends EducationState{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,213 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import '../../../model/location/city.dart';
|
||||||
|
import '../../../model/location/country.dart';
|
||||||
|
import '../../../model/location/provinces.dart';
|
||||||
|
import '../../../model/location/region.dart';
|
||||||
|
import '../../../model/profile/eligibility.dart';
|
||||||
|
import '../../../model/utils/eligibility.dart';
|
||||||
|
import '../../../sevices/profile/eligibility_services.dart';
|
||||||
|
import '../../../utils/location_utilities.dart';
|
||||||
|
import '../../../utils/profile_utilities.dart';
|
||||||
|
part 'eligibility_event.dart';
|
||||||
|
part 'eligibility_state.dart';
|
||||||
|
|
||||||
|
class EligibilityBloc extends Bloc<EligibilityEvent, EligibilityState> {
|
||||||
|
EligibilityBloc() : super(EligibilityInitial()) {
|
||||||
|
List<Country>? globalCountries;
|
||||||
|
List<Region>? globalRegions;
|
||||||
|
List<Eligibility> globalEligibilities = [];
|
||||||
|
List<EligibityCert> eligibilities = [];
|
||||||
|
//// LOAD ELIGIBILTY
|
||||||
|
on<LoadEligibility>((event, emit) {
|
||||||
|
emit(EligibilityLoadingState());
|
||||||
|
if (eligibilities.isEmpty) {
|
||||||
|
GetEligibilities(profileId: event.profileId!, token: event.token!);
|
||||||
|
} else {
|
||||||
|
emit(EligibilityLoaded(eligibilities: eligibilities));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//// DELETE
|
||||||
|
on<DeleteEligibility>((event, emit) async {
|
||||||
|
try {
|
||||||
|
final bool success = await EligibilityService.instance.delete(
|
||||||
|
eligibilityId: event.eligibilityId,
|
||||||
|
profileId: int.parse(event.profileId),
|
||||||
|
token: event.token);
|
||||||
|
if (success) {
|
||||||
|
eligibilities.removeWhere(
|
||||||
|
((EligibityCert element) => element.id == event.eligibilityId));
|
||||||
|
emit(DeletedState(
|
||||||
|
success: success,
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
emit(DeletedState(success: success));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(EligibilityErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//// GET ELIGIBILITY
|
||||||
|
on<GetEligibilities>((event, emit) async {
|
||||||
|
try {
|
||||||
|
if (eligibilities.isNotEmpty) {
|
||||||
|
emit(EligibilityLoaded(eligibilities: eligibilities));
|
||||||
|
} else {
|
||||||
|
emit(EligibilityLoadingState());
|
||||||
|
eligibilities = await EligibilityService.instance
|
||||||
|
.getEligibilities(event.profileId, event.token);
|
||||||
|
emit(EligibilityLoaded(eligibilities: eligibilities));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(EligibilityErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//// SHOW EDIT FORM
|
||||||
|
on<ShowEditEligibilityForm>((event, emit) async {
|
||||||
|
try {
|
||||||
|
if (globalCountries == null) {
|
||||||
|
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||||
|
globalCountries = countries;
|
||||||
|
}
|
||||||
|
if (globalRegions == null) {
|
||||||
|
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||||
|
globalRegions = regions;
|
||||||
|
}
|
||||||
|
if (globalEligibilities.isEmpty) {
|
||||||
|
List<Eligibility> eligibilities =
|
||||||
|
await ProfileUtilities.instance.getEligibilities();
|
||||||
|
globalEligibilities = eligibilities;
|
||||||
|
}
|
||||||
|
Eligibility currentEligibility = globalEligibilities.firstWhere(
|
||||||
|
(Eligibility eligibility) =>
|
||||||
|
event.eligibityCert.eligibility!.id == eligibility.id);
|
||||||
|
bool? isOverseas = event.eligibityCert.overseas;
|
||||||
|
Country currentCountry = globalCountries!.firstWhere(
|
||||||
|
(Country country) =>
|
||||||
|
event.eligibityCert.examAddress!.country!.code == country.code);
|
||||||
|
if (event.eligibityCert.examAddress?.cityMunicipality?.province
|
||||||
|
?.region !=
|
||||||
|
null) {
|
||||||
|
Region currrentRegion = globalRegions!.firstWhere((Region region) =>
|
||||||
|
event.eligibityCert.examAddress!.cityMunicipality!.province!
|
||||||
|
.region!.code ==
|
||||||
|
region.code);
|
||||||
|
List<Province> provinces = await LocationUtils.instance
|
||||||
|
.getProvinces(regionCode: currrentRegion.code.toString());
|
||||||
|
Province currentProvince = provinces.firstWhere((Province province) =>
|
||||||
|
event.eligibityCert.examAddress!.cityMunicipality!.province!
|
||||||
|
.code ==
|
||||||
|
province.code);
|
||||||
|
List<CityMunicipality> cities = await LocationUtils.instance
|
||||||
|
.getCities(code: currentProvince.code.toString());
|
||||||
|
CityMunicipality currentCity = cities.firstWhere(
|
||||||
|
(CityMunicipality cityMunicipality) =>
|
||||||
|
event.eligibityCert.examAddress!.cityMunicipality!.code ==
|
||||||
|
cityMunicipality.code);
|
||||||
|
|
||||||
|
emit(EditEligibilityState(
|
||||||
|
currentCity: currentCity,
|
||||||
|
selectedCountry: currentCountry,
|
||||||
|
currentProvince: currentProvince,
|
||||||
|
currentRegion: currrentRegion,
|
||||||
|
currentEligibility: currentEligibility,
|
||||||
|
provinces: provinces,
|
||||||
|
cities: cities,
|
||||||
|
isOverseas: isOverseas!,
|
||||||
|
eligibityCert: event.eligibityCert,
|
||||||
|
countries: globalCountries!,
|
||||||
|
regions: globalRegions!,
|
||||||
|
eligibilities: globalEligibilities));
|
||||||
|
} else {
|
||||||
|
emit(EditEligibilityState(
|
||||||
|
selectedCountry: currentCountry,
|
||||||
|
currentCity: null,
|
||||||
|
currentProvince: null,
|
||||||
|
currentRegion: null,
|
||||||
|
provinces: null,
|
||||||
|
cities: null,
|
||||||
|
currentEligibility: currentEligibility,
|
||||||
|
isOverseas: isOverseas!,
|
||||||
|
eligibityCert: event.eligibityCert,
|
||||||
|
countries: globalCountries!,
|
||||||
|
regions: globalRegions!,
|
||||||
|
eligibilities: globalEligibilities));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(EligibilityErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//// UPDATE
|
||||||
|
on<UpdateEligibility>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status = await EligibilityService.instance.update(
|
||||||
|
eligibityCert: event.eligibityCert,
|
||||||
|
token: event.token,
|
||||||
|
profileId: int.parse(event.profileId),
|
||||||
|
oldEligibility: event.oldEligibility);
|
||||||
|
if (status['success']) {
|
||||||
|
EligibityCert newEligibility = EligibityCert.fromJson(status['data']);
|
||||||
|
eligibilities.removeWhere(
|
||||||
|
(EligibityCert element) => element.id == event.eligibityCert.id);
|
||||||
|
eligibilities.add(newEligibility);
|
||||||
|
emit(EligibilityEditedState(response: status));
|
||||||
|
} else {
|
||||||
|
emit(EligibilityEditedState(response: status));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(EligibilityErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//// SHOW ADD FORM
|
||||||
|
on<ShowAddEligibilityForm>((event, emit) async {
|
||||||
|
emit(EligibilityLoadingState());
|
||||||
|
if (globalRegions == null) {
|
||||||
|
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||||
|
globalRegions = regions;
|
||||||
|
}
|
||||||
|
if (globalEligibilities.isEmpty) {
|
||||||
|
List<Eligibility> eligibilities =
|
||||||
|
await ProfileUtilities.instance.getEligibilities();
|
||||||
|
globalEligibilities = eligibilities;
|
||||||
|
}
|
||||||
|
if (globalCountries == null) {
|
||||||
|
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||||
|
globalCountries = countries;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(AddEligibilityState(
|
||||||
|
eligibilities: globalEligibilities,
|
||||||
|
regions: globalRegions!,
|
||||||
|
countries: globalCountries!));
|
||||||
|
});
|
||||||
|
|
||||||
|
//// ADD
|
||||||
|
on<AddEligibility>(
|
||||||
|
(event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status = await EligibilityService.instance.add(
|
||||||
|
eligibityCert: event.eligibityCert,
|
||||||
|
token: event.token,
|
||||||
|
profileId: int.parse(event.profileId));
|
||||||
|
if (status['success']) {
|
||||||
|
EligibityCert? eligibityCert =
|
||||||
|
EligibityCert.fromJson(status['data']);
|
||||||
|
eligibilities.add(eligibityCert);
|
||||||
|
emit(EligibilityAddedState(response: status));
|
||||||
|
} else {
|
||||||
|
emit(EligibilityAddedState(response: status));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(EligibilityErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
on<CallErrorState>((event, emit) {
|
||||||
|
emit(const EligibilityErrorState(
|
||||||
|
message: "Something went wrong. Please try again"));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
part of 'eligibility_bloc.dart';
|
||||||
|
|
||||||
|
abstract class EligibilityEvent extends Equatable {
|
||||||
|
const EligibilityEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ShowAddEligibilityForm extends EligibilityEvent {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetEligibilities extends EligibilityEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetEligibilities({required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddEligibility extends EligibilityEvent{
|
||||||
|
final EligibityCert eligibityCert;
|
||||||
|
final String profileId;
|
||||||
|
final String token;
|
||||||
|
const AddEligibility({required this.eligibityCert, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [eligibityCert, profileId, token];
|
||||||
|
}
|
||||||
|
class UpdateEligibility extends EligibilityEvent{
|
||||||
|
final EligibityCert eligibityCert;
|
||||||
|
final String profileId;
|
||||||
|
final String token;
|
||||||
|
final int oldEligibility;
|
||||||
|
const UpdateEligibility({required this.eligibityCert, required this.oldEligibility,required this.profileId, required this.token});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props =>[eligibityCert,profileId,token,oldEligibility];
|
||||||
|
}
|
||||||
|
class LoadEligibility extends EligibilityEvent {
|
||||||
|
final int? profileId;
|
||||||
|
final String? token;
|
||||||
|
const LoadEligibility({ this.profileId, this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ShowEditEligibilityForm extends EligibilityEvent {
|
||||||
|
final EligibityCert eligibityCert;
|
||||||
|
const ShowEditEligibilityForm({required this.eligibityCert});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeleteEligibility extends EligibilityEvent {
|
||||||
|
final String profileId;
|
||||||
|
final int eligibilityId;
|
||||||
|
final String token;
|
||||||
|
const DeleteEligibility(
|
||||||
|
{
|
||||||
|
required this.eligibilityId,
|
||||||
|
required this.profileId,
|
||||||
|
required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [ profileId, eligibilityId, token];
|
||||||
|
}
|
||||||
|
|
||||||
|
class CallErrorState extends EligibilityEvent{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
part of 'eligibility_bloc.dart';
|
||||||
|
|
||||||
|
abstract class EligibilityState extends Equatable {
|
||||||
|
const EligibilityState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EligibilityInitial extends EligibilityState {}
|
||||||
|
|
||||||
|
|
||||||
|
class EditEligibilityState extends EligibilityState {
|
||||||
|
final EligibityCert eligibityCert;
|
||||||
|
final List<Eligibility> eligibilities;
|
||||||
|
final List<Country> countries;
|
||||||
|
final List<Region> regions;
|
||||||
|
final List<Province>? provinces;
|
||||||
|
final List<CityMunicipality>? cities;
|
||||||
|
final bool isOverseas;
|
||||||
|
final Eligibility currentEligibility;
|
||||||
|
final Region? currentRegion;
|
||||||
|
final Province? currentProvince;
|
||||||
|
final CityMunicipality? currentCity;
|
||||||
|
final Country selectedCountry;
|
||||||
|
const EditEligibilityState({
|
||||||
|
required this.provinces,
|
||||||
|
required this.cities,
|
||||||
|
required this.currentProvince,
|
||||||
|
required this.currentCity,
|
||||||
|
required this.currentRegion,
|
||||||
|
required this.currentEligibility,
|
||||||
|
required this.isOverseas,
|
||||||
|
required this.eligibityCert,
|
||||||
|
required this.eligibilities,
|
||||||
|
required this.countries,
|
||||||
|
required this.regions,
|
||||||
|
required this.selectedCountry,
|
||||||
|
});
|
||||||
|
@override
|
||||||
|
List<Object> get props =>
|
||||||
|
[isOverseas, eligibityCert, eligibilities, regions, countries];
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeletedState extends EligibilityState {
|
||||||
|
final bool success;
|
||||||
|
const DeletedState({required this.success});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [success];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddEligibilityState extends EligibilityState {
|
||||||
|
final List<Eligibility> eligibilities;
|
||||||
|
final List<Country> countries;
|
||||||
|
final List<Region> regions;
|
||||||
|
const AddEligibilityState({
|
||||||
|
required this.eligibilities,
|
||||||
|
required this.countries,
|
||||||
|
required this.regions,
|
||||||
|
});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [eligibilities,countries,regions];
|
||||||
|
}
|
||||||
|
class EligibilityEditedState extends EligibilityState{
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const EligibilityEditedState({required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props =>[ response];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EligibilityAddedState extends EligibilityState{
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
|
||||||
|
const EligibilityAddedState({ required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props =>[response];
|
||||||
|
}
|
||||||
|
class EligibilityLoadingState extends EligibilityState{
|
||||||
|
|
||||||
|
}
|
||||||
|
class EligibilityErrorState extends EligibilityState{
|
||||||
|
final String message;
|
||||||
|
const EligibilityErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props =>[message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EligibilityLoaded extends EligibilityState {
|
||||||
|
final List<EligibityCert> eligibilities;
|
||||||
|
const EligibilityLoaded({required this.eligibilities});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [eligibilities];
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/sevices/profile/family_services.dart';
|
||||||
|
|
||||||
|
import '../../../model/profile/family_backround.dart';
|
||||||
|
|
||||||
|
part 'family_event.dart';
|
||||||
|
part 'family_state.dart';
|
||||||
|
|
||||||
|
class FamilyBloc extends Bloc<FamilyEvent, FamilyState> {
|
||||||
|
FamilyBloc() : super(FamilyInitial()) {
|
||||||
|
List<FamilyBackground> families = [];
|
||||||
|
on<GetFamilies>((event, emit) async{
|
||||||
|
emit(FamilyLoadingState());
|
||||||
|
try{
|
||||||
|
List<FamilyBackground> family = await FamilyService.instance.getFamilies(event.profileId, event.token);
|
||||||
|
families = family;
|
||||||
|
emit(FamilyLoaded(families: families));
|
||||||
|
}catch(e){
|
||||||
|
emit(FamilyErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
part of 'family_bloc.dart';
|
||||||
|
|
||||||
|
abstract class FamilyEvent extends Equatable {
|
||||||
|
const FamilyEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetFamilies extends FamilyEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetFamilies({required this.profileId, required this.token});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token];
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
part of 'family_bloc.dart';
|
||||||
|
|
||||||
|
abstract class FamilyState extends Equatable {
|
||||||
|
const FamilyState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class FamilyInitial extends FamilyState {}
|
||||||
|
|
||||||
|
class FamilyLoaded extends FamilyState{
|
||||||
|
final List<FamilyBackground> families;
|
||||||
|
const FamilyLoaded({required this.families});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [families];
|
||||||
|
}
|
||||||
|
|
||||||
|
class FamilyErrorState extends FamilyState{
|
||||||
|
final String message;
|
||||||
|
const FamilyErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
class FamilyLoadingState extends FamilyState{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/sevices/profile/learningDevelopment_service.dart';
|
||||||
|
|
||||||
|
import '../../../model/profile/learning_development.dart';
|
||||||
|
|
||||||
|
part 'learning_development_event.dart';
|
||||||
|
part 'learning_development_state.dart';
|
||||||
|
|
||||||
|
class LearningDevelopmentBloc
|
||||||
|
extends Bloc<LearningDevelopmentEvent, LearningDevelopmentState> {
|
||||||
|
LearningDevelopmentBloc() : super(LearningDevelopmentInitial()) {
|
||||||
|
List<LearningDevelopement> learningsAndDevelopments;
|
||||||
|
on<GetLearningDevelopments>((event, emit) async {
|
||||||
|
// try {
|
||||||
|
emit(LearningDevelopmentLoadingState());
|
||||||
|
List<LearningDevelopement> learnings = await LearningDevelopmentServices
|
||||||
|
.instance
|
||||||
|
.getLearningDevelopments(event.profileId, event.token);
|
||||||
|
learningsAndDevelopments = learnings;
|
||||||
|
emit(LearningDevelopmentLoadedState(
|
||||||
|
learningsAndDevelopment: learningsAndDevelopments));
|
||||||
|
// } catch (e) {
|
||||||
|
// emit(LeaningDevelopmentErrorState(message: e.toString()));
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
part of 'learning_development_bloc.dart';
|
||||||
|
|
||||||
|
abstract class LearningDevelopmentEvent extends Equatable {
|
||||||
|
const LearningDevelopmentEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetLearningDevelopments extends LearningDevelopmentEvent {
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetLearningDevelopments({required this.profileId, required this.token});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId, token];
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
part of 'learning_development_bloc.dart';
|
||||||
|
|
||||||
|
abstract class LearningDevelopmentState extends Equatable {
|
||||||
|
const LearningDevelopmentState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LearningDevelopmentInitial extends LearningDevelopmentState {}
|
||||||
|
|
||||||
|
class LearningDevelopmentLoadedState extends LearningDevelopmentState{
|
||||||
|
final List<LearningDevelopement> learningsAndDevelopment;
|
||||||
|
const LearningDevelopmentLoadedState({required this.learningsAndDevelopment});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [learningsAndDevelopment];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LeaningDevelopmentErrorState extends LearningDevelopmentState{
|
||||||
|
final String message;
|
||||||
|
const LeaningDevelopmentErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LearningDevelopmentLoadingState extends LearningDevelopmentState{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/sevices/skillshobbies_services.dart';
|
||||||
|
|
||||||
|
import '../../../../model/profile/other_information/skills_and_hobbies.dart';
|
||||||
|
|
||||||
|
part 'hoobies_event.dart';
|
||||||
|
part 'hoobies_state.dart';
|
||||||
|
|
||||||
|
class HoobiesBloc extends Bloc<HobbiesEvent, HobbiesState> {
|
||||||
|
HoobiesBloc() : super(HoobiesInitial()) {
|
||||||
|
List<SkillsHobbies> skillsAndHobbies = [];
|
||||||
|
List<SkillsHobbies> allSkillsAndHobbies = [];
|
||||||
|
List<String> mySkillsAndHobbies = [];
|
||||||
|
on<GetSkillsHobbies>((event, emit) async {
|
||||||
|
emit(HobbiesLoadingState());
|
||||||
|
try {
|
||||||
|
List<SkillsHobbies> hobbies = await SkillsHobbiesServices.instance
|
||||||
|
.getSkillsHobbies(event.profileId, event.token);
|
||||||
|
skillsAndHobbies = hobbies;
|
||||||
|
emit(HobbiesLoadedState(skillsAndHobbies: skillsAndHobbies));
|
||||||
|
} catch (e) {
|
||||||
|
emit(HobbiesErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
on<LoadHobbiesSkills>((event,emit){
|
||||||
|
skillsAndHobbies = event.skillsHobbies;
|
||||||
|
emit(HobbiesLoadedState(skillsAndHobbies: skillsAndHobbies));
|
||||||
|
});
|
||||||
|
////SHOW ADD FORM
|
||||||
|
on<ShowHobbySkillAddForm>((event, emit) async {
|
||||||
|
emit(HobbiesLoadingState());
|
||||||
|
try {
|
||||||
|
////get all skills and hobbies
|
||||||
|
if (allSkillsAndHobbies.isEmpty) {
|
||||||
|
allSkillsAndHobbies =
|
||||||
|
await SkillsHobbiesServices.instance.getAllSkillsHobbies();
|
||||||
|
}
|
||||||
|
for (var element in skillsAndHobbies) {
|
||||||
|
mySkillsAndHobbies.add(element.name!);
|
||||||
|
}
|
||||||
|
allSkillsAndHobbies.sort((a, b) => a.name!.compareTo(b.name!));
|
||||||
|
emit(AddHobbySkillState(
|
||||||
|
mySkillsAndHobbiesString: mySkillsAndHobbies,
|
||||||
|
allSkillsAndHobbies: allSkillsAndHobbies,
|
||||||
|
mySkillsAndHobbiesObject: skillsAndHobbies));
|
||||||
|
} catch (e) {
|
||||||
|
emit(HobbiesErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////GET ADDED SKILLS HOBBIES
|
||||||
|
on<GetAddedHobbiesSkills>((event, emit) {
|
||||||
|
emit(HobbiesLoadingState());
|
||||||
|
List<String> added = event.addedHobbiesSkills.split(",");
|
||||||
|
|
||||||
|
for (var element in added) {
|
||||||
|
if (element.isNotEmpty) {
|
||||||
|
SkillsHobbies newSkillsHobbies =
|
||||||
|
SkillsHobbies(id: null, name: element.toUpperCase());
|
||||||
|
skillsAndHobbies.add(newSkillsHobbies);
|
||||||
|
allSkillsAndHobbies.add(newSkillsHobbies);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (var element in skillsAndHobbies) {
|
||||||
|
mySkillsAndHobbies.add(element.name!);
|
||||||
|
}
|
||||||
|
allSkillsAndHobbies.sort((a, b) => a.name!.compareTo(b.name!));
|
||||||
|
emit(AddHobbySkillState(
|
||||||
|
mySkillsAndHobbiesString: mySkillsAndHobbies,
|
||||||
|
allSkillsAndHobbies: allSkillsAndHobbies,
|
||||||
|
mySkillsAndHobbiesObject: skillsAndHobbies));
|
||||||
|
});
|
||||||
|
////SHOW ADD MODAL
|
||||||
|
on<ShowAddModal>((event, emit) {
|
||||||
|
emit(ShowAddModalState());
|
||||||
|
});
|
||||||
|
|
||||||
|
//// ADD
|
||||||
|
on<AddHobbyAndSkills>((event, emit) async {
|
||||||
|
emit(HobbiesLoadingState());
|
||||||
|
Map<dynamic, dynamic> response = await SkillsHobbiesServices.instance.add(
|
||||||
|
skillsHobbies: event.skillsHobbies,
|
||||||
|
profileId: event.profileId,
|
||||||
|
token: event.token);
|
||||||
|
List<SkillsHobbies> newSkillsHobbies = [];
|
||||||
|
if (response['success']) {
|
||||||
|
if (response['data']['skill_hobby'] != null) {
|
||||||
|
for (var element in response['data']['skill_hobby']) {
|
||||||
|
newSkillsHobbies.add(SkillsHobbies.fromJson(element));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skillsAndHobbies = newSkillsHobbies;
|
||||||
|
emit(HobbiesAndSkillsAddedState(
|
||||||
|
mySkillsAndHobbies: skillsAndHobbies, status: response));
|
||||||
|
} else {
|
||||||
|
emit(HobbiesAndSkillsAddedState(
|
||||||
|
mySkillsAndHobbies: skillsAndHobbies, status: response));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////DELETE
|
||||||
|
on<DeleteSkillHobbies>((event,emit)async{
|
||||||
|
emit(HobbiesLoadingState());
|
||||||
|
// try{
|
||||||
|
bool success = await SkillsHobbiesServices.instance.delete(profileId: event.profileId, token: event.token, skillsHobbies: event.skillsHobbies);
|
||||||
|
if(success){
|
||||||
|
skillsAndHobbies.removeWhere((element) => element.id == event.skillsHobbies[0].id);
|
||||||
|
emit(HobbiesAndSkillsDeletedState(skillsHobbies: skillsAndHobbies, success: success));
|
||||||
|
}else{
|
||||||
|
emit(HobbiesAndSkillsDeletedState(skillsHobbies: skillsAndHobbies, success: success));
|
||||||
|
}
|
||||||
|
// }catch(e){
|
||||||
|
// emit (HobbiesErrorState(message: e.toString()));
|
||||||
|
// }
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
part of 'hoobies_bloc.dart';
|
||||||
|
|
||||||
|
abstract class HobbiesEvent extends Equatable {
|
||||||
|
const HobbiesEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetSkillsHobbies extends HobbiesEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetSkillsHobbies({required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token];
|
||||||
|
}
|
||||||
|
class ShowHobbySkillAddForm extends HobbiesEvent{
|
||||||
|
|
||||||
|
const ShowHobbySkillAddForm();
|
||||||
|
|
||||||
|
}
|
||||||
|
class AddHobbyAndSkills extends HobbiesEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final List<SkillsHobbies> skillsHobbies;
|
||||||
|
const AddHobbyAndSkills({required this.profileId,required this.token, required this.skillsHobbies});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetAddedHobbiesSkills extends HobbiesEvent{
|
||||||
|
final String addedHobbiesSkills;
|
||||||
|
|
||||||
|
|
||||||
|
const GetAddedHobbiesSkills({required this.addedHobbiesSkills});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [addedHobbiesSkills];
|
||||||
|
}
|
||||||
|
class ShowAddModal extends HobbiesEvent{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadHobbiesSkills extends HobbiesEvent{
|
||||||
|
final List<SkillsHobbies> skillsHobbies;
|
||||||
|
const LoadHobbiesSkills({required this.skillsHobbies});
|
||||||
|
}
|
||||||
|
class DeleteSkillHobbies extends HobbiesEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final List<SkillsHobbies> skillsHobbies;
|
||||||
|
const DeleteSkillHobbies({required this.profileId, required this.skillsHobbies, required this.token});
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
part of 'hoobies_bloc.dart';
|
||||||
|
|
||||||
|
abstract class HobbiesState extends Equatable {
|
||||||
|
const HobbiesState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class HoobiesInitial extends HobbiesState {}
|
||||||
|
|
||||||
|
class HobbiesLoadedState extends HobbiesState{
|
||||||
|
final List<SkillsHobbies> skillsAndHobbies;
|
||||||
|
const HobbiesLoadedState({required this.skillsAndHobbies});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [skillsAndHobbies];
|
||||||
|
}
|
||||||
|
class HobbiesErrorState extends HobbiesState{
|
||||||
|
final String message;
|
||||||
|
const HobbiesErrorState({required this.message});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
|
||||||
|
}
|
||||||
|
class AddHobbySkillState extends HobbiesState{
|
||||||
|
final List<String> mySkillsAndHobbiesString;
|
||||||
|
final List<SkillsHobbies> allSkillsAndHobbies;
|
||||||
|
final List<SkillsHobbies> mySkillsAndHobbiesObject;
|
||||||
|
|
||||||
|
const AddHobbySkillState({required this.mySkillsAndHobbiesString,required this.allSkillsAndHobbies,required this.mySkillsAndHobbiesObject});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [mySkillsAndHobbiesString,allSkillsAndHobbies,mySkillsAndHobbiesObject];
|
||||||
|
}
|
||||||
|
|
||||||
|
class HobbiesLoadingState extends HobbiesState{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//// show add modal for adding new skills and hobbies
|
||||||
|
class ShowAddModalState extends HobbiesState{
|
||||||
|
|
||||||
|
}
|
||||||
|
//// hobbies and skills already added
|
||||||
|
class HobbiesAndSkillsAddedState extends HobbiesState{
|
||||||
|
final List<SkillsHobbies> mySkillsAndHobbies;
|
||||||
|
final Map<dynamic,dynamic> status;
|
||||||
|
const HobbiesAndSkillsAddedState({required this.mySkillsAndHobbies, required this.status});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [mySkillsAndHobbies,status];
|
||||||
|
}
|
||||||
|
class HobbiesAndSkillsDeletedState extends HobbiesState{
|
||||||
|
final bool success;
|
||||||
|
final List<SkillsHobbies> skillsHobbies;
|
||||||
|
const HobbiesAndSkillsDeletedState({required this.skillsHobbies,required this.success});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/sevices/profile/non_academic_services.dart';
|
||||||
|
|
||||||
|
import '../../../../model/profile/other_information/non_acedimic_recognition.dart';
|
||||||
|
import '../../../../model/utils/agency.dart';
|
||||||
|
import '../../../../model/utils/category.dart';
|
||||||
|
import '../../../../utils/profile_utilities.dart';
|
||||||
|
|
||||||
|
part 'non_academic_recognition_event.dart';
|
||||||
|
part 'non_academic_recognition_state.dart';
|
||||||
|
|
||||||
|
class NonAcademicRecognitionBloc
|
||||||
|
extends Bloc<NonAcademicRecognitionEvent, NonAcademicRecognitionState> {
|
||||||
|
NonAcademicRecognitionBloc() : super(NonAcademicRecognitionInitial()) {
|
||||||
|
List<NonAcademicRecognition> nonAcademicRecognitions = [];
|
||||||
|
List<Agency> agencies = [];
|
||||||
|
List<Category> agencyCategory = [];
|
||||||
|
////GET
|
||||||
|
on<GetNonAcademicRecognition>((event, emit) async {
|
||||||
|
emit(NonAcademicRecognitionLoadingState());
|
||||||
|
try {
|
||||||
|
if (nonAcademicRecognitions.isEmpty) {
|
||||||
|
List<NonAcademicRecognition> recognitions =
|
||||||
|
await NonAcademicRecognitionServices.instance
|
||||||
|
.getNonAcademicRecognition(event.profileId!, event.token!);
|
||||||
|
nonAcademicRecognitions = recognitions;
|
||||||
|
emit(NonAcademicRecognitionLoadedState(
|
||||||
|
nonAcademicRecognition: nonAcademicRecognitions));
|
||||||
|
} else {
|
||||||
|
emit(NonAcademicRecognitionLoadedState(
|
||||||
|
nonAcademicRecognition: nonAcademicRecognitions));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
////LOAD
|
||||||
|
on<LoadNonAcademeRecognition>((event,emit){
|
||||||
|
nonAcademicRecognitions = event.nonAcademicRecognitions;
|
||||||
|
emit(NonAcademicRecognitionLoadedState(nonAcademicRecognition: nonAcademicRecognitions));
|
||||||
|
});
|
||||||
|
////SHOW ADD FORM
|
||||||
|
on<ShowAddNonAcademeRecognitionForm>(
|
||||||
|
(event, emit) async {
|
||||||
|
emit(NonAcademicRecognitionLoadingState());
|
||||||
|
try {
|
||||||
|
if (agencies.isEmpty) {
|
||||||
|
List<Agency> newAgencies =
|
||||||
|
await ProfileUtilities.instance.getAgecies();
|
||||||
|
agencies = newAgencies;
|
||||||
|
}
|
||||||
|
if (agencyCategory.isEmpty) {
|
||||||
|
List<Category> newAgencyCategories =
|
||||||
|
await ProfileUtilities.instance.agencyCategory();
|
||||||
|
agencyCategory = newAgencyCategories;
|
||||||
|
}
|
||||||
|
emit(AddNonAcademeRecognitionState(
|
||||||
|
agencies: agencies, agencyCategories: agencyCategory));
|
||||||
|
} catch (e) {
|
||||||
|
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
////SHOW EDIT FORM
|
||||||
|
on<ShowEditNonAcademicRecognitionForm>((event, emit) async {
|
||||||
|
emit(NonAcademicRecognitionLoadingState());
|
||||||
|
try {
|
||||||
|
if (agencies.isEmpty) {
|
||||||
|
List<Agency> newAgencies =
|
||||||
|
await ProfileUtilities.instance.getAgecies();
|
||||||
|
agencies = newAgencies;
|
||||||
|
}
|
||||||
|
if (agencyCategory.isEmpty) {
|
||||||
|
List<Category> newAgencyCategories =
|
||||||
|
await ProfileUtilities.instance.agencyCategory();
|
||||||
|
agencyCategory = newAgencyCategories;
|
||||||
|
}
|
||||||
|
emit(EditNonAcademeRecognitionState(
|
||||||
|
agencies: agencies,
|
||||||
|
agencyCategories: agencyCategory,
|
||||||
|
nonAcademicRecognition: event.nonAcademicRecognition));
|
||||||
|
} catch (e) {
|
||||||
|
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////ADD
|
||||||
|
on<AddNonAcademeRecognition>((event, emit) async {
|
||||||
|
emit(NonAcademicRecognitionLoadingState());
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status =
|
||||||
|
await NonAcademicRecognitionServices.instance.add(
|
||||||
|
token: event.token,
|
||||||
|
profileId: event.profileId,
|
||||||
|
nonAcademicRecognition: event.nonAcademicRecognition);
|
||||||
|
if (status['success']) {
|
||||||
|
NonAcademicRecognition nonAcademicRecognition =
|
||||||
|
NonAcademicRecognition.fromJson(status['data']);
|
||||||
|
nonAcademicRecognitions.add(nonAcademicRecognition);
|
||||||
|
emit(NonAcademeRecognitionAddedState(
|
||||||
|
response: status,
|
||||||
|
nonAcademicRecognition: nonAcademicRecognitions));
|
||||||
|
} else {
|
||||||
|
emit(NonAcademeRecognitionAddedState(
|
||||||
|
response: status,
|
||||||
|
nonAcademicRecognition: nonAcademicRecognitions));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////EDIT
|
||||||
|
on<EditNonAcademeRecognition>((event, emit) async {
|
||||||
|
emit(NonAcademicRecognitionLoadingState());
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status =
|
||||||
|
await NonAcademicRecognitionServices.instance.update(
|
||||||
|
nonAcademicRecognition: event.nonAcademicRecognition,
|
||||||
|
profileId: event.profileId,
|
||||||
|
token: event.token);
|
||||||
|
if (status['success']) {
|
||||||
|
NonAcademicRecognition newNonAcademeRecognition =
|
||||||
|
NonAcademicRecognition.fromJson(status['data']);
|
||||||
|
nonAcademicRecognitions.removeWhere(
|
||||||
|
(element) => element.id == event.nonAcademicRecognition.id);
|
||||||
|
nonAcademicRecognitions.add(newNonAcademeRecognition);
|
||||||
|
emit(NonAcademeRecognitionEditedState(
|
||||||
|
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||||
|
response: status));
|
||||||
|
}else{
|
||||||
|
emit(NonAcademeRecognitionEditedState(
|
||||||
|
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||||
|
response: status));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
////DELETE
|
||||||
|
on<DeleteNonAcademeRecognition>((event, emit) async {
|
||||||
|
emit(NonAcademicRecognitionLoadingState());
|
||||||
|
try {
|
||||||
|
final bool success = await NonAcademicRecognitionServices.instance
|
||||||
|
.delete(
|
||||||
|
title: event.nonAcademicRecognition.title!,
|
||||||
|
id: event.nonAcademicRecognition.id!,
|
||||||
|
token: event.token,
|
||||||
|
profileId: event.profileId);
|
||||||
|
if (success) {
|
||||||
|
event.nonAcademicRecognitions.removeWhere(
|
||||||
|
(element) => element.id == event.nonAcademicRecognition.id);
|
||||||
|
nonAcademicRecognitions = event.nonAcademicRecognitions;
|
||||||
|
emit(NonAcademeRecognitionDeletedState(
|
||||||
|
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||||
|
success: success));
|
||||||
|
} else {
|
||||||
|
emit(NonAcademeRecognitionDeletedState(
|
||||||
|
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||||
|
success: success));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
part of 'non_academic_recognition_bloc.dart';
|
||||||
|
|
||||||
|
abstract class NonAcademicRecognitionEvent extends Equatable {
|
||||||
|
const NonAcademicRecognitionEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
//// GET EVENT
|
||||||
|
class GetNonAcademicRecognition extends NonAcademicRecognitionEvent{
|
||||||
|
final int? profileId;
|
||||||
|
final String? token;
|
||||||
|
const GetNonAcademicRecognition({ this.profileId, this.token});
|
||||||
|
}
|
||||||
|
////LOAD EVENT
|
||||||
|
class LoadNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||||
|
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||||
|
const LoadNonAcademeRecognition({required this.nonAcademicRecognitions});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognitions];
|
||||||
|
}
|
||||||
|
|
||||||
|
////SHOW ADD FORM EVENT
|
||||||
|
class ShowAddNonAcademeRecognitionForm extends NonAcademicRecognitionEvent{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//// SHOW EDIT FORM
|
||||||
|
class ShowEditNonAcademicRecognitionForm extends NonAcademicRecognitionEvent{
|
||||||
|
final NonAcademicRecognition nonAcademicRecognition;
|
||||||
|
const ShowEditNonAcademicRecognitionForm({required this.nonAcademicRecognition});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognition];
|
||||||
|
}
|
||||||
|
|
||||||
|
//// ADD EVENT
|
||||||
|
class AddNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final NonAcademicRecognition nonAcademicRecognition;
|
||||||
|
const AddNonAcademeRecognition({required this.nonAcademicRecognition, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognition,profileId,token];
|
||||||
|
}
|
||||||
|
|
||||||
|
//// EDIT EVENT
|
||||||
|
class EditNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||||
|
final NonAcademicRecognition nonAcademicRecognition;
|
||||||
|
final String token;
|
||||||
|
final int profileId;
|
||||||
|
const EditNonAcademeRecognition({required this.nonAcademicRecognition, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognition,profileId,token];
|
||||||
|
}
|
||||||
|
|
||||||
|
//// DELETE EVENT
|
||||||
|
class DeleteNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||||
|
final NonAcademicRecognition nonAcademicRecognition;
|
||||||
|
const DeleteNonAcademeRecognition({required this.nonAcademicRecognitions, required this.nonAcademicRecognition,required this.profileId,required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,nonAcademicRecognition,nonAcademicRecognitions];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
part of 'non_academic_recognition_bloc.dart';
|
||||||
|
|
||||||
|
abstract class NonAcademicRecognitionState extends Equatable {
|
||||||
|
const NonAcademicRecognitionState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class NonAcademicRecognitionInitial extends NonAcademicRecognitionState {}
|
||||||
|
|
||||||
|
////LOADING STATE
|
||||||
|
class NonAcademicRecognitionLoadingState extends NonAcademicRecognitionState {}
|
||||||
|
|
||||||
|
////LOADED STATE
|
||||||
|
class NonAcademicRecognitionLoadedState extends NonAcademicRecognitionState {
|
||||||
|
final List<NonAcademicRecognition> nonAcademicRecognition;
|
||||||
|
const NonAcademicRecognitionLoadedState(
|
||||||
|
{required this.nonAcademicRecognition});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
////DELETED STATE
|
||||||
|
class NonAcademeRecognitionDeletedState extends NonAcademicRecognitionState {
|
||||||
|
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||||
|
final bool success;
|
||||||
|
const NonAcademeRecognitionDeletedState(
|
||||||
|
{required this.nonAcademicRecognitions, required this.success});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognitions, success];
|
||||||
|
}
|
||||||
|
|
||||||
|
class NonAcademeRecognitionEditedState extends NonAcademicRecognitionState{
|
||||||
|
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const NonAcademeRecognitionEditedState(
|
||||||
|
{required this.nonAcademicRecognitions, required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognitions, response];
|
||||||
|
}
|
||||||
|
|
||||||
|
////ADDED STATE
|
||||||
|
class NonAcademeRecognitionAddedState extends NonAcademicRecognitionState {
|
||||||
|
final List<NonAcademicRecognition> nonAcademicRecognition;
|
||||||
|
final Map<dynamic, dynamic> response;
|
||||||
|
const NonAcademeRecognitionAddedState(
|
||||||
|
{required this.nonAcademicRecognition, required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [nonAcademicRecognition, response];
|
||||||
|
}
|
||||||
|
|
||||||
|
////ADDING STATE
|
||||||
|
class AddNonAcademeRecognitionState extends NonAcademicRecognitionState {
|
||||||
|
final List<Agency> agencies;
|
||||||
|
final List<Category> agencyCategories;
|
||||||
|
const AddNonAcademeRecognitionState(
|
||||||
|
{required this.agencies, required this.agencyCategories});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [agencies, agencyCategories];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditNonAcademeRecognitionState extends NonAcademicRecognitionState {
|
||||||
|
final List<Agency> agencies;
|
||||||
|
final List<Category> agencyCategories;
|
||||||
|
final NonAcademicRecognition nonAcademicRecognition;
|
||||||
|
const EditNonAcademeRecognitionState({required this.agencies, required this.agencyCategories,required this.nonAcademicRecognition});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [agencies, agencyCategories,nonAcademicRecognition];
|
||||||
|
}
|
||||||
|
|
||||||
|
////ERROR STATE
|
||||||
|
class NonAcademicRecognitionErrorState extends NonAcademicRecognitionState {
|
||||||
|
final String message;
|
||||||
|
const NonAcademicRecognitionErrorState({required this.message});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/model/utils/agency.dart';
|
||||||
|
import 'package:unit2/model/utils/category.dart';
|
||||||
|
import 'package:unit2/sevices/profile/orgmembership_services.dart';
|
||||||
|
import 'package:unit2/utils/profile_utilities.dart';
|
||||||
|
|
||||||
|
import '../../../../model/profile/other_information/organization_memberships.dart';
|
||||||
|
|
||||||
|
part 'organization_membership_event.dart';
|
||||||
|
part 'organization_membership_state.dart';
|
||||||
|
|
||||||
|
class OrganizationMembershipBloc extends Bloc<OrganizationMembershipEvent, OrganizationMembershipState> {
|
||||||
|
List<Agency> agencies = [];
|
||||||
|
List<Category> agencyCategory = [];
|
||||||
|
OrganizationMembershipBloc() : super(OrganizationMembershipInitial()) {
|
||||||
|
List<OrganizationMembership> organizationMemberships=[];
|
||||||
|
on<GetOrganizationMembership>((event, emit) async{
|
||||||
|
emit(OrgmembershipLoadingState());
|
||||||
|
try{
|
||||||
|
if(organizationMemberships.isEmpty){
|
||||||
|
List<OrganizationMembership> orgs = await OrganizationMembershipServices.instance.getOrgMemberships(event.profileId!, event.token!);
|
||||||
|
organizationMemberships = orgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(OrganizationMembershipLoaded(orgMemberships: organizationMemberships));
|
||||||
|
}catch(e){
|
||||||
|
OrganizationMembershipErrorState(message: e.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
on<LoadOrganizationMemberships>((event,emit){
|
||||||
|
emit(OrganizationMembershipLoaded(orgMemberships: organizationMemberships));
|
||||||
|
});
|
||||||
|
|
||||||
|
////SHOW ADD ORG MEMBERSHIP FORM
|
||||||
|
on<ShowAddOrgMembershipForm>((event,emit)async{
|
||||||
|
emit(OrgmembershipLoadingState());
|
||||||
|
try{
|
||||||
|
if(agencies.isEmpty){
|
||||||
|
List<Agency> newAgencies = await ProfileUtilities.instance.getAgecies();
|
||||||
|
agencies = newAgencies;
|
||||||
|
}
|
||||||
|
if(agencyCategory.isEmpty){
|
||||||
|
List<Category>newAgencyCategories = await ProfileUtilities.instance.agencyCategory();
|
||||||
|
agencyCategory = newAgencyCategories;
|
||||||
|
}
|
||||||
|
emit(AddOrgMembershipState(agencies: agencies, agencyCategories: agencyCategory));
|
||||||
|
}catch(e){
|
||||||
|
emit(OrganizationMembershipErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//// ADD ORGMEMBERSHIP
|
||||||
|
on<AddOrgMembership>((event,emit)async{
|
||||||
|
try{
|
||||||
|
Map<dynamic,dynamic> status= await OrganizationMembershipServices.instance.add(agency: event.agency, token: event.token, profileId: event.profileId.toString());
|
||||||
|
if(status["success"]){
|
||||||
|
OrganizationMembership organizationMembership = OrganizationMembership.fromJson(status["data"]);
|
||||||
|
organizationMemberships.add(organizationMembership);
|
||||||
|
emit(OrgMembershipAddedState( response: status));
|
||||||
|
}else{
|
||||||
|
emit(OrgMembershipAddedState( response: status));
|
||||||
|
}
|
||||||
|
}catch(e){
|
||||||
|
emit(OrganizationMembershipErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////DELETE ORGMEMBERSHIP
|
||||||
|
on<DeleteOrgMemberShip>((event,emit)async{
|
||||||
|
emit(OrgmembershipLoadingState());
|
||||||
|
try{
|
||||||
|
final bool success = await OrganizationMembershipServices.instance.delete(agency: event.org.agency!, profileId: event.profileId, token: event.token);
|
||||||
|
if(success){
|
||||||
|
organizationMemberships.removeWhere((element) => element.agency!.id == event.org.agency!.id );
|
||||||
|
emit(OrgMembershipDeletedState(success: success));
|
||||||
|
}else{
|
||||||
|
emit(OrgMembershipDeletedState(success: success));
|
||||||
|
}
|
||||||
|
}catch(e){
|
||||||
|
emit(OrganizationMembershipErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
part of 'organization_membership_bloc.dart';
|
||||||
|
|
||||||
|
abstract class OrganizationMembershipEvent extends Equatable {
|
||||||
|
const OrganizationMembershipEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadOrganizationMemberships extends OrganizationMembershipEvent{
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetOrganizationMembership extends OrganizationMembershipEvent{
|
||||||
|
final int? profileId;
|
||||||
|
final String? token;
|
||||||
|
const GetOrganizationMembership({this.profileId, this.token});
|
||||||
|
|
||||||
|
}
|
||||||
|
class ShowAddOrgMembershipForm extends OrganizationMembershipEvent{
|
||||||
|
|
||||||
|
}
|
||||||
|
class AddOrgMembership extends OrganizationMembershipEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final Agency agency;
|
||||||
|
const AddOrgMembership({required this.agency, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,agency];
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeleteOrgMemberShip extends OrganizationMembershipEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final OrganizationMembership org;
|
||||||
|
|
||||||
|
const DeleteOrgMemberShip({required this.profileId, required this.token, required this.org,});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,org];
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
part of 'organization_membership_bloc.dart';
|
||||||
|
|
||||||
|
abstract class OrganizationMembershipState extends Equatable {
|
||||||
|
const OrganizationMembershipState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrganizationMembershipInitial extends OrganizationMembershipState {}
|
||||||
|
|
||||||
|
class OrganizationMembershipLoaded extends OrganizationMembershipState{
|
||||||
|
final List<OrganizationMembership>orgMemberships;
|
||||||
|
const OrganizationMembershipLoaded({required this.orgMemberships});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [orgMemberships];
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrganizationMembershipErrorState extends OrganizationMembershipState{
|
||||||
|
final String message;
|
||||||
|
const OrganizationMembershipErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class OrgmembershipLoadingState extends OrganizationMembershipState{
|
||||||
|
|
||||||
|
}
|
||||||
|
class OrgMembershipDeletedState extends OrganizationMembershipState{
|
||||||
|
final bool success;
|
||||||
|
const OrgMembershipDeletedState({ required this.success});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [success];
|
||||||
|
}
|
||||||
|
class OrgMembershipAddedState extends OrganizationMembershipState{
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const OrgMembershipAddedState({required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [response];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddOrgMembershipState extends OrganizationMembershipState{
|
||||||
|
final List<Agency> agencies;
|
||||||
|
final List<Category> agencyCategories;
|
||||||
|
const AddOrgMembershipState({required this.agencies, required this.agencyCategories});
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
import '../../../../model/profile/basic_information/adress.dart';
|
||||||
|
|
||||||
|
part 'address_event.dart';
|
||||||
|
part 'address_state.dart';
|
||||||
|
|
||||||
|
class AddressBloc extends Bloc<AddressEvent, AddressState> {
|
||||||
|
AddressBloc() : super(AddressInitial()) {
|
||||||
|
List<MainAdress> addresses = [];
|
||||||
|
on<GetAddress>((event, emit) {
|
||||||
|
emit(AddressLoadingState());
|
||||||
|
try{
|
||||||
|
addresses = event.addresses;
|
||||||
|
emit(AddressLoadedState(addresses: addresses));
|
||||||
|
}catch(e){
|
||||||
|
emit(AddressErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
part of 'address_bloc.dart';
|
||||||
|
|
||||||
|
abstract class AddressEvent extends Equatable {
|
||||||
|
const AddressEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetAddress extends AddressEvent{
|
||||||
|
final List<MainAdress> addresses;
|
||||||
|
const GetAddress({required this.addresses});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [addresses];
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
part of 'address_bloc.dart';
|
||||||
|
|
||||||
|
abstract class AddressState extends Equatable {
|
||||||
|
const AddressState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddressInitial extends AddressState {}
|
||||||
|
|
||||||
|
class AddressLoadedState extends AddressState{
|
||||||
|
final List<MainAdress> addresses;
|
||||||
|
const AddressLoadedState({required this.addresses});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [addresses];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddressErrorState extends AddressState{
|
||||||
|
final String message;
|
||||||
|
const AddressErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
class AddressLoadingState extends AddressState{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,143 @@
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:unit2/sevices/profile/contact_services.dart';
|
||||||
|
import 'package:unit2/utils/profile_utilities.dart';
|
||||||
|
|
||||||
|
import '../../../../model/profile/basic_information/contact_information.dart';
|
||||||
|
|
||||||
|
part 'contact_event.dart';
|
||||||
|
part 'contact_state.dart';
|
||||||
|
|
||||||
|
class ContactBloc extends Bloc<ContactEvent, ContactState> {
|
||||||
|
ContactBloc() : super(ContactInitial()) {
|
||||||
|
List<ContactInfo> contactInformations = [];
|
||||||
|
List<ServiceType> serviceTypes = [];
|
||||||
|
//// get all contacts
|
||||||
|
on<GetContacts>((event, emit) {
|
||||||
|
emit(ContactLoadingState());
|
||||||
|
try {
|
||||||
|
contactInformations = event.contactInformations;
|
||||||
|
emit(ContactLoadedState(contactInformation: contactInformations));
|
||||||
|
} catch (e) {
|
||||||
|
emit(ContactErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//// Load Contacts
|
||||||
|
on<LoadContacts>((event, emit) {
|
||||||
|
emit(ContactLoadedState(contactInformation: contactInformations));
|
||||||
|
});
|
||||||
|
//// show add form
|
||||||
|
on<ShowAddForm>((event, emit) async {
|
||||||
|
try {
|
||||||
|
emit(ContactLoadingState());
|
||||||
|
if (serviceTypes.isEmpty) {
|
||||||
|
serviceTypes = await ProfileUtilities.instance.getServiceType();
|
||||||
|
}
|
||||||
|
emit(ContactAddingState(serviceTypes: serviceTypes));
|
||||||
|
} catch (e) {
|
||||||
|
emit(ContactErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
///// Show edit form
|
||||||
|
on<ShowEditForm>((event, emit) async {
|
||||||
|
ServiceType serviceType;
|
||||||
|
List<CommService> commServiceProvivers;
|
||||||
|
CommService serviceProvider;
|
||||||
|
try{
|
||||||
|
if (serviceTypes.isEmpty) {
|
||||||
|
serviceTypes = await ProfileUtilities.instance.getServiceType();
|
||||||
|
}
|
||||||
|
serviceType = serviceTypes.firstWhere((ServiceType element) {
|
||||||
|
return element.id == event.contactInfo.commService!.serviceType!.id;
|
||||||
|
});
|
||||||
|
commServiceProvivers = await ContactService.instance
|
||||||
|
.getServiceProvider(serviceTypeId: serviceType.id!);
|
||||||
|
serviceProvider = commServiceProvivers.firstWhere((CommService element) =>
|
||||||
|
element.id == event.contactInfo.commService!.id);
|
||||||
|
emit(ContactEditingState(
|
||||||
|
serviceTypes: serviceTypes,
|
||||||
|
selectedServiceType: serviceType,
|
||||||
|
commServiceProviders: commServiceProvivers,
|
||||||
|
selectedProvider: serviceProvider,
|
||||||
|
contactInfo: event.contactInfo));
|
||||||
|
}catch(e){
|
||||||
|
emit(ContactErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////edit contact
|
||||||
|
on<EditContactInformation>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> responseStatus = await ContactService.instance
|
||||||
|
.update(
|
||||||
|
profileId: event.profileId,
|
||||||
|
token: event.token,
|
||||||
|
contactInfo: event.contactInfo);
|
||||||
|
if (responseStatus['success']) {
|
||||||
|
ContactInfo contactInfo =
|
||||||
|
ContactInfo.fromJson(responseStatus['data']['contact_info']);
|
||||||
|
contactInformations.removeWhere(
|
||||||
|
(ContactInfo element) => element.id == event.contactInfo.id);
|
||||||
|
contactInformations.add(contactInfo);
|
||||||
|
emit(ContactEditedState(
|
||||||
|
|
||||||
|
response: responseStatus));
|
||||||
|
} else {
|
||||||
|
emit(ContactEditedState(
|
||||||
|
|
||||||
|
response: responseStatus));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(ContactErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//// add contact
|
||||||
|
|
||||||
|
on<AddContactInformation>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> responseStatus = await ContactService.instance
|
||||||
|
.add(
|
||||||
|
profileId: event.profileId,
|
||||||
|
token: event.token,
|
||||||
|
contactInfo: event.contactInfo);
|
||||||
|
if (responseStatus['success']) {
|
||||||
|
ContactInfo contactInfo =
|
||||||
|
ContactInfo.fromJson(responseStatus['data']['contact_info']);
|
||||||
|
contactInformations.add(contactInfo);
|
||||||
|
emit(ContactEditedState(
|
||||||
|
|
||||||
|
response: responseStatus));
|
||||||
|
} else {
|
||||||
|
emit(ContactEditedState(
|
||||||
|
|
||||||
|
response: responseStatus));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(ContactErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//// delete contact
|
||||||
|
on<DeleteContactInformation>((event, emit) async {
|
||||||
|
try {
|
||||||
|
final bool success = await ContactService.instance.deleteContact(
|
||||||
|
profileId: event.profileId,
|
||||||
|
token: event.token,
|
||||||
|
contactInfo: event.contactInfo);
|
||||||
|
if (success) {
|
||||||
|
contactInformations
|
||||||
|
.removeWhere((element) => element.id == event.contactInfo.id);
|
||||||
|
emit(ContactDeletedState(
|
||||||
|
succcess: success));
|
||||||
|
} else {
|
||||||
|
emit(ContactDeletedState(
|
||||||
|
succcess: success));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(ContactErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
part of 'contact_bloc.dart';
|
||||||
|
|
||||||
|
abstract class ContactEvent extends Equatable {
|
||||||
|
const ContactEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
////get contacts
|
||||||
|
class GetContacts extends ContactEvent{
|
||||||
|
final List<ContactInfo> contactInformations;
|
||||||
|
const GetContacts({required this.contactInformations});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
//// load contacts
|
||||||
|
class LoadContacts extends ContactEvent{
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
//// show add form
|
||||||
|
class ShowAddForm extends ContactEvent{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//// show edit form
|
||||||
|
class ShowEditForm extends ContactEvent{
|
||||||
|
final ContactInfo contactInfo;
|
||||||
|
const ShowEditForm({required this.contactInfo});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [contactInfo];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
////add event
|
||||||
|
class AddContactInformation extends ContactEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final ContactInfo contactInfo;
|
||||||
|
const AddContactInformation({required this.contactInfo, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,contactInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
////edit event
|
||||||
|
class EditContactInformation extends ContactEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final ContactInfo contactInfo;
|
||||||
|
const EditContactInformation({required this.contactInfo, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,contactInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
//// delete event
|
||||||
|
|
||||||
|
class DeleteContactInformation extends ContactEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final ContactInfo contactInfo;
|
||||||
|
const DeleteContactInformation({required this.contactInfo, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,contactInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
part of 'contact_bloc.dart';
|
||||||
|
|
||||||
|
abstract class ContactState extends Equatable {
|
||||||
|
const ContactState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ContactInitial extends ContactState {}
|
||||||
|
|
||||||
|
////loaded state
|
||||||
|
class ContactLoadedState extends ContactState{
|
||||||
|
final List<ContactInfo> contactInformation;
|
||||||
|
const ContactLoadedState({required this.contactInformation});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
////loading state
|
||||||
|
class ContactLoadingState extends ContactState{
|
||||||
|
|
||||||
|
}
|
||||||
|
//// adding state
|
||||||
|
class ContactAddingState extends ContactState{
|
||||||
|
final List<ServiceType> serviceTypes;
|
||||||
|
const ContactAddingState({ required this.serviceTypes});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [serviceTypes];
|
||||||
|
}
|
||||||
|
//// Editing state
|
||||||
|
class ContactEditingState extends ContactState{
|
||||||
|
final List<ServiceType> serviceTypes;
|
||||||
|
final List<CommService> commServiceProviders;
|
||||||
|
final CommService selectedProvider;
|
||||||
|
final ServiceType selectedServiceType;
|
||||||
|
final ContactInfo contactInfo;
|
||||||
|
const ContactEditingState({ required this.serviceTypes, required this.selectedServiceType, required this.selectedProvider, required this.commServiceProviders, required this.contactInfo});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [serviceTypes];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//// added state
|
||||||
|
class ContactAddedState extends ContactState{
|
||||||
|
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const ContactAddedState({ required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [response];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//// edited state
|
||||||
|
class ContactEditedState extends ContactState{
|
||||||
|
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const ContactEditedState({ required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [response];
|
||||||
|
}
|
||||||
|
////deleted state
|
||||||
|
class ContactDeletedState extends ContactState{
|
||||||
|
|
||||||
|
final bool succcess;
|
||||||
|
const ContactDeletedState({required this.succcess});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [succcess];
|
||||||
|
}
|
||||||
|
|
||||||
|
////error state
|
||||||
|
class ContactErrorState extends ContactState{
|
||||||
|
final String message;
|
||||||
|
const ContactErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
import '../../../../model/profile/basic_information/identification_information.dart';
|
||||||
|
|
||||||
|
part 'identification_event.dart';
|
||||||
|
part 'identification_state.dart';
|
||||||
|
|
||||||
|
class IdentificationBloc extends Bloc<IdentificationEvent, IdentificationState> {
|
||||||
|
IdentificationBloc() : super(IdentificationInitial()) {
|
||||||
|
List<Identification> identificationInformations = [];
|
||||||
|
on<GetIdentifications>((event, emit) {
|
||||||
|
try{
|
||||||
|
identificationInformations = event.identificationInformation;
|
||||||
|
emit(IdentificationLoadedState(identificationInformation: identificationInformations));
|
||||||
|
}catch(e){
|
||||||
|
emit(IdenficationErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
part of 'identification_bloc.dart';
|
||||||
|
|
||||||
|
abstract class IdentificationEvent extends Equatable {
|
||||||
|
const IdentificationEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetIdentifications extends IdentificationEvent{
|
||||||
|
final List<Identification> identificationInformation;
|
||||||
|
const GetIdentifications({required this.identificationInformation});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [identificationInformation];
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
part of 'identification_bloc.dart';
|
||||||
|
|
||||||
|
abstract class IdentificationState extends Equatable {
|
||||||
|
const IdentificationState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdentificationInitial extends IdentificationState {}
|
||||||
|
|
||||||
|
class IdentificationLoadedState extends IdentificationState{
|
||||||
|
final List<Identification> identificationInformation;
|
||||||
|
const IdentificationLoadedState({required this.identificationInformation});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [identificationInformation];
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdenficationErrorState extends IdentificationState{
|
||||||
|
final String message;
|
||||||
|
const IdenficationErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class IdentificationLoadingState extends IdentificationState{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/model/profile/profileInfomation.dart';
|
||||||
|
import 'package:unit2/sevices/profile/profile_service.dart';
|
||||||
|
part 'profile_event.dart';
|
||||||
|
part 'profile_state.dart';
|
||||||
|
|
||||||
|
class ProfileBloc extends Bloc<ProfileEvent, ProfileState> {
|
||||||
|
ProfileBloc() : super(ProfileInitial()) {
|
||||||
|
ProfileInformation? globalProfileInformation;
|
||||||
|
on<LoadProfile>((event, emit) async {
|
||||||
|
emit(ProfileLoading());
|
||||||
|
try {
|
||||||
|
|
||||||
|
ProfileInformation? profileInformation =
|
||||||
|
await ProfileService.instance.getProfile(event.token, event.userID);
|
||||||
|
globalProfileInformation = profileInformation;
|
||||||
|
emit(ProfileLoaded(profileInformation: globalProfileInformation!));
|
||||||
|
} catch (e) {
|
||||||
|
emit(ProfileErrorState(mesage: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
part of 'profile_bloc.dart';
|
||||||
|
|
||||||
|
abstract class ProfileEvent extends Equatable {
|
||||||
|
const ProfileEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadProfile extends ProfileEvent {
|
||||||
|
final String token;
|
||||||
|
final int userID;
|
||||||
|
const LoadProfile({required this.token, required this.userID});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [token, userID];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadProfileInformation extends ProfileEvent {
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
part of 'profile_bloc.dart';
|
||||||
|
|
||||||
|
abstract class ProfileState extends Equatable {
|
||||||
|
const ProfileState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProfileInitial extends ProfileState {}
|
||||||
|
|
||||||
|
class ProfileLoaded extends ProfileState {
|
||||||
|
final ProfileInformation profileInformation;
|
||||||
|
const ProfileLoaded({required this.profileInformation});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileInformation];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProfileErrorState extends ProfileState {
|
||||||
|
final String mesage;
|
||||||
|
const ProfileErrorState({required this.mesage});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [mesage];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ProfileLoading extends ProfileState {}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,210 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/model/location/address_category.dart';
|
||||||
|
import 'package:unit2/model/location/barangay.dart';
|
||||||
|
import 'package:unit2/model/location/city.dart';
|
||||||
|
import 'package:unit2/model/location/country.dart';
|
||||||
|
import 'package:unit2/model/location/region.dart';
|
||||||
|
import 'package:unit2/sevices/profile/references_services.dart';
|
||||||
|
import '../../../model/location/provinces.dart';
|
||||||
|
import '../../../model/profile/references.dart';
|
||||||
|
import '../../../utils/location_utilities.dart';
|
||||||
|
|
||||||
|
part 'references_event.dart';
|
||||||
|
part 'references_state.dart';
|
||||||
|
|
||||||
|
class ReferencesBloc extends Bloc<ReferencesEvent, ReferencesState> {
|
||||||
|
List<PersonalReference> references = [];
|
||||||
|
List<Country> globalCountries = [];
|
||||||
|
List<Region> globalRegions = [];
|
||||||
|
List<AddressCategory> globalCategories = [];
|
||||||
|
|
||||||
|
ReferencesBloc() : super(ReferencesInitial()) {
|
||||||
|
on<GetReferences>((event, emit) async {
|
||||||
|
emit(ReferencesLoadingState());
|
||||||
|
try {
|
||||||
|
if(references.isEmpty){
|
||||||
|
List<PersonalReference> refs = await ReferencesServices.instace
|
||||||
|
.getRefences(event.profileId, event.token);
|
||||||
|
references = refs;
|
||||||
|
emit(ReferencesLoadedState(references: references));
|
||||||
|
}else{
|
||||||
|
emit(ReferencesLoadedState(references: references));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
ReferencesErrorState(message: e.toString());
|
||||||
|
}
|
||||||
|
////SHOW FORM FOR ADDING REFERENCES
|
||||||
|
});
|
||||||
|
on<ShowAddReferenceForm>((event, emit) async {
|
||||||
|
emit(ReferencesLoadingState());
|
||||||
|
try {
|
||||||
|
if (globalRegions.isEmpty) {
|
||||||
|
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||||
|
globalRegions = regions;
|
||||||
|
}
|
||||||
|
if (globalCountries.isEmpty) {
|
||||||
|
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||||
|
globalCountries = countries;
|
||||||
|
}
|
||||||
|
if (globalCategories.isEmpty) {
|
||||||
|
List<AddressCategory> categories =
|
||||||
|
await LocationUtils.instance.getAddressCategory();
|
||||||
|
globalCategories = categories;
|
||||||
|
}
|
||||||
|
emit(AddReferenceState(
|
||||||
|
countries: globalCountries,
|
||||||
|
regions: globalRegions,
|
||||||
|
categories: globalCategories));
|
||||||
|
} catch (e) {
|
||||||
|
emit(ReferencesErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
////SHOW EDIT FORM
|
||||||
|
});
|
||||||
|
on<ShowEditReferenceForm>((event, emit) async {
|
||||||
|
Region? selectedRegion;
|
||||||
|
Province? selectedProvince;
|
||||||
|
CityMunicipality? selectedCity;
|
||||||
|
AddressCategory? selectedCategory;
|
||||||
|
Country selectedCountry;
|
||||||
|
Barangay? selectedBarangay;
|
||||||
|
try {
|
||||||
|
if (globalRegions.isEmpty) {
|
||||||
|
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||||
|
globalRegions = regions;
|
||||||
|
}
|
||||||
|
if (globalCountries.isEmpty) {
|
||||||
|
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||||
|
globalCountries = countries;
|
||||||
|
}
|
||||||
|
if (globalCategories.isEmpty) {
|
||||||
|
List<AddressCategory> categories =
|
||||||
|
await LocationUtils.instance.getAddressCategory();
|
||||||
|
globalCategories = categories;
|
||||||
|
}
|
||||||
|
//// checck if address is overseas
|
||||||
|
bool overseas =
|
||||||
|
event.personalReference.address!.country!.id! != 175 ? true : false;
|
||||||
|
selectedCategory = globalCategories.firstWhere((AddressCategory element) => event.personalReference.address!.addressCategory!.id == element.id);
|
||||||
|
////if address is not overseas set initial values for address
|
||||||
|
if (!overseas) {
|
||||||
|
selectedRegion = globalRegions.firstWhere((Region element) =>
|
||||||
|
event.personalReference.address!.cityMunicipality!.province!
|
||||||
|
.region!.code ==
|
||||||
|
element.code);
|
||||||
|
List<Province> provinces = await LocationUtils.instance
|
||||||
|
.getProvinces(regionCode: selectedRegion.code.toString());
|
||||||
|
selectedProvince = provinces.firstWhere((Province province) =>
|
||||||
|
event.personalReference.address!.cityMunicipality!.province!
|
||||||
|
.code ==
|
||||||
|
province.code);
|
||||||
|
List<CityMunicipality> cities = await LocationUtils.instance
|
||||||
|
.getCities(code: selectedProvince.code!);
|
||||||
|
selectedCity = cities.firstWhere((CityMunicipality city) =>
|
||||||
|
event.personalReference.address!.cityMunicipality!.code ==
|
||||||
|
city.code);
|
||||||
|
List<Barangay> barangays = await LocationUtils.instance.getBarangay(code: selectedCity.code.toString());
|
||||||
|
if(event.personalReference.address?.barangay!=null){
|
||||||
|
selectedBarangay = barangays.firstWhere((Barangay barangay)=>event.personalReference.address?.barangay?.code == barangay.code);
|
||||||
|
}else{
|
||||||
|
selectedBarangay = null;
|
||||||
|
}
|
||||||
|
emit(EditReferenceState(
|
||||||
|
selectedRegion: selectedRegion,
|
||||||
|
ref: event.personalReference,
|
||||||
|
countries: globalCountries,
|
||||||
|
regions: globalRegions,
|
||||||
|
barangays: barangays,
|
||||||
|
categories: globalCategories,
|
||||||
|
isOverseas: overseas,
|
||||||
|
provinces: provinces,
|
||||||
|
selectedProvince: selectedProvince,
|
||||||
|
cities: cities,
|
||||||
|
selectedCity: selectedCity,
|
||||||
|
selectedCategory: selectedCategory,
|
||||||
|
selectedBarangay: selectedBarangay
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
//// if address is overseas set initial value for country
|
||||||
|
selectedCountry = globalCountries.firstWhere((Country element) => event.personalReference.address!.country!.id == element.id);
|
||||||
|
emit(EditReferenceState(
|
||||||
|
selectedCountry: selectedCountry,
|
||||||
|
selectedCategory: selectedCategory,
|
||||||
|
selectedRegion: null,
|
||||||
|
ref: event.personalReference,
|
||||||
|
countries: globalCountries,
|
||||||
|
regions: globalRegions,
|
||||||
|
categories: globalCategories,
|
||||||
|
isOverseas: overseas));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(ReferencesErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//// CALL THE ERROR STATE EVEN T
|
||||||
|
on<CallErrorState>((event, emit) async {
|
||||||
|
emit(const ReferencesErrorState(
|
||||||
|
message: "Something went wrong. Please try again"));
|
||||||
|
//// EDIT REFERENCES EVENT
|
||||||
|
});on<EditReference>((event,emit)async{
|
||||||
|
Map<dynamic,dynamic> status =await ReferencesServices.instace.update(ref: event.reference, token: event.token, profileId: event.profileId);
|
||||||
|
if (status['success']) {
|
||||||
|
PersonalReference ref = PersonalReference.fromJson(status['data']);
|
||||||
|
references.removeWhere((PersonalReference element)=>element.id == event.reference.id);
|
||||||
|
references.add(ref);
|
||||||
|
emit(
|
||||||
|
ReferenceEditedState( response: status));
|
||||||
|
} else {
|
||||||
|
emit(
|
||||||
|
ReferenceEditedState( response: status));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
//// add reference event
|
||||||
|
on<AddReference>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status = await ReferencesServices.instace
|
||||||
|
.addReference(
|
||||||
|
ref: event.reference,
|
||||||
|
token: event.token,
|
||||||
|
profileId: event.profileId);
|
||||||
|
if (status['success']) {
|
||||||
|
PersonalReference ref = PersonalReference.fromJson(status['data']);
|
||||||
|
references.add(ref);
|
||||||
|
emit(
|
||||||
|
ReferencesAddedState( response: status));
|
||||||
|
} else {
|
||||||
|
emit(
|
||||||
|
ReferencesAddedState( response: status));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(ReferencesErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////LOAD REFERENCE
|
||||||
|
on<LoadReferences>((event, emit) {
|
||||||
|
emit(ReferencesLoadingState());
|
||||||
|
emit(ReferencesLoadedState(references: references));
|
||||||
|
|
||||||
|
});
|
||||||
|
////DELETE REFERENCE
|
||||||
|
on<DeleteReference>((event, emit) async {
|
||||||
|
try {
|
||||||
|
final bool success = await ReferencesServices.instace.delete(
|
||||||
|
profileId: event.profileId, token: event.token, id: event.refId);
|
||||||
|
if (success) {
|
||||||
|
event.references.removeWhere(
|
||||||
|
(PersonalReference element) => element.id == event.refId);
|
||||||
|
references = event.references;
|
||||||
|
emit(DeleteReferenceState( success: success));
|
||||||
|
} else {
|
||||||
|
emit(DeleteReferenceState(success: success));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(ReferencesErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
part of 'references_bloc.dart';
|
||||||
|
|
||||||
|
abstract class ReferencesEvent extends Equatable {
|
||||||
|
const ReferencesEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetReferences extends ReferencesEvent {
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetReferences({required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId, token];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ShowAddReferenceForm extends ReferencesEvent {}
|
||||||
|
|
||||||
|
class ShowEditReferenceForm extends ReferencesEvent {
|
||||||
|
final PersonalReference personalReference;
|
||||||
|
const ShowEditReferenceForm({required this.personalReference});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [personalReference];
|
||||||
|
}
|
||||||
|
|
||||||
|
class CallErrorState extends ReferencesEvent {}
|
||||||
|
|
||||||
|
class AddReference extends ReferencesEvent {
|
||||||
|
final PersonalReference reference;
|
||||||
|
final String token;
|
||||||
|
final int profileId;
|
||||||
|
const AddReference(
|
||||||
|
{required this.profileId, required this.reference, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId, token, reference];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditReference extends ReferencesEvent {
|
||||||
|
final PersonalReference reference;
|
||||||
|
final String token;
|
||||||
|
final int profileId;
|
||||||
|
const EditReference(
|
||||||
|
{required this.profileId, required this.reference, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId, token, reference];
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeleteReference extends ReferencesEvent {
|
||||||
|
final List<PersonalReference> references;
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
final int refId;
|
||||||
|
const DeleteReference(
|
||||||
|
{required this.profileId,
|
||||||
|
required this.refId,
|
||||||
|
required this.references,
|
||||||
|
required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId, token, refId, references];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadReferences extends ReferencesEvent {
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
part of 'references_bloc.dart';
|
||||||
|
|
||||||
|
abstract class ReferencesState extends Equatable {
|
||||||
|
const ReferencesState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReferencesInitial extends ReferencesState {}
|
||||||
|
|
||||||
|
class ReferencesLoadedState extends ReferencesState {
|
||||||
|
final List<PersonalReference> references;
|
||||||
|
const ReferencesLoadedState({required this.references});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [references];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReferencesErrorState extends ReferencesState {
|
||||||
|
final String message;
|
||||||
|
const ReferencesErrorState({required this.message});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReferencesLoadingState extends ReferencesState {}
|
||||||
|
|
||||||
|
class ReferencesAddedState extends ReferencesState {
|
||||||
|
final Map<dynamic, dynamic> response;
|
||||||
|
const ReferencesAddedState(
|
||||||
|
{ required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [ response];
|
||||||
|
}
|
||||||
|
class ReferenceEditedState extends ReferencesState {
|
||||||
|
|
||||||
|
final Map<dynamic, dynamic> response;
|
||||||
|
const ReferenceEditedState(
|
||||||
|
{ required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [ response];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditReferenceState extends ReferencesState {
|
||||||
|
final List<Region> regions;
|
||||||
|
final List<Country> countries;
|
||||||
|
final List<AddressCategory> categories;
|
||||||
|
final List<Province>? provinces;
|
||||||
|
final List<CityMunicipality>? cities;
|
||||||
|
final List<Barangay>? barangays;
|
||||||
|
final PersonalReference ref;
|
||||||
|
final bool isOverseas;
|
||||||
|
final Region? selectedRegion;
|
||||||
|
final Province? selectedProvince;
|
||||||
|
final CityMunicipality? selectedCity;
|
||||||
|
final AddressCategory selectedCategory;
|
||||||
|
final Barangay? selectedBarangay;
|
||||||
|
final Country? selectedCountry;
|
||||||
|
const EditReferenceState(
|
||||||
|
{ this.barangays,
|
||||||
|
this.selectedBarangay,
|
||||||
|
required this.selectedCategory,
|
||||||
|
this.cities,
|
||||||
|
this.selectedCity,
|
||||||
|
this.provinces,
|
||||||
|
this.selectedProvince,
|
||||||
|
this.selectedRegion,
|
||||||
|
this.selectedCountry,
|
||||||
|
required this.isOverseas,
|
||||||
|
required this.ref,
|
||||||
|
required this.categories,
|
||||||
|
required this.countries,
|
||||||
|
required this.regions});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [regions, countries, categories, isOverseas];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddReferenceState extends ReferencesState {
|
||||||
|
final List<Region> regions;
|
||||||
|
final List<Country> countries;
|
||||||
|
final List<AddressCategory> categories;
|
||||||
|
const AddReferenceState(
|
||||||
|
{required this.categories,
|
||||||
|
required this.countries,
|
||||||
|
required this.regions});
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeleteReferenceState extends ReferencesState {
|
||||||
|
final bool success;
|
||||||
|
const DeleteReferenceState({ required this.success});
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/sevices/profile/volunatary_services.dart';
|
||||||
|
|
||||||
|
import '../../../model/profile/voluntary_works.dart';
|
||||||
|
|
||||||
|
part 'voluntary_work_event.dart';
|
||||||
|
part 'voluntary_work_state.dart';
|
||||||
|
|
||||||
|
class VoluntaryWorkBloc extends Bloc<VoluntaryWorkEvent, VoluntaryWorkState> {
|
||||||
|
VoluntaryWorkBloc() : super(VoluntaryWorkInitial()) {
|
||||||
|
List<VoluntaryWork> voluntaryWorks = [];
|
||||||
|
on<GetVoluntarWorks>((event, emit) async{
|
||||||
|
emit(VoluntaryWorkLoadingState());
|
||||||
|
try{
|
||||||
|
List<VoluntaryWork> works = await VoluntaryService.instance.getVoluntaryWorks(event.profileId, event.token);
|
||||||
|
voluntaryWorks = works;
|
||||||
|
emit(VoluntaryWorkLoadedState(voluntaryWorks: voluntaryWorks));
|
||||||
|
}catch(e){
|
||||||
|
emit(VoluntaryWorkErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
part of 'voluntary_work_bloc.dart';
|
||||||
|
|
||||||
|
abstract class VoluntaryWorkEvent extends Equatable {
|
||||||
|
const VoluntaryWorkEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetVoluntarWorks extends VoluntaryWorkEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetVoluntarWorks({required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token];
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
part of 'voluntary_work_bloc.dart';
|
||||||
|
|
||||||
|
abstract class VoluntaryWorkState extends Equatable {
|
||||||
|
const VoluntaryWorkState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class VoluntaryWorkInitial extends VoluntaryWorkState {}
|
||||||
|
class VoluntaryWorkLoadedState extends VoluntaryWorkState{
|
||||||
|
final List<VoluntaryWork> voluntaryWorks;
|
||||||
|
const VoluntaryWorkLoadedState({required this.voluntaryWorks});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [voluntaryWorks];
|
||||||
|
}
|
||||||
|
|
||||||
|
class VoluntaryWorkErrorState extends VoluntaryWorkState{
|
||||||
|
final String message;
|
||||||
|
const VoluntaryWorkErrorState({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class VoluntaryWorkLoadingState extends VoluntaryWorkState{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:unit2/bloc/profile/eligibility/eligibility_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/work_history.dart';
|
||||||
|
import 'package:unit2/model/utils/agency.dart';
|
||||||
|
import 'package:unit2/model/utils/agency_position.dart';
|
||||||
|
import 'package:unit2/model/utils/position.dart';
|
||||||
|
import 'package:unit2/sevices/profile/work_history_services.dart';
|
||||||
|
import 'package:unit2/utils/profile_utilities.dart';
|
||||||
|
|
||||||
|
import '../../../model/utils/category.dart';
|
||||||
|
|
||||||
|
part 'workHistory_event.dart';
|
||||||
|
part 'workHistory_state.dart';
|
||||||
|
|
||||||
|
class WorkHistoryBloc extends Bloc<WorkHistorytEvent, WorkHistoryState> {
|
||||||
|
List<WorkHistory> workExperiences = [];
|
||||||
|
List<Position> agencyPositions = [];
|
||||||
|
List<Agency> agencies = [];
|
||||||
|
List<AppoinemtStatus> appointmentStatus = [];
|
||||||
|
List<Category> agencyCategory = [];
|
||||||
|
WorkHistoryBloc() : super(EducationInitial()) {
|
||||||
|
////GET WORK HISTORIES
|
||||||
|
on<GetWorkHistories>((event, emit) async {
|
||||||
|
emit(WorkHistoryLoadingState());
|
||||||
|
try {
|
||||||
|
if (workExperiences.isEmpty) {
|
||||||
|
List<WorkHistory> works = await WorkHistoryService.instance
|
||||||
|
.getWorkExperiences(event.profileId!, event.token!);
|
||||||
|
workExperiences = works;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(WorkHistoryLoaded(workExperiences: workExperiences));
|
||||||
|
} catch (e) {
|
||||||
|
emit(WorkHistoryErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
///// LOAD WORK HISTORIES
|
||||||
|
on<LoadWorkHistories>((event, emit) {
|
||||||
|
emit(WorkHistoryLoadingState());
|
||||||
|
emit(WorkHistoryLoaded(workExperiences: workExperiences));
|
||||||
|
});
|
||||||
|
////DELETE
|
||||||
|
on<DeleteWorkHistory>((event, emit) async {
|
||||||
|
try {
|
||||||
|
final bool success = await WorkHistoryService.instance.delete(
|
||||||
|
profileId: event.profileId,
|
||||||
|
token: event.token,
|
||||||
|
work: event.workHistory);
|
||||||
|
if (success) {
|
||||||
|
workExperiences.removeWhere(
|
||||||
|
(WorkHistory element) => element.id == event.workHistory.id);
|
||||||
|
emit(DeletedState(success: success));
|
||||||
|
} else {
|
||||||
|
emit(DeletedState(success: success));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(WorkHistoryErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//// ADD WORK HISTORIES
|
||||||
|
on<AddWorkHostory>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status = await WorkHistoryService.instance.add(
|
||||||
|
isPrivate: event.isPrivate,
|
||||||
|
workHistory: event.workHistory,
|
||||||
|
token: event.token,
|
||||||
|
profileId: event.profileId);
|
||||||
|
if (status['success']) {
|
||||||
|
WorkHistory workHistory = WorkHistory.fromJson(status['data']);
|
||||||
|
workExperiences.add(workHistory);
|
||||||
|
emit(WorkHistoryAddedState(response: status));
|
||||||
|
} else {
|
||||||
|
emit(WorkHistoryAddedState(response: status));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(WorkHistoryErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
////UPDATE WORK HISTORY
|
||||||
|
on<UpdateWorkHistory>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> status = await WorkHistoryService.instance.update(
|
||||||
|
oldWorkHistory: event.oldWorkHistory,
|
||||||
|
newWorkHistory: event.workHistory,
|
||||||
|
token: event.token,
|
||||||
|
profileId: event.profileId);
|
||||||
|
if (status['success']) {
|
||||||
|
WorkHistory workHistory = WorkHistory.fromJson(status['data']);
|
||||||
|
workExperiences.removeWhere((WorkHistory work) {
|
||||||
|
return work.id == event.oldWorkHistory.id;
|
||||||
|
});
|
||||||
|
workExperiences.add(workHistory);
|
||||||
|
emit(WorkHistoryEditedState(response: status));
|
||||||
|
} else {
|
||||||
|
emit(WorkHistoryEditedState(
|
||||||
|
response: status,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(WorkHistoryErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
////SHOW EDIT WORK HISTORIES
|
||||||
|
on<ShowEditWorkHistoryForm>((event, emit) async {
|
||||||
|
try {
|
||||||
|
/////POSITIONS------------------------------------------
|
||||||
|
if (agencyPositions.isEmpty) {
|
||||||
|
List<Position> positions =
|
||||||
|
await WorkHistoryService.instance.getAgencyPosition();
|
||||||
|
agencyPositions = positions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////AGENCIES------------------------------------------
|
||||||
|
if (agencies.isEmpty) {
|
||||||
|
List<Agency> newAgencies =
|
||||||
|
await ProfileUtilities.instance.getAgecies();
|
||||||
|
agencies = newAgencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////Category Agency------------------------------------------
|
||||||
|
if (agencyCategory.isEmpty) {
|
||||||
|
List<Category> categoryAgencies =
|
||||||
|
await ProfileUtilities.instance.agencyCategory();
|
||||||
|
agencyCategory = categoryAgencies;
|
||||||
|
}
|
||||||
|
/////////-------------------------------------
|
||||||
|
if (appointmentStatus.isEmpty) {
|
||||||
|
List<AppoinemtStatus> status =
|
||||||
|
WorkHistoryService.instance.getAppointmentStatusList();
|
||||||
|
appointmentStatus = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(EditWorkHistoryState(
|
||||||
|
workHistory: event.workHistory,
|
||||||
|
agencyPositions: agencyPositions,
|
||||||
|
appointmentStatus: appointmentStatus,
|
||||||
|
agencyCategory: agencyCategory,
|
||||||
|
agencies: agencies));
|
||||||
|
} catch (e) {
|
||||||
|
emit(WorkHistoryErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
////SHOW ADD FORM WORK HISTORIES
|
||||||
|
on<ShowAddWorkHistoryForm>((event, emit) async {
|
||||||
|
emit(WorkHistoryLoadingState());
|
||||||
|
try {
|
||||||
|
/////POSITIONS------------------------------------------
|
||||||
|
if (agencyPositions.isEmpty) {
|
||||||
|
List<Position> positions =
|
||||||
|
await WorkHistoryService.instance.getAgencyPosition();
|
||||||
|
agencyPositions = positions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////AGENCIES------------------------------------------
|
||||||
|
if (agencies.isEmpty) {
|
||||||
|
List<Agency> newAgencies =
|
||||||
|
await ProfileUtilities.instance.getAgecies();
|
||||||
|
agencies = newAgencies;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////Category Agency------------------------------------------
|
||||||
|
if (agencyCategory.isEmpty) {
|
||||||
|
List<Category> categoryAgencies =
|
||||||
|
await ProfileUtilities.instance.agencyCategory();
|
||||||
|
agencyCategory = categoryAgencies;
|
||||||
|
}
|
||||||
|
/////////-------------------------------------
|
||||||
|
if (appointmentStatus.isEmpty) {
|
||||||
|
List<AppoinemtStatus> status =
|
||||||
|
WorkHistoryService.instance.getAppointmentStatusList();
|
||||||
|
appointmentStatus = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit(AddWorkHistoryState(
|
||||||
|
agencyPositions: agencyPositions,
|
||||||
|
appointmentStatus: appointmentStatus,
|
||||||
|
agencyCategory: agencyCategory,
|
||||||
|
agencies: agencies));
|
||||||
|
} catch (e) {
|
||||||
|
emit(WorkHistoryErrorState(message: e.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
part of 'workHistory_bloc.dart';
|
||||||
|
|
||||||
|
abstract class WorkHistorytEvent extends Equatable {
|
||||||
|
const WorkHistorytEvent();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetWorkHistories extends WorkHistorytEvent{
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const GetWorkHistories({required this.profileId, required this.token});
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId, token];
|
||||||
|
}
|
||||||
|
|
||||||
|
class LoadWorkHistories extends WorkHistorytEvent{
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class ShowAddWorkHistoryForm extends WorkHistorytEvent{
|
||||||
|
|
||||||
|
}
|
||||||
|
class ShowEditWorkHistoryForm extends WorkHistorytEvent{
|
||||||
|
final WorkHistory workHistory;
|
||||||
|
const ShowEditWorkHistoryForm({required this.workHistory});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [workHistory];
|
||||||
|
|
||||||
|
}
|
||||||
|
class DeleteWorkHistory extends WorkHistorytEvent{
|
||||||
|
final String token;
|
||||||
|
final int profileId;
|
||||||
|
final WorkHistory workHistory;
|
||||||
|
const DeleteWorkHistory({required this.profileId, required this.token, required this.workHistory});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [token, profileId,workHistory];
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpdateWorkHistory extends WorkHistorytEvent{
|
||||||
|
final WorkHistory workHistory;
|
||||||
|
final WorkHistory oldWorkHistory;
|
||||||
|
final String profileId;
|
||||||
|
final String token;
|
||||||
|
const UpdateWorkHistory({required this.oldWorkHistory, required this.profileId, required this.token, required this.workHistory});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [profileId,token,workHistory,oldWorkHistory];
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddWorkHostory extends WorkHistorytEvent{
|
||||||
|
final WorkHistory workHistory;
|
||||||
|
final bool isPrivate;
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const AddWorkHostory({required this.workHistory, required this.isPrivate, required this.profileId, required this.token});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [workHistory,profileId,token,isPrivate];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
part of 'workHistory_bloc.dart';
|
||||||
|
|
||||||
|
abstract class WorkHistoryState extends Equatable {
|
||||||
|
const WorkHistoryState();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
|
class EducationInitial extends WorkHistoryState {}
|
||||||
|
|
||||||
|
class WorkHistoryLoaded extends WorkHistoryState{
|
||||||
|
final List<WorkHistory> workExperiences;
|
||||||
|
const WorkHistoryLoaded({required this.workExperiences});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [workExperiences];
|
||||||
|
}
|
||||||
|
|
||||||
|
class WorkHistoryLoadingState extends WorkHistoryState{
|
||||||
|
|
||||||
|
}
|
||||||
|
class WorkHistoryErrorState extends WorkHistoryState{
|
||||||
|
final String message;
|
||||||
|
const WorkHistoryErrorState({required this.message});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class AddWorkHistoryState extends WorkHistoryState{
|
||||||
|
final List<Position> agencyPositions;
|
||||||
|
final List<Agency> agencies;
|
||||||
|
final List<Category> agencyCategory;
|
||||||
|
final List<AppoinemtStatus> appointmentStatus;
|
||||||
|
|
||||||
|
const AddWorkHistoryState({required this.agencyPositions, required this.appointmentStatus,required this.agencies,required this.agencyCategory});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [agencyPositions,appointmentStatus,agencies,agencyCategory];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditWorkHistoryState extends WorkHistoryState{
|
||||||
|
final WorkHistory workHistory;
|
||||||
|
final List<Position> agencyPositions;
|
||||||
|
final List<Agency> agencies;
|
||||||
|
final List<Category> agencyCategory;
|
||||||
|
final List<AppoinemtStatus> appointmentStatus;
|
||||||
|
const EditWorkHistoryState({required this.workHistory, required this.agencies,required this.agencyCategory, required this.agencyPositions, required this.appointmentStatus});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [workHistory, agencyPositions,appointmentStatus,agencies,agencyCategory];
|
||||||
|
}
|
||||||
|
|
||||||
|
class DeletedState extends WorkHistoryState{
|
||||||
|
final bool success;
|
||||||
|
const DeletedState({required this.success});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [success];
|
||||||
|
}
|
||||||
|
|
||||||
|
class WorkHistoryEditedState extends WorkHistoryState{
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const WorkHistoryEditedState({required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [response];
|
||||||
|
}
|
||||||
|
|
||||||
|
class WorkHistoryAddedState extends WorkHistoryState{
|
||||||
|
final Map<dynamic,dynamic> response;
|
||||||
|
const WorkHistoryAddedState({required this.response});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [response];
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
import 'dart:async';
|
||||||
|
import 'dart:io';
|
||||||
|
import 'package:barcode_scan2/barcode_scan2.dart';
|
||||||
|
import 'package:bloc/bloc.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:unit2/model/login_data/user_info/user_data.dart';
|
||||||
|
import 'package:unit2/model/login_data/version_info.dart';
|
||||||
|
import 'package:unit2/screens/unit2/login/functions/get_app_version.dart';
|
||||||
|
import 'package:unit2/sevices/login_service/auth_service.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
|
||||||
|
import '../../utils/scanner.dart';
|
||||||
|
import '../../utils/text_container.dart';
|
||||||
|
|
||||||
|
part 'user_event.dart';
|
||||||
|
part 'user_state.dart';
|
||||||
|
|
||||||
|
class UserBloc extends Bloc<UserEvent, UserState> {
|
||||||
|
UserData? _userData;
|
||||||
|
VersionInfo? _versionInfo;
|
||||||
|
String? _apkVersion;
|
||||||
|
bool save = false;
|
||||||
|
UserBloc() : super(UserInitial()) {
|
||||||
|
// this event is called when opening the app to check if
|
||||||
|
// there is new app version
|
||||||
|
on<GetApkVersion>((event, emit) async {
|
||||||
|
try {
|
||||||
|
emit(SplashScreen());
|
||||||
|
VersionInfo versionInfo = await AuthService.instance.getVersionInfo();
|
||||||
|
_versionInfo = versionInfo;
|
||||||
|
String apkVersion = await getAppVersion();
|
||||||
|
_apkVersion = apkVersion;
|
||||||
|
final String? saved = CREDENTIALS?.get('saved');
|
||||||
|
final String? username = CREDENTIALS?.get('username');
|
||||||
|
final String? password = CREDENTIALS?.get('password');
|
||||||
|
debugPrint(username);
|
||||||
|
debugPrint(password);
|
||||||
|
if (saved != null) {
|
||||||
|
save = true;
|
||||||
|
add(UserLogin(username: username, password: password));
|
||||||
|
} else {
|
||||||
|
emit(VersionLoaded(
|
||||||
|
versionInfo: _versionInfo, apkVersion: _apkVersion));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
emit(UserError(
|
||||||
|
message: e.toString(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//Loading the current version of the app
|
||||||
|
on<LoadVersion>((event, emit) {
|
||||||
|
emit(VersionLoaded(versionInfo: _versionInfo, apkVersion: _apkVersion));
|
||||||
|
});
|
||||||
|
|
||||||
|
on<UserLogin>((event, emit) async {
|
||||||
|
try {
|
||||||
|
Map<dynamic, dynamic> response = await AuthService.instance
|
||||||
|
.webLogin(username: event.username, password: event.password);
|
||||||
|
if (response['status'] == true) {
|
||||||
|
UserData userData = UserData.fromJson(response['data']);
|
||||||
|
emit(UserLoggedIn(
|
||||||
|
userData: userData, success: true, message: response['message'],savedCredentials: save));
|
||||||
|
} else {
|
||||||
|
emit(UserLoggedIn(
|
||||||
|
userData: null, success: false, message: response['message'],savedCredentials: save));
|
||||||
|
}
|
||||||
|
} on TimeoutException catch (_) {
|
||||||
|
emit(InternetTimeout(message: timeoutError));
|
||||||
|
} on SocketException catch (_) {
|
||||||
|
emit(InternetTimeout(message: timeoutError));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
on<UuidLogin>((event, emit) async {
|
||||||
|
try {
|
||||||
|
UserData? userData = await AuthService.instance
|
||||||
|
.qrLogin(uuid: event.uuid, password: event.password);
|
||||||
|
_userData = userData;
|
||||||
|
emit(UserLoggedIn(userData: _userData,savedCredentials: save));
|
||||||
|
} on TimeoutException catch (_) {
|
||||||
|
emit(InternetTimeout(message: timeoutError));
|
||||||
|
} on SocketException catch (_) {
|
||||||
|
emit(InternetTimeout(message: timeoutError));
|
||||||
|
} on Error catch (_) {
|
||||||
|
emit(InvalidCredentials(message: "Invalid username or password"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
on<LoadLoggedInUser>((event, emit) {
|
||||||
|
emit(UserLoggedIn(userData: _userData,savedCredentials: save));
|
||||||
|
});
|
||||||
|
on<GetUuid>((event, emit) async {
|
||||||
|
ScanResult result = await QRCodeBarCodeScanner.instance.scanner();
|
||||||
|
if (result.rawContent.toString().isNotEmpty) {
|
||||||
|
emit(UuidLoaded(uuid: result.rawContent.toString()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ class UserLoading extends UserState {
|
||||||
}
|
}
|
||||||
|
|
||||||
class SplashScreen extends UserState {
|
class SplashScreen extends UserState {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [];
|
List<Object> get props => [];
|
||||||
}
|
}
|
||||||
|
@ -32,7 +33,10 @@ class UserError extends UserState {
|
||||||
}
|
}
|
||||||
class UserLoggedIn extends UserState{
|
class UserLoggedIn extends UserState{
|
||||||
final UserData? userData;
|
final UserData? userData;
|
||||||
UserLoggedIn({this.userData});
|
final String? message;
|
||||||
|
final bool? success;
|
||||||
|
final bool? savedCredentials;
|
||||||
|
UserLoggedIn({this.userData,this.message,this.success,this.savedCredentials});
|
||||||
}
|
}
|
||||||
|
|
||||||
class VersionLoaded extends UserState {
|
class VersionLoaded extends UserState {
|
||||||
|
@ -48,3 +52,15 @@ class UuidLoaded extends UserState{
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [uuid];
|
List<Object> get props => [uuid];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class InternetTimeout extends UserState{
|
||||||
|
final String message;
|
||||||
|
InternetTimeout({required this.message});
|
||||||
|
@override
|
||||||
|
List<Object> get props => [message];
|
||||||
|
}
|
||||||
|
|
||||||
|
class InvalidCredentials extends UserState{
|
||||||
|
final String message ;
|
||||||
|
InvalidCredentials ({required this.message});
|
||||||
|
}
|
|
@ -3,15 +3,28 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:device_preview/device_preview.dart';
|
import 'package:device_preview/device_preview.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:unit2/bloc/bloc/user_bloc.dart';
|
import 'package:hive/hive.dart';
|
||||||
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
import 'package:unit2/utils/app_router.dart';
|
import 'package:unit2/utils/app_router.dart';
|
||||||
import 'package:unit2/utils/global_context.dart';
|
import 'package:unit2/utils/global_context.dart';
|
||||||
import 'package:unit2/utils/global_context.dart';
|
import 'package:unit2/utils/global_context.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart' as path_provider;
|
||||||
import './utils/router.dart';
|
import './utils/router.dart';
|
||||||
import './utils/global.dart';
|
import './utils/global.dart';
|
||||||
|
|
||||||
void main() {
|
Future main() async {
|
||||||
runApp(MyApp());
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
var appDirectory = await path_provider.getApplicationDocumentsDirectory();
|
||||||
|
await Hive.initFlutter(appDirectory.path);
|
||||||
|
CREDENTIALS = await Hive.openBox<dynamic>('credentials');
|
||||||
|
SOSCONTACTS = await Hive.openBox<String>('soscontacts');
|
||||||
|
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
|
||||||
|
.then((_) {
|
||||||
|
runApp(MyApp());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// void main() => runApp(
|
// void main() => runApp(
|
||||||
|
@ -46,6 +59,9 @@ class MyApp extends StatelessWidget {
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
create: (_) => UserBloc(),
|
create: (_) => UserBloc(),
|
||||||
),
|
),
|
||||||
|
BlocProvider(
|
||||||
|
create: (_) => ProfileBloc(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
child: MaterialApp(
|
child: MaterialApp(
|
||||||
navigatorKey: NavigationService.navigatorKey,
|
navigatorKey: NavigationService.navigatorKey,
|
||||||
|
@ -55,8 +71,10 @@ class MyApp extends StatelessWidget {
|
||||||
// routeInformationParser: goRouter.routeInformationParser,
|
// routeInformationParser: goRouter.routeInformationParser,
|
||||||
// routerDelegate: goRouter.routerDelegate,
|
// routerDelegate: goRouter.routerDelegate,
|
||||||
// routeInformationProvider: goRouter.routeInformationProvider,
|
// routeInformationProvider: goRouter.routeInformationProvider,
|
||||||
|
|
||||||
title: 'uniT2 - Universal Tracker and Tracer',
|
title: 'uniT2 - Universal Tracker and Tracer',
|
||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
|
primarySwatch: Colors.red,
|
||||||
appBarTheme: const AppBarTheme(
|
appBarTheme: const AppBarTheme(
|
||||||
systemOverlayStyle: SystemUiOverlayStyle(
|
systemOverlayStyle: SystemUiOverlayStyle(
|
||||||
statusBarBrightness: Brightness.dark,
|
statusBarBrightness: Brightness.dark,
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
class AddressCategory {
|
||||||
|
AddressCategory({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.type,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final String? type;
|
||||||
|
|
||||||
|
factory AddressCategory.fromJson(Map<String, dynamic> json) => AddressCategory(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
type: json["type"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"type": type,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final barangay = barangayFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'city.dart';
|
||||||
|
import 'provinces.dart';
|
||||||
|
|
||||||
|
Barangay barangayFromJson(String str) => Barangay.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String barangayToJson(Barangay data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class Barangay {
|
||||||
|
Barangay({
|
||||||
|
required this.code,
|
||||||
|
required this.description,
|
||||||
|
required this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? code;
|
||||||
|
final String? description;
|
||||||
|
final CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory Barangay.fromJson(Map<String, dynamic> json) => Barangay(
|
||||||
|
code: json["code"],
|
||||||
|
description: json["description"],
|
||||||
|
cityMunicipality: json['city_municipality'] == null? null: CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"code": code,
|
||||||
|
"description": description,
|
||||||
|
"city_municipality": cityMunicipality!.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final city = cityFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'provinces.dart';
|
||||||
|
import 'region.dart';
|
||||||
|
|
||||||
|
CityMunicipality cityFromJson(String str) => CityMunicipality.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String cityToJson(CityMunicipality data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class CityMunicipality {
|
||||||
|
CityMunicipality({
|
||||||
|
required this.code,
|
||||||
|
required this.description,
|
||||||
|
required this.province,
|
||||||
|
required this.psgcCode,
|
||||||
|
required this.zipcode,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? code;
|
||||||
|
final String? description;
|
||||||
|
final Province? province;
|
||||||
|
final String? psgcCode;
|
||||||
|
final String? zipcode;
|
||||||
|
|
||||||
|
factory CityMunicipality.fromJson(Map<String, dynamic> json) => CityMunicipality(
|
||||||
|
code: json["code"],
|
||||||
|
description: json["description"],
|
||||||
|
province: json['province'] == null? null : Province.fromJson(json["province"]),
|
||||||
|
psgcCode: json["psgc_code"],
|
||||||
|
zipcode: json["zipcode"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"code": code,
|
||||||
|
"description": description,
|
||||||
|
"province": province?.toJson(),
|
||||||
|
"psgc_code": psgcCode,
|
||||||
|
"zipcode": zipcode,
|
||||||
|
};
|
||||||
|
@override
|
||||||
|
String toString(){
|
||||||
|
return 'CityMunicipality{code:$code, description:$description, provice:${province.toString()} }';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final country = countryFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
Country countryFromJson(String str) => Country.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String countryToJson(Country data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class Country {
|
||||||
|
Country({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.code,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final String? code;
|
||||||
|
|
||||||
|
factory Country.fromJson(Map<String, dynamic> json) => Country(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
code: json["code"].toString(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"code": code,
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return '$id $name $code ';
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final province = provinceFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'region.dart';
|
||||||
|
|
||||||
|
Province provinceFromJson(String str) => Province.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String provinceToJson(Province data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class Province {
|
||||||
|
Province({
|
||||||
|
required this.code,
|
||||||
|
required this.description,
|
||||||
|
required this.region,
|
||||||
|
required this.psgcCode,
|
||||||
|
required this.shortname,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? code;
|
||||||
|
final String? description;
|
||||||
|
final Region? region;
|
||||||
|
final String? psgcCode;
|
||||||
|
final String? shortname;
|
||||||
|
|
||||||
|
factory Province.fromJson(Map<String, dynamic> json) => Province(
|
||||||
|
code: json["code"],
|
||||||
|
description: json["description"],
|
||||||
|
region: json['region'] == null? null: Region.fromJson(json["region"]),
|
||||||
|
psgcCode: json["psgc_code"],
|
||||||
|
shortname: json["shortname"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"code": code,
|
||||||
|
"description": description,
|
||||||
|
"region": region!.toJson(),
|
||||||
|
"psgc_code": psgcCode,
|
||||||
|
"shortname": shortname,
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString(){
|
||||||
|
return 'Province(name:$description ${region.toString()})';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final region = regionFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
Region regionFromJson(String str) => Region.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String regionToJson(Region data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class Region {
|
||||||
|
Region({
|
||||||
|
required this.code,
|
||||||
|
required this.description,
|
||||||
|
required this.psgcCode,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? code;
|
||||||
|
final String? description;
|
||||||
|
final String? psgcCode;
|
||||||
|
|
||||||
|
factory Region.fromJson(Map<String, dynamic> json) => Region(
|
||||||
|
code: json["code"],
|
||||||
|
description: json["description"],
|
||||||
|
psgcCode: json["psgc_code"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"code": code,
|
||||||
|
"description": description,
|
||||||
|
"psgc_code": psgcCode,
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString(){
|
||||||
|
return 'Region(name:$description)';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
class Subdivision {
|
||||||
|
Subdivision({
|
||||||
|
this.id,
|
||||||
|
this.lotNo,
|
||||||
|
this.blockNo,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final int? lotNo;
|
||||||
|
final int? blockNo;
|
||||||
|
|
||||||
|
factory Subdivision.fromJson(Map<String, dynamic> json) => Subdivision(
|
||||||
|
id: json["id"],
|
||||||
|
lotNo: json["lot_no"],
|
||||||
|
blockNo: json["block_no"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"lot_no": lotNo,
|
||||||
|
"block_no": blockNo,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
import 'package:unit2/model/profile/basic_information/adress.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/citizenship.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/contact_information.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/identification_information.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/primary-information.dart';
|
||||||
|
|
||||||
|
class BasicInfo{
|
||||||
|
PrimaryInformation? primaryInformation;
|
||||||
|
List<ContactInfo> contactInformation;
|
||||||
|
List<Identification> identifications;
|
||||||
|
List<Citizenship> citizenships;
|
||||||
|
List<MainAdress> addresses;
|
||||||
|
BasicInfo({required this.addresses, required this.contactInformation, required this.primaryInformation,required this.identifications,required this.citizenships});
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
|
||||||
|
|
||||||
|
import '../../location/barangay.dart';
|
||||||
|
import '../../location/city.dart';
|
||||||
|
import '../../location/country.dart';
|
||||||
|
import '../../location/subdivision.dart';
|
||||||
|
import '../../utils/category.dart';
|
||||||
|
|
||||||
|
class MainAdress {
|
||||||
|
MainAdress({
|
||||||
|
this.id,
|
||||||
|
this.address,
|
||||||
|
this.details,
|
||||||
|
this.subdivision,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final AddressClass? address;
|
||||||
|
final String? details;
|
||||||
|
final Subdivision? subdivision;
|
||||||
|
|
||||||
|
factory MainAdress.fromJson(Map<String, dynamic> json) => MainAdress(
|
||||||
|
id: json["id"],
|
||||||
|
address: json["address"] == null ? null : AddressClass.fromJson(json["address"]),
|
||||||
|
details: json["details"],
|
||||||
|
subdivision: json["subdivision"] == null ? null : Subdivision.fromJson(json["subdivision"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"address": address?.toJson(),
|
||||||
|
"details": details,
|
||||||
|
"subdivision": subdivision?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddressClass {
|
||||||
|
AddressClass({
|
||||||
|
this.id,
|
||||||
|
this.country,
|
||||||
|
this.barangay,
|
||||||
|
this.category,
|
||||||
|
this.areaClass,
|
||||||
|
this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final Country? country;
|
||||||
|
final Barangay? barangay;
|
||||||
|
final Category? category;
|
||||||
|
final String? areaClass;
|
||||||
|
final CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory AddressClass.fromJson(Map<String, dynamic> json) => AddressClass(
|
||||||
|
id: json["id"],
|
||||||
|
country: json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||||
|
barangay: json["barangay"] == null ? null : Barangay.fromJson(json["barangay"]),
|
||||||
|
category: json["category"] == null ? null : Category.fromJson(json["category"]),
|
||||||
|
areaClass: json["area_class"],
|
||||||
|
cityMunicipality: json["city_municipality"] == null ? null : CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"country": country?.toJson(),
|
||||||
|
"barangay": barangay?.toJson(),
|
||||||
|
"category": category?.toJson(),
|
||||||
|
"area_class": areaClass,
|
||||||
|
"city_municipality": cityMunicipality?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
import '../../location/country.dart';
|
||||||
|
|
||||||
|
class Citizenship {
|
||||||
|
Citizenship({
|
||||||
|
required this.country,
|
||||||
|
required this.naturalBorn,
|
||||||
|
});
|
||||||
|
|
||||||
|
final Country? country;
|
||||||
|
final bool? naturalBorn;
|
||||||
|
|
||||||
|
factory Citizenship.fromJson(Map<String, dynamic> json) => Citizenship(
|
||||||
|
country: Country.fromJson(json["country"]),
|
||||||
|
naturalBorn: json["natural_born"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"country": country!.toJson(),
|
||||||
|
"natural_born": naturalBorn,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,107 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final contactInformation = contactInformationFromJson(jsonString);
|
||||||
|
|
||||||
|
|
||||||
|
import '../../utils/agency.dart';
|
||||||
|
|
||||||
|
class ContactInfo {
|
||||||
|
ContactInfo({
|
||||||
|
required this.id,
|
||||||
|
required this.active,
|
||||||
|
required this.primary,
|
||||||
|
required this.numbermail,
|
||||||
|
required this.commService,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
bool? active;
|
||||||
|
bool? primary;
|
||||||
|
String? numbermail;
|
||||||
|
CommService? commService;
|
||||||
|
|
||||||
|
factory ContactInfo.fromJson(Map<String, dynamic> json) => ContactInfo(
|
||||||
|
id: json["id"],
|
||||||
|
active: json["active"],
|
||||||
|
primary: json["primary"],
|
||||||
|
numbermail: json["numbermail"],
|
||||||
|
commService: json["comm_service"]==null?null: CommService.fromJson(json["comm_service"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"active": active,
|
||||||
|
"primary": primary,
|
||||||
|
"numbermail": numbermail,
|
||||||
|
"comm_service": commService!.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class CommService {
|
||||||
|
CommService({
|
||||||
|
required this.id,
|
||||||
|
required this.serviceType,
|
||||||
|
required this.serviceProvider,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
ServiceType? serviceType;
|
||||||
|
ServiceProvider? serviceProvider;
|
||||||
|
|
||||||
|
factory CommService.fromJson(Map<String, dynamic> json) => CommService(
|
||||||
|
id: json["id"],
|
||||||
|
serviceType: json["service_type"]==null?null: ServiceType.fromJson(json["service_type"]),
|
||||||
|
serviceProvider: json["service_provider"] == null?null: ServiceProvider.fromJson(json["service_provider"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"service_type": serviceType!.toJson(),
|
||||||
|
"service_provider": serviceProvider!.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class ServiceProvider {
|
||||||
|
ServiceProvider({
|
||||||
|
required this.id,
|
||||||
|
required this.alias,
|
||||||
|
required this.agency,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
String? alias;
|
||||||
|
Agency? agency;
|
||||||
|
|
||||||
|
factory ServiceProvider.fromJson(Map<String, dynamic> json) => ServiceProvider(
|
||||||
|
id: json["id"],
|
||||||
|
alias: json["alias"],
|
||||||
|
agency: json["agency"] == null? null: Agency.fromJson(json["agency"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"alias": alias,
|
||||||
|
"agency": agency!.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ServiceType {
|
||||||
|
ServiceType({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
String? name;
|
||||||
|
|
||||||
|
factory ServiceType.fromJson(Map<String, dynamic> json) => ServiceType(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import '../../location/city.dart';
|
||||||
|
import '../../location/country.dart';
|
||||||
|
import '../../utils/agency.dart';
|
||||||
|
|
||||||
|
Identification identificationFromJson(String str) => Identification.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String identificationToJson(Identification data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class Identification {
|
||||||
|
Identification({
|
||||||
|
required this.id,
|
||||||
|
required this.agency,
|
||||||
|
required this.issuedAt,
|
||||||
|
this.dateIssued,
|
||||||
|
this.expirationDate,
|
||||||
|
required this.asPdfReference,
|
||||||
|
required this.identificationNumber,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
Agency? agency;
|
||||||
|
IssuedAt? issuedAt;
|
||||||
|
DateTime? dateIssued;
|
||||||
|
DateTime? expirationDate;
|
||||||
|
bool? asPdfReference;
|
||||||
|
String? identificationNumber;
|
||||||
|
|
||||||
|
factory Identification.fromJson(Map<String, dynamic> json) => Identification(
|
||||||
|
id: json["id"],
|
||||||
|
agency:json["agency"] == null? null: Agency.fromJson(json["agency"]),
|
||||||
|
issuedAt: json["issued_at"] == null? null:IssuedAt.fromJson(json["issued_at"]),
|
||||||
|
dateIssued:json["date_issued"]==null?null:DateTime.parse(json["date_issued"]),
|
||||||
|
expirationDate:json["expiration_date"]==null?null:DateTime.parse(json["expiration_date"]),
|
||||||
|
asPdfReference: json["as_pdf_reference"],
|
||||||
|
identificationNumber: json["identification_number"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"agency": agency!.toJson(),
|
||||||
|
"issued_at": issuedAt!.toJson(),
|
||||||
|
"date_issued": dateIssued,
|
||||||
|
"expiration_date": expirationDate,
|
||||||
|
"as_pdf_reference": asPdfReference,
|
||||||
|
"identification_number": identificationNumber,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class IssuedAt {
|
||||||
|
IssuedAt({
|
||||||
|
required this.id,
|
||||||
|
this.issuedAtClass,
|
||||||
|
required this.country,
|
||||||
|
this.barangay,
|
||||||
|
required this.addressCategory,
|
||||||
|
required this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
dynamic issuedAtClass;
|
||||||
|
Country? country;
|
||||||
|
dynamic barangay;
|
||||||
|
AddressCategory? addressCategory;
|
||||||
|
CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory IssuedAt.fromJson(Map<String, dynamic> json) => IssuedAt(
|
||||||
|
id: json["id"],
|
||||||
|
issuedAtClass: json["class"],
|
||||||
|
country: json['country'] == null? null: Country.fromJson(json["country"]),
|
||||||
|
barangay: json["barangay"],
|
||||||
|
addressCategory: json["address_category"] == null? null: AddressCategory.fromJson(json["address_category"]),
|
||||||
|
cityMunicipality:json["city_municipality"] == null? null: CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"class": issuedAtClass,
|
||||||
|
"country": country!.toJson(),
|
||||||
|
"barangay": barangay,
|
||||||
|
"address_category": addressCategory!.toJson(),
|
||||||
|
"city_municipality": cityMunicipality!.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class AddressCategory {
|
||||||
|
AddressCategory({
|
||||||
|
required this.id,
|
||||||
|
required this.name,
|
||||||
|
required this.type,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
String? name;
|
||||||
|
String? type;
|
||||||
|
|
||||||
|
factory AddressCategory.fromJson(Map<String, dynamic> json) => AddressCategory(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
type: json["type"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"type": type,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
class PrimaryInformation {
|
||||||
|
PrimaryInformation({
|
||||||
|
required this.id,
|
||||||
|
required this.lastName,
|
||||||
|
required this.firstName,
|
||||||
|
required this.middleName,
|
||||||
|
required this.nameExtension,
|
||||||
|
required this.sex,
|
||||||
|
required this.birthdate,
|
||||||
|
required this.civilStatus,
|
||||||
|
required this.bloodType,
|
||||||
|
required this.heightM,
|
||||||
|
required this.weightKg,
|
||||||
|
required this.photoPath,
|
||||||
|
required this.esigPath,
|
||||||
|
required this.maidenName,
|
||||||
|
required this.deceased,
|
||||||
|
required this.gender,
|
||||||
|
required this.uuidQrcode,
|
||||||
|
required this.titlePrefix,
|
||||||
|
required this.titleSuffix,
|
||||||
|
required this.showTitleId,
|
||||||
|
});
|
||||||
|
|
||||||
|
int? id;
|
||||||
|
String? lastName;
|
||||||
|
String? firstName;
|
||||||
|
String? middleName;
|
||||||
|
String? nameExtension;
|
||||||
|
String? sex;
|
||||||
|
DateTime? birthdate;
|
||||||
|
String? civilStatus;
|
||||||
|
String? bloodType;
|
||||||
|
double? heightM;
|
||||||
|
double? weightKg;
|
||||||
|
String? photoPath;
|
||||||
|
String? esigPath;
|
||||||
|
String? maidenName;
|
||||||
|
bool? deceased;
|
||||||
|
String? gender;
|
||||||
|
String? uuidQrcode;
|
||||||
|
String? titlePrefix;
|
||||||
|
String? titleSuffix;
|
||||||
|
bool? showTitleId;
|
||||||
|
|
||||||
|
factory PrimaryInformation.fromJson(Map<String, dynamic> json) =>
|
||||||
|
PrimaryInformation(
|
||||||
|
id: json["id"],
|
||||||
|
lastName: json["last_name"],
|
||||||
|
firstName: json["first_name"],
|
||||||
|
middleName: json["middle_name"],
|
||||||
|
nameExtension: json["name_extension"],
|
||||||
|
sex: json["sex"],
|
||||||
|
birthdate: json['birthdate']==null?null:DateTime.parse(json["birthdate"]),
|
||||||
|
civilStatus: json["civil_status"],
|
||||||
|
bloodType: json["blood_type"],
|
||||||
|
heightM: json["height_m"]?.toDouble(),
|
||||||
|
weightKg: json["weight_kg"],
|
||||||
|
photoPath: json["photo_path"],
|
||||||
|
esigPath: json["esig_path"],
|
||||||
|
maidenName: json["maiden_name"],
|
||||||
|
deceased: json["deceased"],
|
||||||
|
gender: json["gender"],
|
||||||
|
uuidQrcode: json["uuid_qrcode"],
|
||||||
|
titlePrefix: json["title_prefix"],
|
||||||
|
titleSuffix: json["title_suffix"],
|
||||||
|
showTitleId: json["show_title_id"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"last_name": lastName,
|
||||||
|
"first_name": firstName,
|
||||||
|
"middle_name": middleName,
|
||||||
|
"name_extension": nameExtension,
|
||||||
|
"sex": sex,
|
||||||
|
"birthdate":
|
||||||
|
"${birthdate!.year.toString().padLeft(4, '0')}-${birthdate!.month.toString().padLeft(2, '0')}-${birthdate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"civil_status": civilStatus,
|
||||||
|
"blood_type": bloodType,
|
||||||
|
"height_m": heightM,
|
||||||
|
"weight_kg": weightKg,
|
||||||
|
"photo_path": photoPath,
|
||||||
|
"esig_path": esigPath,
|
||||||
|
"maiden_name": maidenName,
|
||||||
|
"deceased": deceased,
|
||||||
|
"gender": gender,
|
||||||
|
"uuid_qrcode": uuidQrcode,
|
||||||
|
"title_prefix": titlePrefix,
|
||||||
|
"title_suffix": titleSuffix,
|
||||||
|
"show_title_id": showTitleId,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final educationalBackground = educationalBackgroundFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
EducationalBackground educationalBackgroundFromJson(String str) => EducationalBackground.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String educationalBackgroundToJson(EducationalBackground data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class EducationalBackground {
|
||||||
|
EducationalBackground({
|
||||||
|
this.id,
|
||||||
|
this.honors,
|
||||||
|
this.education,
|
||||||
|
this.periodTo,
|
||||||
|
this.attachments,
|
||||||
|
this.periodFrom,
|
||||||
|
this.unitsEarned,
|
||||||
|
this.yearGraduated,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final List<Honor>? honors;
|
||||||
|
final Education? education;
|
||||||
|
final String? periodTo;
|
||||||
|
final dynamic attachments;
|
||||||
|
final String? periodFrom;
|
||||||
|
final dynamic unitsEarned;
|
||||||
|
final String? yearGraduated;
|
||||||
|
|
||||||
|
factory EducationalBackground.fromJson(Map<String, dynamic> json) => EducationalBackground(
|
||||||
|
id: json["id"],
|
||||||
|
honors: json["honors"] == null ? [] : List<Honor>.from(json["honors"]!.map((x) => Honor.fromJson(x))),
|
||||||
|
education: json["education"] == null ? null : Education.fromJson(json["education"]),
|
||||||
|
periodTo: json["period_to"],
|
||||||
|
attachments: json["attachments"],
|
||||||
|
periodFrom: json["period_from"],
|
||||||
|
unitsEarned: json["units_earned"],
|
||||||
|
yearGraduated: json["year_graduated"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"honors": honors == null ? [] : List<dynamic>.from(honors!.map((x) => x.toJson())),
|
||||||
|
"education": education?.toJson(),
|
||||||
|
"period_to": periodTo,
|
||||||
|
"attachments": attachments,
|
||||||
|
"period_from": periodFrom,
|
||||||
|
"units_earned": unitsEarned,
|
||||||
|
"year_graduated": yearGraduated,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Education {
|
||||||
|
Education({
|
||||||
|
this.id,
|
||||||
|
this.level,
|
||||||
|
this.course,
|
||||||
|
this.school,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? level;
|
||||||
|
final Course? course;
|
||||||
|
final School? school;
|
||||||
|
|
||||||
|
factory Education.fromJson(Map<String, dynamic> json) => Education(
|
||||||
|
id: json["id"],
|
||||||
|
level: json["level"],
|
||||||
|
course: json["course"] == null ? null : Course.fromJson(json["course"]),
|
||||||
|
school: json["school"] == null ? null : School.fromJson(json["school"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"level": level,
|
||||||
|
"course": course?.toJson(),
|
||||||
|
"school": school?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Course {
|
||||||
|
Course({
|
||||||
|
this.id,
|
||||||
|
this.program,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? program;
|
||||||
|
|
||||||
|
factory Course.fromJson(Map<String, dynamic> json) => Course(
|
||||||
|
id: json["id"],
|
||||||
|
program: json["program"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"program": program,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class School {
|
||||||
|
School({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
|
||||||
|
factory School.fromJson(Map<String, dynamic> json) => School(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Honor {
|
||||||
|
Honor({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.academ,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final bool? academ;
|
||||||
|
|
||||||
|
factory Honor.fromJson(Map<String, dynamic> json) => Honor(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
academ: json["academ"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"academ": academ,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,123 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final eligibity = eligibityFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:unit2/model/location/region.dart';
|
||||||
|
|
||||||
|
import '../location/address_category.dart';
|
||||||
|
import '../location/city.dart';
|
||||||
|
import '../location/country.dart';
|
||||||
|
import '../utils/eligibility.dart';
|
||||||
|
|
||||||
|
EligibityCert eligibityFromJson(String str) =>
|
||||||
|
EligibityCert.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String eligibityToJson(EligibityCert data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class EligibityCert {
|
||||||
|
EligibityCert({
|
||||||
|
required this.id,
|
||||||
|
required this.rating,
|
||||||
|
required this.examDate,
|
||||||
|
required this.attachments,
|
||||||
|
required this.eligibility,
|
||||||
|
required this.examAddress,
|
||||||
|
required this.validityDate,
|
||||||
|
required this.licenseNumber,
|
||||||
|
required this.overseas,
|
||||||
|
});
|
||||||
|
bool? overseas;
|
||||||
|
final int? id;
|
||||||
|
final double? rating;
|
||||||
|
final DateTime? examDate;
|
||||||
|
final dynamic attachments;
|
||||||
|
final Eligibility? eligibility;
|
||||||
|
final ExamAddress? examAddress;
|
||||||
|
final DateTime? validityDate;
|
||||||
|
final String? licenseNumber;
|
||||||
|
|
||||||
|
factory EligibityCert.fromJson(Map<String, dynamic> json) => EligibityCert(
|
||||||
|
id: json["id"],
|
||||||
|
rating: json["rating"]?.toDouble(),
|
||||||
|
examDate: json['exam_date'] == null
|
||||||
|
? null
|
||||||
|
: DateTime.parse(json["exam_date"]),
|
||||||
|
attachments: null,
|
||||||
|
eligibility: json['eligibility'] == null
|
||||||
|
? null
|
||||||
|
: Eligibility.fromJson(json["eligibility"]),
|
||||||
|
examAddress: json['exam_address'] == null
|
||||||
|
? null
|
||||||
|
: ExamAddress.fromJson(json["exam_address"]),
|
||||||
|
validityDate: json['validity_date'] == null
|
||||||
|
? null
|
||||||
|
: DateTime.parse(json["validity_date"]),
|
||||||
|
licenseNumber: json["license_number"],
|
||||||
|
overseas: null,
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"rating": rating,
|
||||||
|
"exam_date":
|
||||||
|
"${examDate!.year.toString().padLeft(4, '0')}-${examDate!.month.toString().padLeft(2, '0')}-${examDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"attachments": attachments,
|
||||||
|
"eligibility": eligibility!.toJson(),
|
||||||
|
"exam_address": examAddress!.toJson(),
|
||||||
|
"validity_date": "${validityDate!.year.toString().padLeft(4, '0')}-${validityDate!.month.toString().padLeft(2, '0')}-${validityDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"license_number": licenseNumber,
|
||||||
|
};
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'eligibility:${eligibility.toString()}, rating:$rating, examDate:${examDate.toString()},validydate:${validityDate.toString()}, lisence:$licenseNumber, examAddress:${examAddress.toString()}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExamAddress {
|
||||||
|
ExamAddress({
|
||||||
|
required this.id,
|
||||||
|
required this.examAddressClass,
|
||||||
|
required this.country,
|
||||||
|
required this.barangay,
|
||||||
|
required this.addressCategory,
|
||||||
|
required this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final dynamic examAddressClass;
|
||||||
|
final Country? country;
|
||||||
|
final dynamic barangay;
|
||||||
|
final AddressCategory? addressCategory;
|
||||||
|
final CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory ExamAddress.fromJson(Map<String, dynamic> json) => ExamAddress(
|
||||||
|
id: json["id"],
|
||||||
|
examAddressClass: json["class"],
|
||||||
|
country:
|
||||||
|
json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||||
|
barangay: json["barangay"],
|
||||||
|
addressCategory: json["address_category"] == null
|
||||||
|
? null
|
||||||
|
: AddressCategory.fromJson(json["address_category"]),
|
||||||
|
cityMunicipality: json["city_municipality"] == null
|
||||||
|
? null
|
||||||
|
: CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"class": examAddressClass,
|
||||||
|
"country": country!.toJson(),
|
||||||
|
"barangay": barangay,
|
||||||
|
"address_category": addressCategory!.toJson(),
|
||||||
|
"city_municipality": cityMunicipality!.toJson(),
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'country:${country.toString()} , address:${cityMunicipality.toString()}';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,247 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final familyBackground = familyBackgroundFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:ffi';
|
||||||
|
|
||||||
|
import '../utils/category.dart';
|
||||||
|
import '../utils/position.dart';
|
||||||
|
|
||||||
|
FamilyBackground familyBackgroundFromJson(String str) => FamilyBackground.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String familyBackgroundToJson(FamilyBackground data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class FamilyBackground {
|
||||||
|
FamilyBackground({
|
||||||
|
this.company,
|
||||||
|
this.position,
|
||||||
|
this.relationship,
|
||||||
|
this.relatedPerson,
|
||||||
|
this.companyAddress,
|
||||||
|
this.emergencyContact,
|
||||||
|
this.incaseOfEmergency,
|
||||||
|
this.companyContactNumber,
|
||||||
|
});
|
||||||
|
|
||||||
|
final Company? company;
|
||||||
|
final Position? position;
|
||||||
|
final Relationship? relationship;
|
||||||
|
final RelatedPerson? relatedPerson;
|
||||||
|
final String? companyAddress;
|
||||||
|
final List<EmergencyContact>? emergencyContact;
|
||||||
|
final bool? incaseOfEmergency;
|
||||||
|
final String? companyContactNumber;
|
||||||
|
|
||||||
|
factory FamilyBackground.fromJson(Map<String, dynamic> json) => FamilyBackground(
|
||||||
|
company: json["company"] == null ? null : Company.fromJson(json["company"]),
|
||||||
|
position: json["position"] == null ? null : Position.fromJson(json["position"]),
|
||||||
|
relationship: json["relationship"] == null ? null : Relationship.fromJson(json["relationship"]),
|
||||||
|
relatedPerson: json["related_person"] == null ? null : RelatedPerson.fromJson(json["related_person"]),
|
||||||
|
companyAddress: json["company_address"],
|
||||||
|
emergencyContact: json["emergency_contact"] == null ? [] : List<EmergencyContact>.from(json["emergency_contact"]!.map((x) => EmergencyContact.fromJson(x))),
|
||||||
|
incaseOfEmergency: json["incase_of_emergency"],
|
||||||
|
companyContactNumber: json["company_contact_number"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"company": company?.toJson(),
|
||||||
|
"position": position?.toJson(),
|
||||||
|
"relationship": relationship?.toJson(),
|
||||||
|
"related_person": relatedPerson?.toJson(),
|
||||||
|
"company_address": companyAddress,
|
||||||
|
"emergency_contact": emergencyContact == null ? [] : List<dynamic>.from(emergencyContact!.map((x) => x.toJson())),
|
||||||
|
"incase_of_emergency": incaseOfEmergency,
|
||||||
|
"company_contact_number": companyContactNumber,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Company {
|
||||||
|
Company({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.category,
|
||||||
|
this.privateEntity,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final Category? category;
|
||||||
|
final bool? privateEntity;
|
||||||
|
|
||||||
|
factory Company.fromJson(Map<String, dynamic> json) => Company(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
category: json["category"] == null ? null : Category.fromJson(json["category"]),
|
||||||
|
privateEntity: json["private_entity"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"category": category?.toJson(),
|
||||||
|
"private_entity": privateEntity,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class EmergencyContact {
|
||||||
|
EmergencyContact({
|
||||||
|
this.telco,
|
||||||
|
this.isactive,
|
||||||
|
this.provider,
|
||||||
|
this.isprimary,
|
||||||
|
this.numbermail,
|
||||||
|
this.serviceType,
|
||||||
|
this.contactinfoid,
|
||||||
|
this.commServiceId,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? telco;
|
||||||
|
final bool? isactive;
|
||||||
|
final int? provider;
|
||||||
|
final bool? isprimary;
|
||||||
|
final String? numbermail;
|
||||||
|
final int? serviceType;
|
||||||
|
final int? contactinfoid;
|
||||||
|
final int? commServiceId;
|
||||||
|
|
||||||
|
factory EmergencyContact.fromJson(Map<String, dynamic> json) => EmergencyContact(
|
||||||
|
telco: json["telco"],
|
||||||
|
isactive: json["isactive"],
|
||||||
|
provider: json["provider"],
|
||||||
|
isprimary: json["isprimary"],
|
||||||
|
numbermail: json["numbermail"],
|
||||||
|
serviceType: json["service_type"],
|
||||||
|
contactinfoid: json["contactinfoid"],
|
||||||
|
commServiceId: json["comm_service_id"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"telco": telco,
|
||||||
|
"isactive": isactive,
|
||||||
|
"provider": provider,
|
||||||
|
"isprimary": isprimary,
|
||||||
|
"numbermail": numbermail,
|
||||||
|
"service_type": serviceType,
|
||||||
|
"contactinfoid": contactinfoid,
|
||||||
|
"comm_service_id": commServiceId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class RelatedPerson {
|
||||||
|
RelatedPerson({
|
||||||
|
this.id,
|
||||||
|
this.sex,
|
||||||
|
this.gender,
|
||||||
|
this.deceased,
|
||||||
|
this.heightM,
|
||||||
|
this.birthdate,
|
||||||
|
this.esigPath,
|
||||||
|
this.lastName,
|
||||||
|
this.weightKg,
|
||||||
|
this.bloodType,
|
||||||
|
this.firstName,
|
||||||
|
this.photoPath,
|
||||||
|
this.maidenName,
|
||||||
|
this.middleName,
|
||||||
|
this.uuidQrcode,
|
||||||
|
this.civilStatus,
|
||||||
|
this.titlePrefix,
|
||||||
|
this.titleSuffix,
|
||||||
|
this.showTitleId,
|
||||||
|
this.nameExtension,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? sex;
|
||||||
|
final String? gender;
|
||||||
|
final bool? deceased;
|
||||||
|
final double? heightM;
|
||||||
|
final DateTime? birthdate;
|
||||||
|
final String? esigPath;
|
||||||
|
final String? lastName;
|
||||||
|
final double? weightKg;
|
||||||
|
final String? bloodType;
|
||||||
|
final String? firstName;
|
||||||
|
final String? photoPath;
|
||||||
|
final dynamic maidenName;
|
||||||
|
final String? middleName;
|
||||||
|
final String? uuidQrcode;
|
||||||
|
final String? civilStatus;
|
||||||
|
final String? titlePrefix;
|
||||||
|
final String? titleSuffix;
|
||||||
|
final bool? showTitleId;
|
||||||
|
final String? nameExtension;
|
||||||
|
|
||||||
|
factory RelatedPerson.fromJson(Map<String, dynamic> json) => RelatedPerson(
|
||||||
|
id: json["id"],
|
||||||
|
sex: json["sex"],
|
||||||
|
gender: json["gender"],
|
||||||
|
deceased: json["deceased"],
|
||||||
|
heightM: json["height_m"] == null?null:double.parse(json["height_m"].toString()),
|
||||||
|
birthdate: json["birthdate"] == null ? null : DateTime.parse(json["birthdate"]),
|
||||||
|
esigPath: json["esig_path"],
|
||||||
|
lastName: json["last_name"],
|
||||||
|
weightKg: json["weight_kg"] == null? null:double.parse(json["weight_kg"].toString()) ,
|
||||||
|
bloodType: json["blood_type"],
|
||||||
|
firstName: json["first_name"],
|
||||||
|
photoPath: json["photo_path"],
|
||||||
|
maidenName: json["maiden_name"],
|
||||||
|
middleName: json["middle_name"],
|
||||||
|
uuidQrcode: json["uuid_qrcode"],
|
||||||
|
civilStatus: json["civil_status"],
|
||||||
|
titlePrefix: json["title_prefix"],
|
||||||
|
titleSuffix: json["title_suffix"],
|
||||||
|
showTitleId: json["show_title_id"],
|
||||||
|
nameExtension: json["name_extension"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"sex": sex,
|
||||||
|
"gender": gender,
|
||||||
|
"deceased": deceased,
|
||||||
|
"height_m": heightM,
|
||||||
|
"birthdate": "${birthdate!.year.toString().padLeft(4, '0')}-${birthdate!.month.toString().padLeft(2, '0')}-${birthdate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"esig_path": esigPath,
|
||||||
|
"last_name": lastName,
|
||||||
|
"weight_kg": weightKg,
|
||||||
|
"blood_type": bloodType,
|
||||||
|
"first_name": firstName,
|
||||||
|
"photo_path": photoPath,
|
||||||
|
"maiden_name": maidenName,
|
||||||
|
"middle_name": middleName,
|
||||||
|
"uuid_qrcode": uuidQrcode,
|
||||||
|
"civil_status": civilStatus,
|
||||||
|
"title_prefix": titlePrefix,
|
||||||
|
"title_suffix": titleSuffix,
|
||||||
|
"show_title_id": showTitleId,
|
||||||
|
"name_extension": nameExtension,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Relationship {
|
||||||
|
Relationship({
|
||||||
|
this.id,
|
||||||
|
this.type,
|
||||||
|
this.category,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? type;
|
||||||
|
final String? category;
|
||||||
|
|
||||||
|
factory Relationship.fromJson(Map<String, dynamic> json) => Relationship(
|
||||||
|
id: json["id"],
|
||||||
|
type: json["type"],
|
||||||
|
category: json["category"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"type": type,
|
||||||
|
"category": category,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,231 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final learningDevelopement = learningDevelopementFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import '../location/city.dart';
|
||||||
|
import '../location/country.dart';
|
||||||
|
import '../utils/industry_class.dart';
|
||||||
|
|
||||||
|
LearningDevelopement learningDevelopementFromJson(String str) => LearningDevelopement.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String learningDevelopementToJson(LearningDevelopement data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class LearningDevelopement {
|
||||||
|
LearningDevelopement({
|
||||||
|
this.attachments,
|
||||||
|
this.sponsoredBy,
|
||||||
|
this.conductedTraining,
|
||||||
|
this.totalHoursAttended,
|
||||||
|
});
|
||||||
|
|
||||||
|
final dynamic attachments;
|
||||||
|
final EdBy? sponsoredBy;
|
||||||
|
final ConductedTraining? conductedTraining;
|
||||||
|
final double? totalHoursAttended;
|
||||||
|
|
||||||
|
factory LearningDevelopement.fromJson(Map<String, dynamic> json) => LearningDevelopement(
|
||||||
|
attachments: json["attachments"],
|
||||||
|
sponsoredBy: json["sponsored_by"] == null ? null : EdBy.fromJson(json["sponsored_by"]),
|
||||||
|
conductedTraining: json["conducted_training"] == null ? null : ConductedTraining.fromJson(json["conducted_training"]),
|
||||||
|
totalHoursAttended: json["total_hours_attended"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"attachments": attachments,
|
||||||
|
"sponsored_by": sponsoredBy?.toJson(),
|
||||||
|
"conducted_training": conductedTraining?.toJson(),
|
||||||
|
"total_hours_attended": totalHoursAttended,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConductedTraining {
|
||||||
|
ConductedTraining({
|
||||||
|
this.id,
|
||||||
|
this.title,
|
||||||
|
this.topic,
|
||||||
|
this.venue,
|
||||||
|
this.locked,
|
||||||
|
this.toDate,
|
||||||
|
this.fromDate,
|
||||||
|
this.totalHours,
|
||||||
|
this.conductedBy,
|
||||||
|
this.sessionsAttended,
|
||||||
|
this.learningDevelopmentType,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final LearningDevelopmentType? title;
|
||||||
|
final LearningDevelopmentType? topic;
|
||||||
|
final Venue? venue;
|
||||||
|
final bool? locked;
|
||||||
|
final DateTime? toDate;
|
||||||
|
final DateTime? fromDate;
|
||||||
|
final int? totalHours;
|
||||||
|
final EdBy? conductedBy;
|
||||||
|
final List<dynamic>? sessionsAttended;
|
||||||
|
final LearningDevelopmentType? learningDevelopmentType;
|
||||||
|
|
||||||
|
factory ConductedTraining.fromJson(Map<String, dynamic> json) => ConductedTraining(
|
||||||
|
id: json["id"],
|
||||||
|
title: json["title"] == null ? null : LearningDevelopmentType.fromJson(json["title"]),
|
||||||
|
topic: json["topic"] == null ? null : LearningDevelopmentType.fromJson(json["topic"]),
|
||||||
|
venue: json["venue"] == null ? null : Venue.fromJson(json["venue"]),
|
||||||
|
locked: json["locked"],
|
||||||
|
toDate: json["to_date"] == null ? null : DateTime.parse(json["to_date"]),
|
||||||
|
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
|
||||||
|
totalHours: json["total_hours"],
|
||||||
|
conductedBy: json["conducted_by"] == null ? null : EdBy.fromJson(json["conducted_by"]),
|
||||||
|
sessionsAttended: json["sessions_attended"] == null ? [] : List<dynamic>.from(json["sessions_attended"]!.map((x) => x)),
|
||||||
|
learningDevelopmentType: json["learning_development_type"] == null ? null : LearningDevelopmentType.fromJson(json["learning_development_type"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"title": title?.toJson(),
|
||||||
|
"topic": topic?.toJson(),
|
||||||
|
"venue": venue?.toJson(),
|
||||||
|
"locked": locked,
|
||||||
|
"to_date": "${toDate!.year.toString().padLeft(4, '0')}-${toDate!.month.toString().padLeft(2, '0')}-${toDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"total_hours": totalHours,
|
||||||
|
"conducted_by": conductedBy?.toJson(),
|
||||||
|
"sessions_attended": sessionsAttended == null ? [] : List<dynamic>.from(sessionsAttended!.map((x) => x)),
|
||||||
|
"learning_development_type": learningDevelopmentType?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class EdBy {
|
||||||
|
EdBy({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.category,
|
||||||
|
this.privateEntity,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final SponsoredByCategory? category;
|
||||||
|
final bool? privateEntity;
|
||||||
|
|
||||||
|
factory EdBy.fromJson(Map<String, dynamic> json) => EdBy(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
category: json["category"] == null ? null : SponsoredByCategory.fromJson(json["category"]),
|
||||||
|
privateEntity: json["private_entity"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"category": category?.toJson(),
|
||||||
|
"private_entity": privateEntity,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class SponsoredByCategory {
|
||||||
|
SponsoredByCategory({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.industryClass,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final IndustryClass? industryClass;
|
||||||
|
|
||||||
|
factory SponsoredByCategory.fromJson(Map<String, dynamic> json) => SponsoredByCategory(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
industryClass: json["industry_class"] == null ? null : IndustryClass.fromJson(json["industry_class"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"industry_class": industryClass?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class LearningDevelopmentType {
|
||||||
|
LearningDevelopmentType({
|
||||||
|
this.id,
|
||||||
|
this.title,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? title;
|
||||||
|
|
||||||
|
factory LearningDevelopmentType.fromJson(Map<String, dynamic> json) => LearningDevelopmentType(
|
||||||
|
id: json["id"],
|
||||||
|
title: json["title"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"title": title,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Venue {
|
||||||
|
Venue({
|
||||||
|
this.id,
|
||||||
|
this.country,
|
||||||
|
this.barangay,
|
||||||
|
this.category,
|
||||||
|
this.areaClass,
|
||||||
|
this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final Country? country;
|
||||||
|
final dynamic barangay;
|
||||||
|
final VenueCategory? category;
|
||||||
|
final dynamic areaClass;
|
||||||
|
final CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory Venue.fromJson(Map<String, dynamic> json) => Venue(
|
||||||
|
id: json["id"],
|
||||||
|
country: json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||||
|
barangay: json["barangay"],
|
||||||
|
category: json["category"] == null ? null : VenueCategory.fromJson(json["category"]),
|
||||||
|
areaClass: json["area_class"],
|
||||||
|
cityMunicipality: json["city_municipality"] == null ? null : CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"country": country?.toJson(),
|
||||||
|
"barangay": barangay,
|
||||||
|
"category": category?.toJson(),
|
||||||
|
"area_class": areaClass,
|
||||||
|
"city_municipality": cityMunicipality?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class VenueCategory {
|
||||||
|
VenueCategory({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.type,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final String? type;
|
||||||
|
|
||||||
|
factory VenueCategory.fromJson(Map<String, dynamic> json) => VenueCategory(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
type: json["type"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"type": type,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final nonAcademicRecognition = nonAcademicRecognitionFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:unit2/model/utils/agency.dart';
|
||||||
|
|
||||||
|
NonAcademicRecognition nonAcademicRecognitionFromJson(String str) => NonAcademicRecognition.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String nonAcademicRecognitionToJson(NonAcademicRecognition data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class NonAcademicRecognition {
|
||||||
|
NonAcademicRecognition({
|
||||||
|
this.id,
|
||||||
|
this.title,
|
||||||
|
this.presenter,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? title;
|
||||||
|
final Agency? presenter;
|
||||||
|
|
||||||
|
factory NonAcademicRecognition.fromJson(Map<String, dynamic> json) => NonAcademicRecognition(
|
||||||
|
id: json["id"],
|
||||||
|
title: json["title"],
|
||||||
|
presenter: json["presenter"] == null ? null : Agency.fromJson(json["presenter"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"title": title,
|
||||||
|
"presenter": presenter?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final organizationMembership = organizationMembershipFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import '../../utils/agency.dart';
|
||||||
|
|
||||||
|
OrganizationMembership organizationMembershipFromJson(String str) => OrganizationMembership.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String organizationMembershipToJson(OrganizationMembership data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class OrganizationMembership {
|
||||||
|
OrganizationMembership({
|
||||||
|
this.agency,
|
||||||
|
});
|
||||||
|
|
||||||
|
final Agency? agency;
|
||||||
|
|
||||||
|
factory OrganizationMembership.fromJson(Map<String, dynamic> json) => OrganizationMembership(
|
||||||
|
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"agency": agency?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final skillsHobbies = skillsHobbiesFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
SkillsHobbies skillsHobbiesFromJson(String str) => SkillsHobbies.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String skillsHobbiesToJson(SkillsHobbies data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class SkillsHobbies {
|
||||||
|
SkillsHobbies({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
|
||||||
|
factory SkillsHobbies.fromJson(Map<String, dynamic> json) => SkillsHobbies(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
import 'package:unit2/model/profile/basic_info.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/primary-information.dart';
|
||||||
|
import 'package:unit2/model/profile/educational_background.dart';
|
||||||
|
import 'package:unit2/model/profile/eligibility.dart';
|
||||||
|
import 'package:unit2/model/profile/family_backround.dart';
|
||||||
|
import 'package:unit2/model/profile/learning_development.dart';
|
||||||
|
import 'package:unit2/model/profile/references.dart';
|
||||||
|
import 'package:unit2/model/profile/voluntary_works.dart';
|
||||||
|
import 'package:unit2/model/profile/work_history.dart';
|
||||||
|
|
||||||
|
class ProfileInformation{
|
||||||
|
final BasicInfo basicInfo;
|
||||||
|
// OtherInformation otherInformation;
|
||||||
|
// List<EligibityCert> eligibilities;
|
||||||
|
// List<PersonalReference> references;
|
||||||
|
// List<LearningDevelopement> learningsAndDevelopment;
|
||||||
|
// List<EducationalBackground> educationalBackgrounds;
|
||||||
|
// List<FamilyBackground> families;
|
||||||
|
// List<WorkHistory>workExperiences;
|
||||||
|
// List<VoluntaryWork> voluntaryWorks;
|
||||||
|
ProfileInformation({required this.basicInfo});
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final references = referencesFromJson(jsonString);
|
||||||
|
import '../location/address_category.dart';
|
||||||
|
import '../location/barangay.dart';
|
||||||
|
import '../location/city.dart';
|
||||||
|
import '../location/country.dart';
|
||||||
|
import '../location/provinces.dart';
|
||||||
|
|
||||||
|
class PersonalReference {
|
||||||
|
PersonalReference({
|
||||||
|
required this.id,
|
||||||
|
required this.address,
|
||||||
|
required this.lastName,
|
||||||
|
required this.contactNo,
|
||||||
|
required this.firstName,
|
||||||
|
required this.middleName,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final Address? address;
|
||||||
|
final String? lastName;
|
||||||
|
final String? contactNo;
|
||||||
|
final String? firstName;
|
||||||
|
final String? middleName;
|
||||||
|
|
||||||
|
factory PersonalReference.fromJson(Map<String, dynamic> json) => PersonalReference(
|
||||||
|
id: json["id"],
|
||||||
|
address: json['address'] == null?null: Address.fromJson(json["address"]),
|
||||||
|
lastName: json["last_name"],
|
||||||
|
contactNo: json["contact_no"],
|
||||||
|
firstName: json["first_name"],
|
||||||
|
middleName: json["middle_name"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"address": address!.toJson(),
|
||||||
|
"last_name": lastName,
|
||||||
|
"contact_no": contactNo,
|
||||||
|
"first_name": firstName,
|
||||||
|
"middle_name": middleName,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Address {
|
||||||
|
Address({
|
||||||
|
required this.id,
|
||||||
|
required this.addressClass,
|
||||||
|
required this.country,
|
||||||
|
required this.barangay,
|
||||||
|
required this.addressCategory,
|
||||||
|
required this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? addressClass;
|
||||||
|
final Country? country;
|
||||||
|
final Barangay? barangay;
|
||||||
|
final AddressCategory? addressCategory;
|
||||||
|
final CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory Address.fromJson(Map<String, dynamic> json) => Address(
|
||||||
|
id: json["id"],
|
||||||
|
addressClass: json["class"],
|
||||||
|
country: json['country']== null?null: Country.fromJson(json["country"]),
|
||||||
|
barangay:json["barangay"]== null?null: Barangay.fromJson(json["barangay"]),
|
||||||
|
addressCategory: json["address_category"]== null? null: AddressCategory.fromJson(json["address_category"]),
|
||||||
|
cityMunicipality: json["city_municipality"]==null?null: CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"class": addressClass,
|
||||||
|
"country": country!.toJson(),
|
||||||
|
"barangay": barangay!.toJson(),
|
||||||
|
"address_category": addressCategory!.toJson(),
|
||||||
|
"city_municipality": cityMunicipality!.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final voluntaryWork = voluntaryWorkFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import '../location/address_category.dart';
|
||||||
|
import '../location/city.dart';
|
||||||
|
import '../location/country.dart';
|
||||||
|
import '../utils/agency.dart';
|
||||||
|
import '../utils/position.dart';
|
||||||
|
|
||||||
|
VoluntaryWork voluntaryWorkFromJson(String str) => VoluntaryWork.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String voluntaryWorkToJson(VoluntaryWork data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class VoluntaryWork {
|
||||||
|
VoluntaryWork({
|
||||||
|
this.agency,
|
||||||
|
this.address,
|
||||||
|
this.toDate,
|
||||||
|
this.position,
|
||||||
|
this.fromDate,
|
||||||
|
this.totalHours,
|
||||||
|
});
|
||||||
|
|
||||||
|
final Agency? agency;
|
||||||
|
final Address? address;
|
||||||
|
final DateTime? toDate;
|
||||||
|
final Position? position;
|
||||||
|
final DateTime? fromDate;
|
||||||
|
final int? totalHours;
|
||||||
|
|
||||||
|
factory VoluntaryWork.fromJson(Map<String, dynamic> json) => VoluntaryWork(
|
||||||
|
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
|
||||||
|
address: json["address"] == null ? null : Address.fromJson(json["address"]),
|
||||||
|
toDate: json["to_date"] == null? null : DateTime.parse(json['to_data']),
|
||||||
|
position: json["position"] == null ? null : Position.fromJson(json["position"]),
|
||||||
|
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
|
||||||
|
totalHours: json["total_hours"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"agency": agency?.toJson(),
|
||||||
|
"address": address?.toJson(),
|
||||||
|
"to_date": toDate,
|
||||||
|
"position": position?.toJson(),
|
||||||
|
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"total_hours": totalHours,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
class Address {
|
||||||
|
Address({
|
||||||
|
this.id,
|
||||||
|
this.addressClass,
|
||||||
|
this.country,
|
||||||
|
this.barangay,
|
||||||
|
this.addressCategory,
|
||||||
|
this.cityMunicipality,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final dynamic addressClass;
|
||||||
|
final Country? country;
|
||||||
|
final dynamic barangay;
|
||||||
|
final AddressCategory? addressCategory;
|
||||||
|
final CityMunicipality? cityMunicipality;
|
||||||
|
|
||||||
|
factory Address.fromJson(Map<String, dynamic> json) => Address(
|
||||||
|
id: json["id"],
|
||||||
|
addressClass: json["class"],
|
||||||
|
country: json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||||
|
barangay: json["barangay"],
|
||||||
|
addressCategory: json["address_category"] == null ? null : AddressCategory.fromJson(json["address_category"]),
|
||||||
|
cityMunicipality: json["city_municipality"] == null ? null : CityMunicipality.fromJson(json["city_municipality"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"class": addressClass,
|
||||||
|
"country": country?.toJson(),
|
||||||
|
"barangay": barangay,
|
||||||
|
"address_category": addressCategory?.toJson(),
|
||||||
|
"city_municipality": cityMunicipality?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final workHistory = workHistoryFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import '../utils/agency.dart';
|
||||||
|
import '../utils/category.dart';
|
||||||
|
import '../utils/industry_class.dart';
|
||||||
|
import '../utils/position.dart';
|
||||||
|
|
||||||
|
WorkHistory workHistoryFromJson(String str) => WorkHistory.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String workHistoryToJson(WorkHistory data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class WorkHistory {
|
||||||
|
WorkHistory({
|
||||||
|
this.id,
|
||||||
|
this.agency,
|
||||||
|
this.sgStep,
|
||||||
|
this.toDate,
|
||||||
|
this.position,
|
||||||
|
this.fromDate,
|
||||||
|
// this.attachments,
|
||||||
|
this.salaryGrade,
|
||||||
|
this.monthlySalary,
|
||||||
|
this.appointmentStatus,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final Agency? agency;
|
||||||
|
final int? sgStep;
|
||||||
|
final DateTime? toDate;
|
||||||
|
final Position? position;
|
||||||
|
final DateTime? fromDate;
|
||||||
|
// final dynamic attachments;
|
||||||
|
final int? salaryGrade;
|
||||||
|
final double? monthlySalary;
|
||||||
|
final String? appointmentStatus;
|
||||||
|
|
||||||
|
factory WorkHistory.fromJson(Map<String, dynamic> json) => WorkHistory(
|
||||||
|
id: json["id"],
|
||||||
|
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
|
||||||
|
sgStep: json["sg_step"],
|
||||||
|
toDate: json["to_date"] == null ? null : DateTime.parse(json["to_date"]),
|
||||||
|
position: json["position"] == null ? null : Position.fromJson(json["position"]),
|
||||||
|
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
|
||||||
|
// attachments: json["attachments"],
|
||||||
|
salaryGrade: json["salary_grade"],
|
||||||
|
monthlySalary: json["monthly_salary"],
|
||||||
|
appointmentStatus: json["appointment_status"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"agency": agency?.toJson(),
|
||||||
|
"sg_step": sgStep,
|
||||||
|
"to_date": "${toDate!.year.toString().padLeft(4, '0')}-${toDate!.month.toString().padLeft(2, '0')}-${toDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
"position": position?.toJson(),
|
||||||
|
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
|
||||||
|
// "attachments": attachments,
|
||||||
|
"salary_grade": salaryGrade,
|
||||||
|
"monthly_salary": monthlySalary,
|
||||||
|
"appointment_status": appointmentStatus,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
import 'package:unit2/model/utils/category.dart';
|
||||||
|
|
||||||
|
class Agency {
|
||||||
|
Agency({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.category,
|
||||||
|
this.privateEntity,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final Category? category;
|
||||||
|
final bool? privateEntity;
|
||||||
|
|
||||||
|
factory Agency.fromJson(Map<String, dynamic> json) => Agency(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
category: json["category"] == null ? null : Category.fromJson(json["category"]),
|
||||||
|
privateEntity: json["private_entity"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"category": category?.toJson(),
|
||||||
|
"private_entity": privateEntity,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final appoinemtStatus = appoinemtStatusFromJson(jsonString);
|
||||||
|
AppoinemtStatus appoinemtStatusFromJson(String str) => AppoinemtStatus.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String appoinemtStatusToJson(AppoinemtStatus data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class AppoinemtStatus {
|
||||||
|
AppoinemtStatus({
|
||||||
|
required this.value,
|
||||||
|
required this.label,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String value;
|
||||||
|
final String label;
|
||||||
|
|
||||||
|
factory AppoinemtStatus.fromJson(Map<String, dynamic> json) => AppoinemtStatus(
|
||||||
|
value: json["value"],
|
||||||
|
label: json["label"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"value": value,
|
||||||
|
"label": label,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import 'package:unit2/model/utils/industry_class.dart';
|
||||||
|
|
||||||
|
class Category {
|
||||||
|
Category({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.industryClass,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final IndustryClass? industryClass;
|
||||||
|
|
||||||
|
factory Category.fromJson(Map<String, dynamic> json) => Category(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
industryClass: json["industry_class"] == null ? null : IndustryClass.fromJson(json["industry_class"]),
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"industry_class": industryClass?.toJson(),
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
// To parse this JSON data, do
|
||||||
|
//
|
||||||
|
// final eligibilities = eligibilitiesFromJson(jsonString);
|
||||||
|
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
Eligibility eligibilitiesFromJson(String str) => Eligibility.fromJson(json.decode(str));
|
||||||
|
|
||||||
|
String eligibilitiesToJson(Eligibility data) => json.encode(data.toJson());
|
||||||
|
|
||||||
|
class Eligibility {
|
||||||
|
Eligibility({
|
||||||
|
required this.id,
|
||||||
|
required this.title,
|
||||||
|
required this.type,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int id;
|
||||||
|
final String title;
|
||||||
|
final String type;
|
||||||
|
|
||||||
|
factory Eligibility.fromJson(Map<String, dynamic> json) => Eligibility(
|
||||||
|
id: json["id"],
|
||||||
|
title: json["title"],
|
||||||
|
type: json["type"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"title": title,
|
||||||
|
"type": type,
|
||||||
|
};
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return title;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
class IndustryClass {
|
||||||
|
IndustryClass({
|
||||||
|
this.id,
|
||||||
|
this.name,
|
||||||
|
this.description,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? name;
|
||||||
|
final String? description;
|
||||||
|
|
||||||
|
factory IndustryClass.fromJson(Map<String, dynamic> json) => IndustryClass(
|
||||||
|
id: json["id"],
|
||||||
|
name: json["name"],
|
||||||
|
description: json["description"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"name": name,
|
||||||
|
"description": description,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
class Position {
|
||||||
|
Position({
|
||||||
|
this.id,
|
||||||
|
this.title,
|
||||||
|
});
|
||||||
|
|
||||||
|
final int? id;
|
||||||
|
final String? title;
|
||||||
|
|
||||||
|
factory Position.fromJson(Map<String, dynamic> json) => Position(
|
||||||
|
id: json["id"],
|
||||||
|
title: json["title"],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
"id": id,
|
||||||
|
"title": title,
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,166 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:unit2/bloc/profile/primary_information/address/address_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/adress.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
import 'package:unit2/widgets/error_state.dart';
|
||||||
|
|
||||||
|
class AddressScreen extends StatelessWidget {
|
||||||
|
|
||||||
|
const AddressScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(adressScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: [AddLeading(onPressed: () {})],
|
||||||
|
),
|
||||||
|
body: ProgressHUD(
|
||||||
|
child: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocConsumer<AddressBloc, AddressState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is AddressLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is AddressLoadedState ||
|
||||||
|
state is AddressErrorState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is AddressLoadedState) {
|
||||||
|
if (state.addresses.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount: state.addresses.length,
|
||||||
|
itemBuilder:
|
||||||
|
(BuildContext context, int index) {
|
||||||
|
String? subdivision =
|
||||||
|
state.addresses[index].details ?? '';
|
||||||
|
String category = state.addresses[index]
|
||||||
|
.address!
|
||||||
|
.category!
|
||||||
|
.name!;
|
||||||
|
String? barangay = state.addresses[index]
|
||||||
|
.address!
|
||||||
|
.barangay !=
|
||||||
|
null
|
||||||
|
? '${state.addresses[index].address!.barangay!.description!.toUpperCase()},'
|
||||||
|
: '';
|
||||||
|
String cityMunicipality = state.addresses[index]
|
||||||
|
.address!
|
||||||
|
.cityMunicipality!
|
||||||
|
.description!;
|
||||||
|
String province = state.addresses[index]
|
||||||
|
.address!
|
||||||
|
.cityMunicipality!
|
||||||
|
.province!
|
||||||
|
.description!;
|
||||||
|
String region = state.addresses[index]
|
||||||
|
.address!
|
||||||
|
.cityMunicipality!
|
||||||
|
.province!
|
||||||
|
.region!
|
||||||
|
.description!;
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: screenWidth,
|
||||||
|
decoration: box1(),
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.fromLTRB(
|
||||||
|
8, 16, 0, 16),
|
||||||
|
child: Row(children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
subdivision,
|
||||||
|
style:
|
||||||
|
Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
category,
|
||||||
|
style:
|
||||||
|
Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"$barangay $cityMunicipality, $province, $region",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.labelLarge,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have address added. Please click + to add.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/src/widgets/framework.dart';
|
||||||
|
import 'package:flutter/src/widgets/placeholder.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/citizenship.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
|
||||||
|
class CitizenShipScreen extends StatefulWidget {
|
||||||
|
final List<Citizenship> citizenships;
|
||||||
|
const CitizenShipScreen({super.key, required this.citizenships});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<CitizenShipScreen> createState() => _CitizenShipScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CitizenShipScreenState extends State<CitizenShipScreen> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(citizenshipScreenTitle),centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
),
|
||||||
|
body: widget.citizenships.isEmpty?
|
||||||
|
Container(
|
||||||
|
width: screenWidth,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.grey[200],
|
||||||
|
borderRadius: const BorderRadius.all(Radius.circular(12))),
|
||||||
|
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text("Philippines",style: Theme.of(context).textTheme.titleLarge,),
|
||||||
|
Text("Filipino",style: Theme.of(context).textTheme.titleSmall,)
|
||||||
|
],
|
||||||
|
|
||||||
|
|
||||||
|
),
|
||||||
|
):Container()
|
||||||
|
,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,243 @@
|
||||||
|
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:fluttericon/entypo_icons.dart';
|
||||||
|
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||||
|
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
|
||||||
|
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||||
|
import 'package:unit2/bloc/profile/primary_information/contact/contact_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/contact_information.dart';
|
||||||
|
import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart';
|
||||||
|
import 'package:unit2/sevices/profile/contact_services.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 '../../../../../theme-data.dart/colors.dart';
|
||||||
|
|
||||||
|
class AddContactInformationScreen extends StatefulWidget {
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const AddContactInformationScreen(
|
||||||
|
{super.key, required this.profileId, required this.token});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AddContactInformationScreen> createState() =>
|
||||||
|
_AddContactInformationScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AddContactInformationScreenState
|
||||||
|
extends State<AddContactInformationScreen> {
|
||||||
|
final formKey = GlobalKey<FormBuilderState>();
|
||||||
|
ServiceType? selectedServiceType;
|
||||||
|
CommService? selectedCommServiceProvider;
|
||||||
|
List<CommService> commServiceProviders = [];
|
||||||
|
bool callServiceType = false;
|
||||||
|
bool primaryaContact = false;
|
||||||
|
bool active = false;
|
||||||
|
String? numberMail;
|
||||||
|
var mobileFormatter = MaskTextInputFormatter(
|
||||||
|
mask: "+63 (###) ###-####",
|
||||||
|
filter: {"#": RegExp(r"^[1-9][0-9]*$")},
|
||||||
|
type: MaskAutoCompletionType.lazy,
|
||||||
|
initialText: "0");
|
||||||
|
|
||||||
|
var landLineFormatter = MaskTextInputFormatter(
|
||||||
|
mask: "(###) ###-###",
|
||||||
|
filter: {"#": RegExp(r"^[0-9]")},
|
||||||
|
type: MaskAutoCompletionType.lazy,
|
||||||
|
initialText: "0");
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocBuilder<ContactBloc, ContactState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ContactAddingState) {
|
||||||
|
return FormBuilder(
|
||||||
|
key: formKey,
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(vertical: 24, horizontal: 12),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
////Service Type
|
||||||
|
FormBuilderDropdown<ServiceType>(
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
name: "service_type",
|
||||||
|
items: state.serviceTypes
|
||||||
|
.map<DropdownMenuItem<ServiceType>>(
|
||||||
|
(ServiceType e) {
|
||||||
|
return DropdownMenuItem<ServiceType>(
|
||||||
|
value: e, child: Text(e.name!));
|
||||||
|
}).toList(),
|
||||||
|
decoration: normalTextFieldStyle("Service Type*", ""),
|
||||||
|
onChanged: (var service) async {
|
||||||
|
if (selectedServiceType != service) {
|
||||||
|
selectedServiceType = service;
|
||||||
|
setState(() {
|
||||||
|
callServiceType = true;
|
||||||
|
});
|
||||||
|
commServiceProviders = await ContactService.instance
|
||||||
|
.getServiceProvider(
|
||||||
|
serviceTypeId: selectedServiceType!.id!);
|
||||||
|
setState(() {
|
||||||
|
setState(() {
|
||||||
|
callServiceType = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
const SizedBox(
|
||||||
|
height: 12,
|
||||||
|
),
|
||||||
|
////Service Provider
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
child: ModalProgressHUD(
|
||||||
|
color: Colors.transparent,
|
||||||
|
inAsyncCall: callServiceType,
|
||||||
|
child: FormBuilderDropdown<CommService>(
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
name: "Service Provider",
|
||||||
|
items: commServiceProviders.isEmpty
|
||||||
|
? []
|
||||||
|
: commServiceProviders
|
||||||
|
.map<DropdownMenuItem<CommService>>(
|
||||||
|
(CommService e) {
|
||||||
|
return DropdownMenuItem<CommService>(
|
||||||
|
value: e, child: Text(e.serviceProvider!.agency!.name!));
|
||||||
|
}).toList(),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Communication Service *", ""),
|
||||||
|
onChanged: (var serviceProvider) {
|
||||||
|
selectedCommServiceProvider = serviceProvider;
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
selectedServiceType != null
|
||||||
|
? selectedServiceType?.id == 2
|
||||||
|
//// Landline
|
||||||
|
? FormBuilderTextField(
|
||||||
|
inputFormatters: [landLineFormatter],
|
||||||
|
name: 'number-mail',
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Landline number *",
|
||||||
|
"(area code) xxx - xxxx"),
|
||||||
|
)
|
||||||
|
: selectedServiceType!.id == 1 ||
|
||||||
|
selectedServiceType!.id == 19
|
||||||
|
//// Mobile number
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
inputFormatters: [mobileFormatter],
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Mobile number *",
|
||||||
|
"+63 (9xx) xxx - xxxx"),
|
||||||
|
)
|
||||||
|
: selectedServiceType!.id == 4
|
||||||
|
////Social Media
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Account ID / Username *", ""),
|
||||||
|
)
|
||||||
|
: selectedServiceType!.id == 3
|
||||||
|
////Email Address
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.compose([
|
||||||
|
FormBuilderValidators.email(
|
||||||
|
errorText:
|
||||||
|
"Input vaild email"),
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required")
|
||||||
|
]),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Email Address*", ""),
|
||||||
|
)
|
||||||
|
: Container()
|
||||||
|
: const SizedBox(),
|
||||||
|
SizedBox(
|
||||||
|
height: selectedServiceType != null ? 12 : 0,
|
||||||
|
),
|
||||||
|
//// Primary
|
||||||
|
FormBuilderSwitch(
|
||||||
|
initialValue: primaryaContact,
|
||||||
|
activeColor: second,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
primaryaContact = value!;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration: normalTextFieldStyle("Primary?", 'Primary?'),
|
||||||
|
name: 'overseas',
|
||||||
|
title: Text(primaryaContact ? "YES" : "NO"),
|
||||||
|
),
|
||||||
|
//// Active
|
||||||
|
const SizedBox(
|
||||||
|
height: 12,
|
||||||
|
),
|
||||||
|
FormBuilderSwitch(
|
||||||
|
initialValue: primaryaContact,
|
||||||
|
activeColor: second,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
active = value!;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration: normalTextFieldStyle("Active?", ''),
|
||||||
|
name: 'overseas',
|
||||||
|
title: Text(active ? "YES" : "NO"),
|
||||||
|
),
|
||||||
|
const Expanded(child: SizedBox()),
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
width: double.infinity,
|
||||||
|
child: ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
if (formKey.currentState!.saveAndValidate()) {
|
||||||
|
|
||||||
|
numberMail =
|
||||||
|
formKey.currentState!.value['number-mail'];
|
||||||
|
CommService commService = selectedCommServiceProvider!;
|
||||||
|
ContactInfo contactInfo = ContactInfo(
|
||||||
|
id: null,
|
||||||
|
active: active,
|
||||||
|
primary: primaryaContact,
|
||||||
|
numbermail: numberMail,
|
||||||
|
commService: commService);
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Loading...");
|
||||||
|
context.read<ContactBloc>().add(AddContactInformation(contactInfo: contactInfo, profileId: widget.profileId, token: widget.token));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
style:
|
||||||
|
mainBtnStyle(primary, Colors.transparent, second),
|
||||||
|
child: const Text(submit),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,275 @@
|
||||||
|
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:fluttericon/entypo_icons.dart';
|
||||||
|
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||||
|
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
|
||||||
|
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||||
|
import 'package:unit2/bloc/profile/primary_information/contact/contact_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/contact_information.dart';
|
||||||
|
import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart';
|
||||||
|
import 'package:unit2/sevices/profile/contact_services.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 '../../../../../theme-data.dart/colors.dart';
|
||||||
|
|
||||||
|
class EditContactInformationScreen extends StatefulWidget {
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const EditContactInformationScreen(
|
||||||
|
{super.key, required this.profileId, required this.token});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<EditContactInformationScreen> createState() =>
|
||||||
|
_EditContactInformationScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EditContactInformationScreenState
|
||||||
|
extends State<EditContactInformationScreen> {
|
||||||
|
final formKey = GlobalKey<FormBuilderState>();
|
||||||
|
ServiceType? selectedServiceType;
|
||||||
|
CommService? selectedCommProvider;
|
||||||
|
List<CommService> commServiceProviders = [];
|
||||||
|
String? numberMail;
|
||||||
|
bool callServiceType = false;
|
||||||
|
bool? primaryaContact;
|
||||||
|
bool? active;
|
||||||
|
|
||||||
|
var mobileFormatter = MaskTextInputFormatter(
|
||||||
|
mask: "+63 (###) ###-####",
|
||||||
|
filter: {"#": RegExp(r"^[1-9][0-9]*$")},
|
||||||
|
type: MaskAutoCompletionType.lazy,
|
||||||
|
initialText: "0");
|
||||||
|
|
||||||
|
var landLineFormatter = MaskTextInputFormatter(
|
||||||
|
mask: "(###) ###-###",
|
||||||
|
filter: {"#": RegExp(r"^[0-9]")},
|
||||||
|
type: MaskAutoCompletionType.lazy,
|
||||||
|
initialText: "0");
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocBuilder<ContactBloc, ContactState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ContactEditingState) {
|
||||||
|
selectedServiceType = state.selectedServiceType;
|
||||||
|
selectedCommProvider = state.selectedProvider;
|
||||||
|
commServiceProviders = state.commServiceProviders;
|
||||||
|
primaryaContact = state.contactInfo.primary!;
|
||||||
|
active = state.contactInfo.active!;
|
||||||
|
return FormBuilder(
|
||||||
|
key: formKey,
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(vertical: 24, horizontal: 12),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
StatefulBuilder(builder: (context, setState) {
|
||||||
|
return Column(children: [
|
||||||
|
////Service Type
|
||||||
|
DropdownButtonFormField<ServiceType>(
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
value: selectedServiceType,
|
||||||
|
items: state.serviceTypes
|
||||||
|
.map<DropdownMenuItem<ServiceType>>(
|
||||||
|
(ServiceType e) {
|
||||||
|
return DropdownMenuItem<ServiceType>(
|
||||||
|
value: e, child: Text(e.name!));
|
||||||
|
}).toList(),
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle("Service Type*", ""),
|
||||||
|
onChanged: (var service) async {
|
||||||
|
if (selectedServiceType!.id != service!.id) {
|
||||||
|
selectedServiceType = service;
|
||||||
|
setState(() {
|
||||||
|
callServiceType = true;
|
||||||
|
});
|
||||||
|
commServiceProviders = await ContactService.instance
|
||||||
|
.getServiceProvider(
|
||||||
|
serviceTypeId:
|
||||||
|
selectedServiceType!.id!);
|
||||||
|
selectedCommProvider = null;
|
||||||
|
setState(() {
|
||||||
|
setState(() {
|
||||||
|
callServiceType = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
const SizedBox(
|
||||||
|
height: 12,
|
||||||
|
),
|
||||||
|
////Service Provider
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
child: ModalProgressHUD(
|
||||||
|
color: Colors.transparent,
|
||||||
|
inAsyncCall: callServiceType,
|
||||||
|
child: DropdownButtonFormField<CommService>(
|
||||||
|
value: selectedCommProvider,
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
items: commServiceProviders.isEmpty
|
||||||
|
? []
|
||||||
|
: commServiceProviders
|
||||||
|
.map<DropdownMenuItem<CommService>>(
|
||||||
|
(CommService e) {
|
||||||
|
return DropdownMenuItem<
|
||||||
|
CommService>(
|
||||||
|
value: e,
|
||||||
|
child: Text(e.serviceProvider!.agency!.name!));
|
||||||
|
}).toList(),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Communication Service *", ""),
|
||||||
|
onChanged: (var commServiceProvider) {
|
||||||
|
selectedCommProvider = commServiceProvider;
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
selectedServiceType != null
|
||||||
|
? selectedServiceType?.id == 2
|
||||||
|
//// Landline
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
initialValue: state.contactInfo.numbermail,
|
||||||
|
inputFormatters: [landLineFormatter],
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Landline number *",
|
||||||
|
"(area code) xxx - xxxx"),
|
||||||
|
)
|
||||||
|
: selectedServiceType!.id == 1 ||
|
||||||
|
selectedServiceType!.id == 19
|
||||||
|
//// Mobile number
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
inputFormatters: [mobileFormatter],
|
||||||
|
initialValue:
|
||||||
|
state.contactInfo.numbermail,
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Mobile number *",
|
||||||
|
"+63 (9xx) xxx - xxxx"),
|
||||||
|
)
|
||||||
|
: selectedServiceType!.id == 4
|
||||||
|
////Social Media
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
initialValue:
|
||||||
|
state.contactInfo.numbermail,
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Account ID / Username *", ""),
|
||||||
|
)
|
||||||
|
: selectedServiceType!.id == 3
|
||||||
|
////Email Address
|
||||||
|
? FormBuilderTextField(
|
||||||
|
name: 'number-mail',
|
||||||
|
initialValue: state
|
||||||
|
.contactInfo.numbermail,
|
||||||
|
validator: FormBuilderValidators
|
||||||
|
.compose([
|
||||||
|
FormBuilderValidators.email(
|
||||||
|
errorText:
|
||||||
|
"Input vaild email"),
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required")
|
||||||
|
]),
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Email Address*", ""),
|
||||||
|
)
|
||||||
|
: Container()
|
||||||
|
: const SizedBox(),
|
||||||
|
]);
|
||||||
|
}),
|
||||||
|
SizedBox(
|
||||||
|
height: selectedServiceType != null ? 12 : 0,
|
||||||
|
),
|
||||||
|
//// Primary
|
||||||
|
StatefulBuilder(builder: (context, setState) {
|
||||||
|
return FormBuilderSwitch(
|
||||||
|
initialValue: primaryaContact,
|
||||||
|
activeColor: second,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
primaryaContact = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration: normalTextFieldStyle("", ''),
|
||||||
|
name: 'overseas',
|
||||||
|
title: const Text("Primary ?"),
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
//// Active
|
||||||
|
const SizedBox(
|
||||||
|
height: 12,
|
||||||
|
),
|
||||||
|
StatefulBuilder(builder: (context, setState) {
|
||||||
|
return FormBuilderSwitch(
|
||||||
|
initialValue: active,
|
||||||
|
activeColor: second,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
active = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration: normalTextFieldStyle("", ''),
|
||||||
|
name: 'overseas',
|
||||||
|
title: const Text("Active ?"),
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
const Expanded(child: SizedBox()),
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
width: double.infinity,
|
||||||
|
child: ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
if (formKey.currentState!.saveAndValidate()) {
|
||||||
|
numberMail =
|
||||||
|
formKey.currentState!.value['number-mail'];
|
||||||
|
CommService commService = selectedCommProvider!;
|
||||||
|
ContactInfo contactInfo = ContactInfo(
|
||||||
|
id: state.contactInfo.id,
|
||||||
|
active: active,
|
||||||
|
primary: primaryaContact,
|
||||||
|
numbermail: numberMail,
|
||||||
|
commService: commService);
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Loading...");
|
||||||
|
context.read<ContactBloc>().add(
|
||||||
|
EditContactInformation(
|
||||||
|
contactInfo: contactInfo,
|
||||||
|
profileId: widget.profileId,
|
||||||
|
token: widget.token));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
style:
|
||||||
|
mainBtnStyle(primary, Colors.transparent, second),
|
||||||
|
child: const Text(submit),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,369 @@
|
||||||
|
import 'package:app_popup_menu/app_popup_menu.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import 'package:unit2/bloc/profile/primary_information/contact/contact_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/basic_information/contact_information/add_modal.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/basic_information/contact_information/edit_modal.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/alerts.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/close_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
import 'package:unit2/widgets/error_state.dart';
|
||||||
|
|
||||||
|
class ContactInformationScreen extends StatelessWidget {
|
||||||
|
const ContactInformationScreen({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
int profileId;
|
||||||
|
String token;
|
||||||
|
return SafeArea(
|
||||||
|
child: Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(contactScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: context.watch<ContactBloc>().state is ContactLoadedState? [
|
||||||
|
AddLeading(onPressed: () {
|
||||||
|
context.read<ContactBloc>().add(ShowAddForm());
|
||||||
|
})
|
||||||
|
]:( context.watch<ContactBloc>().state is ContactAddingState || context.watch<ContactBloc>().state is ContactEditingState)?[
|
||||||
|
CloseLeading(onPressed: (){
|
||||||
|
context.read<ContactBloc>().add(LoadContacts());
|
||||||
|
})
|
||||||
|
]:[]
|
||||||
|
),
|
||||||
|
body: ProgressHUD(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
backgroundColor: Colors.black87,
|
||||||
|
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||||
|
child: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
token = state.userData!.user!.login!.token!;
|
||||||
|
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocConsumer<ContactBloc, ContactState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is ContactLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is ContactLoadedState ||
|
||||||
|
state is ContactErrorState ||
|
||||||
|
state is ContactAddingState ||
|
||||||
|
state is ContactEditingState ||
|
||||||
|
state is ContactDeletedState ||
|
||||||
|
state is ContactAddedState ||
|
||||||
|
state is ContactEditedState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
////ADDED CONTACT STATE
|
||||||
|
if (state is ContactAddedState) {
|
||||||
|
if (state.response['success']) {
|
||||||
|
successAlert(context, "Update Successfull!",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<ContactBloc>().add(LoadContacts(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Update Failed",
|
||||||
|
"Something went wrong. Please try again.",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<ContactBloc>().add(LoadContacts(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////EDIT CONTACT STATE
|
||||||
|
if (state is ContactEditedState) {
|
||||||
|
if (state.response['success']) {
|
||||||
|
successAlert(context, "Update Successfull!",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<ContactBloc>().add(LoadContacts(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Update Failed",
|
||||||
|
"Something went wrong. Please try again.",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<ContactBloc>().add(LoadContacts(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////DELETED STATE
|
||||||
|
if (state is ContactDeletedState) {
|
||||||
|
if (state.succcess) {
|
||||||
|
successAlert(context, "Deletion Successfull",
|
||||||
|
"Contact Info has been deleted successfully",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<ContactBloc>().add(LoadContacts(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Deletion Failed",
|
||||||
|
"Error deleting Contact Info", () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<ContactBloc>().add(LoadContacts(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ContactLoadedState) {
|
||||||
|
if (state.contactInformation.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount: state.contactInformation.length,
|
||||||
|
itemBuilder:
|
||||||
|
(BuildContext context, int index) {
|
||||||
|
String numberMail = state
|
||||||
|
.contactInformation[index]
|
||||||
|
.numbermail!;
|
||||||
|
String commService = state
|
||||||
|
.contactInformation[index]
|
||||||
|
.commService!
|
||||||
|
.serviceProvider!
|
||||||
|
.alias!;
|
||||||
|
return Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.fromLTRB(12, 12, 0, 12),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
numberMail,
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight.w500)),
|
||||||
|
),
|
||||||
|
state.contactInformation[index]
|
||||||
|
.active ==
|
||||||
|
true
|
||||||
|
? const Badge(
|
||||||
|
backgroundColor:
|
||||||
|
Colors
|
||||||
|
.green,
|
||||||
|
label: Text(
|
||||||
|
"Active",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
const SizedBox(
|
||||||
|
width: 5),
|
||||||
|
state.contactInformation[index]
|
||||||
|
.primary ==
|
||||||
|
true
|
||||||
|
? const Badge(
|
||||||
|
backgroundColor:
|
||||||
|
Colors
|
||||||
|
.blue,
|
||||||
|
label: Text(
|
||||||
|
"Primary"),
|
||||||
|
)
|
||||||
|
: const SizedBox()
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Flexible(
|
||||||
|
flex: 2,
|
||||||
|
child: Text(
|
||||||
|
commService
|
||||||
|
.toString().toUpperCase(),
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleSmall,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
|
||||||
|
child: Text(" - "),
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: Text(state
|
||||||
|
.contactInformation[
|
||||||
|
index]
|
||||||
|
.commService!
|
||||||
|
.serviceProvider!
|
||||||
|
.agency!
|
||||||
|
.name
|
||||||
|
.toString()),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
AppPopupMenu<int>(
|
||||||
|
offset:
|
||||||
|
const Offset(-10, -10),
|
||||||
|
elevation: 3,
|
||||||
|
onSelected: (value) {
|
||||||
|
////delete contact-= = = = = = = = =>>
|
||||||
|
if (value == 2) {
|
||||||
|
final progress =
|
||||||
|
ProgressHUD.of(
|
||||||
|
context);
|
||||||
|
progress!.showWithText(
|
||||||
|
"Loading...");
|
||||||
|
confirmAlert(
|
||||||
|
context,
|
||||||
|
() => context
|
||||||
|
.read<
|
||||||
|
ContactBloc>()
|
||||||
|
.add(DeleteContactInformation(
|
||||||
|
contactInfo:
|
||||||
|
state.contactInformation[
|
||||||
|
index],
|
||||||
|
profileId:
|
||||||
|
profileId,
|
||||||
|
token:
|
||||||
|
token)),
|
||||||
|
"Delete?",
|
||||||
|
"Are you sure you want to delete this contact info?");
|
||||||
|
}
|
||||||
|
if (value == 1) {
|
||||||
|
////edit contact-= = = = = = = = =>>
|
||||||
|
context
|
||||||
|
.read<ContactBloc>()
|
||||||
|
.add(ShowEditForm(
|
||||||
|
contactInfo: state
|
||||||
|
.contactInformation[
|
||||||
|
index]));
|
||||||
|
final progress =
|
||||||
|
ProgressHUD.of(
|
||||||
|
context);
|
||||||
|
progress!.showWithText(
|
||||||
|
"Loading...");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
menuItems: [
|
||||||
|
popMenuItem(
|
||||||
|
text: "Edit",
|
||||||
|
value: 1,
|
||||||
|
icon: Icons.edit),
|
||||||
|
popMenuItem(
|
||||||
|
text: "Delete",
|
||||||
|
value: 2,
|
||||||
|
icon: Icons.delete),
|
||||||
|
],
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
tooltip: "Options",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have contact information added. Please click + to add");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state is ContactAddingState) {
|
||||||
|
return AddContactInformationScreen(
|
||||||
|
profileId: profileId,
|
||||||
|
token: token,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (state is ContactEditingState) {
|
||||||
|
return EditContactInformationScreen(
|
||||||
|
profileId: profileId, token: token);
|
||||||
|
}
|
||||||
|
if (state is ContactErrorState) {
|
||||||
|
return SomethingWentWrong(
|
||||||
|
message: state.message, onpressed: () {
|
||||||
|
context.read<ContactBloc>().add(LoadContacts());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PopupMenuItem<int> popMenuItem({String? text, int? value, IconData? icon}) {
|
||||||
|
return PopupMenuItem(
|
||||||
|
value: value,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
icon,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
text!,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,149 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/profile/primary_information/identification/identification_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/identification_information.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
|
||||||
|
import '../../../../bloc/user/user_bloc.dart';
|
||||||
|
|
||||||
|
class IdentificationsScreen extends StatelessWidget {
|
||||||
|
const IdentificationsScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(identificationScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: [AddLeading(onPressed: () {})],
|
||||||
|
),
|
||||||
|
body: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocConsumer<IdentificationBloc,
|
||||||
|
IdentificationState>(
|
||||||
|
listener: (context, state) {},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is IdentificationLoadedState) {
|
||||||
|
if (state.identificationInformation.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount: state.identificationInformation.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
String agency =
|
||||||
|
state.identificationInformation[index].agency!.name!;
|
||||||
|
String idNumber =
|
||||||
|
state.identificationInformation[index].identificationNumber!;
|
||||||
|
bool government =
|
||||||
|
state.identificationInformation[index].agency!.privateEntity!;
|
||||||
|
String issuedAt =
|
||||||
|
"${state.identificationInformation[index].issuedAt!.cityMunicipality!.description!} ${state.identificationInformation[index].issuedAt!.cityMunicipality!.province!.description}";
|
||||||
|
return Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(agency,
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w400)),
|
||||||
|
const Divider(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Row(children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
"$idNumberText : $idNumber",
|
||||||
|
style:
|
||||||
|
Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleSmall,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Badge(
|
||||||
|
backgroundColor:
|
||||||
|
success2,
|
||||||
|
label: Text(
|
||||||
|
government == true
|
||||||
|
? privateText
|
||||||
|
.toUpperCase()
|
||||||
|
: governmentText
|
||||||
|
.toUpperCase(),
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall!
|
||||||
|
.copyWith(
|
||||||
|
color: Colors
|
||||||
|
.white),
|
||||||
|
))
|
||||||
|
]),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(issuedAt),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have identifications added. Please click + to add.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,159 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:unit2/model/profile/basic_information/primary-information.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
|
||||||
|
class PrimaryInfo extends StatefulWidget {
|
||||||
|
final PrimaryInformation primaryInformation;
|
||||||
|
const PrimaryInfo({super.key, required this.primaryInformation});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<PrimaryInfo> createState() => _PrimaryInfoState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PrimaryInfoState extends State<PrimaryInfo> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final _formKey = GlobalKey<FormBuilderState>();
|
||||||
|
bool enabled = false;
|
||||||
|
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(primaryInformationScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
),
|
||||||
|
body: Container(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 24),
|
||||||
|
child: FormBuilder(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: lastname,
|
||||||
|
initialValue: widget.primaryInformation.lastName!,
|
||||||
|
decoration: normalTextFieldStyle("Last name", ""),
|
||||||
|
|
||||||
|
),
|
||||||
|
const SizedBox(height: 15,),
|
||||||
|
FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: firstname,
|
||||||
|
initialValue: widget.primaryInformation.firstName!,
|
||||||
|
decoration: normalTextFieldStyle("First name", ""),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 15,),
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(children: [
|
||||||
|
Flexible(
|
||||||
|
flex: 2,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: middlename,
|
||||||
|
initialValue: widget.primaryInformation.middleName!,
|
||||||
|
decoration: normalTextFieldStyle("Middle name", ""),
|
||||||
|
),),
|
||||||
|
const SizedBox(width: 10,),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: extensionName,
|
||||||
|
initialValue: widget.primaryInformation.nameExtension??='N/A',
|
||||||
|
decoration: normalTextFieldStyle("Name extension", ""),
|
||||||
|
),)
|
||||||
|
]),
|
||||||
|
|
||||||
|
),
|
||||||
|
const SizedBox(height: 15,),
|
||||||
|
SizedBox(width: screenWidth,
|
||||||
|
child: Row(children: [
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: extensionName,
|
||||||
|
initialValue: dteFormat2.format(widget.primaryInformation.birthdate!),
|
||||||
|
decoration: normalTextFieldStyle("Birth date", ""),
|
||||||
|
),),
|
||||||
|
const SizedBox(width: 10,),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: sex,
|
||||||
|
initialValue: widget.primaryInformation.sex!,
|
||||||
|
decoration: normalTextFieldStyle("Sex", ""),
|
||||||
|
),)
|
||||||
|
]),),
|
||||||
|
const SizedBox(height: 15,),
|
||||||
|
SizedBox(width: screenWidth,
|
||||||
|
child: Row(children: [
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: bloodType,
|
||||||
|
initialValue:widget.primaryInformation.bloodType!,
|
||||||
|
decoration: normalTextFieldStyle("Blood type", ""),
|
||||||
|
),),
|
||||||
|
const SizedBox(width: 10,),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: civilStatus,
|
||||||
|
initialValue: widget.primaryInformation.civilStatus!,
|
||||||
|
decoration: normalTextFieldStyle("Civil Status", ""),
|
||||||
|
),),
|
||||||
|
const SizedBox(width: 10,),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: gender,
|
||||||
|
initialValue:widget.primaryInformation.gender??="N/A",
|
||||||
|
decoration: normalTextFieldStyle("Gender", ""),
|
||||||
|
),),
|
||||||
|
]),),
|
||||||
|
|
||||||
|
const SizedBox(height: 15,),
|
||||||
|
SizedBox(width: screenWidth,
|
||||||
|
child: Row(children: [
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: height,
|
||||||
|
initialValue:widget.primaryInformation.heightM!.toString(),
|
||||||
|
decoration: normalTextFieldStyle("Height", ""),
|
||||||
|
),),
|
||||||
|
const SizedBox(width: 10,),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: width,
|
||||||
|
initialValue: widget.primaryInformation.weightKg!.toString(),
|
||||||
|
decoration: normalTextFieldStyle("Weight", ""),
|
||||||
|
),),
|
||||||
|
const SizedBox(width: 10,),
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
enabled: enabled,
|
||||||
|
name: prefixSuffix,
|
||||||
|
initialValue:"${widget.primaryInformation.titlePrefix??="NA"} | ${widget.primaryInformation.titleSuffix??="N/A"}",
|
||||||
|
decoration: normalTextFieldStyle("Title Prefix and Suffix", ""),
|
||||||
|
),),
|
||||||
|
]),),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,222 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
|
||||||
|
import 'package:unit2/model/profile/educational_background.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
import 'package:unit2/widgets/error_state.dart';
|
||||||
|
|
||||||
|
import '../../../bloc/profile/education/education_bloc.dart';
|
||||||
|
|
||||||
|
class EducationScreen extends StatelessWidget {
|
||||||
|
const EducationScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(educationScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: [AddLeading(onPressed: () {})],
|
||||||
|
),
|
||||||
|
//userbloc
|
||||||
|
body: ProgressHUD(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
backgroundColor: Colors.black87,
|
||||||
|
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||||
|
child: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
//profilebloc
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
//education bloc
|
||||||
|
return BlocConsumer<EducationBloc, EducationState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is EducationalBackgroundLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is EducationalBackgroundLoadedState ||
|
||||||
|
state is EducationalBackgroundErrorState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is EducationalBackgroundLoadedState) {
|
||||||
|
if (state.educationalBackground.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount: state.educationalBackground.length,
|
||||||
|
itemBuilder:
|
||||||
|
(BuildContext context, int index) {
|
||||||
|
String level = state
|
||||||
|
.educationalBackground[index]
|
||||||
|
.education!
|
||||||
|
.level!;
|
||||||
|
String periodFrom = state
|
||||||
|
.educationalBackground[index]
|
||||||
|
.periodFrom!;
|
||||||
|
String periodTo = state
|
||||||
|
.educationalBackground[index].periodTo!;
|
||||||
|
String? program = state
|
||||||
|
.educationalBackground[index]
|
||||||
|
.education!
|
||||||
|
.course ==
|
||||||
|
null
|
||||||
|
? null
|
||||||
|
: state.educationalBackground[index]
|
||||||
|
.education!.course!.program!;
|
||||||
|
List<Honor>? honors = state
|
||||||
|
.educationalBackground[index].honors!
|
||||||
|
.toList();
|
||||||
|
String school = state
|
||||||
|
.educationalBackground[index]
|
||||||
|
.education!
|
||||||
|
.school!
|
||||||
|
.name!;
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
level,
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w500),
|
||||||
|
)),
|
||||||
|
Text(
|
||||||
|
"$periodFrom - ",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.bodyMedium,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
school,
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleSmall,
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets
|
||||||
|
.only(top: 8),
|
||||||
|
child: honors
|
||||||
|
.isNotEmpty
|
||||||
|
? Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
const Text(
|
||||||
|
" : ",
|
||||||
|
style: TextStyle(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight.w600),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
children: honors
|
||||||
|
.map((Honor honor) =>
|
||||||
|
Text(" - ${honor.name!}"))
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
: const SizedBox()),
|
||||||
|
program == null
|
||||||
|
? const SizedBox()
|
||||||
|
: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(program),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have any Educational Background added. Please click + to add.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state is EducationalBackgroundErrorState) {
|
||||||
|
return SomethingWentWrong(
|
||||||
|
message: state.message, onpressed: () {});
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,485 @@
|
||||||
|
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:form_builder_validators/form_builder_validators.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/eligibility.dart';
|
||||||
|
|
||||||
|
import '../../../../bloc/profile/eligibility/eligibility_bloc.dart';
|
||||||
|
import '../../../../model/location/city.dart';
|
||||||
|
import '../../../../model/location/country.dart';
|
||||||
|
import '../../../../model/location/provinces.dart';
|
||||||
|
import '../../../../model/location/region.dart';
|
||||||
|
import '../../../../model/utils/eligibility.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';
|
||||||
|
import '../../../../utils/location_utilities.dart';
|
||||||
|
import '../../../../utils/text_container.dart';
|
||||||
|
|
||||||
|
class AddEligibilityScreen extends StatefulWidget {
|
||||||
|
const AddEligibilityScreen(
|
||||||
|
{super.key, required this.profileId, required this.token});
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AddEligibilityScreen> createState() => _AddEligibilityScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AddEligibilityScreenState extends State<AddEligibilityScreen> {
|
||||||
|
final formKey = GlobalKey<FormBuilderState>();
|
||||||
|
bool? overseas = false;
|
||||||
|
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||||
|
Region? selectedRegion;
|
||||||
|
Province? selectedProvince;
|
||||||
|
CityMunicipality? selectedMunicipality;
|
||||||
|
Country? selectedCountry;
|
||||||
|
Eligibility? selectedEligibility;
|
||||||
|
List<Province>? provinces;
|
||||||
|
List<CityMunicipality>? citymuns;
|
||||||
|
bool provinceCall = false;
|
||||||
|
bool cityCall = false;
|
||||||
|
final examDateController = TextEditingController();
|
||||||
|
final validityDateController = TextEditingController();
|
||||||
|
String? token;
|
||||||
|
String? profileId;
|
||||||
|
String? rating;
|
||||||
|
String? license;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocBuilder<EligibilityBloc, EligibilityState>(
|
||||||
|
buildWhen: (previous, current) {
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
////ADD ELIGIBILITY STATE
|
||||||
|
if (state is AddEligibilityState) {
|
||||||
|
return SingleChildScrollView(
|
||||||
|
child: SizedBox(
|
||||||
|
height: screenHeight * .95,
|
||||||
|
child: ProgressHUD(
|
||||||
|
child: Center(
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(vertical: 25, horizontal: 18),
|
||||||
|
child: FormBuilder(
|
||||||
|
key: formKey,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
////ELIGIBILITIES DROPDOWN
|
||||||
|
FormBuilderDropdown<Eligibility>(
|
||||||
|
onChanged: (Eligibility? eligibility) {
|
||||||
|
selectedEligibility = eligibility;
|
||||||
|
},
|
||||||
|
autovalidateMode:
|
||||||
|
AutovalidateMode.onUserInteraction,
|
||||||
|
validator: (value) =>
|
||||||
|
value == null ? 'required' : null,
|
||||||
|
items: state.eligibilities
|
||||||
|
.map<DropdownMenuItem<Eligibility>>(
|
||||||
|
(Eligibility eligibility) {
|
||||||
|
return DropdownMenuItem<Eligibility>(
|
||||||
|
value: eligibility,
|
||||||
|
child: Text(eligibility.title));
|
||||||
|
}).toList(),
|
||||||
|
name: "eligibility",
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Eligibility", "Eligibility")),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
////LICENSE NUMBER
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
onChanged: (value) {
|
||||||
|
license = value;
|
||||||
|
},
|
||||||
|
name: 'license_number',
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"license number", "license number"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 8,
|
||||||
|
),
|
||||||
|
////RATING
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
keyboardType:
|
||||||
|
const TextInputType.numberWithOptions(),
|
||||||
|
onChanged: (value) {
|
||||||
|
rating = value;
|
||||||
|
},
|
||||||
|
name: 'rating',
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
'rating %', 'rating'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
////EXAM DATE
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: DateTimePicker(
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
use24HourFormat: false,
|
||||||
|
icon: const Icon(Icons.date_range),
|
||||||
|
controller: examDateController,
|
||||||
|
firstDate: DateTime(1970),
|
||||||
|
lastDate: DateTime(2100),
|
||||||
|
timeHintText:
|
||||||
|
"Date of Examination/Conferment",
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle("Exam date", "")
|
||||||
|
.copyWith(
|
||||||
|
prefixIcon: const Icon(
|
||||||
|
Icons.date_range,
|
||||||
|
color: Colors.black87,
|
||||||
|
)),
|
||||||
|
initialValue: null,
|
||||||
|
)),
|
||||||
|
const SizedBox(
|
||||||
|
width: 8,
|
||||||
|
),
|
||||||
|
////VALIDITY DATE
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: DateTimePicker(
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: "This field is required"),
|
||||||
|
controller: validityDateController,
|
||||||
|
firstDate: DateTime(1970),
|
||||||
|
lastDate: DateTime(2100),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Validity date", "Validity date")
|
||||||
|
.copyWith(
|
||||||
|
prefixIcon: const Icon(
|
||||||
|
Icons.date_range,
|
||||||
|
color: Colors.black87,
|
||||||
|
)),
|
||||||
|
initialValue: null,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Placement of Examination/Conferment",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.displaySmall!
|
||||||
|
.copyWith(fontSize: blockSizeVertical * 2),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
////OVERSEAS ADDRESS SWITCH
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
FormBuilderSwitch(
|
||||||
|
validator: FormBuilderValidators.required(
|
||||||
|
errorText: 'This field is required'),
|
||||||
|
initialValue: overseas,
|
||||||
|
activeColor: second,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
overseas = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration: normalTextFieldStyle("", ''),
|
||||||
|
name: 'overseas',
|
||||||
|
title: const Text("Overseas Address?"),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
////COUNTRY DROPDOWN
|
||||||
|
SizedBox(
|
||||||
|
child: overseas == true
|
||||||
|
? FormBuilderDropdown<Country>(
|
||||||
|
initialValue: null,
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
items: state.countries
|
||||||
|
.map<DropdownMenuItem<Country>>(
|
||||||
|
(Country country) {
|
||||||
|
return DropdownMenuItem<Country>(
|
||||||
|
value: country,
|
||||||
|
child: FittedBox(
|
||||||
|
child: Text(country.name!)));
|
||||||
|
}).toList(),
|
||||||
|
name: 'country',
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Country*", "Country"),
|
||||||
|
onChanged: (Country? value) {
|
||||||
|
selectedCountry = value;
|
||||||
|
},
|
||||||
|
)
|
||||||
|
: Column(
|
||||||
|
children: [
|
||||||
|
////REGION DROPDOWN
|
||||||
|
FormBuilderDropdown<Region?>(
|
||||||
|
autovalidateMode: AutovalidateMode
|
||||||
|
.onUserInteraction,
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
//// region onchange
|
||||||
|
onChanged: (Region? region) async {
|
||||||
|
|
||||||
|
if(selectedRegion != region){
|
||||||
|
setState(() {
|
||||||
|
provinceCall = true;
|
||||||
|
});
|
||||||
|
selectedRegion = region;
|
||||||
|
getProvinces();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initialValue: selectedRegion,
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Region*", "Region"),
|
||||||
|
name: 'region',
|
||||||
|
items: state.regions
|
||||||
|
.map<DropdownMenuItem<Region>>(
|
||||||
|
(Region region) {
|
||||||
|
return DropdownMenuItem<Region>(
|
||||||
|
value: region,
|
||||||
|
child: Text(
|
||||||
|
region.description!));
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
////PROVINCE DROPDOWN
|
||||||
|
SizedBox(
|
||||||
|
height: 70,
|
||||||
|
child: ModalProgressHUD(
|
||||||
|
color: Colors.transparent,
|
||||||
|
inAsyncCall: provinceCall,
|
||||||
|
child: DropdownButtonFormField<
|
||||||
|
Province?>(
|
||||||
|
autovalidateMode:
|
||||||
|
AutovalidateMode
|
||||||
|
.onUserInteraction,
|
||||||
|
validator: (value) =>
|
||||||
|
value == null
|
||||||
|
? 'required'
|
||||||
|
: null,
|
||||||
|
isExpanded: true,
|
||||||
|
value: selectedProvince,
|
||||||
|
onChanged:
|
||||||
|
(Province? province) {
|
||||||
|
|
||||||
|
if(selectedProvince != province){
|
||||||
|
setState(() {
|
||||||
|
cityCall = true;
|
||||||
|
});
|
||||||
|
selectedProvince = province;
|
||||||
|
getCities();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
items: provinces == null
|
||||||
|
? []
|
||||||
|
: provinces!.map<
|
||||||
|
DropdownMenuItem<
|
||||||
|
Province>>(
|
||||||
|
(Province province) {
|
||||||
|
return DropdownMenuItem(
|
||||||
|
value: province,
|
||||||
|
child: FittedBox(
|
||||||
|
child: Text(province
|
||||||
|
.description!),
|
||||||
|
));
|
||||||
|
}).toList(),
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Province*",
|
||||||
|
"Province")),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
//// CityMunicipalities dropdown
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
child: ModalProgressHUD(
|
||||||
|
color: Colors.white,
|
||||||
|
inAsyncCall: cityCall,
|
||||||
|
child: DropdownButtonFormField<
|
||||||
|
CityMunicipality>(
|
||||||
|
validator: (value) =>
|
||||||
|
value == null
|
||||||
|
? 'required'
|
||||||
|
: null,
|
||||||
|
isExpanded: true,
|
||||||
|
onChanged:
|
||||||
|
(CityMunicipality? city) {
|
||||||
|
selectedMunicipality = city;
|
||||||
|
},
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Municipality*",
|
||||||
|
"Municipality"),
|
||||||
|
value: selectedMunicipality,
|
||||||
|
items: citymuns == null
|
||||||
|
? []
|
||||||
|
: citymuns!.map<
|
||||||
|
DropdownMenuItem<
|
||||||
|
CityMunicipality>>(
|
||||||
|
(CityMunicipality c) {
|
||||||
|
return DropdownMenuItem(
|
||||||
|
value: c,
|
||||||
|
child: Text(c
|
||||||
|
.description!));
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
const Expanded(
|
||||||
|
child: SizedBox(),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
height: 60,
|
||||||
|
child: ElevatedButton(
|
||||||
|
style: mainBtnStyle(
|
||||||
|
primary, Colors.transparent, second),
|
||||||
|
onPressed: () {
|
||||||
|
//rating
|
||||||
|
double? rate = rating == null
|
||||||
|
? null
|
||||||
|
: double.parse(rating!);
|
||||||
|
//lisence
|
||||||
|
String? licenseNumber = license;
|
||||||
|
CityMunicipality? cityMunicipality =
|
||||||
|
selectedMunicipality;
|
||||||
|
DateTime? examDate = examDateController
|
||||||
|
.text.isEmpty
|
||||||
|
? null
|
||||||
|
: DateTime.parse(examDateController.text);
|
||||||
|
DateTime? validityDate =
|
||||||
|
validityDateController.text.isEmpty
|
||||||
|
? null
|
||||||
|
: DateTime.parse(
|
||||||
|
validityDateController.text);
|
||||||
|
|
||||||
|
ExamAddress examAddress = ExamAddress(
|
||||||
|
barangay: null,
|
||||||
|
id: null,
|
||||||
|
addressCategory: null,
|
||||||
|
examAddressClass: null,
|
||||||
|
country: selectedCountry ??
|
||||||
|
Country(
|
||||||
|
id: 175,
|
||||||
|
name: 'Philippines',
|
||||||
|
code: 'PH'),
|
||||||
|
cityMunicipality: cityMunicipality);
|
||||||
|
EligibityCert eligibityCert = EligibityCert(
|
||||||
|
id: null,
|
||||||
|
rating: rate,
|
||||||
|
examDate: examDate,
|
||||||
|
attachments: null,
|
||||||
|
eligibility: selectedEligibility,
|
||||||
|
examAddress: examAddress,
|
||||||
|
validityDate: validityDate,
|
||||||
|
licenseNumber: licenseNumber,
|
||||||
|
overseas: overseas);
|
||||||
|
if (formKey.currentState!.saveAndValidate()) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Loading...");
|
||||||
|
context.read<EligibilityBloc>().add(
|
||||||
|
AddEligibility(
|
||||||
|
eligibityCert: eligibityCert,
|
||||||
|
profileId:
|
||||||
|
widget.profileId.toString(),
|
||||||
|
token: widget.token));
|
||||||
|
}
|
||||||
|
// context.read<ProfileBloc>().add(AddEligibility(eligibityCert: eligibityCert, profileId: profileId, token: token))
|
||||||
|
},
|
||||||
|
child: const Text(submit)),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> getProvinces() async {
|
||||||
|
try {
|
||||||
|
List<Province> newProvinces = await LocationUtils.instance
|
||||||
|
.getProvinces(regionCode: selectedRegion!.code.toString());
|
||||||
|
setState(() {
|
||||||
|
provinces = newProvinces;
|
||||||
|
selectedProvince = provinces![0];
|
||||||
|
provinceCall = false;
|
||||||
|
cityCall = true;
|
||||||
|
getCities();
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
context.read<EligibilityBloc>().add(CallErrorState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> getCities() async {
|
||||||
|
try {
|
||||||
|
List<CityMunicipality> newCities = await LocationUtils.instance
|
||||||
|
.getCities(code: selectedProvince!.code.toString());
|
||||||
|
citymuns = newCities;
|
||||||
|
setState(() {
|
||||||
|
selectedMunicipality = newCities[0];
|
||||||
|
cityCall = false;
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
context.read<EligibilityBloc>().add(CallErrorState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,542 @@
|
||||||
|
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:form_builder_validators/form_builder_validators.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
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/location_utilities.dart';
|
||||||
|
import '../../../../bloc/profile/eligibility/eligibility_bloc.dart';
|
||||||
|
import '../../../../model/location/country.dart';
|
||||||
|
import '../../../../model/location/region.dart';
|
||||||
|
import '../../../../model/location/provinces.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';
|
||||||
|
import '../../../../utils/text_container.dart';
|
||||||
|
|
||||||
|
class EditEligibilityScreen extends StatefulWidget {
|
||||||
|
final EligibityCert eligibityCert;
|
||||||
|
final int profileId;
|
||||||
|
final String token;
|
||||||
|
const EditEligibilityScreen({super.key, required this.eligibityCert, required this.profileId, required this.token});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<EditEligibilityScreen> createState() => _EditEligibilityScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EditEligibilityScreenState extends State<EditEligibilityScreen> {
|
||||||
|
final formKey = GlobalKey<FormBuilderState>();
|
||||||
|
final provinceKey = GlobalKey<FormBuilderState>();
|
||||||
|
bool? overseas;
|
||||||
|
List<Province>? provinces;
|
||||||
|
List<CityMunicipality>? citymuns;
|
||||||
|
List<Region>? regions;
|
||||||
|
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||||
|
Region? selectedRegion;
|
||||||
|
Province? selectedProvince;
|
||||||
|
CityMunicipality? selectedMunicipality;
|
||||||
|
Country? selectedCountry;
|
||||||
|
Eligibility? selectedEligibility;
|
||||||
|
bool provinceCall = false;
|
||||||
|
bool cityCall = false;
|
||||||
|
String? token;
|
||||||
|
String? profileId;
|
||||||
|
String? rating;
|
||||||
|
String? license;
|
||||||
|
final examDateController = TextEditingController();
|
||||||
|
final validityDateController = TextEditingController();
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
|
return BlocBuilder<EligibilityBloc, EligibilityState>(
|
||||||
|
buildWhen: (previous, current) {
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
//EDIT ELIGIBILITY STATE
|
||||||
|
if (state is EditEligibilityState) {
|
||||||
|
examDateController.text =
|
||||||
|
state.eligibityCert.examDate == null
|
||||||
|
? ''
|
||||||
|
: state.eligibityCert.examDate.toString();
|
||||||
|
validityDateController.text =
|
||||||
|
state.eligibityCert.validityDate == null
|
||||||
|
? ''
|
||||||
|
: state.eligibityCert.validityDate.toString();
|
||||||
|
|
||||||
|
provinces = state.provinces;
|
||||||
|
citymuns = state.cities;
|
||||||
|
regions = state.regions;
|
||||||
|
overseas = state.isOverseas;
|
||||||
|
selectedRegion = state.currentRegion;
|
||||||
|
selectedProvince = state.currentProvince;
|
||||||
|
selectedMunicipality = state.currentCity;
|
||||||
|
selectedEligibility = state.currentEligibility;
|
||||||
|
rating = state.eligibityCert.rating?.toString();
|
||||||
|
license = state.eligibityCert.licenseNumber;
|
||||||
|
return Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 25, horizontal: 18),
|
||||||
|
child: FormBuilder(
|
||||||
|
key: formKey,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
////ELIGIBILITIES DROPDOWN
|
||||||
|
DropdownButtonFormField<Eligibility>(
|
||||||
|
validator: (value) =>
|
||||||
|
value == null ? 'required' : null,
|
||||||
|
isExpanded: true,
|
||||||
|
onChanged: (Eligibility? eligibility) {
|
||||||
|
selectedEligibility = eligibility;
|
||||||
|
},
|
||||||
|
value: selectedEligibility,
|
||||||
|
items: state.eligibilities
|
||||||
|
.map<DropdownMenuItem<Eligibility>>(
|
||||||
|
(Eligibility eligibility) {
|
||||||
|
return DropdownMenuItem<Eligibility>(
|
||||||
|
value: eligibility,
|
||||||
|
child: Text(eligibility.title));
|
||||||
|
}).toList(),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Eligibility", "")),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
////LICENSE NUMBER
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
onChanged: (value) {
|
||||||
|
license = value;
|
||||||
|
},
|
||||||
|
name: 'license_number',
|
||||||
|
initialValue: license,
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"license number",
|
||||||
|
"license number"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 12,
|
||||||
|
),
|
||||||
|
// //RATING
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: FormBuilderTextField(
|
||||||
|
keyboardType: const TextInputType
|
||||||
|
.numberWithOptions(),
|
||||||
|
onChanged: (value) {
|
||||||
|
rating = value;
|
||||||
|
},
|
||||||
|
name: 'rating',
|
||||||
|
initialValue: rating == null
|
||||||
|
? 'N/A'
|
||||||
|
: rating.toString(),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
'rating', 'rating'),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
// //EXAM DATE
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: DateTimePicker(
|
||||||
|
validator: FormBuilderValidators.required(errorText: "This field is required"),
|
||||||
|
use24HourFormat: false,
|
||||||
|
controller: examDateController,
|
||||||
|
firstDate: DateTime(1970),
|
||||||
|
lastDate: DateTime(2100),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Exam date", "")
|
||||||
|
.copyWith(
|
||||||
|
prefixIcon: const Icon(
|
||||||
|
Icons.date_range,
|
||||||
|
color: Colors.black87,
|
||||||
|
)),
|
||||||
|
)),
|
||||||
|
const SizedBox(
|
||||||
|
width: 12,
|
||||||
|
),
|
||||||
|
////VALIDITY DATE
|
||||||
|
Flexible(
|
||||||
|
flex: 1,
|
||||||
|
child: DateTimePicker(
|
||||||
|
validator: FormBuilderValidators.required(errorText: "This field is required"),
|
||||||
|
|
||||||
|
use24HourFormat: false,
|
||||||
|
controller: validityDateController,
|
||||||
|
firstDate: DateTime(1970),
|
||||||
|
lastDate: DateTime(2100),
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"validity date", "")
|
||||||
|
.copyWith(
|
||||||
|
prefixIcon: const Icon(
|
||||||
|
Icons.date_range,
|
||||||
|
color: Colors.black87,
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Placement of Examination/Confinement",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.displaySmall!
|
||||||
|
.copyWith(
|
||||||
|
fontSize: blockSizeVertical * 2),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 12,
|
||||||
|
),
|
||||||
|
//OVERSEAS ADDRESS SWITCH
|
||||||
|
StatefulBuilder(
|
||||||
|
builder: (context, StateSetter setState) {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
FormBuilderSwitch(
|
||||||
|
initialValue: overseas,
|
||||||
|
activeColor: second,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
overseas = value;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle("", ''),
|
||||||
|
name: 'overseas',
|
||||||
|
title: const Text("Overseas Address?"),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
//COUNTRY DROPDOWN
|
||||||
|
SizedBox(
|
||||||
|
child: overseas == true
|
||||||
|
? FormBuilderDropdown<Country>(
|
||||||
|
validator: (value) =>
|
||||||
|
value == null
|
||||||
|
? 'required'
|
||||||
|
: null,
|
||||||
|
initialValue:
|
||||||
|
state.selectedCountry,
|
||||||
|
items: state.countries.map<
|
||||||
|
DropdownMenuItem<
|
||||||
|
Country>>(
|
||||||
|
(Country country) {
|
||||||
|
return DropdownMenuItem<
|
||||||
|
Country>(
|
||||||
|
value: country,
|
||||||
|
child: FittedBox(
|
||||||
|
child: Text(country
|
||||||
|
.name!)));
|
||||||
|
}).toList(),
|
||||||
|
name: 'country',
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Country*",
|
||||||
|
"Country"),
|
||||||
|
onChanged: (Country? value) {
|
||||||
|
selectedCountry = value;
|
||||||
|
},
|
||||||
|
)
|
||||||
|
: Column(
|
||||||
|
children: [
|
||||||
|
//REGION DROPDOWN
|
||||||
|
DropdownButtonFormField<
|
||||||
|
Region?>(
|
||||||
|
validator: (value) =>
|
||||||
|
value == null
|
||||||
|
? 'required'
|
||||||
|
: null,
|
||||||
|
isExpanded: true,
|
||||||
|
onChanged: (Region?
|
||||||
|
region) async {
|
||||||
|
setState(() {
|
||||||
|
provinceCall = true;
|
||||||
|
});
|
||||||
|
selectedRegion = region;
|
||||||
|
provinces = await LocationUtils
|
||||||
|
.instance
|
||||||
|
.getProvinces(
|
||||||
|
regionCode:
|
||||||
|
selectedRegion!
|
||||||
|
.code
|
||||||
|
.toString());
|
||||||
|
selectedProvince =
|
||||||
|
provinces![0];
|
||||||
|
setState(() {
|
||||||
|
provinceCall = false;
|
||||||
|
cityCall = true;
|
||||||
|
});
|
||||||
|
citymuns = await LocationUtils
|
||||||
|
.instance
|
||||||
|
.getCities(
|
||||||
|
code:
|
||||||
|
selectedProvince!
|
||||||
|
.code!);
|
||||||
|
selectedMunicipality =
|
||||||
|
citymuns![0];
|
||||||
|
setState(() {
|
||||||
|
cityCall = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
value: selectedRegion,
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Region*",
|
||||||
|
"Region"),
|
||||||
|
items: regions == null
|
||||||
|
? []
|
||||||
|
: regions!.map<
|
||||||
|
DropdownMenuItem<
|
||||||
|
Region>>((Region
|
||||||
|
region) {
|
||||||
|
return DropdownMenuItem<
|
||||||
|
Region>(
|
||||||
|
value: region,
|
||||||
|
child: Text(region
|
||||||
|
.description!));
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
////PROVINCE DROPDOWN
|
||||||
|
SizedBox(
|
||||||
|
height: 70,
|
||||||
|
child: ModalProgressHUD(
|
||||||
|
color:
|
||||||
|
Colors.transparent,
|
||||||
|
inAsyncCall:
|
||||||
|
provinceCall,
|
||||||
|
child: DropdownButtonFormField<
|
||||||
|
Province?>(
|
||||||
|
validator: (value) =>
|
||||||
|
value == null
|
||||||
|
? 'required'
|
||||||
|
: null,
|
||||||
|
isExpanded: true,
|
||||||
|
value:
|
||||||
|
selectedProvince,
|
||||||
|
onChanged: (Province?
|
||||||
|
province) async {
|
||||||
|
setState(() {
|
||||||
|
cityCall = true;
|
||||||
|
});
|
||||||
|
selectedProvince =
|
||||||
|
province;
|
||||||
|
citymuns = await LocationUtils
|
||||||
|
.instance
|
||||||
|
.getCities(
|
||||||
|
code: selectedProvince!
|
||||||
|
.code
|
||||||
|
.toString());
|
||||||
|
selectedMunicipality =
|
||||||
|
citymuns![0];
|
||||||
|
setState(() {
|
||||||
|
cityCall =
|
||||||
|
false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
items: provinces ==
|
||||||
|
null
|
||||||
|
? []
|
||||||
|
: provinces!.map<
|
||||||
|
DropdownMenuItem<
|
||||||
|
Province>>((Province
|
||||||
|
province) {
|
||||||
|
return DropdownMenuItem(
|
||||||
|
value:
|
||||||
|
province,
|
||||||
|
child:
|
||||||
|
FittedBox(
|
||||||
|
child:
|
||||||
|
Text(province.description!),
|
||||||
|
));
|
||||||
|
}).toList(),
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Province*",
|
||||||
|
"Province")),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
//// City municipality
|
||||||
|
SizedBox(
|
||||||
|
height: 70,
|
||||||
|
child: ModalProgressHUD(
|
||||||
|
color:
|
||||||
|
Colors.transparent,
|
||||||
|
inAsyncCall: cityCall,
|
||||||
|
child:
|
||||||
|
DropdownButtonFormField<
|
||||||
|
CityMunicipality>(
|
||||||
|
validator: (value) =>
|
||||||
|
value == null
|
||||||
|
? 'required'
|
||||||
|
: null,
|
||||||
|
isExpanded: true,
|
||||||
|
onChanged:
|
||||||
|
(CityMunicipality?
|
||||||
|
city) {
|
||||||
|
selectedMunicipality =
|
||||||
|
city;
|
||||||
|
},
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Municipality*",
|
||||||
|
"Municipality"),
|
||||||
|
value:
|
||||||
|
selectedMunicipality,
|
||||||
|
items: citymuns ==
|
||||||
|
null
|
||||||
|
? []
|
||||||
|
: citymuns!.map<
|
||||||
|
DropdownMenuItem<
|
||||||
|
CityMunicipality>>(
|
||||||
|
(CityMunicipality
|
||||||
|
c) {
|
||||||
|
return DropdownMenuItem(
|
||||||
|
value: c,
|
||||||
|
child: Text(
|
||||||
|
c.description!));
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
|
||||||
|
const Expanded(
|
||||||
|
child: SizedBox(),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
width: screenWidth,
|
||||||
|
height: 60,
|
||||||
|
child: ElevatedButton(
|
||||||
|
style: mainBtnStyle(
|
||||||
|
primary, Colors.transparent, second),
|
||||||
|
onPressed: () {
|
||||||
|
////rating
|
||||||
|
double? rate = rating == null
|
||||||
|
? null
|
||||||
|
: double.parse(rating!);
|
||||||
|
////license
|
||||||
|
String? newLicense = license;
|
||||||
|
////city municipality
|
||||||
|
CityMunicipality? cityMunicipality =
|
||||||
|
selectedMunicipality;
|
||||||
|
////exam date
|
||||||
|
DateTime? examDate =
|
||||||
|
examDateController.text.isEmpty
|
||||||
|
? null
|
||||||
|
: DateTime.parse(
|
||||||
|
examDateController.text);
|
||||||
|
// // validity date
|
||||||
|
DateTime? validityDate =
|
||||||
|
validityDateController.text.isEmpty
|
||||||
|
? null
|
||||||
|
: DateTime.parse(
|
||||||
|
validityDateController
|
||||||
|
.text);
|
||||||
|
//// exam address
|
||||||
|
ExamAddress examAddress = ExamAddress(
|
||||||
|
barangay: state.eligibityCert
|
||||||
|
.examAddress?.barangay,
|
||||||
|
id: state
|
||||||
|
.eligibityCert.examAddress?.id,
|
||||||
|
addressCategory: state.eligibityCert
|
||||||
|
.examAddress?.addressCategory,
|
||||||
|
examAddressClass: state
|
||||||
|
.eligibityCert
|
||||||
|
.examAddress
|
||||||
|
?.examAddressClass,
|
||||||
|
country: selectedCountry ??=
|
||||||
|
Country(
|
||||||
|
id: 175,
|
||||||
|
name: 'Philippines',
|
||||||
|
code: 'PH'),
|
||||||
|
cityMunicipality: cityMunicipality);
|
||||||
|
EligibityCert eligibityCert =
|
||||||
|
EligibityCert(
|
||||||
|
id: state.eligibityCert.id,
|
||||||
|
rating: rate,
|
||||||
|
examDate: examDate,
|
||||||
|
attachments: null,
|
||||||
|
eligibility:
|
||||||
|
selectedEligibility,
|
||||||
|
examAddress: examAddress,
|
||||||
|
validityDate: validityDate,
|
||||||
|
licenseNumber: newLicense,
|
||||||
|
overseas: overseas);
|
||||||
|
if (formKey.currentState!
|
||||||
|
.saveAndValidate()) {
|
||||||
|
final progress =
|
||||||
|
ProgressHUD.of(
|
||||||
|
context);
|
||||||
|
progress!.showWithText(
|
||||||
|
"Loading...");
|
||||||
|
context.read<EligibilityBloc>().add(
|
||||||
|
UpdateEligibility(
|
||||||
|
eligibityCert: eligibityCert,
|
||||||
|
oldEligibility: state
|
||||||
|
.eligibityCert
|
||||||
|
.eligibility!
|
||||||
|
.id,
|
||||||
|
profileId:widget.profileId.toString(),
|
||||||
|
token: widget.token));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: const Text(submit)),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,375 @@
|
||||||
|
import 'package:app_popup_menu/app_popup_menu.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import 'package:fluttericon/font_awesome_icons.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/eligibility.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/eligibility/add_modal.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/eligibility/edit_modal.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/close_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
import 'package:unit2/widgets/error_state.dart';
|
||||||
|
import '../../../bloc/profile/eligibility/eligibility_bloc.dart';
|
||||||
|
import '../../../utils/alerts.dart';
|
||||||
|
|
||||||
|
class EligibiltyScreen extends StatelessWidget {
|
||||||
|
const EligibiltyScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
String? token;
|
||||||
|
int? profileId;
|
||||||
|
|
||||||
|
return WillPopScope(
|
||||||
|
onWillPop: () async {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
child: Scaffold(
|
||||||
|
resizeToAvoidBottomInset: true,
|
||||||
|
appBar: AppBar(
|
||||||
|
title: context.watch<EligibilityBloc>().state is AddEligibilityState
|
||||||
|
? const Text("Add Eligiblity")
|
||||||
|
: context.watch<EligibilityBloc>().state is EditEligibilityState
|
||||||
|
? const Text("Edit Eligibilty")
|
||||||
|
: const Text(elibilityScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: (context.watch<EligibilityBloc>().state is EligibilityLoaded)
|
||||||
|
|
||||||
|
? [
|
||||||
|
AddLeading(onPressed: () {
|
||||||
|
context
|
||||||
|
.read<EligibilityBloc>()
|
||||||
|
.add(ShowAddEligibilityForm());
|
||||||
|
})
|
||||||
|
]
|
||||||
|
:(context.watch<EligibilityBloc>().state is AddEligibilityState || context.watch<EligibilityBloc>().state is EditEligibilityState)? [
|
||||||
|
CloseLeading(onPressed: () {
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility());
|
||||||
|
})
|
||||||
|
]:[],
|
||||||
|
),
|
||||||
|
body: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
token = state.userData!.user!.login!.token;
|
||||||
|
profileId =
|
||||||
|
state.userData!.user!.login!.user!.profileId;
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if(state is ProfileLoaded){
|
||||||
|
return ProgressHUD(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
indicatorWidget: const SpinKitFadingCircle(
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
backgroundColor: Colors.black87,
|
||||||
|
child: BlocConsumer<EligibilityBloc, EligibilityState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is EligibilityLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is EligibilityLoaded ||
|
||||||
|
state is AddEligibilityState ||
|
||||||
|
state is EditEligibilityState ||
|
||||||
|
state is DeletedState ||
|
||||||
|
state is EligibilityAddedState ||
|
||||||
|
state is EligibilityEditedState ||
|
||||||
|
state is EligibilityErrorState
|
||||||
|
) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
////DELETED STATE
|
||||||
|
if (state is DeletedState) {
|
||||||
|
if (state.success) {
|
||||||
|
successAlert(context, "Deletion Successfull",
|
||||||
|
"Eligibility has been deleted successfully",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Deletion Failed",
|
||||||
|
"Error deleting eligibility", () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////ADDED STATE
|
||||||
|
if (state is EligibilityAddedState) {
|
||||||
|
if (state.response['success']) {
|
||||||
|
successAlert(context, "Adding Successfull!",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Adding Failed",
|
||||||
|
"Something went wrong. Please try again.",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////UPDATED STATE
|
||||||
|
if (state is EligibilityEditedState) {
|
||||||
|
if (state.response['success']) {
|
||||||
|
successAlert(context, "Update Successfull!",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Update Failed",
|
||||||
|
"Something went wrong. Please try again.",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
return BlocBuilder<EligibilityBloc, EligibilityState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is EligibilityLoaded) {
|
||||||
|
|
||||||
|
if (state.eligibilities.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount: state.eligibilities.length,
|
||||||
|
itemBuilder:
|
||||||
|
(BuildContext context, int index) {
|
||||||
|
String title = state
|
||||||
|
.eligibilities[index]
|
||||||
|
.eligibility!
|
||||||
|
.title;
|
||||||
|
return Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: screenWidth,
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12,
|
||||||
|
vertical: 8),
|
||||||
|
decoration: box1(),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
title,
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w500),
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"$licenseNumber: ${state.eligibilities[index].licenseNumber == null ? 'N/A' : state.eligibilities[index].licenseNumber.toString()}",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleSmall),
|
||||||
|
const SizedBox(
|
||||||
|
height: 3,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"Rating : ${state.eligibilities[index].rating ?? 'N/A'}.",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleSmall)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
AppPopupMenu<int>(
|
||||||
|
offset:
|
||||||
|
const Offset(-10, -10),
|
||||||
|
elevation: 3,
|
||||||
|
onSelected: (value) {
|
||||||
|
|
||||||
|
////delete eligibilty-= = = = = = = = =>>
|
||||||
|
if (value == 2) {
|
||||||
|
|
||||||
|
confirmAlert(context,
|
||||||
|
() {
|
||||||
|
final progress =
|
||||||
|
ProgressHUD.of(
|
||||||
|
context);
|
||||||
|
progress!.showWithText(
|
||||||
|
"Loading...");
|
||||||
|
BlocProvider.of<
|
||||||
|
EligibilityBloc>(
|
||||||
|
context)
|
||||||
|
.add(DeleteEligibility(
|
||||||
|
|
||||||
|
|
||||||
|
eligibilityId: state
|
||||||
|
.eligibilities[
|
||||||
|
index]
|
||||||
|
.id!,
|
||||||
|
profileId:
|
||||||
|
profileId.toString(),
|
||||||
|
token:
|
||||||
|
token!));
|
||||||
|
}, "Delete?",
|
||||||
|
"Confirm Delete?");
|
||||||
|
}
|
||||||
|
if (value == 1) {
|
||||||
|
////edit eligibilty-= = = = = = = = =>>
|
||||||
|
final progress =
|
||||||
|
ProgressHUD.of(
|
||||||
|
context);
|
||||||
|
progress!.showWithText(
|
||||||
|
"Loading...");
|
||||||
|
EligibityCert
|
||||||
|
eligibityCert =
|
||||||
|
state.eligibilities[
|
||||||
|
index];
|
||||||
|
bool overseas = eligibityCert
|
||||||
|
.examAddress!
|
||||||
|
.country!
|
||||||
|
.id
|
||||||
|
.toString() ==
|
||||||
|
'175'
|
||||||
|
? false
|
||||||
|
: true;
|
||||||
|
eligibityCert.overseas =
|
||||||
|
overseas;
|
||||||
|
|
||||||
|
eligibityCert.overseas =
|
||||||
|
overseas;
|
||||||
|
|
||||||
|
context
|
||||||
|
.read<EligibilityBloc>()
|
||||||
|
.add(ShowEditEligibilityForm(
|
||||||
|
eligibityCert:
|
||||||
|
eligibityCert));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
menuItems: [
|
||||||
|
popMenuItem(
|
||||||
|
text: "Edit",
|
||||||
|
value: 1,
|
||||||
|
icon: Icons.edit),
|
||||||
|
popMenuItem(
|
||||||
|
text: "Delete",
|
||||||
|
value: 2,
|
||||||
|
icon: Icons.delete),
|
||||||
|
popMenuItem(
|
||||||
|
text: "Attachment",
|
||||||
|
value: 3,
|
||||||
|
icon: FontAwesome
|
||||||
|
.attach)
|
||||||
|
],
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
tooltip: "Options",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have any eligibilities added. Please click + to add");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state is EditEligibilityState) {
|
||||||
|
return EditEligibilityScreen(
|
||||||
|
profileId: profileId!,
|
||||||
|
token: token!,
|
||||||
|
eligibityCert: state.eligibityCert);
|
||||||
|
}
|
||||||
|
if (state is AddEligibilityState) {
|
||||||
|
return AddEligibilityScreen(token: token!,profileId: profileId!,);
|
||||||
|
}
|
||||||
|
if (state is EligibilityErrorState) {
|
||||||
|
return SomethingWentWrong(message: state.message, onpressed: (){
|
||||||
|
context.read<EligibilityBloc>().add(LoadEligibility(token: token,profileId: profileId));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return Container(
|
||||||
|
color: Colors.grey.shade200,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PopupMenuItem<int> popMenuItem({String? text, int? value, IconData? icon}) {
|
||||||
|
return PopupMenuItem(
|
||||||
|
value: value,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
icon,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
text!,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,430 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/family_backround.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
|
||||||
|
import '../../../bloc/profile/family/family_bloc.dart';
|
||||||
|
|
||||||
|
class FamilyBackgroundScreen extends StatefulWidget {
|
||||||
|
const FamilyBackgroundScreen({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<FamilyBackgroundScreen> createState() => _FamilyBackgroundScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FamilyBackgroundScreenState extends State<FamilyBackgroundScreen> {
|
||||||
|
FamilyBackground? father;
|
||||||
|
FamilyBackground? mother;
|
||||||
|
FamilyBackground? spouse;
|
||||||
|
List<FamilyBackground> children = [];
|
||||||
|
List<FamilyBackground> otherRelated = [];
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(familyBackgroundScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
),
|
||||||
|
body: ProgressHUD(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
backgroundColor: Colors.black87,
|
||||||
|
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||||
|
child: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocConsumer<FamilyBloc, FamilyState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is FamilyLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is FamilyLoaded || state is FamilyErrorState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is FamilyLoaded) {
|
||||||
|
father = state.families.firstWhere(
|
||||||
|
(element) => element.relationship!.id == 1);
|
||||||
|
mother = state.families.firstWhere(
|
||||||
|
(element) => element.relationship!.id == 2);
|
||||||
|
spouse = state.families.firstWhere(
|
||||||
|
(element) => element.relationship!.id == 3);
|
||||||
|
|
||||||
|
// get all children
|
||||||
|
var childs = state.families
|
||||||
|
.where((element) => element.relationship!.id == 4);
|
||||||
|
if (childs.isNotEmpty) {
|
||||||
|
for (var element in childs) {
|
||||||
|
children.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//get all related persons
|
||||||
|
var relateds = state.families
|
||||||
|
.where((element) => element.relationship!.id! > 4);
|
||||||
|
if (relateds.isNotEmpty) {
|
||||||
|
for (var element in relateds) {
|
||||||
|
otherRelated.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ListView(children: [
|
||||||
|
//Father----------------------------------------------
|
||||||
|
Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const Text(fatherText),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
" ${father!.relatedPerson!.firstName} ${father!.relatedPerson!.middleName} ${father!.relatedPerson!.lastName} ${father!.relatedPerson!.nameExtension ?? ''},",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
" ",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: false,
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
value = !value!;
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
const Text(incaseOfEmergency)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
|
||||||
|
//Mother-----------------------------------------------------
|
||||||
|
Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const Text(motherText),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
" ${mother!.relatedPerson!.firstName} ${mother!.relatedPerson!.middleName} ${mother!.relatedPerson!.lastName} ${mother!.relatedPerson!.nameExtension ?? ''}",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
Text(" ",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: false,
|
||||||
|
onChanged: (value) {}),
|
||||||
|
const Text(incaseOfEmergency)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
//Spouse ---------------------------------------------------------
|
||||||
|
spouse != null
|
||||||
|
? Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const Text(spouseText),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
" ${spouse!.relatedPerson!.firstName} ${spouse!.relatedPerson!.middleName} ${spouse!.relatedPerson!.lastName} ${spouse!.relatedPerson!.nameExtension ?? ''}",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight.w500)),
|
||||||
|
Text(" ",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: false,
|
||||||
|
onChanged: (value) {}),
|
||||||
|
const Text(incaseOfEmergency)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
|
||||||
|
// Childrens ----------------------------------
|
||||||
|
children.isNotEmpty
|
||||||
|
? Container(
|
||||||
|
decoration: box1(),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: children.map((child) {
|
||||||
|
int index = children.indexOf(child);
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
width: screenWidth,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
index == 0
|
||||||
|
? const Text(childrenText)
|
||||||
|
: const SizedBox(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
" ${child.relatedPerson!.firstName} ${child.relatedPerson!.middleName} ${child.relatedPerson!.lastName} ${child.relatedPerson!.nameExtension ?? ''}",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w500)),
|
||||||
|
Text(" ",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: false,
|
||||||
|
onChanged:
|
||||||
|
(value) {}),
|
||||||
|
const Text(
|
||||||
|
incaseOfEmergency)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}).toList()),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
//Other related person
|
||||||
|
otherRelated.isNotEmpty
|
||||||
|
? Container(
|
||||||
|
decoration: box1(),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: otherRelated.map((relative) {
|
||||||
|
int index2 =
|
||||||
|
otherRelated.indexOf(relative);
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
width: screenWidth,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
index2 == 0
|
||||||
|
? const Text(otherRelatedText)
|
||||||
|
: const SizedBox(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
" ${relative.relatedPerson!.firstName} ${relative.relatedPerson!.middleName} ${relative.relatedPerson!.lastName} ${relative.relatedPerson!.nameExtension ?? ''}",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w500)),
|
||||||
|
Text(" ",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.bodySmall!),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Checkbox(
|
||||||
|
value: false,
|
||||||
|
onChanged:
|
||||||
|
(value) {}),
|
||||||
|
const Text(
|
||||||
|
incaseOfEmergency)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
))
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}).toList()),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,183 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/src/widgets/framework.dart';
|
||||||
|
import 'package:flutter/src/widgets/placeholder.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/learning_development.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
import 'package:unit2/widgets/error_state.dart';
|
||||||
|
|
||||||
|
import '../../../bloc/profile/learningDevelopment/learning_development_bloc.dart';
|
||||||
|
|
||||||
|
class LearningAndDevelopmentScreen extends StatelessWidget {
|
||||||
|
|
||||||
|
const LearningAndDevelopmentScreen(
|
||||||
|
{super.key,});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(learningAndDevelopmentScreenTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: [AddLeading(onPressed: () {})],
|
||||||
|
),
|
||||||
|
body: ProgressHUD(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
indicatorWidget: const SpinKitFadingCircle(
|
||||||
|
color: Colors.white,
|
||||||
|
),
|
||||||
|
backgroundColor: Colors.black87,
|
||||||
|
child: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocConsumer<LearningDevelopmentBloc,
|
||||||
|
LearningDevelopmentState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is LearningDevelopmentLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is LearningDevelopmentLoadedState ||
|
||||||
|
state is LeaningDevelopmentErrorState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
// TODO: implement listener
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is LearningDevelopmentLoadedState) {
|
||||||
|
if (state.learningsAndDevelopment.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount:
|
||||||
|
state.learningsAndDevelopment.length,
|
||||||
|
itemBuilder:
|
||||||
|
(BuildContext context, int index) {
|
||||||
|
String training = state
|
||||||
|
.learningsAndDevelopment[index]
|
||||||
|
.conductedTraining!
|
||||||
|
.title!
|
||||||
|
.title!;
|
||||||
|
String provider = state
|
||||||
|
.learningsAndDevelopment[index]
|
||||||
|
.conductedTraining!
|
||||||
|
.conductedBy!
|
||||||
|
.name!;
|
||||||
|
String start = dteFormat2.format(state
|
||||||
|
.learningsAndDevelopment[index]
|
||||||
|
.conductedTraining!
|
||||||
|
.fromDate!);
|
||||||
|
String end = dteFormat2.format(state
|
||||||
|
.learningsAndDevelopment[index]
|
||||||
|
.conductedTraining!
|
||||||
|
.toDate!);
|
||||||
|
String type = state
|
||||||
|
.learningsAndDevelopment[index]
|
||||||
|
.conductedTraining!
|
||||||
|
.learningDevelopmentType!
|
||||||
|
.title!;
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
width: screenWidth,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
training,
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w500),
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
provider,
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleSmall,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
"$duration: $start to $end",
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.labelMedium,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have any Learning and Development added. Please click + to add.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state is LeaningDevelopmentErrorState) {
|
||||||
|
return (SomethingWentWrong(
|
||||||
|
message: state.message, onpressed: () {}));
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,159 @@
|
||||||
|
import 'package:expandable_group/expandable_group_widget.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:fluttericon/brandico_icons.dart';
|
||||||
|
import 'package:fluttericon/elusive_icons.dart';
|
||||||
|
import 'package:fluttericon/entypo_icons.dart';
|
||||||
|
import 'package:fluttericon/font_awesome5_icons.dart';
|
||||||
|
import 'package:fluttericon/modern_pictograms_icons.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/main_menu.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/submenu.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import '../../../theme-data.dart/colors.dart';
|
||||||
|
|
||||||
|
class LoadingScreen extends StatelessWidget {
|
||||||
|
const LoadingScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 12),
|
||||||
|
child: ListView(
|
||||||
|
children: [
|
||||||
|
const Text(
|
||||||
|
"View and Update your Profile Information",
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
ExpandableGroup(
|
||||||
|
collapsedIcon: const Icon(Icons.keyboard_arrow_down),
|
||||||
|
expandedIcon: const Icon(Icons.keyboard_arrow_up),
|
||||||
|
header: const ListTile(
|
||||||
|
leading: Icon(
|
||||||
|
Elusive.address_book,
|
||||||
|
color: primary,
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
"Basic Information",
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
items: [
|
||||||
|
subMenu(Icons.person, "Primary", () {}),
|
||||||
|
subMenu(Icons.home, "Home Addresses", () {}),
|
||||||
|
subMenu(Icons.contact_mail, "Identifications", () {}),
|
||||||
|
subMenu(Icons.contact_phone, "Contact Info", () {}),
|
||||||
|
subMenu(Icons.flag, "Citizenships", () {}),
|
||||||
|
]),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: Elusive.group,
|
||||||
|
title: "Family",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: FontAwesome5.graduation_cap,
|
||||||
|
title: "Education",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: Icons.stars,
|
||||||
|
title: "Eligibility",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: FontAwesome5.shopping_bag,
|
||||||
|
title: "Work History",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: FontAwesome5.walking,
|
||||||
|
title: "Voluntary Work & Civic Services",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: Elusive.lightbulb,
|
||||||
|
title: "Learning & Development",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
MainMenu(
|
||||||
|
icon: Brandico.codepen,
|
||||||
|
title: "Personal References",
|
||||||
|
onTap: () {},
|
||||||
|
),
|
||||||
|
ExpandableGroup(
|
||||||
|
collapsedIcon: const Icon(Icons.keyboard_arrow_down),
|
||||||
|
expandedIcon: const Icon(Icons.keyboard_arrow_up),
|
||||||
|
header: const ListTile(
|
||||||
|
leading: Icon(
|
||||||
|
Icons.info,
|
||||||
|
color: primary,
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
"Other Information",
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
items: [
|
||||||
|
subMenu(Icons.fitness_center, "Skills & Hobbies", () {}),
|
||||||
|
subMenu(FontAwesome5.certificate,
|
||||||
|
"Organization Memberships", () {}),
|
||||||
|
subMenu(
|
||||||
|
Entypo.doc_text, "Non-Academic Recognitions", () {}),
|
||||||
|
]),
|
||||||
|
ExpandableGroup(
|
||||||
|
collapsedIcon: const Icon(Icons.keyboard_arrow_down),
|
||||||
|
expandedIcon: const Icon(Icons.keyboard_arrow_up),
|
||||||
|
header: const ListTile(
|
||||||
|
leading: Icon(
|
||||||
|
FontAwesome5.laptop_house,
|
||||||
|
color: primary,
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
"Assets",
|
||||||
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
items: [
|
||||||
|
subMenu(ModernPictograms.home, "Real Property Tax", () {}),
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: screenWidth,
|
||||||
|
height: screenHeight,
|
||||||
|
color: Colors.white70,
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: Container(
|
||||||
|
height: 80,
|
||||||
|
width: 80,
|
||||||
|
decoration:const BoxDecoration(
|
||||||
|
color: Colors.black87,
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(8))
|
||||||
|
),
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: const[
|
||||||
|
SpinKitFadingCircle(
|
||||||
|
size: 42,
|
||||||
|
color: Colors.white),
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,9 +4,11 @@ import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
class MainMenu extends StatelessWidget {
|
class MainMenu extends StatelessWidget {
|
||||||
final IconData icon;
|
final IconData icon;
|
||||||
final String title;
|
final String title;
|
||||||
|
final Function() onTap;
|
||||||
const MainMenu({
|
const MainMenu({
|
||||||
required this.icon,
|
required this.icon,
|
||||||
required this.title,
|
required this.title,
|
||||||
|
required this.onTap,
|
||||||
Key? key,
|
Key? key,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@ -19,9 +21,10 @@ class MainMenu extends StatelessWidget {
|
||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
title,
|
title,
|
||||||
style: TextStyle(fontWeight: FontWeight.bold),
|
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||||
),
|
),
|
||||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||||
|
onTap: onTap,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,378 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.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 'package:unit2/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/other_information/non_acedimic_recognition.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
|
||||||
|
import '../../../../../model/utils/agency.dart';
|
||||||
|
import '../../../../../model/utils/category.dart';
|
||||||
|
import '../../../../../theme-data.dart/box_shadow.dart';
|
||||||
|
import '../../../../../theme-data.dart/btn-style.dart';
|
||||||
|
import '../../../../../theme-data.dart/colors.dart';
|
||||||
|
import '../../../../../utils/text_container.dart';
|
||||||
|
|
||||||
|
class AddNonAcademicRecognitionScreen extends StatefulWidget {
|
||||||
|
const AddNonAcademicRecognitionScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AddNonAcademicRecognitionScreen> createState() =>
|
||||||
|
_AddNonAcademicRecognitionScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AddNonAcademicRecognitionScreenState
|
||||||
|
extends State<AddNonAcademicRecognitionScreen> {
|
||||||
|
bool showAgencyCategory = false;
|
||||||
|
final agencyFocusNode = FocusNode();
|
||||||
|
|
||||||
|
final agencyCategoryFocusNode = FocusNode();
|
||||||
|
final addAgencyController = TextEditingController();
|
||||||
|
Agency? selectedAgency;
|
||||||
|
Category? selectedCategory;
|
||||||
|
Agency? newAgency;
|
||||||
|
bool showIsPrivateRadio = false;
|
||||||
|
bool? isPrivate = false;
|
||||||
|
NonAcademicRecognition? nonAcademicRecognition;
|
||||||
|
final _formKey = GlobalKey<FormBuilderState>();
|
||||||
|
int? profileId;
|
||||||
|
String? token;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
token = state.userData!.user!.login!.token;
|
||||||
|
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
|
||||||
|
return BlocBuilder<NonAcademicRecognitionBloc,
|
||||||
|
NonAcademicRecognitionState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is AddNonAcademeRecognitionState) {
|
||||||
|
return SizedBox(
|
||||||
|
height: blockSizeVertical * 90,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: FormBuilder(
|
||||||
|
key: _formKey,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 25,horizontal: 18),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
FormBuilderTextField(name: 'title',
|
||||||
|
decoration: normalTextFieldStyle("Recognition / Award Title *", "Recognition / Award Title"),
|
||||||
|
validator: FormBuilderValidators.required(errorText: "this field is required"),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 12,),
|
||||||
|
StatefulBuilder(
|
||||||
|
builder: (context, setState) {
|
||||||
|
//// AGENCY SEARCHFIELD
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
SearchField(
|
||||||
|
itemHeight: 70,
|
||||||
|
suggestions: state.agencies
|
||||||
|
.map((Agency agency) =>
|
||||||
|
SearchFieldListItem(
|
||||||
|
agency.name!,
|
||||||
|
item: agency,
|
||||||
|
child: ListTile(
|
||||||
|
title: Text(
|
||||||
|
agency.name!
|
||||||
|
.toUpperCase(),
|
||||||
|
overflow:
|
||||||
|
TextOverflow
|
||||||
|
.ellipsis,
|
||||||
|
),
|
||||||
|
subtitle: Text(agency
|
||||||
|
.privateEntity ==
|
||||||
|
true
|
||||||
|
? "Private"
|
||||||
|
: agency.privateEntity ==
|
||||||
|
false
|
||||||
|
? "Government"
|
||||||
|
: ""),
|
||||||
|
)))
|
||||||
|
.toList(),
|
||||||
|
validator: FormBuilderValidators
|
||||||
|
.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
focusNode: agencyFocusNode,
|
||||||
|
searchInputDecoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Agency *", "")
|
||||||
|
.copyWith(
|
||||||
|
suffixIcon:
|
||||||
|
const Icon(Icons
|
||||||
|
.arrow_drop_down)),
|
||||||
|
////agency suggestion tap
|
||||||
|
onSuggestionTap: (agency) {
|
||||||
|
setState(() {
|
||||||
|
selectedAgency = agency.item;
|
||||||
|
agencyFocusNode.unfocus();
|
||||||
|
if (selectedAgency
|
||||||
|
?.category ==
|
||||||
|
null) {
|
||||||
|
showAgencyCategory = true;
|
||||||
|
showIsPrivateRadio = true;
|
||||||
|
} else {
|
||||||
|
showAgencyCategory = false;
|
||||||
|
showIsPrivateRadio = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
emptyWidget: Container(
|
||||||
|
decoration: box1(),
|
||||||
|
height: 100,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.center,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.center,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
const Text(
|
||||||
|
"No result found..."),
|
||||||
|
const SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
//// Add agency onpressed
|
||||||
|
onPressed: () {
|
||||||
|
showDialog(
|
||||||
|
context:
|
||||||
|
context,
|
||||||
|
builder:
|
||||||
|
(BuildContext
|
||||||
|
context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text(
|
||||||
|
"Add Agency?"),
|
||||||
|
content:
|
||||||
|
SizedBox(
|
||||||
|
height:
|
||||||
|
130,
|
||||||
|
child:
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
TextFormField(
|
||||||
|
controller:
|
||||||
|
addAgencyController,
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle("", ""),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height:
|
||||||
|
12,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 50,
|
||||||
|
child: ElevatedButton(
|
||||||
|
style: mainBtnStyle(primary, Colors.transparent, second),
|
||||||
|
//// onpressed
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
newAgency = Agency(id: null, name: addAgencyController.text.toUpperCase(), category: null, privateEntity: null);
|
||||||
|
state.agencies.insert(0, newAgency!);
|
||||||
|
addAgencyController.clear();
|
||||||
|
Navigator.pop(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Text("Add"))),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Text(
|
||||||
|
"Add position"))
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
child: showAgencyCategory
|
||||||
|
? SearchField(
|
||||||
|
focusNode:
|
||||||
|
agencyCategoryFocusNode,
|
||||||
|
itemHeight: 70,
|
||||||
|
suggestions: state
|
||||||
|
.agencyCategories
|
||||||
|
.map((Category
|
||||||
|
category) =>
|
||||||
|
SearchFieldListItem(
|
||||||
|
category
|
||||||
|
.name!,
|
||||||
|
item:
|
||||||
|
category,
|
||||||
|
child:
|
||||||
|
ListTile(
|
||||||
|
title: Text(
|
||||||
|
category
|
||||||
|
.name!),
|
||||||
|
subtitle: Text(category
|
||||||
|
.industryClass!
|
||||||
|
.name!),
|
||||||
|
)))
|
||||||
|
.toList(),
|
||||||
|
emptyWidget: Container(
|
||||||
|
height: 100,
|
||||||
|
decoration: box1(),
|
||||||
|
child: const Center(
|
||||||
|
child: Text(
|
||||||
|
"No result found ...")),
|
||||||
|
),
|
||||||
|
////agency controller suggestion tap
|
||||||
|
onSuggestionTap:
|
||||||
|
(agencyCategory) {
|
||||||
|
setState(() {
|
||||||
|
selectedCategory =
|
||||||
|
agencyCategory
|
||||||
|
.item;
|
||||||
|
|
||||||
|
agencyCategoryFocusNode
|
||||||
|
.unfocus();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
searchInputDecoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Category *",
|
||||||
|
"")
|
||||||
|
.copyWith(
|
||||||
|
suffixIcon:
|
||||||
|
const Icon(
|
||||||
|
Icons
|
||||||
|
.arrow_drop_down)),
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators
|
||||||
|
.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
),
|
||||||
|
|
||||||
|
////PRVIATE SECTOR
|
||||||
|
SizedBox(
|
||||||
|
child: showIsPrivateRadio
|
||||||
|
? FormBuilderRadioGroup(
|
||||||
|
decoration:
|
||||||
|
InputDecoration(
|
||||||
|
border:
|
||||||
|
InputBorder.none,
|
||||||
|
label: Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Is this private sector? ",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.headlineSmall!
|
||||||
|
.copyWith(
|
||||||
|
fontSize:
|
||||||
|
24),
|
||||||
|
),
|
||||||
|
const Icon(FontAwesome
|
||||||
|
.help_circled)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
////onvhange private sector
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
if (value
|
||||||
|
.toString() ==
|
||||||
|
"YES") {
|
||||||
|
isPrivate = true;
|
||||||
|
} else {
|
||||||
|
isPrivate = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
name: 'isPrivate',
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators
|
||||||
|
.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
options: ["YES", "NO"]
|
||||||
|
.map((lang) =>
|
||||||
|
FormBuilderFieldOption(
|
||||||
|
value:
|
||||||
|
lang))
|
||||||
|
.toList(
|
||||||
|
growable:
|
||||||
|
false),
|
||||||
|
)
|
||||||
|
: const SizedBox()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
const SizedBox(
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
width: double.infinity,
|
||||||
|
child: ElevatedButton(
|
||||||
|
style: mainBtnStyle(primary,
|
||||||
|
Colors.transparent, second),
|
||||||
|
onPressed: () {
|
||||||
|
|
||||||
|
if (_formKey.currentState!
|
||||||
|
.saveAndValidate()) {
|
||||||
|
String title = _formKey.currentState!.value['title'];
|
||||||
|
|
||||||
|
if(selectedAgency?.privateEntity != null){
|
||||||
|
newAgency = selectedAgency;
|
||||||
|
}else{
|
||||||
|
newAgency = Agency(
|
||||||
|
id: selectedAgency?.id,
|
||||||
|
name: selectedAgency!.name,
|
||||||
|
category:
|
||||||
|
selectedCategory,
|
||||||
|
privateEntity: isPrivate);
|
||||||
|
}
|
||||||
|
nonAcademicRecognition = NonAcademicRecognition(id: null, title:title,presenter: newAgency );
|
||||||
|
context.read<NonAcademicRecognitionBloc>().add(AddNonAcademeRecognition(nonAcademicRecognition: nonAcademicRecognition!, profileId: profileId!, token: token!));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: const Text(submit)),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,410 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.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 'package:unit2/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/model/profile/other_information/non_acedimic_recognition.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
|
||||||
|
import '../../../../../model/utils/agency.dart';
|
||||||
|
import '../../../../../model/utils/category.dart';
|
||||||
|
import '../../../../../theme-data.dart/box_shadow.dart';
|
||||||
|
import '../../../../../theme-data.dart/btn-style.dart';
|
||||||
|
import '../../../../../theme-data.dart/colors.dart';
|
||||||
|
import '../../../../../utils/text_container.dart';
|
||||||
|
|
||||||
|
class EditNonAcademicRecognitionScreen extends StatefulWidget {
|
||||||
|
const EditNonAcademicRecognitionScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<EditNonAcademicRecognitionScreen> createState() =>
|
||||||
|
_EditNonAcademicRecognitionScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _EditNonAcademicRecognitionScreenState
|
||||||
|
extends State<EditNonAcademicRecognitionScreen> {
|
||||||
|
bool showAgencyCategory = false;
|
||||||
|
final agencyFocusNode = FocusNode();
|
||||||
|
|
||||||
|
final agencyCategoryFocusNode = FocusNode();
|
||||||
|
final addAgencyController = TextEditingController();
|
||||||
|
Agency? selectedAgency;
|
||||||
|
Category? selectedCategory;
|
||||||
|
Agency? newAgency;
|
||||||
|
bool showIsPrivateRadio = false;
|
||||||
|
bool? isPrivate = false;
|
||||||
|
NonAcademicRecognition? nonAcademicRecognition;
|
||||||
|
final oldAgencyController = TextEditingController();
|
||||||
|
final _formKey = GlobalKey<FormBuilderState>();
|
||||||
|
int? profileId;
|
||||||
|
String? token;
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
token = state.userData!.user!.login!.token;
|
||||||
|
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocBuilder<NonAcademicRecognitionBloc,
|
||||||
|
NonAcademicRecognitionState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is EditNonAcademeRecognitionState) {
|
||||||
|
oldAgencyController.text =
|
||||||
|
state.nonAcademicRecognition.presenter!.name!;
|
||||||
|
selectedAgency = state.nonAcademicRecognition.presenter;
|
||||||
|
selectedCategory =
|
||||||
|
state.nonAcademicRecognition.presenter!.category;
|
||||||
|
return SizedBox(
|
||||||
|
height: blockSizeVertical * 90,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: FormBuilder(
|
||||||
|
key: _formKey,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 25, horizontal: 18),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
FormBuilderTextField(
|
||||||
|
name: 'title',
|
||||||
|
initialValue:
|
||||||
|
state.nonAcademicRecognition.title,
|
||||||
|
decoration: normalTextFieldStyle(
|
||||||
|
"Recognition / Award Title *",
|
||||||
|
"Recognition / Award Title"),
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators.required(
|
||||||
|
errorText:
|
||||||
|
"this field is required"),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 12,
|
||||||
|
),
|
||||||
|
StatefulBuilder(
|
||||||
|
builder: (context, setState) {
|
||||||
|
//// AGENCY SEARCHFIELD
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
SearchField(
|
||||||
|
controller: oldAgencyController,
|
||||||
|
itemHeight: 70,
|
||||||
|
suggestions: state.agencies
|
||||||
|
.map((Agency agency) =>
|
||||||
|
SearchFieldListItem(
|
||||||
|
agency.name!,
|
||||||
|
item: agency,
|
||||||
|
child: ListTile(
|
||||||
|
title: Text(
|
||||||
|
agency.name!
|
||||||
|
.toUpperCase(),
|
||||||
|
overflow:
|
||||||
|
TextOverflow
|
||||||
|
.ellipsis,
|
||||||
|
),
|
||||||
|
subtitle: Text(agency
|
||||||
|
.privateEntity ==
|
||||||
|
true
|
||||||
|
? "Private"
|
||||||
|
: agency.privateEntity ==
|
||||||
|
false
|
||||||
|
? "Government"
|
||||||
|
: ""),
|
||||||
|
)))
|
||||||
|
.toList(),
|
||||||
|
|
||||||
|
validator: FormBuilderValidators
|
||||||
|
.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
focusNode: agencyFocusNode,
|
||||||
|
searchInputDecoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Agency *", "")
|
||||||
|
.copyWith(
|
||||||
|
suffixIcon:
|
||||||
|
const Icon(Icons
|
||||||
|
.arrow_drop_down)),
|
||||||
|
////agency suggestion tap
|
||||||
|
onSuggestionTap: (agency) {
|
||||||
|
setState(() {
|
||||||
|
selectedAgency = agency.item;
|
||||||
|
agencyFocusNode.unfocus();
|
||||||
|
if (selectedAgency
|
||||||
|
?.category ==
|
||||||
|
null) {
|
||||||
|
showAgencyCategory = true;
|
||||||
|
showIsPrivateRadio = true;
|
||||||
|
} else {
|
||||||
|
showAgencyCategory = false;
|
||||||
|
showIsPrivateRadio = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
emptyWidget: Container(
|
||||||
|
decoration: box1(),
|
||||||
|
height: 100,
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment
|
||||||
|
.center,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment
|
||||||
|
.center,
|
||||||
|
children: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 20,
|
||||||
|
),
|
||||||
|
const Text(
|
||||||
|
"No result found..."),
|
||||||
|
const SizedBox(
|
||||||
|
height: 10,
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
//// Add agency onpressed
|
||||||
|
onPressed: () {
|
||||||
|
showDialog(
|
||||||
|
context:
|
||||||
|
context,
|
||||||
|
builder:
|
||||||
|
(BuildContext
|
||||||
|
context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text(
|
||||||
|
"Add Agency?"),
|
||||||
|
content:
|
||||||
|
SizedBox(
|
||||||
|
height:
|
||||||
|
130,
|
||||||
|
child:
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
TextFormField(
|
||||||
|
controller:
|
||||||
|
addAgencyController,
|
||||||
|
decoration:
|
||||||
|
normalTextFieldStyle("", ""),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height:
|
||||||
|
12,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
height: 50,
|
||||||
|
child: ElevatedButton(
|
||||||
|
style: mainBtnStyle(primary, Colors.transparent, second),
|
||||||
|
//// onpressed
|
||||||
|
onPressed: () {
|
||||||
|
setState(() {
|
||||||
|
newAgency = Agency(id: null, name: addAgencyController.text.toUpperCase(), category: null, privateEntity: null);
|
||||||
|
state.agencies.insert(0, newAgency!);
|
||||||
|
addAgencyController.clear();
|
||||||
|
Navigator.pop(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Text("Add"))),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Text(
|
||||||
|
"Add position"))
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
child: showAgencyCategory
|
||||||
|
? SearchField(
|
||||||
|
focusNode:
|
||||||
|
agencyCategoryFocusNode,
|
||||||
|
itemHeight: 70,
|
||||||
|
suggestions: state
|
||||||
|
.agencyCategories
|
||||||
|
.map((Category
|
||||||
|
category) =>
|
||||||
|
SearchFieldListItem(
|
||||||
|
category
|
||||||
|
.name!,
|
||||||
|
item:
|
||||||
|
category,
|
||||||
|
child:
|
||||||
|
ListTile(
|
||||||
|
title: Text(
|
||||||
|
category
|
||||||
|
.name!),
|
||||||
|
subtitle: Text(category
|
||||||
|
.industryClass!
|
||||||
|
.name!),
|
||||||
|
)))
|
||||||
|
.toList(),
|
||||||
|
emptyWidget: Container(
|
||||||
|
height: 100,
|
||||||
|
decoration: box1(),
|
||||||
|
child: const Center(
|
||||||
|
child: Text(
|
||||||
|
"No result found ...")),
|
||||||
|
),
|
||||||
|
////agency controller suggestion tap
|
||||||
|
onSuggestionTap:
|
||||||
|
(agencyCategory) {
|
||||||
|
setState(() {
|
||||||
|
selectedCategory =
|
||||||
|
agencyCategory
|
||||||
|
.item;
|
||||||
|
|
||||||
|
agencyCategoryFocusNode
|
||||||
|
.unfocus();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
searchInputDecoration:
|
||||||
|
normalTextFieldStyle(
|
||||||
|
"Category *",
|
||||||
|
"")
|
||||||
|
.copyWith(
|
||||||
|
suffixIcon:
|
||||||
|
const Icon(
|
||||||
|
Icons
|
||||||
|
.arrow_drop_down)),
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators
|
||||||
|
.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
)
|
||||||
|
: const SizedBox(),
|
||||||
|
),
|
||||||
|
|
||||||
|
////PRVIATE SECTOR
|
||||||
|
SizedBox(
|
||||||
|
child: showIsPrivateRadio
|
||||||
|
? FormBuilderRadioGroup(
|
||||||
|
decoration:
|
||||||
|
InputDecoration(
|
||||||
|
border:
|
||||||
|
InputBorder.none,
|
||||||
|
label: Row(
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Is this private sector? ",
|
||||||
|
style: Theme.of(
|
||||||
|
context)
|
||||||
|
.textTheme
|
||||||
|
.headlineSmall!
|
||||||
|
.copyWith(
|
||||||
|
fontSize:
|
||||||
|
24),
|
||||||
|
),
|
||||||
|
const Icon(FontAwesome
|
||||||
|
.help_circled)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
////onvhange private sector
|
||||||
|
onChanged: (value) {
|
||||||
|
setState(() {
|
||||||
|
if (value
|
||||||
|
.toString() ==
|
||||||
|
"YES") {
|
||||||
|
isPrivate = true;
|
||||||
|
} else {
|
||||||
|
isPrivate = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
name: 'isPrivate',
|
||||||
|
validator:
|
||||||
|
FormBuilderValidators
|
||||||
|
.required(
|
||||||
|
errorText:
|
||||||
|
"This field is required"),
|
||||||
|
options: ["YES", "NO"]
|
||||||
|
.map((lang) =>
|
||||||
|
FormBuilderFieldOption(
|
||||||
|
value:
|
||||||
|
lang))
|
||||||
|
.toList(
|
||||||
|
growable:
|
||||||
|
false),
|
||||||
|
)
|
||||||
|
: const SizedBox()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
const SizedBox(
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 60,
|
||||||
|
width: double.infinity,
|
||||||
|
child: ElevatedButton(
|
||||||
|
style: mainBtnStyle(primary,
|
||||||
|
Colors.transparent, second),
|
||||||
|
onPressed: () {
|
||||||
|
if (_formKey.currentState!
|
||||||
|
.saveAndValidate()) {
|
||||||
|
String title = _formKey
|
||||||
|
.currentState!
|
||||||
|
.value['title'];
|
||||||
|
|
||||||
|
if (selectedAgency
|
||||||
|
?.privateEntity !=
|
||||||
|
null) {
|
||||||
|
newAgency = selectedAgency;
|
||||||
|
} else {
|
||||||
|
newAgency = Agency(
|
||||||
|
id: selectedAgency?.id,
|
||||||
|
name:
|
||||||
|
selectedAgency!.name,
|
||||||
|
category:
|
||||||
|
selectedCategory,
|
||||||
|
privateEntity: isPrivate);
|
||||||
|
}
|
||||||
|
nonAcademicRecognition =
|
||||||
|
NonAcademicRecognition(
|
||||||
|
id: state.nonAcademicRecognition.id,
|
||||||
|
title: title,
|
||||||
|
presenter: newAgency);
|
||||||
|
context
|
||||||
|
.read<
|
||||||
|
NonAcademicRecognitionBloc>()
|
||||||
|
.add(EditNonAcademeRecognition(
|
||||||
|
nonAcademicRecognition:
|
||||||
|
nonAcademicRecognition!,
|
||||||
|
profileId: profileId!,
|
||||||
|
token: token!));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: const Text(submit)),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,278 @@
|
||||||
|
import 'package:app_popup_menu/app_popup_menu.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||||
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||||
|
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||||
|
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/other_information/non_academic/add_modal.dart';
|
||||||
|
import 'package:unit2/screens/profile/components/other_information/non_academic/edit_modal.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||||
|
import 'package:unit2/theme-data.dart/colors.dart';
|
||||||
|
import 'package:unit2/utils/global.dart';
|
||||||
|
import 'package:unit2/utils/text_container.dart';
|
||||||
|
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||||
|
import 'package:unit2/widgets/empty_data.dart';
|
||||||
|
|
||||||
|
import '../../../../bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart';
|
||||||
|
import '../../../../utils/alerts.dart';
|
||||||
|
|
||||||
|
class NonAcademicRecognitionScreen extends StatelessWidget {
|
||||||
|
const NonAcademicRecognitionScreen({
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
int? profileId;
|
||||||
|
String? token;
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text(nonAcademicRecTitle),
|
||||||
|
centerTitle: true,
|
||||||
|
backgroundColor: primary,
|
||||||
|
actions: [
|
||||||
|
AddLeading(onPressed: () {
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add(ShowAddNonAcademeRecognitionForm());
|
||||||
|
})
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: ProgressHUD(
|
||||||
|
padding: const EdgeInsets.all(24),
|
||||||
|
backgroundColor: Colors.black87,
|
||||||
|
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||||
|
child: BlocBuilder<UserBloc, UserState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is UserLoggedIn) {
|
||||||
|
token = state.userData!.user!.login!.token;
|
||||||
|
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||||
|
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is ProfileLoaded) {
|
||||||
|
return BlocConsumer<NonAcademicRecognitionBloc,
|
||||||
|
NonAcademicRecognitionState>(
|
||||||
|
listener: (context, state) {
|
||||||
|
if (state is NonAcademicRecognitionLoadingState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.showWithText("Please wait...");
|
||||||
|
}
|
||||||
|
if (state is NonAcademicRecognitionLoadedState ||
|
||||||
|
state is NonAcademicRecognitionErrorState ||
|
||||||
|
state is AddNonAcademeRecognitionState || state is EditNonAcademeRecognitionState || state is NonAcademeRecognitionEditedState) {
|
||||||
|
final progress = ProgressHUD.of(context);
|
||||||
|
progress!.dismiss();
|
||||||
|
}
|
||||||
|
////ADDED STATE
|
||||||
|
if (state is NonAcademeRecognitionAddedState) {
|
||||||
|
if (state.response['success']) {
|
||||||
|
successAlert(context, "Adding Successfull!",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add(const GetNonAcademicRecognition());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Adding Failed",
|
||||||
|
"Something went wrong. Please try again.",
|
||||||
|
() {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add(const GetNonAcademicRecognition());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////DELETED STATE
|
||||||
|
if (state is NonAcademeRecognitionDeletedState) {
|
||||||
|
if (state.success) {
|
||||||
|
successAlert(context, "Deletion Successfull",
|
||||||
|
"Work has been deleted successfully", () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add(const GetNonAcademicRecognition());
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Deletion Failed",
|
||||||
|
"Error deleting Work History", () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add(const GetNonAcademicRecognition());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
////EDITED STATE
|
||||||
|
if (state is NonAcademeRecognitionEditedState) {
|
||||||
|
if (state.response['success']) {
|
||||||
|
successAlert(context, "Update Successfull",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add( LoadNonAcademeRecognition(nonAcademicRecognitions: state.nonAcademicRecognitions));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
errorAlert(context, "Update Failed",
|
||||||
|
state.response['message'], () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
context
|
||||||
|
.read<NonAcademicRecognitionBloc>()
|
||||||
|
.add(LoadNonAcademeRecognition(nonAcademicRecognitions: state.nonAcademicRecognitions));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
builder: (context, state) {
|
||||||
|
if (state is NonAcademicRecognitionLoadedState) {
|
||||||
|
if (state.nonAcademicRecognition.isNotEmpty) {
|
||||||
|
return ListView.builder(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 8, horizontal: 10),
|
||||||
|
itemCount:
|
||||||
|
state.nonAcademicRecognition.length,
|
||||||
|
itemBuilder:
|
||||||
|
(BuildContext context, int index) {
|
||||||
|
String award = state
|
||||||
|
.nonAcademicRecognition[index].title!;
|
||||||
|
String presenter = state
|
||||||
|
.nonAcademicRecognition[index]
|
||||||
|
.presenter!
|
||||||
|
.name!;
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
width: screenWidth,
|
||||||
|
decoration: box1(),
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12, vertical: 8),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment:
|
||||||
|
MainAxisAlignment.start,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
award,
|
||||||
|
style: Theme.of(context)
|
||||||
|
.textTheme
|
||||||
|
.titleMedium!
|
||||||
|
.copyWith(
|
||||||
|
fontWeight:
|
||||||
|
FontWeight
|
||||||
|
.w500),
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
|
Text(presenter),
|
||||||
|
],
|
||||||
|
)),
|
||||||
|
AppPopupMenu<int>(
|
||||||
|
offset: const Offset(-10, -10),
|
||||||
|
elevation: 3,
|
||||||
|
onSelected: (value) {
|
||||||
|
|
||||||
|
////delete non academic recognition-= = = = = = = = =>>
|
||||||
|
if (value == 1) {
|
||||||
|
confirmAlert(context, () {
|
||||||
|
context
|
||||||
|
.read<
|
||||||
|
NonAcademicRecognitionBloc>()
|
||||||
|
.add(DeleteNonAcademeRecognition(
|
||||||
|
nonAcademicRecognition:
|
||||||
|
state
|
||||||
|
.nonAcademicRecognition[
|
||||||
|
index],
|
||||||
|
profileId:
|
||||||
|
profileId!,
|
||||||
|
nonAcademicRecognitions:
|
||||||
|
state
|
||||||
|
.nonAcademicRecognition,
|
||||||
|
token: token!));
|
||||||
|
}, "Delete?",
|
||||||
|
"Confirm Delete?");
|
||||||
|
}
|
||||||
|
if (value == 2) {
|
||||||
|
context
|
||||||
|
.read<
|
||||||
|
NonAcademicRecognitionBloc>()
|
||||||
|
.add(ShowEditNonAcademicRecognitionForm(
|
||||||
|
nonAcademicRecognition:
|
||||||
|
state.nonAcademicRecognition[
|
||||||
|
index]));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
menuItems: [
|
||||||
|
popMenuItem(
|
||||||
|
text: "Delete",
|
||||||
|
value: 1,
|
||||||
|
icon: Icons.delete),
|
||||||
|
popMenuItem(
|
||||||
|
text: "Edit",
|
||||||
|
value: 2,
|
||||||
|
icon: Icons.delete),
|
||||||
|
],
|
||||||
|
icon: const Icon(
|
||||||
|
Icons.more_vert,
|
||||||
|
color: Colors.grey,
|
||||||
|
),
|
||||||
|
tooltip: "Options",
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 5,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const EmptyData(
|
||||||
|
message:
|
||||||
|
"You don't have any Non Academic Recognition added. Please click + to add");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (state is AddNonAcademeRecognitionState) {
|
||||||
|
return const AddNonAcademicRecognitionScreen();
|
||||||
|
}if(state is EditNonAcademeRecognitionState){
|
||||||
|
return const EditNonAcademicRecognitionScreen();
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Container();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PopupMenuItem<int> popMenuItem({String? text, int? value, IconData? icon}) {
|
||||||
|
return PopupMenuItem(
|
||||||
|
value: value,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
icon,
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
width: 10,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
text!,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue