Merge branch 'master' into development_mirza

# Conflicts:
#	assets/langs/ar-SA.json
#	assets/langs/en-US.json
#	lib/generated/locale_keys.g.dart
#	lib/ui/work_list/worklist_fragments/detail_fragment.dart
#	lib/ui/work_list/worklist_fragments/info_fragments.dart
#	pubspec.yaml
faiz_marathon_signalR_critical
devmirza121 3 years ago
commit 0d0832277f

@ -27,7 +27,7 @@ apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion 32 compileSdkVersion 33
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
@ -44,7 +44,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "hmg.cloudSolutions.mohem" applicationId "com.cloudSolutions.mohemmtest"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 32 targetSdkVersion 32
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()

@ -10,7 +10,7 @@
"client_info": { "client_info": {
"mobilesdk_app_id": "1:679409052782:android:dba155ac0859d7fea78a7f", "mobilesdk_app_id": "1:679409052782:android:dba155ac0859d7fea78a7f",
"android_client_info": { "android_client_info": {
"package_name": "hmg.cloudSolutions.mohem" "package_name": "com.cloudSolutions.mohemmtest"
} }
}, },
"oauth_client": [ "oauth_client": [

@ -1,7 +1,7 @@
{ {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "تسجيل الدخول", "login": "تسجيل الدخول",
"pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول",
"username": "اسم المستخدم", "username": "اسم المستخدم",
@ -279,7 +279,7 @@
"enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", "enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية",
"endDate": "تاريخ الانتهاء", "endDate": "تاريخ الانتهاء",
"removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟", "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟",
"updateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", "wantUpdateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"addNewFamilyMember": "اضافة عضو جديد", "addNewFamilyMember": "اضافة عضو جديد",
"addRow": "اضافة صف جديد", "addRow": "اضافة صف جديد",
"pleaseSelect": "الرجاء اختيار", "pleaseSelect": "الرجاء اختيار",
@ -409,6 +409,15 @@
"typeHere": "اكتب هنا", "typeHere": "اكتب هنا",
"info_detail": "تفاصيل المعلومات", "info_detail": "تفاصيل المعلومات",
"amount_detail": "تفاصيل المبلغ", "amount_detail": "تفاصيل المبلغ",
"currentBalance": "الرصيد الحالي",
"currentLeaveBalance" : "رصيد الاجازات الحالي",
"calculatedDays": "الايام المحسوبه",
"totalDays": "مجموع الأيام",
"usedBalance": "المستخدم",
"infants":"رضيع",
"child":"طفل",
"adult": "بالغ",
"updateMember": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -1,7 +1,7 @@
{ {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "Login", "login": "Login",
"pleaseEnterLoginDetails": "Please enter the detail below to login", "pleaseEnterLoginDetails": "Please enter the detail below to login",
"username": "Username", "username": "Username",
@ -276,7 +276,7 @@
"enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", "enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)",
"endDate": "*End Date", "endDate": "*End Date",
"removeThisMember": "Are You Sure You Want to Remove this Member?", "removeThisMember": "Are You Sure You Want to Remove this Member?",
"updateThisMember": "Are You Sure You Want to Update this Member?", "wantUpdateThisMember": "Are You Sure You Want to Update this Member?",
"addNewFamilyMember": "Add New Family Member", "addNewFamilyMember": "Add New Family Member",
"addRow": "Add new row", "addRow": "Add new row",
"pleaseSelect": "Please Select *", "pleaseSelect": "Please Select *",
@ -409,6 +409,15 @@
"typeHere": "Type here", "typeHere": "Type here",
"info_detail": "Info Detail", "info_detail": "Info Detail",
"amount_detail": "Amount Detail", "amount_detail": "Amount Detail",
"currentBalance": "Current Balance",
"currentLeaveBalance" : "Current Leave Balance",
"calculatedDays": "Calculated Days",
"totalDays": "Total Days",
"usedBalance": "Used",
"infants":"Infants",
"child":"Child",
"adult": "Adult",
"updateMember": "Are You Sure You Want to Update this Member?",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -8,9 +8,10 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
1CCF895CFB3C95DEBB84A05F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
6BB994F47479089301AC9232 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CBD2B2B1A504A0E0BA52E83 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
76AE113C28E078EA00513112 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 76AE113B28E078EA00513112 /* GoogleService-Info.plist */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
@ -32,13 +33,12 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3085328F552329DC897B71DD /* 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>"; };
3A5ABA8306DCFDB9E71D453A /* 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>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3B4D9CAD3B112CCF7FEE1F91 /* 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>"; }; 704606614DF2810DC48BA72A /* 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>"; };
6CBD2B2B1A504A0E0BA52E83 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7627313328E45A2400F354F7 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
76AE113B28E078EA00513112 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
@ -47,6 +47,9 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9F5A5EF025608C139860C4F1 /* 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>"; };
A51BF82DB767D6FBE2C19E26 /* 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>"; };
D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -54,31 +57,21 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
6BB994F47479089301AC9232 /* Pods_Runner.framework in Frameworks */, 1CCF895CFB3C95DEBB84A05F /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
6BD33033650F08D3E79761E4 /* Frameworks */ = { 76443FF31582B5E7DA3B22CB /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
6CBD2B2B1A504A0E0BA52E83 /* Pods_Runner.framework */, D8F0CC8EAC13AF3E07BEE567 /* Pods_Runner.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
969F82F1FCE09135D9CB4C64 /* Pods */ = {
isa = PBXGroup;
children = (
3085328F552329DC897B71DD /* Pods-Runner.debug.xcconfig */,
3B4D9CAD3B112CCF7FEE1F91 /* Pods-Runner.release.xcconfig */,
3A5ABA8306DCFDB9E71D453A /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = { 9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -96,8 +89,8 @@
9740EEB11CF90186004384FC /* Flutter */, 9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */, 97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */, 97C146EF1CF9000F007C117D /* Products */,
969F82F1FCE09135D9CB4C64 /* Pods */, 9E11D7B9A1206344B2A65F43 /* Pods */,
6BD33033650F08D3E79761E4 /* Frameworks */, 76443FF31582B5E7DA3B22CB /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -112,6 +105,8 @@
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
7627313328E45A2400F354F7 /* Runner.entitlements */,
76AE113B28E078EA00513112 /* GoogleService-Info.plist */,
97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
@ -124,6 +119,16 @@
path = Runner; path = Runner;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
9E11D7B9A1206344B2A65F43 /* Pods */ = {
isa = PBXGroup;
children = (
A51BF82DB767D6FBE2C19E26 /* Pods-Runner.debug.xcconfig */,
9F5A5EF025608C139860C4F1 /* Pods-Runner.release.xcconfig */,
704606614DF2810DC48BA72A /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
@ -131,15 +136,15 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
7D19CFF3DFB977EA83F4C733 /* [CP] Check Pods Manifest.lock */, 2D06B7AD3B87C9C9059E4168 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
AAF25E5FC427CABFCDCC628C /* [CP] Embed Pods Frameworks */, C4CFBC4C5CAC00182015ACD5 /* [CP] Embed Pods Frameworks */,
C4DA18EDC3C1F9369084333D /* [CP] Copy Pods Resources */, 1C704830960BB41251F31356 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@ -190,6 +195,7 @@
files = ( files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
76AE113C28E078EA00513112 /* GoogleService-Info.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
); );
@ -198,21 +204,24 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 1C704830960BB41251F31356 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "Thin Binary"; name = "[CP] Copy Pods Resources";
outputPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
showEnvVarsInLog = 0;
}; };
7D19CFF3DFB977EA83F4C733 /* [CP] Check Pods Manifest.lock */ = { 2D06B7AD3B87C9C9059E4168 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@ -234,52 +243,49 @@
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"; 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; showEnvVarsInLog = 0;
}; };
9740EEB61CF901F6004384FC /* Run Script */ = { 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputPaths = (
); );
name = "Run Script"; name = "Thin Binary";
outputPaths = ( outputPaths = (
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
}; };
AAF25E5FC427CABFCDCC628C /* [CP] Embed Pods Frameworks */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Embed Pods Frameworks"; name = "Run Script";
outputFileListPaths = ( outputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
showEnvVarsInLog = 0;
}; };
C4DA18EDC3C1F9369084333D /* [CP] Copy Pods Resources */ = { C4CFBC4C5CAC00182015ACD5 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputFileListPaths = ( inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
); );
name = "[CP] Copy Pods Resources"; name = "[CP] Embed Pods Frameworks";
outputFileListPaths = ( outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
@ -372,16 +378,22 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM; DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemm; PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemmtest;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
@ -500,16 +512,22 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM; DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemm; PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemmtest;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -523,16 +541,22 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 99Z3UD3LJM; DEVELOPMENT_TEAM = 99Z3UD3LJM;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = Mohemm;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemm; PRODUCT_BUNDLE_IDENTIFIER = com.cloudsolutions.mohemmtest;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";

@ -30,20 +30,20 @@
</array> </array>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NFCReaderUsageDescription</key>
<string>This App requires access to NFC to mark your attendance.</string>
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>This app requires camera access to capture &amp; upload pictures.</string> <string>This app requires camera access to capture &amp; upload pictures.</string>
<key>NSFaceIDUsageDescription</key> <key>NSFaceIDUsageDescription</key>
<string>This app requires Face ID to allow biometric authentication for app login.</string> <string>This app requires Face ID to allow biometric authentication for app login.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This App requires access to your location to mark your attendance.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This App requires access to your location to mark your attendance.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This App requires access to your location to mark your attendance.</string>
<key>NSPhotoLibraryUsageDescription</key> <key>NSPhotoLibraryUsageDescription</key>
<string>This app requires photo library access to select image as document &amp; upload it.</string> <string>This app requires photo library access to select image as document &amp; upload it.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This App requires access to your location to mark your attendance.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This App requires access to your location to mark your attendance.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This App requires access to your location to mark your attendance.</string>
<key>NFCReaderUsageDescription</key>
<string>This App requires access to NFC to mark your attendance.</string>
<key>UIBackgroundModes</key> <key>UIBackgroundModes</key>
<array> <array>
<string>remote-notification</string> <string>remote-notification</string>
@ -68,8 +68,8 @@
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key> <key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array> <array>
<string>0000</string> <string>0000</string>
</array> </array>
</dict> </dict>
</plist> </plist>

@ -18,7 +18,8 @@ class APIError {
APIError(this.errorCode, this.errorMessage); APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; Map<String, dynamic> toJson() =>
{'errorCode': errorCode, 'errorMessage': errorMessage};
@override @override
String toString() { String toString() {
@ -53,7 +54,8 @@ APIException _throwAPIException(Response response) {
return APIException(APIException.INTERNAL_SERVER_ERROR); return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444: case 444:
var downloadUrl = response.headers["location"]; var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); return APIException(APIException.UPGRADE_REQUIRED,
arguments: downloadUrl);
default: default:
return APIException(APIException.OTHER); return APIException(APIException.OTHER);
} }
@ -66,8 +68,13 @@ class ApiClient {
factory ApiClient() => _instance; factory ApiClient() => _instance;
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject, Future<U> postJsonForObject<T, U>(
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async { FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
bool isFormData = false}) async {
var _headers = {'Accept': 'application/json'}; var _headers = {'Accept': 'application/json'};
if (headers != null && headers.isNotEmpty) { if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers); _headers.addAll(headers);
@ -77,7 +84,12 @@ class ApiClient {
var bodyJson = json.encode(jsonObject); var bodyJson = json.encode(jsonObject);
print("body:$bodyJson"); print("body:$bodyJson");
} }
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isFormData: isFormData); var response = await postJsonForResponse(url, jsonObject,
token: token,
queryParameters: queryParameters,
headers: _headers,
retryTimes: retryTimes,
isFormData: isFormData);
// try { // try {
if (!kReleaseMode) { if (!kReleaseMode) {
logger.i("res: " + response.body); logger.i("res: " + response.body);
@ -90,7 +102,8 @@ class ApiClient {
return factoryConstructor(jsonData); return factoryConstructor(jsonData);
} else { } else {
APIError? apiError; APIError? apiError;
apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); apiError =
APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
throw APIException(APIException.BAD_REQUEST, error: apiError); throw APIException(APIException.BAD_REQUEST, error: apiError);
} }
// } catch (ex) { // } catch (ex) {
@ -103,7 +116,11 @@ class ApiClient {
} }
Future<Response> postJsonForResponse<T>(String url, T jsonObject, Future<Response> postJsonForResponse<T>(String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async { {String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0,
bool isFormData = false}) async {
String? requestBody; String? requestBody;
late Map<String, String> stringObj; late Map<String, String> stringObj;
if (jsonObject != null) { if (jsonObject != null) {
@ -117,13 +134,22 @@ class ApiClient {
if (isFormData) { if (isFormData) {
headers = {'Content-Type': 'application/x-www-form-urlencoded'}; headers = {'Content-Type': 'application/x-www-form-urlencoded'};
stringObj = ((jsonObject ?? {}) as Map<String, dynamic>).map((key, value) => MapEntry(key, value?.toString() ?? "")); stringObj = ((jsonObject ?? {}) as Map<String, dynamic>)
.map((key, value) => MapEntry(key, value?.toString() ?? ""));
} }
return await _postForResponse(url, isFormData ? stringObj : requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); return await _postForResponse(url, isFormData ? stringObj : requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes);
} }
Future<Response> _postForResponse(String url, requestBody, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { Future<Response> _postForResponse(String url, requestBody,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0}) async {
try { try {
var _headers = <String, String>{}; var _headers = <String, String>{};
if (token != null) { if (token != null) {
@ -138,7 +164,9 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query; var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString; url = url + '?' + queryString;
} }
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 60)); var response =
await _post(Uri.parse(url), body: requestBody, headers: _headers)
.timeout(Duration(seconds: 120));
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
return response; return response;
@ -149,7 +177,11 @@ class ApiClient {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
@ -157,7 +189,11 @@ class ApiClient {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
@ -167,23 +203,39 @@ class ApiClient {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _postForResponse(url, requestBody,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} }
} }
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { Future<Response> getJsonForResponse<T>(String url,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0}) async {
if (headers == null) { if (headers == null) {
headers = {'Content-Type': 'application/json'}; headers = {'Content-Type': 'application/json'};
} else { } else {
headers['Content-Type'] = 'application/json'; headers['Content-Type'] = 'application/json';
} }
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes);
} }
Future<Response> _getForResponse(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async { Future<Response> _getForResponse(String url,
{String? token,
Map<String, dynamic>? queryParameters,
Map<String, String>? headers,
int retryTimes = 0}) async {
try { try {
var _headers = <String, String>{}; var _headers = <String, String>{};
if (token != null) { if (token != null) {
@ -198,7 +250,8 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query; var queryString = new Uri(queryParameters: queryParameters).query;
url = url + '?' + queryString; url = url + '?' + queryString;
} }
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60)); var response = await _get(Uri.parse(url), headers: _headers)
.timeout(Duration(seconds: 60));
if (response.statusCode >= 200 && response.statusCode < 300) { if (response.statusCode >= 200 && response.statusCode < 300) {
return response; return response;
@ -209,7 +262,11 @@ class ApiClient {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
@ -217,7 +274,11 @@ class ApiClient {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
@ -227,14 +288,19 @@ class ApiClient {
if (retryTimes > 0) { if (retryTimes > 0) {
print('will retry after 3 seconds...'); print('will retry after 3 seconds...');
await Future.delayed(Duration(seconds: 3)); await Future.delayed(Duration(seconds: 3));
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); return await _getForResponse(url,
token: token,
queryParameters: queryParameters,
headers: headers,
retryTimes: retryTimes - 1);
} else { } else {
throw APIException(APIException.OTHER, arguments: e); throw APIException(APIException.OTHER, arguments: e);
} }
} }
} }
Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers)); Future<Response> _get(url, {Map<String, String>? headers}) =>
_withClient((client) => client.get(url, headers: headers));
bool _certificateCheck(X509Certificate cert, String host, int port) => true; bool _certificateCheck(X509Certificate cert, String host, int port) => true;
@ -248,5 +314,8 @@ class ApiClient {
} }
} }
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); Future<Response> _post(url,
{Map<String, String>? headers, body, Encoding? encoding}) =>
_withClient((client) =>
client.post(url, headers: headers, body: body, encoding: encoding));
} }

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
@ -37,6 +38,20 @@ class DashboardApiClient {
}, url, postParams); }, url, postParams);
} }
Future<GenericResponseModel?> getCOCNotifications() async {
String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks";
Map<String, dynamic> postParams = {
"Date": DateUtil.getISODateFormat(DateTime.now()),
"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData;
}, url, postParams);
}
Future<ItgFormsModel?> getItgFormsPendingTask() async { Future<ItgFormsModel?> getItgFormsPendingTask() async {
String url = "${ApiConsts.cocRest}ITGFormsPendingTasks"; String url = "${ApiConsts.cocRest}ITGFormsPendingTasks";
Map<String, dynamic> postParams = {}; Map<String, dynamic> postParams = {};
@ -47,7 +62,8 @@ class DashboardApiClient {
}, url, postParams); }, url, postParams);
} }
Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate) async { Future<List<GetAccrualBalancesList>> getAccrualBalances(
String effectiveDate) async {
String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES"; String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate}; Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
@ -81,7 +97,10 @@ class DashboardApiClient {
//GET_MENU_ENTRIES //GET_MENU_ENTRIES
Future<GenericResponseModel?> getGetMenuEntries() async { Future<GenericResponseModel?> getGetMenuEntries() async {
String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES"; String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"}; Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999,
"P_MENU_TYPE": "E"
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -90,7 +109,13 @@ class DashboardApiClient {
} }
//Mark Attendance //Mark Attendance
Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async { Future<GenericResponseModel?> markAttendance(
{String lat = "0",
String? long = "0",
required int pointType,
String nfcValue = "",
bool isGpsRequired = false,
String QRValue = ""}) async {
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";
var uuid = Uuid(); var uuid = Uuid();
// Generate a v4 (random) id // Generate a v4 (random) id

@ -91,7 +91,7 @@ class LoginApiClient {
AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName; AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName;
AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE; AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE;
AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE; AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE;
AppState().setBusinessCardPrivilege = responseData.businessCardPrivilege ?? false;
return responseData; return responseData;
}, url, postParams); }, url, postParams);
} }

@ -37,7 +37,7 @@ class MyAttendanceApiClient {
}, url, postParams); }, url, postParams);
} }
Future<ESERVICESVS> getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List<Map<String, dynamic>> list) async { Future<List<ESERVICESVS>> getValueSetValues(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List<Map<String, dynamic>> list) async {
String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES"; String url = "${ApiConsts.erpRest}GET_VALUE_SET_VALUES";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999, "P_SELECTED_RESP_ID": -999,
@ -53,7 +53,7 @@ class MyAttendanceApiClient {
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json); GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getValueSetValuesList!.first; return responseData.getValueSetValuesList ?? [];
}, url, postParams); }, url, postParams);
} }

@ -1,5 +1,3 @@
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
@ -19,7 +17,6 @@ class MyTeamApiClient {
factory MyTeamApiClient() => _instance; factory MyTeamApiClient() => _instance;
Future<List<GetEmployeeSubordinatesList>> getEmployeeSubordinates(String searchEmpEmail, String searchEmpName, String searchEmpNo) async { Future<List<GetEmployeeSubordinatesList>> getEmployeeSubordinates(String searchEmpEmail, String searchEmpName, String searchEmpNo) async {
String url = "${ApiConsts.erpRest}GET_EMPLOYEE_SUBORDINATES"; String url = "${ApiConsts.erpRest}GET_EMPLOYEE_SUBORDINATES";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
@ -72,7 +69,6 @@ class MyTeamApiClient {
}, url, postParams); }, url, postParams);
} }
Future<GetAttendanceTracking?> getAttendanceTracking(String? empID) async { Future<GetAttendanceTracking?> getAttendanceTracking(String? empID) async {
String url = "${ApiConsts.erpRest}GET_Attendance_Tracking"; String url = "${ApiConsts.erpRest}GET_Attendance_Tracking";
Map<String, dynamic> postParams = {}; Map<String, dynamic> postParams = {};
@ -104,10 +100,7 @@ class MyTeamApiClient {
Future<List<GetMenuEntriesList>> employeeSubordinatesRequest(String? empID) async { Future<List<GetMenuEntriesList>> employeeSubordinatesRequest(String? empID) async {
String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES"; String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {"P_MENU_TYPE": "M", "P_SELECTED_RESP_ID": -999};
"P_MENU_TYPE": "M",
"P_SELECTED_RESP_ID": -999,
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID;
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
@ -118,8 +111,7 @@ class MyTeamApiClient {
Future<List<GetFavoriteReplacements>?> getFavoriteReplacement() async { Future<List<GetFavoriteReplacements>?> getFavoriteReplacement() async {
String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements"; String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {};
};
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -138,7 +130,7 @@ class MyTeamApiClient {
}; };
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"Mohemm_ChangeReplacementsInputList": [postParamsObj], "Mohemm_ChangeReplacementsInputList": [postParamsObj],
//postParams["Mohemm_ChangeReplacementsInputList"] = list; //postParams["Mohemm_ChangeReplacementsInputList"] = list;
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
@ -151,7 +143,7 @@ class MyTeamApiClient {
String url = "${ApiConsts.erpRest}GET_SUBORDINATES_LEAVES_TOTAL_VACATIONS"; String url = "${ApiConsts.erpRest}GET_SUBORDINATES_LEAVES_TOTAL_VACATIONS";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {
"P_DATE_FROM": dateFrom, "P_DATE_FROM": dateFrom,
"P_DATE_TO": dateTo, "P_DATE_TO": dateTo,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
@ -160,4 +152,3 @@ class MyTeamApiClient {
}, url, postParams); }, url, postParams);
} }
} }

@ -296,7 +296,39 @@ class WorkListApiClient {
"RequestType": requestType, "RequestType": requestType,
"TaskID": taskId, "TaskID": taskId,
"ItemID": itemId, "ItemID": itemId,
"EmployeeNumber": "15153", "EmployeeNumber": employeeNumber,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> rejectITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
String url = "${ApiConsts.cocRest}ITGRejectRequest";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"Comments": comments,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
ItgFormsModel responseData = ItgFormsModel.fromJson(json);
return responseData.itgRequest;
}, url, postParams);
}
Future<ITGRequest?> approveITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
String url = "${ApiConsts.cocRest}ITGApproveRequest";
Map<String, dynamic> postParams = {
"RequestType": requestType,
"TaskID": taskId,
"ItemID": itemId,
"EmployeeNumber": employeeNumber,
"Comments": comments,
}; };
postParams.addAll(AppState().postParamsJson); postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {

@ -25,6 +25,12 @@ class AppState {
bool? get getIsLogged => isLogged; bool? get getIsLogged => isLogged;
bool businessCardPrivilege = false;
set setBusinessCardPrivilege(bool v) => businessCardPrivilege = v;
bool? get getBusinessCardPrivilege => businessCardPrivilege;
String? forgetPasswordTokenID; String? forgetPasswordTokenID;
set setForgetPasswordTokenID(token) => forgetPasswordTokenID = token; set setForgetPasswordTokenID(token) => forgetPasswordTokenID = token;

@ -17,7 +17,7 @@ class CodegenLoader extends AssetLoader{
static const Map<String,dynamic> ar_SA = { static const Map<String,dynamic> ar_SA = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "تسجيل الدخول", "login": "تسجيل الدخول",
"pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول", "pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول",
"username": "اسم المستخدم", "username": "اسم المستخدم",
@ -27,6 +27,7 @@ class CodegenLoader extends AssetLoader{
"lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:", "lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:",
"verificationType": "نوع التحقق:", "verificationType": "نوع التحقق:",
"pleaseVerify": "ارجوك تحقق", "pleaseVerify": "ارجوك تحقق",
"pleaseVerifyForBio": "الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات",
"verifyThroughFace": "تحقق من خلال الوجه", "verifyThroughFace": "تحقق من خلال الوجه",
"verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع", "verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع",
"verifyThroughSMS": "تحقق من خلال الرسائل القصيرة", "verifyThroughSMS": "تحقق من خلال الرسائل القصيرة",
@ -294,7 +295,7 @@ class CodegenLoader extends AssetLoader{
"enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية", "enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية",
"endDate": "تاريخ الانتهاء", "endDate": "تاريخ الانتهاء",
"removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟", "removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟",
"updateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟", "wantUpdateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"addNewFamilyMember": "اضافة عضو جديد", "addNewFamilyMember": "اضافة عضو جديد",
"addRow": "اضافة صف جديد", "addRow": "اضافة صف جديد",
"pleaseSelect": "الرجاء اختيار", "pleaseSelect": "الرجاء اختيار",
@ -420,8 +421,17 @@ class CodegenLoader extends AssetLoader{
"addFavoriteList": "هل تريد اضافة {name} لقائمة المفضله", "addFavoriteList": "هل تريد اضافة {name} لقائمة المفضله",
"feedbackUserExperience": "هذا للحصول على تعليقات حول تجربة المستخدم", "feedbackUserExperience": "هذا للحصول على تعليقات حول تجربة المستخدم",
"rateUI": ".1 كيف تريد تقييم التطبيق", "rateUI": ".1 كيف تريد تقييم التطبيق",
"Submit Survey": "ارسال الاستبيان", "submitSurvey": "ارسال الاستبيان",
"typeHere": "اكتب هنا", "typeHere": "اكتب هنا",
"currentBalance": "الرصيد الحالي",
"currentLeaveBalance": "رصيد الاجازات الحالي",
"calculatedDays": "الايام المحسوبه",
"totalDays": "مجموع الأيام",
"usedBalance": "المستخدم",
"infants": "رضيع",
"child": "طفل",
"adult": "بالغ",
"updateMember": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",
@ -459,7 +469,7 @@ class CodegenLoader extends AssetLoader{
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
"english": "English", "english": "English",
"arabic": "Arabic", "arabic": "عربي",
"login": "Login", "login": "Login",
"pleaseEnterLoginDetails": "Please enter the detail below to login", "pleaseEnterLoginDetails": "Please enter the detail below to login",
"username": "Username", "username": "Username",
@ -469,6 +479,7 @@ static const Map<String,dynamic> en_US = {
"lastLoginDetails": "Last Login Details:", "lastLoginDetails": "Last Login Details:",
"verificationType": "Verification Type:", "verificationType": "Verification Type:",
"pleaseVerify": "Please Verify", "pleaseVerify": "Please Verify",
"pleaseVerifyForBio": "Please verify login with one of the following options",
"verifyThroughFace": "Verify Through Face", "verifyThroughFace": "Verify Through Face",
"verifyThroughFingerprint": "Verify Through Fingerprint", "verifyThroughFingerprint": "Verify Through Fingerprint",
"verifyThroughSMS": "Verify Through SMS", "verifyThroughSMS": "Verify Through SMS",
@ -733,7 +744,7 @@ static const Map<String,dynamic> en_US = {
"enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)", "enterNewInfo": "Enter new Information because of a real change to the current details (e.g because of a change in marital status)",
"endDate": "*End Date", "endDate": "*End Date",
"removeThisMember": "Are You Sure You Want to Remove this Member?", "removeThisMember": "Are You Sure You Want to Remove this Member?",
"updateThisMember": "Are You Sure You Want to Update this Member?", "wantUpdateThisMember": "Are You Sure You Want to Update this Member?",
"addNewFamilyMember": "Add New Family Member", "addNewFamilyMember": "Add New Family Member",
"addRow": "Add new row", "addRow": "Add new row",
"pleaseSelect": "Please Select *", "pleaseSelect": "Please Select *",
@ -862,8 +873,17 @@ static const Map<String,dynamic> en_US = {
"addFavoriteList": "Do you want to add {name} in your favorite list", "addFavoriteList": "Do you want to add {name} in your favorite list",
"feedbackUserExperience": "This is to get the feedback about the user experience", "feedbackUserExperience": "This is to get the feedback about the user experience",
"rateUI": "1. How would you rate this UI?", "rateUI": "1. How would you rate this UI?",
"Submit Survey": "Submit Survey", "submitSurvey": "Submit Survey",
"typeHere": "Type here", "typeHere": "Type here",
"currentBalance": "Current Balance",
"currentLeaveBalance": "Current Leave Balance",
"calculatedDays": "Calculated Days",
"totalDays": "Total Days",
"usedBalance": "Used",
"infants": "Infants",
"child": "Child",
"adult": "Adult",
"updateMember": "Are You Sure You Want to Update this Member?",
"profile": { "profile": {
"reset_password": { "reset_password": {
"label": "Reset Password", "label": "Reset Password",

@ -280,7 +280,7 @@ abstract class LocaleKeys {
static const enterNewInfo = 'enterNewInfo'; static const enterNewInfo = 'enterNewInfo';
static const endDate = 'endDate'; static const endDate = 'endDate';
static const removeThisMember = 'removeThisMember'; static const removeThisMember = 'removeThisMember';
static const updateThisMember = 'updateThisMember '; static const wantUpdateThisMember = 'wantUpdateThisMember ';
static const addNewFamilyMember = 'addNewFamilyMember'; static const addNewFamilyMember = 'addNewFamilyMember';
static const addRow = 'addRow'; static const addRow = 'addRow';
static const pleaseSelect = 'pleaseSelect'; static const pleaseSelect = 'pleaseSelect';
@ -410,6 +410,15 @@ abstract class LocaleKeys {
static const typeHere = 'typeHere'; static const typeHere = 'typeHere';
static const info_detail = 'info_detail'; static const info_detail = 'info_detail';
static const amount_detail = 'amount_detail'; static const amount_detail = 'amount_detail';
static const currentBalance = 'currentBalance';
static const currentLeaveBalance = 'currentLeaveBalance';
static const calculatedDays = 'calculatedDays';
static const totalDays = 'totalDays';
static const usedBalance = 'usedBalance';
static const infants = 'infants';
static const child = 'child';
static const adult = 'adult';
static const updateMember = 'updateMember';
static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_label = 'profile.reset_password.label';
static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_username = 'profile.reset_password.username';
static const profile_reset_password_password = 'profile.reset_password.password'; static const profile_reset_password_password = 'profile.reset_password.password';

@ -10,7 +10,7 @@ class GetAccrualBalancesList {
}); });
double? accrualNetEntitlement; double? accrualNetEntitlement;
int? accrualUsedEntitlement; num? accrualUsedEntitlement; //Todo: Add function
dynamic accrualYearlyEntitlement; dynamic accrualYearlyEntitlement;
String? accuralPlanName; String? accuralPlanName;
String? endDate; String? endDate;

@ -0,0 +1,44 @@
class MohemmITGPendingTaskResponseItem {
int? escalation;
int? exceedTAT;
int? extendTATRequest;
int? open;
int? pendningWithReviewer;
int? waitingForAcceptance;
int? waitingToClose;
int? withInTAT;
MohemmITGPendingTaskResponseItem(
{this.escalation,
this.exceedTAT,
this.extendTATRequest,
this.open,
this.pendningWithReviewer,
this.waitingForAcceptance,
this.waitingToClose,
this.withInTAT});
MohemmITGPendingTaskResponseItem.fromJson(Map<String, dynamic> json) {
escalation = json['escalation'];
exceedTAT = json['exceedTAT'];
extendTATRequest = json['extendTATRequest'];
open = json['open'];
pendningWithReviewer = json['pendningWithReviewer'];
waitingForAcceptance = json['waitingForAcceptance'];
waitingToClose = json['waitingToClose'];
withInTAT = json['withInTAT'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = new Map<String, dynamic>();
data['escalation'] = this.escalation;
data['exceedTAT'] = this.exceedTAT;
data['extendTATRequest'] = this.extendTATRequest;
data['open'] = this.open;
data['pendningWithReviewer'] = this.pendningWithReviewer;
data['waitingForAcceptance'] = this.waitingForAcceptance;
data['waitingToClose'] = this.waitingToClose;
data['withInTAT'] = this.withInTAT;
return data;
}
}

File diff suppressed because it is too large Load Diff

@ -44,22 +44,22 @@ class POHeader {
String? cOMMENTS; String? cOMMENTS;
String? cREATIONDATE; String? cREATIONDATE;
String? cURRENCYNAME; String? cURRENCYNAME;
int? cUSTOMDUTY; num? cUSTOMDUTY;
int? dISCOUNTAMOUNT; num? dISCOUNTAMOUNT;
int? gROSSAMOUNT; num? gROSSAMOUNT;
String? lOCCUR; String? lOCCUR;
int? lOCCURTOTPOAMT; num? lOCCURTOTPOAMT;
int? oTHERCHARGES; num? oTHERCHARGES;
String? pAYMENTTERMS; String? pAYMENTTERMS;
String? pONUMBER; String? pONUMBER;
String? pREPARER; String? pREPARER;
String? qUOTATIONDATE; String? qUOTATIONDATE;
String? qUOTATIONNUMBER; String? qUOTATIONNUMBER;
int? sALESTAX; num? sALESTAX;
int? sHIPHANDLE; num? sHIPHANDLE;
String? sHIPTOLOCATIONNAME; String? sHIPTOLOCATIONNAME;
int? tOTALPODISCOUNT; num? tOTALPODISCOUNT;
int? tOTPOAMT; num? tOTPOAMT;
String? tOTPOAMTWORD; String? tOTPOAMTWORD;
String? vENDORNAME; String? vENDORNAME;
String? vENDORSITECODE; String? vENDORSITECODE;

@ -4,7 +4,7 @@ import 'package:mohem_flutter_app/models/itg_forms_models/wf_history_model.dart'
class ITGRequest { class ITGRequest {
List<AllowedActions>? allowedActions; List<AllowedActions>? allowedActions;
Null? attachments; List<dynamic>? attachments;
List<FieldGoups>? fieldGoups; List<FieldGoups>? fieldGoups;
Null? grantFields; Null? grantFields;
List<WFHistory>? wFHistory; List<WFHistory>? wFHistory;

@ -1,6 +1,6 @@
class CalculateAbsenceDuration { class CalculateAbsenceDuration {
int? pABSENCEDAYS; num? pABSENCEDAYS;
int? pABSENCEHOURS; num? pABSENCEHOURS;
String? pRETURNMSG; String? pRETURNMSG;
String? pRETURNSTATUS; String? pRETURNSTATUS;

@ -1,10 +1,10 @@
class GetDeductionsList { class GetDeductionsList {
int? aMOUNT; num? aMOUNT;
String? eLEMENTNAME; String? eLEMENTNAME;
int? fROMROWNUM; num? fROMROWNUM;
int? nOOFROWS; num? nOOFROWS;
int? rOWNUM; num? rOWNUM;
int? tOROWNUM; num? tOROWNUM;
GetDeductionsList( GetDeductionsList(
{this.aMOUNT, {this.aMOUNT,

@ -1,10 +1,10 @@
class GetEarningsList { class GetEarningsList {
int? aMOUNT; num? aMOUNT;
String? eLEMENTNAME; String? eLEMENTNAME;
int? fROMROWNUM; num? fROMROWNUM;
int? nOOFROWS; num? nOOFROWS;
int? rOWNUM; num? rOWNUM;
int? tOROWNUM; num? tOROWNUM;
GetEarningsList( GetEarningsList(
{this.aMOUNT, {this.aMOUNT,

@ -1,10 +1,10 @@
class GetSummaryOfPaymentList { class GetSummaryOfPaymentList {
int? tOTALDEDUCTIONSAMOUNT; num? tOTALDEDUCTIONSAMOUNT;
int? tOTALDEDUCTIONSPERCENTAGE; num? tOTALDEDUCTIONSPERCENTAGE;
int? tOTALEARNINGSAMOUNT; num? tOTALEARNINGSAMOUNT;
int? tOTALEARNINGSPERCENTAGE; num? tOTALEARNINGSPERCENTAGE;
int? tOTALPAYAMOUNT; num? tOTALPAYAMOUNT;
int? tOTALPAYPERCENTAGE; num? tOTALPAYPERCENTAGE;
GetSummaryOfPaymentList( GetSummaryOfPaymentList(
{this.tOTALDEDUCTIONSAMOUNT, {this.tOTALDEDUCTIONSAMOUNT,

@ -15,6 +15,7 @@ import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/dashboard/menus.dart'; import 'package:mohem_flutter_app/models/dashboard/menus.dart';
import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_responseitem.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
@ -59,10 +60,13 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
isAttendanceTrackingLoading = false; isAttendanceTrackingLoading = false;
// isTimeRemainingInSeconds = calculateSeconds( "00:00:00"); // isTimeRemainingInSeconds = calculateSeconds( "00:00:00");
if (attendanceTracking?.pSwipeIn != null) { if (attendanceTracking?.pSwipeIn != null) {
isTimeRemainingInSeconds = calculateSeconds(attendanceTracking!.pRemainingHours ?? "00:00:00"); isTimeRemainingInSeconds =
int totalShiftTimeInSeconds = calculateSeconds(attendanceTracking!.pScheduledHours ?? "00:00:00"); calculateSeconds(attendanceTracking!.pRemainingHours ?? "00:00:00");
int totalShiftTimeInSeconds =
calculateSeconds(attendanceTracking!.pScheduledHours ?? "00:00:00");
progress = (isTimeRemainingInSeconds / totalShiftTimeInSeconds); progress = (isTimeRemainingInSeconds / totalShiftTimeInSeconds);
endTime = DateTime.now().millisecondsSinceEpoch + Duration(seconds: isTimeRemainingInSeconds).inMilliseconds; endTime = DateTime.now().millisecondsSinceEpoch +
Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
} }
notifyListeners(); notifyListeners();
@ -72,6 +76,33 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
return true; return true;
} }
void initProvider() {
isAttendanceTrackingLoading = true;
endTime = 0;
isTimeRemainingInSeconds = 0;
progress = 0.0;
attendanceTracking = null;
isWorkListLoading = true;
workListCounter = 0;
isMissingSwipeLoading = true;
missingSwipeCounter = 0;
isLeaveTicketBalanceLoading = true;
accrualList = null;
leaveBalanceAccrual = null;
ticketBalance = 0;
isServicesMenusLoading = true;
homeMenus = null;
getMenuEntriesList = null;
isOffersLoading = true;
getOffersList = [];
notifyListeners();
}
int calculateSeconds(String time) { int calculateSeconds(String time) {
int hour = int.parse(time.split(":")[0]); int hour = int.parse(time.split(":")[0]);
int mints = int.parse(time.split(":")[1]); int mints = int.parse(time.split(":")[1]);
@ -81,27 +112,36 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void update(context) { void update(context) {
fetchAttendanceTracking(context); fetchAttendanceTracking(context);
// isAttendanceTrackingLoading = !isAttendanceTrackingLoading;
// isWorkListLoading = !isWorkListLoading;
// attendanceTracking?.pSwipeIn = "a";
// isTimeRemainingInSeconds = calculateSeconds("00:10:30");
// endTime = DateTime.now().millisecondsSinceEpoch + Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
// notifyListeners();
} }
ItgFormsModel? itgFormsModel; ItgFormsModel? itgFormsModel;
List<GetOpenNotificationsList>? getOpenNotificationsList; List<GetOpenNotificationsList>? getOpenNotificationsList;
MohemmITGPendingTaskResponseItem? cocCount;
int cocFinalCount = 0;
//Work List API's & Methods //Work List API's & Methods
Future fetchWorkListCounter(context, {bool showLoading = false}) async { Future fetchWorkListCounter(context, {bool showLoading = false}) async {
try { try {
if (showLoading) Utils.showLoading(context); if (showLoading) Utils.showLoading(context);
GenericResponseModel? genericResponseModel = await DashboardApiClient().getOpenNotifications(); GenericResponseModel? genericResponseModel =
await DashboardApiClient().getOpenNotifications();
isWorkListLoading = false; isWorkListLoading = false;
getOpenNotificationsList = genericResponseModel?.getOpenNotificationsList; getOpenNotificationsList = genericResponseModel?.getOpenNotificationsList;
workListCounter = genericResponseModel?.pOPENNTFNUMBER ?? 0; workListCounter = genericResponseModel?.pOPENNTFNUMBER ?? 0;
itgFormsModel = await DashboardApiClient().getItgFormsPendingTask(); itgFormsModel = await DashboardApiClient().getItgFormsPendingTask();
workListCounter = workListCounter + (itgFormsModel?.totalCount ?? 0); workListCounter = workListCounter + (itgFormsModel?.totalCount ?? 0);
GenericResponseModel? cocGenericResponseModel =
await DashboardApiClient().getCOCNotifications();
cocCount = cocGenericResponseModel?.mohemmITGPendingTaskResponseItem;
if (cocCount != null) {
cocFinalCount = (cocCount?.escalation ?? 0) +
(cocCount?.waitingToClose ?? 0) +
(cocCount?.waitingForAcceptance ?? 0) +
(cocCount?.extendTATRequest ?? 0);
workListCounter += cocFinalCount;
}
if (showLoading) Utils.hideLoading(context); if (showLoading) Utils.hideLoading(context);
notifyListeners(); notifyListeners();
} catch (ex) { } catch (ex) {
@ -116,9 +156,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Missing Siwpe API's & Methods //Missing Siwpe API's & Methods
Future fetchMissingSwipe(context) async { Future fetchMissingSwipe(context) async {
try { try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getOpenMissingSwipes(); GenericResponseModel? genericResponseModel =
await DashboardApiClient().getOpenMissingSwipes();
isMissingSwipeLoading = false; isMissingSwipeLoading = false;
missingSwipeCounter = genericResponseModel!.getOpenMissingSwipesList!.pOpenMissingSwipes ?? 0; missingSwipeCounter =
genericResponseModel!.getOpenMissingSwipesList!.pOpenMissingSwipes ??
0;
notifyListeners(); notifyListeners();
} catch (ex) { } catch (ex) {
isMissingSwipeLoading = false; isMissingSwipeLoading = false;
@ -131,10 +174,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Leave and Ticket Balance API's & Methods //Leave and Ticket Balance API's & Methods
Future fetchLeaveTicketBalance(context, DateTime date) async { Future fetchLeaveTicketBalance(context, DateTime date) async {
try { try {
accrualList = await DashboardApiClient().getAccrualBalances(DateFormat("MM/dd/yyyy").format(date)); accrualList = await DashboardApiClient()
.getAccrualBalances(DateFormat("MM/dd/yyyy").format(date));
isLeaveTicketBalanceLoading = false; isLeaveTicketBalanceLoading = false;
leaveBalanceAccrual = accrualList![0]; leaveBalanceAccrual = accrualList![0];
ticketBalance = (accrualList![1].accrualNetEntitlement ?? 0.0) + (accrualList![2].accrualNetEntitlement ?? 0.0); ticketBalance = (accrualList![1].accrualNetEntitlement ?? 0.0) +
(accrualList![2].accrualNetEntitlement ?? 0.0);
notifyListeners(); notifyListeners();
} catch (ex) { } catch (ex) {
isLeaveTicketBalanceLoading = false; isLeaveTicketBalanceLoading = false;
@ -147,23 +192,36 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//List Menu API's & Methods //List Menu API's & Methods
List<DrawerMenuItem> drawerMenuItemList = [ List<DrawerMenuItem> drawerMenuItemList = [
DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile), DrawerMenuItem("assets/images/drawer/my_profile.svg",
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation), LocaleKeys.myProfile.tr(), AppRoutes.profile),
DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi), DrawerMenuItem("assets/images/drawer/performance_evaluation.svg",
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions), LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword), DrawerMenuItem("assets/images/drawer/mowadhafi.svg",
LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi),
DrawerMenuItem("assets/images/drawer/pending_trasactions.svg",
LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions),
DrawerMenuItem("assets/images/drawer/change_password.svg",
LocaleKeys.changePassword.tr(), AppRoutes.changePassword),
]; ];
void fetchListMenu() async { void fetchListMenu() async {
try { try {
List<ListMenu> menuList = await DashboardApiClient().getListMenu(); List<ListMenu> menuList = await DashboardApiClient().getListMenu();
List findMyRequest = menuList.where((element) => element.menuType == "E").toList(); List findMyRequest =
menuList.where((element) => element.menuType == "E").toList();
if (findMyRequest.isNotEmpty) { if (findMyRequest.isNotEmpty) {
drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myRequests)); drawerMenuItemList.insert(
3,
DrawerMenuItem("assets/images/drawer/my_requests.svg",
LocaleKeys.myRequest.tr(), AppRoutes.myRequests));
} }
List findMyTeam = menuList.where((element) => element.menuType == "M").toList(); List findMyTeam =
menuList.where((element) => element.menuType == "M").toList();
if (findMyTeam.isNotEmpty) { if (findMyTeam.isNotEmpty) {
drawerMenuItemList.insert(2, DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam)); drawerMenuItemList.insert(
2,
DrawerMenuItem("assets/images/drawer/my_team.svg",
LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam));
} }
} catch (ex) { } catch (ex) {
logger.wtf(ex); logger.wtf(ex);
@ -174,12 +232,19 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Menu Entries API's & Methods //Menu Entries API's & Methods
void fetchMenuEntries() async { void fetchMenuEntries() async {
try { try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getGetMenuEntries(); GenericResponseModel? genericResponseModel =
await DashboardApiClient().getGetMenuEntries();
getMenuEntriesList = genericResponseModel!.getMenuEntriesList; getMenuEntriesList = genericResponseModel!.getMenuEntriesList;
homeMenus = parseMenus(getMenuEntriesList ?? []); homeMenus = parseMenus(getMenuEntriesList ?? []);
if (homeMenus!.isNotEmpty) { if (homeMenus!.isNotEmpty) {
homeMenus!.first.menuEntiesList.insert(0, GetMenuEntriesList(requestType: "MONTHLY_ATTENDANCE", prompt: LocaleKeys.monthlyAttendance.tr())); homeMenus!.first.menuEntiesList.insert(
homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(requestType: "VACATION_RULE", prompt: LocaleKeys.vacationRule.tr())); 0,
GetMenuEntriesList(
requestType: "MONTHLY_ATTENDANCE",
prompt: LocaleKeys.monthlyAttendance.tr()));
homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(
requestType: "VACATION_RULE",
prompt: LocaleKeys.vacationRule.tr()));
} }
isServicesMenusLoading = false; isServicesMenusLoading = false;
notifyListeners(); notifyListeners();
@ -207,7 +272,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
List<Menus> menus = []; List<Menus> menus = [];
for (int i = 0; i < getMenuEntriesList.length; i++) { for (int i = 0; i < getMenuEntriesList.length; i++) {
if (getMenuEntriesList[i].parentMenuName!.isEmpty) { if (getMenuEntriesList[i].parentMenuName!.isEmpty) {
menus.add(Menus(getMenuEntriesList[i], getMenuEntriesList.where((element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList())); menus.add(Menus(
getMenuEntriesList[i],
getMenuEntriesList
.where((element) =>
getMenuEntriesList[i].menuName == element.parentMenuName)
.toList()));
} }
} }
return menus; return menus;

@ -1,8 +1,10 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
@ -70,7 +72,7 @@ class EmployeeDigitialIdDialog extends StatelessWidget {
width: 160, width: 160,
height: 160, height: 160,
), ),
DefaultButton("Cancel", () { DefaultButton(LocaleKeys.close.tr(), () {
Navigator.pop(context); Navigator.pop(context);
}) })
], ],

@ -23,6 +23,7 @@ import 'package:mohem_flutter_app/widgets/mark_attendance_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/offers_shimmer_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class DashboardScreen extends StatefulWidget { class DashboardScreen extends StatefulWidget {
DashboardScreen({Key? key}) : super(key: key); DashboardScreen({Key? key}) : super(key: key);
@ -37,12 +38,24 @@ class _DashboardScreenState extends State<DashboardScreen> {
late DashboardProviderModel data; late DashboardProviderModel data;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey(); final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey();
final RefreshController _refreshController = RefreshController(initialRefresh: false);
int currentIndex = 0; int currentIndex = 0;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
data = Provider.of<DashboardProviderModel>(context, listen: false); data = Provider.of<DashboardProviderModel>(context, listen: false);
_onRefresh();
}
@override
void dispose() {
super.dispose();
}
void _onRefresh() async {
data.initProvider();
data.fetchListMenu(); data.fetchListMenu();
data.fetchAttendanceTracking(context); data.fetchAttendanceTracking(context);
data.fetchWorkListCounter(context); data.fetchWorkListCounter(context);
@ -50,11 +63,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
data.fetchLeaveTicketBalance(context, DateTime.now()); data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries(); data.fetchMenuEntries();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
} _refreshController.refreshCompleted();
@override
void dispose() {
super.dispose();
} }
@override @override
@ -122,236 +131,243 @@ class _DashboardScreenState extends State<DashboardScreen> {
], ],
).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7),
Expanded( Expanded(
child: SingleChildScrollView( child: SmartRefresher(
child: Column( enablePullDown: true,
children: [ enablePullUp: false,
Column( header: const MaterialClassicHeader(color: MyColors.gradiantEndColor,),
crossAxisAlignment: CrossAxisAlignment.start, controller: _refreshController,
children: [ onRefresh: _onRefresh,
LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), child: SingleChildScrollView(
(AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true), child: Column(
16.height, children: [
Row( Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
Expanded( children: [
child: AspectRatio( LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color),
aspectRatio: 159 / 159, (AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true),
child: Consumer<DashboardProviderModel>( 16.height,
builder: (context, model, child) { Row(
return (model.isAttendanceTrackingLoading children: [
? GetAttendanceTrackingShimmer() Expanded(
: Container( child: AspectRatio(
decoration: BoxDecoration( aspectRatio: 159 / 159,
borderRadius: BorderRadius.circular(15), child: Consumer<DashboardProviderModel>(
gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ builder: (context, model, child) {
MyColors.gradiantEndColor, return (model.isAttendanceTrackingLoading
MyColors.gradiantStartColor, ? GetAttendanceTrackingShimmer()
]), : Container(
), decoration: BoxDecoration(
child: Stack( borderRadius: BorderRadius.circular(15),
alignment: Alignment.center, gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
children: [ MyColors.gradiantEndColor,
if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), MyColors.gradiantStartColor,
Column( ]),
crossAxisAlignment: CrossAxisAlignment.start, ),
children: [ child: Stack(
Expanded( alignment: Alignment.center,
child: Column( children: [
mainAxisSize: MainAxisSize.min, if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
crossAxisAlignment: CrossAxisAlignment.start, Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), children: [
if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), Expanded(
if (model.isTimeRemainingInSeconds != 0) child: Column(
Column( mainAxisSize: MainAxisSize.min,
mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
9.height, if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white),
CountdownTimer( if (model.isTimeRemainingInSeconds != 0)
endTime: model.endTime, Column(
onEnd: null, mainAxisSize: MainAxisSize.min,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), crossAxisAlignment: CrossAxisAlignment.start,
textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
child: LinearProgressIndicator(
value: model.progress,
minHeight: 8,
valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
],
),
],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [ children: [
Expanded( 9.height,
child: Column( CountdownTimer(
mainAxisSize: MainAxisSize.min, endTime: model.endTime,
crossAxisAlignment: CrossAxisAlignment.start, onEnd: null,
children: [ endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
LocaleKeys.checkIn.tr().toText12(color: Colors.white), textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn)
.toString()
.toText14(color: Colors.white, isBold: true),
4.height,
],
).paddingOnly(left: 12),
), ),
Container( LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
width: 45, 9.height,
height: 45, ClipRRect(
padding: const EdgeInsets.only(left: 14, right: 14), borderRadius: BorderRadius.all(
decoration: const BoxDecoration( Radius.circular(20),
color: Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(15),
),
), ),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), child: LinearProgressIndicator(
).onPress(() { value: model.progress,
showMyBottomSheet(context, child: MarkAttendanceWidget(model)); minHeight: 8,
}), valueColor: const AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: const Color(0xff196D73),
),
),
], ],
), ),
], ],
).paddingOnly(top: 12, right: 15, left: 12),
),
Row(
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn)
.toString()
.toText14(color: Colors.white, isBold: true),
4.height,
],
).paddingOnly(left: 12),
), ),
Container(
width: 45,
height: 45,
padding: const EdgeInsets.only(left: 14, right: 14),
decoration: const BoxDecoration(
color: Color(0xff259EA4),
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(15),
),
),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"),
).onPress(() {
showMyBottomSheet(context, child: MarkAttendanceWidget(model));
}),
], ],
), ),
).onPress( ],
() { ),
Navigator.pushNamed(context, AppRoutes.todayAttendance); ],
}, ),
)) ).onPress(
.animatedSwither(); () {
}, Navigator.pushNamed(context, AppRoutes.todayAttendance);
},
))
.animatedSwither();
},
),
), ),
), ),
), 9.width,
9.width,
Expanded(
child: MenusWidget(),
),
],
),
],
).paddingOnly(left: 21, right: 21, top: 7),
ServicesWidget(),
// 8.height,
Container(
width: double.infinity,
padding: const EdgeInsets.only(top: 31),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: const BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)),
border: Border.all(color: MyColors.lightGreyEDColor, width: 1),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded( Expanded(
child: Column( child: MenusWidget(),
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
LocaleKeys.offers.tr().toText12(),
Row(
children: [
LocaleKeys.discounts.tr().toText24(isBold: true),
6.width,
Container(
padding: const EdgeInsets.only(left: 8, right: 8),
decoration: BoxDecoration(
color: MyColors.yellowColor,
borderRadius: BorderRadius.circular(10),
),
child: LocaleKeys.newString.tr().toText10(isBold: true)),
],
),
],
),
), ),
LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
})
], ],
).paddingOnly(left: 21, right: 21), ),
Consumer<DashboardProviderModel>( ],
builder: (context, model, child) { ).paddingOnly(left: 21, right: 21, top: 7),
return SizedBox( ServicesWidget(),
height: 103 + 33, // 8.height,
child: ListView.separated( Container(
shrinkWrap: true, width: double.infinity,
physics: const BouncingScrollPhysics(), padding: const EdgeInsets.only(top: 31),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13), decoration: BoxDecoration(
scrollDirection: Axis.horizontal, color: Colors.white,
itemBuilder: (cxt, index) { borderRadius: const BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)),
return model.isOffersLoading border: Border.all(color: MyColors.lightGreyEDColor, width: 1),
? const OffersShimmerWidget() ),
: InkWell( child: Column(
onTap: () { mainAxisSize: MainAxisSize.min,
navigateToDetails(data.getOffersList[index]); children: [
}, Row(
child: SizedBox( crossAxisAlignment: CrossAxisAlignment.center,
width: 73, children: [
child: Column( Expanded(
crossAxisAlignment: CrossAxisAlignment.center, child: Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
Container( mainAxisSize: MainAxisSize.min,
width: 73, children: [
height: 73, LocaleKeys.offers.tr().toText12(),
decoration: BoxDecoration( Row(
borderRadius: const BorderRadius.all( children: [
Radius.circular(100), LocaleKeys.discounts.tr().toText24(isBold: true),
), 6.width,
border: Border.all(color: MyColors.lightGreyE3Color, width: 1), Container(
), padding: const EdgeInsets.only(left: 8, right: 8),
child: ClipRRect( decoration: BoxDecoration(
borderRadius: const BorderRadius.all( color: MyColors.yellowColor,
Radius.circular(50), borderRadius: BorderRadius.circular(10),
), ),
child: Hero( child: LocaleKeys.newString.tr().toText10(isBold: true)),
tag: "ItemImage" + data.getOffersList[index].rowID!, ],
transitionOnUserGestures: true, ),
child: Image.network( ],
data.getOffersList[index].bannerImage!, ),
fit: BoxFit.contain, ),
), LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true).onPress(() {
), Navigator.pushNamed(context, AppRoutes.offersAndDiscounts);
), })
],
).paddingOnly(left: 21, right: 21),
Consumer<DashboardProviderModel>(
builder: (context, model, child) {
return SizedBox(
height: 103 + 33,
child: ListView.separated(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.only(left: 21, right: 21, top: 13),
scrollDirection: Axis.horizontal,
itemBuilder: (cxt, index) {
return model.isOffersLoading
? const OffersShimmerWidget()
: InkWell(
onTap: () {
navigateToDetails(data.getOffersList[index]);
},
child: SizedBox(
width: 73,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
width: 73,
height: 73,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(
Radius.circular(100),
), ),
4.height, border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
Expanded( ),
child: AppState().isArabic(context) child: ClipRRect(
? data.getOffersList[index].titleAR!.toText12(isCenter: true, maxLine: 1) borderRadius: const BorderRadius.all(
: data.getOffersList[index].title!.toText12(isCenter: true, maxLine: 1), Radius.circular(50),
), ),
], child: Hero(
tag: "ItemImage" + data.getOffersList[index].rowID!,
transitionOnUserGestures: true,
child: Image.network(
data.getOffersList[index].bannerImage!,
fit: BoxFit.contain,
),
),
),
), ),
), 4.height,
); Expanded(
}, child: AppState().isArabic(context)
separatorBuilder: (cxt, index) => 8.width, ? data.getOffersList[index].titleAR!.toText12(isCenter: true, maxLine: 1)
itemCount: 6), : data.getOffersList[index].title!.toText12(isCenter: true, maxLine: 1),
); ),
}, ],
), ),
], ),
), );
) },
], separatorBuilder: (cxt, index) => 8.width,
itemCount: 6),
);
},
),
],
),
)
],
),
), ),
), ),
) )
@ -424,9 +440,13 @@ class _DashboardScreenState extends State<DashboardScreen> {
selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28), selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28),
unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28), unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28),
onTap: (int index) { onTap: (int index) {
// currentIndex = index; if (index == 1) {
// setState(() {}); Navigator.pushNamed(context, AppRoutes.mowadhafhi);
Navigator.pushNamed(context, AppRoutes.itemsForSale); } else if (index == 2) {
Navigator.pushNamed(context, AppRoutes.workList);
} else if (index == 3) {
Navigator.pushNamed(context, AppRoutes.itemsForSale);
}
}, },
), ),
), ),

@ -16,7 +16,6 @@ import 'package:mohem_flutter_app/ui/dialogs/id/business_card_dialog.dart';
import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart'; import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AppDrawer extends StatefulWidget { class AppDrawer extends StatefulWidget {
@override @override
@ -85,7 +84,8 @@ class _AppDrawerState extends State<AppDrawer> {
}); });
}), }),
menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())), menuItem("assets/images/drawer/employee_id.svg", LocaleKeys.employeeDigitalID.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: EmployeeDigitialIdDialog())),
menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog())), if (AppState().businessCardPrivilege)
menuItem("assets/images/drawer/view_business_card.svg", LocaleKeys.viewBusinessCard.tr(), "", closeDrawer: false, onPress: () => showMDialog(context, child: BusinessCardDialog())),
menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: performLogout), menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: performLogout),
// menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {Navigator.pushNamed(context, AppRoutes.survey,); // menuItem("assets/images/drawer/logout.svg", LocaleKeys.logout.tr(), "", color: MyColors.redA3Color, closeDrawer: false, onPress: () {Navigator.pushNamed(context, AppRoutes.survey,);
], ],
@ -124,7 +124,7 @@ class _AppDrawerState extends State<AppDrawer> {
9.width, 9.width,
title.toText14(color: color).expanded title.toText14(color: color).expanded
], ],
).paddingOnly(left: 21, top: 10, bottom: 10).onPress(closeDrawer ).paddingOnly(left: 21, top: 10, bottom: 10, right: 21).onPress(closeDrawer
? () async { ? () async {
Navigator.pop(context); Navigator.pop(context);
Future.delayed(const Duration(microseconds: 200), onPress); Future.delayed(const Duration(microseconds: 200), onPress);

@ -1,6 +1,7 @@
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
@ -43,7 +44,11 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.workListCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.workListCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],
@ -70,7 +75,10 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.missingSwipeCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.missingSwipeCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],
@ -97,7 +105,10 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.leaveBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.leaveBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],
@ -124,7 +135,10 @@ class MenusWidget extends StatelessWidget {
Expanded( Expanded(
child: data.ticketBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), child: data.ticketBalance.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
), ),
SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)
),
], ],
) )
], ],

@ -1,6 +1,7 @@
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
@ -22,10 +23,10 @@ class ServicesWidget extends StatelessWidget {
"assets/images/monthly_attendance.svg", "assets/images/monthly_attendance.svg",
"assets/images/ticket_request.svg", "assets/images/ticket_request.svg",
"assets/images/ticket_request.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg", "assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg" "assets/images/ticket_request.svg"
]; ];
return Consumer<DashboardProviderModel>( return Consumer<DashboardProviderModel>(
@ -73,9 +74,13 @@ class ServicesWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Expanded( Expanded(
child: data.homeMenus![parentIndex].menuEntiesList[index].prompt!.toText11(isBold: true), child: data.homeMenus![parentIndex].menuEntiesList[index].prompt!.toText10(isBold: true),
), ),
SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4) RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2:4,
child: SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4)
),
], ],
) )
], ],

@ -81,8 +81,8 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
Utils.showLoading(context); Utils.showLoading(context);
CalculateAbsenceDuration duration = await LeaveBalanceApiClient() CalculateAbsenceDuration duration = await LeaveBalanceApiClient()
.calculateAbsenceDuration(selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, Utils.getMonthNamedFormat(startDateTime!), Utils.getMonthNamedFormat(endDateTime!), -999); .calculateAbsenceDuration(selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, Utils.getMonthNamedFormat(startDateTime!), Utils.getMonthNamedFormat(endDateTime!), -999);
print(duration.toJson());
totalDays = duration.pABSENCEDAYS; totalDays = duration.pABSENCEDAYS?.toInt();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -205,7 +205,7 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
), ),
12.height, 12.height,
DynamicTextFieldWidget( DynamicTextFieldWidget(
"Total Days", LocaleKeys.totalDays.tr(),
totalDays?.toString() ?? "Calculated days", totalDays?.toString() ?? "Calculated days",
isInputTypeNum: true, isInputTypeNum: true,
isEnable: false, isEnable: false,

@ -62,7 +62,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
children: [ children: [
const BalancesDashboardWidget("Current Leave Balance", true), BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true),
12.height, 12.height,
absenceTransList == null absenceTransList == null
? const SizedBox() ? const SizedBox()

@ -113,7 +113,7 @@ class _LoginScreenState extends State<LoginScreen> {
} }
Utils.hideLoading(context); Utils.hideLoading(context);
if (_autoLogin) { if (_autoLogin) {
Navigator.pushNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo); Navigator.pushReplacementNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo);
} else { } else {
Navigator.pushNamed(context, AppRoutes.verifyLogin, arguments: "$firebaseToken"); Navigator.pushNamed(context, AppRoutes.verifyLogin, arguments: "$firebaseToken");
} }

@ -20,7 +20,10 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart';
import 'package:mohem_flutter_app/ui/dialogs/id/business_card_dialog.dart';
import 'package:mohem_flutter_app/ui/dialogs/id/employee_digital_id_dialog.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
// WhatsApp 4 // WhatsApp 4
// SMS 1 // SMS 1
@ -56,15 +59,23 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel; mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel;
String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!; String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!;
print("selectedFlag1: " + mobileLoginInfoListModel!.loginType.toString());
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
// leading: IconButton( automaticallyImplyLeading: false,
// icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor), title: (mobileLoginInfoListModel?.businessCardPrivilege ?? false)
// onPressed: () => Navigator.pop(context), ? LocaleKeys.viewBusinessCard.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
// ), showMDialog(context, child: BusinessCardDialog());
actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width], })
: null,
actions: [
Center(
child: LocaleKeys.employeeDigitalID.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
showMDialog(context, child: EmployeeDigitialIdDialog());
})),
21.width
],
), ),
body: Column( body: Column(
children: [ children: [
@ -222,7 +233,6 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) { Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) {
bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint))); bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint)));
print("$_title:$isDisable");
return InkWell( return InkWell(
onTap: isDisable onTap: isDisable
? null ? null

@ -67,7 +67,7 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
} }
void submitRequest() async { void submitRequest() async {
try { // try {
Utils.showLoading(context); Utils.showLoading(context);
List<Map<String, dynamic>> list = []; List<Map<String, dynamic>> list = [];
if (attachmentFiles.isNotEmpty) { if (attachmentFiles.isNotEmpty) {
@ -134,10 +134,10 @@ class _RequestSubmitScreenState extends State<RequestSubmitScreen> {
Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true); Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true);
Navigator.of(context).popUntil((route) => route.settings.name == AppRoutes.dashboard); Navigator.of(context).popUntil((route) => route.settings.name == AppRoutes.dashboard);
Navigator.pushNamed(context, AppRoutes.workList); Navigator.pushNamed(context, AppRoutes.workList);
} catch (ex) { // } catch (ex) {
Utils.hideLoading(context); // Utils.hideLoading(context);
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
@override @override

@ -104,26 +104,26 @@ class _DynamicInputScreenState extends State<DynamicInputScreen> {
Future calGetValueSetValues(GetEITDFFStructureList structureList) async { Future calGetValueSetValues(GetEITDFFStructureList structureList) async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
String segmentId = structureList.cHILDSEGMENTSVS!; String segmentId = structureList.cHILDSEGMENTSVS!;
if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!;
List<GetEITDFFStructureList> filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; List<GetEITDFFStructureList> filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? [];
List<Map<String, dynamic>> values = filteredList List<Map<String, dynamic>> values = filteredList
.map((e) => GetSetValuesRequestModel( .map((e) => GetSetValuesRequestModel(
sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME)
.toJson()) .toJson())
.toList(); .toList();
ESERVICESVS eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List<ESERVICESVS> eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values);
List<GetEITDFFStructureList> abc = genericResponseModel?.getEITDFFStructureList ?? []; List<GetEITDFFStructureList> abc = genericResponseModel?.getEITDFFStructureList ?? [];
getEitDffStructureList = abc; getEitDffStructureList = abc;
int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS);
getEitDffStructureList![index].eSERVICESVS!.clear(); getEitDffStructureList![index].eSERVICESVS!.clear();
getEitDffStructureList![index].eSERVICESVS!.add(eServicesResponseModel); if (eServicesResponseModel.isNotEmpty) getEitDffStructureList![index].eSERVICESVS!.addAll(eServicesResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);

@ -60,45 +60,49 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
super.dispose(); super.dispose();
} }
late bool isTicketRequest;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (dynamicParams == null) { if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams;
isTicketRequest = dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS";
getTransactions(); getTransactions();
} }
Widget dataWidget = ListView(
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21),
children: [
// HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard
if (isTicketRequest) ...[const BalancesDashboardWidget("Current Ticket Balance", false), 12.height],
getEITTransactionList == null
? const SizedBox()
: (getEITTransactionList!.isEmpty
? Utils.getNoDataWidget(context).paddingOnly(top: isTicketRequest ? 50 : 0)
: ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty
? const SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++)
if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y")
ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
],
).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEITTransactionList!.length)),
],
);
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget(context, title: dynamicParams!.title), appBar: AppBarWidget(context, title: dynamicParams!.title),
body: ListView( body: isTicketRequest ? dataWidget : dataWidget.center,
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21),
children: [
// HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard
if (dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS") ...[const BalancesDashboardWidget("Current Ticket Balance", false), 12.height],
getEITTransactionList == null
? const SizedBox()
: (getEITTransactionList!.isEmpty
? Utils.getNoDataWidget(context)
: ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty
? const SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++)
if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y")
ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!,
getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""),
],
).objectContainerView(),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEITTransactionList!.length)),
],
),
floatingActionButton: Container( floatingActionButton: Container(
height: 54, height: 54,
width: 54, width: 54,

@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -39,7 +40,7 @@ class ServicesMenuListScreen extends StatelessWidget {
? Utils.getNoDataWidget(context) ? Utils.getNoDataWidget(context)
: ListView.separated( : ListView.separated(
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", servicesMenuData.list[index].prompt!).onPress(() { itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", servicesMenuData.list[index].prompt!, context).onPress(() {
if (servicesMenuData.list[index].parentMenuName == "MBL_PERINFO_SS") { if (servicesMenuData.list[index].parentMenuName == "MBL_PERINFO_SS") {
if (servicesMenuData.list[index].requestType == "BASIC_DETAILS") { if (servicesMenuData.list[index].requestType == "BASIC_DETAILS") {
Navigator.pushNamed(context, AppRoutes.basicDetails); Navigator.pushNamed(context, AppRoutes.basicDetails);
@ -51,8 +52,10 @@ class ServicesMenuListScreen extends StatelessWidget {
Navigator.pushNamed(context, AppRoutes.familyMembers); Navigator.pushNamed(context, AppRoutes.familyMembers);
} }
return; return;
} else if (servicesMenuData.list[index].requestType == "ABSENCE") {
Navigator.pushNamed(context, AppRoutes.leaveBalance);
return;
} }
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!)); Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!));
}), }),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
@ -61,15 +64,15 @@ class ServicesMenuListScreen extends StatelessWidget {
); );
} }
Widget itemView(String icon, String title) { Widget itemView(String icon, String title, context) {
return Row( return Row(
children: [ children: [
(title).toText16().expanded, (title).toText16().expanded,
12.width, 12.width,
SvgPicture.asset( RotatedBox(
"assets/images/arrow_next.svg", quarterTurns: AppState().isArabic(context) ? 2 : 4,
color: MyColors.darkIconColor, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor),
) ),
], ],
).objectContainerView(); ).objectContainerView();
} }

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@ -12,32 +10,34 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart';
import 'package:mohem_flutter_app/models/dashboard/menus.dart';
import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart'; import 'package:mohem_flutter_app/models/my_team/get_employee_subordinates_list.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/services_menu_list_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
class CreateRequest extends StatefulWidget { class CreateRequest extends StatefulWidget {
const CreateRequest ({Key? key}) : super(key: key); const CreateRequest({Key? key}) : super(key: key);
@override @override
_CreateRequestState createState() => _CreateRequestState(); _CreateRequestState createState() => _CreateRequestState();
} }
class _CreateRequestState extends State<CreateRequest> { class _CreateRequestState extends State<CreateRequest> {
String searchEmpEmail =""; String searchEmpEmail = "";
String searchEmpName =""; String searchEmpName = "";
String searchEmpNo = ""; String searchEmpNo = "";
String? empId; String? empId;
List<GetEmployeeSubordinatesList> getEmployeeSubordinatesList = []; List<GetEmployeeSubordinatesList> getEmployeeSubordinatesList = [];
// late DashboardProviderModel data; // late DashboardProviderModel data;
List<GetMenuEntriesList> getMenuEntriesList = []; List<GetMenuEntriesList> getMenuEntriesList = [];
GetEmployeeSubordinatesList? getEmployeeSubordinates; GetEmployeeSubordinatesList? getEmployeeSubordinates;
List<Menus>? homeMenus;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// data.fetchMenuEntries();
employeeSubRequest(); employeeSubRequest();
} }
@ -46,6 +46,7 @@ class _CreateRequestState extends State<CreateRequest> {
Utils.showLoading(context); Utils.showLoading(context);
getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString());
getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER); getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER);
homeMenus = parseMenus(getMenuEntriesList);
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -54,42 +55,65 @@ class _CreateRequestState extends State<CreateRequest> {
} }
} }
List<Menus> parseMenus(List<GetMenuEntriesList> getMenuEntriesList) {
List<Menus> menus = [];
for (int i = 0; i < getMenuEntriesList.length; i++) {
if (getMenuEntriesList[i].parentMenuName!.isEmpty) {
menus.add(Menus(getMenuEntriesList[i], getMenuEntriesList.where((element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList()));
}
}
return menus;
}
void handleOnPress(context, Menus menu) {
if (menu.menuEntry.menuEntryType == "FUNCTION") {
if (menu.menuEntry.requestType == "EIT") {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menu.menuEntry.prompt!, menu.menuEntry.functionName!));
} else {}
} else {
Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(menu.menuEntry.prompt!, menu.menuEntiesList));
}
return;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList;
print(getMenuEntriesList.length);
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.createRequest.tr(), title: LocaleKeys.createRequest.tr(),
), ),
body: SizedBox( body: SizedBox(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
child: getMenuEntriesList.isEmpty child: homeMenus == null
? Utils.getNoDataWidget(context) ? const SizedBox()
: ListView.separated( : (homeMenus!.isEmpty
padding: const EdgeInsets.all(21), ? Utils.getNoDataWidget(context)
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", getMenuEntriesList[index].prompt!, index).onPress(() { : ListView.separated(
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(getMenuEntriesList[index].prompt!, getMenuEntriesList[index].functionName!)); padding: const EdgeInsets.all(21),
}), itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", homeMenus![index].menuEntry.prompt!, index).onPress(() {
separatorBuilder: (cxt, index) => 12.height, handleOnPress(context, homeMenus![index]);
itemCount: getMenuEntriesList.length), }),
), separatorBuilder: (cxt, index) => 12.height,
itemCount: homeMenus!.length)),
),
); );
} }
Widget itemView(String icon, String title, index) { Widget itemView(String icon, String title, index) {
return getMenuEntriesList[index].parentMenuName !=""? Row( return Row(
children: [ children: [
(title).toText16().expanded, 12.width, (title).toText16().expanded,
12.width,
SvgPicture.asset( SvgPicture.asset(
"assets/images/arrow_next.svg", "assets/images/arrow_next.svg",
color: MyColors.darkIconColor, color: MyColors.darkIconColor,
) )
], ],
).objectContainerView() : SizedBox(); ).objectContainerView();
} }
} }

@ -73,7 +73,7 @@ class _TeamMembersState extends State<TeamMembers> {
var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER}'); var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER}');
return InkWell( return InkWell(
onTap: () async { onTap: () async {
// Navigator.pushNamed(context, AppRoutes.employeeDetails, arguments: getEmployeeSubordinatesList[index]); Navigator.pushNamed(context, AppRoutes.employeeDetails, arguments: getEmployeeSubordinatesList[index]);
}, },
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,

@ -40,7 +40,7 @@ class _MonthlyPaySlipScreenState extends State<MonthlyPaySlipScreen> {
} }
void getData() async { void getData() async {
try { // try {
Utils.showLoading(context); Utils.showLoading(context);
paySlipList = await MonthlyPaySlipApiClient().getPaySlip(); paySlipList = await MonthlyPaySlipApiClient().getPaySlip();
if (paySlipList.isNotEmpty) { if (paySlipList.isNotEmpty) {
@ -49,14 +49,14 @@ class _MonthlyPaySlipScreenState extends State<MonthlyPaySlipScreen> {
} }
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { // } catch (ex) {
Utils.hideLoading(context); // Utils.hideLoading(context);
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
Future getDataByActionContextID(int actionContextID, {bool showLoading = false}) async { Future getDataByActionContextID(int actionContextID, {bool showLoading = false}) async {
try { // try {
if (showLoading) { if (showLoading) {
Utils.showLoading(context); Utils.showLoading(context);
} }
@ -74,12 +74,12 @@ class _MonthlyPaySlipScreenState extends State<MonthlyPaySlipScreen> {
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} }
} catch (ex) { // } catch (ex) {
if (showLoading) { // if (showLoading) {
Utils.hideLoading(context); // Utils.hideLoading(context);
} // }
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
@override @override

@ -48,7 +48,7 @@ class _AddUpdateFamilyMemberState extends State<AddUpdateFamilyMember> {
} }
void callAddAndUpdateFamilyMember() async { void callAddAndUpdateFamilyMember() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
getBasicDetDffStructureList = await ProfileApiClient().getBasicDetDffStructure(); getBasicDetDffStructureList = await ProfileApiClient().getBasicDetDffStructure();
getContactColsStructureList = await ProfileApiClient().getContactColsStructureList(args['actionType']); getContactColsStructureList = await ProfileApiClient().getContactColsStructureList(args['actionType']);
@ -199,8 +199,8 @@ class _AddUpdateFamilyMemberState extends State<AddUpdateFamilyMember> {
}); });
} else { } else {
return DynamicTextFieldWidget( return DynamicTextFieldWidget(
(model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : ""), (model!.sEGMENTPROMPT ?? "") + (model!.rEQUIREDFLAG == "Y" ? "*" : "") ,
model!.getContactDetailsList!.sEGMENTVALUEDSP ?? "", ( model!.getContactDetailsList!.sEGMENTVALUEDSP ?? "")+ (model!.aPPLICATIONCOLUMNNAME == "NATIONAL_IDENTIFIER" ? "1-1111-1111-1" : ""),
onChange: (text) { onChange: (text) {
model!.getContactDetailsList!.sEGMENTVALUEDSP = text; model!.getContactDetailsList!.sEGMENTVALUEDSP = text;
}, },
@ -357,7 +357,7 @@ class _AddUpdateFamilyMemberState extends State<AddUpdateFamilyMember> {
void submitUpdateForm() async { void submitUpdateForm() async {
try { try {
List<Map<String, dynamic>> values1 = getBasicDetDffStructureList!.map((e) { List<Map<String, dynamic>> values1 = getBasicDetDffStructureList!.map((e) {
String? dateVal = ''; String? dateVal = '';
String? vatcherVal = ''; String? vatcherVal = '';
@ -418,12 +418,7 @@ class _AddUpdateFamilyMemberState extends State<AddUpdateFamilyMember> {
}).toList(); }).toList();
List<Map<String, dynamic>> valuesFinal = [...values1, ...values2, ...values3]; List<Map<String, dynamic>> valuesFinal = [...values1, ...values2, ...values3];
Utils.showLoading(context); Utils.showLoading(context);
if (args['actionType'] == "ADD") { submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(args['actionType'], args['relationID'] ?? 0, valuesFinal);
var relationID = null;
submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(args['actionType'], relationID, valuesFinal);
} else if (args['actionType'] == "UPDATE") {
submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(args['actionType'], args['relationID'], valuesFinal);
}
var transactionId = submitContactTransactionList!.pTRANSACTIONID; var transactionId = submitContactTransactionList!.pTRANSACTIONID;
var itemKey = submitContactTransactionList!.pITEMKEY; var itemKey = submitContactTransactionList!.pITEMKEY;
Utils.hideLoading(context); Utils.hideLoading(context);

@ -84,24 +84,8 @@ class _ContactDetailsState extends State<ContactDetails> {
if (getEmployeePhonesList.isNotEmpty) if (getEmployeePhonesList.isNotEmpty)
Stack( Stack(
children: [ children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
menuEntriesPhone.updateButton == 'Y'
? IconButton(
icon: Icon(
Icons.edit_location_alt_outlined,
size: 20,
),
onPressed: () {
updatePhone();
},
)
: Container()
],
),
ListView.separated( ListView.separated(
physics: NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemBuilder: (cxt, index) => Column( itemBuilder: (cxt, index) => Column(
@ -113,38 +97,20 @@ class _ContactDetailsState extends State<ContactDetails> {
), ),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
itemCount: getEmployeePhonesList.length), itemCount: getEmployeePhonesList.length),
// Column( if (menuEntriesPhone.updateButton == 'Y')
// crossAxisAlignment: CrossAxisAlignment.start, Positioned(
// children: getEmployeePhonesList top: 1,
// .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ right: 1,
// "${e.pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), child: const Icon(Icons.edit_location_alt_outlined, size: 20).onPress(updatePhone),
// "${e.pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), ),
// ]))
// .toList())
], ],
).objectContainerView(), ).objectContainerView(),
12.height, 12.height,
if (getEmployeeAddressList.isNotEmpty) if (getEmployeeAddressList.isNotEmpty)
Stack( Stack(
children: [ children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
menuEntriesAddress.updateButton == 'Y'
? IconButton(
icon: Icon(
Icons.edit_location_alt_outlined,
size: 20,
),
onPressed: () {
addUpdateAddress();
},
)
: Container()
],
),
ListView.separated( ListView.separated(
physics: NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemBuilder: (cxt, index) => Column( itemBuilder: (cxt, index) => Column(
@ -156,14 +122,12 @@ class _ContactDetailsState extends State<ContactDetails> {
), ),
separatorBuilder: (cxt, index) => 12.height, separatorBuilder: (cxt, index) => 12.height,
itemCount: getEmployeeAddressList.length), itemCount: getEmployeeAddressList.length),
// Column( if (menuEntriesAddress.updateButton == 'Y')
// crossAxisAlignment: CrossAxisAlignment.start, Positioned(
// children: getEmployeeAddressList top: 1,
// .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ right: 1,
// "${e.sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), child: const Icon(Icons.edit_location_alt_outlined, size: 20).onPress(addUpdateAddress),
// "${e.sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), ),
// ]))
// .toList())
], ],
).objectContainerView() ).objectContainerView()
], ],

@ -16,15 +16,10 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart';
import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart';
import 'package:mohem_flutter_app/models/profile/get_address_dff_structure_list.dart'; import 'package:mohem_flutter_app/models/profile/get_address_dff_structure_list.dart';
import 'package:mohem_flutter_app/models/profile/get_countries_list_model.dart'; import 'package:mohem_flutter_app/models/profile/get_countries_list_model.dart';
import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart'; import 'package:mohem_flutter_app/models/profile/submit_address_transaction.dart';
import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
@ -60,6 +55,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
String dESCFLEXCONTEXTCODE = ""; String dESCFLEXCONTEXTCODE = "";
String countryCode = 'SA'; String countryCode = 'SA';
String effectiveDate = ''; String effectiveDate = '';
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -116,10 +112,10 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME)
.toJson()) .toJson())
.toList(); .toList();
ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List<ESERVICESVS> genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values);
int index = getAddressDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); int index = getAddressDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS);
getAddressDffStructureList![index].eSERVICESVS!.add(genericResponseModel); if (genericResponseModel.isNotEmpty) getAddressDffStructureList![index].eSERVICESVS!.addAll(genericResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context); Utils.hideLoading(context);
@ -325,8 +321,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
), ),
); );
} else { } else {
DateTime? picked = DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != selectedDate) { if (picked != null && picked != selectedDate) {
time = picked; time = picked;
} }

@ -8,7 +8,6 @@ import 'package:mohem_flutter_app/api/profile_api_client.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart';
@ -16,12 +15,10 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart';
import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart';
import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart';
import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart';
import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart'; import 'package:mohem_flutter_app/models/profile/submit_basic_details_transaction_model.dart';
import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart';
import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
@ -55,6 +52,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
DynamicProfileParams? dynamicParams; DynamicProfileParams? dynamicParams;
String dESCFLEXCONTEXTCODE = ""; String dESCFLEXCONTEXTCODE = "";
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -102,12 +100,10 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME)
.toJson()) .toJson())
.toList(); .toList();
ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List<ESERVICESVS> genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values);
int index = getBasicDetDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); int index = getBasicDetDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS);
getBasicDetDffStructureList![index].eSERVICESVS!.add(genericResponseModel); if (genericResponseModel.isNotEmpty) getBasicDetDffStructureList![index].eSERVICESVS!.addAll(genericResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {
@ -336,8 +332,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
), ),
); );
} else { } else {
DateTime? picked = DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != selectedDate) { if (picked != null && picked != selectedDate) {
time = picked; time = picked;
} }

@ -98,7 +98,7 @@ class _FamilyMembersState extends State<FamilyMembers> {
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () async { ..onTap = () async {
relationId = getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt(); relationId = getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt();
menuEntries.updateButton == 'Y'? showUpdateAlertDialog(context, relationId!.toInt(), 2, LocaleKeys.update.tr()):null; menuEntries.updateButton == 'Y'? showUpdateAlertDialog(context, relationId!.toInt(), 2, "UPDATE"):null;
} }
) )
], ],
@ -161,7 +161,7 @@ class _FamilyMembersState extends State<FamilyMembers> {
title: Text( title: Text(
LocaleKeys.confirm.tr(), LocaleKeys.confirm.tr(),
), ),
content: Text(LocaleKeys.updateThisMember.tr()), content: Text(LocaleKeys.updateMember.tr()),
actions: [ actions: [
cancelButton, cancelButton,
continueButton, continueButton,

@ -4,6 +4,8 @@ import 'package:mohem_flutter_app/api/profile_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart';
@ -26,6 +28,7 @@ class PhoneNumbers extends StatefulWidget {
class _PhoneNumbersState extends State<PhoneNumbers> { class _PhoneNumbersState extends State<PhoneNumbers> {
List<GetPhoneNumberTypesModel> getPhoneNumberTypesList = []; List<GetPhoneNumberTypesModel> getPhoneNumberTypesList = [];
SubmitPhonesTransactionList submitPhoneNumbers = SubmitPhonesTransactionList(); SubmitPhonesTransactionList submitPhoneNumbers = SubmitPhonesTransactionList();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -46,129 +49,66 @@ class _PhoneNumbersState extends State<PhoneNumbers> {
title: LocaleKeys.profile_contactDetails.tr(), title: LocaleKeys.profile_contactDetails.tr(),
), ),
backgroundColor: MyColors.backgroundColor, backgroundColor: MyColors.backgroundColor,
bottomSheet: footer(), body: Column(
body: SingleChildScrollView( children: [
child: Column( ListView(
children: [ physics: const BouncingScrollPhysics(),
Container( padding: const EdgeInsets.all(21),
width: double.infinity, children: [
margin: EdgeInsets.only(left: 25, right: 25, top: 25), DefaultButton("+ ${LocaleKeys.addRow.tr()}", () {
padding: EdgeInsets.all(20), widget.getEmployeePhonesList.add(GetEmployeePhonesList(aCTION: 'NEW_ROW'));
// height: 400, setState(() {});
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Color.fromARGB(255, 209, 207, 207))), }),
child: InkWell( 12.height,
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ ListView.separated(
Icon( shrinkWrap: true,
Icons.add, physics: const NeverScrollableScrollPhysics(),
color: Color(0xff259CB8), itemBuilder: (cxt, index) {
), var element = widget.getEmployeePhonesList[index];
Text( return element.aCTION != 'DELETE_ROW'
LocaleKeys.addRow.tr(), ? Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold), PopupMenuButton(
) child: DynamicTextFieldWidget(
]), LocaleKeys.selectTypeT.tr(),
onTap: () { element.pHONETYPEMEANING ?? LocaleKeys.pleaseSelect.tr(),
addNewRow(); isEnable: false,
}, isPopup: true,
), ).paddingOnly(bottom: 12),
), itemBuilder: (_) => <PopupMenuItem<int>>[
Column( for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem<int>(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i),
crossAxisAlignment: CrossAxisAlignment.start, ],
children: widget.getEmployeePhonesList onSelected: (int index) {
.map((e) => e.aCTION != 'DELETE_ROW' element.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING;
? Container( element.pHONETYPE = getPhoneNumberTypesList[index].cODE;
width: double.infinity, setState(() {});
margin: EdgeInsets.only( }),
top: 20, DynamicTextFieldWidget(
left: 26, "Value",
right: 26, element.pHONENUMBER ?? "",
), isReadOnly: false,
padding: EdgeInsets.only(left: 14, right: 14, top: 15, bottom: 15), onChange: (text) {
// height: 400, element.pHONENUMBER = text;
decoration: BoxDecoration( },
boxShadow: [ ).paddingOnly(bottom: 12),
BoxShadow( Row(mainAxisAlignment: MainAxisAlignment.end, children: [
color: Colors.grey.withOpacity(0.5), Icon(Icons.delete, color: MyColors.redColor, size: 18),
spreadRadius: 5, LocaleKeys.delete.tr().toText14(color: MyColors.redColor),
blurRadius: 26, ]).onPress(() {
offset: Offset(0, 3), element.aCTION = 'DELETE_ROW';
), setState(() {});
], }),
color: Colors.white, ]).objectContainerView().paddingOnly(bottom: 12)
borderRadius: BorderRadius.circular(10.0), : Container();
), },
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ separatorBuilder: (cxt, index) => 0.height,
PopupMenuButton( itemCount: widget.getEmployeePhonesList.length)
child: DynamicTextFieldWidget( ],
LocaleKeys.pleaseSelect.tr(), ).expanded,
e.pHONETYPEMEANING ?? "", DefaultButton(LocaleKeys.update.tr(), () async {
isEnable: false, updatePhone();
isPopup: true, }).insideContainer
).paddingOnly(bottom: 12),
itemBuilder: (_) => <PopupMenuItem<int>>[
for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem<int>(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i),
],
onSelected: (int index) {
e.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING;
e.pHONETYPE = getPhoneNumberTypesList[index].cODE;
setState(() {});
}),
DynamicTextFieldWidget(
"",
e.pHONENUMBER ?? "",
isReadOnly: false,
onChange: (text) {
e.pHONENUMBER = text;
},
).paddingOnly(bottom: 12),
InkWell(
child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Icon(
Icons.delete,
color: Colors.red,
size: 18,
),
Text(
LocaleKeys.delete.tr(),
style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold),
)
]),
onTap: () {
// widget.getEmployeePhonesList.removeWhere((item) => item.pHONEID == e.pHONEID);
setState(() {
deleteRow(e);
});
},
),
SizedBox(
height: 10,
),
]))
: Container())
.toList()),
SizedBox(
height: 80,
)
],
),
),
);
}
Widget footer() {
return Container(
decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(10),
color: MyColors.white,
boxShadow: [
BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3),
], ],
), ),
child: DefaultButton(LocaleKeys.update.tr(), () async {
updatePhone();
// context.setLocale(const Locale("en", "US")); // to change Loacle
// Profile();
}).insideContainer,
); );
} }
@ -176,7 +116,6 @@ class _PhoneNumbersState extends State<PhoneNumbers> {
Utils.showLoading(context); Utils.showLoading(context);
setUpdateStatus(); setUpdateStatus();
submitPhoneNumbers = await ProfileApiClient().submitPhoneNumbers(widget.getEmployeePhonesList); submitPhoneNumbers = await ProfileApiClient().submitPhoneNumbers(widget.getEmployeePhonesList);
Utils.hideLoading(context); Utils.hideLoading(context);
Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, Navigator.pushNamed(context, AppRoutes.requestSubmitScreen,
arguments: RequestSubmitScreenParams(LocaleKeys.profile_contactDetails.tr(), submitPhoneNumbers.pTRANSACTIONID!, submitPhoneNumbers.pITEMKEY!, 'phone_numbers')); arguments: RequestSubmitScreenParams(LocaleKeys.profile_contactDetails.tr(), submitPhoneNumbers.pTRANSACTIONID!, submitPhoneNumbers.pITEMKEY!, 'phone_numbers'));
@ -191,14 +130,4 @@ class _PhoneNumbersState extends State<PhoneNumbers> {
} }
}); });
} }
void addNewRow() {
setState(() {
widget.getEmployeePhonesList.add(GetEmployeePhonesList(aCTION: 'NEW_ROW'));
});
}
void deleteRow(GetEmployeePhonesList row) {
row.aCTION = 'DELETE_ROW';
}
} }

@ -190,9 +190,10 @@ class _AddItemDetailsFragmentState extends State<AddItemDetailsFragment> {
6.width, 6.width,
SimpleButton(LocaleKeys.add.tr(), () { SimpleButton(LocaleKeys.add.tr(), () {
ImageOptions.showImageOptionsNew(context, (String image, File file) { ImageOptions.showImageOptionsNew(context, (String image, File file) {
// setState(() { setState(() {
// images.add(image); images.add(image);
// }); Navigator.of(context).pop();
});
}); });
}, fontSize: 14), }, fontSize: 14),
], ],
@ -243,41 +244,43 @@ class _AddItemDetailsFragmentState extends State<AddItemDetailsFragment> {
Future<void> getAdDetails() async { Future<void> getAdDetails() async {
// todo need to change this method later , its not a good approach to do it like this. // todo need to change this method later , its not a good approach to do it like this.
String details = await Utils.getStringFromPrefs(SharedPrefsConsts.editItemForSale); String details = await Utils.getStringFromPrefs(SharedPrefsConsts.editItemForSale);
var body = json.decode(details); if(details.isNotEmpty) {
var body = json.decode(details);
GetRegionsList selectedRegionAd = GetRegionsList(); GetRegionsList selectedRegionAd = GetRegionsList();
GetSaleCategoriesList selectedSaleCategoryAd = GetSaleCategoriesList(); GetSaleCategoriesList selectedSaleCategoryAd = GetSaleCategoriesList();
itemTitle = body["itemTitle"]; itemTitle = body["itemTitle"];
itemDescription = body["itemDescription"]; itemDescription = body["itemDescription"];
selectedItemCondition = body["itemCondition"].toString().toLowerCase(); selectedItemCondition = body["itemCondition"].toString().toLowerCase();
selectedRegionAd.regionID = body["selectedRegion"]["regionID"]; selectedRegionAd.regionID = body["selectedRegion"]["regionID"];
selectedRegionAd.regionName = body["selectedRegion"]["regionName"]; selectedRegionAd.regionName = body["selectedRegion"]["regionName"];
selectedRegion = selectedRegionAd; selectedRegion = selectedRegionAd;
itemPrice = body["itemPrice"]; itemPrice = body["itemPrice"];
selectedSaleCategoryAd.categoryID = body["selectedSaleCategory"]["categoryID"]; selectedSaleCategoryAd.categoryID = body["selectedSaleCategory"]["categoryID"];
selectedSaleCategoryAd.title = body["selectedSaleCategory"]["title"]; selectedSaleCategoryAd.title = body["selectedSaleCategory"]["title"];
if (body["itemPhotos"].length != 0) { if (body["itemPhotos"].length != 0) {
images.add(body["itemPhotos"][0]); images.add(body["itemPhotos"][0]);
} }
ItemReviewModel itemReviewModel = ItemReviewModel itemReviewModel =
ItemReviewModel(body["itemTitle"], body["itemDescription"], body["itemCondition"].toString().toLowerCase(), selectedRegionAd, body["itemPrice"], images, selectedSaleCategoryAd); ItemReviewModel(body["itemTitle"], body["itemDescription"], body["itemCondition"].toString().toLowerCase(), selectedRegionAd, body["itemPrice"], images, selectedSaleCategoryAd);
AddItemDetailsFragment.itemReviewModel = itemReviewModel; AddItemDetailsFragment.itemReviewModel = itemReviewModel;
SelectCategoryFragment.selectedSaleCategory = selectedSaleCategoryAd; SelectCategoryFragment.selectedSaleCategory = selectedSaleCategoryAd;
}
} }
void getRegions() async { void getRegions() async {
try { // try {
Utils.showLoading(context); Utils.showLoading(context);
getRegionsList = await ItemsForSaleApiClient().getRegions(); getRegionsList = await ItemsForSaleApiClient().getRegions();
await getAdDetails(); await getAdDetails();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { // } catch (ex) {
Utils.hideLoading(context); // Utils.hideLoading(context);
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
} // }
} }
} }

@ -25,6 +25,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
List<GetSaleCategoriesList> getSaleCategoriesList = []; List<GetSaleCategoriesList> getSaleCategoriesList = [];
List<GetItemsForSaleList> getItemsForSaleList = []; List<GetItemsForSaleList> getItemsForSaleList = [];
List<GetItemsForSaleList> _foundItemsForSaleList = [];
ScrollController gridScrollController = ScrollController(); ScrollController gridScrollController = ScrollController();
int currentPageNo = 1; int currentPageNo = 1;
@ -61,20 +62,10 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
isInputTypeNum: false, isInputTypeNum: false,
isReadOnly: false, isReadOnly: false,
onChange: (String value) { onChange: (String value) {
// _runFilter(value); _runFilter(value);
}, },
).paddingOnly(left: 21, right: 21, top: 21), ).paddingOnly(left: 21, right: 21, top: 21),
Row( LocaleKeys.browseCategories.tr().toText17().paddingOnly(left: 21, right: 21, top: 21),
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.browseCategories.tr().toText17(),
// todo @haroon define the purpose of this icon button
IconButton(
icon: const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0),
onPressed: () => Navigator.pop(context),
),
],
).paddingOnly(left: 21, right: 21),
SizedBox( SizedBox(
height: 105.0, height: 105.0,
child: getSaleCategoriesList.isNotEmpty child: getSaleCategoriesList.isNotEmpty
@ -132,10 +123,22 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
); );
} }
void _runFilter(String enteredKeyword) {
List<GetItemsForSaleList> results = [];
if (enteredKeyword.isEmpty) {
results = getItemsForSaleList;
} else {
results = getItemsForSaleList.where((offer) => offer.title!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList();
}
setState(() {
_foundItemsForSaleList = results;
});
}
List<Widget> getItemsForSaleWidgets() { List<Widget> getItemsForSaleWidgets() {
List<Widget> itemsList = []; List<Widget> itemsList = [];
getItemsForSaleList.forEach((element) { _foundItemsForSaleList.forEach((element) {
itemsList.add(getItemCard(element)); itemsList.add(getItemCard(element));
}); });
@ -167,7 +170,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
), ),
10.height, 10.height,
getItemsForSaleList.title!.toText16(maxlines: 1), getItemsForSaleList.title!.toText16(maxlines: 1),
getItemsForSaleList.description!.toText12(maxLine: 3, color: MyColors.grey57Color).expanded, getItemsForSaleList.description!.toText12(maxLine: 2, color: MyColors.grey57Color).expanded,
// 8.height, // 8.height,
getItemsForSaleList.status!.toText14(color: getItemsForSaleList.status == 'Approved' ? MyColors.greenColor : MyColors.yellowColor), getItemsForSaleList.status!.toText14(color: getItemsForSaleList.status == 'Approved' ? MyColors.greenColor : MyColors.yellowColor),
Row( Row(
@ -200,6 +203,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
getItemsForSaleListLocal.clear(); getItemsForSaleListLocal.clear();
getItemsForSaleListLocal = await ItemsForSaleApiClient().getItemsForSale(itgPageNo, itgCategoryID); getItemsForSaleListLocal = await ItemsForSaleApiClient().getItemsForSale(itgPageNo, itgCategoryID);
getItemsForSaleList.addAll(getItemsForSaleListLocal); getItemsForSaleList.addAll(getItemsForSaleListLocal);
_foundItemsForSaleList = getItemsForSaleList;
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {

@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
@ -53,44 +54,44 @@ class _MowadhafhiHomeState extends State<MowadhafhiHome> {
body: Column( body: Column(
children: [ children: [
(getTicketsByEmployeeList == null (getTicketsByEmployeeList == null
? const SizedBox() ? const SizedBox()
: (getTicketsByEmployeeList!.isEmpty) : (getTicketsByEmployeeList!.isEmpty)
? Utils.getNoDataWidget(context) ? Utils.getNoDataWidget(context)
: ListView.separated( : ListView.separated(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return InkWell( return InkWell(
onTap: () { onTap: () {
Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: getTicketsByEmployeeList![index].ticketId); Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: getTicketsByEmployeeList![index].ticketId);
}, },
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
getTicketsByEmployeeList![index].ticketTypeName!.toText14(color: MyColors.darkTextColor).expanded, getTicketsByEmployeeList![index].ticketTypeName!.toText14(color: MyColors.darkTextColor).expanded,
getTicketsByEmployeeList![index].created!.split(" ")[0].toText12(color: MyColors.grey70Color), getTicketsByEmployeeList![index].created!.split(" ")[0].toText12(color: MyColors.grey70Color),
], ],
), ),
getTicketsByEmployeeList![index].description!.toText12(color: MyColors.grey57Color), getTicketsByEmployeeList![index].description!.toText12(color: MyColors.grey57Color),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
getTicketsByEmployeeList![index].ticketStatusInternalName!.toText14(color: MyColors.textMixColor), getTicketsByEmployeeList![index].ticketStatusInternalName!.toText14(color: MyColors.textMixColor),
SvgPicture.asset( RotatedBox(
"assets/images/arrow_next.svg", quarterTurns: AppState().isArabic(context) ? 2 : 4,
color: MyColors.darkIconColor, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor),
) ),
], ],
), ),
], ],
).objectContainerView(), ).objectContainerView(),
); );
}, },
separatorBuilder: (BuildContext context, int index) => 12.height, separatorBuilder: (BuildContext context, int index) => 12.height,
itemCount: getTicketsByEmployeeList!.length)) itemCount: getTicketsByEmployeeList!.length))
.expanded, .expanded,
DefaultButton(LocaleKeys.createRequest.tr(), () async { DefaultButton(LocaleKeys.createRequest.tr(), () async {
await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest); await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest);

@ -25,6 +25,7 @@ class OffersAndDiscountsHome extends StatefulWidget {
class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> { class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
List<GetCategoriesList> getCategoriesList = []; List<GetCategoriesList> getCategoriesList = [];
List<OffersListModel> getOffersList = []; List<OffersListModel> getOffersList = [];
List<OffersListModel> _foundOffersList = [];
int currentCategoryID = 0; int currentCategoryID = 0;
@ -54,18 +55,10 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
isInputTypeNum: false, isInputTypeNum: false,
isReadOnly: false, isReadOnly: false,
onChange: (String value) { onChange: (String value) {
// _runFilter(value); _runFilter(value);
}, },
).paddingOnly(left: 21, right: 21, top: 21), ).paddingOnly(left: 21, right: 21, top: 21),
Row( LocaleKeys.browseCategories.tr().toText17().paddingOnly(left: 21, right: 21, top: 21),
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.browseCategories.tr().toText17(),
const Icon(Icons.filter_alt_sharp, color: MyColors.darkIconColor, size: 28.0).onPress(() {
Navigator.pop(context);
}),
],
).paddingOnly(left: 21, right: 21, top: 21),
SizedBox( SizedBox(
height: 110.0, height: 110.0,
child: getCategoriesList.isNotEmpty child: getCategoriesList.isNotEmpty
@ -81,6 +74,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
onTap: () { onTap: () {
setState(() { setState(() {
currentCategoryID = getCategoriesList[index].id!; currentCategoryID = getCategoriesList[index].id!;
getCategoryOffersListAPI();
// getItemsForSaleList.clear(); // getItemsForSaleList.clear();
// currentPageNo = 1; // currentPageNo = 1;
// getItemsForSale(currentPageNo, currentCategoryID); // getItemsForSale(currentPageNo, currentCategoryID);
@ -146,7 +140,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
List<Widget> getItemsForSaleWidgets() { List<Widget> getItemsForSaleWidgets() {
List<Widget> itemsList = []; List<Widget> itemsList = [];
for (var element in getOffersList) { for (var element in _foundOffersList) {
itemsList.add(getItemCard(element)); itemsList.add(getItemCard(element));
} }
@ -213,6 +207,18 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
); );
} }
void _runFilter(String enteredKeyword) {
List<OffersListModel> results = [];
if (enteredKeyword.isEmpty) {
results = getOffersList;
} else {
results = getOffersList.where((offer) => offer.title!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList();
}
setState(() {
_foundOffersList = results;
});
}
void navigateToDetails(OffersListModel offersListModelObj) { void navigateToDetails(OffersListModel offersListModelObj) {
List<OffersListModel> getOffersDetailList = []; List<OffersListModel> getOffersDetailList = [];
getOffersDetailList.clear(); getOffersDetailList.clear();
@ -258,6 +264,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
getOffersList = await OffersAndDiscountsApiClient().getOffersList(currentCategoryID, 100); getOffersList = await OffersAndDiscountsApiClient().getOffersList(currentCategoryID, 100);
_foundOffersList = getOffersList;
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (ex) { } catch (ex) {

@ -45,7 +45,8 @@ class _PendingTransactionsState extends State<PendingTransactions> {
), ),
body: Column( body: Column(
children: [ children: [
Column( ListView(
padding: const EdgeInsets.all(21),
children: [ children: [
PopupMenuButton( PopupMenuButton(
child: DynamicTextFieldWidget( child: DynamicTextFieldWidget(
@ -86,7 +87,7 @@ class _PendingTransactionsState extends State<PendingTransactions> {
}, },
) )
], ],
).objectContainerView().expanded, ).expanded,
DefaultButton( DefaultButton(
LocaleKeys.submit.tr(), LocaleKeys.submit.tr(),
selectedFunction == null selectedFunction == null

@ -11,8 +11,6 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/get_notification_buttons_list_model.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/allowed_actions_model.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/allowed_actions_model.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart';
import 'package:mohem_flutter_app/models/itg_forms_models/request_detail_model.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/request_detail_model.dart';
@ -20,7 +18,7 @@ import 'package:mohem_flutter_app/ui/work_list/itg_fragments/approval_level_frag
import 'package:mohem_flutter_app/ui/work_list/itg_fragments/request_detail_fragment.dart'; import 'package:mohem_flutter_app/ui/work_list/itg_fragments/request_detail_fragment.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/accept_reject_input_dialog.dart'; import 'package:mohem_flutter_app/widgets/dialogs/itg_comments_dialog.dart';
class ItgDetailScreen extends StatefulWidget { class ItgDetailScreen extends StatefulWidget {
ItgDetailScreen({Key? key}) : super(key: key); ItgDetailScreen({Key? key}) : super(key: key);
@ -58,12 +56,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
void getItgData() async { void getItgData() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
itgRequest = await WorkListApiClient().getITGFormDetails(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, ""); itgRequest = await WorkListApiClient().getITGFormDetails(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "");
allowedActionList = itgRequest?.allowedActions ?? []; allowedActionList = itgRequest?.allowedActions ?? [];
if (allowedActionList.isNotEmpty) { if (allowedActionList.isNotEmpty) {
isCloseAvailable = allowedActionList.any((element) => element.action == "CLOSE"); isCloseAvailable = allowedActionList.any((element) => element.action == "CLOSE");
isApproveAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Approve"); isApproveAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Approve");
// isAnswerAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Answer");
isRejectAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Reject"); isRejectAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Reject");
} }
Utils.hideLoading(context); Utils.hideLoading(context);
@ -341,34 +338,39 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
void performAction(String actionMode) { void performAction(String actionMode) {
showDialog( showDialog(
context: context, context: context,
builder: (cxt) => AcceptRejectInputDialog( builder: (cxt) => ITGCommentsDialog(
message: LocaleKeys.requestedItems.tr(), message: LocaleKeys.writeComment.tr(),
// notificationGetRespond: notificationNoteInput,
onTap: (note) { onTap: (note) {
Map<String, dynamic> payload = { if (actionMode == "APPROVED") {
"P_ACTION_MODE": actionMode, performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
"P_APPROVER_INDEX": null, } else {
"P_COMMENTS": "", performRejectAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
"P_FORWARD_TO_USER_NAME": "", }
// "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID!,
"RespondAttributeList": [
// if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note}
],
};
performNotificationAction(payload);
}, },
), ),
); );
} }
void performNotificationAction(Map<String, dynamic> payload) async { void performRejectAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
try {
Utils.showLoading(context);
ITGRequest? itgRequest = await WorkListApiClient().rejectITGRequest(requestType, taskId, itemId, employeeNumber, comments);
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
Navigator.pop(context, "delegate_reload");
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void performApproveAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
GenericResponseModel model = await WorkListApiClient().postNotificationActions(payload); ITGRequest? itgRequest = await WorkListApiClient().approveITGRequest(requestType, taskId, itemId, employeeNumber, comments);
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr()); Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
Navigator.pop(context, true); Navigator.pop(context, "delegate_reload");
} catch (ex) { } catch (ex) {
Utils.hideLoading(context); Utils.hideLoading(context);
Utils.handleException(ex, context, null); Utils.handleException(ex, context, null);

@ -19,6 +19,7 @@ import 'package:mohem_flutter_app/models/worklist_response_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class WorkListScreen extends StatefulWidget { class WorkListScreen extends StatefulWidget {
WorkListScreen({Key? key}) : super(key: key); WorkListScreen({Key? key}) : super(key: key);
@ -32,19 +33,70 @@ class WorkListScreen extends StatefulWidget {
class _WorkListScreenState extends State<WorkListScreen> { class _WorkListScreenState extends State<WorkListScreen> {
List<WorkListItemTypeModelData> workListItemTypes = [ List<WorkListItemTypeModelData> workListItemTypes = [
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'HR', fullName: LocaleKeys.humanResource.tr(), active: false, color: [Color(0xff32D892), Color(0xff1AB170)], icon: "assets/images/miss_swipe.svg", key: 'HRSSA', disable: false), value: 0,
name: 'HR',
fullName: LocaleKeys.humanResource.tr(),
active: false,
color: [Color(0xff32D892), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'HRSSA',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'MO', fullName: LocaleKeys.moveOrder.tr(), active: false, color: [Color(0xff58DCFA), Color(0xff3CB9D5)], icon: "assets/images/miss_swipe.svg", key: 'INVMOA', disable: false), value: 0, name: 'MR', fullName: LocaleKeys.moveOrder.tr(), active: false, color: [Color(0xff58DCFA), Color(0xff3CB9D5)], icon: "assets/images/miss_swipe.svg", key: 'INVMOA', disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'PR', fullName: LocaleKeys.purchaseRequisition.tr(), active: false, color: [Color(0xff48EACF), Color(0xff3DCAB3)], icon: "assets/images/miss_swipe.svg", key: 'REQAPPRV', disable: false), value: 0,
name: 'PR',
fullName: LocaleKeys.purchaseRequisition.tr(),
active: false,
color: [Color(0xff48EACF), Color(0xff3DCAB3)],
icon: "assets/images/miss_swipe.svg",
key: 'REQAPPRV',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'PO', fullName: LocaleKeys.purchaseOrder.tr(), active: false, color: [Color(0xff5099E3), Color(0xff3670AA)], icon: "assets/images/miss_swipe.svg", key: 'POAPPRV', disable: false), value: 0,
name: 'PO',
fullName: LocaleKeys.purchaseOrder.tr(),
active: false,
color: [Color(0xff5099E3), Color(0xff3670AA)],
icon: "assets/images/miss_swipe.svg",
key: 'POAPPRV',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'ITG', fullName: LocaleKeys.ITGForms.tr(), active: false, color: [Color(0xffEB8C90), Color(0xffDE6C70)], icon: "assets/images/miss_swipe.svg", key: 'ITG', disable: false), value: 0,
name: 'ITG',
fullName: LocaleKeys.ITGForms.tr(),
active: false,
color: [Color(0xffEB8C90), Color(0xffDE6C70)],
icon: "assets/images/miss_swipe.svg",
key: 'ITG',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'IC', fullName: LocaleKeys.itemCreation.tr(), active: false, color: [Color(0xff32D892), Color(0xff1AB170)], icon: "assets/images/miss_swipe.svg", key: 'INVITEM', disable: false), value: 0,
name: 'IC',
fullName: LocaleKeys.itemCreation.tr(),
active: false,
color: [Color(0xff32D892), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'INVITEM',
disable: false),
WorkListItemTypeModelData( WorkListItemTypeModelData(
value: 0, name: 'STAMP', fullName: LocaleKeys.stamp.tr(), active: false, color: [Color(0xff32D892), Color(0xff1AB170)], icon: "assets/images/miss_swipe.svg", key: 'STAMP', disable: false), value: 0,
name: 'STAMP',
fullName: LocaleKeys.stamp.tr(),
active: false,
color: [Color(0xff32D892), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'STAMP',
disable: false),
WorkListItemTypeModelData(
value: 0,
name: 'COC',
fullName: LocaleKeys.itemCreation.tr(),
active: false,
color: [Color(0xff787299), Color(0xff1AB170)],
icon: "assets/images/miss_swipe.svg",
key: 'COC',
disable: true)
]; ];
int workListItemIndex = 0; int workListItemIndex = 0;
@ -54,6 +106,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
late DashboardProviderModel providerData; late DashboardProviderModel providerData;
final RefreshController _refreshController = RefreshController(initialRefresh: false);
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -67,8 +121,13 @@ class _WorkListScreenState extends State<WorkListScreen> {
workListItemTypes.forEach((workListElement) { workListItemTypes.forEach((workListElement) {
if (workListElement.key == "ITG") { if (workListElement.key == "ITG") {
workListElement.value = providerData.itgFormsModel?.totalCount ?? 0; workListElement.value = providerData.itgFormsModel?.totalCount ?? 0;
} else if (workListElement.key == "COC") {
workListElement.value = providerData.cocFinalCount;
} else { } else {
var tempList = providerData.getOpenNotificationsList?.where((notificationElement) => notificationElement.itemType == workListElement.key).toList(); var tempList = providerData.getOpenNotificationsList
?.where((notificationElement) =>
notificationElement.itemType == workListElement.key)
.toList();
if (tempList!.isNotEmpty) { if (tempList!.isNotEmpty) {
workListElement.value = tempList.first.openNtfNumber ?? 0; workListElement.value = tempList.first.openNtfNumber ?? 0;
} }
@ -87,18 +146,26 @@ class _WorkListScreenState extends State<WorkListScreen> {
List<RequestDetails> requestAllList = []; List<RequestDetails> requestAllList = [];
for (int i = 0; i < (itgFormsModel?.requestType!.length ?? 0); i++) { for (int i = 0; i < (itgFormsModel?.requestType!.length ?? 0); i++) {
itgFormsModel?.requestType![i].requestDetails?.forEach((element) { itgFormsModel?.requestType![i].requestDetails?.forEach((element) {
element.requestType = itgFormsModel?.requestType![i].requestTypeCode; element.requestType =
itgFormsModel?.requestType![i].requestTypeCode;
}); });
requestAllList = requestAllList + (itgFormsModel?.requestType![i].requestDetails ?? []); requestAllList = requestAllList +
(itgFormsModel?.requestType![i].requestDetails ?? []);
} }
AppState().setRequestAllList = requestAllList; AppState().setRequestAllList = requestAllList;
itgFormsModel?.requestType!.insert(0, RequestType(requestDetails: requestAllList, requestTypeCode: "all", requestTypeName: "All")); itgFormsModel?.requestType!.insert(
0,
RequestType(
requestDetails: requestAllList,
requestTypeCode: "all",
requestTypeName: "All"));
if ((itgFormsModel?.requestType?.length ?? 0) > 0) { if ((itgFormsModel?.requestType?.length ?? 0) > 0) {
itgRequestTypeIndex = 0; itgRequestTypeIndex = 0;
} }
} else { } else {
itgRequestTypeIndex = null; itgRequestTypeIndex = null;
workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key); workList = await WorkListApiClient()
.getWorkList(pageNumber, workListItemTypes[workListItemIndex].key);
AppState().setWorkList = workList; AppState().setWorkList = workList;
} }
Utils.hideLoading(context); Utils.hideLoading(context);
@ -109,6 +176,11 @@ class _WorkListScreenState extends State<WorkListScreen> {
} }
} }
void _onRefresh() async {
getWorkList();
_refreshController.refreshCompleted();
}
@override @override
void dispose() { void dispose() {
super.dispose(); super.dispose();
@ -129,26 +201,33 @@ class _WorkListScreenState extends State<WorkListScreen> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor),
width: double.infinity,
height: 1,
color: MyColors.lightGreyEFColor,
),
SizedBox( SizedBox(
height: 40, height: 40,
child: ListView.separated( child: ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Container( return Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 8, bottom: 8), padding: const EdgeInsets.only(
left: 21, right: 21, top: 8, bottom: 8),
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(6), color: workListItemIndex == index ? MyColors.darkIconColor : MyColors.lightGreyEAColor), decoration: BoxDecoration(
child: ("${workListItemTypes[index].name} ${workListItemTypes[index].value > 0 ? "(${workListItemTypes[index].value})" : ""}") borderRadius: BorderRadius.circular(6),
.toText12(color: workListItemIndex == index ? MyColors.white : MyColors.black), color: workListItemIndex == index
? MyColors.darkIconColor
: MyColors.lightGreyEAColor),
child:
("${workListItemTypes[index].name} ${workListItemTypes[index].value > 0 ? "(${workListItemTypes[index].value})" : ""}")
.toText12(
color: workListItemIndex == index
? MyColors.white
: MyColors.black),
).onPress(() { ).onPress(() {
if (workListItemIndex != index) { if (workListItemIndex != index &&
!workListItemTypes[index].disable) {
workListItemIndex = index; workListItemIndex = index;
if (workListItemTypes[index].value == 0) { if (workListItemTypes[index].value == 0) {
workList = []; workList = [];
itgRequestTypeIndex = null;
} else { } else {
workList = null; workList = null;
} }
@ -167,71 +246,87 @@ class _WorkListScreenState extends State<WorkListScreen> {
), ),
).paddingOnly(top: 21, bottom: 21), ).paddingOnly(top: 21, bottom: 21),
workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21), workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21),
if (itgRequestTypeIndex != null) SmartRefresher(
SizedBox( enablePullDown: true,
height: 40, enablePullUp: false,
child: ListView.separated( header: const MaterialClassicHeader(
itemBuilder: (context, index) { color: MyColors.gradiantEndColor,
RequestType type = itgFormsModel!.requestType![index];
return Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 8, bottom: 8),
alignment: Alignment.center,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: itgRequestTypeIndex == index ? MyColors.darkIconColor : MyColors.lightGreyEAColor),
child: ("${type.requestTypeName}").toText12(color: itgRequestTypeIndex == index ? MyColors.white : MyColors.black),
).onPress(() {
if (itgRequestTypeIndex != index) {
itgRequestTypeIndex = index;
setState(() {});
}
});
},
separatorBuilder: (context, index) => 8.width,
shrinkWrap: true,
itemCount: itgFormsModel?.requestType?.length ?? 0,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.only(left: 21, right: 21),
), ),
).paddingOnly(top: 16, bottom: 16), controller: _refreshController,
itgRequestTypeIndex != null onRefresh: _onRefresh,
? Expanded( child: SingleChildScrollView(
child: ListView.separated( physics: const BouncingScrollPhysics(),
physics: BouncingScrollPhysics(), child: itgRequestTypeIndex != null
itemBuilder: (context, index) { ? Column(
return itgRowItem(workListItemTypes[workListItemIndex], itgFormsModel!.requestType![itgRequestTypeIndex!].requestDetails![index], index); children: [
}, SizedBox(
separatorBuilder: (context, index) => 12.height, height: 40,
itemCount: itgFormsModel!.requestType![itgRequestTypeIndex!].requestDetails?.length ?? 0, child: ListView.separated(
padding: const EdgeInsets.all(21),
),
)
: Expanded(
child: workList != null
? ((workList!).isEmpty
? LocaleKeys.noHistoryAvailable.tr().toText16().center
: ListView.separated(
physics: const BouncingScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return rowItem(workListItemTypes[workListItemIndex], workList![index], index); RequestType type = itgFormsModel!.requestType![index];
return Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 8, bottom: 8),
alignment: Alignment.center,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(30), color: itgRequestTypeIndex == index ? MyColors.darkIconColor : MyColors.lightGreyEAColor),
child: ("${type.requestTypeName}").toText12(color: itgRequestTypeIndex == index ? MyColors.white : MyColors.black),
).onPress(() {
if (itgRequestTypeIndex != index) {
itgRequestTypeIndex = index;
setState(() {});
}
});
}, },
separatorBuilder: (context, index) => 12.height, separatorBuilder: (context, index) => 8.width,
itemCount: workList?.length ?? 0, shrinkWrap: true,
padding: const EdgeInsets.all(21), itemCount: itgFormsModel?.requestType?.length ?? 0,
)) scrollDirection: Axis.horizontal,
: const SizedBox(), padding: const EdgeInsets.only(left: 21, right: 21),
), ),
).paddingOnly(top: 16, bottom: 16),
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return itgRowItem(workListItemTypes[workListItemIndex], itgFormsModel!.requestType![itgRequestTypeIndex!].requestDetails![index], index);
},
separatorBuilder: (context, index) => 12.height,
itemCount: itgFormsModel!.requestType![itgRequestTypeIndex!].requestDetails?.length ?? 0,
padding: const EdgeInsets.all(21),
),
],
)
: workList != null
? ((workList!).isEmpty
? Utils.getNoDataWidget(context).paddingOnly(top: 100)
: ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return rowItem(workListItemTypes[workListItemIndex], workList![index], index);
},
separatorBuilder: (context, index) => 12.height,
itemCount: workList?.length ?? 0,
padding: const EdgeInsets.all(21),
))
: const SizedBox(),
)).expanded,
], ],
), ),
), ),
); );
} }
Widget itgRowItem(WorkListItemTypeModelData data, RequestDetails requestDetails, int index) { Widget itgRowItem(WorkListItemTypeModelData data,
RequestDetails requestDetails, int index) {
return InkWell( return InkWell(
onTap: () async { onTap: () async {
AppState().setItgWorkListIndex = index; AppState().setItgWorkListIndex = index;
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.itgDetail); var shouldReloadData =
await Navigator.pushNamed(context, AppRoutes.itgDetail);
if (shouldReloadData != null) { if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") { if (shouldReloadData.toString() == "delegate_reload") {
providerData.itgFormsModel!.totalCount =
providerData.itgFormsModel!.totalCount! - 1;
calculateCounter(); calculateCounter();
getWorkList(); getWorkList();
} }
@ -255,7 +350,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
}, },
child: Container( child: Container(
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), padding:
const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
@ -274,11 +370,20 @@ class _WorkListScreenState extends State<WorkListScreen> {
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
gradient: LinearGradient(transform: GradientRotation(.218), begin: Alignment.topRight, end: Alignment.bottomRight, colors: data.color), gradient: LinearGradient(
transform: GradientRotation(.218),
begin: Alignment.topRight,
end: Alignment.bottomRight,
colors: data.color),
), ),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [SvgPicture.asset("assets/images/miss_swipe.svg", width: 20, height: 20, color: Colors.white), 2.height, data.name.toText10(color: Colors.white)], children: [
SvgPicture.asset("assets/images/miss_swipe.svg",
width: 20, height: 20, color: Colors.white),
2.height,
data.name.toText10(color: Colors.white)
],
).paddingAll(6), ).paddingAll(6),
), ),
8.width, 8.width,
@ -292,10 +397,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
Row( Row(
children: [ children: [
DateUtil.formatDateToDate(DateUtil.convertStringToDate(requestDetails.modifiedDate!), false).toText10(color: MyColors.lightTextColor).expanded, DateUtil.formatDateToDate(DateUtil.convertStringToDate(requestDetails.modifiedDate!), false).toText10(color: MyColors.lightTextColor).expanded,
SvgPicture.asset( RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor)),
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
], ],
), ),
], ],
@ -307,12 +409,15 @@ class _WorkListScreenState extends State<WorkListScreen> {
); );
} }
Widget rowItem(WorkListItemTypeModelData data, WorkListResponseModel workData, int index) { Widget rowItem(WorkListItemTypeModelData data, WorkListResponseModel workData,
int index) {
return InkWell( return InkWell(
onTap: () async { onTap: () async {
AppState().setWorkListIndex = index; AppState().setWorkListIndex = index;
var data = workList![index]; var data = workList![index];
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.workListDetail, arguments: workData); var shouldReloadData = await Navigator.pushNamed(
context, AppRoutes.workListDetail,
arguments: workData);
if (shouldReloadData != null) { if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") { if (shouldReloadData.toString() == "delegate_reload") {
calculateCounter(); calculateCounter();
@ -337,7 +442,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
}, },
child: Container( child: Container(
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), padding:
const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
@ -356,11 +462,20 @@ class _WorkListScreenState extends State<WorkListScreen> {
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
gradient: LinearGradient(transform: GradientRotation(.218), begin: Alignment.topRight, end: Alignment.bottomRight, colors: data.color), gradient: LinearGradient(
transform: GradientRotation(.218),
begin: Alignment.topRight,
end: Alignment.bottomRight,
colors: data.color),
), ),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [SvgPicture.asset("assets/images/miss_swipe.svg", width: 20, height: 20, color: Colors.white), 2.height, data.name.toText10(color: Colors.white)], children: [
SvgPicture.asset("assets/images/miss_swipe.svg",
width: 20, height: 20, color: Colors.white),
2.height,
data.name.toText10(color: Colors.white)
],
).paddingAll(6), ).paddingAll(6),
), ),
8.width, 8.width,
@ -374,10 +489,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
Row( Row(
children: [ children: [
DateUtil.formatDateToDate(DateUtil.convertSimpleStringDateToDate(workData.bEGINDATE!), false).toText10(color: MyColors.lightTextColor).expanded, DateUtil.formatDateToDate(DateUtil.convertSimpleStringDateToDate(workData.bEGINDATE!), false).toText10(color: MyColors.lightTextColor).expanded,
SvgPicture.asset( RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor)),
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
], ],
), ),
], ],

@ -209,6 +209,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
workListData: workListData, workListData: workListData,
itemCreationHeader: getItemCreationNtfBody?.itemCreationHeader ?? [], itemCreationHeader: getItemCreationNtfBody?.itemCreationHeader ?? [],
getStampMsNotifications: getStampMsNotifications, getStampMsNotifications: getStampMsNotifications,
getStampNsNotifications: getStampNsNotifications,
getEitCollectionNotificationBodyList: getEitCollectionNotificationBodyList, getEitCollectionNotificationBodyList: getEitCollectionNotificationBodyList,
getPhonesNotificationBodyList: getPhonesNotificationBodyList, getPhonesNotificationBodyList: getPhonesNotificationBodyList,
getBasicDetNtfBodyList: getBasicDetNtfBodyList, getBasicDetNtfBodyList: getBasicDetNtfBodyList,
@ -222,8 +223,8 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
poLinesList: getPoNotificationBody?.pOLines ?? [], poLinesList: getPoNotificationBody?.pOLines ?? [],
itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [], itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [],
), ),
ActionsFragment(workListData!.nOTIFICATIONID, actionHistoryList), actionHistoryList.isEmpty ? Utils.getNoDataWidget(context) : ActionsFragment(workListData!.nOTIFICATIONID, actionHistoryList),
AttachmentsFragment(getAttachmentList), getAttachmentList.isEmpty ? Utils.getNoDataWidget(context) : AttachmentsFragment(getAttachmentList),
], ],
).expanded, ).expanded,
if (isApproveAvailable || isRejectAvailable || isCloseAvailable) if (isApproveAvailable || isRejectAvailable || isCloseAvailable)
@ -232,10 +233,7 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: Colors.white, color: Colors.white,
border: Border( border: Border(
top: BorderSide( top: BorderSide(color: MyColors.lightGreyEFColor, width: 1.0),
color: MyColors.lightGreyEFColor,
width: 1.0,
),
), ),
), ),
child: Row( child: Row(
@ -244,29 +242,20 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
DefaultButton( DefaultButton(
LocaleKeys.reject.tr(), LocaleKeys.reject.tr(),
() => performAction("REJECTED"), () => performAction("REJECTED"),
colors: const [ colors: const [Color(0xffE47A7E), Color(0xffDE6D71)],
Color(0xffE47A7E),
Color(0xffDE6D71),
],
).expanded, ).expanded,
if (isApproveAvailable && isRejectAvailable) 8.width, if (isApproveAvailable && isRejectAvailable) 8.width,
if (isApproveAvailable) if (isApproveAvailable)
DefaultButton( DefaultButton(
LocaleKeys.approve.tr(), LocaleKeys.approve.tr(),
() => performAction("APPROVED"), () => performAction("APPROVED"),
colors: const [ colors: const [Color(0xff28C884), Color(0xff1BB271)],
Color(0xff28C884),
Color(0xff1BB271),
],
).expanded, ).expanded,
if (isCloseAvailable) if (isCloseAvailable)
DefaultButton( DefaultButton(
LocaleKeys.ok.tr(), LocaleKeys.ok.tr(),
() => performAction("CLOSE"), () => performAction("CLOSE"),
colors: const [ colors: const [Color(0xff32D892), Color(0xff1AB170)],
Color(0xff32D892),
Color(0xff1AB170),
],
).expanded, ).expanded,
8.width, 8.width,
Container( Container(
@ -487,10 +476,13 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
"P_FORWARD_TO_USER_NAME": "", "P_FORWARD_TO_USER_NAME": "",
"P_NOTIFICATION_ID": workListData!.nOTIFICATIONID, "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID,
"RespondAttributeList": [ "RespondAttributeList": [
if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note} if (notificationNoteInput != null)
{
"ATTRIBUTE_NAME": notificationNoteInput!.attributeName,
if (notificationNoteInput!.attributeType == "number") "ATTRIBUTE_NUMBER_VALUE": note else if (notificationNoteInput!.attributeType == "VARCHAR2") "ATTRIBUTE_TEXT_VALUE": note
}
], ],
}; };
performNotificationAction(payload); performNotificationAction(payload);
}, },
), ),

@ -115,9 +115,15 @@ class ActionsFragment extends StatelessWidget {
if (code == "SUBMIT") { if (code == "SUBMIT") {
return const Color(0xff2E303A); return const Color(0xff2E303A);
} else if (code == "REJECTED") { } else if (code == "REJECTED") {
return const Color(0xffD02127); return MyColors.redColor;
} else if (code == "REJECT") {
return MyColors.redColor;
} else if (code == "PENDING") {
return MyColors.orange;
} else if (code == "APPROVED") { } else if (code == "APPROVED") {
return const Color(0xff1FA269); return const Color(0xff1FA269);
} else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") {
return const Color(0xff1FA269);
} else if (code == "REQUEST_INFO") { } else if (code == "REQUEST_INFO") {
return const Color(0xff2E303A); return const Color(0xff2E303A);
} else { } else {

@ -28,9 +28,12 @@ class AttachmentsFragment extends StatelessWidget {
(getAttachmentList[index].fILENAME?.capitalizeFirstofEach ?? "").toText16().expanded, (getAttachmentList[index].fILENAME?.capitalizeFirstofEach ?? "").toText16().expanded,
], ],
).objectContainerView().onPress(() async { ).objectContainerView().onPress(() async {
print("calling"); try {
String path = await _createFileFromString(getAttachmentList[index].fILEDATA ?? "", getAttachmentList[index].fILECONTENTTYPE ?? ""); String path = await _createFileFromString(getAttachmentList[index].fILEDATA ?? "", getAttachmentList[index].fILECONTENTTYPE ?? "");
OpenFile.open(path); OpenFile.open(path);
} catch (ex) {
debugPrint("FileErorr:$ex");
}
}); });
}, },
separatorBuilder: (BuildContext context, int index) => 12.height, separatorBuilder: (BuildContext context, int index) => 12.height,
@ -67,7 +70,6 @@ class AttachmentsFragment extends StatelessWidget {
String dir = (await getApplicationDocumentsDirectory()).path; String dir = (await getApplicationDocumentsDirectory()).path;
File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + "." + ext); File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + "." + ext);
await file.writeAsBytes(bytes); await file.writeAsBytes(bytes);
// print(file.path);
return file.path; return file.path;
} }
} }

@ -219,7 +219,7 @@ class InfoFragment extends StatelessWidget {
), ),
], ],
), ),
separatorBuilder: (cxt, index) => 18.height, separatorBuilder: (cxt, index) => 1.divider.paddingOnly(top: 8, bottom: 8),
itemCount: list.length); itemCount: list.length);
} }
@ -241,7 +241,7 @@ class InfoFragment extends StatelessWidget {
), ),
], ],
), ),
separatorBuilder: (cxt, index) => 18.height, separatorBuilder: (cxt, index) => 1.divider.paddingOnly(top: 8, bottom: 8),
itemCount: list.length); itemCount: list.length);
} }

@ -1,4 +1,3 @@
import 'package:easy_localization/src/public_ext.dart'; import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -6,6 +5,7 @@ import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
@ -15,7 +15,7 @@ import 'package:mohem_flutter_app/models/worklist/update_user_type_list.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
class WorklistSettings extends StatefulWidget { class WorklistSettings extends StatefulWidget {
const WorklistSettings({Key? key}) : super(key: key); const WorklistSettings({Key? key}) : super(key: key);
@override @override
@ -26,7 +26,6 @@ class _WorklistSettingsState extends State<WorklistSettings> {
List<GetUserItemTypesList> getUserItemTypesList = []; List<GetUserItemTypesList> getUserItemTypesList = [];
UpdateUserItemTypesList? updateUserItemTypesList; UpdateUserItemTypesList? updateUserItemTypesList;
void initState() { void initState() {
super.initState(); super.initState();
userItemTypesList(); userItemTypesList();
@ -47,10 +46,9 @@ class _WorklistSettingsState extends State<WorklistSettings> {
void updateUserItem() async { void updateUserItem() async {
try { try {
Utils.showLoading(context); Utils.showLoading(context);
List<Map<String, dynamic>> itemList=[]; List<Map<String, dynamic>> itemList = [];
for (var element in getUserItemTypesList) { for (var element in getUserItemTypesList) {
itemList.add(UpdateUserTypesList(itemID: element.uSERITEMTYPEID, pITEMTYPE: element.iTEMTYPE,pFYAENABLEDFALG: element.fYAENABLEDFALG, pFYIENABLEDFALG: element.fYIENABLEDFLAG).toJson()); itemList.add(UpdateUserTypesList(itemID: element.uSERITEMTYPEID, pITEMTYPE: element.iTEMTYPE, pFYAENABLEDFALG: element.fYAENABLEDFALG, pFYIENABLEDFALG: element.fYIENABLEDFLAG).toJson());
} }
updateUserItemTypesList = await WorkListApiClient().updateUserItemTypes(itemList); updateUserItemTypesList = await WorkListApiClient().updateUserItemTypes(itemList);
Utils.hideLoading(context); Utils.hideLoading(context);
@ -64,115 +62,92 @@ class _WorklistSettingsState extends State<WorklistSettings> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold(backgroundColor: Colors.white, return Scaffold(
backgroundColor: Colors.white,
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.worklistSettings.tr(), title: LocaleKeys.worklistSettings.tr(),
), ),
body:ListView( body: Column(
children: [ children: [
Expanded( ListView(
child: Container( padding: const EdgeInsets.only(top: 21, left: 21, right: 21),
margin: const EdgeInsets.only(top: 21, left: 21, right: 21), children: [
child: Column( LocaleKeys.TurnNotificationsFor.tr().toText22(color: MyColors.blackColor),
crossAxisAlignment: CrossAxisAlignment.start, 16.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Container( LocaleKeys.itemType.tr().toText14(color: MyColors.blackColor),
child: LocaleKeys.TurnNotificationsFor.tr().toText22(color: MyColors.blackColor),
).paddingOnly(top: 10, bottom: 50),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: ["FYA".tr().toText14(color: MyColors.blackColor), 30.width, "FYI".tr().toText14(color: MyColors.blackColor), 30.width],
Container( )
child: LocaleKeys.itemType.tr().toText14(color: MyColors.blackColor) ,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Container(
child: "FYA".tr().toText14(color: MyColors.blackColor) ,
),
Container(
child: "FYI".tr().toText14(color: MyColors.blackColor) ,
).paddingOnly(left: 30, right: 30),
],
)
],
),
Divider(color: MyColors.greyA5Color,),
SingleChildScrollView(
scrollDirection: Axis.vertical,
child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
physics: ScrollPhysics(),
itemCount: getUserItemTypesList == null ? 0 : getUserItemTypesList.length,
itemBuilder: (BuildContext context,int index) {
return Column(
children:[
customSwitch(getUserItemTypesList[index]),
Divider(
color: MyColors.greyC4Color,
thickness: 0.5,),
]);
}
),
),
], ],
), ),
), const Divider(color: MyColors.greyA5Color),
), SingleChildScrollView(
DefaultButton( scrollDirection: Axis.vertical,
LocaleKeys.save.tr(), () async { child: ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
physics: ScrollPhysics(),
itemCount: getUserItemTypesList == null ? 0 : getUserItemTypesList.length,
itemBuilder: (BuildContext context, int index) {
return Column(children: [
customSwitch(getUserItemTypesList[index]),
Divider(
color: MyColors.greyC4Color,
thickness: 0.5,
),
]);
}),
),
],
).expanded,
DefaultButton(LocaleKeys.save.tr(), () async {
updateUserItem(); updateUserItem();
}).insideContainer, }).insideContainer,
], ],
) ));
);
} }
Widget customSwitch(GetUserItemTypesList list) {
Widget customSwitch(GetUserItemTypesList list){ return Padding(
return Padding( padding: const EdgeInsets.only(top: 21),
padding: const EdgeInsets.only(top: 21), child: Row(
child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
children: [ Text(
Text(list.iTEMTYPE.toString(), style: TextStyle( list.iTEMTYPE.toString(),
fontSize: 16, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.blackColor),
fontWeight: FontWeight.w600, ),
color: MyColors.blackColor const Spacer(),
),), Row(
const Spacer(), children: [
Row( CupertinoSwitch(
children: [ trackColor: MyColors.grey57Color,
CupertinoSwitch( activeColor: MyColors.textMixColor,
trackColor: Colors.grey, value: list?.fYAENABLEDFALG == 'Y' ? true : false,
activeColor: MyColors.gradiantEndColor, onChanged: (value) {
value: list?.fYAENABLEDFALG =='Y' ?true : false, setState(() {
onChanged: (value){ list?.fYAENABLEDFALG = value == true ? 'Y' : 'N';
setState(() { });
list?.fYAENABLEDFALG = value == true ? 'Y': 'N'; }),
}); CupertinoSwitch(
} trackColor: MyColors.grey57Color,
), activeColor: MyColors.textMixColor,
CupertinoSwitch( value: list?.fYIENABLEDFLAG == 'Y' ? true : false,
trackColor: Colors.grey, onChanged: (value) {
activeColor: MyColors.gradiantEndColor, setState(() {
value: list?.fYIENABLEDFLAG =='Y' ?true : false, // list.isFYI = value;
onChanged: (value){ list?.fYIENABLEDFLAG = value == true ? 'Y' : 'N';
setState(() { });
// list.isFYI = value; }),
list?.fYIENABLEDFLAG = value ==true ? 'Y': 'N'; ],
}); )
} ],
), ),
], );
)
],
),
);
} }
} }

@ -8,6 +8,7 @@ import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:pie_chart/pie_chart.dart'; import 'package:pie_chart/pie_chart.dart';
@ -64,14 +65,14 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
if (widget.isLeaveBalance) { if (widget.isLeaveBalance) {
leaveBalanceAccrual = accrualList[0]; leaveBalanceAccrual = accrualList[0];
chartModelList = [ chartModelList = [
PieChartModel("Current Balance", leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""), PieChartModel(LocaleKeys.currentBalance.tr(), leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Used", leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""), PieChartModel(LocaleKeys.usedBalance.tr(), leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
]; ];
} else { } else {
chartModelList = [ chartModelList = [
PieChartModel("Adult", accrualList[1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""), PieChartModel(LocaleKeys.adult.tr(), accrualList[1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Child", accrualList[2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""), PieChartModel(LocaleKeys.child.tr(), accrualList[2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
PieChartModel("infants", accrualList[3].accrualNetEntitlement?.toDouble() ?? 0, MyColors.pinkColor, titleAppend: ""), PieChartModel(LocaleKeys.infants.tr(), accrualList[3].accrualNetEntitlement?.toDouble() ?? 0, MyColors.pinkColor, titleAppend: ""),
]; ];
} }
} }
@ -88,8 +89,8 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
if (leaveBalanceAccrual == null && widget.isLeaveBalance) { if (leaveBalanceAccrual == null && widget.isLeaveBalance) {
leaveBalanceAccrual = Provider.of<DashboardProviderModel>(context, listen: false).leaveBalanceAccrual; leaveBalanceAccrual = Provider.of<DashboardProviderModel>(context, listen: false).leaveBalanceAccrual;
chartModelList = [ chartModelList = [
PieChartModel("Current Balance", leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""), PieChartModel(LocaleKeys.currentBalance.tr(), leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Used", leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""), PieChartModel(LocaleKeys.usedBalance.tr(), leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
]; ];
} }
@ -97,9 +98,9 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
ticketBalanceAccrualList = Provider.of<DashboardProviderModel>(context, listen: false).accrualList ?? []; ticketBalanceAccrualList = Provider.of<DashboardProviderModel>(context, listen: false).accrualList ?? [];
if (ticketBalanceAccrualList!.isNotEmpty) { if (ticketBalanceAccrualList!.isNotEmpty) {
chartModelList = [ chartModelList = [
PieChartModel("Adult", ticketBalanceAccrualList![1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""), PieChartModel(LocaleKeys.adult.tr(), ticketBalanceAccrualList![1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Child", ticketBalanceAccrualList![2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""), PieChartModel(LocaleKeys.child.tr(), ticketBalanceAccrualList![2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
PieChartModel("infants", ticketBalanceAccrualList![3].accrualNetEntitlement?.toDouble() ?? 0, MyColors.pinkColor, titleAppend: ""), PieChartModel(LocaleKeys.infants.tr(), ticketBalanceAccrualList![3].accrualNetEntitlement?.toDouble() ?? 0, MyColors.pinkColor, titleAppend: ""),
]; ];
} }
} }

@ -26,9 +26,9 @@ class AttachmentOptions extends StatelessWidget {
padding: const EdgeInsets.only(top: 21, bottom: 14), padding: const EdgeInsets.only(top: 21, bottom: 14),
shrinkWrap: true, shrinkWrap: true,
children: [ children: [
itemView("open_camera.svg", "Open\nCamera"), itemView("open_camera.svg", "Open\nCamera", onCameraTap),
itemView("gallery.svg", "Upload from\nGallery"), itemView("gallery.svg", "Upload from\nGallery", onGalleryTap),
itemView("files.svg", "Upload from\nFiles"), itemView("files.svg", "Upload from\nFiles", onFilesTap),
], ],
) )
], ],
@ -36,19 +36,22 @@ class AttachmentOptions extends StatelessWidget {
); );
} }
Widget itemView(String icon, String title) { Widget itemView(String icon, String title, VoidCallback onTap) {
return Column( return InkWell(
crossAxisAlignment: CrossAxisAlignment.start, onTap: onTap,
mainAxisAlignment: MainAxisAlignment.spaceBetween, child: Column(
children: [ crossAxisAlignment: CrossAxisAlignment.start,
SvgPicture.asset("assets/images/$icon"), mainAxisAlignment: MainAxisAlignment.spaceBetween,
title.toText11(isBold: true), children: [
], SvgPicture.asset("assets/images/$icon"),
).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView( title.toText11(isBold: true),
disablePadding: true, ],
radius: 10, ).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView(
color: MyColors.greyF7Color.withOpacity(.48), disablePadding: true,
borderColor: MyColors.lightGreyE5Color.withOpacity(.48), radius: 10,
); color: MyColors.greyF7Color.withOpacity(.48),
borderColor: MyColors.lightGreyE5Color.withOpacity(.48),
),
);
} }
} }

@ -66,6 +66,7 @@ class AcceptRejectInputDialog extends StatelessWidget {
notificationGetRespond!.attributeDisplayName!, notificationGetRespond!.attributeDisplayName!,
TextEditingController(), TextEditingController(),
isBackgroundEnable: true, isBackgroundEnable: true,
isInputTypeNum: notificationGetRespond!.attributeType == "number",
lines: 3, lines: 3,
onChange: (String note) { onChange: (String note) {
this.note = note; this.note = note;

@ -0,0 +1,102 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/input_widget.dart';
class ITGCommentsDialog extends StatelessWidget {
final String? title;
final String? message;
final String? okTitle;
final Function(String) onTap;
ITGCommentsDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap}) : super(key: key);
String note = "";
@override
Widget build(BuildContext context) {
return Dialog(
backgroundColor: Colors.white,
shape: const RoundedRectangleBorder(),
insetPadding: const EdgeInsets.only(left: 21, right: 21),
child: Padding(
padding: const EdgeInsets.only(left: 20, right: 20, top: 18, bottom: 28),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 16.0),
child: Text(
title ?? LocaleKeys.confirm.tr(),
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: Color(0xff2B353E), height: 35 / 24, letterSpacing: -0.96),
),
),
),
IconButton(
padding: EdgeInsets.zero,
icon: const Icon(Icons.close),
color: const Color(0xff2B353E),
constraints: const BoxConstraints(),
onPressed: () {
Navigator.pop(context);
},
)
],
),
Text(
message ?? "",
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xff808080), letterSpacing: -0.48),
),
// if (notificationGetRespond != null) ...[
14.height,
InputWidget(
"Enter a Note",
LocaleKeys.comments.tr(),
TextEditingController(),
isBackgroundEnable: true,
isInputTypeNum: false,
lines: 3,
onChange: (String note) {
this.note = note;
},
),
// ],
28.height,
Row(
children: [
DefaultButton(
LocaleKeys.cancel.tr(),
() => Navigator.pop(context),
colors: const [MyColors.lightGreyEAColor, MyColors.lightGreyEAColor],
textColor: MyColors.darkTextColor,
).expanded,
10.width,
DefaultButton(
LocaleKeys.ok.tr(),
() {
Navigator.pop(context);
onTap(note);
},
colors: const [
Color(0xff28C884),
Color(0xff1BB271),
],
).expanded,
],
),
],
),
),
);
}
}

@ -15,9 +15,31 @@ class ImageOptions {
context, context,
child: AttachmentOptions( child: AttachmentOptions(
onCameraTap: () async { onCameraTap: () async {
PickedFile? path = await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20); if (Platform.isAndroid) {
cameraImageAndroid(image);
} else {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.camera, imageQuality: 20))?.path ?? "");
String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes);
if (base64Encode != null) {
image(base64Encode, _image);
}
}
},
onGalleryTap: () async {
if (Platform.isAndroid) {
galleryImageAndroid(image);
} else {
File _image = File((await ImagePicker.platform.pickImage(source: ImageSource.gallery, imageQuality: 20))?.path ?? "");
String fileName = _image.path;
var bytes = File(fileName).readAsBytesSync();
String base64Encode = base64.encode(bytes);
if (base64Encode != null) {
image(base64Encode, _image);
}
}
}, },
onGalleryTap: () {},
onFilesTap: () async { onFilesTap: () async {
FilePickerResult? result = await FilePicker.platform.pickFiles(); FilePickerResult? result = await FilePicker.platform.pickFiles();
}, },

@ -76,6 +76,7 @@ dependencies:
share: 2.0.4 share: 2.0.4
flutter_rating_bar: ^4.0.1 flutter_rating_bar: ^4.0.1
auto_size_text: ^3.0.0 auto_size_text: ^3.0.0
pull_to_refresh: ^2.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save