Merge pull request 'feature/unit2/UNIT2-#7-Implement-Profile-API' (#8) from feature/unit2/UNIT2-#7-Implement-Profile-API into develop
Reviewed-on: http://git.agusandelnorte.gov.ph:3000/SoftwareDevelopmentSection/unit2-null-safety-repository/pulls/8feature/passo/PASSO-#1-Sync-data-from-device-to-postgre-and-vice-versa
commit
2ef9151258
|
@ -0,0 +1,93 @@
|
|||
PODS:
|
||||
- barcode_scan2 (0.0.1):
|
||||
- Flutter
|
||||
- MTBBarcodeScanner
|
||||
- SwiftProtobuf
|
||||
- easy_app_installer (0.0.1):
|
||||
- Flutter
|
||||
- Flutter (1.0.0)
|
||||
- fluttertoast (0.0.2):
|
||||
- Flutter
|
||||
- Toast
|
||||
- FMDB (2.7.5):
|
||||
- FMDB/standard (= 2.7.5)
|
||||
- FMDB/standard (2.7.5)
|
||||
- modal_progress_hud_nsn (0.0.1):
|
||||
- Flutter
|
||||
- MTBBarcodeScanner (5.0.11)
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- permission_handler_apple (9.0.4):
|
||||
- Flutter
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- sqflite (0.0.2):
|
||||
- Flutter
|
||||
- FMDB (>= 2.7.5)
|
||||
- SwiftProtobuf (1.20.3)
|
||||
- Toast (4.0.0)
|
||||
|
||||
DEPENDENCIES:
|
||||
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
|
||||
- easy_app_installer (from `.symlinks/plugins/easy_app_installer/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
|
||||
- modal_progress_hud_nsn (from `.symlinks/plugins/modal_progress_hud_nsn/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`)
|
||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- FMDB
|
||||
- MTBBarcodeScanner
|
||||
- SwiftProtobuf
|
||||
- Toast
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
barcode_scan2:
|
||||
:path: ".symlinks/plugins/barcode_scan2/ios"
|
||||
easy_app_installer:
|
||||
:path: ".symlinks/plugins/easy_app_installer/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
fluttertoast:
|
||||
:path: ".symlinks/plugins/fluttertoast/ios"
|
||||
modal_progress_hud_nsn:
|
||||
:path: ".symlinks/plugins/modal_progress_hud_nsn/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/ios"
|
||||
permission_handler_apple:
|
||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||
shared_preferences_foundation:
|
||||
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
|
||||
sqflite:
|
||||
:path: ".symlinks/plugins/sqflite/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
|
||||
easy_app_installer: 29abe397da7d86721fee853281202f414373f45c
|
||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||
fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0
|
||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
modal_progress_hud_nsn: f6fb744cd060653d66ed8f325360ef3650eb2fde
|
||||
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
|
||||
package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e
|
||||
path_provider_foundation: 37748e03f12783f9de2cb2c4eadfaa25fe6d4852
|
||||
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
||||
shared_preferences_foundation: 297b3ebca31b34ec92be11acd7fb0ba932c822ca
|
||||
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||
SwiftProtobuf: b02b5075dcf60c9f5f403000b3b0c202a11b6ae1
|
||||
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
|
||||
|
||||
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
|
||||
|
||||
COCOAPODS: 1.11.3
|
|
@ -3,11 +3,12 @@
|
|||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
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 */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
|
@ -31,7 +32,11 @@
|
|||
/* Begin PBXFileReference section */
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
|
@ -49,12 +54,23 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
28FEB91C01FFFF1F3AF03958 /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase 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 */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -72,6 +88,8 @@
|
|||
9740EEB11CF90186004384FC /* Flutter */,
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
53E3B75A4BA5D03DDDC74903 /* Pods */,
|
||||
B81885F5B040F93E6F30E902 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
|
@ -98,6 +116,14 @@
|
|||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B81885F5B040F93E6F30E902 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2946B4F99A9B9A85D9A4DC4F /* Pods_Runner.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
|
@ -105,12 +131,14 @@
|
|||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
961512EDE7FE1573CFAF92FB /* [CP] Check Pods Manifest.lock */,
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
CC94AAA4981E9E5E5B1BC9E4 /* [CP] Embed Pods Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
|
@ -171,6 +199,7 @@
|
|||
/* Begin PBXShellScriptBuildPhase section */
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
|
@ -183,8 +212,31 @@
|
|||
shellPath = /bin/sh;
|
||||
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 */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
|
@ -197,6 +249,23 @@
|
|||
shellPath = /bin/sh;
|
||||
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 */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
|
@ -288,13 +357,14 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = 2WLSMMLG6W;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.unit2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "uniT-App";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
@ -416,13 +486,14 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = 2WLSMMLG6W;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.unit2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "uniT-App";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
|
@ -438,13 +509,14 @@
|
|||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = 2WLSMMLG6W;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.unit2;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "uniT-App";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
|
|
@ -4,4 +4,7 @@
|
|||
<FileRef
|
||||
location = "group:Runner.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:Pods/Pods.xcodeproj">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
|
@ -24,6 +26,8 @@
|
|||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
|
@ -43,9 +47,5 @@
|
|||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
|
|
@ -1,66 +0,0 @@
|
|||
import 'package:barcode_scan2/barcode_scan2.dart';
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/model/login_data/user_info/user_data.dart';
|
||||
import 'package:unit2/model/login_data/version_info.dart';
|
||||
import 'package:unit2/screens/unit2/login/functions/get_app_version.dart';
|
||||
import 'package:unit2/sevices/login_service/auth_service.dart';
|
||||
|
||||
import '../../utils/scanner.dart';
|
||||
|
||||
part 'user_event.dart';
|
||||
part 'user_state.dart';
|
||||
|
||||
class UserBloc extends Bloc<UserEvent, UserState> {
|
||||
UserData? _userData;
|
||||
VersionInfo? _versionInfo;
|
||||
UserBloc() : super(UserInitial()) {
|
||||
// this event is called when opening the app to check if
|
||||
// there is new app version
|
||||
on<GetApkVersion>((event, emit) async {
|
||||
try {
|
||||
emit(SplashScreen());
|
||||
VersionInfo versionInfo = await AuthService.instance.getVersionInfo();
|
||||
_versionInfo = versionInfo;
|
||||
String apkVersion = await getAppVersion();
|
||||
emit(VersionLoaded(versionInfo: _versionInfo,apkVersion: apkVersion));
|
||||
} catch (e) {
|
||||
emit(UserError(
|
||||
message: e.toString(),
|
||||
));
|
||||
}
|
||||
});
|
||||
on<LoadVersion>((event, emit) {
|
||||
emit(VersionLoaded(versionInfo: _versionInfo));
|
||||
});
|
||||
on<UserLogin>((event, emit) async {
|
||||
try {
|
||||
UserData? userData = await AuthService.instance
|
||||
.webLogin(username: event.username, password: event.password);
|
||||
_userData = userData;
|
||||
emit(UserLoggedIn(userData: _userData));
|
||||
} catch (e) {
|
||||
emit(UserError(message: e.toString()));
|
||||
}
|
||||
});
|
||||
on<UuidLogin>((event, emit) async {
|
||||
try {
|
||||
UserData? userData = await AuthService.instance
|
||||
.qrLogin(uuid: event.uuid, password: event.password);
|
||||
_userData = userData;
|
||||
emit(UserLoggedIn(userData: _userData));
|
||||
} catch (e) {
|
||||
emit(UserError(message: e.toString()));
|
||||
}
|
||||
});
|
||||
on<LoadLoggedInUser>((event, emit) {
|
||||
emit(UserLoggedIn(userData: _userData));
|
||||
});
|
||||
on<GetUuid>((event, emit) async {
|
||||
ScanResult result = await QRCodeBarCodeScanner.instance.scanner();
|
||||
if (result.rawContent.toString().isNotEmpty) {
|
||||
emit(UuidLoaded(uuid: result.rawContent.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/model/profile/educational_background.dart';
|
||||
import 'package:unit2/sevices/profile/education_services.dart';
|
||||
|
||||
part 'education_event.dart';
|
||||
part 'education_state.dart';
|
||||
|
||||
class EducationBloc extends Bloc<EducationEvent, EducationState> {
|
||||
List<EducationalBackground> educationalBackgrounds = [];
|
||||
EducationBloc() : super(EducationInitial()) {
|
||||
on<GetEducationalBackground>((event, emit) async {
|
||||
emit(EducationalBackgroundLoadingState());
|
||||
try {
|
||||
List<EducationalBackground> educations = await EducationService.instace
|
||||
.getEducationalBackground(event.profileId, event.token);
|
||||
educationalBackgrounds = educations;
|
||||
emit(EducationalBackgroundLoadedState(
|
||||
educationalBackground: educationalBackgrounds));
|
||||
} catch (e) {
|
||||
emit(EducationalBackgroundErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
part of 'education_bloc.dart';
|
||||
|
||||
abstract class EducationEvent extends Equatable {
|
||||
const EducationEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
class GetEducationalBackground extends EducationEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetEducationalBackground({required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token];
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
part of 'education_bloc.dart';
|
||||
|
||||
abstract class EducationState extends Equatable {
|
||||
const EducationState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class EducationInitial extends EducationState {}
|
||||
|
||||
|
||||
|
||||
class EducationalBackgroundLoadedState extends EducationState{
|
||||
final List<EducationalBackground> educationalBackground;
|
||||
const EducationalBackgroundLoadedState({required this.educationalBackground});
|
||||
@override
|
||||
List<Object> get props => [educationalBackground];
|
||||
}
|
||||
|
||||
class EducationalBackgroundErrorState extends EducationState{
|
||||
final String message;
|
||||
const EducationalBackgroundErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
class EducationalBackgroundLoadingState extends EducationState{
|
||||
|
||||
}
|
|
@ -0,0 +1,213 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import '../../../model/location/city.dart';
|
||||
import '../../../model/location/country.dart';
|
||||
import '../../../model/location/provinces.dart';
|
||||
import '../../../model/location/region.dart';
|
||||
import '../../../model/profile/eligibility.dart';
|
||||
import '../../../model/utils/eligibility.dart';
|
||||
import '../../../sevices/profile/eligibility_services.dart';
|
||||
import '../../../utils/location_utilities.dart';
|
||||
import '../../../utils/profile_utilities.dart';
|
||||
part 'eligibility_event.dart';
|
||||
part 'eligibility_state.dart';
|
||||
|
||||
class EligibilityBloc extends Bloc<EligibilityEvent, EligibilityState> {
|
||||
EligibilityBloc() : super(EligibilityInitial()) {
|
||||
List<Country>? globalCountries;
|
||||
List<Region>? globalRegions;
|
||||
List<Eligibility> globalEligibilities = [];
|
||||
List<EligibityCert> eligibilities = [];
|
||||
//// LOAD ELIGIBILTY
|
||||
on<LoadEligibility>((event, emit) {
|
||||
emit(EligibilityLoadingState());
|
||||
if (eligibilities.isEmpty) {
|
||||
GetEligibilities(profileId: event.profileId!, token: event.token!);
|
||||
} else {
|
||||
emit(EligibilityLoaded(eligibilities: eligibilities));
|
||||
}
|
||||
});
|
||||
|
||||
//// DELETE
|
||||
on<DeleteEligibility>((event, emit) async {
|
||||
try {
|
||||
final bool success = await EligibilityService.instance.delete(
|
||||
eligibilityId: event.eligibilityId,
|
||||
profileId: int.parse(event.profileId),
|
||||
token: event.token);
|
||||
if (success) {
|
||||
eligibilities.removeWhere(
|
||||
((EligibityCert element) => element.id == event.eligibilityId));
|
||||
emit(DeletedState(
|
||||
success: success,
|
||||
));
|
||||
} else {
|
||||
emit(DeletedState(success: success));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(EligibilityErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
//// GET ELIGIBILITY
|
||||
on<GetEligibilities>((event, emit) async {
|
||||
try {
|
||||
if (eligibilities.isNotEmpty) {
|
||||
emit(EligibilityLoaded(eligibilities: eligibilities));
|
||||
} else {
|
||||
emit(EligibilityLoadingState());
|
||||
eligibilities = await EligibilityService.instance
|
||||
.getEligibilities(event.profileId, event.token);
|
||||
emit(EligibilityLoaded(eligibilities: eligibilities));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(EligibilityErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
//// SHOW EDIT FORM
|
||||
on<ShowEditEligibilityForm>((event, emit) async {
|
||||
try {
|
||||
if (globalCountries == null) {
|
||||
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||
globalCountries = countries;
|
||||
}
|
||||
if (globalRegions == null) {
|
||||
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||
globalRegions = regions;
|
||||
}
|
||||
if (globalEligibilities.isEmpty) {
|
||||
List<Eligibility> eligibilities =
|
||||
await ProfileUtilities.instance.getEligibilities();
|
||||
globalEligibilities = eligibilities;
|
||||
}
|
||||
Eligibility currentEligibility = globalEligibilities.firstWhere(
|
||||
(Eligibility eligibility) =>
|
||||
event.eligibityCert.eligibility!.id == eligibility.id);
|
||||
bool? isOverseas = event.eligibityCert.overseas;
|
||||
Country currentCountry = globalCountries!.firstWhere(
|
||||
(Country country) =>
|
||||
event.eligibityCert.examAddress!.country!.code == country.code);
|
||||
if (event.eligibityCert.examAddress?.cityMunicipality?.province
|
||||
?.region !=
|
||||
null) {
|
||||
Region currrentRegion = globalRegions!.firstWhere((Region region) =>
|
||||
event.eligibityCert.examAddress!.cityMunicipality!.province!
|
||||
.region!.code ==
|
||||
region.code);
|
||||
List<Province> provinces = await LocationUtils.instance
|
||||
.getProvinces(regionCode: currrentRegion.code.toString());
|
||||
Province currentProvince = provinces.firstWhere((Province province) =>
|
||||
event.eligibityCert.examAddress!.cityMunicipality!.province!
|
||||
.code ==
|
||||
province.code);
|
||||
List<CityMunicipality> cities = await LocationUtils.instance
|
||||
.getCities(code: currentProvince.code.toString());
|
||||
CityMunicipality currentCity = cities.firstWhere(
|
||||
(CityMunicipality cityMunicipality) =>
|
||||
event.eligibityCert.examAddress!.cityMunicipality!.code ==
|
||||
cityMunicipality.code);
|
||||
|
||||
emit(EditEligibilityState(
|
||||
currentCity: currentCity,
|
||||
selectedCountry: currentCountry,
|
||||
currentProvince: currentProvince,
|
||||
currentRegion: currrentRegion,
|
||||
currentEligibility: currentEligibility,
|
||||
provinces: provinces,
|
||||
cities: cities,
|
||||
isOverseas: isOverseas!,
|
||||
eligibityCert: event.eligibityCert,
|
||||
countries: globalCountries!,
|
||||
regions: globalRegions!,
|
||||
eligibilities: globalEligibilities));
|
||||
} else {
|
||||
emit(EditEligibilityState(
|
||||
selectedCountry: currentCountry,
|
||||
currentCity: null,
|
||||
currentProvince: null,
|
||||
currentRegion: null,
|
||||
provinces: null,
|
||||
cities: null,
|
||||
currentEligibility: currentEligibility,
|
||||
isOverseas: isOverseas!,
|
||||
eligibityCert: event.eligibityCert,
|
||||
countries: globalCountries!,
|
||||
regions: globalRegions!,
|
||||
eligibilities: globalEligibilities));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(EligibilityErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
//// UPDATE
|
||||
on<UpdateEligibility>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> status = await EligibilityService.instance.update(
|
||||
eligibityCert: event.eligibityCert,
|
||||
token: event.token,
|
||||
profileId: int.parse(event.profileId),
|
||||
oldEligibility: event.oldEligibility);
|
||||
if (status['success']) {
|
||||
EligibityCert newEligibility = EligibityCert.fromJson(status['data']);
|
||||
eligibilities.removeWhere(
|
||||
(EligibityCert element) => element.id == event.eligibityCert.id);
|
||||
eligibilities.add(newEligibility);
|
||||
emit(EligibilityEditedState(response: status));
|
||||
} else {
|
||||
emit(EligibilityEditedState(response: status));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(EligibilityErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
//// SHOW ADD FORM
|
||||
on<ShowAddEligibilityForm>((event, emit) async {
|
||||
emit(EligibilityLoadingState());
|
||||
if (globalRegions == null) {
|
||||
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||
globalRegions = regions;
|
||||
}
|
||||
if (globalEligibilities.isEmpty) {
|
||||
List<Eligibility> eligibilities =
|
||||
await ProfileUtilities.instance.getEligibilities();
|
||||
globalEligibilities = eligibilities;
|
||||
}
|
||||
if (globalCountries == null) {
|
||||
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||
globalCountries = countries;
|
||||
}
|
||||
|
||||
emit(AddEligibilityState(
|
||||
eligibilities: globalEligibilities,
|
||||
regions: globalRegions!,
|
||||
countries: globalCountries!));
|
||||
});
|
||||
|
||||
//// ADD
|
||||
on<AddEligibility>(
|
||||
(event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> status = await EligibilityService.instance.add(
|
||||
eligibityCert: event.eligibityCert,
|
||||
token: event.token,
|
||||
profileId: int.parse(event.profileId));
|
||||
if (status['success']) {
|
||||
EligibityCert? eligibityCert =
|
||||
EligibityCert.fromJson(status['data']);
|
||||
eligibilities.add(eligibityCert);
|
||||
emit(EligibilityAddedState(response: status));
|
||||
} else {
|
||||
emit(EligibilityAddedState(response: status));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(EligibilityErrorState(message: e.toString()));
|
||||
}
|
||||
},
|
||||
);
|
||||
on<CallErrorState>((event, emit) {
|
||||
emit(const EligibilityErrorState(
|
||||
message: "Something went wrong. Please try again"));
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
part of 'eligibility_bloc.dart';
|
||||
|
||||
abstract class EligibilityEvent extends Equatable {
|
||||
const EligibilityEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class ShowAddEligibilityForm extends EligibilityEvent {
|
||||
|
||||
}
|
||||
|
||||
class GetEligibilities extends EligibilityEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetEligibilities({required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token];
|
||||
}
|
||||
|
||||
class AddEligibility extends EligibilityEvent{
|
||||
final EligibityCert eligibityCert;
|
||||
final String profileId;
|
||||
final String token;
|
||||
const AddEligibility({required this.eligibityCert, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [eligibityCert, profileId, token];
|
||||
}
|
||||
class UpdateEligibility extends EligibilityEvent{
|
||||
final EligibityCert eligibityCert;
|
||||
final String profileId;
|
||||
final String token;
|
||||
final int oldEligibility;
|
||||
const UpdateEligibility({required this.eligibityCert, required this.oldEligibility,required this.profileId, required this.token});
|
||||
|
||||
@override
|
||||
List<Object> get props =>[eligibityCert,profileId,token,oldEligibility];
|
||||
}
|
||||
class LoadEligibility extends EligibilityEvent {
|
||||
final int? profileId;
|
||||
final String? token;
|
||||
const LoadEligibility({ this.profileId, this.token});
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class ShowEditEligibilityForm extends EligibilityEvent {
|
||||
final EligibityCert eligibityCert;
|
||||
const ShowEditEligibilityForm({required this.eligibityCert});
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class DeleteEligibility extends EligibilityEvent {
|
||||
final String profileId;
|
||||
final int eligibilityId;
|
||||
final String token;
|
||||
const DeleteEligibility(
|
||||
{
|
||||
required this.eligibilityId,
|
||||
required this.profileId,
|
||||
required this.token});
|
||||
@override
|
||||
List<Object> get props => [ profileId, eligibilityId, token];
|
||||
}
|
||||
|
||||
class CallErrorState extends EligibilityEvent{
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
part of 'eligibility_bloc.dart';
|
||||
|
||||
abstract class EligibilityState extends Equatable {
|
||||
const EligibilityState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class EligibilityInitial extends EligibilityState {}
|
||||
|
||||
|
||||
class EditEligibilityState extends EligibilityState {
|
||||
final EligibityCert eligibityCert;
|
||||
final List<Eligibility> eligibilities;
|
||||
final List<Country> countries;
|
||||
final List<Region> regions;
|
||||
final List<Province>? provinces;
|
||||
final List<CityMunicipality>? cities;
|
||||
final bool isOverseas;
|
||||
final Eligibility currentEligibility;
|
||||
final Region? currentRegion;
|
||||
final Province? currentProvince;
|
||||
final CityMunicipality? currentCity;
|
||||
final Country selectedCountry;
|
||||
const EditEligibilityState({
|
||||
required this.provinces,
|
||||
required this.cities,
|
||||
required this.currentProvince,
|
||||
required this.currentCity,
|
||||
required this.currentRegion,
|
||||
required this.currentEligibility,
|
||||
required this.isOverseas,
|
||||
required this.eligibityCert,
|
||||
required this.eligibilities,
|
||||
required this.countries,
|
||||
required this.regions,
|
||||
required this.selectedCountry,
|
||||
});
|
||||
@override
|
||||
List<Object> get props =>
|
||||
[isOverseas, eligibityCert, eligibilities, regions, countries];
|
||||
}
|
||||
|
||||
class DeletedState extends EligibilityState {
|
||||
final bool success;
|
||||
const DeletedState({required this.success});
|
||||
@override
|
||||
List<Object> get props => [success];
|
||||
}
|
||||
|
||||
class AddEligibilityState extends EligibilityState {
|
||||
final List<Eligibility> eligibilities;
|
||||
final List<Country> countries;
|
||||
final List<Region> regions;
|
||||
const AddEligibilityState({
|
||||
required this.eligibilities,
|
||||
required this.countries,
|
||||
required this.regions,
|
||||
});
|
||||
@override
|
||||
List<Object> get props => [eligibilities,countries,regions];
|
||||
}
|
||||
class EligibilityEditedState extends EligibilityState{
|
||||
final Map<dynamic,dynamic> response;
|
||||
const EligibilityEditedState({required this.response});
|
||||
@override
|
||||
List<Object> get props =>[ response];
|
||||
}
|
||||
|
||||
class EligibilityAddedState extends EligibilityState{
|
||||
final Map<dynamic,dynamic> response;
|
||||
|
||||
const EligibilityAddedState({ required this.response});
|
||||
@override
|
||||
List<Object> get props =>[response];
|
||||
}
|
||||
class EligibilityLoadingState extends EligibilityState{
|
||||
|
||||
}
|
||||
class EligibilityErrorState extends EligibilityState{
|
||||
final String message;
|
||||
const EligibilityErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props =>[message];
|
||||
}
|
||||
|
||||
class EligibilityLoaded extends EligibilityState {
|
||||
final List<EligibityCert> eligibilities;
|
||||
const EligibilityLoaded({required this.eligibilities});
|
||||
@override
|
||||
List<Object> get props => [eligibilities];
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/sevices/profile/family_services.dart';
|
||||
|
||||
import '../../../model/profile/family_backround.dart';
|
||||
|
||||
part 'family_event.dart';
|
||||
part 'family_state.dart';
|
||||
|
||||
class FamilyBloc extends Bloc<FamilyEvent, FamilyState> {
|
||||
FamilyBloc() : super(FamilyInitial()) {
|
||||
List<FamilyBackground> families = [];
|
||||
on<GetFamilies>((event, emit) async{
|
||||
emit(FamilyLoadingState());
|
||||
try{
|
||||
List<FamilyBackground> family = await FamilyService.instance.getFamilies(event.profileId, event.token);
|
||||
families = family;
|
||||
emit(FamilyLoaded(families: families));
|
||||
}catch(e){
|
||||
emit(FamilyErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
part of 'family_bloc.dart';
|
||||
|
||||
abstract class FamilyEvent extends Equatable {
|
||||
const FamilyEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetFamilies extends FamilyEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetFamilies({required this.profileId, required this.token});
|
||||
|
||||
@override
|
||||
List<Object> get props => [profileId,token];
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
part of 'family_bloc.dart';
|
||||
|
||||
abstract class FamilyState extends Equatable {
|
||||
const FamilyState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class FamilyInitial extends FamilyState {}
|
||||
|
||||
class FamilyLoaded extends FamilyState{
|
||||
final List<FamilyBackground> families;
|
||||
const FamilyLoaded({required this.families});
|
||||
|
||||
@override
|
||||
List<Object> get props => [families];
|
||||
}
|
||||
|
||||
class FamilyErrorState extends FamilyState{
|
||||
final String message;
|
||||
const FamilyErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
class FamilyLoadingState extends FamilyState{
|
||||
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/sevices/profile/learningDevelopment_service.dart';
|
||||
|
||||
import '../../../model/profile/learning_development.dart';
|
||||
|
||||
part 'learning_development_event.dart';
|
||||
part 'learning_development_state.dart';
|
||||
|
||||
class LearningDevelopmentBloc
|
||||
extends Bloc<LearningDevelopmentEvent, LearningDevelopmentState> {
|
||||
LearningDevelopmentBloc() : super(LearningDevelopmentInitial()) {
|
||||
List<LearningDevelopement> learningsAndDevelopments;
|
||||
on<GetLearningDevelopments>((event, emit) async {
|
||||
// try {
|
||||
emit(LearningDevelopmentLoadingState());
|
||||
List<LearningDevelopement> learnings = await LearningDevelopmentServices
|
||||
.instance
|
||||
.getLearningDevelopments(event.profileId, event.token);
|
||||
learningsAndDevelopments = learnings;
|
||||
emit(LearningDevelopmentLoadedState(
|
||||
learningsAndDevelopment: learningsAndDevelopments));
|
||||
// } catch (e) {
|
||||
// emit(LeaningDevelopmentErrorState(message: e.toString()));
|
||||
// }
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
part of 'learning_development_bloc.dart';
|
||||
|
||||
abstract class LearningDevelopmentEvent extends Equatable {
|
||||
const LearningDevelopmentEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetLearningDevelopments extends LearningDevelopmentEvent {
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetLearningDevelopments({required this.profileId, required this.token});
|
||||
|
||||
@override
|
||||
List<Object> get props => [profileId, token];
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
part of 'learning_development_bloc.dart';
|
||||
|
||||
abstract class LearningDevelopmentState extends Equatable {
|
||||
const LearningDevelopmentState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class LearningDevelopmentInitial extends LearningDevelopmentState {}
|
||||
|
||||
class LearningDevelopmentLoadedState extends LearningDevelopmentState{
|
||||
final List<LearningDevelopement> learningsAndDevelopment;
|
||||
const LearningDevelopmentLoadedState({required this.learningsAndDevelopment});
|
||||
@override
|
||||
List<Object> get props => [learningsAndDevelopment];
|
||||
}
|
||||
|
||||
class LeaningDevelopmentErrorState extends LearningDevelopmentState{
|
||||
final String message;
|
||||
const LeaningDevelopmentErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
class LearningDevelopmentLoadingState extends LearningDevelopmentState{
|
||||
|
||||
}
|
|
@ -0,0 +1,116 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/sevices/skillshobbies_services.dart';
|
||||
|
||||
import '../../../../model/profile/other_information/skills_and_hobbies.dart';
|
||||
|
||||
part 'hoobies_event.dart';
|
||||
part 'hoobies_state.dart';
|
||||
|
||||
class HoobiesBloc extends Bloc<HobbiesEvent, HobbiesState> {
|
||||
HoobiesBloc() : super(HoobiesInitial()) {
|
||||
List<SkillsHobbies> skillsAndHobbies = [];
|
||||
List<SkillsHobbies> allSkillsAndHobbies = [];
|
||||
List<String> mySkillsAndHobbies = [];
|
||||
on<GetSkillsHobbies>((event, emit) async {
|
||||
emit(HobbiesLoadingState());
|
||||
try {
|
||||
List<SkillsHobbies> hobbies = await SkillsHobbiesServices.instance
|
||||
.getSkillsHobbies(event.profileId, event.token);
|
||||
skillsAndHobbies = hobbies;
|
||||
emit(HobbiesLoadedState(skillsAndHobbies: skillsAndHobbies));
|
||||
} catch (e) {
|
||||
emit(HobbiesErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
on<LoadHobbiesSkills>((event,emit){
|
||||
skillsAndHobbies = event.skillsHobbies;
|
||||
emit(HobbiesLoadedState(skillsAndHobbies: skillsAndHobbies));
|
||||
});
|
||||
////SHOW ADD FORM
|
||||
on<ShowHobbySkillAddForm>((event, emit) async {
|
||||
emit(HobbiesLoadingState());
|
||||
try {
|
||||
////get all skills and hobbies
|
||||
if (allSkillsAndHobbies.isEmpty) {
|
||||
allSkillsAndHobbies =
|
||||
await SkillsHobbiesServices.instance.getAllSkillsHobbies();
|
||||
}
|
||||
for (var element in skillsAndHobbies) {
|
||||
mySkillsAndHobbies.add(element.name!);
|
||||
}
|
||||
allSkillsAndHobbies.sort((a, b) => a.name!.compareTo(b.name!));
|
||||
emit(AddHobbySkillState(
|
||||
mySkillsAndHobbiesString: mySkillsAndHobbies,
|
||||
allSkillsAndHobbies: allSkillsAndHobbies,
|
||||
mySkillsAndHobbiesObject: skillsAndHobbies));
|
||||
} catch (e) {
|
||||
emit(HobbiesErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////GET ADDED SKILLS HOBBIES
|
||||
on<GetAddedHobbiesSkills>((event, emit) {
|
||||
emit(HobbiesLoadingState());
|
||||
List<String> added = event.addedHobbiesSkills.split(",");
|
||||
|
||||
for (var element in added) {
|
||||
if (element.isNotEmpty) {
|
||||
SkillsHobbies newSkillsHobbies =
|
||||
SkillsHobbies(id: null, name: element.toUpperCase());
|
||||
skillsAndHobbies.add(newSkillsHobbies);
|
||||
allSkillsAndHobbies.add(newSkillsHobbies);
|
||||
}
|
||||
}
|
||||
for (var element in skillsAndHobbies) {
|
||||
mySkillsAndHobbies.add(element.name!);
|
||||
}
|
||||
allSkillsAndHobbies.sort((a, b) => a.name!.compareTo(b.name!));
|
||||
emit(AddHobbySkillState(
|
||||
mySkillsAndHobbiesString: mySkillsAndHobbies,
|
||||
allSkillsAndHobbies: allSkillsAndHobbies,
|
||||
mySkillsAndHobbiesObject: skillsAndHobbies));
|
||||
});
|
||||
////SHOW ADD MODAL
|
||||
on<ShowAddModal>((event, emit) {
|
||||
emit(ShowAddModalState());
|
||||
});
|
||||
|
||||
//// ADD
|
||||
on<AddHobbyAndSkills>((event, emit) async {
|
||||
emit(HobbiesLoadingState());
|
||||
Map<dynamic, dynamic> response = await SkillsHobbiesServices.instance.add(
|
||||
skillsHobbies: event.skillsHobbies,
|
||||
profileId: event.profileId,
|
||||
token: event.token);
|
||||
List<SkillsHobbies> newSkillsHobbies = [];
|
||||
if (response['success']) {
|
||||
if (response['data']['skill_hobby'] != null) {
|
||||
for (var element in response['data']['skill_hobby']) {
|
||||
newSkillsHobbies.add(SkillsHobbies.fromJson(element));
|
||||
}
|
||||
}
|
||||
skillsAndHobbies = newSkillsHobbies;
|
||||
emit(HobbiesAndSkillsAddedState(
|
||||
mySkillsAndHobbies: skillsAndHobbies, status: response));
|
||||
} else {
|
||||
emit(HobbiesAndSkillsAddedState(
|
||||
mySkillsAndHobbies: skillsAndHobbies, status: response));
|
||||
}
|
||||
});
|
||||
////DELETE
|
||||
on<DeleteSkillHobbies>((event,emit)async{
|
||||
emit(HobbiesLoadingState());
|
||||
// try{
|
||||
bool success = await SkillsHobbiesServices.instance.delete(profileId: event.profileId, token: event.token, skillsHobbies: event.skillsHobbies);
|
||||
if(success){
|
||||
skillsAndHobbies.removeWhere((element) => element.id == event.skillsHobbies[0].id);
|
||||
emit(HobbiesAndSkillsDeletedState(skillsHobbies: skillsAndHobbies, success: success));
|
||||
}else{
|
||||
emit(HobbiesAndSkillsDeletedState(skillsHobbies: skillsAndHobbies, success: success));
|
||||
}
|
||||
// }catch(e){
|
||||
// emit (HobbiesErrorState(message: e.toString()));
|
||||
// }
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
part of 'hoobies_bloc.dart';
|
||||
|
||||
abstract class HobbiesEvent extends Equatable {
|
||||
const HobbiesEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetSkillsHobbies extends HobbiesEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetSkillsHobbies({required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token];
|
||||
}
|
||||
class ShowHobbySkillAddForm extends HobbiesEvent{
|
||||
|
||||
const ShowHobbySkillAddForm();
|
||||
|
||||
}
|
||||
class AddHobbyAndSkills extends HobbiesEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final List<SkillsHobbies> skillsHobbies;
|
||||
const AddHobbyAndSkills({required this.profileId,required this.token, required this.skillsHobbies});
|
||||
@override
|
||||
List<Object> get props => [profileId,token];
|
||||
}
|
||||
|
||||
class GetAddedHobbiesSkills extends HobbiesEvent{
|
||||
final String addedHobbiesSkills;
|
||||
|
||||
|
||||
const GetAddedHobbiesSkills({required this.addedHobbiesSkills});
|
||||
@override
|
||||
List<Object> get props => [addedHobbiesSkills];
|
||||
}
|
||||
class ShowAddModal extends HobbiesEvent{
|
||||
|
||||
}
|
||||
|
||||
class LoadHobbiesSkills extends HobbiesEvent{
|
||||
final List<SkillsHobbies> skillsHobbies;
|
||||
const LoadHobbiesSkills({required this.skillsHobbies});
|
||||
}
|
||||
class DeleteSkillHobbies extends HobbiesEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final List<SkillsHobbies> skillsHobbies;
|
||||
const DeleteSkillHobbies({required this.profileId, required this.skillsHobbies, required this.token});
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
part of 'hoobies_bloc.dart';
|
||||
|
||||
abstract class HobbiesState extends Equatable {
|
||||
const HobbiesState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class HoobiesInitial extends HobbiesState {}
|
||||
|
||||
class HobbiesLoadedState extends HobbiesState{
|
||||
final List<SkillsHobbies> skillsAndHobbies;
|
||||
const HobbiesLoadedState({required this.skillsAndHobbies});
|
||||
@override
|
||||
List<Object> get props => [skillsAndHobbies];
|
||||
}
|
||||
class HobbiesErrorState extends HobbiesState{
|
||||
final String message;
|
||||
const HobbiesErrorState({required this.message});
|
||||
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
|
||||
}
|
||||
class AddHobbySkillState extends HobbiesState{
|
||||
final List<String> mySkillsAndHobbiesString;
|
||||
final List<SkillsHobbies> allSkillsAndHobbies;
|
||||
final List<SkillsHobbies> mySkillsAndHobbiesObject;
|
||||
|
||||
const AddHobbySkillState({required this.mySkillsAndHobbiesString,required this.allSkillsAndHobbies,required this.mySkillsAndHobbiesObject});
|
||||
@override
|
||||
List<Object> get props => [mySkillsAndHobbiesString,allSkillsAndHobbies,mySkillsAndHobbiesObject];
|
||||
}
|
||||
|
||||
class HobbiesLoadingState extends HobbiesState{
|
||||
|
||||
}
|
||||
|
||||
//// show add modal for adding new skills and hobbies
|
||||
class ShowAddModalState extends HobbiesState{
|
||||
|
||||
}
|
||||
//// hobbies and skills already added
|
||||
class HobbiesAndSkillsAddedState extends HobbiesState{
|
||||
final List<SkillsHobbies> mySkillsAndHobbies;
|
||||
final Map<dynamic,dynamic> status;
|
||||
const HobbiesAndSkillsAddedState({required this.mySkillsAndHobbies, required this.status});
|
||||
@override
|
||||
List<Object> get props => [mySkillsAndHobbies,status];
|
||||
}
|
||||
class HobbiesAndSkillsDeletedState extends HobbiesState{
|
||||
final bool success;
|
||||
final List<SkillsHobbies> skillsHobbies;
|
||||
const HobbiesAndSkillsDeletedState({required this.skillsHobbies,required this.success});
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,170 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/sevices/profile/non_academic_services.dart';
|
||||
|
||||
import '../../../../model/profile/other_information/non_acedimic_recognition.dart';
|
||||
import '../../../../model/utils/agency.dart';
|
||||
import '../../../../model/utils/category.dart';
|
||||
import '../../../../utils/profile_utilities.dart';
|
||||
|
||||
part 'non_academic_recognition_event.dart';
|
||||
part 'non_academic_recognition_state.dart';
|
||||
|
||||
class NonAcademicRecognitionBloc
|
||||
extends Bloc<NonAcademicRecognitionEvent, NonAcademicRecognitionState> {
|
||||
NonAcademicRecognitionBloc() : super(NonAcademicRecognitionInitial()) {
|
||||
List<NonAcademicRecognition> nonAcademicRecognitions = [];
|
||||
List<Agency> agencies = [];
|
||||
List<Category> agencyCategory = [];
|
||||
////GET
|
||||
on<GetNonAcademicRecognition>((event, emit) async {
|
||||
emit(NonAcademicRecognitionLoadingState());
|
||||
try {
|
||||
if (nonAcademicRecognitions.isEmpty) {
|
||||
List<NonAcademicRecognition> recognitions =
|
||||
await NonAcademicRecognitionServices.instance
|
||||
.getNonAcademicRecognition(event.profileId!, event.token!);
|
||||
nonAcademicRecognitions = recognitions;
|
||||
emit(NonAcademicRecognitionLoadedState(
|
||||
nonAcademicRecognition: nonAcademicRecognitions));
|
||||
} else {
|
||||
emit(NonAcademicRecognitionLoadedState(
|
||||
nonAcademicRecognition: nonAcademicRecognitions));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
////LOAD
|
||||
on<LoadNonAcademeRecognition>((event,emit){
|
||||
nonAcademicRecognitions = event.nonAcademicRecognitions;
|
||||
emit(NonAcademicRecognitionLoadedState(nonAcademicRecognition: nonAcademicRecognitions));
|
||||
});
|
||||
////SHOW ADD FORM
|
||||
on<ShowAddNonAcademeRecognitionForm>(
|
||||
(event, emit) async {
|
||||
emit(NonAcademicRecognitionLoadingState());
|
||||
try {
|
||||
if (agencies.isEmpty) {
|
||||
List<Agency> newAgencies =
|
||||
await ProfileUtilities.instance.getAgecies();
|
||||
agencies = newAgencies;
|
||||
}
|
||||
if (agencyCategory.isEmpty) {
|
||||
List<Category> newAgencyCategories =
|
||||
await ProfileUtilities.instance.agencyCategory();
|
||||
agencyCategory = newAgencyCategories;
|
||||
}
|
||||
emit(AddNonAcademeRecognitionState(
|
||||
agencies: agencies, agencyCategories: agencyCategory));
|
||||
} catch (e) {
|
||||
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||
}
|
||||
},
|
||||
);
|
||||
////SHOW EDIT FORM
|
||||
on<ShowEditNonAcademicRecognitionForm>((event, emit) async {
|
||||
emit(NonAcademicRecognitionLoadingState());
|
||||
try {
|
||||
if (agencies.isEmpty) {
|
||||
List<Agency> newAgencies =
|
||||
await ProfileUtilities.instance.getAgecies();
|
||||
agencies = newAgencies;
|
||||
}
|
||||
if (agencyCategory.isEmpty) {
|
||||
List<Category> newAgencyCategories =
|
||||
await ProfileUtilities.instance.agencyCategory();
|
||||
agencyCategory = newAgencyCategories;
|
||||
}
|
||||
emit(EditNonAcademeRecognitionState(
|
||||
agencies: agencies,
|
||||
agencyCategories: agencyCategory,
|
||||
nonAcademicRecognition: event.nonAcademicRecognition));
|
||||
} catch (e) {
|
||||
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////ADD
|
||||
on<AddNonAcademeRecognition>((event, emit) async {
|
||||
emit(NonAcademicRecognitionLoadingState());
|
||||
try {
|
||||
Map<dynamic, dynamic> status =
|
||||
await NonAcademicRecognitionServices.instance.add(
|
||||
token: event.token,
|
||||
profileId: event.profileId,
|
||||
nonAcademicRecognition: event.nonAcademicRecognition);
|
||||
if (status['success']) {
|
||||
NonAcademicRecognition nonAcademicRecognition =
|
||||
NonAcademicRecognition.fromJson(status['data']);
|
||||
nonAcademicRecognitions.add(nonAcademicRecognition);
|
||||
emit(NonAcademeRecognitionAddedState(
|
||||
response: status,
|
||||
nonAcademicRecognition: nonAcademicRecognitions));
|
||||
} else {
|
||||
emit(NonAcademeRecognitionAddedState(
|
||||
response: status,
|
||||
nonAcademicRecognition: nonAcademicRecognitions));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////EDIT
|
||||
on<EditNonAcademeRecognition>((event, emit) async {
|
||||
emit(NonAcademicRecognitionLoadingState());
|
||||
try {
|
||||
Map<dynamic, dynamic> status =
|
||||
await NonAcademicRecognitionServices.instance.update(
|
||||
nonAcademicRecognition: event.nonAcademicRecognition,
|
||||
profileId: event.profileId,
|
||||
token: event.token);
|
||||
if (status['success']) {
|
||||
NonAcademicRecognition newNonAcademeRecognition =
|
||||
NonAcademicRecognition.fromJson(status['data']);
|
||||
nonAcademicRecognitions.removeWhere(
|
||||
(element) => element.id == event.nonAcademicRecognition.id);
|
||||
nonAcademicRecognitions.add(newNonAcademeRecognition);
|
||||
emit(NonAcademeRecognitionEditedState(
|
||||
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||
response: status));
|
||||
}else{
|
||||
emit(NonAcademeRecognitionEditedState(
|
||||
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||
response: status));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
////DELETE
|
||||
on<DeleteNonAcademeRecognition>((event, emit) async {
|
||||
emit(NonAcademicRecognitionLoadingState());
|
||||
try {
|
||||
final bool success = await NonAcademicRecognitionServices.instance
|
||||
.delete(
|
||||
title: event.nonAcademicRecognition.title!,
|
||||
id: event.nonAcademicRecognition.id!,
|
||||
token: event.token,
|
||||
profileId: event.profileId);
|
||||
if (success) {
|
||||
event.nonAcademicRecognitions.removeWhere(
|
||||
(element) => element.id == event.nonAcademicRecognition.id);
|
||||
nonAcademicRecognitions = event.nonAcademicRecognitions;
|
||||
emit(NonAcademeRecognitionDeletedState(
|
||||
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||
success: success));
|
||||
} else {
|
||||
emit(NonAcademeRecognitionDeletedState(
|
||||
nonAcademicRecognitions: nonAcademicRecognitions,
|
||||
success: success));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(NonAcademicRecognitionErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
part of 'non_academic_recognition_bloc.dart';
|
||||
|
||||
abstract class NonAcademicRecognitionEvent extends Equatable {
|
||||
const NonAcademicRecognitionEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
//// GET EVENT
|
||||
class GetNonAcademicRecognition extends NonAcademicRecognitionEvent{
|
||||
final int? profileId;
|
||||
final String? token;
|
||||
const GetNonAcademicRecognition({ this.profileId, this.token});
|
||||
}
|
||||
////LOAD EVENT
|
||||
class LoadNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||
const LoadNonAcademeRecognition({required this.nonAcademicRecognitions});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognitions];
|
||||
}
|
||||
|
||||
////SHOW ADD FORM EVENT
|
||||
class ShowAddNonAcademeRecognitionForm extends NonAcademicRecognitionEvent{
|
||||
|
||||
}
|
||||
|
||||
//// SHOW EDIT FORM
|
||||
class ShowEditNonAcademicRecognitionForm extends NonAcademicRecognitionEvent{
|
||||
final NonAcademicRecognition nonAcademicRecognition;
|
||||
const ShowEditNonAcademicRecognitionForm({required this.nonAcademicRecognition});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognition];
|
||||
}
|
||||
|
||||
//// ADD EVENT
|
||||
class AddNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final NonAcademicRecognition nonAcademicRecognition;
|
||||
const AddNonAcademeRecognition({required this.nonAcademicRecognition, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognition,profileId,token];
|
||||
}
|
||||
|
||||
//// EDIT EVENT
|
||||
class EditNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||
final NonAcademicRecognition nonAcademicRecognition;
|
||||
final String token;
|
||||
final int profileId;
|
||||
const EditNonAcademeRecognition({required this.nonAcademicRecognition, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognition,profileId,token];
|
||||
}
|
||||
|
||||
//// DELETE EVENT
|
||||
class DeleteNonAcademeRecognition extends NonAcademicRecognitionEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||
final NonAcademicRecognition nonAcademicRecognition;
|
||||
const DeleteNonAcademeRecognition({required this.nonAcademicRecognitions, required this.nonAcademicRecognition,required this.profileId,required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,nonAcademicRecognition,nonAcademicRecognitions];
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
part of 'non_academic_recognition_bloc.dart';
|
||||
|
||||
abstract class NonAcademicRecognitionState extends Equatable {
|
||||
const NonAcademicRecognitionState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class NonAcademicRecognitionInitial extends NonAcademicRecognitionState {}
|
||||
|
||||
////LOADING STATE
|
||||
class NonAcademicRecognitionLoadingState extends NonAcademicRecognitionState {}
|
||||
|
||||
////LOADED STATE
|
||||
class NonAcademicRecognitionLoadedState extends NonAcademicRecognitionState {
|
||||
final List<NonAcademicRecognition> nonAcademicRecognition;
|
||||
const NonAcademicRecognitionLoadedState(
|
||||
{required this.nonAcademicRecognition});
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
////DELETED STATE
|
||||
class NonAcademeRecognitionDeletedState extends NonAcademicRecognitionState {
|
||||
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||
final bool success;
|
||||
const NonAcademeRecognitionDeletedState(
|
||||
{required this.nonAcademicRecognitions, required this.success});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognitions, success];
|
||||
}
|
||||
|
||||
class NonAcademeRecognitionEditedState extends NonAcademicRecognitionState{
|
||||
final List<NonAcademicRecognition> nonAcademicRecognitions;
|
||||
final Map<dynamic,dynamic> response;
|
||||
const NonAcademeRecognitionEditedState(
|
||||
{required this.nonAcademicRecognitions, required this.response});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognitions, response];
|
||||
}
|
||||
|
||||
////ADDED STATE
|
||||
class NonAcademeRecognitionAddedState extends NonAcademicRecognitionState {
|
||||
final List<NonAcademicRecognition> nonAcademicRecognition;
|
||||
final Map<dynamic, dynamic> response;
|
||||
const NonAcademeRecognitionAddedState(
|
||||
{required this.nonAcademicRecognition, required this.response});
|
||||
@override
|
||||
List<Object> get props => [nonAcademicRecognition, response];
|
||||
}
|
||||
|
||||
////ADDING STATE
|
||||
class AddNonAcademeRecognitionState extends NonAcademicRecognitionState {
|
||||
final List<Agency> agencies;
|
||||
final List<Category> agencyCategories;
|
||||
const AddNonAcademeRecognitionState(
|
||||
{required this.agencies, required this.agencyCategories});
|
||||
@override
|
||||
List<Object> get props => [agencies, agencyCategories];
|
||||
}
|
||||
|
||||
class EditNonAcademeRecognitionState extends NonAcademicRecognitionState {
|
||||
final List<Agency> agencies;
|
||||
final List<Category> agencyCategories;
|
||||
final NonAcademicRecognition nonAcademicRecognition;
|
||||
const EditNonAcademeRecognitionState({required this.agencies, required this.agencyCategories,required this.nonAcademicRecognition});
|
||||
@override
|
||||
List<Object> get props => [agencies, agencyCategories,nonAcademicRecognition];
|
||||
}
|
||||
|
||||
////ERROR STATE
|
||||
class NonAcademicRecognitionErrorState extends NonAcademicRecognitionState {
|
||||
final String message;
|
||||
const NonAcademicRecognitionErrorState({required this.message});
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/model/utils/agency.dart';
|
||||
import 'package:unit2/model/utils/category.dart';
|
||||
import 'package:unit2/sevices/profile/orgmembership_services.dart';
|
||||
import 'package:unit2/utils/profile_utilities.dart';
|
||||
|
||||
import '../../../../model/profile/other_information/organization_memberships.dart';
|
||||
|
||||
part 'organization_membership_event.dart';
|
||||
part 'organization_membership_state.dart';
|
||||
|
||||
class OrganizationMembershipBloc extends Bloc<OrganizationMembershipEvent, OrganizationMembershipState> {
|
||||
List<Agency> agencies = [];
|
||||
List<Category> agencyCategory = [];
|
||||
OrganizationMembershipBloc() : super(OrganizationMembershipInitial()) {
|
||||
List<OrganizationMembership> organizationMemberships=[];
|
||||
on<GetOrganizationMembership>((event, emit) async{
|
||||
emit(OrgmembershipLoadingState());
|
||||
try{
|
||||
if(organizationMemberships.isEmpty){
|
||||
List<OrganizationMembership> orgs = await OrganizationMembershipServices.instance.getOrgMemberships(event.profileId!, event.token!);
|
||||
organizationMemberships = orgs;
|
||||
}
|
||||
|
||||
emit(OrganizationMembershipLoaded(orgMemberships: organizationMemberships));
|
||||
}catch(e){
|
||||
OrganizationMembershipErrorState(message: e.toString());
|
||||
}
|
||||
});
|
||||
on<LoadOrganizationMemberships>((event,emit){
|
||||
emit(OrganizationMembershipLoaded(orgMemberships: organizationMemberships));
|
||||
});
|
||||
|
||||
////SHOW ADD ORG MEMBERSHIP FORM
|
||||
on<ShowAddOrgMembershipForm>((event,emit)async{
|
||||
emit(OrgmembershipLoadingState());
|
||||
try{
|
||||
if(agencies.isEmpty){
|
||||
List<Agency> newAgencies = await ProfileUtilities.instance.getAgecies();
|
||||
agencies = newAgencies;
|
||||
}
|
||||
if(agencyCategory.isEmpty){
|
||||
List<Category>newAgencyCategories = await ProfileUtilities.instance.agencyCategory();
|
||||
agencyCategory = newAgencyCategories;
|
||||
}
|
||||
emit(AddOrgMembershipState(agencies: agencies, agencyCategories: agencyCategory));
|
||||
}catch(e){
|
||||
emit(OrganizationMembershipErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
//// ADD ORGMEMBERSHIP
|
||||
on<AddOrgMembership>((event,emit)async{
|
||||
try{
|
||||
Map<dynamic,dynamic> status= await OrganizationMembershipServices.instance.add(agency: event.agency, token: event.token, profileId: event.profileId.toString());
|
||||
if(status["success"]){
|
||||
OrganizationMembership organizationMembership = OrganizationMembership.fromJson(status["data"]);
|
||||
organizationMemberships.add(organizationMembership);
|
||||
emit(OrgMembershipAddedState( response: status));
|
||||
}else{
|
||||
emit(OrgMembershipAddedState( response: status));
|
||||
}
|
||||
}catch(e){
|
||||
emit(OrganizationMembershipErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////DELETE ORGMEMBERSHIP
|
||||
on<DeleteOrgMemberShip>((event,emit)async{
|
||||
emit(OrgmembershipLoadingState());
|
||||
try{
|
||||
final bool success = await OrganizationMembershipServices.instance.delete(agency: event.org.agency!, profileId: event.profileId, token: event.token);
|
||||
if(success){
|
||||
organizationMemberships.removeWhere((element) => element.agency!.id == event.org.agency!.id );
|
||||
emit(OrgMembershipDeletedState(success: success));
|
||||
}else{
|
||||
emit(OrgMembershipDeletedState(success: success));
|
||||
}
|
||||
}catch(e){
|
||||
emit(OrganizationMembershipErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
part of 'organization_membership_bloc.dart';
|
||||
|
||||
abstract class OrganizationMembershipEvent extends Equatable {
|
||||
const OrganizationMembershipEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class LoadOrganizationMemberships extends OrganizationMembershipEvent{
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetOrganizationMembership extends OrganizationMembershipEvent{
|
||||
final int? profileId;
|
||||
final String? token;
|
||||
const GetOrganizationMembership({this.profileId, this.token});
|
||||
|
||||
}
|
||||
class ShowAddOrgMembershipForm extends OrganizationMembershipEvent{
|
||||
|
||||
}
|
||||
class AddOrgMembership extends OrganizationMembershipEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final Agency agency;
|
||||
const AddOrgMembership({required this.agency, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,agency];
|
||||
}
|
||||
|
||||
class DeleteOrgMemberShip extends OrganizationMembershipEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final OrganizationMembership org;
|
||||
|
||||
const DeleteOrgMemberShip({required this.profileId, required this.token, required this.org,});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,org];
|
||||
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
part of 'organization_membership_bloc.dart';
|
||||
|
||||
abstract class OrganizationMembershipState extends Equatable {
|
||||
const OrganizationMembershipState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class OrganizationMembershipInitial extends OrganizationMembershipState {}
|
||||
|
||||
class OrganizationMembershipLoaded extends OrganizationMembershipState{
|
||||
final List<OrganizationMembership>orgMemberships;
|
||||
const OrganizationMembershipLoaded({required this.orgMemberships});
|
||||
@override
|
||||
List<Object> get props => [orgMemberships];
|
||||
}
|
||||
|
||||
class OrganizationMembershipErrorState extends OrganizationMembershipState{
|
||||
final String message;
|
||||
const OrganizationMembershipErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
class OrgmembershipLoadingState extends OrganizationMembershipState{
|
||||
|
||||
}
|
||||
class OrgMembershipDeletedState extends OrganizationMembershipState{
|
||||
final bool success;
|
||||
const OrgMembershipDeletedState({ required this.success});
|
||||
@override
|
||||
List<Object> get props => [success];
|
||||
}
|
||||
class OrgMembershipAddedState extends OrganizationMembershipState{
|
||||
final Map<dynamic,dynamic> response;
|
||||
const OrgMembershipAddedState({required this.response});
|
||||
@override
|
||||
List<Object> get props => [response];
|
||||
}
|
||||
|
||||
class AddOrgMembershipState extends OrganizationMembershipState{
|
||||
final List<Agency> agencies;
|
||||
final List<Category> agencyCategories;
|
||||
const AddOrgMembershipState({required this.agencies, required this.agencyCategories});
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
import '../../../../model/profile/basic_information/adress.dart';
|
||||
|
||||
part 'address_event.dart';
|
||||
part 'address_state.dart';
|
||||
|
||||
class AddressBloc extends Bloc<AddressEvent, AddressState> {
|
||||
AddressBloc() : super(AddressInitial()) {
|
||||
List<MainAdress> addresses = [];
|
||||
on<GetAddress>((event, emit) {
|
||||
emit(AddressLoadingState());
|
||||
try{
|
||||
addresses = event.addresses;
|
||||
emit(AddressLoadedState(addresses: addresses));
|
||||
}catch(e){
|
||||
emit(AddressErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
part of 'address_bloc.dart';
|
||||
|
||||
abstract class AddressEvent extends Equatable {
|
||||
const AddressEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetAddress extends AddressEvent{
|
||||
final List<MainAdress> addresses;
|
||||
const GetAddress({required this.addresses});
|
||||
@override
|
||||
List<Object> get props => [addresses];
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
part of 'address_bloc.dart';
|
||||
|
||||
abstract class AddressState extends Equatable {
|
||||
const AddressState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class AddressInitial extends AddressState {}
|
||||
|
||||
class AddressLoadedState extends AddressState{
|
||||
final List<MainAdress> addresses;
|
||||
const AddressLoadedState({required this.addresses});
|
||||
@override
|
||||
List<Object> get props => [addresses];
|
||||
}
|
||||
|
||||
class AddressErrorState extends AddressState{
|
||||
final String message;
|
||||
const AddressErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
class AddressLoadingState extends AddressState{
|
||||
|
||||
}
|
|
@ -0,0 +1,143 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:unit2/sevices/profile/contact_services.dart';
|
||||
import 'package:unit2/utils/profile_utilities.dart';
|
||||
|
||||
import '../../../../model/profile/basic_information/contact_information.dart';
|
||||
|
||||
part 'contact_event.dart';
|
||||
part 'contact_state.dart';
|
||||
|
||||
class ContactBloc extends Bloc<ContactEvent, ContactState> {
|
||||
ContactBloc() : super(ContactInitial()) {
|
||||
List<ContactInfo> contactInformations = [];
|
||||
List<ServiceType> serviceTypes = [];
|
||||
//// get all contacts
|
||||
on<GetContacts>((event, emit) {
|
||||
emit(ContactLoadingState());
|
||||
try {
|
||||
contactInformations = event.contactInformations;
|
||||
emit(ContactLoadedState(contactInformation: contactInformations));
|
||||
} catch (e) {
|
||||
emit(ContactErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
//// Load Contacts
|
||||
on<LoadContacts>((event, emit) {
|
||||
emit(ContactLoadedState(contactInformation: contactInformations));
|
||||
});
|
||||
//// show add form
|
||||
on<ShowAddForm>((event, emit) async {
|
||||
try {
|
||||
emit(ContactLoadingState());
|
||||
if (serviceTypes.isEmpty) {
|
||||
serviceTypes = await ProfileUtilities.instance.getServiceType();
|
||||
}
|
||||
emit(ContactAddingState(serviceTypes: serviceTypes));
|
||||
} catch (e) {
|
||||
emit(ContactErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
///// Show edit form
|
||||
on<ShowEditForm>((event, emit) async {
|
||||
ServiceType serviceType;
|
||||
List<CommService> commServiceProvivers;
|
||||
CommService serviceProvider;
|
||||
try{
|
||||
if (serviceTypes.isEmpty) {
|
||||
serviceTypes = await ProfileUtilities.instance.getServiceType();
|
||||
}
|
||||
serviceType = serviceTypes.firstWhere((ServiceType element) {
|
||||
return element.id == event.contactInfo.commService!.serviceType!.id;
|
||||
});
|
||||
commServiceProvivers = await ContactService.instance
|
||||
.getServiceProvider(serviceTypeId: serviceType.id!);
|
||||
serviceProvider = commServiceProvivers.firstWhere((CommService element) =>
|
||||
element.id == event.contactInfo.commService!.id);
|
||||
emit(ContactEditingState(
|
||||
serviceTypes: serviceTypes,
|
||||
selectedServiceType: serviceType,
|
||||
commServiceProviders: commServiceProvivers,
|
||||
selectedProvider: serviceProvider,
|
||||
contactInfo: event.contactInfo));
|
||||
}catch(e){
|
||||
emit(ContactErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////edit contact
|
||||
on<EditContactInformation>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> responseStatus = await ContactService.instance
|
||||
.update(
|
||||
profileId: event.profileId,
|
||||
token: event.token,
|
||||
contactInfo: event.contactInfo);
|
||||
if (responseStatus['success']) {
|
||||
ContactInfo contactInfo =
|
||||
ContactInfo.fromJson(responseStatus['data']['contact_info']);
|
||||
contactInformations.removeWhere(
|
||||
(ContactInfo element) => element.id == event.contactInfo.id);
|
||||
contactInformations.add(contactInfo);
|
||||
emit(ContactEditedState(
|
||||
|
||||
response: responseStatus));
|
||||
} else {
|
||||
emit(ContactEditedState(
|
||||
|
||||
response: responseStatus));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ContactErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
//// add contact
|
||||
|
||||
on<AddContactInformation>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> responseStatus = await ContactService.instance
|
||||
.add(
|
||||
profileId: event.profileId,
|
||||
token: event.token,
|
||||
contactInfo: event.contactInfo);
|
||||
if (responseStatus['success']) {
|
||||
ContactInfo contactInfo =
|
||||
ContactInfo.fromJson(responseStatus['data']['contact_info']);
|
||||
contactInformations.add(contactInfo);
|
||||
emit(ContactEditedState(
|
||||
|
||||
response: responseStatus));
|
||||
} else {
|
||||
emit(ContactEditedState(
|
||||
|
||||
response: responseStatus));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ContactErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
//// delete contact
|
||||
on<DeleteContactInformation>((event, emit) async {
|
||||
try {
|
||||
final bool success = await ContactService.instance.deleteContact(
|
||||
profileId: event.profileId,
|
||||
token: event.token,
|
||||
contactInfo: event.contactInfo);
|
||||
if (success) {
|
||||
contactInformations
|
||||
.removeWhere((element) => element.id == event.contactInfo.id);
|
||||
emit(ContactDeletedState(
|
||||
succcess: success));
|
||||
} else {
|
||||
emit(ContactDeletedState(
|
||||
succcess: success));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ContactErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
part of 'contact_bloc.dart';
|
||||
|
||||
abstract class ContactEvent extends Equatable {
|
||||
const ContactEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
////get contacts
|
||||
class GetContacts extends ContactEvent{
|
||||
final List<ContactInfo> contactInformations;
|
||||
const GetContacts({required this.contactInformations});
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
//// load contacts
|
||||
class LoadContacts extends ContactEvent{
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
//// show add form
|
||||
class ShowAddForm extends ContactEvent{
|
||||
|
||||
}
|
||||
|
||||
//// show edit form
|
||||
class ShowEditForm extends ContactEvent{
|
||||
final ContactInfo contactInfo;
|
||||
const ShowEditForm({required this.contactInfo});
|
||||
@override
|
||||
List<Object> get props => [contactInfo];
|
||||
|
||||
}
|
||||
|
||||
////add event
|
||||
class AddContactInformation extends ContactEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final ContactInfo contactInfo;
|
||||
const AddContactInformation({required this.contactInfo, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,contactInfo];
|
||||
}
|
||||
|
||||
////edit event
|
||||
class EditContactInformation extends ContactEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final ContactInfo contactInfo;
|
||||
const EditContactInformation({required this.contactInfo, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,contactInfo];
|
||||
}
|
||||
|
||||
//// delete event
|
||||
|
||||
class DeleteContactInformation extends ContactEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
final ContactInfo contactInfo;
|
||||
const DeleteContactInformation({required this.contactInfo, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,contactInfo];
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
part of 'contact_bloc.dart';
|
||||
|
||||
abstract class ContactState extends Equatable {
|
||||
const ContactState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class ContactInitial extends ContactState {}
|
||||
|
||||
////loaded state
|
||||
class ContactLoadedState extends ContactState{
|
||||
final List<ContactInfo> contactInformation;
|
||||
const ContactLoadedState({required this.contactInformation});
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
////loading state
|
||||
class ContactLoadingState extends ContactState{
|
||||
|
||||
}
|
||||
//// adding state
|
||||
class ContactAddingState extends ContactState{
|
||||
final List<ServiceType> serviceTypes;
|
||||
const ContactAddingState({ required this.serviceTypes});
|
||||
@override
|
||||
List<Object> get props => [serviceTypes];
|
||||
}
|
||||
//// Editing state
|
||||
class ContactEditingState extends ContactState{
|
||||
final List<ServiceType> serviceTypes;
|
||||
final List<CommService> commServiceProviders;
|
||||
final CommService selectedProvider;
|
||||
final ServiceType selectedServiceType;
|
||||
final ContactInfo contactInfo;
|
||||
const ContactEditingState({ required this.serviceTypes, required this.selectedServiceType, required this.selectedProvider, required this.commServiceProviders, required this.contactInfo});
|
||||
@override
|
||||
List<Object> get props => [serviceTypes];
|
||||
}
|
||||
|
||||
|
||||
//// added state
|
||||
class ContactAddedState extends ContactState{
|
||||
|
||||
final Map<dynamic,dynamic> response;
|
||||
const ContactAddedState({ required this.response});
|
||||
@override
|
||||
List<Object> get props => [response];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//// edited state
|
||||
class ContactEditedState extends ContactState{
|
||||
|
||||
final Map<dynamic,dynamic> response;
|
||||
const ContactEditedState({ required this.response});
|
||||
@override
|
||||
List<Object> get props => [response];
|
||||
}
|
||||
////deleted state
|
||||
class ContactDeletedState extends ContactState{
|
||||
|
||||
final bool succcess;
|
||||
const ContactDeletedState({required this.succcess});
|
||||
@override
|
||||
List<Object> get props => [succcess];
|
||||
}
|
||||
|
||||
////error state
|
||||
class ContactErrorState extends ContactState{
|
||||
final String message;
|
||||
const ContactErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
import '../../../../model/profile/basic_information/identification_information.dart';
|
||||
|
||||
part 'identification_event.dart';
|
||||
part 'identification_state.dart';
|
||||
|
||||
class IdentificationBloc extends Bloc<IdentificationEvent, IdentificationState> {
|
||||
IdentificationBloc() : super(IdentificationInitial()) {
|
||||
List<Identification> identificationInformations = [];
|
||||
on<GetIdentifications>((event, emit) {
|
||||
try{
|
||||
identificationInformations = event.identificationInformation;
|
||||
emit(IdentificationLoadedState(identificationInformation: identificationInformations));
|
||||
}catch(e){
|
||||
emit(IdenficationErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
part of 'identification_bloc.dart';
|
||||
|
||||
abstract class IdentificationEvent extends Equatable {
|
||||
const IdentificationEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetIdentifications extends IdentificationEvent{
|
||||
final List<Identification> identificationInformation;
|
||||
const GetIdentifications({required this.identificationInformation});
|
||||
@override
|
||||
List<Object> get props => [identificationInformation];
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
part of 'identification_bloc.dart';
|
||||
|
||||
abstract class IdentificationState extends Equatable {
|
||||
const IdentificationState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class IdentificationInitial extends IdentificationState {}
|
||||
|
||||
class IdentificationLoadedState extends IdentificationState{
|
||||
final List<Identification> identificationInformation;
|
||||
const IdentificationLoadedState({required this.identificationInformation});
|
||||
@override
|
||||
List<Object> get props => [identificationInformation];
|
||||
}
|
||||
|
||||
class IdenficationErrorState extends IdentificationState{
|
||||
final String message;
|
||||
const IdenficationErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
class IdentificationLoadingState extends IdentificationState{
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/model/profile/profileInfomation.dart';
|
||||
import 'package:unit2/sevices/profile/profile_service.dart';
|
||||
part 'profile_event.dart';
|
||||
part 'profile_state.dart';
|
||||
|
||||
class ProfileBloc extends Bloc<ProfileEvent, ProfileState> {
|
||||
ProfileBloc() : super(ProfileInitial()) {
|
||||
ProfileInformation? globalProfileInformation;
|
||||
on<LoadProfile>((event, emit) async {
|
||||
emit(ProfileLoading());
|
||||
try {
|
||||
|
||||
ProfileInformation? profileInformation =
|
||||
await ProfileService.instance.getProfile(event.token, event.userID);
|
||||
globalProfileInformation = profileInformation;
|
||||
emit(ProfileLoaded(profileInformation: globalProfileInformation!));
|
||||
} catch (e) {
|
||||
emit(ProfileErrorState(mesage: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
part of 'profile_bloc.dart';
|
||||
|
||||
abstract class ProfileEvent extends Equatable {
|
||||
const ProfileEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class LoadProfile extends ProfileEvent {
|
||||
final String token;
|
||||
final int userID;
|
||||
const LoadProfile({required this.token, required this.userID});
|
||||
@override
|
||||
List<Object> get props => [token, userID];
|
||||
}
|
||||
|
||||
class LoadProfileInformation extends ProfileEvent {
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
part of 'profile_bloc.dart';
|
||||
|
||||
abstract class ProfileState extends Equatable {
|
||||
const ProfileState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class ProfileInitial extends ProfileState {}
|
||||
|
||||
class ProfileLoaded extends ProfileState {
|
||||
final ProfileInformation profileInformation;
|
||||
const ProfileLoaded({required this.profileInformation});
|
||||
@override
|
||||
List<Object> get props => [profileInformation];
|
||||
}
|
||||
|
||||
class ProfileErrorState extends ProfileState {
|
||||
final String mesage;
|
||||
const ProfileErrorState({required this.mesage});
|
||||
@override
|
||||
List<Object> get props => [mesage];
|
||||
}
|
||||
|
||||
class ProfileLoading extends ProfileState {}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,210 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/model/location/address_category.dart';
|
||||
import 'package:unit2/model/location/barangay.dart';
|
||||
import 'package:unit2/model/location/city.dart';
|
||||
import 'package:unit2/model/location/country.dart';
|
||||
import 'package:unit2/model/location/region.dart';
|
||||
import 'package:unit2/sevices/profile/references_services.dart';
|
||||
import '../../../model/location/provinces.dart';
|
||||
import '../../../model/profile/references.dart';
|
||||
import '../../../utils/location_utilities.dart';
|
||||
|
||||
part 'references_event.dart';
|
||||
part 'references_state.dart';
|
||||
|
||||
class ReferencesBloc extends Bloc<ReferencesEvent, ReferencesState> {
|
||||
List<PersonalReference> references = [];
|
||||
List<Country> globalCountries = [];
|
||||
List<Region> globalRegions = [];
|
||||
List<AddressCategory> globalCategories = [];
|
||||
|
||||
ReferencesBloc() : super(ReferencesInitial()) {
|
||||
on<GetReferences>((event, emit) async {
|
||||
emit(ReferencesLoadingState());
|
||||
try {
|
||||
if(references.isEmpty){
|
||||
List<PersonalReference> refs = await ReferencesServices.instace
|
||||
.getRefences(event.profileId, event.token);
|
||||
references = refs;
|
||||
emit(ReferencesLoadedState(references: references));
|
||||
}else{
|
||||
emit(ReferencesLoadedState(references: references));
|
||||
}
|
||||
} catch (e) {
|
||||
ReferencesErrorState(message: e.toString());
|
||||
}
|
||||
////SHOW FORM FOR ADDING REFERENCES
|
||||
});
|
||||
on<ShowAddReferenceForm>((event, emit) async {
|
||||
emit(ReferencesLoadingState());
|
||||
try {
|
||||
if (globalRegions.isEmpty) {
|
||||
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||
globalRegions = regions;
|
||||
}
|
||||
if (globalCountries.isEmpty) {
|
||||
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||
globalCountries = countries;
|
||||
}
|
||||
if (globalCategories.isEmpty) {
|
||||
List<AddressCategory> categories =
|
||||
await LocationUtils.instance.getAddressCategory();
|
||||
globalCategories = categories;
|
||||
}
|
||||
emit(AddReferenceState(
|
||||
countries: globalCountries,
|
||||
regions: globalRegions,
|
||||
categories: globalCategories));
|
||||
} catch (e) {
|
||||
emit(ReferencesErrorState(message: e.toString()));
|
||||
}
|
||||
////SHOW EDIT FORM
|
||||
});
|
||||
on<ShowEditReferenceForm>((event, emit) async {
|
||||
Region? selectedRegion;
|
||||
Province? selectedProvince;
|
||||
CityMunicipality? selectedCity;
|
||||
AddressCategory? selectedCategory;
|
||||
Country selectedCountry;
|
||||
Barangay? selectedBarangay;
|
||||
try {
|
||||
if (globalRegions.isEmpty) {
|
||||
List<Region> regions = await LocationUtils.instance.getRegions();
|
||||
globalRegions = regions;
|
||||
}
|
||||
if (globalCountries.isEmpty) {
|
||||
List<Country> countries = await LocationUtils.instance.getCountries();
|
||||
globalCountries = countries;
|
||||
}
|
||||
if (globalCategories.isEmpty) {
|
||||
List<AddressCategory> categories =
|
||||
await LocationUtils.instance.getAddressCategory();
|
||||
globalCategories = categories;
|
||||
}
|
||||
//// checck if address is overseas
|
||||
bool overseas =
|
||||
event.personalReference.address!.country!.id! != 175 ? true : false;
|
||||
selectedCategory = globalCategories.firstWhere((AddressCategory element) => event.personalReference.address!.addressCategory!.id == element.id);
|
||||
////if address is not overseas set initial values for address
|
||||
if (!overseas) {
|
||||
selectedRegion = globalRegions.firstWhere((Region element) =>
|
||||
event.personalReference.address!.cityMunicipality!.province!
|
||||
.region!.code ==
|
||||
element.code);
|
||||
List<Province> provinces = await LocationUtils.instance
|
||||
.getProvinces(regionCode: selectedRegion.code.toString());
|
||||
selectedProvince = provinces.firstWhere((Province province) =>
|
||||
event.personalReference.address!.cityMunicipality!.province!
|
||||
.code ==
|
||||
province.code);
|
||||
List<CityMunicipality> cities = await LocationUtils.instance
|
||||
.getCities(code: selectedProvince.code!);
|
||||
selectedCity = cities.firstWhere((CityMunicipality city) =>
|
||||
event.personalReference.address!.cityMunicipality!.code ==
|
||||
city.code);
|
||||
List<Barangay> barangays = await LocationUtils.instance.getBarangay(code: selectedCity.code.toString());
|
||||
if(event.personalReference.address?.barangay!=null){
|
||||
selectedBarangay = barangays.firstWhere((Barangay barangay)=>event.personalReference.address?.barangay?.code == barangay.code);
|
||||
}else{
|
||||
selectedBarangay = null;
|
||||
}
|
||||
emit(EditReferenceState(
|
||||
selectedRegion: selectedRegion,
|
||||
ref: event.personalReference,
|
||||
countries: globalCountries,
|
||||
regions: globalRegions,
|
||||
barangays: barangays,
|
||||
categories: globalCategories,
|
||||
isOverseas: overseas,
|
||||
provinces: provinces,
|
||||
selectedProvince: selectedProvince,
|
||||
cities: cities,
|
||||
selectedCity: selectedCity,
|
||||
selectedCategory: selectedCategory,
|
||||
selectedBarangay: selectedBarangay
|
||||
));
|
||||
} else {
|
||||
//// if address is overseas set initial value for country
|
||||
selectedCountry = globalCountries.firstWhere((Country element) => event.personalReference.address!.country!.id == element.id);
|
||||
emit(EditReferenceState(
|
||||
selectedCountry: selectedCountry,
|
||||
selectedCategory: selectedCategory,
|
||||
selectedRegion: null,
|
||||
ref: event.personalReference,
|
||||
countries: globalCountries,
|
||||
regions: globalRegions,
|
||||
categories: globalCategories,
|
||||
isOverseas: overseas));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ReferencesErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
//// CALL THE ERROR STATE EVEN T
|
||||
on<CallErrorState>((event, emit) async {
|
||||
emit(const ReferencesErrorState(
|
||||
message: "Something went wrong. Please try again"));
|
||||
//// EDIT REFERENCES EVENT
|
||||
});on<EditReference>((event,emit)async{
|
||||
Map<dynamic,dynamic> status =await ReferencesServices.instace.update(ref: event.reference, token: event.token, profileId: event.profileId);
|
||||
if (status['success']) {
|
||||
PersonalReference ref = PersonalReference.fromJson(status['data']);
|
||||
references.removeWhere((PersonalReference element)=>element.id == event.reference.id);
|
||||
references.add(ref);
|
||||
emit(
|
||||
ReferenceEditedState( response: status));
|
||||
} else {
|
||||
emit(
|
||||
ReferenceEditedState( response: status));
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
//// add reference event
|
||||
on<AddReference>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> status = await ReferencesServices.instace
|
||||
.addReference(
|
||||
ref: event.reference,
|
||||
token: event.token,
|
||||
profileId: event.profileId);
|
||||
if (status['success']) {
|
||||
PersonalReference ref = PersonalReference.fromJson(status['data']);
|
||||
references.add(ref);
|
||||
emit(
|
||||
ReferencesAddedState( response: status));
|
||||
} else {
|
||||
emit(
|
||||
ReferencesAddedState( response: status));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ReferencesErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////LOAD REFERENCE
|
||||
on<LoadReferences>((event, emit) {
|
||||
emit(ReferencesLoadingState());
|
||||
emit(ReferencesLoadedState(references: references));
|
||||
|
||||
});
|
||||
////DELETE REFERENCE
|
||||
on<DeleteReference>((event, emit) async {
|
||||
try {
|
||||
final bool success = await ReferencesServices.instace.delete(
|
||||
profileId: event.profileId, token: event.token, id: event.refId);
|
||||
if (success) {
|
||||
event.references.removeWhere(
|
||||
(PersonalReference element) => element.id == event.refId);
|
||||
references = event.references;
|
||||
emit(DeleteReferenceState( success: success));
|
||||
} else {
|
||||
emit(DeleteReferenceState(success: success));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(ReferencesErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
part of 'references_bloc.dart';
|
||||
|
||||
abstract class ReferencesEvent extends Equatable {
|
||||
const ReferencesEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetReferences extends ReferencesEvent {
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetReferences({required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId, token];
|
||||
}
|
||||
|
||||
class ShowAddReferenceForm extends ReferencesEvent {}
|
||||
|
||||
class ShowEditReferenceForm extends ReferencesEvent {
|
||||
final PersonalReference personalReference;
|
||||
const ShowEditReferenceForm({required this.personalReference});
|
||||
@override
|
||||
List<Object> get props => [personalReference];
|
||||
}
|
||||
|
||||
class CallErrorState extends ReferencesEvent {}
|
||||
|
||||
class AddReference extends ReferencesEvent {
|
||||
final PersonalReference reference;
|
||||
final String token;
|
||||
final int profileId;
|
||||
const AddReference(
|
||||
{required this.profileId, required this.reference, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId, token, reference];
|
||||
}
|
||||
|
||||
class EditReference extends ReferencesEvent {
|
||||
final PersonalReference reference;
|
||||
final String token;
|
||||
final int profileId;
|
||||
const EditReference(
|
||||
{required this.profileId, required this.reference, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId, token, reference];
|
||||
}
|
||||
|
||||
class DeleteReference extends ReferencesEvent {
|
||||
final List<PersonalReference> references;
|
||||
final int profileId;
|
||||
final String token;
|
||||
final int refId;
|
||||
const DeleteReference(
|
||||
{required this.profileId,
|
||||
required this.refId,
|
||||
required this.references,
|
||||
required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId, token, refId, references];
|
||||
}
|
||||
|
||||
class LoadReferences extends ReferencesEvent {
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
part of 'references_bloc.dart';
|
||||
|
||||
abstract class ReferencesState extends Equatable {
|
||||
const ReferencesState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class ReferencesInitial extends ReferencesState {}
|
||||
|
||||
class ReferencesLoadedState extends ReferencesState {
|
||||
final List<PersonalReference> references;
|
||||
const ReferencesLoadedState({required this.references});
|
||||
|
||||
@override
|
||||
List<Object> get props => [references];
|
||||
}
|
||||
|
||||
class ReferencesErrorState extends ReferencesState {
|
||||
final String message;
|
||||
const ReferencesErrorState({required this.message});
|
||||
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
class ReferencesLoadingState extends ReferencesState {}
|
||||
|
||||
class ReferencesAddedState extends ReferencesState {
|
||||
final Map<dynamic, dynamic> response;
|
||||
const ReferencesAddedState(
|
||||
{ required this.response});
|
||||
@override
|
||||
List<Object> get props => [ response];
|
||||
}
|
||||
class ReferenceEditedState extends ReferencesState {
|
||||
|
||||
final Map<dynamic, dynamic> response;
|
||||
const ReferenceEditedState(
|
||||
{ required this.response});
|
||||
@override
|
||||
List<Object> get props => [ response];
|
||||
}
|
||||
|
||||
class EditReferenceState extends ReferencesState {
|
||||
final List<Region> regions;
|
||||
final List<Country> countries;
|
||||
final List<AddressCategory> categories;
|
||||
final List<Province>? provinces;
|
||||
final List<CityMunicipality>? cities;
|
||||
final List<Barangay>? barangays;
|
||||
final PersonalReference ref;
|
||||
final bool isOverseas;
|
||||
final Region? selectedRegion;
|
||||
final Province? selectedProvince;
|
||||
final CityMunicipality? selectedCity;
|
||||
final AddressCategory selectedCategory;
|
||||
final Barangay? selectedBarangay;
|
||||
final Country? selectedCountry;
|
||||
const EditReferenceState(
|
||||
{ this.barangays,
|
||||
this.selectedBarangay,
|
||||
required this.selectedCategory,
|
||||
this.cities,
|
||||
this.selectedCity,
|
||||
this.provinces,
|
||||
this.selectedProvince,
|
||||
this.selectedRegion,
|
||||
this.selectedCountry,
|
||||
required this.isOverseas,
|
||||
required this.ref,
|
||||
required this.categories,
|
||||
required this.countries,
|
||||
required this.regions});
|
||||
@override
|
||||
List<Object> get props => [regions, countries, categories, isOverseas];
|
||||
}
|
||||
|
||||
class AddReferenceState extends ReferencesState {
|
||||
final List<Region> regions;
|
||||
final List<Country> countries;
|
||||
final List<AddressCategory> categories;
|
||||
const AddReferenceState(
|
||||
{required this.categories,
|
||||
required this.countries,
|
||||
required this.regions});
|
||||
}
|
||||
|
||||
class DeleteReferenceState extends ReferencesState {
|
||||
final bool success;
|
||||
const DeleteReferenceState({ required this.success});
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/sevices/profile/volunatary_services.dart';
|
||||
|
||||
import '../../../model/profile/voluntary_works.dart';
|
||||
|
||||
part 'voluntary_work_event.dart';
|
||||
part 'voluntary_work_state.dart';
|
||||
|
||||
class VoluntaryWorkBloc extends Bloc<VoluntaryWorkEvent, VoluntaryWorkState> {
|
||||
VoluntaryWorkBloc() : super(VoluntaryWorkInitial()) {
|
||||
List<VoluntaryWork> voluntaryWorks = [];
|
||||
on<GetVoluntarWorks>((event, emit) async{
|
||||
emit(VoluntaryWorkLoadingState());
|
||||
try{
|
||||
List<VoluntaryWork> works = await VoluntaryService.instance.getVoluntaryWorks(event.profileId, event.token);
|
||||
voluntaryWorks = works;
|
||||
emit(VoluntaryWorkLoadedState(voluntaryWorks: voluntaryWorks));
|
||||
}catch(e){
|
||||
emit(VoluntaryWorkErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
part of 'voluntary_work_bloc.dart';
|
||||
|
||||
abstract class VoluntaryWorkEvent extends Equatable {
|
||||
const VoluntaryWorkEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetVoluntarWorks extends VoluntaryWorkEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetVoluntarWorks({required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [profileId,token];
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
part of 'voluntary_work_bloc.dart';
|
||||
|
||||
abstract class VoluntaryWorkState extends Equatable {
|
||||
const VoluntaryWorkState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class VoluntaryWorkInitial extends VoluntaryWorkState {}
|
||||
class VoluntaryWorkLoadedState extends VoluntaryWorkState{
|
||||
final List<VoluntaryWork> voluntaryWorks;
|
||||
const VoluntaryWorkLoadedState({required this.voluntaryWorks});
|
||||
@override
|
||||
List<Object> get props => [voluntaryWorks];
|
||||
}
|
||||
|
||||
class VoluntaryWorkErrorState extends VoluntaryWorkState{
|
||||
final String message;
|
||||
const VoluntaryWorkErrorState({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
class VoluntaryWorkLoadingState extends VoluntaryWorkState{
|
||||
|
||||
}
|
|
@ -0,0 +1,187 @@
|
|||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:unit2/bloc/profile/eligibility/eligibility_bloc.dart';
|
||||
import 'package:unit2/model/profile/work_history.dart';
|
||||
import 'package:unit2/model/utils/agency.dart';
|
||||
import 'package:unit2/model/utils/agency_position.dart';
|
||||
import 'package:unit2/model/utils/position.dart';
|
||||
import 'package:unit2/sevices/profile/work_history_services.dart';
|
||||
import 'package:unit2/utils/profile_utilities.dart';
|
||||
|
||||
import '../../../model/utils/category.dart';
|
||||
|
||||
part 'workHistory_event.dart';
|
||||
part 'workHistory_state.dart';
|
||||
|
||||
class WorkHistoryBloc extends Bloc<WorkHistorytEvent, WorkHistoryState> {
|
||||
List<WorkHistory> workExperiences = [];
|
||||
List<Position> agencyPositions = [];
|
||||
List<Agency> agencies = [];
|
||||
List<AppoinemtStatus> appointmentStatus = [];
|
||||
List<Category> agencyCategory = [];
|
||||
WorkHistoryBloc() : super(EducationInitial()) {
|
||||
////GET WORK HISTORIES
|
||||
on<GetWorkHistories>((event, emit) async {
|
||||
emit(WorkHistoryLoadingState());
|
||||
try {
|
||||
if (workExperiences.isEmpty) {
|
||||
List<WorkHistory> works = await WorkHistoryService.instance
|
||||
.getWorkExperiences(event.profileId!, event.token!);
|
||||
workExperiences = works;
|
||||
}
|
||||
|
||||
emit(WorkHistoryLoaded(workExperiences: workExperiences));
|
||||
} catch (e) {
|
||||
emit(WorkHistoryErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
///// LOAD WORK HISTORIES
|
||||
on<LoadWorkHistories>((event, emit) {
|
||||
emit(WorkHistoryLoadingState());
|
||||
emit(WorkHistoryLoaded(workExperiences: workExperiences));
|
||||
});
|
||||
////DELETE
|
||||
on<DeleteWorkHistory>((event, emit) async {
|
||||
try {
|
||||
final bool success = await WorkHistoryService.instance.delete(
|
||||
profileId: event.profileId,
|
||||
token: event.token,
|
||||
work: event.workHistory);
|
||||
if (success) {
|
||||
workExperiences.removeWhere(
|
||||
(WorkHistory element) => element.id == event.workHistory.id);
|
||||
emit(DeletedState(success: success));
|
||||
} else {
|
||||
emit(DeletedState(success: success));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(WorkHistoryErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
//// ADD WORK HISTORIES
|
||||
on<AddWorkHostory>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> status = await WorkHistoryService.instance.add(
|
||||
isPrivate: event.isPrivate,
|
||||
workHistory: event.workHistory,
|
||||
token: event.token,
|
||||
profileId: event.profileId);
|
||||
if (status['success']) {
|
||||
WorkHistory workHistory = WorkHistory.fromJson(status['data']);
|
||||
workExperiences.add(workHistory);
|
||||
emit(WorkHistoryAddedState(response: status));
|
||||
} else {
|
||||
emit(WorkHistoryAddedState(response: status));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(WorkHistoryErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
////UPDATE WORK HISTORY
|
||||
on<UpdateWorkHistory>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> status = await WorkHistoryService.instance.update(
|
||||
oldWorkHistory: event.oldWorkHistory,
|
||||
newWorkHistory: event.workHistory,
|
||||
token: event.token,
|
||||
profileId: event.profileId);
|
||||
if (status['success']) {
|
||||
WorkHistory workHistory = WorkHistory.fromJson(status['data']);
|
||||
workExperiences.removeWhere((WorkHistory work) {
|
||||
return work.id == event.oldWorkHistory.id;
|
||||
});
|
||||
workExperiences.add(workHistory);
|
||||
emit(WorkHistoryEditedState(response: status));
|
||||
} else {
|
||||
emit(WorkHistoryEditedState(
|
||||
response: status,
|
||||
));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(WorkHistoryErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
|
||||
////SHOW EDIT WORK HISTORIES
|
||||
on<ShowEditWorkHistoryForm>((event, emit) async {
|
||||
try {
|
||||
/////POSITIONS------------------------------------------
|
||||
if (agencyPositions.isEmpty) {
|
||||
List<Position> positions =
|
||||
await WorkHistoryService.instance.getAgencyPosition();
|
||||
agencyPositions = positions;
|
||||
}
|
||||
|
||||
/////AGENCIES------------------------------------------
|
||||
if (agencies.isEmpty) {
|
||||
List<Agency> newAgencies =
|
||||
await ProfileUtilities.instance.getAgecies();
|
||||
agencies = newAgencies;
|
||||
}
|
||||
|
||||
/////Category Agency------------------------------------------
|
||||
if (agencyCategory.isEmpty) {
|
||||
List<Category> categoryAgencies =
|
||||
await ProfileUtilities.instance.agencyCategory();
|
||||
agencyCategory = categoryAgencies;
|
||||
}
|
||||
/////////-------------------------------------
|
||||
if (appointmentStatus.isEmpty) {
|
||||
List<AppoinemtStatus> status =
|
||||
WorkHistoryService.instance.getAppointmentStatusList();
|
||||
appointmentStatus = status;
|
||||
}
|
||||
|
||||
emit(EditWorkHistoryState(
|
||||
workHistory: event.workHistory,
|
||||
agencyPositions: agencyPositions,
|
||||
appointmentStatus: appointmentStatus,
|
||||
agencyCategory: agencyCategory,
|
||||
agencies: agencies));
|
||||
} catch (e) {
|
||||
emit(WorkHistoryErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
////SHOW ADD FORM WORK HISTORIES
|
||||
on<ShowAddWorkHistoryForm>((event, emit) async {
|
||||
emit(WorkHistoryLoadingState());
|
||||
try {
|
||||
/////POSITIONS------------------------------------------
|
||||
if (agencyPositions.isEmpty) {
|
||||
List<Position> positions =
|
||||
await WorkHistoryService.instance.getAgencyPosition();
|
||||
agencyPositions = positions;
|
||||
}
|
||||
|
||||
/////AGENCIES------------------------------------------
|
||||
if (agencies.isEmpty) {
|
||||
List<Agency> newAgencies =
|
||||
await ProfileUtilities.instance.getAgecies();
|
||||
agencies = newAgencies;
|
||||
}
|
||||
|
||||
/////Category Agency------------------------------------------
|
||||
if (agencyCategory.isEmpty) {
|
||||
List<Category> categoryAgencies =
|
||||
await ProfileUtilities.instance.agencyCategory();
|
||||
agencyCategory = categoryAgencies;
|
||||
}
|
||||
/////////-------------------------------------
|
||||
if (appointmentStatus.isEmpty) {
|
||||
List<AppoinemtStatus> status =
|
||||
WorkHistoryService.instance.getAppointmentStatusList();
|
||||
appointmentStatus = status;
|
||||
}
|
||||
|
||||
emit(AddWorkHistoryState(
|
||||
agencyPositions: agencyPositions,
|
||||
appointmentStatus: appointmentStatus,
|
||||
agencyCategory: agencyCategory,
|
||||
agencies: agencies));
|
||||
} catch (e) {
|
||||
emit(WorkHistoryErrorState(message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
part of 'workHistory_bloc.dart';
|
||||
|
||||
abstract class WorkHistorytEvent extends Equatable {
|
||||
const WorkHistorytEvent();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class GetWorkHistories extends WorkHistorytEvent{
|
||||
final int profileId;
|
||||
final String token;
|
||||
const GetWorkHistories({required this.profileId, required this.token});
|
||||
|
||||
|
||||
@override
|
||||
List<Object> get props => [profileId, token];
|
||||
}
|
||||
|
||||
class LoadWorkHistories extends WorkHistorytEvent{
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class ShowAddWorkHistoryForm extends WorkHistorytEvent{
|
||||
|
||||
}
|
||||
class ShowEditWorkHistoryForm extends WorkHistorytEvent{
|
||||
final WorkHistory workHistory;
|
||||
const ShowEditWorkHistoryForm({required this.workHistory});
|
||||
@override
|
||||
List<Object> get props => [workHistory];
|
||||
|
||||
}
|
||||
class DeleteWorkHistory extends WorkHistorytEvent{
|
||||
final String token;
|
||||
final int profileId;
|
||||
final WorkHistory workHistory;
|
||||
const DeleteWorkHistory({required this.profileId, required this.token, required this.workHistory});
|
||||
@override
|
||||
List<Object> get props => [token, profileId,workHistory];
|
||||
}
|
||||
|
||||
class UpdateWorkHistory extends WorkHistorytEvent{
|
||||
final WorkHistory workHistory;
|
||||
final WorkHistory oldWorkHistory;
|
||||
final String profileId;
|
||||
final String token;
|
||||
const UpdateWorkHistory({required this.oldWorkHistory, required this.profileId, required this.token, required this.workHistory});
|
||||
@override
|
||||
List<Object> get props => [profileId,token,workHistory,oldWorkHistory];
|
||||
}
|
||||
|
||||
class AddWorkHostory extends WorkHistorytEvent{
|
||||
final WorkHistory workHistory;
|
||||
final bool isPrivate;
|
||||
final int profileId;
|
||||
final String token;
|
||||
const AddWorkHostory({required this.workHistory, required this.isPrivate, required this.profileId, required this.token});
|
||||
@override
|
||||
List<Object> get props => [workHistory,profileId,token,isPrivate];
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
part of 'workHistory_bloc.dart';
|
||||
|
||||
abstract class WorkHistoryState extends Equatable {
|
||||
const WorkHistoryState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class EducationInitial extends WorkHistoryState {}
|
||||
|
||||
class WorkHistoryLoaded extends WorkHistoryState{
|
||||
final List<WorkHistory> workExperiences;
|
||||
const WorkHistoryLoaded({required this.workExperiences});
|
||||
@override
|
||||
List<Object> get props => [workExperiences];
|
||||
}
|
||||
|
||||
class WorkHistoryLoadingState extends WorkHistoryState{
|
||||
|
||||
}
|
||||
class WorkHistoryErrorState extends WorkHistoryState{
|
||||
final String message;
|
||||
const WorkHistoryErrorState({required this.message});
|
||||
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
|
||||
|
||||
class AddWorkHistoryState extends WorkHistoryState{
|
||||
final List<Position> agencyPositions;
|
||||
final List<Agency> agencies;
|
||||
final List<Category> agencyCategory;
|
||||
final List<AppoinemtStatus> appointmentStatus;
|
||||
|
||||
const AddWorkHistoryState({required this.agencyPositions, required this.appointmentStatus,required this.agencies,required this.agencyCategory});
|
||||
@override
|
||||
List<Object> get props => [agencyPositions,appointmentStatus,agencies,agencyCategory];
|
||||
|
||||
}
|
||||
|
||||
class EditWorkHistoryState extends WorkHistoryState{
|
||||
final WorkHistory workHistory;
|
||||
final List<Position> agencyPositions;
|
||||
final List<Agency> agencies;
|
||||
final List<Category> agencyCategory;
|
||||
final List<AppoinemtStatus> appointmentStatus;
|
||||
const EditWorkHistoryState({required this.workHistory, required this.agencies,required this.agencyCategory, required this.agencyPositions, required this.appointmentStatus});
|
||||
@override
|
||||
List<Object> get props => [workHistory, agencyPositions,appointmentStatus,agencies,agencyCategory];
|
||||
}
|
||||
|
||||
class DeletedState extends WorkHistoryState{
|
||||
final bool success;
|
||||
const DeletedState({required this.success});
|
||||
@override
|
||||
List<Object> get props => [success];
|
||||
}
|
||||
|
||||
class WorkHistoryEditedState extends WorkHistoryState{
|
||||
final Map<dynamic,dynamic> response;
|
||||
const WorkHistoryEditedState({required this.response});
|
||||
@override
|
||||
List<Object> get props => [response];
|
||||
}
|
||||
|
||||
class WorkHistoryAddedState extends WorkHistoryState{
|
||||
final Map<dynamic,dynamic> response;
|
||||
const WorkHistoryAddedState({required this.response});
|
||||
@override
|
||||
List<Object> get props => [response];
|
||||
}
|
|
@ -0,0 +1,99 @@
|
|||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'package:barcode_scan2/barcode_scan2.dart';
|
||||
import 'package:bloc/bloc.dart';
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:unit2/model/login_data/user_info/user_data.dart';
|
||||
import 'package:unit2/model/login_data/version_info.dart';
|
||||
import 'package:unit2/screens/unit2/login/functions/get_app_version.dart';
|
||||
import 'package:unit2/sevices/login_service/auth_service.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
|
||||
import '../../utils/scanner.dart';
|
||||
import '../../utils/text_container.dart';
|
||||
|
||||
part 'user_event.dart';
|
||||
part 'user_state.dart';
|
||||
|
||||
class UserBloc extends Bloc<UserEvent, UserState> {
|
||||
UserData? _userData;
|
||||
VersionInfo? _versionInfo;
|
||||
String? _apkVersion;
|
||||
bool save = false;
|
||||
UserBloc() : super(UserInitial()) {
|
||||
// this event is called when opening the app to check if
|
||||
// there is new app version
|
||||
on<GetApkVersion>((event, emit) async {
|
||||
try {
|
||||
emit(SplashScreen());
|
||||
VersionInfo versionInfo = await AuthService.instance.getVersionInfo();
|
||||
_versionInfo = versionInfo;
|
||||
String apkVersion = await getAppVersion();
|
||||
_apkVersion = apkVersion;
|
||||
final String? saved = CREDENTIALS?.get('saved');
|
||||
final String? username = CREDENTIALS?.get('username');
|
||||
final String? password = CREDENTIALS?.get('password');
|
||||
debugPrint(username);
|
||||
debugPrint(password);
|
||||
if (saved != null) {
|
||||
save = true;
|
||||
add(UserLogin(username: username, password: password));
|
||||
} else {
|
||||
emit(VersionLoaded(
|
||||
versionInfo: _versionInfo, apkVersion: _apkVersion));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(UserError(
|
||||
message: e.toString(),
|
||||
));
|
||||
}
|
||||
});
|
||||
//Loading the current version of the app
|
||||
on<LoadVersion>((event, emit) {
|
||||
emit(VersionLoaded(versionInfo: _versionInfo, apkVersion: _apkVersion));
|
||||
});
|
||||
|
||||
on<UserLogin>((event, emit) async {
|
||||
try {
|
||||
Map<dynamic, dynamic> response = await AuthService.instance
|
||||
.webLogin(username: event.username, password: event.password);
|
||||
if (response['status'] == true) {
|
||||
UserData userData = UserData.fromJson(response['data']);
|
||||
emit(UserLoggedIn(
|
||||
userData: userData, success: true, message: response['message'],savedCredentials: save));
|
||||
} else {
|
||||
emit(UserLoggedIn(
|
||||
userData: null, success: false, message: response['message'],savedCredentials: save));
|
||||
}
|
||||
} on TimeoutException catch (_) {
|
||||
emit(InternetTimeout(message: timeoutError));
|
||||
} on SocketException catch (_) {
|
||||
emit(InternetTimeout(message: timeoutError));
|
||||
}
|
||||
});
|
||||
on<UuidLogin>((event, emit) async {
|
||||
try {
|
||||
UserData? userData = await AuthService.instance
|
||||
.qrLogin(uuid: event.uuid, password: event.password);
|
||||
_userData = userData;
|
||||
emit(UserLoggedIn(userData: _userData,savedCredentials: save));
|
||||
} on TimeoutException catch (_) {
|
||||
emit(InternetTimeout(message: timeoutError));
|
||||
} on SocketException catch (_) {
|
||||
emit(InternetTimeout(message: timeoutError));
|
||||
} on Error catch (_) {
|
||||
emit(InvalidCredentials(message: "Invalid username or password"));
|
||||
}
|
||||
});
|
||||
on<LoadLoggedInUser>((event, emit) {
|
||||
emit(UserLoggedIn(userData: _userData,savedCredentials: save));
|
||||
});
|
||||
on<GetUuid>((event, emit) async {
|
||||
ScanResult result = await QRCodeBarCodeScanner.instance.scanner();
|
||||
if (result.rawContent.toString().isNotEmpty) {
|
||||
emit(UuidLoaded(uuid: result.rawContent.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@ class UserLoading extends UserState {
|
|||
}
|
||||
|
||||
class SplashScreen extends UserState {
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
@ -32,7 +33,10 @@ class UserError extends UserState {
|
|||
}
|
||||
class UserLoggedIn extends UserState{
|
||||
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 {
|
||||
|
@ -48,3 +52,15 @@ class UuidLoaded extends UserState{
|
|||
@override
|
||||
List<Object> get props => [uuid];
|
||||
}
|
||||
|
||||
class InternetTimeout extends UserState{
|
||||
final String message;
|
||||
InternetTimeout({required this.message});
|
||||
@override
|
||||
List<Object> get props => [message];
|
||||
}
|
||||
|
||||
class InvalidCredentials extends UserState{
|
||||
final String message ;
|
||||
InvalidCredentials ({required this.message});
|
||||
}
|
|
@ -3,15 +3,28 @@ import 'package:flutter/material.dart';
|
|||
import 'package:device_preview/device_preview.dart';
|
||||
import 'package:flutter/services.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/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/global.dart';
|
||||
|
||||
void main() {
|
||||
runApp(MyApp());
|
||||
Future main() async {
|
||||
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(
|
||||
|
@ -46,6 +59,9 @@ class MyApp extends StatelessWidget {
|
|||
BlocProvider(
|
||||
create: (_) => UserBloc(),
|
||||
),
|
||||
BlocProvider(
|
||||
create: (_) => ProfileBloc(),
|
||||
),
|
||||
],
|
||||
child: MaterialApp(
|
||||
navigatorKey: NavigationService.navigatorKey,
|
||||
|
@ -55,8 +71,10 @@ class MyApp extends StatelessWidget {
|
|||
// routeInformationParser: goRouter.routeInformationParser,
|
||||
// routerDelegate: goRouter.routerDelegate,
|
||||
// routeInformationProvider: goRouter.routeInformationProvider,
|
||||
|
||||
title: 'uniT2 - Universal Tracker and Tracer',
|
||||
theme: ThemeData(
|
||||
primarySwatch: Colors.red,
|
||||
appBarTheme: const AppBarTheme(
|
||||
systemOverlayStyle: SystemUiOverlayStyle(
|
||||
statusBarBrightness: Brightness.dark,
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
class AddressCategory {
|
||||
AddressCategory({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.type,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final String? type;
|
||||
|
||||
factory AddressCategory.fromJson(Map<String, dynamic> json) => AddressCategory(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
type: json["type"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"type": type,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final barangay = barangayFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'city.dart';
|
||||
import 'provinces.dart';
|
||||
|
||||
Barangay barangayFromJson(String str) => Barangay.fromJson(json.decode(str));
|
||||
|
||||
String barangayToJson(Barangay data) => json.encode(data.toJson());
|
||||
|
||||
class Barangay {
|
||||
Barangay({
|
||||
required this.code,
|
||||
required this.description,
|
||||
required this.cityMunicipality,
|
||||
});
|
||||
|
||||
final String? code;
|
||||
final String? description;
|
||||
final CityMunicipality? cityMunicipality;
|
||||
|
||||
factory Barangay.fromJson(Map<String, dynamic> json) => Barangay(
|
||||
code: json["code"],
|
||||
description: json["description"],
|
||||
cityMunicipality: json['city_municipality'] == null? null: CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"code": code,
|
||||
"description": description,
|
||||
"city_municipality": cityMunicipality!.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final city = cityFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'provinces.dart';
|
||||
import 'region.dart';
|
||||
|
||||
CityMunicipality cityFromJson(String str) => CityMunicipality.fromJson(json.decode(str));
|
||||
|
||||
String cityToJson(CityMunicipality data) => json.encode(data.toJson());
|
||||
|
||||
class CityMunicipality {
|
||||
CityMunicipality({
|
||||
required this.code,
|
||||
required this.description,
|
||||
required this.province,
|
||||
required this.psgcCode,
|
||||
required this.zipcode,
|
||||
});
|
||||
|
||||
final String? code;
|
||||
final String? description;
|
||||
final Province? province;
|
||||
final String? psgcCode;
|
||||
final String? zipcode;
|
||||
|
||||
factory CityMunicipality.fromJson(Map<String, dynamic> json) => CityMunicipality(
|
||||
code: json["code"],
|
||||
description: json["description"],
|
||||
province: json['province'] == null? null : Province.fromJson(json["province"]),
|
||||
psgcCode: json["psgc_code"],
|
||||
zipcode: json["zipcode"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"code": code,
|
||||
"description": description,
|
||||
"province": province?.toJson(),
|
||||
"psgc_code": psgcCode,
|
||||
"zipcode": zipcode,
|
||||
};
|
||||
@override
|
||||
String toString(){
|
||||
return 'CityMunicipality{code:$code, description:$description, provice:${province.toString()} }';
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final country = countryFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
Country countryFromJson(String str) => Country.fromJson(json.decode(str));
|
||||
|
||||
String countryToJson(Country data) => json.encode(data.toJson());
|
||||
|
||||
class Country {
|
||||
Country({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.code,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final String? code;
|
||||
|
||||
factory Country.fromJson(Map<String, dynamic> json) => Country(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
code: json["code"].toString(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"code": code,
|
||||
};
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return '$id $name $code ';
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final province = provinceFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'region.dart';
|
||||
|
||||
Province provinceFromJson(String str) => Province.fromJson(json.decode(str));
|
||||
|
||||
String provinceToJson(Province data) => json.encode(data.toJson());
|
||||
|
||||
class Province {
|
||||
Province({
|
||||
required this.code,
|
||||
required this.description,
|
||||
required this.region,
|
||||
required this.psgcCode,
|
||||
required this.shortname,
|
||||
});
|
||||
|
||||
final String? code;
|
||||
final String? description;
|
||||
final Region? region;
|
||||
final String? psgcCode;
|
||||
final String? shortname;
|
||||
|
||||
factory Province.fromJson(Map<String, dynamic> json) => Province(
|
||||
code: json["code"],
|
||||
description: json["description"],
|
||||
region: json['region'] == null? null: Region.fromJson(json["region"]),
|
||||
psgcCode: json["psgc_code"],
|
||||
shortname: json["shortname"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"code": code,
|
||||
"description": description,
|
||||
"region": region!.toJson(),
|
||||
"psgc_code": psgcCode,
|
||||
"shortname": shortname,
|
||||
};
|
||||
|
||||
@override
|
||||
String toString(){
|
||||
return 'Province(name:$description ${region.toString()})';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final region = regionFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
Region regionFromJson(String str) => Region.fromJson(json.decode(str));
|
||||
|
||||
String regionToJson(Region data) => json.encode(data.toJson());
|
||||
|
||||
class Region {
|
||||
Region({
|
||||
required this.code,
|
||||
required this.description,
|
||||
required this.psgcCode,
|
||||
});
|
||||
|
||||
final int? code;
|
||||
final String? description;
|
||||
final String? psgcCode;
|
||||
|
||||
factory Region.fromJson(Map<String, dynamic> json) => Region(
|
||||
code: json["code"],
|
||||
description: json["description"],
|
||||
psgcCode: json["psgc_code"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"code": code,
|
||||
"description": description,
|
||||
"psgc_code": psgcCode,
|
||||
};
|
||||
|
||||
@override
|
||||
String toString(){
|
||||
return 'Region(name:$description)';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
class Subdivision {
|
||||
Subdivision({
|
||||
this.id,
|
||||
this.lotNo,
|
||||
this.blockNo,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final int? lotNo;
|
||||
final int? blockNo;
|
||||
|
||||
factory Subdivision.fromJson(Map<String, dynamic> json) => Subdivision(
|
||||
id: json["id"],
|
||||
lotNo: json["lot_no"],
|
||||
blockNo: json["block_no"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"lot_no": lotNo,
|
||||
"block_no": blockNo,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
import 'package:unit2/model/profile/basic_information/adress.dart';
|
||||
import 'package:unit2/model/profile/basic_information/citizenship.dart';
|
||||
import 'package:unit2/model/profile/basic_information/contact_information.dart';
|
||||
import 'package:unit2/model/profile/basic_information/identification_information.dart';
|
||||
import 'package:unit2/model/profile/basic_information/primary-information.dart';
|
||||
|
||||
class BasicInfo{
|
||||
PrimaryInformation? primaryInformation;
|
||||
List<ContactInfo> contactInformation;
|
||||
List<Identification> identifications;
|
||||
List<Citizenship> citizenships;
|
||||
List<MainAdress> addresses;
|
||||
BasicInfo({required this.addresses, required this.contactInformation, required this.primaryInformation,required this.identifications,required this.citizenships});
|
||||
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
|
||||
|
||||
import '../../location/barangay.dart';
|
||||
import '../../location/city.dart';
|
||||
import '../../location/country.dart';
|
||||
import '../../location/subdivision.dart';
|
||||
import '../../utils/category.dart';
|
||||
|
||||
class MainAdress {
|
||||
MainAdress({
|
||||
this.id,
|
||||
this.address,
|
||||
this.details,
|
||||
this.subdivision,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final AddressClass? address;
|
||||
final String? details;
|
||||
final Subdivision? subdivision;
|
||||
|
||||
factory MainAdress.fromJson(Map<String, dynamic> json) => MainAdress(
|
||||
id: json["id"],
|
||||
address: json["address"] == null ? null : AddressClass.fromJson(json["address"]),
|
||||
details: json["details"],
|
||||
subdivision: json["subdivision"] == null ? null : Subdivision.fromJson(json["subdivision"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"address": address?.toJson(),
|
||||
"details": details,
|
||||
"subdivision": subdivision?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class AddressClass {
|
||||
AddressClass({
|
||||
this.id,
|
||||
this.country,
|
||||
this.barangay,
|
||||
this.category,
|
||||
this.areaClass,
|
||||
this.cityMunicipality,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final Country? country;
|
||||
final Barangay? barangay;
|
||||
final Category? category;
|
||||
final String? areaClass;
|
||||
final CityMunicipality? cityMunicipality;
|
||||
|
||||
factory AddressClass.fromJson(Map<String, dynamic> json) => AddressClass(
|
||||
id: json["id"],
|
||||
country: json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||
barangay: json["barangay"] == null ? null : Barangay.fromJson(json["barangay"]),
|
||||
category: json["category"] == null ? null : Category.fromJson(json["category"]),
|
||||
areaClass: json["area_class"],
|
||||
cityMunicipality: json["city_municipality"] == null ? null : CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"country": country?.toJson(),
|
||||
"barangay": barangay?.toJson(),
|
||||
"category": category?.toJson(),
|
||||
"area_class": areaClass,
|
||||
"city_municipality": cityMunicipality?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
import '../../location/country.dart';
|
||||
|
||||
class Citizenship {
|
||||
Citizenship({
|
||||
required this.country,
|
||||
required this.naturalBorn,
|
||||
});
|
||||
|
||||
final Country? country;
|
||||
final bool? naturalBorn;
|
||||
|
||||
factory Citizenship.fromJson(Map<String, dynamic> json) => Citizenship(
|
||||
country: Country.fromJson(json["country"]),
|
||||
naturalBorn: json["natural_born"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"country": country!.toJson(),
|
||||
"natural_born": naturalBorn,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final contactInformation = contactInformationFromJson(jsonString);
|
||||
|
||||
|
||||
import '../../utils/agency.dart';
|
||||
|
||||
class ContactInfo {
|
||||
ContactInfo({
|
||||
required this.id,
|
||||
required this.active,
|
||||
required this.primary,
|
||||
required this.numbermail,
|
||||
required this.commService,
|
||||
});
|
||||
|
||||
int? id;
|
||||
bool? active;
|
||||
bool? primary;
|
||||
String? numbermail;
|
||||
CommService? commService;
|
||||
|
||||
factory ContactInfo.fromJson(Map<String, dynamic> json) => ContactInfo(
|
||||
id: json["id"],
|
||||
active: json["active"],
|
||||
primary: json["primary"],
|
||||
numbermail: json["numbermail"],
|
||||
commService: json["comm_service"]==null?null: CommService.fromJson(json["comm_service"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"active": active,
|
||||
"primary": primary,
|
||||
"numbermail": numbermail,
|
||||
"comm_service": commService!.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class CommService {
|
||||
CommService({
|
||||
required this.id,
|
||||
required this.serviceType,
|
||||
required this.serviceProvider,
|
||||
});
|
||||
|
||||
int? id;
|
||||
ServiceType? serviceType;
|
||||
ServiceProvider? serviceProvider;
|
||||
|
||||
factory CommService.fromJson(Map<String, dynamic> json) => CommService(
|
||||
id: json["id"],
|
||||
serviceType: json["service_type"]==null?null: ServiceType.fromJson(json["service_type"]),
|
||||
serviceProvider: json["service_provider"] == null?null: ServiceProvider.fromJson(json["service_provider"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"service_type": serviceType!.toJson(),
|
||||
"service_provider": serviceProvider!.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class ServiceProvider {
|
||||
ServiceProvider({
|
||||
required this.id,
|
||||
required this.alias,
|
||||
required this.agency,
|
||||
});
|
||||
|
||||
int? id;
|
||||
String? alias;
|
||||
Agency? agency;
|
||||
|
||||
factory ServiceProvider.fromJson(Map<String, dynamic> json) => ServiceProvider(
|
||||
id: json["id"],
|
||||
alias: json["alias"],
|
||||
agency: json["agency"] == null? null: Agency.fromJson(json["agency"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"alias": alias,
|
||||
"agency": agency!.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
class ServiceType {
|
||||
ServiceType({
|
||||
required this.id,
|
||||
required this.name,
|
||||
});
|
||||
|
||||
int? id;
|
||||
String? name;
|
||||
|
||||
factory ServiceType.fromJson(Map<String, dynamic> json) => ServiceType(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,110 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import '../../location/city.dart';
|
||||
import '../../location/country.dart';
|
||||
import '../../utils/agency.dart';
|
||||
|
||||
Identification identificationFromJson(String str) => Identification.fromJson(json.decode(str));
|
||||
|
||||
String identificationToJson(Identification data) => json.encode(data.toJson());
|
||||
|
||||
class Identification {
|
||||
Identification({
|
||||
required this.id,
|
||||
required this.agency,
|
||||
required this.issuedAt,
|
||||
this.dateIssued,
|
||||
this.expirationDate,
|
||||
required this.asPdfReference,
|
||||
required this.identificationNumber,
|
||||
});
|
||||
|
||||
int? id;
|
||||
Agency? agency;
|
||||
IssuedAt? issuedAt;
|
||||
DateTime? dateIssued;
|
||||
DateTime? expirationDate;
|
||||
bool? asPdfReference;
|
||||
String? identificationNumber;
|
||||
|
||||
factory Identification.fromJson(Map<String, dynamic> json) => Identification(
|
||||
id: json["id"],
|
||||
agency:json["agency"] == null? null: Agency.fromJson(json["agency"]),
|
||||
issuedAt: json["issued_at"] == null? null:IssuedAt.fromJson(json["issued_at"]),
|
||||
dateIssued:json["date_issued"]==null?null:DateTime.parse(json["date_issued"]),
|
||||
expirationDate:json["expiration_date"]==null?null:DateTime.parse(json["expiration_date"]),
|
||||
asPdfReference: json["as_pdf_reference"],
|
||||
identificationNumber: json["identification_number"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"agency": agency!.toJson(),
|
||||
"issued_at": issuedAt!.toJson(),
|
||||
"date_issued": dateIssued,
|
||||
"expiration_date": expirationDate,
|
||||
"as_pdf_reference": asPdfReference,
|
||||
"identification_number": identificationNumber,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
class IssuedAt {
|
||||
IssuedAt({
|
||||
required this.id,
|
||||
this.issuedAtClass,
|
||||
required this.country,
|
||||
this.barangay,
|
||||
required this.addressCategory,
|
||||
required this.cityMunicipality,
|
||||
});
|
||||
|
||||
int? id;
|
||||
dynamic issuedAtClass;
|
||||
Country? country;
|
||||
dynamic barangay;
|
||||
AddressCategory? addressCategory;
|
||||
CityMunicipality? cityMunicipality;
|
||||
|
||||
factory IssuedAt.fromJson(Map<String, dynamic> json) => IssuedAt(
|
||||
id: json["id"],
|
||||
issuedAtClass: json["class"],
|
||||
country: json['country'] == null? null: Country.fromJson(json["country"]),
|
||||
barangay: json["barangay"],
|
||||
addressCategory: json["address_category"] == null? null: AddressCategory.fromJson(json["address_category"]),
|
||||
cityMunicipality:json["city_municipality"] == null? null: CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"class": issuedAtClass,
|
||||
"country": country!.toJson(),
|
||||
"barangay": barangay,
|
||||
"address_category": addressCategory!.toJson(),
|
||||
"city_municipality": cityMunicipality!.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class AddressCategory {
|
||||
AddressCategory({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.type,
|
||||
});
|
||||
|
||||
int? id;
|
||||
String? name;
|
||||
String? type;
|
||||
|
||||
factory AddressCategory.fromJson(Map<String, dynamic> json) => AddressCategory(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
type: json["type"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"type": type,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
import 'dart:convert';
|
||||
|
||||
class PrimaryInformation {
|
||||
PrimaryInformation({
|
||||
required this.id,
|
||||
required this.lastName,
|
||||
required this.firstName,
|
||||
required this.middleName,
|
||||
required this.nameExtension,
|
||||
required this.sex,
|
||||
required this.birthdate,
|
||||
required this.civilStatus,
|
||||
required this.bloodType,
|
||||
required this.heightM,
|
||||
required this.weightKg,
|
||||
required this.photoPath,
|
||||
required this.esigPath,
|
||||
required this.maidenName,
|
||||
required this.deceased,
|
||||
required this.gender,
|
||||
required this.uuidQrcode,
|
||||
required this.titlePrefix,
|
||||
required this.titleSuffix,
|
||||
required this.showTitleId,
|
||||
});
|
||||
|
||||
int? id;
|
||||
String? lastName;
|
||||
String? firstName;
|
||||
String? middleName;
|
||||
String? nameExtension;
|
||||
String? sex;
|
||||
DateTime? birthdate;
|
||||
String? civilStatus;
|
||||
String? bloodType;
|
||||
double? heightM;
|
||||
double? weightKg;
|
||||
String? photoPath;
|
||||
String? esigPath;
|
||||
String? maidenName;
|
||||
bool? deceased;
|
||||
String? gender;
|
||||
String? uuidQrcode;
|
||||
String? titlePrefix;
|
||||
String? titleSuffix;
|
||||
bool? showTitleId;
|
||||
|
||||
factory PrimaryInformation.fromJson(Map<String, dynamic> json) =>
|
||||
PrimaryInformation(
|
||||
id: json["id"],
|
||||
lastName: json["last_name"],
|
||||
firstName: json["first_name"],
|
||||
middleName: json["middle_name"],
|
||||
nameExtension: json["name_extension"],
|
||||
sex: json["sex"],
|
||||
birthdate: json['birthdate']==null?null:DateTime.parse(json["birthdate"]),
|
||||
civilStatus: json["civil_status"],
|
||||
bloodType: json["blood_type"],
|
||||
heightM: json["height_m"]?.toDouble(),
|
||||
weightKg: json["weight_kg"],
|
||||
photoPath: json["photo_path"],
|
||||
esigPath: json["esig_path"],
|
||||
maidenName: json["maiden_name"],
|
||||
deceased: json["deceased"],
|
||||
gender: json["gender"],
|
||||
uuidQrcode: json["uuid_qrcode"],
|
||||
titlePrefix: json["title_prefix"],
|
||||
titleSuffix: json["title_suffix"],
|
||||
showTitleId: json["show_title_id"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"last_name": lastName,
|
||||
"first_name": firstName,
|
||||
"middle_name": middleName,
|
||||
"name_extension": nameExtension,
|
||||
"sex": sex,
|
||||
"birthdate":
|
||||
"${birthdate!.year.toString().padLeft(4, '0')}-${birthdate!.month.toString().padLeft(2, '0')}-${birthdate!.day.toString().padLeft(2, '0')}",
|
||||
"civil_status": civilStatus,
|
||||
"blood_type": bloodType,
|
||||
"height_m": heightM,
|
||||
"weight_kg": weightKg,
|
||||
"photo_path": photoPath,
|
||||
"esig_path": esigPath,
|
||||
"maiden_name": maidenName,
|
||||
"deceased": deceased,
|
||||
"gender": gender,
|
||||
"uuid_qrcode": uuidQrcode,
|
||||
"title_prefix": titlePrefix,
|
||||
"title_suffix": titleSuffix,
|
||||
"show_title_id": showTitleId,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,145 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final educationalBackground = educationalBackgroundFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
EducationalBackground educationalBackgroundFromJson(String str) => EducationalBackground.fromJson(json.decode(str));
|
||||
|
||||
String educationalBackgroundToJson(EducationalBackground data) => json.encode(data.toJson());
|
||||
|
||||
class EducationalBackground {
|
||||
EducationalBackground({
|
||||
this.id,
|
||||
this.honors,
|
||||
this.education,
|
||||
this.periodTo,
|
||||
this.attachments,
|
||||
this.periodFrom,
|
||||
this.unitsEarned,
|
||||
this.yearGraduated,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final List<Honor>? honors;
|
||||
final Education? education;
|
||||
final String? periodTo;
|
||||
final dynamic attachments;
|
||||
final String? periodFrom;
|
||||
final dynamic unitsEarned;
|
||||
final String? yearGraduated;
|
||||
|
||||
factory EducationalBackground.fromJson(Map<String, dynamic> json) => EducationalBackground(
|
||||
id: json["id"],
|
||||
honors: json["honors"] == null ? [] : List<Honor>.from(json["honors"]!.map((x) => Honor.fromJson(x))),
|
||||
education: json["education"] == null ? null : Education.fromJson(json["education"]),
|
||||
periodTo: json["period_to"],
|
||||
attachments: json["attachments"],
|
||||
periodFrom: json["period_from"],
|
||||
unitsEarned: json["units_earned"],
|
||||
yearGraduated: json["year_graduated"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"honors": honors == null ? [] : List<dynamic>.from(honors!.map((x) => x.toJson())),
|
||||
"education": education?.toJson(),
|
||||
"period_to": periodTo,
|
||||
"attachments": attachments,
|
||||
"period_from": periodFrom,
|
||||
"units_earned": unitsEarned,
|
||||
"year_graduated": yearGraduated,
|
||||
};
|
||||
}
|
||||
|
||||
class Education {
|
||||
Education({
|
||||
this.id,
|
||||
this.level,
|
||||
this.course,
|
||||
this.school,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? level;
|
||||
final Course? course;
|
||||
final School? school;
|
||||
|
||||
factory Education.fromJson(Map<String, dynamic> json) => Education(
|
||||
id: json["id"],
|
||||
level: json["level"],
|
||||
course: json["course"] == null ? null : Course.fromJson(json["course"]),
|
||||
school: json["school"] == null ? null : School.fromJson(json["school"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"level": level,
|
||||
"course": course?.toJson(),
|
||||
"school": school?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class Course {
|
||||
Course({
|
||||
this.id,
|
||||
this.program,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? program;
|
||||
|
||||
factory Course.fromJson(Map<String, dynamic> json) => Course(
|
||||
id: json["id"],
|
||||
program: json["program"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"program": program,
|
||||
};
|
||||
}
|
||||
|
||||
class School {
|
||||
School({
|
||||
this.id,
|
||||
this.name,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
|
||||
factory School.fromJson(Map<String, dynamic> json) => School(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
};
|
||||
}
|
||||
|
||||
class Honor {
|
||||
Honor({
|
||||
this.id,
|
||||
this.name,
|
||||
this.academ,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final bool? academ;
|
||||
|
||||
factory Honor.fromJson(Map<String, dynamic> json) => Honor(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
academ: json["academ"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"academ": academ,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,123 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final eligibity = eligibityFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:unit2/model/location/region.dart';
|
||||
|
||||
import '../location/address_category.dart';
|
||||
import '../location/city.dart';
|
||||
import '../location/country.dart';
|
||||
import '../utils/eligibility.dart';
|
||||
|
||||
EligibityCert eligibityFromJson(String str) =>
|
||||
EligibityCert.fromJson(json.decode(str));
|
||||
|
||||
String eligibityToJson(EligibityCert data) => json.encode(data.toJson());
|
||||
|
||||
class EligibityCert {
|
||||
EligibityCert({
|
||||
required this.id,
|
||||
required this.rating,
|
||||
required this.examDate,
|
||||
required this.attachments,
|
||||
required this.eligibility,
|
||||
required this.examAddress,
|
||||
required this.validityDate,
|
||||
required this.licenseNumber,
|
||||
required this.overseas,
|
||||
});
|
||||
bool? overseas;
|
||||
final int? id;
|
||||
final double? rating;
|
||||
final DateTime? examDate;
|
||||
final dynamic attachments;
|
||||
final Eligibility? eligibility;
|
||||
final ExamAddress? examAddress;
|
||||
final DateTime? validityDate;
|
||||
final String? licenseNumber;
|
||||
|
||||
factory EligibityCert.fromJson(Map<String, dynamic> json) => EligibityCert(
|
||||
id: json["id"],
|
||||
rating: json["rating"]?.toDouble(),
|
||||
examDate: json['exam_date'] == null
|
||||
? null
|
||||
: DateTime.parse(json["exam_date"]),
|
||||
attachments: null,
|
||||
eligibility: json['eligibility'] == null
|
||||
? null
|
||||
: Eligibility.fromJson(json["eligibility"]),
|
||||
examAddress: json['exam_address'] == null
|
||||
? null
|
||||
: ExamAddress.fromJson(json["exam_address"]),
|
||||
validityDate: json['validity_date'] == null
|
||||
? null
|
||||
: DateTime.parse(json["validity_date"]),
|
||||
licenseNumber: json["license_number"],
|
||||
overseas: null,
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"rating": rating,
|
||||
"exam_date":
|
||||
"${examDate!.year.toString().padLeft(4, '0')}-${examDate!.month.toString().padLeft(2, '0')}-${examDate!.day.toString().padLeft(2, '0')}",
|
||||
"attachments": attachments,
|
||||
"eligibility": eligibility!.toJson(),
|
||||
"exam_address": examAddress!.toJson(),
|
||||
"validity_date": "${validityDate!.year.toString().padLeft(4, '0')}-${validityDate!.month.toString().padLeft(2, '0')}-${validityDate!.day.toString().padLeft(2, '0')}",
|
||||
"license_number": licenseNumber,
|
||||
};
|
||||
@override
|
||||
String toString() {
|
||||
return 'eligibility:${eligibility.toString()}, rating:$rating, examDate:${examDate.toString()},validydate:${validityDate.toString()}, lisence:$licenseNumber, examAddress:${examAddress.toString()}';
|
||||
}
|
||||
}
|
||||
|
||||
class ExamAddress {
|
||||
ExamAddress({
|
||||
required this.id,
|
||||
required this.examAddressClass,
|
||||
required this.country,
|
||||
required this.barangay,
|
||||
required this.addressCategory,
|
||||
required this.cityMunicipality,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final dynamic examAddressClass;
|
||||
final Country? country;
|
||||
final dynamic barangay;
|
||||
final AddressCategory? addressCategory;
|
||||
final CityMunicipality? cityMunicipality;
|
||||
|
||||
factory ExamAddress.fromJson(Map<String, dynamic> json) => ExamAddress(
|
||||
id: json["id"],
|
||||
examAddressClass: json["class"],
|
||||
country:
|
||||
json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||
barangay: json["barangay"],
|
||||
addressCategory: json["address_category"] == null
|
||||
? null
|
||||
: AddressCategory.fromJson(json["address_category"]),
|
||||
cityMunicipality: json["city_municipality"] == null
|
||||
? null
|
||||
: CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"class": examAddressClass,
|
||||
"country": country!.toJson(),
|
||||
"barangay": barangay,
|
||||
"address_category": addressCategory!.toJson(),
|
||||
"city_municipality": cityMunicipality!.toJson(),
|
||||
};
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'country:${country.toString()} , address:${cityMunicipality.toString()}';
|
||||
}
|
||||
}
|
|
@ -0,0 +1,247 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final familyBackground = familyBackgroundFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:ffi';
|
||||
|
||||
import '../utils/category.dart';
|
||||
import '../utils/position.dart';
|
||||
|
||||
FamilyBackground familyBackgroundFromJson(String str) => FamilyBackground.fromJson(json.decode(str));
|
||||
|
||||
String familyBackgroundToJson(FamilyBackground data) => json.encode(data.toJson());
|
||||
|
||||
class FamilyBackground {
|
||||
FamilyBackground({
|
||||
this.company,
|
||||
this.position,
|
||||
this.relationship,
|
||||
this.relatedPerson,
|
||||
this.companyAddress,
|
||||
this.emergencyContact,
|
||||
this.incaseOfEmergency,
|
||||
this.companyContactNumber,
|
||||
});
|
||||
|
||||
final Company? company;
|
||||
final Position? position;
|
||||
final Relationship? relationship;
|
||||
final RelatedPerson? relatedPerson;
|
||||
final String? companyAddress;
|
||||
final List<EmergencyContact>? emergencyContact;
|
||||
final bool? incaseOfEmergency;
|
||||
final String? companyContactNumber;
|
||||
|
||||
factory FamilyBackground.fromJson(Map<String, dynamic> json) => FamilyBackground(
|
||||
company: json["company"] == null ? null : Company.fromJson(json["company"]),
|
||||
position: json["position"] == null ? null : Position.fromJson(json["position"]),
|
||||
relationship: json["relationship"] == null ? null : Relationship.fromJson(json["relationship"]),
|
||||
relatedPerson: json["related_person"] == null ? null : RelatedPerson.fromJson(json["related_person"]),
|
||||
companyAddress: json["company_address"],
|
||||
emergencyContact: json["emergency_contact"] == null ? [] : List<EmergencyContact>.from(json["emergency_contact"]!.map((x) => EmergencyContact.fromJson(x))),
|
||||
incaseOfEmergency: json["incase_of_emergency"],
|
||||
companyContactNumber: json["company_contact_number"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"company": company?.toJson(),
|
||||
"position": position?.toJson(),
|
||||
"relationship": relationship?.toJson(),
|
||||
"related_person": relatedPerson?.toJson(),
|
||||
"company_address": companyAddress,
|
||||
"emergency_contact": emergencyContact == null ? [] : List<dynamic>.from(emergencyContact!.map((x) => x.toJson())),
|
||||
"incase_of_emergency": incaseOfEmergency,
|
||||
"company_contact_number": companyContactNumber,
|
||||
};
|
||||
}
|
||||
|
||||
class Company {
|
||||
Company({
|
||||
this.id,
|
||||
this.name,
|
||||
this.category,
|
||||
this.privateEntity,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final Category? category;
|
||||
final bool? privateEntity;
|
||||
|
||||
factory Company.fromJson(Map<String, dynamic> json) => Company(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
category: json["category"] == null ? null : Category.fromJson(json["category"]),
|
||||
privateEntity: json["private_entity"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"category": category?.toJson(),
|
||||
"private_entity": privateEntity,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
class EmergencyContact {
|
||||
EmergencyContact({
|
||||
this.telco,
|
||||
this.isactive,
|
||||
this.provider,
|
||||
this.isprimary,
|
||||
this.numbermail,
|
||||
this.serviceType,
|
||||
this.contactinfoid,
|
||||
this.commServiceId,
|
||||
});
|
||||
|
||||
final String? telco;
|
||||
final bool? isactive;
|
||||
final int? provider;
|
||||
final bool? isprimary;
|
||||
final String? numbermail;
|
||||
final int? serviceType;
|
||||
final int? contactinfoid;
|
||||
final int? commServiceId;
|
||||
|
||||
factory EmergencyContact.fromJson(Map<String, dynamic> json) => EmergencyContact(
|
||||
telco: json["telco"],
|
||||
isactive: json["isactive"],
|
||||
provider: json["provider"],
|
||||
isprimary: json["isprimary"],
|
||||
numbermail: json["numbermail"],
|
||||
serviceType: json["service_type"],
|
||||
contactinfoid: json["contactinfoid"],
|
||||
commServiceId: json["comm_service_id"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"telco": telco,
|
||||
"isactive": isactive,
|
||||
"provider": provider,
|
||||
"isprimary": isprimary,
|
||||
"numbermail": numbermail,
|
||||
"service_type": serviceType,
|
||||
"contactinfoid": contactinfoid,
|
||||
"comm_service_id": commServiceId,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
class RelatedPerson {
|
||||
RelatedPerson({
|
||||
this.id,
|
||||
this.sex,
|
||||
this.gender,
|
||||
this.deceased,
|
||||
this.heightM,
|
||||
this.birthdate,
|
||||
this.esigPath,
|
||||
this.lastName,
|
||||
this.weightKg,
|
||||
this.bloodType,
|
||||
this.firstName,
|
||||
this.photoPath,
|
||||
this.maidenName,
|
||||
this.middleName,
|
||||
this.uuidQrcode,
|
||||
this.civilStatus,
|
||||
this.titlePrefix,
|
||||
this.titleSuffix,
|
||||
this.showTitleId,
|
||||
this.nameExtension,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? sex;
|
||||
final String? gender;
|
||||
final bool? deceased;
|
||||
final double? heightM;
|
||||
final DateTime? birthdate;
|
||||
final String? esigPath;
|
||||
final String? lastName;
|
||||
final double? weightKg;
|
||||
final String? bloodType;
|
||||
final String? firstName;
|
||||
final String? photoPath;
|
||||
final dynamic maidenName;
|
||||
final String? middleName;
|
||||
final String? uuidQrcode;
|
||||
final String? civilStatus;
|
||||
final String? titlePrefix;
|
||||
final String? titleSuffix;
|
||||
final bool? showTitleId;
|
||||
final String? nameExtension;
|
||||
|
||||
factory RelatedPerson.fromJson(Map<String, dynamic> json) => RelatedPerson(
|
||||
id: json["id"],
|
||||
sex: json["sex"],
|
||||
gender: json["gender"],
|
||||
deceased: json["deceased"],
|
||||
heightM: json["height_m"] == null?null:double.parse(json["height_m"].toString()),
|
||||
birthdate: json["birthdate"] == null ? null : DateTime.parse(json["birthdate"]),
|
||||
esigPath: json["esig_path"],
|
||||
lastName: json["last_name"],
|
||||
weightKg: json["weight_kg"] == null? null:double.parse(json["weight_kg"].toString()) ,
|
||||
bloodType: json["blood_type"],
|
||||
firstName: json["first_name"],
|
||||
photoPath: json["photo_path"],
|
||||
maidenName: json["maiden_name"],
|
||||
middleName: json["middle_name"],
|
||||
uuidQrcode: json["uuid_qrcode"],
|
||||
civilStatus: json["civil_status"],
|
||||
titlePrefix: json["title_prefix"],
|
||||
titleSuffix: json["title_suffix"],
|
||||
showTitleId: json["show_title_id"],
|
||||
nameExtension: json["name_extension"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"sex": sex,
|
||||
"gender": gender,
|
||||
"deceased": deceased,
|
||||
"height_m": heightM,
|
||||
"birthdate": "${birthdate!.year.toString().padLeft(4, '0')}-${birthdate!.month.toString().padLeft(2, '0')}-${birthdate!.day.toString().padLeft(2, '0')}",
|
||||
"esig_path": esigPath,
|
||||
"last_name": lastName,
|
||||
"weight_kg": weightKg,
|
||||
"blood_type": bloodType,
|
||||
"first_name": firstName,
|
||||
"photo_path": photoPath,
|
||||
"maiden_name": maidenName,
|
||||
"middle_name": middleName,
|
||||
"uuid_qrcode": uuidQrcode,
|
||||
"civil_status": civilStatus,
|
||||
"title_prefix": titlePrefix,
|
||||
"title_suffix": titleSuffix,
|
||||
"show_title_id": showTitleId,
|
||||
"name_extension": nameExtension,
|
||||
};
|
||||
}
|
||||
|
||||
class Relationship {
|
||||
Relationship({
|
||||
this.id,
|
||||
this.type,
|
||||
this.category,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? type;
|
||||
final String? category;
|
||||
|
||||
factory Relationship.fromJson(Map<String, dynamic> json) => Relationship(
|
||||
id: json["id"],
|
||||
type: json["type"],
|
||||
category: json["category"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"type": type,
|
||||
"category": category,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,231 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final learningDevelopement = learningDevelopementFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import '../location/city.dart';
|
||||
import '../location/country.dart';
|
||||
import '../utils/industry_class.dart';
|
||||
|
||||
LearningDevelopement learningDevelopementFromJson(String str) => LearningDevelopement.fromJson(json.decode(str));
|
||||
|
||||
String learningDevelopementToJson(LearningDevelopement data) => json.encode(data.toJson());
|
||||
|
||||
class LearningDevelopement {
|
||||
LearningDevelopement({
|
||||
this.attachments,
|
||||
this.sponsoredBy,
|
||||
this.conductedTraining,
|
||||
this.totalHoursAttended,
|
||||
});
|
||||
|
||||
final dynamic attachments;
|
||||
final EdBy? sponsoredBy;
|
||||
final ConductedTraining? conductedTraining;
|
||||
final double? totalHoursAttended;
|
||||
|
||||
factory LearningDevelopement.fromJson(Map<String, dynamic> json) => LearningDevelopement(
|
||||
attachments: json["attachments"],
|
||||
sponsoredBy: json["sponsored_by"] == null ? null : EdBy.fromJson(json["sponsored_by"]),
|
||||
conductedTraining: json["conducted_training"] == null ? null : ConductedTraining.fromJson(json["conducted_training"]),
|
||||
totalHoursAttended: json["total_hours_attended"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"attachments": attachments,
|
||||
"sponsored_by": sponsoredBy?.toJson(),
|
||||
"conducted_training": conductedTraining?.toJson(),
|
||||
"total_hours_attended": totalHoursAttended,
|
||||
};
|
||||
}
|
||||
|
||||
class ConductedTraining {
|
||||
ConductedTraining({
|
||||
this.id,
|
||||
this.title,
|
||||
this.topic,
|
||||
this.venue,
|
||||
this.locked,
|
||||
this.toDate,
|
||||
this.fromDate,
|
||||
this.totalHours,
|
||||
this.conductedBy,
|
||||
this.sessionsAttended,
|
||||
this.learningDevelopmentType,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final LearningDevelopmentType? title;
|
||||
final LearningDevelopmentType? topic;
|
||||
final Venue? venue;
|
||||
final bool? locked;
|
||||
final DateTime? toDate;
|
||||
final DateTime? fromDate;
|
||||
final int? totalHours;
|
||||
final EdBy? conductedBy;
|
||||
final List<dynamic>? sessionsAttended;
|
||||
final LearningDevelopmentType? learningDevelopmentType;
|
||||
|
||||
factory ConductedTraining.fromJson(Map<String, dynamic> json) => ConductedTraining(
|
||||
id: json["id"],
|
||||
title: json["title"] == null ? null : LearningDevelopmentType.fromJson(json["title"]),
|
||||
topic: json["topic"] == null ? null : LearningDevelopmentType.fromJson(json["topic"]),
|
||||
venue: json["venue"] == null ? null : Venue.fromJson(json["venue"]),
|
||||
locked: json["locked"],
|
||||
toDate: json["to_date"] == null ? null : DateTime.parse(json["to_date"]),
|
||||
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
|
||||
totalHours: json["total_hours"],
|
||||
conductedBy: json["conducted_by"] == null ? null : EdBy.fromJson(json["conducted_by"]),
|
||||
sessionsAttended: json["sessions_attended"] == null ? [] : List<dynamic>.from(json["sessions_attended"]!.map((x) => x)),
|
||||
learningDevelopmentType: json["learning_development_type"] == null ? null : LearningDevelopmentType.fromJson(json["learning_development_type"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"title": title?.toJson(),
|
||||
"topic": topic?.toJson(),
|
||||
"venue": venue?.toJson(),
|
||||
"locked": locked,
|
||||
"to_date": "${toDate!.year.toString().padLeft(4, '0')}-${toDate!.month.toString().padLeft(2, '0')}-${toDate!.day.toString().padLeft(2, '0')}",
|
||||
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
|
||||
"total_hours": totalHours,
|
||||
"conducted_by": conductedBy?.toJson(),
|
||||
"sessions_attended": sessionsAttended == null ? [] : List<dynamic>.from(sessionsAttended!.map((x) => x)),
|
||||
"learning_development_type": learningDevelopmentType?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class EdBy {
|
||||
EdBy({
|
||||
this.id,
|
||||
this.name,
|
||||
this.category,
|
||||
this.privateEntity,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final SponsoredByCategory? category;
|
||||
final bool? privateEntity;
|
||||
|
||||
factory EdBy.fromJson(Map<String, dynamic> json) => EdBy(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
category: json["category"] == null ? null : SponsoredByCategory.fromJson(json["category"]),
|
||||
privateEntity: json["private_entity"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"category": category?.toJson(),
|
||||
"private_entity": privateEntity,
|
||||
};
|
||||
}
|
||||
|
||||
class SponsoredByCategory {
|
||||
SponsoredByCategory({
|
||||
this.id,
|
||||
this.name,
|
||||
this.industryClass,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final IndustryClass? industryClass;
|
||||
|
||||
factory SponsoredByCategory.fromJson(Map<String, dynamic> json) => SponsoredByCategory(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
industryClass: json["industry_class"] == null ? null : IndustryClass.fromJson(json["industry_class"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"industry_class": industryClass?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
class LearningDevelopmentType {
|
||||
LearningDevelopmentType({
|
||||
this.id,
|
||||
this.title,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? title;
|
||||
|
||||
factory LearningDevelopmentType.fromJson(Map<String, dynamic> json) => LearningDevelopmentType(
|
||||
id: json["id"],
|
||||
title: json["title"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"title": title,
|
||||
};
|
||||
}
|
||||
|
||||
class Venue {
|
||||
Venue({
|
||||
this.id,
|
||||
this.country,
|
||||
this.barangay,
|
||||
this.category,
|
||||
this.areaClass,
|
||||
this.cityMunicipality,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final Country? country;
|
||||
final dynamic barangay;
|
||||
final VenueCategory? category;
|
||||
final dynamic areaClass;
|
||||
final CityMunicipality? cityMunicipality;
|
||||
|
||||
factory Venue.fromJson(Map<String, dynamic> json) => Venue(
|
||||
id: json["id"],
|
||||
country: json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||
barangay: json["barangay"],
|
||||
category: json["category"] == null ? null : VenueCategory.fromJson(json["category"]),
|
||||
areaClass: json["area_class"],
|
||||
cityMunicipality: json["city_municipality"] == null ? null : CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"country": country?.toJson(),
|
||||
"barangay": barangay,
|
||||
"category": category?.toJson(),
|
||||
"area_class": areaClass,
|
||||
"city_municipality": cityMunicipality?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
class VenueCategory {
|
||||
VenueCategory({
|
||||
this.id,
|
||||
this.name,
|
||||
this.type,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final String? type;
|
||||
|
||||
factory VenueCategory.fromJson(Map<String, dynamic> json) => VenueCategory(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
type: json["type"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"type": type,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final nonAcademicRecognition = nonAcademicRecognitionFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:unit2/model/utils/agency.dart';
|
||||
|
||||
NonAcademicRecognition nonAcademicRecognitionFromJson(String str) => NonAcademicRecognition.fromJson(json.decode(str));
|
||||
|
||||
String nonAcademicRecognitionToJson(NonAcademicRecognition data) => json.encode(data.toJson());
|
||||
|
||||
class NonAcademicRecognition {
|
||||
NonAcademicRecognition({
|
||||
this.id,
|
||||
this.title,
|
||||
this.presenter,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? title;
|
||||
final Agency? presenter;
|
||||
|
||||
factory NonAcademicRecognition.fromJson(Map<String, dynamic> json) => NonAcademicRecognition(
|
||||
id: json["id"],
|
||||
title: json["title"],
|
||||
presenter: json["presenter"] == null ? null : Agency.fromJson(json["presenter"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"title": title,
|
||||
"presenter": presenter?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final organizationMembership = organizationMembershipFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import '../../utils/agency.dart';
|
||||
|
||||
OrganizationMembership organizationMembershipFromJson(String str) => OrganizationMembership.fromJson(json.decode(str));
|
||||
|
||||
String organizationMembershipToJson(OrganizationMembership data) => json.encode(data.toJson());
|
||||
|
||||
class OrganizationMembership {
|
||||
OrganizationMembership({
|
||||
this.agency,
|
||||
});
|
||||
|
||||
final Agency? agency;
|
||||
|
||||
factory OrganizationMembership.fromJson(Map<String, dynamic> json) => OrganizationMembership(
|
||||
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"agency": agency?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final skillsHobbies = skillsHobbiesFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
SkillsHobbies skillsHobbiesFromJson(String str) => SkillsHobbies.fromJson(json.decode(str));
|
||||
|
||||
String skillsHobbiesToJson(SkillsHobbies data) => json.encode(data.toJson());
|
||||
|
||||
class SkillsHobbies {
|
||||
SkillsHobbies({
|
||||
this.id,
|
||||
this.name,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
|
||||
factory SkillsHobbies.fromJson(Map<String, dynamic> json) => SkillsHobbies(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
import 'package:unit2/model/profile/basic_info.dart';
|
||||
import 'package:unit2/model/profile/basic_information/primary-information.dart';
|
||||
import 'package:unit2/model/profile/educational_background.dart';
|
||||
import 'package:unit2/model/profile/eligibility.dart';
|
||||
import 'package:unit2/model/profile/family_backround.dart';
|
||||
import 'package:unit2/model/profile/learning_development.dart';
|
||||
import 'package:unit2/model/profile/references.dart';
|
||||
import 'package:unit2/model/profile/voluntary_works.dart';
|
||||
import 'package:unit2/model/profile/work_history.dart';
|
||||
|
||||
class ProfileInformation{
|
||||
final BasicInfo basicInfo;
|
||||
// OtherInformation otherInformation;
|
||||
// List<EligibityCert> eligibilities;
|
||||
// List<PersonalReference> references;
|
||||
// List<LearningDevelopement> learningsAndDevelopment;
|
||||
// List<EducationalBackground> educationalBackgrounds;
|
||||
// List<FamilyBackground> families;
|
||||
// List<WorkHistory>workExperiences;
|
||||
// List<VoluntaryWork> voluntaryWorks;
|
||||
ProfileInformation({required this.basicInfo});
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final references = referencesFromJson(jsonString);
|
||||
import '../location/address_category.dart';
|
||||
import '../location/barangay.dart';
|
||||
import '../location/city.dart';
|
||||
import '../location/country.dart';
|
||||
import '../location/provinces.dart';
|
||||
|
||||
class PersonalReference {
|
||||
PersonalReference({
|
||||
required this.id,
|
||||
required this.address,
|
||||
required this.lastName,
|
||||
required this.contactNo,
|
||||
required this.firstName,
|
||||
required this.middleName,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final Address? address;
|
||||
final String? lastName;
|
||||
final String? contactNo;
|
||||
final String? firstName;
|
||||
final String? middleName;
|
||||
|
||||
factory PersonalReference.fromJson(Map<String, dynamic> json) => PersonalReference(
|
||||
id: json["id"],
|
||||
address: json['address'] == null?null: Address.fromJson(json["address"]),
|
||||
lastName: json["last_name"],
|
||||
contactNo: json["contact_no"],
|
||||
firstName: json["first_name"],
|
||||
middleName: json["middle_name"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"address": address!.toJson(),
|
||||
"last_name": lastName,
|
||||
"contact_no": contactNo,
|
||||
"first_name": firstName,
|
||||
"middle_name": middleName,
|
||||
};
|
||||
}
|
||||
|
||||
class Address {
|
||||
Address({
|
||||
required this.id,
|
||||
required this.addressClass,
|
||||
required this.country,
|
||||
required this.barangay,
|
||||
required this.addressCategory,
|
||||
required this.cityMunicipality,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? addressClass;
|
||||
final Country? country;
|
||||
final Barangay? barangay;
|
||||
final AddressCategory? addressCategory;
|
||||
final CityMunicipality? cityMunicipality;
|
||||
|
||||
factory Address.fromJson(Map<String, dynamic> json) => Address(
|
||||
id: json["id"],
|
||||
addressClass: json["class"],
|
||||
country: json['country']== null?null: Country.fromJson(json["country"]),
|
||||
barangay:json["barangay"]== null?null: Barangay.fromJson(json["barangay"]),
|
||||
addressCategory: json["address_category"]== null? null: AddressCategory.fromJson(json["address_category"]),
|
||||
cityMunicipality: json["city_municipality"]==null?null: CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"class": addressClass,
|
||||
"country": country!.toJson(),
|
||||
"barangay": barangay!.toJson(),
|
||||
"address_category": addressCategory!.toJson(),
|
||||
"city_municipality": cityMunicipality!.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final voluntaryWork = voluntaryWorkFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import '../location/address_category.dart';
|
||||
import '../location/city.dart';
|
||||
import '../location/country.dart';
|
||||
import '../utils/agency.dart';
|
||||
import '../utils/position.dart';
|
||||
|
||||
VoluntaryWork voluntaryWorkFromJson(String str) => VoluntaryWork.fromJson(json.decode(str));
|
||||
|
||||
String voluntaryWorkToJson(VoluntaryWork data) => json.encode(data.toJson());
|
||||
|
||||
class VoluntaryWork {
|
||||
VoluntaryWork({
|
||||
this.agency,
|
||||
this.address,
|
||||
this.toDate,
|
||||
this.position,
|
||||
this.fromDate,
|
||||
this.totalHours,
|
||||
});
|
||||
|
||||
final Agency? agency;
|
||||
final Address? address;
|
||||
final DateTime? toDate;
|
||||
final Position? position;
|
||||
final DateTime? fromDate;
|
||||
final int? totalHours;
|
||||
|
||||
factory VoluntaryWork.fromJson(Map<String, dynamic> json) => VoluntaryWork(
|
||||
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
|
||||
address: json["address"] == null ? null : Address.fromJson(json["address"]),
|
||||
toDate: json["to_date"] == null? null : DateTime.parse(json['to_data']),
|
||||
position: json["position"] == null ? null : Position.fromJson(json["position"]),
|
||||
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
|
||||
totalHours: json["total_hours"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"agency": agency?.toJson(),
|
||||
"address": address?.toJson(),
|
||||
"to_date": toDate,
|
||||
"position": position?.toJson(),
|
||||
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
|
||||
"total_hours": totalHours,
|
||||
};
|
||||
}
|
||||
|
||||
class Address {
|
||||
Address({
|
||||
this.id,
|
||||
this.addressClass,
|
||||
this.country,
|
||||
this.barangay,
|
||||
this.addressCategory,
|
||||
this.cityMunicipality,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final dynamic addressClass;
|
||||
final Country? country;
|
||||
final dynamic barangay;
|
||||
final AddressCategory? addressCategory;
|
||||
final CityMunicipality? cityMunicipality;
|
||||
|
||||
factory Address.fromJson(Map<String, dynamic> json) => Address(
|
||||
id: json["id"],
|
||||
addressClass: json["class"],
|
||||
country: json["country"] == null ? null : Country.fromJson(json["country"]),
|
||||
barangay: json["barangay"],
|
||||
addressCategory: json["address_category"] == null ? null : AddressCategory.fromJson(json["address_category"]),
|
||||
cityMunicipality: json["city_municipality"] == null ? null : CityMunicipality.fromJson(json["city_municipality"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"class": addressClass,
|
||||
"country": country?.toJson(),
|
||||
"barangay": barangay,
|
||||
"address_category": addressCategory?.toJson(),
|
||||
"city_municipality": cityMunicipality?.toJson(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final workHistory = workHistoryFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
import '../utils/agency.dart';
|
||||
import '../utils/category.dart';
|
||||
import '../utils/industry_class.dart';
|
||||
import '../utils/position.dart';
|
||||
|
||||
WorkHistory workHistoryFromJson(String str) => WorkHistory.fromJson(json.decode(str));
|
||||
|
||||
String workHistoryToJson(WorkHistory data) => json.encode(data.toJson());
|
||||
|
||||
class WorkHistory {
|
||||
WorkHistory({
|
||||
this.id,
|
||||
this.agency,
|
||||
this.sgStep,
|
||||
this.toDate,
|
||||
this.position,
|
||||
this.fromDate,
|
||||
// this.attachments,
|
||||
this.salaryGrade,
|
||||
this.monthlySalary,
|
||||
this.appointmentStatus,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final Agency? agency;
|
||||
final int? sgStep;
|
||||
final DateTime? toDate;
|
||||
final Position? position;
|
||||
final DateTime? fromDate;
|
||||
// final dynamic attachments;
|
||||
final int? salaryGrade;
|
||||
final double? monthlySalary;
|
||||
final String? appointmentStatus;
|
||||
|
||||
factory WorkHistory.fromJson(Map<String, dynamic> json) => WorkHistory(
|
||||
id: json["id"],
|
||||
agency: json["agency"] == null ? null : Agency.fromJson(json["agency"]),
|
||||
sgStep: json["sg_step"],
|
||||
toDate: json["to_date"] == null ? null : DateTime.parse(json["to_date"]),
|
||||
position: json["position"] == null ? null : Position.fromJson(json["position"]),
|
||||
fromDate: json["from_date"] == null ? null : DateTime.parse(json["from_date"]),
|
||||
// attachments: json["attachments"],
|
||||
salaryGrade: json["salary_grade"],
|
||||
monthlySalary: json["monthly_salary"],
|
||||
appointmentStatus: json["appointment_status"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"agency": agency?.toJson(),
|
||||
"sg_step": sgStep,
|
||||
"to_date": "${toDate!.year.toString().padLeft(4, '0')}-${toDate!.month.toString().padLeft(2, '0')}-${toDate!.day.toString().padLeft(2, '0')}",
|
||||
"position": position?.toJson(),
|
||||
"from_date": "${fromDate!.year.toString().padLeft(4, '0')}-${fromDate!.month.toString().padLeft(2, '0')}-${fromDate!.day.toString().padLeft(2, '0')}",
|
||||
// "attachments": attachments,
|
||||
"salary_grade": salaryGrade,
|
||||
"monthly_salary": monthlySalary,
|
||||
"appointment_status": appointmentStatus,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
import 'package:unit2/model/utils/category.dart';
|
||||
|
||||
class Agency {
|
||||
Agency({
|
||||
this.id,
|
||||
this.name,
|
||||
this.category,
|
||||
this.privateEntity,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final Category? category;
|
||||
final bool? privateEntity;
|
||||
|
||||
factory Agency.fromJson(Map<String, dynamic> json) => Agency(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
category: json["category"] == null ? null : Category.fromJson(json["category"]),
|
||||
privateEntity: json["private_entity"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"category": category?.toJson(),
|
||||
"private_entity": privateEntity,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
|
||||
import 'dart:convert';
|
||||
|
||||
|
||||
// To parse this JSON data, do
|
||||
//
|
||||
// final appoinemtStatus = appoinemtStatusFromJson(jsonString);
|
||||
AppoinemtStatus appoinemtStatusFromJson(String str) => AppoinemtStatus.fromJson(json.decode(str));
|
||||
|
||||
String appoinemtStatusToJson(AppoinemtStatus data) => json.encode(data.toJson());
|
||||
|
||||
class AppoinemtStatus {
|
||||
AppoinemtStatus({
|
||||
required this.value,
|
||||
required this.label,
|
||||
});
|
||||
|
||||
final String value;
|
||||
final String label;
|
||||
|
||||
factory AppoinemtStatus.fromJson(Map<String, dynamic> json) => AppoinemtStatus(
|
||||
value: json["value"],
|
||||
label: json["label"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"value": value,
|
||||
"label": label,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
import 'package:unit2/model/utils/industry_class.dart';
|
||||
|
||||
class Category {
|
||||
Category({
|
||||
this.id,
|
||||
this.name,
|
||||
this.industryClass,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final IndustryClass? industryClass;
|
||||
|
||||
factory Category.fromJson(Map<String, dynamic> json) => Category(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
industryClass: json["industry_class"] == null ? null : IndustryClass.fromJson(json["industry_class"]),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"industry_class": industryClass?.toJson(),
|
||||
};
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
// To parse this JSON data, do
|
||||
//
|
||||
// final eligibilities = eligibilitiesFromJson(jsonString);
|
||||
|
||||
import 'package:meta/meta.dart';
|
||||
import 'dart:convert';
|
||||
|
||||
Eligibility eligibilitiesFromJson(String str) => Eligibility.fromJson(json.decode(str));
|
||||
|
||||
String eligibilitiesToJson(Eligibility data) => json.encode(data.toJson());
|
||||
|
||||
class Eligibility {
|
||||
Eligibility({
|
||||
required this.id,
|
||||
required this.title,
|
||||
required this.type,
|
||||
});
|
||||
|
||||
final int id;
|
||||
final String title;
|
||||
final String type;
|
||||
|
||||
factory Eligibility.fromJson(Map<String, dynamic> json) => Eligibility(
|
||||
id: json["id"],
|
||||
title: json["title"],
|
||||
type: json["type"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"title": title,
|
||||
"type": type,
|
||||
};
|
||||
@override
|
||||
String toString() {
|
||||
return title;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
class IndustryClass {
|
||||
IndustryClass({
|
||||
this.id,
|
||||
this.name,
|
||||
this.description,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? name;
|
||||
final String? description;
|
||||
|
||||
factory IndustryClass.fromJson(Map<String, dynamic> json) => IndustryClass(
|
||||
id: json["id"],
|
||||
name: json["name"],
|
||||
description: json["description"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"name": name,
|
||||
"description": description,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
class Position {
|
||||
Position({
|
||||
this.id,
|
||||
this.title,
|
||||
});
|
||||
|
||||
final int? id;
|
||||
final String? title;
|
||||
|
||||
factory Position.fromJson(Map<String, dynamic> json) => Position(
|
||||
id: json["id"],
|
||||
title: json["title"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"title": title,
|
||||
};
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:unit2/bloc/profile/primary_information/address/address_bloc.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/basic_information/adress.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
import 'package:unit2/widgets/error_state.dart';
|
||||
|
||||
class AddressScreen extends StatelessWidget {
|
||||
|
||||
const AddressScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(adressScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: [AddLeading(onPressed: () {})],
|
||||
),
|
||||
body: ProgressHUD(
|
||||
child: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocConsumer<AddressBloc, AddressState>(
|
||||
listener: (context, state) {
|
||||
if (state is AddressLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is AddressLoadedState ||
|
||||
state is AddressErrorState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is AddressLoadedState) {
|
||||
if (state.addresses.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount: state.addresses.length,
|
||||
itemBuilder:
|
||||
(BuildContext context, int index) {
|
||||
String? subdivision =
|
||||
state.addresses[index].details ?? '';
|
||||
String category = state.addresses[index]
|
||||
.address!
|
||||
.category!
|
||||
.name!;
|
||||
String? barangay = state.addresses[index]
|
||||
.address!
|
||||
.barangay !=
|
||||
null
|
||||
? '${state.addresses[index].address!.barangay!.description!.toUpperCase()},'
|
||||
: '';
|
||||
String cityMunicipality = state.addresses[index]
|
||||
.address!
|
||||
.cityMunicipality!
|
||||
.description!;
|
||||
String province = state.addresses[index]
|
||||
.address!
|
||||
.cityMunicipality!
|
||||
.province!
|
||||
.description!;
|
||||
String region = state.addresses[index]
|
||||
.address!
|
||||
.cityMunicipality!
|
||||
.province!
|
||||
.region!
|
||||
.description!;
|
||||
return Column(
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
width: screenWidth,
|
||||
decoration: box1(),
|
||||
padding:
|
||||
const EdgeInsets.fromLTRB(
|
||||
8, 16, 0, 16),
|
||||
child: Row(children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Text(
|
||||
subdivision,
|
||||
style:
|
||||
Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 5,
|
||||
),
|
||||
Text(
|
||||
category,
|
||||
style:
|
||||
Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall,
|
||||
)
|
||||
],
|
||||
),
|
||||
const Divider(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
"$barangay $cityMunicipality, $province, $region",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.labelLarge,
|
||||
),
|
||||
],
|
||||
)),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
]),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const EmptyData(
|
||||
message:
|
||||
"You don't have address added. Please click + to add.");
|
||||
}
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/src/widgets/framework.dart';
|
||||
import 'package:flutter/src/widgets/placeholder.dart';
|
||||
import 'package:unit2/model/profile/basic_information/citizenship.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
|
||||
class CitizenShipScreen extends StatefulWidget {
|
||||
final List<Citizenship> citizenships;
|
||||
const CitizenShipScreen({super.key, required this.citizenships});
|
||||
|
||||
@override
|
||||
State<CitizenShipScreen> createState() => _CitizenShipScreenState();
|
||||
}
|
||||
|
||||
class _CitizenShipScreenState extends State<CitizenShipScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(citizenshipScreenTitle),centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
),
|
||||
body: widget.citizenships.isEmpty?
|
||||
Container(
|
||||
width: screenWidth,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[200],
|
||||
borderRadius: const BorderRadius.all(Radius.circular(12))),
|
||||
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text("Philippines",style: Theme.of(context).textTheme.titleLarge,),
|
||||
Text("Filipino",style: Theme.of(context).textTheme.titleSmall,)
|
||||
],
|
||||
|
||||
|
||||
),
|
||||
):Container()
|
||||
,
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,243 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:fluttericon/entypo_icons.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
|
||||
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||
import 'package:unit2/bloc/profile/primary_information/contact/contact_bloc.dart';
|
||||
import 'package:unit2/model/profile/basic_information/contact_information.dart';
|
||||
import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart';
|
||||
import 'package:unit2/sevices/profile/contact_services.dart';
|
||||
import 'package:unit2/theme-data.dart/btn-style.dart';
|
||||
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
|
||||
import '../../../../../theme-data.dart/colors.dart';
|
||||
|
||||
class AddContactInformationScreen extends StatefulWidget {
|
||||
final int profileId;
|
||||
final String token;
|
||||
const AddContactInformationScreen(
|
||||
{super.key, required this.profileId, required this.token});
|
||||
|
||||
@override
|
||||
State<AddContactInformationScreen> createState() =>
|
||||
_AddContactInformationScreenState();
|
||||
}
|
||||
|
||||
class _AddContactInformationScreenState
|
||||
extends State<AddContactInformationScreen> {
|
||||
final formKey = GlobalKey<FormBuilderState>();
|
||||
ServiceType? selectedServiceType;
|
||||
CommService? selectedCommServiceProvider;
|
||||
List<CommService> commServiceProviders = [];
|
||||
bool callServiceType = false;
|
||||
bool primaryaContact = false;
|
||||
bool active = false;
|
||||
String? numberMail;
|
||||
var mobileFormatter = MaskTextInputFormatter(
|
||||
mask: "+63 (###) ###-####",
|
||||
filter: {"#": RegExp(r"^[1-9][0-9]*$")},
|
||||
type: MaskAutoCompletionType.lazy,
|
||||
initialText: "0");
|
||||
|
||||
var landLineFormatter = MaskTextInputFormatter(
|
||||
mask: "(###) ###-###",
|
||||
filter: {"#": RegExp(r"^[0-9]")},
|
||||
type: MaskAutoCompletionType.lazy,
|
||||
initialText: "0");
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<ContactBloc, ContactState>(
|
||||
builder: (context, state) {
|
||||
if (state is ContactAddingState) {
|
||||
return FormBuilder(
|
||||
key: formKey,
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 24, horizontal: 12),
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
////Service Type
|
||||
FormBuilderDropdown<ServiceType>(
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
name: "service_type",
|
||||
items: state.serviceTypes
|
||||
.map<DropdownMenuItem<ServiceType>>(
|
||||
(ServiceType e) {
|
||||
return DropdownMenuItem<ServiceType>(
|
||||
value: e, child: Text(e.name!));
|
||||
}).toList(),
|
||||
decoration: normalTextFieldStyle("Service Type*", ""),
|
||||
onChanged: (var service) async {
|
||||
if (selectedServiceType != service) {
|
||||
selectedServiceType = service;
|
||||
setState(() {
|
||||
callServiceType = true;
|
||||
});
|
||||
commServiceProviders = await ContactService.instance
|
||||
.getServiceProvider(
|
||||
serviceTypeId: selectedServiceType!.id!);
|
||||
setState(() {
|
||||
setState(() {
|
||||
callServiceType = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
}),
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
////Service Provider
|
||||
SizedBox(
|
||||
height: 60,
|
||||
child: ModalProgressHUD(
|
||||
color: Colors.transparent,
|
||||
inAsyncCall: callServiceType,
|
||||
child: FormBuilderDropdown<CommService>(
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
name: "Service Provider",
|
||||
items: commServiceProviders.isEmpty
|
||||
? []
|
||||
: commServiceProviders
|
||||
.map<DropdownMenuItem<CommService>>(
|
||||
(CommService e) {
|
||||
return DropdownMenuItem<CommService>(
|
||||
value: e, child: Text(e.serviceProvider!.agency!.name!));
|
||||
}).toList(),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Communication Service *", ""),
|
||||
onChanged: (var serviceProvider) {
|
||||
selectedCommServiceProvider = serviceProvider;
|
||||
}),
|
||||
),
|
||||
),
|
||||
selectedServiceType != null
|
||||
? selectedServiceType?.id == 2
|
||||
//// Landline
|
||||
? FormBuilderTextField(
|
||||
inputFormatters: [landLineFormatter],
|
||||
name: 'number-mail',
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Landline number *",
|
||||
"(area code) xxx - xxxx"),
|
||||
)
|
||||
: selectedServiceType!.id == 1 ||
|
||||
selectedServiceType!.id == 19
|
||||
//// Mobile number
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
inputFormatters: [mobileFormatter],
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Mobile number *",
|
||||
"+63 (9xx) xxx - xxxx"),
|
||||
)
|
||||
: selectedServiceType!.id == 4
|
||||
////Social Media
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
validator:
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Account ID / Username *", ""),
|
||||
)
|
||||
: selectedServiceType!.id == 3
|
||||
////Email Address
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
validator:
|
||||
FormBuilderValidators.compose([
|
||||
FormBuilderValidators.email(
|
||||
errorText:
|
||||
"Input vaild email"),
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required")
|
||||
]),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Email Address*", ""),
|
||||
)
|
||||
: Container()
|
||||
: const SizedBox(),
|
||||
SizedBox(
|
||||
height: selectedServiceType != null ? 12 : 0,
|
||||
),
|
||||
//// Primary
|
||||
FormBuilderSwitch(
|
||||
initialValue: primaryaContact,
|
||||
activeColor: second,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
primaryaContact = value!;
|
||||
});
|
||||
},
|
||||
decoration: normalTextFieldStyle("Primary?", 'Primary?'),
|
||||
name: 'overseas',
|
||||
title: Text(primaryaContact ? "YES" : "NO"),
|
||||
),
|
||||
//// Active
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
FormBuilderSwitch(
|
||||
initialValue: primaryaContact,
|
||||
activeColor: second,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
active = value!;
|
||||
});
|
||||
},
|
||||
decoration: normalTextFieldStyle("Active?", ''),
|
||||
name: 'overseas',
|
||||
title: Text(active ? "YES" : "NO"),
|
||||
),
|
||||
const Expanded(child: SizedBox()),
|
||||
SizedBox(
|
||||
height: 60,
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
if (formKey.currentState!.saveAndValidate()) {
|
||||
|
||||
numberMail =
|
||||
formKey.currentState!.value['number-mail'];
|
||||
CommService commService = selectedCommServiceProvider!;
|
||||
ContactInfo contactInfo = ContactInfo(
|
||||
id: null,
|
||||
active: active,
|
||||
primary: primaryaContact,
|
||||
numbermail: numberMail,
|
||||
commService: commService);
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Loading...");
|
||||
context.read<ContactBloc>().add(AddContactInformation(contactInfo: contactInfo, profileId: widget.profileId, token: widget.token));
|
||||
}
|
||||
},
|
||||
style:
|
||||
mainBtnStyle(primary, Colors.transparent, second),
|
||||
child: const Text(submit),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
));
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,275 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:fluttericon/entypo_icons.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
|
||||
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||
import 'package:unit2/bloc/profile/primary_information/contact/contact_bloc.dart';
|
||||
import 'package:unit2/model/profile/basic_information/contact_information.dart';
|
||||
import 'package:unit2/screens/unit2/roles/qr_code_scanner.dart/components/custom_switch.dart';
|
||||
import 'package:unit2/sevices/profile/contact_services.dart';
|
||||
import 'package:unit2/theme-data.dart/btn-style.dart';
|
||||
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
|
||||
import '../../../../../theme-data.dart/colors.dart';
|
||||
|
||||
class EditContactInformationScreen extends StatefulWidget {
|
||||
final int profileId;
|
||||
final String token;
|
||||
const EditContactInformationScreen(
|
||||
{super.key, required this.profileId, required this.token});
|
||||
|
||||
@override
|
||||
State<EditContactInformationScreen> createState() =>
|
||||
_EditContactInformationScreenState();
|
||||
}
|
||||
|
||||
class _EditContactInformationScreenState
|
||||
extends State<EditContactInformationScreen> {
|
||||
final formKey = GlobalKey<FormBuilderState>();
|
||||
ServiceType? selectedServiceType;
|
||||
CommService? selectedCommProvider;
|
||||
List<CommService> commServiceProviders = [];
|
||||
String? numberMail;
|
||||
bool callServiceType = false;
|
||||
bool? primaryaContact;
|
||||
bool? active;
|
||||
|
||||
var mobileFormatter = MaskTextInputFormatter(
|
||||
mask: "+63 (###) ###-####",
|
||||
filter: {"#": RegExp(r"^[1-9][0-9]*$")},
|
||||
type: MaskAutoCompletionType.lazy,
|
||||
initialText: "0");
|
||||
|
||||
var landLineFormatter = MaskTextInputFormatter(
|
||||
mask: "(###) ###-###",
|
||||
filter: {"#": RegExp(r"^[0-9]")},
|
||||
type: MaskAutoCompletionType.lazy,
|
||||
initialText: "0");
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<ContactBloc, ContactState>(
|
||||
builder: (context, state) {
|
||||
if (state is ContactEditingState) {
|
||||
selectedServiceType = state.selectedServiceType;
|
||||
selectedCommProvider = state.selectedProvider;
|
||||
commServiceProviders = state.commServiceProviders;
|
||||
primaryaContact = state.contactInfo.primary!;
|
||||
active = state.contactInfo.active!;
|
||||
return FormBuilder(
|
||||
key: formKey,
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 24, horizontal: 12),
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
StatefulBuilder(builder: (context, setState) {
|
||||
return Column(children: [
|
||||
////Service Type
|
||||
DropdownButtonFormField<ServiceType>(
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
value: selectedServiceType,
|
||||
items: state.serviceTypes
|
||||
.map<DropdownMenuItem<ServiceType>>(
|
||||
(ServiceType e) {
|
||||
return DropdownMenuItem<ServiceType>(
|
||||
value: e, child: Text(e.name!));
|
||||
}).toList(),
|
||||
decoration:
|
||||
normalTextFieldStyle("Service Type*", ""),
|
||||
onChanged: (var service) async {
|
||||
if (selectedServiceType!.id != service!.id) {
|
||||
selectedServiceType = service;
|
||||
setState(() {
|
||||
callServiceType = true;
|
||||
});
|
||||
commServiceProviders = await ContactService.instance
|
||||
.getServiceProvider(
|
||||
serviceTypeId:
|
||||
selectedServiceType!.id!);
|
||||
selectedCommProvider = null;
|
||||
setState(() {
|
||||
setState(() {
|
||||
callServiceType = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
}),
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
////Service Provider
|
||||
SizedBox(
|
||||
height: 60,
|
||||
child: ModalProgressHUD(
|
||||
color: Colors.transparent,
|
||||
inAsyncCall: callServiceType,
|
||||
child: DropdownButtonFormField<CommService>(
|
||||
value: selectedCommProvider,
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
items: commServiceProviders.isEmpty
|
||||
? []
|
||||
: commServiceProviders
|
||||
.map<DropdownMenuItem<CommService>>(
|
||||
(CommService e) {
|
||||
return DropdownMenuItem<
|
||||
CommService>(
|
||||
value: e,
|
||||
child: Text(e.serviceProvider!.agency!.name!));
|
||||
}).toList(),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Communication Service *", ""),
|
||||
onChanged: (var commServiceProvider) {
|
||||
selectedCommProvider = commServiceProvider;
|
||||
}),
|
||||
),
|
||||
),
|
||||
selectedServiceType != null
|
||||
? selectedServiceType?.id == 2
|
||||
//// Landline
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
initialValue: state.contactInfo.numbermail,
|
||||
inputFormatters: [landLineFormatter],
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Landline number *",
|
||||
"(area code) xxx - xxxx"),
|
||||
)
|
||||
: selectedServiceType!.id == 1 ||
|
||||
selectedServiceType!.id == 19
|
||||
//// Mobile number
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
inputFormatters: [mobileFormatter],
|
||||
initialValue:
|
||||
state.contactInfo.numbermail,
|
||||
validator:
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Mobile number *",
|
||||
"+63 (9xx) xxx - xxxx"),
|
||||
)
|
||||
: selectedServiceType!.id == 4
|
||||
////Social Media
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
initialValue:
|
||||
state.contactInfo.numbermail,
|
||||
validator:
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Account ID / Username *", ""),
|
||||
)
|
||||
: selectedServiceType!.id == 3
|
||||
////Email Address
|
||||
? FormBuilderTextField(
|
||||
name: 'number-mail',
|
||||
initialValue: state
|
||||
.contactInfo.numbermail,
|
||||
validator: FormBuilderValidators
|
||||
.compose([
|
||||
FormBuilderValidators.email(
|
||||
errorText:
|
||||
"Input vaild email"),
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required")
|
||||
]),
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Email Address*", ""),
|
||||
)
|
||||
: Container()
|
||||
: const SizedBox(),
|
||||
]);
|
||||
}),
|
||||
SizedBox(
|
||||
height: selectedServiceType != null ? 12 : 0,
|
||||
),
|
||||
//// Primary
|
||||
StatefulBuilder(builder: (context, setState) {
|
||||
return FormBuilderSwitch(
|
||||
initialValue: primaryaContact,
|
||||
activeColor: second,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
primaryaContact = value;
|
||||
});
|
||||
},
|
||||
decoration: normalTextFieldStyle("", ''),
|
||||
name: 'overseas',
|
||||
title: const Text("Primary ?"),
|
||||
);
|
||||
}),
|
||||
//// Active
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
StatefulBuilder(builder: (context, setState) {
|
||||
return FormBuilderSwitch(
|
||||
initialValue: active,
|
||||
activeColor: second,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
active = value;
|
||||
});
|
||||
},
|
||||
decoration: normalTextFieldStyle("", ''),
|
||||
name: 'overseas',
|
||||
title: const Text("Active ?"),
|
||||
);
|
||||
}),
|
||||
const Expanded(child: SizedBox()),
|
||||
SizedBox(
|
||||
height: 60,
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
onPressed: () {
|
||||
if (formKey.currentState!.saveAndValidate()) {
|
||||
numberMail =
|
||||
formKey.currentState!.value['number-mail'];
|
||||
CommService commService = selectedCommProvider!;
|
||||
ContactInfo contactInfo = ContactInfo(
|
||||
id: state.contactInfo.id,
|
||||
active: active,
|
||||
primary: primaryaContact,
|
||||
numbermail: numberMail,
|
||||
commService: commService);
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Loading...");
|
||||
context.read<ContactBloc>().add(
|
||||
EditContactInformation(
|
||||
contactInfo: contactInfo,
|
||||
profileId: widget.profileId,
|
||||
token: widget.token));
|
||||
}
|
||||
},
|
||||
style:
|
||||
mainBtnStyle(primary, Colors.transparent, second),
|
||||
child: const Text(submit),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
));
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,369 @@
|
|||
import 'package:app_popup_menu/app_popup_menu.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:unit2/bloc/profile/primary_information/contact/contact_bloc.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/screens/profile/components/basic_information/contact_information/add_modal.dart';
|
||||
import 'package:unit2/screens/profile/components/basic_information/contact_information/edit_modal.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/alerts.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/Leadings/close_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
import 'package:unit2/widgets/error_state.dart';
|
||||
|
||||
class ContactInformationScreen extends StatelessWidget {
|
||||
const ContactInformationScreen({
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
int profileId;
|
||||
String token;
|
||||
return SafeArea(
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(contactScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: context.watch<ContactBloc>().state is ContactLoadedState? [
|
||||
AddLeading(onPressed: () {
|
||||
context.read<ContactBloc>().add(ShowAddForm());
|
||||
})
|
||||
]:( context.watch<ContactBloc>().state is ContactAddingState || context.watch<ContactBloc>().state is ContactEditingState)?[
|
||||
CloseLeading(onPressed: (){
|
||||
context.read<ContactBloc>().add(LoadContacts());
|
||||
})
|
||||
]:[]
|
||||
),
|
||||
body: ProgressHUD(
|
||||
padding: const EdgeInsets.all(24),
|
||||
backgroundColor: Colors.black87,
|
||||
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||
child: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
token = state.userData!.user!.login!.token!;
|
||||
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocConsumer<ContactBloc, ContactState>(
|
||||
listener: (context, state) {
|
||||
if (state is ContactLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is ContactLoadedState ||
|
||||
state is ContactErrorState ||
|
||||
state is ContactAddingState ||
|
||||
state is ContactEditingState ||
|
||||
state is ContactDeletedState ||
|
||||
state is ContactAddedState ||
|
||||
state is ContactEditedState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
////ADDED CONTACT STATE
|
||||
if (state is ContactAddedState) {
|
||||
if (state.response['success']) {
|
||||
successAlert(context, "Update Successfull!",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context.read<ContactBloc>().add(LoadContacts(
|
||||
));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Update Failed",
|
||||
"Something went wrong. Please try again.",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context.read<ContactBloc>().add(LoadContacts(
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////EDIT CONTACT STATE
|
||||
if (state is ContactEditedState) {
|
||||
if (state.response['success']) {
|
||||
successAlert(context, "Update Successfull!",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context.read<ContactBloc>().add(LoadContacts(
|
||||
));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Update Failed",
|
||||
"Something went wrong. Please try again.",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context.read<ContactBloc>().add(LoadContacts(
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
////DELETED STATE
|
||||
if (state is ContactDeletedState) {
|
||||
if (state.succcess) {
|
||||
successAlert(context, "Deletion Successfull",
|
||||
"Contact Info has been deleted successfully",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context.read<ContactBloc>().add(LoadContacts(
|
||||
));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Deletion Failed",
|
||||
"Error deleting Contact Info", () {
|
||||
Navigator.of(context).pop();
|
||||
context.read<ContactBloc>().add(LoadContacts(
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is ContactLoadedState) {
|
||||
if (state.contactInformation.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount: state.contactInformation.length,
|
||||
itemBuilder:
|
||||
(BuildContext context, int index) {
|
||||
String numberMail = state
|
||||
.contactInformation[index]
|
||||
.numbermail!;
|
||||
String commService = state
|
||||
.contactInformation[index]
|
||||
.commService!
|
||||
.serviceProvider!
|
||||
.alias!;
|
||||
return Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.fromLTRB(12, 12, 0, 12),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
numberMail,
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight.w500)),
|
||||
),
|
||||
state.contactInformation[index]
|
||||
.active ==
|
||||
true
|
||||
? const Badge(
|
||||
backgroundColor:
|
||||
Colors
|
||||
.green,
|
||||
label: Text(
|
||||
"Active",
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
const SizedBox(
|
||||
width: 5),
|
||||
state.contactInformation[index]
|
||||
.primary ==
|
||||
true
|
||||
? const Badge(
|
||||
backgroundColor:
|
||||
Colors
|
||||
.blue,
|
||||
label: Text(
|
||||
"Primary"),
|
||||
)
|
||||
: const SizedBox()
|
||||
],
|
||||
),
|
||||
const Divider(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Flexible(
|
||||
flex: 2,
|
||||
child: Text(
|
||||
commService
|
||||
.toString().toUpperCase(),
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleSmall,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
|
||||
child: Text(" - "),
|
||||
),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: Text(state
|
||||
.contactInformation[
|
||||
index]
|
||||
.commService!
|
||||
.serviceProvider!
|
||||
.agency!
|
||||
.name
|
||||
.toString()),
|
||||
),
|
||||
],
|
||||
),
|
||||
]),
|
||||
),
|
||||
AppPopupMenu<int>(
|
||||
offset:
|
||||
const Offset(-10, -10),
|
||||
elevation: 3,
|
||||
onSelected: (value) {
|
||||
////delete contact-= = = = = = = = =>>
|
||||
if (value == 2) {
|
||||
final progress =
|
||||
ProgressHUD.of(
|
||||
context);
|
||||
progress!.showWithText(
|
||||
"Loading...");
|
||||
confirmAlert(
|
||||
context,
|
||||
() => context
|
||||
.read<
|
||||
ContactBloc>()
|
||||
.add(DeleteContactInformation(
|
||||
contactInfo:
|
||||
state.contactInformation[
|
||||
index],
|
||||
profileId:
|
||||
profileId,
|
||||
token:
|
||||
token)),
|
||||
"Delete?",
|
||||
"Are you sure you want to delete this contact info?");
|
||||
}
|
||||
if (value == 1) {
|
||||
////edit contact-= = = = = = = = =>>
|
||||
context
|
||||
.read<ContactBloc>()
|
||||
.add(ShowEditForm(
|
||||
contactInfo: state
|
||||
.contactInformation[
|
||||
index]));
|
||||
final progress =
|
||||
ProgressHUD.of(
|
||||
context);
|
||||
progress!.showWithText(
|
||||
"Loading...");
|
||||
}
|
||||
},
|
||||
menuItems: [
|
||||
popMenuItem(
|
||||
text: "Edit",
|
||||
value: 1,
|
||||
icon: Icons.edit),
|
||||
popMenuItem(
|
||||
text: "Delete",
|
||||
value: 2,
|
||||
icon: Icons.delete),
|
||||
],
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
),
|
||||
tooltip: "Options",
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const EmptyData(
|
||||
message:
|
||||
"You don't have contact information added. Please click + to add");
|
||||
}
|
||||
}
|
||||
if (state is ContactAddingState) {
|
||||
return AddContactInformationScreen(
|
||||
profileId: profileId,
|
||||
token: token,
|
||||
);
|
||||
}
|
||||
if (state is ContactEditingState) {
|
||||
return EditContactInformationScreen(
|
||||
profileId: profileId, token: token);
|
||||
}
|
||||
if (state is ContactErrorState) {
|
||||
return SomethingWentWrong(
|
||||
message: state.message, onpressed: () {
|
||||
context.read<ContactBloc>().add(LoadContacts());
|
||||
});
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
),
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
PopupMenuItem<int> popMenuItem({String? text, int? value, IconData? icon}) {
|
||||
return PopupMenuItem(
|
||||
value: value,
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
icon,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(
|
||||
text!,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:unit2/bloc/profile/primary_information/identification/identification_bloc.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/model/profile/basic_information/identification_information.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
|
||||
import '../../../../bloc/user/user_bloc.dart';
|
||||
|
||||
class IdentificationsScreen extends StatelessWidget {
|
||||
const IdentificationsScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(identificationScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: [AddLeading(onPressed: () {})],
|
||||
),
|
||||
body: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocConsumer<IdentificationBloc,
|
||||
IdentificationState>(
|
||||
listener: (context, state) {},
|
||||
builder: (context, state) {
|
||||
if (state is IdentificationLoadedState) {
|
||||
if (state.identificationInformation.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount: state.identificationInformation.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
String agency =
|
||||
state.identificationInformation[index].agency!.name!;
|
||||
String idNumber =
|
||||
state.identificationInformation[index].identificationNumber!;
|
||||
bool government =
|
||||
state.identificationInformation[index].agency!.privateEntity!;
|
||||
String issuedAt =
|
||||
"${state.identificationInformation[index].issuedAt!.cityMunicipality!.description!} ${state.identificationInformation[index].issuedAt!.cityMunicipality!.province!.description}";
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(agency,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w400)),
|
||||
const Divider(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Row(children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
"$idNumberText : $idNumber",
|
||||
style:
|
||||
Theme.of(context)
|
||||
.textTheme
|
||||
.titleSmall,
|
||||
),
|
||||
),
|
||||
Badge(
|
||||
backgroundColor:
|
||||
success2,
|
||||
label: Text(
|
||||
government == true
|
||||
? privateText
|
||||
.toUpperCase()
|
||||
: governmentText
|
||||
.toUpperCase(),
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.bodySmall!
|
||||
.copyWith(
|
||||
color: Colors
|
||||
.white),
|
||||
))
|
||||
]),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(issuedAt),
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const EmptyData(
|
||||
message:
|
||||
"You don't have identifications added. Please click + to add.");
|
||||
}
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:unit2/model/profile/basic_information/primary-information.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
|
||||
class PrimaryInfo extends StatefulWidget {
|
||||
final PrimaryInformation primaryInformation;
|
||||
const PrimaryInfo({super.key, required this.primaryInformation});
|
||||
|
||||
@override
|
||||
State<PrimaryInfo> createState() => _PrimaryInfoState();
|
||||
}
|
||||
|
||||
class _PrimaryInfoState extends State<PrimaryInfo> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final _formKey = GlobalKey<FormBuilderState>();
|
||||
bool enabled = false;
|
||||
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(primaryInformationScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
),
|
||||
body: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 24, horizontal: 24),
|
||||
child: FormBuilder(
|
||||
child: Column(
|
||||
children: [
|
||||
FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: lastname,
|
||||
initialValue: widget.primaryInformation.lastName!,
|
||||
decoration: normalTextFieldStyle("Last name", ""),
|
||||
|
||||
),
|
||||
const SizedBox(height: 15,),
|
||||
FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: firstname,
|
||||
initialValue: widget.primaryInformation.firstName!,
|
||||
decoration: normalTextFieldStyle("First name", ""),
|
||||
),
|
||||
const SizedBox(height: 15,),
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
child: Row(children: [
|
||||
Flexible(
|
||||
flex: 2,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: middlename,
|
||||
initialValue: widget.primaryInformation.middleName!,
|
||||
decoration: normalTextFieldStyle("Middle name", ""),
|
||||
),),
|
||||
const SizedBox(width: 10,),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: extensionName,
|
||||
initialValue: widget.primaryInformation.nameExtension??='N/A',
|
||||
decoration: normalTextFieldStyle("Name extension", ""),
|
||||
),)
|
||||
]),
|
||||
|
||||
),
|
||||
const SizedBox(height: 15,),
|
||||
SizedBox(width: screenWidth,
|
||||
child: Row(children: [
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: extensionName,
|
||||
initialValue: dteFormat2.format(widget.primaryInformation.birthdate!),
|
||||
decoration: normalTextFieldStyle("Birth date", ""),
|
||||
),),
|
||||
const SizedBox(width: 10,),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: sex,
|
||||
initialValue: widget.primaryInformation.sex!,
|
||||
decoration: normalTextFieldStyle("Sex", ""),
|
||||
),)
|
||||
]),),
|
||||
const SizedBox(height: 15,),
|
||||
SizedBox(width: screenWidth,
|
||||
child: Row(children: [
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: bloodType,
|
||||
initialValue:widget.primaryInformation.bloodType!,
|
||||
decoration: normalTextFieldStyle("Blood type", ""),
|
||||
),),
|
||||
const SizedBox(width: 10,),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: civilStatus,
|
||||
initialValue: widget.primaryInformation.civilStatus!,
|
||||
decoration: normalTextFieldStyle("Civil Status", ""),
|
||||
),),
|
||||
const SizedBox(width: 10,),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: gender,
|
||||
initialValue:widget.primaryInformation.gender??="N/A",
|
||||
decoration: normalTextFieldStyle("Gender", ""),
|
||||
),),
|
||||
]),),
|
||||
|
||||
const SizedBox(height: 15,),
|
||||
SizedBox(width: screenWidth,
|
||||
child: Row(children: [
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: height,
|
||||
initialValue:widget.primaryInformation.heightM!.toString(),
|
||||
decoration: normalTextFieldStyle("Height", ""),
|
||||
),),
|
||||
const SizedBox(width: 10,),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: width,
|
||||
initialValue: widget.primaryInformation.weightKg!.toString(),
|
||||
decoration: normalTextFieldStyle("Weight", ""),
|
||||
),),
|
||||
const SizedBox(width: 10,),
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
enabled: enabled,
|
||||
name: prefixSuffix,
|
||||
initialValue:"${widget.primaryInformation.titlePrefix??="NA"} | ${widget.primaryInformation.titleSuffix??="N/A"}",
|
||||
decoration: normalTextFieldStyle("Title Prefix and Suffix", ""),
|
||||
),),
|
||||
]),),
|
||||
],
|
||||
)),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,222 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
|
||||
import 'package:unit2/model/profile/educational_background.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
import 'package:unit2/widgets/error_state.dart';
|
||||
|
||||
import '../../../bloc/profile/education/education_bloc.dart';
|
||||
|
||||
class EducationScreen extends StatelessWidget {
|
||||
const EducationScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(educationScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: [AddLeading(onPressed: () {})],
|
||||
),
|
||||
//userbloc
|
||||
body: ProgressHUD(
|
||||
padding: const EdgeInsets.all(24),
|
||||
backgroundColor: Colors.black87,
|
||||
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||
child: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
//profilebloc
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
//education bloc
|
||||
return BlocConsumer<EducationBloc, EducationState>(
|
||||
listener: (context, state) {
|
||||
if (state is EducationalBackgroundLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is EducationalBackgroundLoadedState ||
|
||||
state is EducationalBackgroundErrorState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is EducationalBackgroundLoadedState) {
|
||||
if (state.educationalBackground.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount: state.educationalBackground.length,
|
||||
itemBuilder:
|
||||
(BuildContext context, int index) {
|
||||
String level = state
|
||||
.educationalBackground[index]
|
||||
.education!
|
||||
.level!;
|
||||
String periodFrom = state
|
||||
.educationalBackground[index]
|
||||
.periodFrom!;
|
||||
String periodTo = state
|
||||
.educationalBackground[index].periodTo!;
|
||||
String? program = state
|
||||
.educationalBackground[index]
|
||||
.education!
|
||||
.course ==
|
||||
null
|
||||
? null
|
||||
: state.educationalBackground[index]
|
||||
.education!.course!.program!;
|
||||
List<Honor>? honors = state
|
||||
.educationalBackground[index].honors!
|
||||
.toList();
|
||||
String school = state
|
||||
.educationalBackground[index]
|
||||
.education!
|
||||
.school!
|
||||
.name!;
|
||||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
level,
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500),
|
||||
)),
|
||||
Text(
|
||||
"$periodFrom - ",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.bodyMedium,
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
school,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleSmall,
|
||||
),
|
||||
Container(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.only(top: 8),
|
||||
child: honors
|
||||
.isNotEmpty
|
||||
? Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
const Text(
|
||||
" : ",
|
||||
style: TextStyle(
|
||||
fontWeight:
|
||||
FontWeight.w600),
|
||||
),
|
||||
Column(
|
||||
children: honors
|
||||
.map((Honor honor) =>
|
||||
Text(" - ${honor.name!}"))
|
||||
.toList(),
|
||||
),
|
||||
],
|
||||
)
|
||||
: const SizedBox()),
|
||||
program == null
|
||||
? const SizedBox()
|
||||
: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(program),
|
||||
],
|
||||
),
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const EmptyData(
|
||||
message:
|
||||
"You don't have any Educational Background added. Please click + to add.");
|
||||
}
|
||||
}
|
||||
if (state is EducationalBackgroundErrorState) {
|
||||
return SomethingWentWrong(
|
||||
message: state.message, onpressed: () {});
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,485 @@
|
|||
import 'package:date_time_picker/date_time_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/eligibility.dart';
|
||||
|
||||
import '../../../../bloc/profile/eligibility/eligibility_bloc.dart';
|
||||
import '../../../../model/location/city.dart';
|
||||
import '../../../../model/location/country.dart';
|
||||
import '../../../../model/location/provinces.dart';
|
||||
import '../../../../model/location/region.dart';
|
||||
import '../../../../model/utils/eligibility.dart';
|
||||
import '../../../../theme-data.dart/btn-style.dart';
|
||||
import '../../../../theme-data.dart/colors.dart';
|
||||
import '../../../../theme-data.dart/form-style.dart';
|
||||
import '../../../../utils/global.dart';
|
||||
import '../../../../utils/location_utilities.dart';
|
||||
import '../../../../utils/text_container.dart';
|
||||
|
||||
class AddEligibilityScreen extends StatefulWidget {
|
||||
const AddEligibilityScreen(
|
||||
{super.key, required this.profileId, required this.token});
|
||||
final int profileId;
|
||||
final String token;
|
||||
|
||||
@override
|
||||
State<AddEligibilityScreen> createState() => _AddEligibilityScreenState();
|
||||
}
|
||||
|
||||
class _AddEligibilityScreenState extends State<AddEligibilityScreen> {
|
||||
final formKey = GlobalKey<FormBuilderState>();
|
||||
bool? overseas = false;
|
||||
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||
Region? selectedRegion;
|
||||
Province? selectedProvince;
|
||||
CityMunicipality? selectedMunicipality;
|
||||
Country? selectedCountry;
|
||||
Eligibility? selectedEligibility;
|
||||
List<Province>? provinces;
|
||||
List<CityMunicipality>? citymuns;
|
||||
bool provinceCall = false;
|
||||
bool cityCall = false;
|
||||
final examDateController = TextEditingController();
|
||||
final validityDateController = TextEditingController();
|
||||
String? token;
|
||||
String? profileId;
|
||||
String? rating;
|
||||
String? license;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<EligibilityBloc, EligibilityState>(
|
||||
buildWhen: (previous, current) {
|
||||
return false;
|
||||
},
|
||||
builder: (context, state) {
|
||||
////ADD ELIGIBILITY STATE
|
||||
if (state is AddEligibilityState) {
|
||||
return SingleChildScrollView(
|
||||
child: SizedBox(
|
||||
height: screenHeight * .95,
|
||||
child: ProgressHUD(
|
||||
child: Center(
|
||||
child: Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 25, horizontal: 18),
|
||||
child: FormBuilder(
|
||||
key: formKey,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
////ELIGIBILITIES DROPDOWN
|
||||
FormBuilderDropdown<Eligibility>(
|
||||
onChanged: (Eligibility? eligibility) {
|
||||
selectedEligibility = eligibility;
|
||||
},
|
||||
autovalidateMode:
|
||||
AutovalidateMode.onUserInteraction,
|
||||
validator: (value) =>
|
||||
value == null ? 'required' : null,
|
||||
items: state.eligibilities
|
||||
.map<DropdownMenuItem<Eligibility>>(
|
||||
(Eligibility eligibility) {
|
||||
return DropdownMenuItem<Eligibility>(
|
||||
value: eligibility,
|
||||
child: Text(eligibility.title));
|
||||
}).toList(),
|
||||
name: "eligibility",
|
||||
decoration: normalTextFieldStyle(
|
||||
"Eligibility", "Eligibility")),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
////LICENSE NUMBER
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
onChanged: (value) {
|
||||
license = value;
|
||||
},
|
||||
name: 'license_number',
|
||||
decoration: normalTextFieldStyle(
|
||||
"license number", "license number"),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
////RATING
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
keyboardType:
|
||||
const TextInputType.numberWithOptions(),
|
||||
onChanged: (value) {
|
||||
rating = value;
|
||||
},
|
||||
name: 'rating',
|
||||
decoration: normalTextFieldStyle(
|
||||
'rating %', 'rating'),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
////EXAM DATE
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: DateTimePicker(
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
use24HourFormat: false,
|
||||
icon: const Icon(Icons.date_range),
|
||||
controller: examDateController,
|
||||
firstDate: DateTime(1970),
|
||||
lastDate: DateTime(2100),
|
||||
timeHintText:
|
||||
"Date of Examination/Conferment",
|
||||
decoration:
|
||||
normalTextFieldStyle("Exam date", "")
|
||||
.copyWith(
|
||||
prefixIcon: const Icon(
|
||||
Icons.date_range,
|
||||
color: Colors.black87,
|
||||
)),
|
||||
initialValue: null,
|
||||
)),
|
||||
const SizedBox(
|
||||
width: 8,
|
||||
),
|
||||
////VALIDITY DATE
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: DateTimePicker(
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: "This field is required"),
|
||||
controller: validityDateController,
|
||||
firstDate: DateTime(1970),
|
||||
lastDate: DateTime(2100),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Validity date", "Validity date")
|
||||
.copyWith(
|
||||
prefixIcon: const Icon(
|
||||
Icons.date_range,
|
||||
color: Colors.black87,
|
||||
)),
|
||||
initialValue: null,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
Text(
|
||||
"Placement of Examination/Conferment",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.displaySmall!
|
||||
.copyWith(fontSize: blockSizeVertical * 2),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
////OVERSEAS ADDRESS SWITCH
|
||||
Column(
|
||||
children: [
|
||||
FormBuilderSwitch(
|
||||
validator: FormBuilderValidators.required(
|
||||
errorText: 'This field is required'),
|
||||
initialValue: overseas,
|
||||
activeColor: second,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
overseas = value;
|
||||
});
|
||||
},
|
||||
decoration: normalTextFieldStyle("", ''),
|
||||
name: 'overseas',
|
||||
title: const Text("Overseas Address?"),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
////COUNTRY DROPDOWN
|
||||
SizedBox(
|
||||
child: overseas == true
|
||||
? FormBuilderDropdown<Country>(
|
||||
initialValue: null,
|
||||
validator:
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
items: state.countries
|
||||
.map<DropdownMenuItem<Country>>(
|
||||
(Country country) {
|
||||
return DropdownMenuItem<Country>(
|
||||
value: country,
|
||||
child: FittedBox(
|
||||
child: Text(country.name!)));
|
||||
}).toList(),
|
||||
name: 'country',
|
||||
decoration: normalTextFieldStyle(
|
||||
"Country*", "Country"),
|
||||
onChanged: (Country? value) {
|
||||
selectedCountry = value;
|
||||
},
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
////REGION DROPDOWN
|
||||
FormBuilderDropdown<Region?>(
|
||||
autovalidateMode: AutovalidateMode
|
||||
.onUserInteraction,
|
||||
validator:
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
//// region onchange
|
||||
onChanged: (Region? region) async {
|
||||
|
||||
if(selectedRegion != region){
|
||||
setState(() {
|
||||
provinceCall = true;
|
||||
});
|
||||
selectedRegion = region;
|
||||
getProvinces();
|
||||
}
|
||||
},
|
||||
initialValue: selectedRegion,
|
||||
decoration: normalTextFieldStyle(
|
||||
"Region*", "Region"),
|
||||
name: 'region',
|
||||
items: state.regions
|
||||
.map<DropdownMenuItem<Region>>(
|
||||
(Region region) {
|
||||
return DropdownMenuItem<Region>(
|
||||
value: region,
|
||||
child: Text(
|
||||
region.description!));
|
||||
}).toList(),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
////PROVINCE DROPDOWN
|
||||
SizedBox(
|
||||
height: 70,
|
||||
child: ModalProgressHUD(
|
||||
color: Colors.transparent,
|
||||
inAsyncCall: provinceCall,
|
||||
child: DropdownButtonFormField<
|
||||
Province?>(
|
||||
autovalidateMode:
|
||||
AutovalidateMode
|
||||
.onUserInteraction,
|
||||
validator: (value) =>
|
||||
value == null
|
||||
? 'required'
|
||||
: null,
|
||||
isExpanded: true,
|
||||
value: selectedProvince,
|
||||
onChanged:
|
||||
(Province? province) {
|
||||
|
||||
if(selectedProvince != province){
|
||||
setState(() {
|
||||
cityCall = true;
|
||||
});
|
||||
selectedProvince = province;
|
||||
getCities();
|
||||
}
|
||||
},
|
||||
items: provinces == null
|
||||
? []
|
||||
: provinces!.map<
|
||||
DropdownMenuItem<
|
||||
Province>>(
|
||||
(Province province) {
|
||||
return DropdownMenuItem(
|
||||
value: province,
|
||||
child: FittedBox(
|
||||
child: Text(province
|
||||
.description!),
|
||||
));
|
||||
}).toList(),
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Province*",
|
||||
"Province")),
|
||||
),
|
||||
),
|
||||
|
||||
//// CityMunicipalities dropdown
|
||||
SizedBox(
|
||||
height: 60,
|
||||
child: ModalProgressHUD(
|
||||
color: Colors.white,
|
||||
inAsyncCall: cityCall,
|
||||
child: DropdownButtonFormField<
|
||||
CityMunicipality>(
|
||||
validator: (value) =>
|
||||
value == null
|
||||
? 'required'
|
||||
: null,
|
||||
isExpanded: true,
|
||||
onChanged:
|
||||
(CityMunicipality? city) {
|
||||
selectedMunicipality = city;
|
||||
},
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Municipality*",
|
||||
"Municipality"),
|
||||
value: selectedMunicipality,
|
||||
items: citymuns == null
|
||||
? []
|
||||
: citymuns!.map<
|
||||
DropdownMenuItem<
|
||||
CityMunicipality>>(
|
||||
(CityMunicipality c) {
|
||||
return DropdownMenuItem(
|
||||
value: c,
|
||||
child: Text(c
|
||||
.description!));
|
||||
}).toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
)),
|
||||
],
|
||||
),
|
||||
|
||||
const Expanded(
|
||||
child: SizedBox(),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
height: 60,
|
||||
child: ElevatedButton(
|
||||
style: mainBtnStyle(
|
||||
primary, Colors.transparent, second),
|
||||
onPressed: () {
|
||||
//rating
|
||||
double? rate = rating == null
|
||||
? null
|
||||
: double.parse(rating!);
|
||||
//lisence
|
||||
String? licenseNumber = license;
|
||||
CityMunicipality? cityMunicipality =
|
||||
selectedMunicipality;
|
||||
DateTime? examDate = examDateController
|
||||
.text.isEmpty
|
||||
? null
|
||||
: DateTime.parse(examDateController.text);
|
||||
DateTime? validityDate =
|
||||
validityDateController.text.isEmpty
|
||||
? null
|
||||
: DateTime.parse(
|
||||
validityDateController.text);
|
||||
|
||||
ExamAddress examAddress = ExamAddress(
|
||||
barangay: null,
|
||||
id: null,
|
||||
addressCategory: null,
|
||||
examAddressClass: null,
|
||||
country: selectedCountry ??
|
||||
Country(
|
||||
id: 175,
|
||||
name: 'Philippines',
|
||||
code: 'PH'),
|
||||
cityMunicipality: cityMunicipality);
|
||||
EligibityCert eligibityCert = EligibityCert(
|
||||
id: null,
|
||||
rating: rate,
|
||||
examDate: examDate,
|
||||
attachments: null,
|
||||
eligibility: selectedEligibility,
|
||||
examAddress: examAddress,
|
||||
validityDate: validityDate,
|
||||
licenseNumber: licenseNumber,
|
||||
overseas: overseas);
|
||||
if (formKey.currentState!.saveAndValidate()) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Loading...");
|
||||
context.read<EligibilityBloc>().add(
|
||||
AddEligibility(
|
||||
eligibityCert: eligibityCert,
|
||||
profileId:
|
||||
widget.profileId.toString(),
|
||||
token: widget.token));
|
||||
}
|
||||
// context.read<ProfileBloc>().add(AddEligibility(eligibityCert: eligibityCert, profileId: profileId, token: token))
|
||||
},
|
||||
child: const Text(submit)),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
]),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> getProvinces() async {
|
||||
try {
|
||||
List<Province> newProvinces = await LocationUtils.instance
|
||||
.getProvinces(regionCode: selectedRegion!.code.toString());
|
||||
setState(() {
|
||||
provinces = newProvinces;
|
||||
selectedProvince = provinces![0];
|
||||
provinceCall = false;
|
||||
cityCall = true;
|
||||
getCities();
|
||||
});
|
||||
} catch (e) {
|
||||
context.read<EligibilityBloc>().add(CallErrorState());
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getCities() async {
|
||||
try {
|
||||
List<CityMunicipality> newCities = await LocationUtils.instance
|
||||
.getCities(code: selectedProvince!.code.toString());
|
||||
citymuns = newCities;
|
||||
setState(() {
|
||||
selectedMunicipality = newCities[0];
|
||||
cityCall = false;
|
||||
});
|
||||
} catch (e) {
|
||||
context.read<EligibilityBloc>().add(CallErrorState());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,542 @@
|
|||
import 'package:date_time_picker/date_time_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
|
||||
import 'package:unit2/model/location/city.dart';
|
||||
import 'package:unit2/model/profile/eligibility.dart';
|
||||
import 'package:unit2/model/utils/eligibility.dart';
|
||||
import 'package:unit2/utils/location_utilities.dart';
|
||||
import '../../../../bloc/profile/eligibility/eligibility_bloc.dart';
|
||||
import '../../../../model/location/country.dart';
|
||||
import '../../../../model/location/region.dart';
|
||||
import '../../../../model/location/provinces.dart';
|
||||
import '../../../../theme-data.dart/btn-style.dart';
|
||||
import '../../../../theme-data.dart/colors.dart';
|
||||
import '../../../../theme-data.dart/form-style.dart';
|
||||
import '../../../../utils/global.dart';
|
||||
import '../../../../utils/text_container.dart';
|
||||
|
||||
class EditEligibilityScreen extends StatefulWidget {
|
||||
final EligibityCert eligibityCert;
|
||||
final int profileId;
|
||||
final String token;
|
||||
const EditEligibilityScreen({super.key, required this.eligibityCert, required this.profileId, required this.token});
|
||||
|
||||
@override
|
||||
State<EditEligibilityScreen> createState() => _EditEligibilityScreenState();
|
||||
}
|
||||
|
||||
class _EditEligibilityScreenState extends State<EditEligibilityScreen> {
|
||||
final formKey = GlobalKey<FormBuilderState>();
|
||||
final provinceKey = GlobalKey<FormBuilderState>();
|
||||
bool? overseas;
|
||||
List<Province>? provinces;
|
||||
List<CityMunicipality>? citymuns;
|
||||
List<Region>? regions;
|
||||
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||
Region? selectedRegion;
|
||||
Province? selectedProvince;
|
||||
CityMunicipality? selectedMunicipality;
|
||||
Country? selectedCountry;
|
||||
Eligibility? selectedEligibility;
|
||||
bool provinceCall = false;
|
||||
bool cityCall = false;
|
||||
String? token;
|
||||
String? profileId;
|
||||
String? rating;
|
||||
String? license;
|
||||
final examDateController = TextEditingController();
|
||||
final validityDateController = TextEditingController();
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return BlocBuilder<EligibilityBloc, EligibilityState>(
|
||||
buildWhen: (previous, current) {
|
||||
|
||||
return false;
|
||||
},
|
||||
builder: (context, state) {
|
||||
//EDIT ELIGIBILITY STATE
|
||||
if (state is EditEligibilityState) {
|
||||
examDateController.text =
|
||||
state.eligibityCert.examDate == null
|
||||
? ''
|
||||
: state.eligibityCert.examDate.toString();
|
||||
validityDateController.text =
|
||||
state.eligibityCert.validityDate == null
|
||||
? ''
|
||||
: state.eligibityCert.validityDate.toString();
|
||||
|
||||
provinces = state.provinces;
|
||||
citymuns = state.cities;
|
||||
regions = state.regions;
|
||||
overseas = state.isOverseas;
|
||||
selectedRegion = state.currentRegion;
|
||||
selectedProvince = state.currentProvince;
|
||||
selectedMunicipality = state.currentCity;
|
||||
selectedEligibility = state.currentEligibility;
|
||||
rating = state.eligibityCert.rating?.toString();
|
||||
license = state.eligibityCert.licenseNumber;
|
||||
return Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 25, horizontal: 18),
|
||||
child: FormBuilder(
|
||||
key: formKey,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
////ELIGIBILITIES DROPDOWN
|
||||
DropdownButtonFormField<Eligibility>(
|
||||
validator: (value) =>
|
||||
value == null ? 'required' : null,
|
||||
isExpanded: true,
|
||||
onChanged: (Eligibility? eligibility) {
|
||||
selectedEligibility = eligibility;
|
||||
},
|
||||
value: selectedEligibility,
|
||||
items: state.eligibilities
|
||||
.map<DropdownMenuItem<Eligibility>>(
|
||||
(Eligibility eligibility) {
|
||||
return DropdownMenuItem<Eligibility>(
|
||||
value: eligibility,
|
||||
child: Text(eligibility.title));
|
||||
}).toList(),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Eligibility", "")),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
////LICENSE NUMBER
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
onChanged: (value) {
|
||||
license = value;
|
||||
},
|
||||
name: 'license_number',
|
||||
initialValue: license,
|
||||
decoration: normalTextFieldStyle(
|
||||
"license number",
|
||||
"license number"),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
// //RATING
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: FormBuilderTextField(
|
||||
keyboardType: const TextInputType
|
||||
.numberWithOptions(),
|
||||
onChanged: (value) {
|
||||
rating = value;
|
||||
},
|
||||
name: 'rating',
|
||||
initialValue: rating == null
|
||||
? 'N/A'
|
||||
: rating.toString(),
|
||||
decoration: normalTextFieldStyle(
|
||||
'rating', 'rating'),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
// //EXAM DATE
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: DateTimePicker(
|
||||
validator: FormBuilderValidators.required(errorText: "This field is required"),
|
||||
use24HourFormat: false,
|
||||
controller: examDateController,
|
||||
firstDate: DateTime(1970),
|
||||
lastDate: DateTime(2100),
|
||||
decoration: normalTextFieldStyle(
|
||||
"Exam date", "")
|
||||
.copyWith(
|
||||
prefixIcon: const Icon(
|
||||
Icons.date_range,
|
||||
color: Colors.black87,
|
||||
)),
|
||||
)),
|
||||
const SizedBox(
|
||||
width: 12,
|
||||
),
|
||||
////VALIDITY DATE
|
||||
Flexible(
|
||||
flex: 1,
|
||||
child: DateTimePicker(
|
||||
validator: FormBuilderValidators.required(errorText: "This field is required"),
|
||||
|
||||
use24HourFormat: false,
|
||||
controller: validityDateController,
|
||||
firstDate: DateTime(1970),
|
||||
lastDate: DateTime(2100),
|
||||
decoration: normalTextFieldStyle(
|
||||
"validity date", "")
|
||||
.copyWith(
|
||||
prefixIcon: const Icon(
|
||||
Icons.date_range,
|
||||
color: Colors.black87,
|
||||
)),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
Text(
|
||||
"Placement of Examination/Confinement",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.displaySmall!
|
||||
.copyWith(
|
||||
fontSize: blockSizeVertical * 2),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
//OVERSEAS ADDRESS SWITCH
|
||||
StatefulBuilder(
|
||||
builder: (context, StateSetter setState) {
|
||||
return Column(
|
||||
children: [
|
||||
FormBuilderSwitch(
|
||||
initialValue: overseas,
|
||||
activeColor: second,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
overseas = value;
|
||||
});
|
||||
},
|
||||
decoration:
|
||||
normalTextFieldStyle("", ''),
|
||||
name: 'overseas',
|
||||
title: const Text("Overseas Address?"),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
//COUNTRY DROPDOWN
|
||||
SizedBox(
|
||||
child: overseas == true
|
||||
? FormBuilderDropdown<Country>(
|
||||
validator: (value) =>
|
||||
value == null
|
||||
? 'required'
|
||||
: null,
|
||||
initialValue:
|
||||
state.selectedCountry,
|
||||
items: state.countries.map<
|
||||
DropdownMenuItem<
|
||||
Country>>(
|
||||
(Country country) {
|
||||
return DropdownMenuItem<
|
||||
Country>(
|
||||
value: country,
|
||||
child: FittedBox(
|
||||
child: Text(country
|
||||
.name!)));
|
||||
}).toList(),
|
||||
name: 'country',
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Country*",
|
||||
"Country"),
|
||||
onChanged: (Country? value) {
|
||||
selectedCountry = value;
|
||||
},
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
//REGION DROPDOWN
|
||||
DropdownButtonFormField<
|
||||
Region?>(
|
||||
validator: (value) =>
|
||||
value == null
|
||||
? 'required'
|
||||
: null,
|
||||
isExpanded: true,
|
||||
onChanged: (Region?
|
||||
region) async {
|
||||
setState(() {
|
||||
provinceCall = true;
|
||||
});
|
||||
selectedRegion = region;
|
||||
provinces = await LocationUtils
|
||||
.instance
|
||||
.getProvinces(
|
||||
regionCode:
|
||||
selectedRegion!
|
||||
.code
|
||||
.toString());
|
||||
selectedProvince =
|
||||
provinces![0];
|
||||
setState(() {
|
||||
provinceCall = false;
|
||||
cityCall = true;
|
||||
});
|
||||
citymuns = await LocationUtils
|
||||
.instance
|
||||
.getCities(
|
||||
code:
|
||||
selectedProvince!
|
||||
.code!);
|
||||
selectedMunicipality =
|
||||
citymuns![0];
|
||||
setState(() {
|
||||
cityCall = false;
|
||||
});
|
||||
},
|
||||
value: selectedRegion,
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Region*",
|
||||
"Region"),
|
||||
items: regions == null
|
||||
? []
|
||||
: regions!.map<
|
||||
DropdownMenuItem<
|
||||
Region>>((Region
|
||||
region) {
|
||||
return DropdownMenuItem<
|
||||
Region>(
|
||||
value: region,
|
||||
child: Text(region
|
||||
.description!));
|
||||
}).toList(),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
////PROVINCE DROPDOWN
|
||||
SizedBox(
|
||||
height: 70,
|
||||
child: ModalProgressHUD(
|
||||
color:
|
||||
Colors.transparent,
|
||||
inAsyncCall:
|
||||
provinceCall,
|
||||
child: DropdownButtonFormField<
|
||||
Province?>(
|
||||
validator: (value) =>
|
||||
value == null
|
||||
? 'required'
|
||||
: null,
|
||||
isExpanded: true,
|
||||
value:
|
||||
selectedProvince,
|
||||
onChanged: (Province?
|
||||
province) async {
|
||||
setState(() {
|
||||
cityCall = true;
|
||||
});
|
||||
selectedProvince =
|
||||
province;
|
||||
citymuns = await LocationUtils
|
||||
.instance
|
||||
.getCities(
|
||||
code: selectedProvince!
|
||||
.code
|
||||
.toString());
|
||||
selectedMunicipality =
|
||||
citymuns![0];
|
||||
setState(() {
|
||||
cityCall =
|
||||
false;
|
||||
});
|
||||
},
|
||||
items: provinces ==
|
||||
null
|
||||
? []
|
||||
: provinces!.map<
|
||||
DropdownMenuItem<
|
||||
Province>>((Province
|
||||
province) {
|
||||
return DropdownMenuItem(
|
||||
value:
|
||||
province,
|
||||
child:
|
||||
FittedBox(
|
||||
child:
|
||||
Text(province.description!),
|
||||
));
|
||||
}).toList(),
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Province*",
|
||||
"Province")),
|
||||
),
|
||||
),
|
||||
|
||||
//// City municipality
|
||||
SizedBox(
|
||||
height: 70,
|
||||
child: ModalProgressHUD(
|
||||
color:
|
||||
Colors.transparent,
|
||||
inAsyncCall: cityCall,
|
||||
child:
|
||||
DropdownButtonFormField<
|
||||
CityMunicipality>(
|
||||
validator: (value) =>
|
||||
value == null
|
||||
? 'required'
|
||||
: null,
|
||||
isExpanded: true,
|
||||
onChanged:
|
||||
(CityMunicipality?
|
||||
city) {
|
||||
selectedMunicipality =
|
||||
city;
|
||||
},
|
||||
decoration:
|
||||
normalTextFieldStyle(
|
||||
"Municipality*",
|
||||
"Municipality"),
|
||||
value:
|
||||
selectedMunicipality,
|
||||
items: citymuns ==
|
||||
null
|
||||
? []
|
||||
: citymuns!.map<
|
||||
DropdownMenuItem<
|
||||
CityMunicipality>>(
|
||||
(CityMunicipality
|
||||
c) {
|
||||
return DropdownMenuItem(
|
||||
value: c,
|
||||
child: Text(
|
||||
c.description!));
|
||||
}).toList(),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
],
|
||||
)),
|
||||
],
|
||||
);
|
||||
}),
|
||||
|
||||
const Expanded(
|
||||
child: SizedBox(),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
width: screenWidth,
|
||||
height: 60,
|
||||
child: ElevatedButton(
|
||||
style: mainBtnStyle(
|
||||
primary, Colors.transparent, second),
|
||||
onPressed: () {
|
||||
////rating
|
||||
double? rate = rating == null
|
||||
? null
|
||||
: double.parse(rating!);
|
||||
////license
|
||||
String? newLicense = license;
|
||||
////city municipality
|
||||
CityMunicipality? cityMunicipality =
|
||||
selectedMunicipality;
|
||||
////exam date
|
||||
DateTime? examDate =
|
||||
examDateController.text.isEmpty
|
||||
? null
|
||||
: DateTime.parse(
|
||||
examDateController.text);
|
||||
// // validity date
|
||||
DateTime? validityDate =
|
||||
validityDateController.text.isEmpty
|
||||
? null
|
||||
: DateTime.parse(
|
||||
validityDateController
|
||||
.text);
|
||||
//// exam address
|
||||
ExamAddress examAddress = ExamAddress(
|
||||
barangay: state.eligibityCert
|
||||
.examAddress?.barangay,
|
||||
id: state
|
||||
.eligibityCert.examAddress?.id,
|
||||
addressCategory: state.eligibityCert
|
||||
.examAddress?.addressCategory,
|
||||
examAddressClass: state
|
||||
.eligibityCert
|
||||
.examAddress
|
||||
?.examAddressClass,
|
||||
country: selectedCountry ??=
|
||||
Country(
|
||||
id: 175,
|
||||
name: 'Philippines',
|
||||
code: 'PH'),
|
||||
cityMunicipality: cityMunicipality);
|
||||
EligibityCert eligibityCert =
|
||||
EligibityCert(
|
||||
id: state.eligibityCert.id,
|
||||
rating: rate,
|
||||
examDate: examDate,
|
||||
attachments: null,
|
||||
eligibility:
|
||||
selectedEligibility,
|
||||
examAddress: examAddress,
|
||||
validityDate: validityDate,
|
||||
licenseNumber: newLicense,
|
||||
overseas: overseas);
|
||||
if (formKey.currentState!
|
||||
.saveAndValidate()) {
|
||||
final progress =
|
||||
ProgressHUD.of(
|
||||
context);
|
||||
progress!.showWithText(
|
||||
"Loading...");
|
||||
context.read<EligibilityBloc>().add(
|
||||
UpdateEligibility(
|
||||
eligibityCert: eligibityCert,
|
||||
oldEligibility: state
|
||||
.eligibityCert
|
||||
.eligibility!
|
||||
.id,
|
||||
profileId:widget.profileId.toString(),
|
||||
token: widget.token));
|
||||
}
|
||||
},
|
||||
child: const Text(submit)),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
]),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,375 @@
|
|||
import 'package:app_popup_menu/app_popup_menu.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:fluttericon/font_awesome_icons.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/eligibility.dart';
|
||||
import 'package:unit2/screens/profile/components/eligibility/add_modal.dart';
|
||||
import 'package:unit2/screens/profile/components/eligibility/edit_modal.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/Leadings/close_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
import 'package:unit2/widgets/error_state.dart';
|
||||
import '../../../bloc/profile/eligibility/eligibility_bloc.dart';
|
||||
import '../../../utils/alerts.dart';
|
||||
|
||||
class EligibiltyScreen extends StatelessWidget {
|
||||
const EligibiltyScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
String? token;
|
||||
int? profileId;
|
||||
|
||||
return WillPopScope(
|
||||
onWillPop: () async {
|
||||
return true;
|
||||
},
|
||||
child: Scaffold(
|
||||
resizeToAvoidBottomInset: true,
|
||||
appBar: AppBar(
|
||||
title: context.watch<EligibilityBloc>().state is AddEligibilityState
|
||||
? const Text("Add Eligiblity")
|
||||
: context.watch<EligibilityBloc>().state is EditEligibilityState
|
||||
? const Text("Edit Eligibilty")
|
||||
: const Text(elibilityScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: (context.watch<EligibilityBloc>().state is EligibilityLoaded)
|
||||
|
||||
? [
|
||||
AddLeading(onPressed: () {
|
||||
context
|
||||
.read<EligibilityBloc>()
|
||||
.add(ShowAddEligibilityForm());
|
||||
})
|
||||
]
|
||||
:(context.watch<EligibilityBloc>().state is AddEligibilityState || context.watch<EligibilityBloc>().state is EditEligibilityState)? [
|
||||
CloseLeading(onPressed: () {
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility());
|
||||
})
|
||||
]:[],
|
||||
),
|
||||
body: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
token = state.userData!.user!.login!.token;
|
||||
profileId =
|
||||
state.userData!.user!.login!.user!.profileId;
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if(state is ProfileLoaded){
|
||||
return ProgressHUD(
|
||||
padding: const EdgeInsets.all(24),
|
||||
indicatorWidget: const SpinKitFadingCircle(
|
||||
color: Colors.white,
|
||||
),
|
||||
backgroundColor: Colors.black87,
|
||||
child: BlocConsumer<EligibilityBloc, EligibilityState>(
|
||||
listener: (context, state) {
|
||||
if (state is EligibilityLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is EligibilityLoaded ||
|
||||
state is AddEligibilityState ||
|
||||
state is EditEligibilityState ||
|
||||
state is DeletedState ||
|
||||
state is EligibilityAddedState ||
|
||||
state is EligibilityEditedState ||
|
||||
state is EligibilityErrorState
|
||||
) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
////DELETED STATE
|
||||
if (state is DeletedState) {
|
||||
if (state.success) {
|
||||
successAlert(context, "Deletion Successfull",
|
||||
"Eligibility has been deleted successfully",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||
));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Deletion Failed",
|
||||
"Error deleting eligibility", () {
|
||||
Navigator.of(context).pop();
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
////ADDED STATE
|
||||
if (state is EligibilityAddedState) {
|
||||
if (state.response['success']) {
|
||||
successAlert(context, "Adding Successfull!",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||
));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Adding Failed",
|
||||
"Something went wrong. Please try again.",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
////UPDATED STATE
|
||||
if (state is EligibilityEditedState) {
|
||||
if (state.response['success']) {
|
||||
successAlert(context, "Update Successfull!",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||
));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Update Failed",
|
||||
"Something went wrong. Please try again.",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context.read<EligibilityBloc>().add(const LoadEligibility(
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
return BlocBuilder<EligibilityBloc, EligibilityState>(
|
||||
builder: (context, state) {
|
||||
if (state is EligibilityLoaded) {
|
||||
|
||||
if (state.eligibilities.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount: state.eligibilities.length,
|
||||
itemBuilder:
|
||||
(BuildContext context, int index) {
|
||||
String title = state
|
||||
.eligibilities[index]
|
||||
.eligibility!
|
||||
.title;
|
||||
return Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: screenWidth,
|
||||
padding:
|
||||
const EdgeInsets.symmetric(
|
||||
horizontal: 12,
|
||||
vertical: 8),
|
||||
decoration: box1(),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500),
|
||||
),
|
||||
const Divider(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
"$licenseNumber: ${state.eligibilities[index].licenseNumber == null ? 'N/A' : state.eligibilities[index].licenseNumber.toString()}",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleSmall),
|
||||
const SizedBox(
|
||||
height: 3,
|
||||
),
|
||||
Text(
|
||||
"Rating : ${state.eligibilities[index].rating ?? 'N/A'}.",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleSmall)
|
||||
]),
|
||||
),
|
||||
AppPopupMenu<int>(
|
||||
offset:
|
||||
const Offset(-10, -10),
|
||||
elevation: 3,
|
||||
onSelected: (value) {
|
||||
|
||||
////delete eligibilty-= = = = = = = = =>>
|
||||
if (value == 2) {
|
||||
|
||||
confirmAlert(context,
|
||||
() {
|
||||
final progress =
|
||||
ProgressHUD.of(
|
||||
context);
|
||||
progress!.showWithText(
|
||||
"Loading...");
|
||||
BlocProvider.of<
|
||||
EligibilityBloc>(
|
||||
context)
|
||||
.add(DeleteEligibility(
|
||||
|
||||
|
||||
eligibilityId: state
|
||||
.eligibilities[
|
||||
index]
|
||||
.id!,
|
||||
profileId:
|
||||
profileId.toString(),
|
||||
token:
|
||||
token!));
|
||||
}, "Delete?",
|
||||
"Confirm Delete?");
|
||||
}
|
||||
if (value == 1) {
|
||||
////edit eligibilty-= = = = = = = = =>>
|
||||
final progress =
|
||||
ProgressHUD.of(
|
||||
context);
|
||||
progress!.showWithText(
|
||||
"Loading...");
|
||||
EligibityCert
|
||||
eligibityCert =
|
||||
state.eligibilities[
|
||||
index];
|
||||
bool overseas = eligibityCert
|
||||
.examAddress!
|
||||
.country!
|
||||
.id
|
||||
.toString() ==
|
||||
'175'
|
||||
? false
|
||||
: true;
|
||||
eligibityCert.overseas =
|
||||
overseas;
|
||||
|
||||
eligibityCert.overseas =
|
||||
overseas;
|
||||
|
||||
context
|
||||
.read<EligibilityBloc>()
|
||||
.add(ShowEditEligibilityForm(
|
||||
eligibityCert:
|
||||
eligibityCert));
|
||||
}
|
||||
},
|
||||
menuItems: [
|
||||
popMenuItem(
|
||||
text: "Edit",
|
||||
value: 1,
|
||||
icon: Icons.edit),
|
||||
popMenuItem(
|
||||
text: "Delete",
|
||||
value: 2,
|
||||
icon: Icons.delete),
|
||||
popMenuItem(
|
||||
text: "Attachment",
|
||||
value: 3,
|
||||
icon: FontAwesome
|
||||
.attach)
|
||||
],
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
),
|
||||
tooltip: "Options",
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
)
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
return const EmptyData(
|
||||
message:
|
||||
"You don't have any eligibilities added. Please click + to add");
|
||||
}
|
||||
}
|
||||
if (state is EditEligibilityState) {
|
||||
return EditEligibilityScreen(
|
||||
profileId: profileId!,
|
||||
token: token!,
|
||||
eligibityCert: state.eligibityCert);
|
||||
}
|
||||
if (state is AddEligibilityState) {
|
||||
return AddEligibilityScreen(token: token!,profileId: profileId!,);
|
||||
}
|
||||
if (state is EligibilityErrorState) {
|
||||
return SomethingWentWrong(message: state.message, onpressed: (){
|
||||
context.read<EligibilityBloc>().add(LoadEligibility(token: token,profileId: profileId));
|
||||
});
|
||||
}
|
||||
return Container(
|
||||
color: Colors.grey.shade200,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
||||
}
|
||||
return Container();
|
||||
}
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
)),
|
||||
);
|
||||
}
|
||||
|
||||
PopupMenuItem<int> popMenuItem({String? text, int? value, IconData? icon}) {
|
||||
return PopupMenuItem(
|
||||
value: value,
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
icon,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(
|
||||
text!,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,430 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/family_backround.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
|
||||
import '../../../bloc/profile/family/family_bloc.dart';
|
||||
|
||||
class FamilyBackgroundScreen extends StatefulWidget {
|
||||
const FamilyBackgroundScreen({
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<FamilyBackgroundScreen> createState() => _FamilyBackgroundScreenState();
|
||||
}
|
||||
|
||||
class _FamilyBackgroundScreenState extends State<FamilyBackgroundScreen> {
|
||||
FamilyBackground? father;
|
||||
FamilyBackground? mother;
|
||||
FamilyBackground? spouse;
|
||||
List<FamilyBackground> children = [];
|
||||
List<FamilyBackground> otherRelated = [];
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(familyBackgroundScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
),
|
||||
body: ProgressHUD(
|
||||
padding: const EdgeInsets.all(24),
|
||||
backgroundColor: Colors.black87,
|
||||
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||
child: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocConsumer<FamilyBloc, FamilyState>(
|
||||
listener: (context, state) {
|
||||
if (state is FamilyLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is FamilyLoaded || state is FamilyErrorState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is FamilyLoaded) {
|
||||
father = state.families.firstWhere(
|
||||
(element) => element.relationship!.id == 1);
|
||||
mother = state.families.firstWhere(
|
||||
(element) => element.relationship!.id == 2);
|
||||
spouse = state.families.firstWhere(
|
||||
(element) => element.relationship!.id == 3);
|
||||
|
||||
// get all children
|
||||
var childs = state.families
|
||||
.where((element) => element.relationship!.id == 4);
|
||||
if (childs.isNotEmpty) {
|
||||
for (var element in childs) {
|
||||
children.add(element);
|
||||
}
|
||||
}
|
||||
|
||||
//get all related persons
|
||||
var relateds = state.families
|
||||
.where((element) => element.relationship!.id! > 4);
|
||||
if (relateds.isNotEmpty) {
|
||||
for (var element in relateds) {
|
||||
otherRelated.add(element);
|
||||
}
|
||||
}
|
||||
return ListView(children: [
|
||||
//Father----------------------------------------------
|
||||
Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(fatherText),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
" ${father!.relatedPerson!.firstName} ${father!.relatedPerson!.middleName} ${father!.relatedPerson!.lastName} ${father!.relatedPerson!.nameExtension ?? ''},",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
Text(
|
||||
" ",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: false,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
value = !value!;
|
||||
});
|
||||
}),
|
||||
const Text(incaseOfEmergency)
|
||||
],
|
||||
)
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
|
||||
//Mother-----------------------------------------------------
|
||||
Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(motherText),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
" ${mother!.relatedPerson!.firstName} ${mother!.relatedPerson!.middleName} ${mother!.relatedPerson!.lastName} ${mother!.relatedPerson!.nameExtension ?? ''}",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
Text(" ",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall),
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: false,
|
||||
onChanged: (value) {}),
|
||||
const Text(incaseOfEmergency)
|
||||
],
|
||||
)
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
//Spouse ---------------------------------------------------------
|
||||
spouse != null
|
||||
? Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
const Text(spouseText),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
" ${spouse!.relatedPerson!.firstName} ${spouse!.relatedPerson!.middleName} ${spouse!.relatedPerson!.lastName} ${spouse!.relatedPerson!.nameExtension ?? ''}",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight.w500)),
|
||||
Text(" ",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.bodySmall),
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: false,
|
||||
onChanged: (value) {}),
|
||||
const Text(incaseOfEmergency)
|
||||
],
|
||||
)
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
)
|
||||
: const SizedBox(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
|
||||
// Childrens ----------------------------------
|
||||
children.isNotEmpty
|
||||
? Container(
|
||||
decoration: box1(),
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: children.map((child) {
|
||||
int index = children.indexOf(child);
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
width: screenWidth,
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
index == 0
|
||||
? const Text(childrenText)
|
||||
: const SizedBox(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Text(
|
||||
" ${child.relatedPerson!.firstName} ${child.relatedPerson!.middleName} ${child.relatedPerson!.lastName} ${child.relatedPerson!.nameExtension ?? ''}",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500)),
|
||||
Text(" ",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.bodySmall),
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: false,
|
||||
onChanged:
|
||||
(value) {}),
|
||||
const Text(
|
||||
incaseOfEmergency)
|
||||
],
|
||||
)
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}).toList()),
|
||||
)
|
||||
: const SizedBox(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
//Other related person
|
||||
otherRelated.isNotEmpty
|
||||
? Container(
|
||||
decoration: box1(),
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: otherRelated.map((relative) {
|
||||
int index2 =
|
||||
otherRelated.indexOf(relative);
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
width: screenWidth,
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
index2 == 0
|
||||
? const Text(otherRelatedText)
|
||||
: const SizedBox(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Text(
|
||||
" ${relative.relatedPerson!.firstName} ${relative.relatedPerson!.middleName} ${relative.relatedPerson!.lastName} ${relative.relatedPerson!.nameExtension ?? ''}",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500)),
|
||||
Text(" ",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.bodySmall!),
|
||||
Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
value: false,
|
||||
onChanged:
|
||||
(value) {}),
|
||||
const Text(
|
||||
incaseOfEmergency)
|
||||
],
|
||||
)
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
))
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}).toList()),
|
||||
)
|
||||
: const SizedBox(),
|
||||
]);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/src/widgets/framework.dart';
|
||||
import 'package:flutter/src/widgets/placeholder.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/learning_development.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
import 'package:unit2/widgets/error_state.dart';
|
||||
|
||||
import '../../../bloc/profile/learningDevelopment/learning_development_bloc.dart';
|
||||
|
||||
class LearningAndDevelopmentScreen extends StatelessWidget {
|
||||
|
||||
const LearningAndDevelopmentScreen(
|
||||
{super.key,});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
DateFormat dteFormat2 = DateFormat.yMMMMd('en_US');
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(learningAndDevelopmentScreenTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: [AddLeading(onPressed: () {})],
|
||||
),
|
||||
body: ProgressHUD(
|
||||
padding: const EdgeInsets.all(24),
|
||||
indicatorWidget: const SpinKitFadingCircle(
|
||||
color: Colors.white,
|
||||
),
|
||||
backgroundColor: Colors.black87,
|
||||
child: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocConsumer<LearningDevelopmentBloc,
|
||||
LearningDevelopmentState>(
|
||||
listener: (context, state) {
|
||||
if (state is LearningDevelopmentLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is LearningDevelopmentLoadedState ||
|
||||
state is LeaningDevelopmentErrorState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
// TODO: implement listener
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is LearningDevelopmentLoadedState) {
|
||||
if (state.learningsAndDevelopment.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount:
|
||||
state.learningsAndDevelopment.length,
|
||||
itemBuilder:
|
||||
(BuildContext context, int index) {
|
||||
String training = state
|
||||
.learningsAndDevelopment[index]
|
||||
.conductedTraining!
|
||||
.title!
|
||||
.title!;
|
||||
String provider = state
|
||||
.learningsAndDevelopment[index]
|
||||
.conductedTraining!
|
||||
.conductedBy!
|
||||
.name!;
|
||||
String start = dteFormat2.format(state
|
||||
.learningsAndDevelopment[index]
|
||||
.conductedTraining!
|
||||
.fromDate!);
|
||||
String end = dteFormat2.format(state
|
||||
.learningsAndDevelopment[index]
|
||||
.conductedTraining!
|
||||
.toDate!);
|
||||
String type = state
|
||||
.learningsAndDevelopment[index]
|
||||
.conductedTraining!
|
||||
.learningDevelopmentType!
|
||||
.title!;
|
||||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
width: screenWidth,
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.start,
|
||||
children: [
|
||||
Text(
|
||||
training,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500),
|
||||
),
|
||||
const Divider(),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
provider,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleSmall,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
Text(
|
||||
"$duration: $start to $end",
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.labelMedium,
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
|
||||
]),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {},
|
||||
icon: const Icon(
|
||||
Icons.more_vert)),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const EmptyData(
|
||||
message:
|
||||
"You don't have any Learning and Development added. Please click + to add.");
|
||||
}
|
||||
}
|
||||
if (state is LeaningDevelopmentErrorState) {
|
||||
return (SomethingWentWrong(
|
||||
message: state.message, onpressed: () {}));
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,159 @@
|
|||
import 'package:expandable_group/expandable_group_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttericon/brandico_icons.dart';
|
||||
import 'package:fluttericon/elusive_icons.dart';
|
||||
import 'package:fluttericon/entypo_icons.dart';
|
||||
import 'package:fluttericon/font_awesome5_icons.dart';
|
||||
import 'package:fluttericon/modern_pictograms_icons.dart';
|
||||
import 'package:unit2/screens/profile/components/main_menu.dart';
|
||||
import 'package:unit2/screens/profile/components/submenu.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import '../../../theme-data.dart/colors.dart';
|
||||
|
||||
class LoadingScreen extends StatelessWidget {
|
||||
const LoadingScreen({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Stack(
|
||||
children: [
|
||||
|
||||
Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 12),
|
||||
child: ListView(
|
||||
children: [
|
||||
const Text(
|
||||
"View and Update your Profile Information",
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
ExpandableGroup(
|
||||
collapsedIcon: const Icon(Icons.keyboard_arrow_down),
|
||||
expandedIcon: const Icon(Icons.keyboard_arrow_up),
|
||||
header: const ListTile(
|
||||
leading: Icon(
|
||||
Elusive.address_book,
|
||||
color: primary,
|
||||
),
|
||||
title: Text(
|
||||
"Basic Information",
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
items: [
|
||||
subMenu(Icons.person, "Primary", () {}),
|
||||
subMenu(Icons.home, "Home Addresses", () {}),
|
||||
subMenu(Icons.contact_mail, "Identifications", () {}),
|
||||
subMenu(Icons.contact_phone, "Contact Info", () {}),
|
||||
subMenu(Icons.flag, "Citizenships", () {}),
|
||||
]),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: Elusive.group,
|
||||
title: "Family",
|
||||
onTap: () {},
|
||||
),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: FontAwesome5.graduation_cap,
|
||||
title: "Education",
|
||||
onTap: () {},
|
||||
),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: Icons.stars,
|
||||
title: "Eligibility",
|
||||
onTap: () {},
|
||||
),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: FontAwesome5.shopping_bag,
|
||||
title: "Work History",
|
||||
onTap: () {},
|
||||
),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: FontAwesome5.walking,
|
||||
title: "Voluntary Work & Civic Services",
|
||||
onTap: () {},
|
||||
),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: Elusive.lightbulb,
|
||||
title: "Learning & Development",
|
||||
onTap: () {},
|
||||
),
|
||||
const Divider(),
|
||||
MainMenu(
|
||||
icon: Brandico.codepen,
|
||||
title: "Personal References",
|
||||
onTap: () {},
|
||||
),
|
||||
ExpandableGroup(
|
||||
collapsedIcon: const Icon(Icons.keyboard_arrow_down),
|
||||
expandedIcon: const Icon(Icons.keyboard_arrow_up),
|
||||
header: const ListTile(
|
||||
leading: Icon(
|
||||
Icons.info,
|
||||
color: primary,
|
||||
),
|
||||
title: Text(
|
||||
"Other Information",
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
items: [
|
||||
subMenu(Icons.fitness_center, "Skills & Hobbies", () {}),
|
||||
subMenu(FontAwesome5.certificate,
|
||||
"Organization Memberships", () {}),
|
||||
subMenu(
|
||||
Entypo.doc_text, "Non-Academic Recognitions", () {}),
|
||||
]),
|
||||
ExpandableGroup(
|
||||
collapsedIcon: const Icon(Icons.keyboard_arrow_down),
|
||||
expandedIcon: const Icon(Icons.keyboard_arrow_up),
|
||||
header: const ListTile(
|
||||
leading: Icon(
|
||||
FontAwesome5.laptop_house,
|
||||
color: primary,
|
||||
),
|
||||
title: Text(
|
||||
"Assets",
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
items: [
|
||||
subMenu(ModernPictograms.home, "Real Property Tax", () {}),
|
||||
]),
|
||||
],
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: screenWidth,
|
||||
height: screenHeight,
|
||||
color: Colors.white70,
|
||||
),
|
||||
Center(
|
||||
child: Container(
|
||||
height: 80,
|
||||
width: 80,
|
||||
decoration:const BoxDecoration(
|
||||
color: Colors.black87,
|
||||
borderRadius: BorderRadius.all(Radius.circular(8))
|
||||
),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: const[
|
||||
SpinKitFadingCircle(
|
||||
size: 42,
|
||||
color: Colors.white),
|
||||
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
|
@ -4,9 +4,11 @@ import 'package:unit2/theme-data.dart/colors.dart';
|
|||
class MainMenu extends StatelessWidget {
|
||||
final IconData icon;
|
||||
final String title;
|
||||
final Function() onTap;
|
||||
const MainMenu({
|
||||
required this.icon,
|
||||
required this.title,
|
||||
required this.onTap,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
|
@ -19,9 +21,10 @@ class MainMenu extends StatelessWidget {
|
|||
),
|
||||
title: Text(
|
||||
title,
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
style: const TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
trailing: const Icon(Icons.keyboard_arrow_right),
|
||||
onTap: onTap,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,378 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:fluttericon/font_awesome_icons.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:searchfield/searchfield.dart';
|
||||
import 'package:unit2/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/other_information/non_acedimic_recognition.dart';
|
||||
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
|
||||
import '../../../../../model/utils/agency.dart';
|
||||
import '../../../../../model/utils/category.dart';
|
||||
import '../../../../../theme-data.dart/box_shadow.dart';
|
||||
import '../../../../../theme-data.dart/btn-style.dart';
|
||||
import '../../../../../theme-data.dart/colors.dart';
|
||||
import '../../../../../utils/text_container.dart';
|
||||
|
||||
class AddNonAcademicRecognitionScreen extends StatefulWidget {
|
||||
const AddNonAcademicRecognitionScreen({super.key});
|
||||
|
||||
@override
|
||||
State<AddNonAcademicRecognitionScreen> createState() =>
|
||||
_AddNonAcademicRecognitionScreenState();
|
||||
}
|
||||
|
||||
class _AddNonAcademicRecognitionScreenState
|
||||
extends State<AddNonAcademicRecognitionScreen> {
|
||||
bool showAgencyCategory = false;
|
||||
final agencyFocusNode = FocusNode();
|
||||
|
||||
final agencyCategoryFocusNode = FocusNode();
|
||||
final addAgencyController = TextEditingController();
|
||||
Agency? selectedAgency;
|
||||
Category? selectedCategory;
|
||||
Agency? newAgency;
|
||||
bool showIsPrivateRadio = false;
|
||||
bool? isPrivate = false;
|
||||
NonAcademicRecognition? nonAcademicRecognition;
|
||||
final _formKey = GlobalKey<FormBuilderState>();
|
||||
int? profileId;
|
||||
String? token;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
token = state.userData!.user!.login!.token;
|
||||
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
|
||||
return BlocBuilder<NonAcademicRecognitionBloc,
|
||||
NonAcademicRecognitionState>(
|
||||
builder: (context, state) {
|
||||
if (state is AddNonAcademeRecognitionState) {
|
||||
return SizedBox(
|
||||
height: blockSizeVertical * 90,
|
||||
child: SingleChildScrollView(
|
||||
child: FormBuilder(
|
||||
key: _formKey,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 25,horizontal: 18),
|
||||
child: Column(
|
||||
children: [
|
||||
FormBuilderTextField(name: 'title',
|
||||
decoration: normalTextFieldStyle("Recognition / Award Title *", "Recognition / Award Title"),
|
||||
validator: FormBuilderValidators.required(errorText: "this field is required"),
|
||||
),
|
||||
const SizedBox(height: 12,),
|
||||
StatefulBuilder(
|
||||
builder: (context, setState) {
|
||||
//// AGENCY SEARCHFIELD
|
||||
return Column(
|
||||
children: [
|
||||
SearchField(
|
||||
itemHeight: 70,
|
||||
suggestions: state.agencies
|
||||
.map((Agency agency) =>
|
||||
SearchFieldListItem(
|
||||
agency.name!,
|
||||
item: agency,
|
||||
child: ListTile(
|
||||
title: Text(
|
||||
agency.name!
|
||||
.toUpperCase(),
|
||||
overflow:
|
||||
TextOverflow
|
||||
.ellipsis,
|
||||
),
|
||||
subtitle: Text(agency
|
||||
.privateEntity ==
|
||||
true
|
||||
? "Private"
|
||||
: agency.privateEntity ==
|
||||
false
|
||||
? "Government"
|
||||
: ""),
|
||||
)))
|
||||
.toList(),
|
||||
validator: FormBuilderValidators
|
||||
.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
focusNode: agencyFocusNode,
|
||||
searchInputDecoration:
|
||||
normalTextFieldStyle(
|
||||
"Agency *", "")
|
||||
.copyWith(
|
||||
suffixIcon:
|
||||
const Icon(Icons
|
||||
.arrow_drop_down)),
|
||||
////agency suggestion tap
|
||||
onSuggestionTap: (agency) {
|
||||
setState(() {
|
||||
selectedAgency = agency.item;
|
||||
agencyFocusNode.unfocus();
|
||||
if (selectedAgency
|
||||
?.category ==
|
||||
null) {
|
||||
showAgencyCategory = true;
|
||||
showIsPrivateRadio = true;
|
||||
} else {
|
||||
showAgencyCategory = false;
|
||||
showIsPrivateRadio = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
emptyWidget: Container(
|
||||
decoration: box1(),
|
||||
height: 100,
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.center,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.center,
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
const Text(
|
||||
"No result found..."),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
TextButton(
|
||||
//// Add agency onpressed
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context:
|
||||
context,
|
||||
builder:
|
||||
(BuildContext
|
||||
context) {
|
||||
return AlertDialog(
|
||||
title: const Text(
|
||||
"Add Agency?"),
|
||||
content:
|
||||
SizedBox(
|
||||
height:
|
||||
130,
|
||||
child:
|
||||
Column(
|
||||
children: [
|
||||
TextFormField(
|
||||
controller:
|
||||
addAgencyController,
|
||||
decoration:
|
||||
normalTextFieldStyle("", ""),
|
||||
),
|
||||
const SizedBox(
|
||||
height:
|
||||
12,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
height: 50,
|
||||
child: ElevatedButton(
|
||||
style: mainBtnStyle(primary, Colors.transparent, second),
|
||||
//// onpressed
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
newAgency = Agency(id: null, name: addAgencyController.text.toUpperCase(), category: null, privateEntity: null);
|
||||
state.agencies.insert(0, newAgency!);
|
||||
addAgencyController.clear();
|
||||
Navigator.pop(context);
|
||||
});
|
||||
},
|
||||
child: const Text("Add"))),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
},
|
||||
child: const Text(
|
||||
"Add position"))
|
||||
]),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
SizedBox(
|
||||
child: showAgencyCategory
|
||||
? SearchField(
|
||||
focusNode:
|
||||
agencyCategoryFocusNode,
|
||||
itemHeight: 70,
|
||||
suggestions: state
|
||||
.agencyCategories
|
||||
.map((Category
|
||||
category) =>
|
||||
SearchFieldListItem(
|
||||
category
|
||||
.name!,
|
||||
item:
|
||||
category,
|
||||
child:
|
||||
ListTile(
|
||||
title: Text(
|
||||
category
|
||||
.name!),
|
||||
subtitle: Text(category
|
||||
.industryClass!
|
||||
.name!),
|
||||
)))
|
||||
.toList(),
|
||||
emptyWidget: Container(
|
||||
height: 100,
|
||||
decoration: box1(),
|
||||
child: const Center(
|
||||
child: Text(
|
||||
"No result found ...")),
|
||||
),
|
||||
////agency controller suggestion tap
|
||||
onSuggestionTap:
|
||||
(agencyCategory) {
|
||||
setState(() {
|
||||
selectedCategory =
|
||||
agencyCategory
|
||||
.item;
|
||||
|
||||
agencyCategoryFocusNode
|
||||
.unfocus();
|
||||
});
|
||||
},
|
||||
searchInputDecoration:
|
||||
normalTextFieldStyle(
|
||||
"Category *",
|
||||
"")
|
||||
.copyWith(
|
||||
suffixIcon:
|
||||
const Icon(
|
||||
Icons
|
||||
.arrow_drop_down)),
|
||||
validator:
|
||||
FormBuilderValidators
|
||||
.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
)
|
||||
: const SizedBox(),
|
||||
),
|
||||
|
||||
////PRVIATE SECTOR
|
||||
SizedBox(
|
||||
child: showIsPrivateRadio
|
||||
? FormBuilderRadioGroup(
|
||||
decoration:
|
||||
InputDecoration(
|
||||
border:
|
||||
InputBorder.none,
|
||||
label: Row(
|
||||
children: [
|
||||
Text(
|
||||
"Is this private sector? ",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.headlineSmall!
|
||||
.copyWith(
|
||||
fontSize:
|
||||
24),
|
||||
),
|
||||
const Icon(FontAwesome
|
||||
.help_circled)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
////onvhange private sector
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
if (value
|
||||
.toString() ==
|
||||
"YES") {
|
||||
isPrivate = true;
|
||||
} else {
|
||||
isPrivate = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
name: 'isPrivate',
|
||||
validator:
|
||||
FormBuilderValidators
|
||||
.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
options: ["YES", "NO"]
|
||||
.map((lang) =>
|
||||
FormBuilderFieldOption(
|
||||
value:
|
||||
lang))
|
||||
.toList(
|
||||
growable:
|
||||
false),
|
||||
)
|
||||
: const SizedBox()),
|
||||
],
|
||||
);
|
||||
}),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
SizedBox(
|
||||
height: 60,
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
style: mainBtnStyle(primary,
|
||||
Colors.transparent, second),
|
||||
onPressed: () {
|
||||
|
||||
if (_formKey.currentState!
|
||||
.saveAndValidate()) {
|
||||
String title = _formKey.currentState!.value['title'];
|
||||
|
||||
if(selectedAgency?.privateEntity != null){
|
||||
newAgency = selectedAgency;
|
||||
}else{
|
||||
newAgency = Agency(
|
||||
id: selectedAgency?.id,
|
||||
name: selectedAgency!.name,
|
||||
category:
|
||||
selectedCategory,
|
||||
privateEntity: isPrivate);
|
||||
}
|
||||
nonAcademicRecognition = NonAcademicRecognition(id: null, title:title,presenter: newAgency );
|
||||
context.read<NonAcademicRecognitionBloc>().add(AddNonAcademeRecognition(nonAcademicRecognition: nonAcademicRecognition!, profileId: profileId!, token: token!));
|
||||
}
|
||||
},
|
||||
child: const Text(submit)),
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
)
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,410 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_form_builder/flutter_form_builder.dart';
|
||||
import 'package:fluttericon/font_awesome_icons.dart';
|
||||
import 'package:form_builder_validators/form_builder_validators.dart';
|
||||
import 'package:searchfield/searchfield.dart';
|
||||
import 'package:unit2/bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/model/profile/other_information/non_acedimic_recognition.dart';
|
||||
import 'package:unit2/theme-data.dart/form-style.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
|
||||
import '../../../../../model/utils/agency.dart';
|
||||
import '../../../../../model/utils/category.dart';
|
||||
import '../../../../../theme-data.dart/box_shadow.dart';
|
||||
import '../../../../../theme-data.dart/btn-style.dart';
|
||||
import '../../../../../theme-data.dart/colors.dart';
|
||||
import '../../../../../utils/text_container.dart';
|
||||
|
||||
class EditNonAcademicRecognitionScreen extends StatefulWidget {
|
||||
const EditNonAcademicRecognitionScreen({super.key});
|
||||
|
||||
@override
|
||||
State<EditNonAcademicRecognitionScreen> createState() =>
|
||||
_EditNonAcademicRecognitionScreenState();
|
||||
}
|
||||
|
||||
class _EditNonAcademicRecognitionScreenState
|
||||
extends State<EditNonAcademicRecognitionScreen> {
|
||||
bool showAgencyCategory = false;
|
||||
final agencyFocusNode = FocusNode();
|
||||
|
||||
final agencyCategoryFocusNode = FocusNode();
|
||||
final addAgencyController = TextEditingController();
|
||||
Agency? selectedAgency;
|
||||
Category? selectedCategory;
|
||||
Agency? newAgency;
|
||||
bool showIsPrivateRadio = false;
|
||||
bool? isPrivate = false;
|
||||
NonAcademicRecognition? nonAcademicRecognition;
|
||||
final oldAgencyController = TextEditingController();
|
||||
final _formKey = GlobalKey<FormBuilderState>();
|
||||
int? profileId;
|
||||
String? token;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
token = state.userData!.user!.login!.token;
|
||||
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocBuilder<NonAcademicRecognitionBloc,
|
||||
NonAcademicRecognitionState>(
|
||||
builder: (context, state) {
|
||||
if (state is EditNonAcademeRecognitionState) {
|
||||
oldAgencyController.text =
|
||||
state.nonAcademicRecognition.presenter!.name!;
|
||||
selectedAgency = state.nonAcademicRecognition.presenter;
|
||||
selectedCategory =
|
||||
state.nonAcademicRecognition.presenter!.category;
|
||||
return SizedBox(
|
||||
height: blockSizeVertical * 90,
|
||||
child: SingleChildScrollView(
|
||||
child: FormBuilder(
|
||||
key: _formKey,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 25, horizontal: 18),
|
||||
child: Column(
|
||||
children: [
|
||||
FormBuilderTextField(
|
||||
name: 'title',
|
||||
initialValue:
|
||||
state.nonAcademicRecognition.title,
|
||||
decoration: normalTextFieldStyle(
|
||||
"Recognition / Award Title *",
|
||||
"Recognition / Award Title"),
|
||||
validator:
|
||||
FormBuilderValidators.required(
|
||||
errorText:
|
||||
"this field is required"),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
StatefulBuilder(
|
||||
builder: (context, setState) {
|
||||
//// AGENCY SEARCHFIELD
|
||||
return Column(
|
||||
children: [
|
||||
SearchField(
|
||||
controller: oldAgencyController,
|
||||
itemHeight: 70,
|
||||
suggestions: state.agencies
|
||||
.map((Agency agency) =>
|
||||
SearchFieldListItem(
|
||||
agency.name!,
|
||||
item: agency,
|
||||
child: ListTile(
|
||||
title: Text(
|
||||
agency.name!
|
||||
.toUpperCase(),
|
||||
overflow:
|
||||
TextOverflow
|
||||
.ellipsis,
|
||||
),
|
||||
subtitle: Text(agency
|
||||
.privateEntity ==
|
||||
true
|
||||
? "Private"
|
||||
: agency.privateEntity ==
|
||||
false
|
||||
? "Government"
|
||||
: ""),
|
||||
)))
|
||||
.toList(),
|
||||
|
||||
validator: FormBuilderValidators
|
||||
.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
focusNode: agencyFocusNode,
|
||||
searchInputDecoration:
|
||||
normalTextFieldStyle(
|
||||
"Agency *", "")
|
||||
.copyWith(
|
||||
suffixIcon:
|
||||
const Icon(Icons
|
||||
.arrow_drop_down)),
|
||||
////agency suggestion tap
|
||||
onSuggestionTap: (agency) {
|
||||
setState(() {
|
||||
selectedAgency = agency.item;
|
||||
agencyFocusNode.unfocus();
|
||||
if (selectedAgency
|
||||
?.category ==
|
||||
null) {
|
||||
showAgencyCategory = true;
|
||||
showIsPrivateRadio = true;
|
||||
} else {
|
||||
showAgencyCategory = false;
|
||||
showIsPrivateRadio = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
emptyWidget: Container(
|
||||
decoration: box1(),
|
||||
height: 100,
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.center,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.center,
|
||||
children: [
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
const Text(
|
||||
"No result found..."),
|
||||
const SizedBox(
|
||||
height: 10,
|
||||
),
|
||||
TextButton(
|
||||
//// Add agency onpressed
|
||||
onPressed: () {
|
||||
showDialog(
|
||||
context:
|
||||
context,
|
||||
builder:
|
||||
(BuildContext
|
||||
context) {
|
||||
return AlertDialog(
|
||||
title: const Text(
|
||||
"Add Agency?"),
|
||||
content:
|
||||
SizedBox(
|
||||
height:
|
||||
130,
|
||||
child:
|
||||
Column(
|
||||
children: [
|
||||
TextFormField(
|
||||
controller:
|
||||
addAgencyController,
|
||||
decoration:
|
||||
normalTextFieldStyle("", ""),
|
||||
),
|
||||
const SizedBox(
|
||||
height:
|
||||
12,
|
||||
),
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
height: 50,
|
||||
child: ElevatedButton(
|
||||
style: mainBtnStyle(primary, Colors.transparent, second),
|
||||
//// onpressed
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
newAgency = Agency(id: null, name: addAgencyController.text.toUpperCase(), category: null, privateEntity: null);
|
||||
state.agencies.insert(0, newAgency!);
|
||||
addAgencyController.clear();
|
||||
Navigator.pop(context);
|
||||
});
|
||||
},
|
||||
child: const Text("Add"))),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
});
|
||||
},
|
||||
child: const Text(
|
||||
"Add position"))
|
||||
]),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 8,
|
||||
),
|
||||
SizedBox(
|
||||
child: showAgencyCategory
|
||||
? SearchField(
|
||||
focusNode:
|
||||
agencyCategoryFocusNode,
|
||||
itemHeight: 70,
|
||||
suggestions: state
|
||||
.agencyCategories
|
||||
.map((Category
|
||||
category) =>
|
||||
SearchFieldListItem(
|
||||
category
|
||||
.name!,
|
||||
item:
|
||||
category,
|
||||
child:
|
||||
ListTile(
|
||||
title: Text(
|
||||
category
|
||||
.name!),
|
||||
subtitle: Text(category
|
||||
.industryClass!
|
||||
.name!),
|
||||
)))
|
||||
.toList(),
|
||||
emptyWidget: Container(
|
||||
height: 100,
|
||||
decoration: box1(),
|
||||
child: const Center(
|
||||
child: Text(
|
||||
"No result found ...")),
|
||||
),
|
||||
////agency controller suggestion tap
|
||||
onSuggestionTap:
|
||||
(agencyCategory) {
|
||||
setState(() {
|
||||
selectedCategory =
|
||||
agencyCategory
|
||||
.item;
|
||||
|
||||
agencyCategoryFocusNode
|
||||
.unfocus();
|
||||
});
|
||||
},
|
||||
searchInputDecoration:
|
||||
normalTextFieldStyle(
|
||||
"Category *",
|
||||
"")
|
||||
.copyWith(
|
||||
suffixIcon:
|
||||
const Icon(
|
||||
Icons
|
||||
.arrow_drop_down)),
|
||||
validator:
|
||||
FormBuilderValidators
|
||||
.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
)
|
||||
: const SizedBox(),
|
||||
),
|
||||
|
||||
////PRVIATE SECTOR
|
||||
SizedBox(
|
||||
child: showIsPrivateRadio
|
||||
? FormBuilderRadioGroup(
|
||||
decoration:
|
||||
InputDecoration(
|
||||
border:
|
||||
InputBorder.none,
|
||||
label: Row(
|
||||
children: [
|
||||
Text(
|
||||
"Is this private sector? ",
|
||||
style: Theme.of(
|
||||
context)
|
||||
.textTheme
|
||||
.headlineSmall!
|
||||
.copyWith(
|
||||
fontSize:
|
||||
24),
|
||||
),
|
||||
const Icon(FontAwesome
|
||||
.help_circled)
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
////onvhange private sector
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
if (value
|
||||
.toString() ==
|
||||
"YES") {
|
||||
isPrivate = true;
|
||||
} else {
|
||||
isPrivate = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
name: 'isPrivate',
|
||||
validator:
|
||||
FormBuilderValidators
|
||||
.required(
|
||||
errorText:
|
||||
"This field is required"),
|
||||
options: ["YES", "NO"]
|
||||
.map((lang) =>
|
||||
FormBuilderFieldOption(
|
||||
value:
|
||||
lang))
|
||||
.toList(
|
||||
growable:
|
||||
false),
|
||||
)
|
||||
: const SizedBox()),
|
||||
],
|
||||
);
|
||||
}),
|
||||
const SizedBox(
|
||||
height: 24,
|
||||
),
|
||||
SizedBox(
|
||||
height: 60,
|
||||
width: double.infinity,
|
||||
child: ElevatedButton(
|
||||
style: mainBtnStyle(primary,
|
||||
Colors.transparent, second),
|
||||
onPressed: () {
|
||||
if (_formKey.currentState!
|
||||
.saveAndValidate()) {
|
||||
String title = _formKey
|
||||
.currentState!
|
||||
.value['title'];
|
||||
|
||||
if (selectedAgency
|
||||
?.privateEntity !=
|
||||
null) {
|
||||
newAgency = selectedAgency;
|
||||
} else {
|
||||
newAgency = Agency(
|
||||
id: selectedAgency?.id,
|
||||
name:
|
||||
selectedAgency!.name,
|
||||
category:
|
||||
selectedCategory,
|
||||
privateEntity: isPrivate);
|
||||
}
|
||||
nonAcademicRecognition =
|
||||
NonAcademicRecognition(
|
||||
id: state.nonAcademicRecognition.id,
|
||||
title: title,
|
||||
presenter: newAgency);
|
||||
context
|
||||
.read<
|
||||
NonAcademicRecognitionBloc>()
|
||||
.add(EditNonAcademeRecognition(
|
||||
nonAcademicRecognition:
|
||||
nonAcademicRecognition!,
|
||||
profileId: profileId!,
|
||||
token: token!));
|
||||
}
|
||||
},
|
||||
child: const Text(submit)),
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
));
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,278 @@
|
|||
import 'package:app_popup_menu/app_popup_menu.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:flutter_progress_hud/flutter_progress_hud.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:unit2/bloc/profile/profile_bloc.dart';
|
||||
import 'package:unit2/bloc/user/user_bloc.dart';
|
||||
import 'package:unit2/screens/profile/components/other_information/non_academic/add_modal.dart';
|
||||
import 'package:unit2/screens/profile/components/other_information/non_academic/edit_modal.dart';
|
||||
import 'package:unit2/theme-data.dart/box_shadow.dart';
|
||||
import 'package:unit2/theme-data.dart/colors.dart';
|
||||
import 'package:unit2/utils/global.dart';
|
||||
import 'package:unit2/utils/text_container.dart';
|
||||
import 'package:unit2/widgets/Leadings/add_leading.dart';
|
||||
import 'package:unit2/widgets/empty_data.dart';
|
||||
|
||||
import '../../../../bloc/profile/other_information/non_academic_recognition.dart/non_academic_recognition_bloc.dart';
|
||||
import '../../../../utils/alerts.dart';
|
||||
|
||||
class NonAcademicRecognitionScreen extends StatelessWidget {
|
||||
const NonAcademicRecognitionScreen({
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
int? profileId;
|
||||
String? token;
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text(nonAcademicRecTitle),
|
||||
centerTitle: true,
|
||||
backgroundColor: primary,
|
||||
actions: [
|
||||
AddLeading(onPressed: () {
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add(ShowAddNonAcademeRecognitionForm());
|
||||
})
|
||||
],
|
||||
),
|
||||
body: ProgressHUD(
|
||||
padding: const EdgeInsets.all(24),
|
||||
backgroundColor: Colors.black87,
|
||||
indicatorWidget: const SpinKitFadingCircle(color: Colors.white),
|
||||
child: BlocBuilder<UserBloc, UserState>(
|
||||
builder: (context, state) {
|
||||
if (state is UserLoggedIn) {
|
||||
token = state.userData!.user!.login!.token;
|
||||
profileId = state.userData!.user!.login!.user!.profileId!;
|
||||
return BlocBuilder<ProfileBloc, ProfileState>(
|
||||
builder: (context, state) {
|
||||
if (state is ProfileLoaded) {
|
||||
return BlocConsumer<NonAcademicRecognitionBloc,
|
||||
NonAcademicRecognitionState>(
|
||||
listener: (context, state) {
|
||||
if (state is NonAcademicRecognitionLoadingState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.showWithText("Please wait...");
|
||||
}
|
||||
if (state is NonAcademicRecognitionLoadedState ||
|
||||
state is NonAcademicRecognitionErrorState ||
|
||||
state is AddNonAcademeRecognitionState || state is EditNonAcademeRecognitionState || state is NonAcademeRecognitionEditedState) {
|
||||
final progress = ProgressHUD.of(context);
|
||||
progress!.dismiss();
|
||||
}
|
||||
////ADDED STATE
|
||||
if (state is NonAcademeRecognitionAddedState) {
|
||||
if (state.response['success']) {
|
||||
successAlert(context, "Adding Successfull!",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add(const GetNonAcademicRecognition());
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Adding Failed",
|
||||
"Something went wrong. Please try again.",
|
||||
() {
|
||||
Navigator.of(context).pop();
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add(const GetNonAcademicRecognition());
|
||||
});
|
||||
}
|
||||
}
|
||||
////DELETED STATE
|
||||
if (state is NonAcademeRecognitionDeletedState) {
|
||||
if (state.success) {
|
||||
successAlert(context, "Deletion Successfull",
|
||||
"Work has been deleted successfully", () {
|
||||
Navigator.of(context).pop();
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add(const GetNonAcademicRecognition());
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Deletion Failed",
|
||||
"Error deleting Work History", () {
|
||||
Navigator.of(context).pop();
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add(const GetNonAcademicRecognition());
|
||||
});
|
||||
}
|
||||
}
|
||||
////EDITED STATE
|
||||
if (state is NonAcademeRecognitionEditedState) {
|
||||
if (state.response['success']) {
|
||||
successAlert(context, "Update Successfull",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add( LoadNonAcademeRecognition(nonAcademicRecognitions: state.nonAcademicRecognitions));
|
||||
});
|
||||
} else {
|
||||
errorAlert(context, "Update Failed",
|
||||
state.response['message'], () {
|
||||
Navigator.of(context).pop();
|
||||
context
|
||||
.read<NonAcademicRecognitionBloc>()
|
||||
.add(LoadNonAcademeRecognition(nonAcademicRecognitions: state.nonAcademicRecognitions));
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
builder: (context, state) {
|
||||
if (state is NonAcademicRecognitionLoadedState) {
|
||||
if (state.nonAcademicRecognition.isNotEmpty) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 8, horizontal: 10),
|
||||
itemCount:
|
||||
state.nonAcademicRecognition.length,
|
||||
itemBuilder:
|
||||
(BuildContext context, int index) {
|
||||
String award = state
|
||||
.nonAcademicRecognition[index].title!;
|
||||
String presenter = state
|
||||
.nonAcademicRecognition[index]
|
||||
.presenter!
|
||||
.name!;
|
||||
return Column(
|
||||
children: [
|
||||
Container(
|
||||
width: screenWidth,
|
||||
decoration: box1(),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 12, vertical: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
award,
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
.titleMedium!
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500),
|
||||
),
|
||||
const Divider(),
|
||||
Text(presenter),
|
||||
],
|
||||
)),
|
||||
AppPopupMenu<int>(
|
||||
offset: const Offset(-10, -10),
|
||||
elevation: 3,
|
||||
onSelected: (value) {
|
||||
|
||||
////delete non academic recognition-= = = = = = = = =>>
|
||||
if (value == 1) {
|
||||
confirmAlert(context, () {
|
||||
context
|
||||
.read<
|
||||
NonAcademicRecognitionBloc>()
|
||||
.add(DeleteNonAcademeRecognition(
|
||||
nonAcademicRecognition:
|
||||
state
|
||||
.nonAcademicRecognition[
|
||||
index],
|
||||
profileId:
|
||||
profileId!,
|
||||
nonAcademicRecognitions:
|
||||
state
|
||||
.nonAcademicRecognition,
|
||||
token: token!));
|
||||
}, "Delete?",
|
||||
"Confirm Delete?");
|
||||
}
|
||||
if (value == 2) {
|
||||
context
|
||||
.read<
|
||||
NonAcademicRecognitionBloc>()
|
||||
.add(ShowEditNonAcademicRecognitionForm(
|
||||
nonAcademicRecognition:
|
||||
state.nonAcademicRecognition[
|
||||
index]));
|
||||
}
|
||||
},
|
||||
menuItems: [
|
||||
popMenuItem(
|
||||
text: "Delete",
|
||||
value: 1,
|
||||
icon: Icons.delete),
|
||||
popMenuItem(
|
||||
text: "Edit",
|
||||
value: 2,
|
||||
icon: Icons.delete),
|
||||
],
|
||||
icon: const Icon(
|
||||
Icons.more_vert,
|
||||
color: Colors.grey,
|
||||
),
|
||||
tooltip: "Options",
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
],
|
||||
);
|
||||
});
|
||||
} else {
|
||||
const EmptyData(
|
||||
message:
|
||||
"You don't have any Non Academic Recognition added. Please click + to add");
|
||||
}
|
||||
}
|
||||
if (state is AddNonAcademeRecognitionState) {
|
||||
return const AddNonAcademicRecognitionScreen();
|
||||
}if(state is EditNonAcademeRecognitionState){
|
||||
return const EditNonAcademicRecognitionScreen();
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
},
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
PopupMenuItem<int> popMenuItem({String? text, int? value, IconData? icon}) {
|
||||
return PopupMenuItem(
|
||||
value: value,
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
icon,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text(
|
||||
text!,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue