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/8
feature/passo/PASSO-#1-Sync-data-from-device-to-postgre-and-vice-versa
superadmin 2023-04-11 18:55:38 +08:00
commit 2ef9151258
167 changed files with 17300 additions and 1373 deletions

93
ios/Podfile.lock 100644
View File

@ -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

View File

@ -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;

View File

@ -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>

View File

@ -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>

View File

@ -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()));
}
});
}
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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{
}

View File

@ -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"));
});
}
}

View File

@ -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{
}

View File

@ -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];
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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{
}

View File

@ -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()));
// }
});
}
}

View File

@ -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];
}

View File

@ -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{
}

View File

@ -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()));
// }
});
}
}

View File

@ -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});
}

View File

@ -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});
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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 => [];
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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});
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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{
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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];
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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{
}

View File

@ -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()));
}
});
}
}

View File

@ -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 => [];
}

View File

@ -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 {}

View File

@ -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()));
}
});
}
}

View File

@ -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 => [];
}

View File

@ -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});
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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{
}

View File

@ -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()));
}
});
}
}

View File

@ -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];
}

View File

@ -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];
}

View File

@ -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()));
}
});
}
}

View File

@ -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});
}

View File

@ -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,

View File

@ -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,
};
}

View File

@ -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(),
};
}

View File

@ -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()} }';
}
}

View File

@ -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 ';
}
}

View File

@ -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()})';
}
}

View File

View File

@ -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)';
}
}

View File

@ -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,
};
}

View File

@ -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});
}

View File

@ -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(),
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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()}';
}
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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(),
};
}

View File

@ -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(),
};
}

View File

@ -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,
};
}

View File

@ -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});
}

View File

@ -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(),
};
}

View File

@ -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(),
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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(),
};
}

View File

@ -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;
}
}

View File

@ -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,
};
}

View File

@ -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,
};
}

View File

@ -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();
},
),
));
}
}

View File

@ -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()
,
);
}
}

View File

@ -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();
},
);
}
}

View File

@ -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();
},
);
}
}

View File

@ -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!,
),
],
),
);
}
}

View File

@ -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();
},
));
}
}

View File

@ -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", ""),
),),
]),),
],
)),
));
}
}

View File

@ -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();
},
),
));
}
}

View File

@ -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());
}
}
}

View File

@ -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();
},
);
}
}

View File

@ -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!,
),
],
),
);
}
}

View File

@ -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();
},
);
},
),
),
);
}
}

View File

@ -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();
},
),
));
}
}

View File

@ -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),
],
),
),
),
],
);
}
}

View File

@ -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,
); );
} }
} }

View File

@ -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();
},
);
}
}

View File

@ -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();
},
);
}
}

View File

@ -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