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
merge-requests/12/head
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"
android {
compileSdkVersion 32
compileSdkVersion 33
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
@ -44,7 +44,7 @@ android {
defaultConfig {
// 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
targetSdkVersion 32
versionCode flutterVersionCode.toInteger()

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

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

@ -1,7 +1,7 @@
{
"mohemm": "Mohemm",
"english": "English",
"arabic": "Arabic",
"arabic": "عربي",
"login": "Login",
"pleaseEnterLoginDetails": "Please enter the detail below to login",
"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)",
"endDate": "*End Date",
"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",
"addRow": "Add new row",
"pleaseSelect": "Please Select *",
@ -409,6 +409,15 @@
"typeHere": "Type here",
"info_detail": "Info 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": {
"reset_password": {
"label": "Reset Password",

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

@ -30,20 +30,20 @@
</array>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NFCReaderUsageDescription</key>
<string>This App requires access to NFC to mark your attendance.</string>
<key>NSCameraUsageDescription</key>
<string>This app requires camera access to capture &amp; upload pictures.</string>
<key>NSFaceIDUsageDescription</key>
<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>
<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>
<array>
<string>remote-notification</string>
@ -68,8 +68,8 @@
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array>
<string>0000</string>
</array>
<array>
<string>0000</string>
</array>
</dict>
</plist>

@ -18,7 +18,8 @@ class APIError {
APIError(this.errorCode, this.errorMessage);
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage};
Map<String, dynamic> toJson() =>
{'errorCode': errorCode, 'errorMessage': errorMessage};
@override
String toString() {
@ -53,7 +54,8 @@ APIException _throwAPIException(Response response) {
return APIException(APIException.INTERNAL_SERVER_ERROR);
case 444:
var downloadUrl = response.headers["location"];
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
return APIException(APIException.UPGRADE_REQUIRED,
arguments: downloadUrl);
default:
return APIException(APIException.OTHER);
}
@ -66,8 +68,13 @@ class ApiClient {
factory ApiClient() => _instance;
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
Future<U> postJsonForObject<T, U>(
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'};
if (headers != null && headers.isNotEmpty) {
_headers.addAll(headers);
@ -77,7 +84,12 @@ class ApiClient {
var bodyJson = json.encode(jsonObject);
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 {
if (!kReleaseMode) {
logger.i("res: " + response.body);
@ -90,7 +102,8 @@ class ApiClient {
return factoryConstructor(jsonData);
} else {
APIError? apiError;
apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
apiError =
APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
throw APIException(APIException.BAD_REQUEST, error: apiError);
}
// } catch (ex) {
@ -103,7 +116,11 @@ class ApiClient {
}
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;
late Map<String, String> stringObj;
if (jsonObject != null) {
@ -117,13 +134,22 @@ class ApiClient {
if (isFormData) {
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 {
var _headers = <String, String>{};
if (token != null) {
@ -138,7 +164,9 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query;
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) {
return response;
@ -149,7 +177,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
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 {
throw APIException(APIException.OTHER, arguments: e);
}
@ -157,7 +189,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
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 {
throw APIException(APIException.OTHER, arguments: e);
}
@ -167,23 +203,39 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
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 {
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) {
headers = {'Content-Type': 'application/json'};
} else {
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 {
var _headers = <String, String>{};
if (token != null) {
@ -198,7 +250,8 @@ class ApiClient {
var queryString = new Uri(queryParameters: queryParameters).query;
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) {
return response;
@ -209,7 +262,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
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 {
throw APIException(APIException.OTHER, arguments: e);
}
@ -217,7 +274,11 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
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 {
throw APIException(APIException.OTHER, arguments: e);
}
@ -227,14 +288,19 @@ class ApiClient {
if (retryTimes > 0) {
print('will retry after 3 seconds...');
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 {
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;
@ -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/app_state/app_state.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_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
@ -37,6 +38,20 @@ class DashboardApiClient {
}, 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 {
String url = "${ApiConsts.cocRest}ITGFormsPendingTasks";
Map<String, dynamic> postParams = {};
@ -47,7 +62,8 @@ class DashboardApiClient {
}, url, postParams);
}
Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate) async {
Future<List<GetAccrualBalancesList>> getAccrualBalances(
String effectiveDate) async {
String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
postParams.addAll(AppState().postParamsJson);
@ -81,7 +97,10 @@ class DashboardApiClient {
//GET_MENU_ENTRIES
Future<GenericResponseModel?> getGetMenuEntries() async {
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);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -90,7 +109,13 @@ class DashboardApiClient {
}
//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";
var uuid = Uuid();
// Generate a v4 (random) id

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

@ -37,7 +37,7 @@ class MyAttendanceApiClient {
}, 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";
Map<String, dynamic> postParams = {
"P_SELECTED_RESP_ID": -999,
@ -53,7 +53,7 @@ class MyAttendanceApiClient {
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel? responseData = GenericResponseModel.fromJson(json);
return responseData.getValueSetValuesList!.first;
return responseData.getValueSetValuesList ?? [];
}, url, postParams);
}

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

@ -296,7 +296,39 @@ class WorkListApiClient {
"RequestType": requestType,
"TaskID": taskId,
"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);
return await ApiClient().postJsonForObject((json) {

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

@ -17,7 +17,7 @@ class CodegenLoader extends AssetLoader{
static const Map<String,dynamic> ar_SA = {
"mohemm": "Mohemm",
"english": "English",
"arabic": "Arabic",
"arabic": "عربي",
"login": "تسجيل الدخول",
"pleaseEnterLoginDetails": "الرجاء إدخال التفاصيل أدناه لتسجيل الدخول",
"username": "اسم المستخدم",
@ -27,6 +27,7 @@ class CodegenLoader extends AssetLoader{
"lastLoginDetails": "تفاصيل تسجيل الدخول الأخير:",
"verificationType": "نوع التحقق:",
"pleaseVerify": "ارجوك تحقق",
"pleaseVerifyForBio": "الرجاء التحقق من تسجيل الدخول باستخدام أحد هذه الخيارات",
"verifyThroughFace": "تحقق من خلال الوجه",
"verifyThroughFingerprint": "تحقق من خلال بصمة الإصبع",
"verifyThroughSMS": "تحقق من خلال الرسائل القصيرة",
@ -294,7 +295,7 @@ class CodegenLoader extends AssetLoader{
"enterNewInfo": " أدخل معلومات جديدة بسبب تغيير حقيقي في التفاصيل الحالية (على سبيل المثال بسبب تغيير في الحالة الاجتماعية",
"endDate": "تاريخ الانتهاء",
"removeThisMember": "هل انت متأكد تريد ازالة هذا العضو؟",
"updateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"wantUpdateThisMember ": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"addNewFamilyMember": "اضافة عضو جديد",
"addRow": "اضافة صف جديد",
"pleaseSelect": "الرجاء اختيار",
@ -420,8 +421,17 @@ class CodegenLoader extends AssetLoader{
"addFavoriteList": "هل تريد اضافة {name} لقائمة المفضله",
"feedbackUserExperience": "هذا للحصول على تعليقات حول تجربة المستخدم",
"rateUI": ".1 كيف تريد تقييم التطبيق",
"Submit Survey": "ارسال الاستبيان",
"submitSurvey": "ارسال الاستبيان",
"typeHere": "اكتب هنا",
"currentBalance": "الرصيد الحالي",
"currentLeaveBalance": "رصيد الاجازات الحالي",
"calculatedDays": "الايام المحسوبه",
"totalDays": "مجموع الأيام",
"usedBalance": "المستخدم",
"infants": "رضيع",
"child": "طفل",
"adult": "بالغ",
"updateMember": "هل انت متأكد تريد تحديث بيانات هذا العضو؟",
"profile": {
"reset_password": {
"label": "Reset Password",
@ -459,7 +469,7 @@ class CodegenLoader extends AssetLoader{
static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm",
"english": "English",
"arabic": "Arabic",
"arabic": "عربي",
"login": "Login",
"pleaseEnterLoginDetails": "Please enter the detail below to login",
"username": "Username",
@ -469,6 +479,7 @@ static const Map<String,dynamic> en_US = {
"lastLoginDetails": "Last Login Details:",
"verificationType": "Verification Type:",
"pleaseVerify": "Please Verify",
"pleaseVerifyForBio": "Please verify login with one of the following options",
"verifyThroughFace": "Verify Through Face",
"verifyThroughFingerprint": "Verify Through Fingerprint",
"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)",
"endDate": "*End Date",
"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",
"addRow": "Add new row",
"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",
"feedbackUserExperience": "This is to get the feedback about the user experience",
"rateUI": "1. How would you rate this UI?",
"Submit Survey": "Submit Survey",
"submitSurvey": "Submit Survey",
"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": {
"reset_password": {
"label": "Reset Password",

@ -280,7 +280,7 @@ abstract class LocaleKeys {
static const enterNewInfo = 'enterNewInfo';
static const endDate = 'endDate';
static const removeThisMember = 'removeThisMember';
static const updateThisMember = 'updateThisMember ';
static const wantUpdateThisMember = 'wantUpdateThisMember ';
static const addNewFamilyMember = 'addNewFamilyMember';
static const addRow = 'addRow';
static const pleaseSelect = 'pleaseSelect';
@ -410,6 +410,15 @@ abstract class LocaleKeys {
static const typeHere = 'typeHere';
static const info_detail = 'info_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_username = 'profile.reset_password.username';
static const profile_reset_password_password = 'profile.reset_password.password';

@ -10,7 +10,7 @@ class GetAccrualBalancesList {
});
double? accrualNetEntitlement;
int? accrualUsedEntitlement;
num? accrualUsedEntitlement; //Todo: Add function
dynamic accrualYearlyEntitlement;
String? accuralPlanName;
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? cREATIONDATE;
String? cURRENCYNAME;
int? cUSTOMDUTY;
int? dISCOUNTAMOUNT;
int? gROSSAMOUNT;
num? cUSTOMDUTY;
num? dISCOUNTAMOUNT;
num? gROSSAMOUNT;
String? lOCCUR;
int? lOCCURTOTPOAMT;
int? oTHERCHARGES;
num? lOCCURTOTPOAMT;
num? oTHERCHARGES;
String? pAYMENTTERMS;
String? pONUMBER;
String? pREPARER;
String? qUOTATIONDATE;
String? qUOTATIONNUMBER;
int? sALESTAX;
int? sHIPHANDLE;
num? sALESTAX;
num? sHIPHANDLE;
String? sHIPTOLOCATIONNAME;
int? tOTALPODISCOUNT;
int? tOTPOAMT;
num? tOTALPODISCOUNT;
num? tOTPOAMT;
String? tOTPOAMTWORD;
String? vENDORNAME;
String? vENDORSITECODE;

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

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

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

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

@ -1,10 +1,10 @@
class GetSummaryOfPaymentList {
int? tOTALDEDUCTIONSAMOUNT;
int? tOTALDEDUCTIONSPERCENTAGE;
int? tOTALEARNINGSAMOUNT;
int? tOTALEARNINGSPERCENTAGE;
int? tOTALPAYAMOUNT;
int? tOTALPAYPERCENTAGE;
num? tOTALDEDUCTIONSAMOUNT;
num? tOTALDEDUCTIONSPERCENTAGE;
num? tOTALEARNINGSAMOUNT;
num? tOTALEARNINGSPERCENTAGE;
num? tOTALPAYAMOUNT;
num? tOTALPAYPERCENTAGE;
GetSummaryOfPaymentList(
{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/menu_entries.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/offers_and_discounts/get_offers_list.dart';
@ -59,10 +60,13 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
isAttendanceTrackingLoading = false;
// isTimeRemainingInSeconds = calculateSeconds( "00:00:00");
if (attendanceTracking?.pSwipeIn != null) {
isTimeRemainingInSeconds = calculateSeconds(attendanceTracking!.pRemainingHours ?? "00:00:00");
int totalShiftTimeInSeconds = calculateSeconds(attendanceTracking!.pScheduledHours ?? "00:00:00");
isTimeRemainingInSeconds =
calculateSeconds(attendanceTracking!.pRemainingHours ?? "00:00:00");
int totalShiftTimeInSeconds =
calculateSeconds(attendanceTracking!.pScheduledHours ?? "00:00:00");
progress = (isTimeRemainingInSeconds / totalShiftTimeInSeconds);
endTime = DateTime.now().millisecondsSinceEpoch + Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
endTime = DateTime.now().millisecondsSinceEpoch +
Duration(seconds: isTimeRemainingInSeconds).inMilliseconds;
}
notifyListeners();
@ -72,6 +76,33 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
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 hour = int.parse(time.split(":")[0]);
int mints = int.parse(time.split(":")[1]);
@ -81,27 +112,36 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void update(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;
List<GetOpenNotificationsList>? getOpenNotificationsList;
MohemmITGPendingTaskResponseItem? cocCount;
int cocFinalCount = 0;
//Work List API's & Methods
Future fetchWorkListCounter(context, {bool showLoading = false}) async {
try {
if (showLoading) Utils.showLoading(context);
GenericResponseModel? genericResponseModel = await DashboardApiClient().getOpenNotifications();
GenericResponseModel? genericResponseModel =
await DashboardApiClient().getOpenNotifications();
isWorkListLoading = false;
getOpenNotificationsList = genericResponseModel?.getOpenNotificationsList;
workListCounter = genericResponseModel?.pOPENNTFNUMBER ?? 0;
itgFormsModel = await DashboardApiClient().getItgFormsPendingTask();
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);
notifyListeners();
} catch (ex) {
@ -116,9 +156,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Missing Siwpe API's & Methods
Future fetchMissingSwipe(context) async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getOpenMissingSwipes();
GenericResponseModel? genericResponseModel =
await DashboardApiClient().getOpenMissingSwipes();
isMissingSwipeLoading = false;
missingSwipeCounter = genericResponseModel!.getOpenMissingSwipesList!.pOpenMissingSwipes ?? 0;
missingSwipeCounter =
genericResponseModel!.getOpenMissingSwipesList!.pOpenMissingSwipes ??
0;
notifyListeners();
} catch (ex) {
isMissingSwipeLoading = false;
@ -131,10 +174,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Leave and Ticket Balance API's & Methods
Future fetchLeaveTicketBalance(context, DateTime date) async {
try {
accrualList = await DashboardApiClient().getAccrualBalances(DateFormat("MM/dd/yyyy").format(date));
accrualList = await DashboardApiClient()
.getAccrualBalances(DateFormat("MM/dd/yyyy").format(date));
isLeaveTicketBalanceLoading = false;
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();
} catch (ex) {
isLeaveTicketBalanceLoading = false;
@ -147,23 +192,36 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//List Menu API's & Methods
List<DrawerMenuItem> drawerMenuItemList = [
DrawerMenuItem("assets/images/drawer/my_profile.svg", LocaleKeys.myProfile.tr(), AppRoutes.profile),
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
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),
DrawerMenuItem("assets/images/drawer/my_profile.svg",
LocaleKeys.myProfile.tr(), AppRoutes.profile),
DrawerMenuItem("assets/images/drawer/performance_evaluation.svg",
LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation),
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 {
try {
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) {
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) {
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) {
logger.wtf(ex);
@ -174,12 +232,19 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Menu Entries API's & Methods
void fetchMenuEntries() async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getGetMenuEntries();
GenericResponseModel? genericResponseModel =
await DashboardApiClient().getGetMenuEntries();
getMenuEntriesList = genericResponseModel!.getMenuEntriesList;
homeMenus = parseMenus(getMenuEntriesList ?? []);
if (homeMenus!.isNotEmpty) {
homeMenus!.first.menuEntiesList.insert(0, GetMenuEntriesList(requestType: "MONTHLY_ATTENDANCE", prompt: LocaleKeys.monthlyAttendance.tr()));
homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(requestType: "VACATION_RULE", prompt: LocaleKeys.vacationRule.tr()));
homeMenus!.first.menuEntiesList.insert(
0,
GetMenuEntriesList(
requestType: "MONTHLY_ATTENDANCE",
prompt: LocaleKeys.monthlyAttendance.tr()));
homeMenus!.first.menuEntiesList.add(GetMenuEntriesList(
requestType: "VACATION_RULE",
prompt: LocaleKeys.vacationRule.tr()));
}
isServicesMenusLoading = false;
notifyListeners();
@ -207,7 +272,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
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()));
menus.add(Menus(
getMenuEntriesList[i],
getMenuEntriesList
.where((element) =>
getMenuEntriesList[i].menuName == element.parentMenuName)
.toList()));
}
}
return menus;

@ -1,8 +1,10 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.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/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:qr_flutter/qr_flutter.dart';
@ -70,7 +72,7 @@ class EmployeeDigitialIdDialog extends StatelessWidget {
width: 160,
height: 160,
),
DefaultButton("Cancel", () {
DefaultButton(LocaleKeys.close.tr(), () {
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/offers_shimmer_widget.dart';
import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class DashboardScreen extends StatefulWidget {
DashboardScreen({Key? key}) : super(key: key);
@ -37,12 +38,24 @@ class _DashboardScreenState extends State<DashboardScreen> {
late DashboardProviderModel data;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey();
final RefreshController _refreshController = RefreshController(initialRefresh: false);
int currentIndex = 0;
@override
void initState() {
super.initState();
data = Provider.of<DashboardProviderModel>(context, listen: false);
_onRefresh();
}
@override
void dispose() {
super.dispose();
}
void _onRefresh() async {
data.initProvider();
data.fetchListMenu();
data.fetchAttendanceTracking(context);
data.fetchWorkListCounter(context);
@ -50,11 +63,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries();
data.getCategoryOffersListAPI(context);
}
@override
void dispose() {
super.dispose();
_refreshController.refreshCompleted();
}
@override
@ -122,236 +131,243 @@ class _DashboardScreenState extends State<DashboardScreen> {
],
).paddingOnly(left: 21, right: 21, top: 48, bottom: 7),
Expanded(
child: SingleChildScrollView(
child: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color),
(AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true),
16.height,
Row(
children: [
Expanded(
child: AspectRatio(
aspectRatio: 159 / 159,
child: Consumer<DashboardProviderModel>(
builder: (context, model, child) {
return (model.isAttendanceTrackingLoading
? GetAttendanceTrackingShimmer()
: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
]),
),
child: Stack(
alignment: Alignment.center,
children: [
if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white),
if (model.isTimeRemainingInSeconds != 0)
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
9.height,
CountdownTimer(
endTime: model.endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
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(
child: SmartRefresher(
enablePullDown: true,
enablePullUp: false,
header: const MaterialClassicHeader(color: MyColors.gradiantEndColor,),
controller: _refreshController,
onRefresh: _onRefresh,
child: SingleChildScrollView(
child: Column(
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color),
(AppState().memberInformationList!.eMPLOYEENAME ?? "").toText24(isBold: true),
16.height,
Row(
children: [
Expanded(
child: AspectRatio(
aspectRatio: 159 / 159,
child: Consumer<DashboardProviderModel>(
builder: (context, model, child) {
return (model.isAttendanceTrackingLoading
? GetAttendanceTrackingShimmer()
: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(15),
gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
]),
),
child: Stack(
alignment: Alignment.center,
children: [
if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true),
if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white),
if (model.isTimeRemainingInSeconds != 0)
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
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),
9.height,
CountdownTimer(
endTime: model.endTime,
onEnd: null,
endWidget: "00:00:00".toText14(color: Colors.white, isBold: true),
textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold),
),
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),
),
LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white),
9.height,
ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(20),
),
child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"),
).onPress(() {
showMyBottomSheet(context, child: MarkAttendanceWidget(model));
}),
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: [
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);
},
))
.animatedSwither();
},
],
),
],
),
).onPress(
() {
Navigator.pushNamed(context, AppRoutes.todayAttendance);
},
))
.animatedSwither();
},
),
),
),
),
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: [
9.width,
Expanded(
child: Column(
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)),
],
),
],
),
child: MenusWidget(),
),
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),
),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
),
child: Hero(
tag: "ItemImage" + data.getOffersList[index].rowID!,
transitionOnUserGestures: true,
child: Image.network(
data.getOffersList[index].bannerImage!,
fit: BoxFit.contain,
),
),
),
),
],
).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(
child: Column(
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) {
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,
Expanded(
child: AppState().isArabic(context)
? data.getOffersList[index].titleAR!.toText12(isCenter: true, maxLine: 1)
: data.getOffersList[index].title!.toText12(isCenter: true, maxLine: 1),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
),
],
child: Hero(
tag: "ItemImage" + data.getOffersList[index].rowID!,
transitionOnUserGestures: true,
child: Image.network(
data.getOffersList[index].bannerImage!,
fit: BoxFit.contain,
),
),
),
),
),
);
},
separatorBuilder: (cxt, index) => 8.width,
itemCount: 6),
);
},
),
],
),
)
],
4.height,
Expanded(
child: AppState().isArabic(context)
? data.getOffersList[index].titleAR!.toText12(isCenter: true, maxLine: 1)
: 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),
unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28),
onTap: (int index) {
// currentIndex = index;
// setState(() {});
Navigator.pushNamed(context, AppRoutes.itemsForSale);
if (index == 1) {
Navigator.pushNamed(context, AppRoutes.mowadhafhi);
} 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/widgets/dialogs/dialogs.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class AppDrawer extends StatefulWidget {
@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/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: () {Navigator.pushNamed(context, AppRoutes.survey,);
],
@ -124,7 +124,7 @@ class _AppDrawerState extends State<AppDrawer> {
9.width,
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 {
Navigator.pop(context);
Future.delayed(const Duration(microseconds: 200), onPress);

@ -1,6 +1,7 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.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/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
@ -43,7 +44,11 @@ class MenusWidget extends StatelessWidget {
Expanded(
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(
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(
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(
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:flutter/material.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/extensions/int_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/ticket_request.svg",
"assets/images/ticket_request.svg",
"assets/images/dynamic_screens.svg",
"assets/images/dynamic_screens.svg",
"assets/images/dynamic_screens.svg",
"assets/images/dynamic_screens.svg"
"assets/images/ticket_request.svg",
"assets/images/ticket_request.svg",
"assets/images/ticket_request.svg",
"assets/images/ticket_request.svg"
];
return Consumer<DashboardProviderModel>(
@ -73,9 +74,13 @@ class ServicesWidget extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end,
children: [
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);
CalculateAbsenceDuration duration = await LeaveBalanceApiClient()
.calculateAbsenceDuration(selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, Utils.getMonthNamedFormat(startDateTime!), Utils.getMonthNamedFormat(endDateTime!), -999);
print(duration.toJson());
totalDays = duration.pABSENCEDAYS;
totalDays = duration.pABSENCEDAYS?.toInt();
Utils.hideLoading(context);
setState(() {});
} catch (ex) {
@ -205,7 +205,7 @@ class _AddLeaveBalanceScreenState extends State<AddLeaveBalanceScreen> {
),
12.height,
DynamicTextFieldWidget(
"Total Days",
LocaleKeys.totalDays.tr(),
totalDays?.toString() ?? "Calculated days",
isInputTypeNum: true,
isEnable: false,

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

@ -113,7 +113,7 @@ class _LoginScreenState extends State<LoginScreen> {
}
Utils.hideLoading(context);
if (_autoLogin) {
Navigator.pushNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo);
Navigator.pushReplacementNamed(context, AppRoutes.verifyLastLogin, arguments: loginInfo);
} else {
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/generic_response_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/dialogs/dialogs.dart';
// WhatsApp 4
// SMS 1
@ -56,15 +59,23 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
Widget build(BuildContext context) {
mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel;
String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!;
print("selectedFlag1: " + mobileLoginInfoListModel!.loginType.toString());
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
// leading: IconButton(
// icon: const Icon(Icons.arrow_back_ios, color: MyColors.darkIconColor),
// onPressed: () => Navigator.pop(context),
// ),
actions: [Center(child: "Employee Digital ID".toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {})), 21.width],
automaticallyImplyLeading: false,
title: (mobileLoginInfoListModel?.businessCardPrivilege ?? false)
? LocaleKeys.viewBusinessCard.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
showMDialog(context, child: BusinessCardDialog());
})
: null,
actions: [
Center(
child: LocaleKeys.employeeDigitalID.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() {
showMDialog(context, child: EmployeeDigitialIdDialog());
})),
21.width
],
),
body: Column(
children: [
@ -222,7 +233,6 @@ class _VerifyLastLoginScreenState extends State<VerifyLastLoginScreen> {
Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) {
bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint)));
print("$_title:$isDisable");
return InkWell(
onTap: isDisable
? null

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

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

@ -60,45 +60,49 @@ class _DynamicListViewScreenState extends State<DynamicListViewScreen> {
super.dispose();
}
late bool isTicketRequest;
@override
Widget build(BuildContext context) {
if (dynamicParams == null) {
dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams;
isTicketRequest = dynamicParams!.dynamicId == "HMG_TKT_NEW_EIT_SS";
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(
backgroundColor: Colors.white,
appBar: AppBarWidget(context, title: dynamicParams!.title),
body: ListView(
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)),
],
),
body: isTicketRequest ? dataWidget : dataWidget.center,
floatingActionButton: Container(
height: 54,
width: 54,

@ -1,5 +1,6 @@
import 'package:flutter/material.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/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart';
@ -39,7 +40,7 @@ class ServicesMenuListScreen extends StatelessWidget {
? Utils.getNoDataWidget(context)
: ListView.separated(
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].requestType == "BASIC_DETAILS") {
Navigator.pushNamed(context, AppRoutes.basicDetails);
@ -51,8 +52,10 @@ class ServicesMenuListScreen extends StatelessWidget {
Navigator.pushNamed(context, AppRoutes.familyMembers);
}
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!));
}),
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(
children: [
(title).toText16().expanded,
12.width,
SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
RotatedBox(
quarterTurns: AppState().isArabic(context) ? 2 : 4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor),
),
],
).objectContainerView();
}

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.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/generated/locale_keys.g.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/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/services_menu_list_screen.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
class CreateRequest extends StatefulWidget {
const CreateRequest ({Key? key}) : super(key: key);
const CreateRequest({Key? key}) : super(key: key);
@override
_CreateRequestState createState() => _CreateRequestState();
}
class _CreateRequestState extends State<CreateRequest> {
String searchEmpEmail ="";
String searchEmpName ="";
String searchEmpEmail = "";
String searchEmpName = "";
String searchEmpNo = "";
String? empId;
List<GetEmployeeSubordinatesList> getEmployeeSubordinatesList = [];
// late DashboardProviderModel data;
List<GetMenuEntriesList> getMenuEntriesList = [];
GetEmployeeSubordinatesList? getEmployeeSubordinates;
List<Menus>? homeMenus;
@override
void initState() {
super.initState();
// data.fetchMenuEntries();
employeeSubRequest();
}
@ -46,6 +46,7 @@ class _CreateRequestState extends State<CreateRequest> {
Utils.showLoading(context);
getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString());
getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER);
homeMenus = parseMenus(getMenuEntriesList);
Utils.hideLoading(context);
setState(() {});
} 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
Widget build(BuildContext context) {
getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList;
print(getMenuEntriesList.length);
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBarWidget(
context,
title: LocaleKeys.createRequest.tr(),
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: getMenuEntriesList.isEmpty
? Utils.getNoDataWidget(context)
: ListView.separated(
padding: const EdgeInsets.all(21),
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", getMenuEntriesList[index].prompt!, index).onPress(() {
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(getMenuEntriesList[index].prompt!, getMenuEntriesList[index].functionName!));
}),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getMenuEntriesList.length),
),
body: SizedBox(
width: double.infinity,
height: double.infinity,
child: homeMenus == null
? const SizedBox()
: (homeMenus!.isEmpty
? Utils.getNoDataWidget(context)
: ListView.separated(
padding: const EdgeInsets.all(21),
itemBuilder: (cxt, index) => itemView("assets/images/pdf.svg", homeMenus![index].menuEntry.prompt!, index).onPress(() {
handleOnPress(context, homeMenus![index]);
}),
separatorBuilder: (cxt, index) => 12.height,
itemCount: homeMenus!.length)),
),
);
}
Widget itemView(String icon, String title, index) {
return getMenuEntriesList[index].parentMenuName !=""? Row(
return Row(
children: [
(title).toText16().expanded, 12.width,
(title).toText16().expanded,
12.width,
SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
],
).objectContainerView() : SizedBox();
).objectContainerView();
}
}

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

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

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

@ -84,24 +84,8 @@ class _ContactDetailsState extends State<ContactDetails> {
if (getEmployeePhonesList.isNotEmpty)
Stack(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
menuEntriesPhone.updateButton == 'Y'
? IconButton(
icon: Icon(
Icons.edit_location_alt_outlined,
size: 20,
),
onPressed: () {
updatePhone();
},
)
: Container()
],
),
ListView.separated(
physics: NeverScrollableScrollPhysics(),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsets.zero,
itemBuilder: (cxt, index) => Column(
@ -113,38 +97,20 @@ class _ContactDetailsState extends State<ContactDetails> {
),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEmployeePhonesList.length),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: getEmployeePhonesList
// .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
// "${e.pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor),
// "${e.pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor),
// ]))
// .toList())
if (menuEntriesPhone.updateButton == 'Y')
Positioned(
top: 1,
right: 1,
child: const Icon(Icons.edit_location_alt_outlined, size: 20).onPress(updatePhone),
),
],
).objectContainerView(),
12.height,
if (getEmployeeAddressList.isNotEmpty)
Stack(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
menuEntriesAddress.updateButton == 'Y'
? IconButton(
icon: Icon(
Icons.edit_location_alt_outlined,
size: 20,
),
onPressed: () {
addUpdateAddress();
},
)
: Container()
],
),
ListView.separated(
physics: NeverScrollableScrollPhysics(),
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
padding: EdgeInsets.zero,
itemBuilder: (cxt, index) => Column(
@ -156,14 +122,12 @@ class _ContactDetailsState extends State<ContactDetails> {
),
separatorBuilder: (cxt, index) => 12.height,
itemCount: getEmployeeAddressList.length),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: getEmployeeAddressList
// .map((e) => Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
// "${e.sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor),
// "${e.sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor),
// ]))
// .toList())
if (menuEntriesAddress.updateButton == 'Y')
Positioned(
top: 1,
right: 1,
child: const Icon(Icons.edit_location_alt_outlined, size: 20).onPress(addUpdateAddress),
),
],
).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/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_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_countries_list_model.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/my_attendance/dynamic_screens/dynamic_listview_screen.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/dynamic_forms/dynamic_textfield_widget.dart';
@ -60,6 +55,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
String dESCFLEXCONTEXTCODE = "";
String countryCode = 'SA';
String effectiveDate = '';
@override
void 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)
.toJson())
.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);
getAddressDffStructureList![index].eSERVICESVS!.add(genericResponseModel);
if (genericResponseModel.isNotEmpty) getAddressDffStructureList![index].eSERVICESVS!.addAll(genericResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
Utils.hideLoading(context);
@ -325,8 +321,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenAddress> {
),
);
} else {
DateTime? picked =
await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != selectedDate) {
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/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/generated/locale_keys.g.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/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_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/submit_basic_details_transaction_model.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/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
@ -55,6 +52,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
DynamicProfileParams? dynamicParams;
String dESCFLEXCONTEXTCODE = "";
@override
void 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)
.toJson())
.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);
getBasicDetDffStructureList![index].eSERVICESVS!.add(genericResponseModel);
// getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? [];
//getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList();
if (genericResponseModel.isNotEmpty) getBasicDetDffStructureList![index].eSERVICESVS!.addAll(genericResponseModel);
Utils.hideLoading(context);
setState(() {});
} catch (ex) {
@ -336,8 +332,7 @@ class _DynamicInputScreenState extends State<DynamicInputScreenProfile> {
),
);
} else {
DateTime? picked =
await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
DateTime? picked = await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101));
if (picked != null && picked != selectedDate) {
time = picked;
}

@ -98,7 +98,7 @@ class _FamilyMembersState extends State<FamilyMembers> {
recognizer: TapGestureRecognizer()
..onTap = () async {
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(
LocaleKeys.confirm.tr(),
),
content: Text(LocaleKeys.updateThisMember.tr()),
content: Text(LocaleKeys.updateMember.tr()),
actions: [
cancelButton,
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/utils.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/generated/locale_keys.g.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> {
List<GetPhoneNumberTypesModel> getPhoneNumberTypesList = [];
SubmitPhonesTransactionList submitPhoneNumbers = SubmitPhonesTransactionList();
@override
void initState() {
super.initState();
@ -46,129 +49,66 @@ class _PhoneNumbersState extends State<PhoneNumbers> {
title: LocaleKeys.profile_contactDetails.tr(),
),
backgroundColor: MyColors.backgroundColor,
bottomSheet: footer(),
body: SingleChildScrollView(
child: Column(
children: [
Container(
width: double.infinity,
margin: EdgeInsets.only(left: 25, right: 25, top: 25),
padding: EdgeInsets.all(20),
// height: 400,
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Color.fromARGB(255, 209, 207, 207))),
child: InkWell(
child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
Icon(
Icons.add,
color: Color(0xff259CB8),
),
Text(
LocaleKeys.addRow.tr(),
style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold),
)
]),
onTap: () {
addNewRow();
},
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: widget.getEmployeePhonesList
.map((e) => e.aCTION != 'DELETE_ROW'
? Container(
width: double.infinity,
margin: EdgeInsets.only(
top: 20,
left: 26,
right: 26,
),
padding: EdgeInsets.only(left: 14, right: 14, top: 15, bottom: 15),
// height: 400,
decoration: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 5,
blurRadius: 26,
offset: Offset(0, 3),
),
],
color: Colors.white,
borderRadius: BorderRadius.circular(10.0),
),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
PopupMenuButton(
child: DynamicTextFieldWidget(
LocaleKeys.pleaseSelect.tr(),
e.pHONETYPEMEANING ?? "",
isEnable: false,
isPopup: true,
).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),
body: Column(
children: [
ListView(
physics: const BouncingScrollPhysics(),
padding: const EdgeInsets.all(21),
children: [
DefaultButton("+ ${LocaleKeys.addRow.tr()}", () {
widget.getEmployeePhonesList.add(GetEmployeePhonesList(aCTION: 'NEW_ROW'));
setState(() {});
}),
12.height,
ListView.separated(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (cxt, index) {
var element = widget.getEmployeePhonesList[index];
return element.aCTION != 'DELETE_ROW'
? Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
PopupMenuButton(
child: DynamicTextFieldWidget(
LocaleKeys.selectTypeT.tr(),
element.pHONETYPEMEANING ?? LocaleKeys.pleaseSelect.tr(),
isEnable: false,
isPopup: true,
).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) {
element.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING;
element.pHONETYPE = getPhoneNumberTypesList[index].cODE;
setState(() {});
}),
DynamicTextFieldWidget(
"Value",
element.pHONENUMBER ?? "",
isReadOnly: false,
onChange: (text) {
element.pHONENUMBER = text;
},
).paddingOnly(bottom: 12),
Row(mainAxisAlignment: MainAxisAlignment.end, children: [
Icon(Icons.delete, color: MyColors.redColor, size: 18),
LocaleKeys.delete.tr().toText14(color: MyColors.redColor),
]).onPress(() {
element.aCTION = 'DELETE_ROW';
setState(() {});
}),
]).objectContainerView().paddingOnly(bottom: 12)
: Container();
},
separatorBuilder: (cxt, index) => 0.height,
itemCount: widget.getEmployeePhonesList.length)
],
).expanded,
DefaultButton(LocaleKeys.update.tr(), () async {
updatePhone();
}).insideContainer
],
),
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);
setUpdateStatus();
submitPhoneNumbers = await ProfileApiClient().submitPhoneNumbers(widget.getEmployeePhonesList);
Utils.hideLoading(context);
Navigator.pushNamed(context, AppRoutes.requestSubmitScreen,
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,
SimpleButton(LocaleKeys.add.tr(), () {
ImageOptions.showImageOptionsNew(context, (String image, File file) {
// setState(() {
// images.add(image);
// });
setState(() {
images.add(image);
Navigator.of(context).pop();
});
});
}, fontSize: 14),
],
@ -243,41 +244,43 @@ class _AddItemDetailsFragmentState extends State<AddItemDetailsFragment> {
Future<void> getAdDetails() async {
// todo need to change this method later , its not a good approach to do it like this.
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"];
itemDescription = body["itemDescription"];
selectedItemCondition = body["itemCondition"].toString().toLowerCase();
selectedRegionAd.regionID = body["selectedRegion"]["regionID"];
selectedRegionAd.regionName = body["selectedRegion"]["regionName"];
selectedRegion = selectedRegionAd;
itemPrice = body["itemPrice"];
selectedSaleCategoryAd.categoryID = body["selectedSaleCategory"]["categoryID"];
selectedSaleCategoryAd.title = body["selectedSaleCategory"]["title"];
if (body["itemPhotos"].length != 0) {
images.add(body["itemPhotos"][0]);
}
ItemReviewModel itemReviewModel =
ItemReviewModel(body["itemTitle"], body["itemDescription"], body["itemCondition"].toString().toLowerCase(), selectedRegionAd, body["itemPrice"], images, selectedSaleCategoryAd);
itemTitle = body["itemTitle"];
itemDescription = body["itemDescription"];
selectedItemCondition = body["itemCondition"].toString().toLowerCase();
selectedRegionAd.regionID = body["selectedRegion"]["regionID"];
selectedRegionAd.regionName = body["selectedRegion"]["regionName"];
selectedRegion = selectedRegionAd;
itemPrice = body["itemPrice"];
selectedSaleCategoryAd.categoryID = body["selectedSaleCategory"]["categoryID"];
selectedSaleCategoryAd.title = body["selectedSaleCategory"]["title"];
if (body["itemPhotos"].length != 0) {
images.add(body["itemPhotos"][0]);
}
ItemReviewModel itemReviewModel =
ItemReviewModel(body["itemTitle"], body["itemDescription"], body["itemCondition"].toString().toLowerCase(), selectedRegionAd, body["itemPrice"], images, selectedSaleCategoryAd);
AddItemDetailsFragment.itemReviewModel = itemReviewModel;
SelectCategoryFragment.selectedSaleCategory = selectedSaleCategoryAd;
AddItemDetailsFragment.itemReviewModel = itemReviewModel;
SelectCategoryFragment.selectedSaleCategory = selectedSaleCategoryAd;
}
}
void getRegions() async {
try {
// try {
Utils.showLoading(context);
getRegionsList = await ItemsForSaleApiClient().getRegions();
await getAdDetails();
Utils.hideLoading(context);
setState(() {});
} catch (ex) {
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
// } catch (ex) {
// Utils.hideLoading(context);
// Utils.handleException(ex, context, null);
// }
}
}

@ -25,6 +25,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
List<GetSaleCategoriesList> getSaleCategoriesList = [];
List<GetItemsForSaleList> getItemsForSaleList = [];
List<GetItemsForSaleList> _foundItemsForSaleList = [];
ScrollController gridScrollController = ScrollController();
int currentPageNo = 1;
@ -61,20 +62,10 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
isInputTypeNum: false,
isReadOnly: false,
onChange: (String value) {
// _runFilter(value);
_runFilter(value);
},
).paddingOnly(left: 21, right: 21, top: 21),
Row(
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),
LocaleKeys.browseCategories.tr().toText17().paddingOnly(left: 21, right: 21, top: 21),
SizedBox(
height: 105.0,
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> itemsList = [];
getItemsForSaleList.forEach((element) {
_foundItemsForSaleList.forEach((element) {
itemsList.add(getItemCard(element));
});
@ -167,7 +170,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
),
10.height,
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,
getItemsForSaleList.status!.toText14(color: getItemsForSaleList.status == 'Approved' ? MyColors.greenColor : MyColors.yellowColor),
Row(
@ -200,6 +203,7 @@ class _ItemsForSaleFragmentState extends State<ItemsForSaleFragment> {
getItemsForSaleListLocal.clear();
getItemsForSaleListLocal = await ItemsForSaleApiClient().getItemsForSale(itgPageNo, itgCategoryID);
getItemsForSaleList.addAll(getItemsForSaleListLocal);
_foundItemsForSaleList = getItemsForSaleList;
Utils.hideLoading(context);
setState(() {});
} catch (ex) {

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

@ -25,6 +25,7 @@ class OffersAndDiscountsHome extends StatefulWidget {
class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
List<GetCategoriesList> getCategoriesList = [];
List<OffersListModel> getOffersList = [];
List<OffersListModel> _foundOffersList = [];
int currentCategoryID = 0;
@ -54,18 +55,10 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
isInputTypeNum: false,
isReadOnly: false,
onChange: (String value) {
// _runFilter(value);
_runFilter(value);
},
).paddingOnly(left: 21, right: 21, top: 21),
Row(
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),
LocaleKeys.browseCategories.tr().toText17().paddingOnly(left: 21, right: 21, top: 21),
SizedBox(
height: 110.0,
child: getCategoriesList.isNotEmpty
@ -81,6 +74,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
onTap: () {
setState(() {
currentCategoryID = getCategoriesList[index].id!;
getCategoryOffersListAPI();
// getItemsForSaleList.clear();
// currentPageNo = 1;
// getItemsForSale(currentPageNo, currentCategoryID);
@ -146,7 +140,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
List<Widget> getItemsForSaleWidgets() {
List<Widget> itemsList = [];
for (var element in getOffersList) {
for (var element in _foundOffersList) {
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) {
List<OffersListModel> getOffersDetailList = [];
getOffersDetailList.clear();
@ -258,6 +264,7 @@ class _OffersAndDiscountsHomeState extends State<OffersAndDiscountsHome> {
try {
Utils.showLoading(context);
getOffersList = await OffersAndDiscountsApiClient().getOffersList(currentCategoryID, 100);
_foundOffersList = getOffersList;
Utils.hideLoading(context);
setState(() {});
} catch (ex) {

@ -45,7 +45,8 @@ class _PendingTransactionsState extends State<PendingTransactions> {
),
body: Column(
children: [
Column(
ListView(
padding: const EdgeInsets.all(21),
children: [
PopupMenuButton(
child: DynamicTextFieldWidget(
@ -86,7 +87,7 @@ class _PendingTransactionsState extends State<PendingTransactions> {
},
)
],
).objectContainerView().expanded,
).expanded,
DefaultButton(
LocaleKeys.submit.tr(),
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/widget_extensions.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/itg_request_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/widgets/app_bar_widget.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 {
ItgDetailScreen({Key? key}) : super(key: key);
@ -58,12 +56,11 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
void getItgData() async {
try {
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 ?? [];
if (allowedActionList.isNotEmpty) {
isCloseAvailable = allowedActionList.any((element) => element.action == "CLOSE");
isApproveAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Approve");
// isAnswerAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Answer");
isRejectAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Reject");
}
Utils.hideLoading(context);
@ -341,34 +338,39 @@ class _ItgDetailScreenState extends State<ItgDetailScreen> {
void performAction(String actionMode) {
showDialog(
context: context,
builder: (cxt) => AcceptRejectInputDialog(
message: LocaleKeys.requestedItems.tr(),
// notificationGetRespond: notificationNoteInput,
builder: (cxt) => ITGCommentsDialog(
message: LocaleKeys.writeComment.tr(),
onTap: (note) {
Map<String, dynamic> payload = {
"P_ACTION_MODE": actionMode,
"P_APPROVER_INDEX": null,
"P_COMMENTS": "",
"P_FORWARD_TO_USER_NAME": "",
// "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID!,
"RespondAttributeList": [
// if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note}
],
};
performNotificationAction(payload);
if (actionMode == "APPROVED") {
performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
} else {
performRejectAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note);
}
},
),
);
}
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 {
Utils.showLoading(context);
GenericResponseModel model = await WorkListApiClient().postNotificationActions(payload);
ITGRequest? itgRequest = await WorkListApiClient().approveITGRequest(requestType, taskId, itemId, employeeNumber, comments);
Utils.hideLoading(context);
Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr());
Navigator.pop(context, true);
Navigator.pop(context, "delegate_reload");
} catch (ex) {
Utils.hideLoading(context);
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/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
class WorkListScreen extends StatefulWidget {
WorkListScreen({Key? key}) : super(key: key);
@ -32,19 +33,70 @@ class WorkListScreen extends StatefulWidget {
class _WorkListScreenState extends State<WorkListScreen> {
List<WorkListItemTypeModelData> workListItemTypes = [
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(
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(
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(
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(
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(
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(
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;
@ -54,6 +106,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
late DashboardProviderModel providerData;
final RefreshController _refreshController = RefreshController(initialRefresh: false);
@override
void initState() {
super.initState();
@ -67,8 +121,13 @@ class _WorkListScreenState extends State<WorkListScreen> {
workListItemTypes.forEach((workListElement) {
if (workListElement.key == "ITG") {
workListElement.value = providerData.itgFormsModel?.totalCount ?? 0;
} else if (workListElement.key == "COC") {
workListElement.value = providerData.cocFinalCount;
} 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) {
workListElement.value = tempList.first.openNtfNumber ?? 0;
}
@ -87,18 +146,26 @@ class _WorkListScreenState extends State<WorkListScreen> {
List<RequestDetails> requestAllList = [];
for (int i = 0; i < (itgFormsModel?.requestType!.length ?? 0); i++) {
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;
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) {
itgRequestTypeIndex = 0;
}
} else {
itgRequestTypeIndex = null;
workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key);
workList = await WorkListApiClient()
.getWorkList(pageNumber, workListItemTypes[workListItemIndex].key);
AppState().setWorkList = workList;
}
Utils.hideLoading(context);
@ -109,6 +176,11 @@ class _WorkListScreenState extends State<WorkListScreen> {
}
}
void _onRefresh() async {
getWorkList();
_refreshController.refreshCompleted();
}
@override
void dispose() {
super.dispose();
@ -129,26 +201,33 @@ class _WorkListScreenState extends State<WorkListScreen> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
height: 1,
color: MyColors.lightGreyEFColor,
),
Container(width: double.infinity, height: 1, color: MyColors.lightGreyEFColor),
SizedBox(
height: 40,
child: ListView.separated(
itemBuilder: (context, index) {
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,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(6), 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),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6),
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(() {
if (workListItemIndex != index) {
if (workListItemIndex != index &&
!workListItemTypes[index].disable) {
workListItemIndex = index;
if (workListItemTypes[index].value == 0) {
workList = [];
itgRequestTypeIndex = null;
} else {
workList = null;
}
@ -167,71 +246,87 @@ class _WorkListScreenState extends State<WorkListScreen> {
),
).paddingOnly(top: 21, bottom: 21),
workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21),
if (itgRequestTypeIndex != null)
SizedBox(
height: 40,
child: ListView.separated(
itemBuilder: (context, 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) => 8.width,
shrinkWrap: true,
itemCount: itgFormsModel?.requestType?.length ?? 0,
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.only(left: 21, right: 21),
SmartRefresher(
enablePullDown: true,
enablePullUp: false,
header: const MaterialClassicHeader(
color: MyColors.gradiantEndColor,
),
).paddingOnly(top: 16, bottom: 16),
itgRequestTypeIndex != null
? Expanded(
child: ListView.separated(
physics: BouncingScrollPhysics(),
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),
),
)
: Expanded(
child: workList != null
? ((workList!).isEmpty
? LocaleKeys.noHistoryAvailable.tr().toText16().center
: ListView.separated(
physics: const BouncingScrollPhysics(),
controller: _refreshController,
onRefresh: _onRefresh,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: itgRequestTypeIndex != null
? Column(
children: [
SizedBox(
height: 40,
child: ListView.separated(
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,
itemCount: workList?.length ?? 0,
padding: const EdgeInsets.all(21),
))
: const SizedBox(),
),
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),
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(
onTap: () async {
AppState().setItgWorkListIndex = index;
var shouldReloadData = await Navigator.pushNamed(context, AppRoutes.itgDetail);
var shouldReloadData =
await Navigator.pushNamed(context, AppRoutes.itgDetail);
if (shouldReloadData != null) {
if (shouldReloadData.toString() == "delegate_reload") {
providerData.itgFormsModel!.totalCount =
providerData.itgFormsModel!.totalCount! - 1;
calculateCounter();
getWorkList();
}
@ -255,7 +350,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
},
child: Container(
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(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
@ -274,11 +370,20 @@ class _WorkListScreenState extends State<WorkListScreen> {
Container(
decoration: BoxDecoration(
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(
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),
),
8.width,
@ -292,10 +397,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
Row(
children: [
DateUtil.formatDateToDate(DateUtil.convertStringToDate(requestDetails.modifiedDate!), false).toText10(color: MyColors.lightTextColor).expanded,
SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("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(
onTap: () async {
AppState().setWorkListIndex = 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.toString() == "delegate_reload") {
calculateCounter();
@ -337,7 +442,8 @@ class _WorkListScreenState extends State<WorkListScreen> {
},
child: Container(
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(
color: Colors.white,
borderRadius: BorderRadius.circular(10),
@ -356,11 +462,20 @@ class _WorkListScreenState extends State<WorkListScreen> {
Container(
decoration: BoxDecoration(
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(
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),
),
8.width,
@ -374,10 +489,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
Row(
children: [
DateUtil.formatDateToDate(DateUtil.convertSimpleStringDateToDate(workData.bEGINDATE!), false).toText10(color: MyColors.lightTextColor).expanded,
SvgPicture.asset(
"assets/images/arrow_next.svg",
color: MyColors.darkIconColor,
)
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkIconColor)),
],
),
],

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

@ -115,9 +115,15 @@ class ActionsFragment extends StatelessWidget {
if (code == "SUBMIT") {
return const Color(0xff2E303A);
} 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") {
return const Color(0xff1FA269);
} else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") {
return const Color(0xff1FA269);
} else if (code == "REQUEST_INFO") {
return const Color(0xff2E303A);
} else {

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

@ -1,4 +1,3 @@
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.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/utils.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/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/button/default_button.dart';
class WorklistSettings extends StatefulWidget {
class WorklistSettings extends StatefulWidget {
const WorklistSettings({Key? key}) : super(key: key);
@override
@ -26,7 +26,6 @@ class _WorklistSettingsState extends State<WorklistSettings> {
List<GetUserItemTypesList> getUserItemTypesList = [];
UpdateUserItemTypesList? updateUserItemTypesList;
void initState() {
super.initState();
userItemTypesList();
@ -47,10 +46,9 @@ class _WorklistSettingsState extends State<WorklistSettings> {
void updateUserItem() async {
try {
Utils.showLoading(context);
List<Map<String, dynamic>> itemList=[];
List<Map<String, dynamic>> itemList = [];
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);
Utils.hideLoading(context);
@ -64,115 +62,92 @@ class _WorklistSettingsState extends State<WorklistSettings> {
@override
Widget build(BuildContext context) {
return Scaffold(backgroundColor: Colors.white,
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBarWidget(
context,
title: LocaleKeys.worklistSettings.tr(),
),
body:ListView(
body: Column(
children: [
Expanded(
child: Container(
margin: const EdgeInsets.only(top: 21, left: 21, right: 21),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
ListView(
padding: const EdgeInsets.only(top: 21, left: 21, right: 21),
children: [
LocaleKeys.TurnNotificationsFor.tr().toText22(color: MyColors.blackColor),
16.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: LocaleKeys.TurnNotificationsFor.tr().toText22(color: MyColors.blackColor),
).paddingOnly(top: 10, bottom: 50),
LocaleKeys.itemType.tr().toText14(color: MyColors.blackColor),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
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,),
]);
}
),
),
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: ["FYA".tr().toText14(color: MyColors.blackColor), 30.width, "FYI".tr().toText14(color: MyColors.blackColor), 30.width],
)
],
),
),
),
DefaultButton(
LocaleKeys.save.tr(), () async {
const 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,
),
]);
}),
),
],
).expanded,
DefaultButton(LocaleKeys.save.tr(), () async {
updateUserItem();
}).insideContainer,
],
)
);
));
}
Widget customSwitch(GetUserItemTypesList list){
return Padding(
padding: const EdgeInsets.only(top: 21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(list.iTEMTYPE.toString(), style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: MyColors.blackColor
),),
const Spacer(),
Row(
children: [
CupertinoSwitch(
trackColor: Colors.grey,
activeColor: MyColors.gradiantEndColor,
value: list?.fYAENABLEDFALG =='Y' ?true : false,
onChanged: (value){
setState(() {
list?.fYAENABLEDFALG = value == true ? 'Y': 'N';
});
}
),
CupertinoSwitch(
trackColor: Colors.grey,
activeColor: MyColors.gradiantEndColor,
value: list?.fYIENABLEDFLAG =='Y' ?true : false,
onChanged: (value){
setState(() {
// list.isFYI = value;
list?.fYIENABLEDFLAG = value ==true ? 'Y': 'N';
});
}
),
],
)
],
),
);
Widget customSwitch(GetUserItemTypesList list) {
return Padding(
padding: const EdgeInsets.only(top: 21),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
list.iTEMTYPE.toString(),
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.blackColor),
),
const Spacer(),
Row(
children: [
CupertinoSwitch(
trackColor: MyColors.grey57Color,
activeColor: MyColors.textMixColor,
value: list?.fYAENABLEDFALG == 'Y' ? true : false,
onChanged: (value) {
setState(() {
list?.fYAENABLEDFALG = value == true ? 'Y' : 'N';
});
}),
CupertinoSwitch(
trackColor: MyColors.grey57Color,
activeColor: MyColors.textMixColor,
value: list?.fYIENABLEDFLAG == 'Y' ? true : false,
onChanged: (value) {
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/string_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/provider/dashboard_provider_model.dart';
import 'package:pie_chart/pie_chart.dart';
@ -64,14 +65,14 @@ class _BalancesDashboardWidgetState extends State<BalancesDashboardWidget> {
if (widget.isLeaveBalance) {
leaveBalanceAccrual = accrualList[0];
chartModelList = [
PieChartModel("Current Balance", leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Used", leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
PieChartModel(LocaleKeys.currentBalance.tr(), leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel(LocaleKeys.usedBalance.tr(), leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
];
} else {
chartModelList = [
PieChartModel("Adult", accrualList[1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Child", accrualList[2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
PieChartModel("infants", accrualList[3].accrualNetEntitlement?.toDouble() ?? 0, MyColors.pinkColor, titleAppend: ""),
PieChartModel(LocaleKeys.adult.tr(), accrualList[1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel(LocaleKeys.child.tr(), accrualList[2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, 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) {
leaveBalanceAccrual = Provider.of<DashboardProviderModel>(context, listen: false).leaveBalanceAccrual;
chartModelList = [
PieChartModel("Current Balance", leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Used", leaveBalanceAccrual?.accrualUsedEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
PieChartModel(LocaleKeys.currentBalance.tr(), leaveBalanceAccrual?.accrualNetEntitlement ?? 0, MyColors.textMixColor, 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 ?? [];
if (ticketBalanceAccrualList!.isNotEmpty) {
chartModelList = [
PieChartModel("Adult", ticketBalanceAccrualList![1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel("Child", ticketBalanceAccrualList![2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, titleAppend: ""),
PieChartModel("infants", ticketBalanceAccrualList![3].accrualNetEntitlement?.toDouble() ?? 0, MyColors.pinkColor, titleAppend: ""),
PieChartModel(LocaleKeys.adult.tr(), ticketBalanceAccrualList![1].accrualNetEntitlement ?? 0, MyColors.textMixColor, titleAppend: ""),
PieChartModel(LocaleKeys.child.tr(), ticketBalanceAccrualList![2].accrualNetEntitlement?.toDouble() ?? 0, MyColors.backgroundBlackColor, 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),
shrinkWrap: true,
children: [
itemView("open_camera.svg", "Open\nCamera"),
itemView("gallery.svg", "Upload from\nGallery"),
itemView("files.svg", "Upload from\nFiles"),
itemView("open_camera.svg", "Open\nCamera", onCameraTap),
itemView("gallery.svg", "Upload from\nGallery", onGalleryTap),
itemView("files.svg", "Upload from\nFiles", onFilesTap),
],
)
],
@ -36,19 +36,22 @@ class AttachmentOptions extends StatelessWidget {
);
}
Widget itemView(String icon, String title) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset("assets/images/$icon"),
title.toText11(isBold: true),
],
).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView(
disablePadding: true,
radius: 10,
color: MyColors.greyF7Color.withOpacity(.48),
borderColor: MyColors.lightGreyE5Color.withOpacity(.48),
);
Widget itemView(String icon, String title, VoidCallback onTap) {
return InkWell(
onTap: onTap,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
SvgPicture.asset("assets/images/$icon"),
title.toText11(isBold: true),
],
).paddingOnly(left: 13, right: 13, top: 16, bottom: 12).expanded.objectContainerBorderView(
disablePadding: true,
radius: 10,
color: MyColors.greyF7Color.withOpacity(.48),
borderColor: MyColors.lightGreyE5Color.withOpacity(.48),
),
);
}
}

@ -66,6 +66,7 @@ class AcceptRejectInputDialog extends StatelessWidget {
notificationGetRespond!.attributeDisplayName!,
TextEditingController(),
isBackgroundEnable: true,
isInputTypeNum: notificationGetRespond!.attributeType == "number",
lines: 3,
onChange: (String 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,
child: AttachmentOptions(
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 {
FilePickerResult? result = await FilePicker.platform.pickFiles();
},

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

Loading…
Cancel
Save