From f06238a93fdac1feee2c21d1a967136e405e973e Mon Sep 17 00:00:00 2001 From: devmirza121 Date: Wed, 2 Nov 2022 11:22:27 +0300 Subject: [PATCH 01/23] OTP dialog new design --- assets/icons/ic_alarm.png | Bin 0 -> 875 bytes assets/langs/ar-SA.json | 6 +- assets/langs/en-US.json | 6 +- lib/classes/colors.dart | 1 + lib/dialogs/otp_dialog.dart | 117 +++++++++------ lib/generated/codegen_loader.g.dart | 12 +- lib/generated/locale_keys.g.dart | 4 + lib/ui/login/forgot_password_screen.dart | 5 +- lib/ui/login/verify_last_login_screen.dart | 158 ++++++--------------- lib/ui/login/verify_login_screen.dart | 16 +-- 10 files changed, 153 insertions(+), 172 deletions(-) create mode 100644 assets/icons/ic_alarm.png diff --git a/assets/icons/ic_alarm.png b/assets/icons/ic_alarm.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc71e7f23b3ba503f7432b873fc044249d98564 GIT binary patch literal 875 zcmV-x1C;!UP)nd8+uPmmo0$XWffoW{ zX5RO^+57fp7b1~JBoc}IuXF@lyB8R!{rw&&hqL0BeZV823M|%C1s(!>0{Zg8NnoC( z;Qwk4I1$X9WA+0TnuoXg0}KZ8=!|aQHLb&2O#!QeICaE%(ucRY5X7ki)&t+kUVtCK z#sGfRxkdKyR<{HARb>b1zWAD{3hegoT9FCzhqrp--L(=&kcYQA>e;)PZr~Mq1$YPa zcugSWEPCOs&UsBBU@b6L7ukPNEb1W<~lIn=F<5}HE+%tS1@b!0r;pm-j zp+mOP16Sb>C>yN+_kjDzj?NoN{n=s{vbNVqhwJ7aR-XHL&9fS(l?_feSfix8#wo4v zy}*pJxiZT?p#tzzd5vjcjYa{kD;u*K#oP>a0#_ZaA^x4m4{)eM4H?vAxV0I81W4R09%7TO?4RxJRRq~R?GfoE+HDy^Q@ zJhvq4>+=1WmZI__!vST?>GEu7BauiX5{X3GpTAzciiy*UBJThI002ovPDHLkV1h_x Bj9dT! literal 0 HcmV?d00001 diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index dcd03b5..27eccc8 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -493,6 +493,10 @@ "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", "fingersCrossed": "تشابك الاصابع!!!", "congrats": "مبروك !!!", - "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح." + "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.", + "otp": "OTP", + "verification": "تَحَقّق", + "resend": "إعادة إرسال", + "codeExpire": "انتهت صلاحية رمز التحقق" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 503302b..64a7fed 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -493,5 +493,9 @@ "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "fingersCrossed": "Fingers Crossed!!!", "congrats": "Congratulations!!!", - "allQuestionsCorrect": "You have answered all questions correct" + "allQuestionsCorrect": "You have answered all questions correct", + "otp": "OTP", + "verification": "Verification", + "resend": "Resend", + "codeExpire": "The verification code has been expired" } \ No newline at end of file diff --git a/lib/classes/colors.dart b/lib/classes/colors.dart index e670bbc..ad91de7 100644 --- a/lib/classes/colors.dart +++ b/lib/classes/colors.dart @@ -29,6 +29,7 @@ class MyColors { static const Color darkWhiteColor = Color(0xffE0E0E0); static const Color redColor = Color(0xffD02127); static const Color pinkColor = Color(0xffEBA9A9); + static const Color pinkDarkColor = Color(0xffe3797d); static const Color yellowColor = Color(0xffF4E31C); static const Color orange = Color(0xFFCC9B14); static const Color yellowFavColor = Color(0xffEAC321); diff --git a/lib/dialogs/otp_dialog.dart b/lib/dialogs/otp_dialog.dart index 23c7c67..3952e70 100644 --- a/lib/dialogs/otp_dialog.dart +++ b/lib/dialogs/otp_dialog.dart @@ -7,7 +7,9 @@ import 'package:mohem_flutter_app/classes/colors.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:mohem_flutter_app/widgets/otp_widget.dart'; +import 'package:sizer/sizer.dart'; class OtpDialog { final int type; @@ -15,6 +17,7 @@ class OtpDialog { final Function(String) onSuccess; final Function onFailure; final BuildContext context; + final Function onResendCode; int remainingTime = 120; @@ -24,13 +27,7 @@ class OtpDialog { static bool? _loading; - OtpDialog( - this.context, - this.type, - this.mobileNo, - this.onSuccess, - this.onFailure, - ); + OtpDialog(this.context, this.type, this.mobileNo, this.onSuccess, this.onFailure, {required this.onResendCode}); GlobalKey? verifyAccountForm = GlobalKey(); @@ -69,7 +66,7 @@ class OtpDialog { // projectProvider = Provider.of(context); return Dialog( backgroundColor: Colors.white, - shape: const RoundedRectangleBorder(), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), insetPadding: const EdgeInsets.only(left: 21, right: 21), child: StatefulBuilder(builder: (context, setState) { if (displayTime == '') { @@ -77,37 +74,26 @@ class OtpDialog { } return Container( - padding: EdgeInsets.only(left: 21, right: 18, top: 39, bottom: 59), + padding: EdgeInsets.all(21), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - SvgPicture.asset( - type == 1 - ? "assets/images/login/verify_sms.svg" - : type == 2 - ? "assets/images/login/verify_whatsapp.svg" - : type == 3 - ? "assets/images/login/verify_face.svg" - : 'assets/images/login/verify_thumb.svg', - height: 50, - width: 50, - ), - IconButton( - padding: EdgeInsets.zero, - icon: const Icon(Icons.close), - constraints: const BoxConstraints(), - onPressed: () { - stopTimer = true; - onFailure(); - }) - ], + SvgPicture.asset( + type == 1 + ? "assets/images/login/verify_sms.svg" + : type == 2 + ? "assets/images/login/verify_whatsapp.svg" + : type == 3 + ? "assets/images/login/verify_face.svg" + : 'assets/images/login/verify_thumb.svg', + height: 50, + width: 50, ), - 22.height, + 12.height, + LocaleKeys.otp.tr().toText14(), + LocaleKeys.verification.tr().toText24(isBold: true), + 6.height, (LocaleKeys.pleaseEnterTheVerificationCodeSentTo.tr() + ' xxxxxxxx' + mobileNo.toString().substring(mobileNo.toString().length - 3)).toText16(), 18.height, Directionality( @@ -132,18 +118,55 @@ class OtpDialog { ), ), ), - 30.height, - RichText( - text: TextSpan( - text: LocaleKeys.theVerificationCodeWillExpireIn.tr() + '\n', - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48), - children: [ - TextSpan( - text: displayTime, - style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48), + 10.height, + stopTimer + ? Row( + children: [ + Expanded( + child: LocaleKeys.codeExpire.tr().toText16( + color: MyColors.redColor, + ), + ), + 12.width, + Image.asset( + "assets/icons/ic_alarm.png", + width: 20, + height: 20, + color: MyColors.redColor, + ), + ], + ) + : RichText( + text: TextSpan( + text: LocaleKeys.theVerificationCodeWillExpireIn.tr() + '\n', + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48), + children: [ + TextSpan( + text: displayTime, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48), + ), + ], + ), ), - ], - ), + 18.height, + DefaultButton( + stopTimer ? LocaleKeys.resend.tr() : LocaleKeys.cancel.tr(), + () async { + if (stopTimer) { + hideSMSBox(context); + onResendCode(); + } else { + stopTimer = true; + // onFailure(); + hideSMSBox(context); + } + }, + colors: stopTimer + ? null + : [ + MyColors.pinkDarkColor, + MyColors.pinkDarkColor, + ], ), ], ), @@ -208,7 +231,9 @@ class OtpDialog { if (remainingTime > 0) { startTimer(setState); } else { - Navigator.pop(context); + setState(() { + stopTimer = true; + }); } }); } diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 6b702f8..66e4f97 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -509,7 +509,11 @@ class CodegenLoader extends AssetLoader{ "winnerSelectedRandomly": "سيتم اختيار الفائز عشوائياً من بين التصفيات.", "fingersCrossed": "تشابك الاصابع!!!", "congrats": "مبروك !!!", - "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح." + "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.", + "otp": "OTP", + "verification": "تَحَقّق", + "resend": "إعادة إرسال", + "codeExpire": "انتهت صلاحية رمز التحقق" }; static const Map en_US = { "mohemm": "Mohemm", @@ -1006,7 +1010,11 @@ static const Map en_US = { "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "fingersCrossed": "Fingers Crossed!!!", "congrats": "Congratulations!!!", - "allQuestionsCorrect": "You have answered all questions correct" + "allQuestionsCorrect": "You have answered all questions correct", + "otp": "OTP", + "verification": "Verification", + "resend": "Resend", + "codeExpire": "The verification code has been expired" }; static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 0da7047..835157b 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -480,5 +480,9 @@ abstract class LocaleKeys { static const fingersCrossed = 'fingersCrossed'; static const congrats = 'congrats'; static const allQuestionsCorrect = 'allQuestionsCorrect'; + static const otp = 'otp'; + static const verification = 'verification'; + static const resend = 'resend'; + static const codeExpire = 'codeExpire'; } diff --git a/lib/ui/login/forgot_password_screen.dart b/lib/ui/login/forgot_password_screen.dart index f058d43..6c1868e 100644 --- a/lib/ui/login/forgot_password_screen.dart +++ b/lib/ui/login/forgot_password_screen.dart @@ -65,11 +65,14 @@ class _ForgotPasswordScreenState extends State { () => { Navigator.pop(context), }, + onResendCode: () { + performForgotPassword(); + }, ).displayDialog(context); } catch (ex) { print(ex); Utils.hideLoading(context); - Utils.handleException(ex, context, null); + Utils.handleException(ex, context, null); } } diff --git a/lib/ui/login/verify_last_login_screen.dart b/lib/ui/login/verify_last_login_screen.dart index 4d653ed..6e51e51 100644 --- a/lib/ui/login/verify_last_login_screen.dart +++ b/lib/ui/login/verify_last_login_screen.dart @@ -57,30 +57,21 @@ class _VerifyLastLoginScreenState extends State { @override Widget build(BuildContext context) { - mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments - as GetMobileLoginInfoListModel; - String empName = AppState().isArabic(context) - ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! - : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!; + mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel; + String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!; return Scaffold( appBar: AppBar( backgroundColor: Colors.transparent, automaticallyImplyLeading: false, title: (mobileLoginInfoListModel?.businessCardPrivilege ?? false) - ? LocaleKeys.viewBusinessCard - .tr() - .toText12(color: MyColors.textMixColor, isUnderLine: true) - .onPress(() { + ? 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(() { + child: LocaleKeys.employeeDigitalID.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() { showMDialog(context, child: EmployeeDigitialIdDialog()); })), 21.width @@ -99,12 +90,9 @@ class _VerifyLastLoginScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.welcomeBack.tr().toText12(), - mobileLoginInfoListModel!.employeeName! - .toText24(isBold: true), + mobileLoginInfoListModel!.employeeName!.toText24(isBold: true), 10.height, - LocaleKeys.wouldYouLikeToLoginWithCurrentUsername - .tr() - .toText16(), + LocaleKeys.wouldYouLikeToLoginWithCurrentUsername.tr().toText16(), Container( height: 72, margin: const EdgeInsets.only(top: 23, bottom: 23), @@ -126,42 +114,26 @@ class _VerifyLastLoginScreenState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ LocaleKeys.lastLoginDetails.tr().toText16(), - DateUtil.formatDateToDate( - DateUtil.convertStringToDate( - mobileLoginInfoListModel!.editedOn!), - false) - .toText12(), + DateUtil.formatDateToDate(DateUtil.convertStringToDate(mobileLoginInfoListModel!.editedOn!), false).toText12(), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ - LocaleKeys.verificationType - .tr() - .toText10(color: MyColors.grey57Color), - getVerificationType( - mobileLoginInfoListModel!.loginType!) - .toText12(), + LocaleKeys.verificationType.tr().toText10(color: MyColors.grey57Color), + getVerificationType(mobileLoginInfoListModel!.loginType!).toText12(), Expanded(child: SizedBox()), - DateUtil.formatDateToTime( - DateUtil.convertStringToDate( - mobileLoginInfoListModel!.editedOn!)) - .toText12(), + DateUtil.formatDateToTime(DateUtil.convertStringToDate(mobileLoginInfoListModel!.editedOn!)).toText12(), ], ) ], ), ), LocaleKeys.pleaseVerify.tr().toText16(), - if (isNeedVerifyWithFaceIDAndBiometrics) - LocaleKeys.pleaseVerifyForBio.tr().toText12(), + if (isNeedVerifyWithFaceIDAndBiometrics) LocaleKeys.pleaseVerifyForBio.tr().toText12(), GridView( - gridDelegate: - const SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 2, - crossAxisSpacing: 13, - mainAxisSpacing: 9), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13, mainAxisSpacing: 9), physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.only(top: 9), shrinkWrap: true, @@ -214,9 +186,7 @@ class _VerifyLastLoginScreenState extends State { DefaultButton( LocaleKeys.useAnotherAccount.tr(), () { - Navigator.pushNamedAndRemoveUntil( - context, AppRoutes.login, (Route route) => false, - arguments: false); + Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route route) => false, arguments: false); }, ).insideContainer, ], @@ -248,19 +218,11 @@ class _VerifyLastLoginScreenState extends State { } Future loginWithFaceIDAndBiometrics() async { - IOSAuthMessages iosStrings = const IOSAuthMessages( - cancelButton: 'cancel', - goToSettingsButton: 'settings', - goToSettingsDescription: 'Please set up your Touch ID.', - lockOut: 'Please reenable your Touch ID'); + IOSAuthMessages iosStrings = + const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID'); bool authenticated = false; try { - authenticated = await auth.authenticate( - localizedReason: 'Scan your fingerprint to authenticate', - useErrorDialogs: true, - stickyAuth: true, - biometricOnly: true, - iOSAuthStrings: iosStrings); + authenticated = await auth.authenticate(localizedReason: 'Scan your fingerprint to authenticate', useErrorDialogs: true, stickyAuth: true, biometricOnly: true, iOSAuthStrings: iosStrings); } on PlatformException catch (e) { print(e); Utils.hideLoading(context); @@ -269,11 +231,8 @@ class _VerifyLastLoginScreenState extends State { return authenticated; } - Widget _loginOptionButton( - String _title, String _icon, int _flag, int? _loginIndex) { - bool isDisable = ((_flag == 3 && - !checkBiometricIsAvailable(BiometricType.face)) || - (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint))); + Widget _loginOptionButton(String _title, String _icon, int _flag, int? _loginIndex) { + bool isDisable = ((_flag == 3 && !checkBiometricIsAvailable(BiometricType.face)) || (_flag == 4 && !checkBiometricIsAvailable(BiometricType.fingerprint))); return InkWell( onTap: isDisable ? null @@ -284,21 +243,18 @@ class _VerifyLastLoginScreenState extends State { }); } else { if (_flag == 3 || _flag == 4) { - bool authenticateWithFaceAndTouchID = - await loginWithFaceIDAndBiometrics(); + bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics(); if (!authenticateWithFaceAndTouchID) { return; } else { - if (mobileLoginInfoListModel!.loginType == 3 || - mobileLoginInfoListModel!.loginType == 4) { + if (mobileLoginInfoListModel!.loginType == 3 || mobileLoginInfoListModel!.loginType == 4) { // bool authenticateWithFaceAndTouchID = await loginWithFaceIDAndBiometrics(); // if (!authenticateWithFaceAndTouchID) { // return; // } else { // performApiCall(_title, _icon, _flag, isDirectLogin: true); // } - performApiCall(_title, _icon, _flag, _flag, - isDirectLogin: true); + performApiCall(_title, _icon, _flag, _flag, isDirectLogin: true); } else { isNeedVerifyWithFaceIDAndBiometrics = true; selectedFlag = _flag; @@ -316,8 +272,7 @@ class _VerifyLastLoginScreenState extends State { } }, child: Container( - padding: - const EdgeInsets.only(left: 20, right: 20, bottom: 15, top: 28), + padding: const EdgeInsets.only(left: 20, right: 20, bottom: 15, top: 28), decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), color: isDisable ? Colors.grey.withOpacity(0.3) : Colors.white, @@ -343,23 +298,13 @@ class _VerifyLastLoginScreenState extends State { Widget getButton(int flag) { switch (flag) { case 1: - return _loginOptionButton(LocaleKeys.verifyThroughSMS.tr(), - 'assets/images/login/verify_sms.svg', flag, null); + return _loginOptionButton(LocaleKeys.verifyThroughSMS.tr(), 'assets/images/login/verify_sms.svg', flag, null); case 2: - return _loginOptionButton(LocaleKeys.verifyThroughWhatsapp.tr(), - 'assets/images/login/verify_whatsapp.svg', flag, null); + return _loginOptionButton(LocaleKeys.verifyThroughWhatsapp.tr(), 'assets/images/login/verify_whatsapp.svg', flag, null); case 3: - return _loginOptionButton( - LocaleKeys.verifyThroughFace.tr(), - 'assets/images/login/verify_face.svg', - flag, - BiometricType.face.index); + return _loginOptionButton(LocaleKeys.verifyThroughFace.tr(), 'assets/images/login/verify_face.svg', flag, BiometricType.face.index); case 4: - return _loginOptionButton( - LocaleKeys.verifyThroughFingerprint.tr(), - 'assets/images/login/verify_thumb.svg', - flag, - BiometricType.fingerprint.index); + return _loginOptionButton(LocaleKeys.verifyThroughFingerprint.tr(), 'assets/images/login/verify_thumb.svg', flag, BiometricType.fingerprint.index); default: return const SizedBox(); } @@ -376,9 +321,7 @@ class _VerifyLastLoginScreenState extends State { return isAvailable; } - Future performApiCall( - String _title, String _icon, int _flag, int sendVerificationFlat, - {bool isDirectLogin = false}) async { + Future performApiCall(String _title, String _icon, int _flag, int sendVerificationFlat, {bool isDirectLogin = false}) async { try { if (isDirectLogin) setState(() { @@ -387,16 +330,10 @@ class _VerifyLastLoginScreenState extends State { else Utils.showLoading(context); await LoginApiClient().checkMobileAppVersion(); - await LoginApiClient() - .memberLogin(AppState().getUserName!, AppState().password!); + await LoginApiClient().memberLogin(AppState().getUserName!, AppState().password!); if (!isDirectLogin) BasicMemberInformationModel? memberInformationModel = - await LoginApiClient() - .mohemmSendActivationCodeByOTPNotificationType( - 0, - AppState().memberLoginList?.pMOBILENUMBER, - sendVerificationFlat, - AppState().getUserName); + await LoginApiClient().mohemmSendActivationCodeByOTPNotificationType(0, AppState().memberLoginList?.pMOBILENUMBER, sendVerificationFlat, AppState().getUserName); if (isDirectLogin) performDirectApiCall(_title, _icon, _flag, ""); if (!isDirectLogin) Utils.hideLoading(context); if (!isDirectLogin) @@ -411,6 +348,9 @@ class _VerifyLastLoginScreenState extends State { () => { Navigator.pop(context), }, + onResendCode: () { + performApiCall(_title, _icon, _flag, sendVerificationFlat, isDirectLogin: isDirectLogin); + }, ).displayDialog(context); } catch (ex) { Utils.hideLoading(context); @@ -418,34 +358,26 @@ class _VerifyLastLoginScreenState extends State { } } - Future performDirectApiCall( - String _title, String _icon, int _flag, String value, - {bool isDirectLogin = false}) async { + Future performDirectApiCall(String _title, String _icon, int _flag, String value, {bool isDirectLogin = false}) async { try { - GenericResponseModel? genericResponseModel = await LoginApiClient() - .checkActivationCode(false, AppState().memberLoginList?.pMOBILENUMBER, - value, AppState().getUserName); - GenericResponseModel? genericResponseModel1 = await LoginApiClient() - .insertMobileLoginInfoNEW( - AppState().memberLoginList?.pEMAILADDRESS ?? "", - genericResponseModel?.pSESSIONID ?? 0, - genericResponseModel?.memberInformationList![0].eMPLOYEENAME ?? - "", - _flag, - AppState().memberLoginList?.pMOBILENUMBER ?? "", - AppState().getUserName!, - mobileLoginInfoListModel!.deviceToken!, - Platform.isAndroid ? "android" : "ios"); - AppState().setMemberInformationListModel = - genericResponseModel!.memberInformationList?.first; + GenericResponseModel? genericResponseModel = await LoginApiClient().checkActivationCode(false, AppState().memberLoginList?.pMOBILENUMBER, value, AppState().getUserName); + GenericResponseModel? genericResponseModel1 = await LoginApiClient().insertMobileLoginInfoNEW( + AppState().memberLoginList?.pEMAILADDRESS ?? "", + genericResponseModel?.pSESSIONID ?? 0, + genericResponseModel?.memberInformationList![0].eMPLOYEENAME ?? "", + _flag, + AppState().memberLoginList?.pMOBILENUMBER ?? "", + AppState().getUserName!, + mobileLoginInfoListModel!.deviceToken!, + Platform.isAndroid ? "android" : "ios"); + AppState().setMemberInformationListModel = genericResponseModel!.memberInformationList?.first; if (genericResponseModel?.errorMessage != null) { Utils.showToast(genericResponseModel?.errorMessage ?? ""); // Navigator.pop(context); } Utils.hideLoading(context); Navigator.pop(context); - Navigator.pushNamedAndRemoveUntil( - context, AppRoutes.dashboard, (Route route) => false); + Navigator.pushNamedAndRemoveUntil(context, AppRoutes.dashboard, (Route route) => false); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/login/verify_login_screen.dart b/lib/ui/login/verify_login_screen.dart index f31311f..8dba16c 100644 --- a/lib/ui/login/verify_login_screen.dart +++ b/lib/ui/login/verify_login_screen.dart @@ -511,7 +511,6 @@ class _VerifyLoginScreenState extends State { // } // - Future loginWithFaceIDAndBiometrics() async { IOSAuthMessages iosStrings = const IOSAuthMessages(cancelButton: 'cancel', goToSettingsButton: 'settings', goToSettingsDescription: 'Please set up your Touch ID.', lockOut: 'Please reenable your Touch ID'); @@ -550,9 +549,9 @@ class _VerifyLoginScreenState extends State { } } else { if (isNeedVerifyWithFaceIDAndBiometrics) - performApiCall(_title, _icon, selectedFlag,_flag); + performApiCall(_title, _icon, selectedFlag, _flag); else - performApiCall(_title, _icon, _flag,_flag); + performApiCall(_title, _icon, _flag, _flag); } } }, @@ -606,13 +605,13 @@ class _VerifyLoginScreenState extends State { return isAvailable; } - Future performApiCall(String _title, String _icon, int _flag,int sendVerificationFlat) async { + Future performApiCall(String _title, String _icon, int _flag, int sendVerificationFlat) async { try { Utils.showLoading(context); await LoginApiClient().checkMobileAppVersion(); await LoginApiClient().memberLogin(AppState().getUserName!, AppState().password!); - BasicMemberInformationModel? memberInformationModel = await LoginApiClient() - .mohemmSendActivationCodeByOTPNotificationType(0, AppState().memberLoginList?.pMOBILENUMBER, sendVerificationFlat, AppState().getUserName); + BasicMemberInformationModel? memberInformationModel = + await LoginApiClient().mohemmSendActivationCodeByOTPNotificationType(0, AppState().memberLoginList?.pMOBILENUMBER, sendVerificationFlat, AppState().getUserName); Utils.hideLoading(context); OtpDialog( context, @@ -633,8 +632,6 @@ class _VerifyLoginScreenState extends State { Platform.isAndroid ? "android" : "ios"); if (genericResponseModel?.errorMessage != null) { Utils.showToast(genericResponseModel?.errorMessage ?? ""); - - } else { AppState().setPrivilegeListModel = genericResponseModel!.privilegeList ?? []; AppState().setMemberInformationListModel = genericResponseModel.memberInformationList?.first; @@ -662,6 +659,9 @@ class _VerifyLoginScreenState extends State { () => { Navigator.pop(context), }, + onResendCode: () { + performApiCall(_title, _icon, _flag, sendVerificationFlat); + }, ).displayDialog(context); } catch (ex) { Utils.hideLoading(context); From 5880e227716e19a8e79bbcf5bf83a9e42bf12ca3 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Wed, 2 Nov 2022 14:34:55 +0300 Subject: [PATCH 02/23] merge fix --- assets/langs/ar-SA.json | 4 +--- assets/langs/en-US.json | 3 +-- lib/generated/codegen_loader.g.dart | 8 +++++--- lib/generated/locale_keys.g.dart | 1 + 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index bf3c1a8..f72ea36 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -497,8 +497,6 @@ "otp": "OTP", "verification": "تَحَقّق", "resend": "إعادة إرسال", - "codeExpire": "انتهت صلاحية رمز التحقق" - - "allQuestionsCorrect": "لقد أجبت على جميع الأسئلة بشكل صحيح.", + "codeExpire": "انتهت صلاحية رمز التحقق", "typeheretoreply": "اكتب هنا للرد" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 0543013..896a365 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -493,11 +493,10 @@ "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "fingersCrossed": "Fingers Crossed!!!", "congrats": "Congratulations!!!", - "allQuestionsCorrect": "You have answered all questions correct", "otp": "OTP", "verification": "Verification", "resend": "Resend", - "codeExpire": "The verification code has been expired" + "codeExpire": "The verification code has been expired", "allQuestionsCorrect": "You have answered all questions correct", "typeheretoreply": "Type here to reply" } \ No newline at end of file diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 66e4f97..83910f7 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -513,7 +513,8 @@ class CodegenLoader extends AssetLoader{ "otp": "OTP", "verification": "تَحَقّق", "resend": "إعادة إرسال", - "codeExpire": "انتهت صلاحية رمز التحقق" + "codeExpire": "انتهت صلاحية رمز التحقق", + "typeheretoreply": "اكتب هنا للرد" }; static const Map en_US = { "mohemm": "Mohemm", @@ -1010,11 +1011,12 @@ static const Map en_US = { "winnerSelectedRandomly": "The winner will be selected randomly among the qualifiers.", "fingersCrossed": "Fingers Crossed!!!", "congrats": "Congratulations!!!", - "allQuestionsCorrect": "You have answered all questions correct", "otp": "OTP", "verification": "Verification", "resend": "Resend", - "codeExpire": "The verification code has been expired" + "codeExpire": "The verification code has been expired", + "allQuestionsCorrect": "You have answered all questions correct", + "typeheretoreply": "Type here to reply" }; static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 835157b..f52bb89 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -484,5 +484,6 @@ abstract class LocaleKeys { static const verification = 'verification'; static const resend = 'resend'; static const codeExpire = 'codeExpire'; + static const typeheretoreply = 'typeheretoreply'; } From 0cca8ec935c39c6201e5e73142755a43b74125c6 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Wed, 2 Nov 2022 15:01:10 +0300 Subject: [PATCH 03/23] fix issues --- assets/langs/en-US.json | 2 +- lib/models/generic_response_model.dart | 2 +- lib/ui/misc/request_submit_screen.dart | 15 ++++---- .../dynamic_screens/dynamic_input_screen.dart | 10 +++--- lib/ui/my_team/employee_details.dart | 36 ++++++++++++------- lib/ui/profile/add_update_family_member.dart | 21 +++++------ lib/ui/profile/contact_details.dart | 7 +++- 7 files changed, 53 insertions(+), 40 deletions(-) diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 503302b..c15ada7 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -296,7 +296,7 @@ "relatedTopic": "Related Topic", "selectTopic": "Select Topic", "supportingDocument": "Supporting Document", - "mowadhafhiRequest": "Mowadhafhi Request", + "mowadhafhiRequest": "Mowadhafi Request", "ticketReference": "Ticket Reference", "section": "Section", "topic": "Topic", diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 753d2c2..2c8e98f 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1291,7 +1291,7 @@ class GenericResponseModel { startEitApprovalProcess = json['StartEitApprovalProcess'] != null ? StartEitApprovalProcess.fromJson(json['StartEitApprovalProcess']) : null; startHrApprovalProcessList = json['StartHrApprovalProcessList']; - startPhonesApprovalProcessList = json['StartPhonesApprovalProcessList'] != null ? StartPhoneApprovalProcess.fromJson(json['startPhonesApprovalProcessList']) : null; + startPhonesApprovalProcessList = json['StartPhonesApprovalProcessList'] != null ? StartPhoneApprovalProcess.fromJson(json['StartPhonesApprovalProcessList']) : null; startSitApprovalProcess = json['StartSitApprovalProcess']; startTermApprovalProcessList = json['StartTermApprovalProcessList'] != null ? StartTermApprovalProcessList.fromJson(json['StartTermApprovalProcessList']) : null; diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart index 8ca9a0c..7869443 100644 --- a/lib/ui/misc/request_submit_screen.dart +++ b/lib/ui/misc/request_submit_screen.dart @@ -68,7 +68,7 @@ class _RequestSubmitScreenState extends State { } void submitRequest() async { - try { + // try { Utils.showLoading(context); List> list = []; if (attachmentFiles.isNotEmpty) { @@ -97,7 +97,7 @@ class _RequestSubmitScreenState extends State { ); } else if (params!.approvalFlag == 'address') { await ProfileApiClient().startAddressApprovalProcess( - "SUBMIT", + LocaleKeys.submit.tr(), comments.text, params!.pItemId, params!.transactionId, @@ -111,7 +111,7 @@ class _RequestSubmitScreenState extends State { ); } else if (params!.approvalFlag == 'basicDetails') { await ProfileApiClient().startBasicDetailsApprovalProcess( - "SUBMIT", + LocaleKeys.submit.tr(), comments.text, params!.pItemId, params!.transactionId, @@ -131,6 +131,7 @@ class _RequestSubmitScreenState extends State { ); }else if (params!.approvalFlag == 'endEmployment') { await TerminationDffApiClient().startTermApprovalProcess( + // "SUBMIT", LocaleKeys.submit.tr(), comments.text, params!.pItemId, @@ -142,10 +143,10 @@ class _RequestSubmitScreenState extends State { 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 diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 0a6c9d4..c1b8a43 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -136,7 +136,7 @@ class _DynamicInputScreenState extends State { } Future getDefaultValues(GetEITDFFStructureList structureList) async { - try { + // try { Utils.showLoading(context); for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; @@ -163,10 +163,10 @@ class _DynamicInputScreenState extends State { await Future.delayed(const Duration(seconds: 1)); Utils.hideLoading(context); setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // } } // List> calGetValueSetValuesIonicLogic(GetEITDFFStructureList structureElement) { diff --git a/lib/ui/my_team/employee_details.dart b/lib/ui/my_team/employee_details.dart index d0e167d..9fc0070 100644 --- a/lib/ui/my_team/employee_details.dart +++ b/lib/ui/my_team/employee_details.dart @@ -256,19 +256,29 @@ class _EmployeeDetailsState extends State { child: Column( children: [ Text(LocaleKeys.addFavoriteList).tr(namedArgs: {'name': '${getEmployeeSubordinates!.eMPLOYEENAME}'}), - Image.memory( - Utils.getPostBytes( - getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "", - ), - errorBuilder: (BuildContext context, error, stackTrace) { - return SvgPicture.asset( - "assets/images/user.svg", height: 50, width: 50, - ); - }, - width: 50, - height: 50, - fit: BoxFit.cover, - ).circle(50).paddingOnly(top: 21), + getEmployeeSubordinates!.eMPLOYEEIMAGE == null + ? SvgPicture.asset( + "assets/images/user.svg", + height: 68, + width: 68,) + : CircleAvatar( + radius: 68, + backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), + backgroundColor: Colors.black, + ), + // Image.memory( + // Utils.getPostBytes( + // getEmployeeSubordinates!.eMPLOYEEIMAGE ?? "", + // ), + // errorBuilder: (BuildContext context, error, stackTrace) { + // return SvgPicture.asset( + // "assets/images/user.svg", height: 50, width: 50, + // ); + // }, + // width: 50, + // height: 50, + // fit: BoxFit.cover, + // ).circle(50).paddingOnly(top: 21), ], ), ), diff --git a/lib/ui/profile/add_update_family_member.dart b/lib/ui/profile/add_update_family_member.dart index 61b6639..e6b0b3e 100644 --- a/lib/ui/profile/add_update_family_member.dart +++ b/lib/ui/profile/add_update_family_member.dart @@ -223,9 +223,8 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - //date = DateFormat('yyyy/MM/dd').format(dateValue); - date = "2022-10-23T09:17:38.653+03:00"; - // date = (DateFormat('yyyy-MM-dd').format(dateValue)+"T"+ dateTime.toString() + dateTime1.toString()); + date = (DateFormat('yyyy-MM-dd').format(dateValue)); + // date = (DateFormat('yyyy-MM-dd').format(dateValue)+"T"+ dateTime.toString() + dateTime1.toString()); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; print(dateTime); print(dateTime1); @@ -288,9 +287,8 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - date = "2022-10-23T09:17:38.653+03:00"; - // date = (DateFormat('yyyy-MM-dd').format(dateValue) +"T"+ dateTime.toString() + dateTime1.toString()); - // date = DateFormat('yyyy/MM/dd').format(dateValue); + // date = (DateFormat('yyyy-MM-dd').format(dateValue) +"T"+ dateTime.toString() + dateTime1.toString()); + date = (DateFormat('yyyy-MM-dd').format(dateValue)); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; setState(() {}); }, @@ -349,9 +347,8 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - date = "2022-10-23T09:17:38.653+03:00"; - // date = (DateFormat('yyyy-MM-dd').format(dateValue)+"T"+ dateTime.toString() + dateTime1.toString()); - // date = DateFormat('yyyy/MM/dd').format(dateValue); + // date = (DateFormat('yyyy-MM-dd').format(dateValue)+"T"+ dateTime.toString() + dateTime1.toString()); + date = (DateFormat('yyyy-MM-dd').format(dateValue)); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; setState(() {}); }, @@ -407,7 +404,7 @@ class _AddUpdateFamilyMemberState extends State { numberVal = null; } else { dateVal = null; - vatcherVal = e!.getContactDetailsList!.sEGMENTVALUEDSP; + vatcherVal = e!.getContactDetailsList!.vARCHAR2VALUE; numberVal = null; } return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: vatcherVal.toString()).toJson(); @@ -427,7 +424,7 @@ class _AddUpdateFamilyMemberState extends State { } else { dateVal = null; numberVal = null; - vatcherVal = e!.getContactDetailsList!.sEGMENTVALUEDSP; + vatcherVal = e!.getContactDetailsList!.vARCHAR2VALUE; } return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: vatcherVal.toString()).toJson(); }).toList(); @@ -441,7 +438,7 @@ class _AddUpdateFamilyMemberState extends State { if (e!.dATATYPE == 'VARCHAR2') { dateVal = null; numberVal = null; - vatcherVal = e.getContactDetailsList?.sEGMENTVALUEDSP ?? ""; + vatcherVal = e.getContactDetailsList?.vARCHAR2VALUE ?? ""; } else if (e.dATATYPE == 'DATE') { dateVal = e.getContactDetailsList!.sEGMENTVALUEDSP.toString(); print("dateVal:${dateVal ?? ""}"); diff --git a/lib/ui/profile/contact_details.dart b/lib/ui/profile/contact_details.dart index 9a6f25e..95c867a 100644 --- a/lib/ui/profile/contact_details.dart +++ b/lib/ui/profile/contact_details.dart @@ -129,7 +129,12 @@ class _ContactDetailsState extends State { separatorBuilder: (cxt, index) => 12.height, itemCount: getEmployeeAddressList.length), if (menuEntriesAddress.updateButton == 'Y') - Positioned( + AppState().isArabic(context)? Positioned( + top: 1, + left: 1, + child: const Icon(Icons.edit_location_alt_outlined, size: 20).onPress(addUpdateAddress), + ) + :Positioned( top: 1, right: 1, child: const Icon(Icons.edit_location_alt_outlined, size: 20).onPress(addUpdateAddress), From 7cc110b9a1092a5d23809b4106e32b711b55a372 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 2 Nov 2022 15:03:01 +0300 Subject: [PATCH 04/23] JIRA fixes --- assets/langs/en-US.json | 4 +-- assets/lottie/loading.json | 2 +- lib/classes/consts.dart | 4 +-- lib/generated/codegen_loader.g.dart | 4 +-- .../add_leave_balance_screen.dart | 33 ++++++++++++------- lib/ui/login/login_screen.dart | 4 +-- .../dynamic_screens/dynamic_input_screen.dart | 2 +- .../dynamic_input_address_screen.dart | 4 +-- lib/ui/profile/widgets/profile_panel.dart | 20 ++++++----- lib/ui/work_list/itg_detail_screen.dart | 11 +++++-- lib/ui/work_list/sheets/delegate_sheet.dart | 15 ++++++--- .../sheets/selected_itg_item_sheet.dart | 4 +-- lib/ui/work_list/worklist_detail_screen.dart | 16 +++++---- .../dialogs/accept_reject_input_dialog.dart | 9 +++-- lib/widgets/item_detail_view_widget.dart | 8 +++-- 15 files changed, 88 insertions(+), 52 deletions(-) diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 503302b..a589a82 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -284,7 +284,7 @@ "add": "Add", "edit": "Edit", "myProfile": "My Profile", - "mowadhafhi": "Mowadhafhi", + "mowadhafhi": "Mowadhafi", "searchAnnouncements": "Search Announcements", "announcements": "Announcements", "swipeRequest": "Swipe Request", @@ -296,7 +296,7 @@ "relatedTopic": "Related Topic", "selectTopic": "Select Topic", "supportingDocument": "Supporting Document", - "mowadhafhiRequest": "Mowadhafhi Request", + "mowadhafhiRequest": "Mowadhafi Request", "ticketReference": "Ticket Reference", "section": "Section", "topic": "Topic", diff --git a/assets/lottie/loading.json b/assets/lottie/loading.json index 8190459..ea7bff3 100644 --- a/assets/lottie/loading.json +++ b/assets/lottie/loading.json @@ -1 +1 @@ -{"v":"5.8.1","fr":30,"ip":0,"op":60,"w":300,"h":300,"nm":"loading_6","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[360]}],"ix":10},"p":{"a":0,"k":[150.00000000000003,150.00000000000003,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[30.000000000000004,30.000000000000004,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.12941176470588237,0.7411764705882353,0.7764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"t":60,"s":[99]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[1]},{"t":50,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[3]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150.00000000000003,150.00000000000003,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[30.000000000000004,30.000000000000004,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.7450980392156863,0.9254901960784314,0.9372549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0}],"markers":[]} \ No newline at end of file +{"v":"5.8.1","fr":30,"ip":0,"op":60,"w":100,"h":100,"nm":"loading_6","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[360]}],"ix":10},"p":{"a":0,"k":[50.00000000000002,50.00000000000002,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[10.000000000000004,10.000000000000004,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.12941176470588237,0.7411764705882353,0.7764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"t":60,"s":[99]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[1]},{"t":50,"s":[100]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[3]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.00000000000002,50.00000000000002,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[10.000000000000004,10.000000000000004,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[300,300],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.7450980392156863,0.9254901960784314,0.9372549019607843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":50,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index e82c30a..eea2481 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - // static String baseUrl = "https://hmgwebservices.com"; // Live server + // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 6b702f8..8754d9b 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -797,7 +797,7 @@ static const Map en_US = { "add": "Add", "edit": "Edit", "myProfile": "My Profile", - "mowadhafhi": "Mowadhafhi", + "mowadhafhi": "Mowadhafi", "searchAnnouncements": "Search Announcements", "announcements": "Announcements", "swipeRequest": "Swipe Request", @@ -809,7 +809,7 @@ static const Map en_US = { "relatedTopic": "Related Topic", "selectTopic": "Select Topic", "supportingDocument": "Supporting Document", - "mowadhafhiRequest": "Mowadhafhi Request", + "mowadhafhiRequest": "Mowadhafi Request", "ticketReference": "Ticket Reference", "section": "Section", "topic": "Topic", diff --git a/lib/ui/leave_balance/add_leave_balance_screen.dart b/lib/ui/leave_balance/add_leave_balance_screen.dart index 864a507..85337aa 100644 --- a/lib/ui/leave_balance/add_leave_balance_screen.dart +++ b/lib/ui/leave_balance/add_leave_balance_screen.dart @@ -92,7 +92,7 @@ class _AddLeaveBalanceScreenState extends State { } void validateAbsenceTransaction() async { - // try { + try { Utils.showLoading(context); Map dffDataMap = {}; for (int i = 1; i <= 20; i++) { @@ -100,7 +100,8 @@ class _AddLeaveBalanceScreenState extends State { for (int dffIndex = 0; dffIndex < getabsenceDffStructureList.length; dffIndex++) { if ("ATTRIBUTE$i" == getabsenceDffStructureList[dffIndex].aPPLICATIONCOLUMNNAME) { if (getabsenceDffStructureList[dffIndex].fORMATTYPE == "X") { - dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME != null ? Utils.formatDate(getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME!) : ""; + dffDataMap["P_ATTRIBUTE$i"] = + getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME != null ? Utils.formatDate(getabsenceDffStructureList[dffIndex].eSERVICESDV!.pIDCOLUMNNAME!) : ""; } else { dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV?.pIDCOLUMNNAME; } @@ -108,9 +109,17 @@ class _AddLeaveBalanceScreenState extends State { } } } - await LeaveBalanceApiClient().validateAbsenceTransaction(selectedAbsenceType!.dESCFLEXCONTEXTCODE!, "HR_LOA_SS", selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, - selectedReplacementEmployee != null ? selectedReplacementEmployee!.userName! : "", DateUtil.getFormattedDate(startDateTime!, "MM/dd/yyyy"), DateUtil.getFormattedDate(endDateTime!, "MM/dd/yyyy"), -999, dffDataMap, - comments: comment); + await LeaveBalanceApiClient() + .validateAbsenceTransaction( + selectedAbsenceType!.dESCFLEXCONTEXTCODE!, + "HR_LOA_SS", + selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, + selectedReplacementEmployee != null ? selectedReplacementEmployee!.userName! : "", + DateUtil.getFormattedDate(startDateTime!, "MM/dd/yyyy"), + DateUtil.getFormattedDate(endDateTime!, "MM/dd/yyyy"), + -999, + dffDataMap, + comments: comment); SumbitAbsenceTransactionList submit = await LeaveBalanceApiClient().submitAbsenceTransaction( selectedAbsenceType!.dESCFLEXCONTEXTCODE!, @@ -126,13 +135,13 @@ class _AddLeaveBalanceScreenState extends State { Utils.hideLoading(context); await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance")); - // Utils.showLoading(context); + Utils.showLoading(context); await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!); - // Utils.hideLoading(context); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } + Utils.hideLoading(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } } @override @@ -221,7 +230,7 @@ class _AddLeaveBalanceScreenState extends State { onTap: () { showMyBottomSheet( context, - callBackFunc: (){}, + callBackFunc: () {}, child: SearchEmployeeBottomSheet( title: LocaleKeys.searchForEmployee.tr(), apiMode: LocaleKeys.delegate.tr(), diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index 0c4e268..20fa8bc 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -145,8 +145,8 @@ class _LoginScreenState extends State { // username.text = "15153"; // Tamer User // password.text = "Abcd@12345"; - username.text = "210038"; // Hashim User - password.text = "123"; + // username.text = "206535"; // Hashim User + // password.text = "Namira786"; } if (isAppOpenBySystem!) checkFirebaseToken(); } diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 0a6c9d4..519bb6c 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -448,7 +448,7 @@ class _DynamicInputScreenState extends State { return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), model.eSERVICESDV?.pIDCOLUMNNAME ?? "", - isReadOnly: model.rEADONLY == "Y", + // isReadOnly: model.rEADONLY == "Y", isInputTypeNum: true, onChange: (text) { model.fieldAnswer = text; diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart index cc8e861..6933a28 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart @@ -269,13 +269,13 @@ class _DynamicInputScreenState extends State { if (tempVar.isNotEmpty) { DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - tempVar = DateFormat('dd/MMM/yyy').format(date); + tempVar = DateFormat('dd-MMM-yyy').format(date); if (e.aPPLICATIONCOLUMNNAME == null) { effectiveDate = tempVar; } } } else if (e.eSERVICESVS?.isNotEmpty ?? false) { - tempVar = e.getEmployeeAddressList!.vARCHAR2VALUE!; + e.getEmployeeAddressList!.vARCHAR2VALUE != null ? tempVar = e.getEmployeeAddressList!.vARCHAR2VALUE! : tempVar = ""; if (e.aPPLICATIONCOLUMNNAME == null) { countryCode = tempVar; } diff --git a/lib/ui/profile/widgets/profile_panel.dart b/lib/ui/profile/widgets/profile_panel.dart index 5018171..440fbb3 100644 --- a/lib/ui/profile/widgets/profile_panel.dart +++ b/lib/ui/profile/widgets/profile_panel.dart @@ -44,12 +44,16 @@ class ProfilePanel extends StatelessWidget { Widget profileImage() => memberInformationList.eMPLOYEEIMAGE == null ? SvgPicture.asset( - "assets/images/user.svg", - height: 68, - width: 68,) - : CircleAvatar( - radius: 68, - backgroundImage: MemoryImage(Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!)), - backgroundColor: Colors.black, - ); + "assets/images/user.svg", + height: 68, + width: 68, + ) + : ClipOval( + child: Image.memory( + Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!), + width: 75, + height: 75, + fit: BoxFit.fill, + ), + ); } diff --git a/lib/ui/work_list/itg_detail_screen.dart b/lib/ui/work_list/itg_detail_screen.dart index 0f45648..84bd9bd 100644 --- a/lib/ui/work_list/itg_detail_screen.dart +++ b/lib/ui/work_list/itg_detail_screen.dart @@ -66,7 +66,9 @@ class _ItgDetailScreenState extends State { isRejectAvailable = itgRequest!.allowedActions!.any((element) => element.action == "Reject"); } Utils.hideLoading(context); - setState(() {}); + setState(() { + controller.jumpToPage(0); + }); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); @@ -264,12 +266,12 @@ class _ItgDetailScreenState extends State { switch (action.action) { case "Delegate": showMyBottomSheet(context, callBackFunc: reloadITG, - child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [])); + child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [], callBackFunc: reloadITG,)); break; case "RequestInformation": showMyBottomSheet(context, callBackFunc: reloadITG, - child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [])); + child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [], callBackFunc: reloadITG,)); break; case "RFC": @@ -279,6 +281,9 @@ class _ItgDetailScreenState extends State { // do something else break; } + setState(() { + showFabOptions = false; + }); } Widget myTab(String title, int index) { diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index 28a90e6..bd3b010 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -28,8 +28,9 @@ class DelegateSheet extends StatefulWidget { String title, apiMode; List? actionHistoryList; List? wFHistory; + VoidCallback callBackFunc; - DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, this.wFHistory}); + DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList, this.wFHistory, required this.callBackFunc}); @override State createState() => _DelegateSheetState(); @@ -392,8 +393,9 @@ class _DelegateSheetState extends State { Widget showItem(GetActionHistoryList actionHistory) { return InkWell( onTap: () { + Navigator.pop(context); showMyBottomSheet(context, - callBackFunc: (){}, + callBackFunc: widget.callBackFunc, child: SelectedItemSheet( "Comment", apiMode: widget.apiMode, @@ -438,8 +440,9 @@ class _DelegateSheetState extends State { Widget showItgItem(WFHistory wfHistory) { return InkWell( onTap: () { + Navigator.pop(context); showMyBottomSheet(context, - callBackFunc: (){}, + callBackFunc: widget.callBackFunc, child: SelectedItgItemSheet( "Comment", apiMode: widget.apiMode, @@ -463,8 +466,9 @@ class _DelegateSheetState extends State { Widget showFavUserItem(GetFavoriteReplacements actionHistory) { return InkWell( onTap: () { + Navigator.pop(context); showMyBottomSheet(context, - callBackFunc: (){}, + callBackFunc: widget.callBackFunc, child: SelectedItemSheet( "Comment", apiMode: widget.apiMode, @@ -509,8 +513,9 @@ class _DelegateSheetState extends State { Widget showInputUserItem(ReplacementList actionHistory) { return InkWell( onTap: () { + Navigator.pop(context); showMyBottomSheet(context, - callBackFunc: (){}, + callBackFunc: widget.callBackFunc, child: SelectedItemSheet( LocaleKeys.comments.tr(), apiMode: widget.apiMode, diff --git a/lib/ui/work_list/sheets/selected_itg_item_sheet.dart b/lib/ui/work_list/sheets/selected_itg_item_sheet.dart index 7381d59..f44ca04 100644 --- a/lib/ui/work_list/sheets/selected_itg_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_itg_item_sheet.dart @@ -128,8 +128,8 @@ class SelectedItgItemSheet extends StatelessWidget { .informationITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment); } Utils.hideLoading(context); - Navigator.pop(context); - Navigator.pop(context); + // Navigator.pop(context); + // Navigator.pop(context); Navigator.pop(context, "delegate_reload"); } catch (ex) { Utils.hideLoading(context); diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index ec02631..0e769e7 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -388,20 +388,20 @@ class _WorkListDetailScreenState extends State { case "DELEGATE": showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); break; case "REQUEST_INFO": // do something else showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); break; case "TRANSFER_INFO": // do something else showMyBottomSheet(context, callBackFunc: reloadWorkList, child: - DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); break; case "ANSWER_INFO": performAction(notificationButton.bUTTONACTION!, title: notificationButton.bUTTONLABEL); @@ -417,12 +417,12 @@ class _WorkListDetailScreenState extends State { case "APPROVE_AND_FORWARD": showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); break; case "FORWARD": showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); break; case "REJECT": performNetworkCall(context, email: "", userId: ""); @@ -431,6 +431,9 @@ class _WorkListDetailScreenState extends State { Navigator.pop(context); break; } + setState(() { + showFabOptions = false; + }); } Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { @@ -516,7 +519,6 @@ class _WorkListDetailScreenState extends State { } void performAction(String actionMode, {String? title}) { - TextEditingController textEditingController = TextEditingController(); showDialog( context: context, builder: (cxt) => AcceptRejectInputDialog( @@ -823,6 +825,8 @@ class _WorkListDetailScreenState extends State { void getActionHistory() async { try { + isActionHistoryLoaded = false; + actionHistoryList.clear(); // if (apiCallCount == 0) Utils.showLoading(context); // apiCallCount++; actionHistoryList = await WorkListApiClient().getActionHistory(workListData!.nOTIFICATIONID!); diff --git a/lib/widgets/dialogs/accept_reject_input_dialog.dart b/lib/widgets/dialogs/accept_reject_input_dialog.dart index a0faf2c..db9c5d6 100644 --- a/lib/widgets/dialogs/accept_reject_input_dialog.dart +++ b/lib/widgets/dialogs/accept_reject_input_dialog.dart @@ -2,6 +2,7 @@ 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/classes/utils.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'; @@ -89,8 +90,12 @@ class AcceptRejectInputDialog extends StatelessWidget { DefaultButton( actionMode == "REJECTED" ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(), () { - Navigator.pop(context); - onTap(note); + if(note.isNotEmpty) { + Navigator.pop(context); + onTap(note); + } else { + Utils.showToast(LocaleKeys.pleaseEnterComments.tr()); + } }, colors: actionMode == "REJECTED" ? const [ diff --git a/lib/widgets/item_detail_view_widget.dart b/lib/widgets/item_detail_view_widget.dart index 05495e9..5148389 100644 --- a/lib/widgets/item_detail_view_widget.dart +++ b/lib/widgets/item_detail_view_widget.dart @@ -80,9 +80,13 @@ class ItemDetailViewGridItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))), + title != null ? Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))) : Container(), 4.width, - type!.toLowerCase() == "table" ? getStringFromJSON(value!) : Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor)), + type != null + ? type!.toLowerCase() == "table" + ? getStringFromJSON(value!) + : Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor)) + : Container(), ], ), ); From 09b2f8a23fe573f11835ae84349c4c3a21118a22 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Wed, 2 Nov 2022 17:32:12 +0300 Subject: [PATCH 05/23] UI Fixes --- lib/ui/marathon/marathon_screen.dart | 7 +- lib/ui/marathon/widgets/countdown_timer.dart | 90 ++++++++++++++------ lib/ui/marathon/widgets/marathon_banner.dart | 69 +++++++++++++-- lib/ui/marathon/widgets/question_card.dart | 19 ++--- 4 files changed, 138 insertions(+), 47 deletions(-) diff --git a/lib/ui/marathon/marathon_screen.dart b/lib/ui/marathon/marathon_screen.dart index d548122..a02733f 100644 --- a/lib/ui/marathon/marathon_screen.dart +++ b/lib/ui/marathon/marathon_screen.dart @@ -16,6 +16,7 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart' import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:provider/provider.dart'; +import 'package:sizer/sizer.dart'; import 'package:steps_indicator/steps_indicator.dart'; class MarathonScreen extends StatelessWidget { @@ -109,7 +110,7 @@ class _MarathonProgressContainerState extends State { Container( decoration: BoxDecoration( color: MyColors.greenColor, - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(5), ), padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), child: "${widget.provider.currentQuestionNumber.toString()} / ${widget.provider.totalQuestions.toString()} ${LocaleKeys.question.tr()}".toText12(color: MyColors.white), @@ -120,7 +121,7 @@ class _MarathonProgressContainerState extends State { ), 15.height, StepsIndicator( - lineLength: 21, + lineLength: SizerUtil.deviceType == DeviceType.tablet ? MediaQuery.of(context).size.width * 0.077 : MediaQuery.of(context).size.width * 0.054, nbSteps: 10, selectedStep: widget.provider.currentQuestionNumber, doneLineColor: MyColors.greenColor, @@ -130,6 +131,8 @@ class _MarathonProgressContainerState extends State { selectedStepSize: 10, unselectedStepSize: 10, doneStepSize: 10, + selectedStepBorderSize: 0, + unselectedStepBorderSize: 0, selectedStepColorIn: MyColors.greenColor, selectedStepColorOut: MyColors.greenColor, unselectedStepColorIn: MyColors.lightGreyDeColor, diff --git a/lib/ui/marathon/widgets/countdown_timer.dart b/lib/ui/marathon/widgets/countdown_timer.dart index 557cfd3..f5eb92f 100644 --- a/lib/ui/marathon/widgets/countdown_timer.dart +++ b/lib/ui/marathon/widgets/countdown_timer.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:auto_size_text/auto_size_text.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_countdown_timer/current_remaining_time.dart'; @@ -21,7 +22,7 @@ class BuildCountdownTimer extends StatelessWidget { }) : super(key: key); final TextStyle styleTextHome = const TextStyle( - fontSize: 7, + // fontSize: 7, color: MyColors.greyACColor, fontStyle: FontStyle.italic, fontWeight: FontWeight.w600, @@ -31,9 +32,8 @@ class BuildCountdownTimer extends StatelessWidget { final TextStyle styleDigitHome = const TextStyle( height: 23 / 27, color: MyColors.white, - fontSize: 24, + // fontSize: 24, fontStyle: FontStyle.italic, - fontFamily: "Poppins", letterSpacing: -1.44, fontWeight: FontWeight.bold, ); @@ -62,12 +62,16 @@ class BuildCountdownTimer extends StatelessWidget { children: [ Column( children: [ - Text( + AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.days.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -75,12 +79,16 @@ class BuildCountdownTimer extends StatelessWidget { buildSeparator(), Column( children: [ - Text( + AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.hours.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -88,12 +96,16 @@ class BuildCountdownTimer extends StatelessWidget { buildSeparator(), Column( children: [ - Text( + AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.minutes.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -101,12 +113,16 @@ class BuildCountdownTimer extends StatelessWidget { buildSeparator(), Column( children: [ - Text( + AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.seconds.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -116,8 +132,10 @@ class BuildCountdownTimer extends StatelessWidget { } Widget buildSeparator() { - return Text( + return AutoSizeText( " : ", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ); } @@ -140,16 +158,22 @@ class BuildCountdownTimer extends StatelessWidget { Column( children: [ time.days == null - ? Text( + ? AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ) - : Text( + : AutoSizeText( time.days! < 10 ? "0${time.days.toString()}" : time.days.toString(), + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.days.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -158,16 +182,22 @@ class BuildCountdownTimer extends StatelessWidget { Column( children: [ time.hours == null - ? Text( + ? AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ) - : Text( + : AutoSizeText( time.hours! < 10 ? "0${time.hours.toString()}" : time.hours.toString(), + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.hours.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -176,16 +206,22 @@ class BuildCountdownTimer extends StatelessWidget { Column( children: [ time.min == null - ? Text( + ? AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ) - : Text( + : AutoSizeText( time.min! < 10 ? "0${time.min.toString()}" : time.min.toString(), + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.minutes.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], @@ -194,16 +230,22 @@ class BuildCountdownTimer extends StatelessWidget { Column( children: [ time.sec == null - ? Text( + ? AutoSizeText( "00", + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ) - : Text( + : AutoSizeText( time.sec! < 10 ? "0${time.sec.toString()}" : time.sec.toString(), + maxFontSize: 24, + minFontSize: 20, style: screenFlag == 0 ? styleDigitHome : styleDigitMarathon, ), - Text( + AutoSizeText( LocaleKeys.seconds.tr(), + minFontSize: 7, + maxFontSize: 8, style: screenFlag == 0 ? styleTextHome : styleTextMarathon, ), ], diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart index be06e35..379df20 100644 --- a/lib/ui/marathon/widgets/marathon_banner.dart +++ b/lib/ui/marathon/widgets/marathon_banner.dart @@ -23,7 +23,8 @@ class MarathonBanner extends StatelessWidget { MarathonProvider provider = context.read(); return Container( decoration: MyDecorations.shadowDecoration, - height: 90, + height: MediaQuery.of(context).size.height * 0.11, + clipBehavior: Clip.antiAlias, child: Stack( children: [ Transform( @@ -33,8 +34,20 @@ class MarathonBanner extends StatelessWidget { ), child: SvgPicture.asset( "assets/images/marathon_banner_bg.svg", - fit: BoxFit.cover, - width: MediaQuery.of(context).size.width - 40, + fit: BoxFit.fill, + width: double.infinity, + ), + ), + Positioned( + left: -20, + top: -10, + child: Transform.rotate( + angle: 15, + child: Container( + width: 65, + height: 32, + color: MyColors.gradiantStartColor, + ), ), ), SizedBox( @@ -55,7 +68,7 @@ class MarathonBanner extends StatelessWidget { width: double.infinity, height: double.infinity, child: Row( - mainAxisAlignment: MainAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.start, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, @@ -65,9 +78,10 @@ class MarathonBanner extends StatelessWidget { AppState().isArabic(context) ? 0.height : 5.height, AutoSizeText( LocaleKeys.getReadyForContest.tr(), + minFontSize: 08, + maxFontSize: 11, style: const TextStyle( fontStyle: FontStyle.italic, - fontSize: 12, fontWeight: FontWeight.w600, color: MyColors.lightGreyEFColor, letterSpacing: -0.4, @@ -91,16 +105,55 @@ class MarathonBanner extends StatelessWidget { ), ], ).paddingOnly( - left: AppState().isArabic(context) ? 12 : 0, - right: AppState().isArabic(context) ? 0 : 12, + left: AppState().isArabic(context) ? 12 : 3, + right: AppState().isArabic(context) ? 3 : 12, ) ], - ).paddingOnly(right: 20), + ), ), ), ], ), ), + Positioned( + top: 0, + left: 0, + child: SizedBox( + height: 20, + width: 35, + child: Transform.rotate( + angle: -math.pi / 4.5, + child: Text( + LocaleKeys.brainMarathon.tr(), + textAlign: TextAlign.center, + maxLines: 2, + style: const TextStyle( + color: MyColors.kWhiteColor, + fontWeight: FontWeight.bold, + fontSize: 6, + height: 1.2, + ), + ), + ), + ), + ).paddingOnly(top: 3), + !AppState().isArabic(context) + ? Positioned( + right: 0, + bottom: 0, + child: RotatedBox( + quarterTurns: 4, + child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white), + ).paddingAll(15), + ) + : Positioned( + bottom: 0, + left: 0, + child: RotatedBox( + quarterTurns: 2, + child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white), + ).paddingAll(15), + ), ], ).onPress( () => Navigator.pushNamed(context, AppRoutes.marathonIntroScreen), diff --git a/lib/ui/marathon/widgets/question_card.dart b/lib/ui/marathon/widgets/question_card.dart index d5f6bce..a3fe720 100644 --- a/lib/ui/marathon/widgets/question_card.dart +++ b/lib/ui/marathon/widgets/question_card.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/decorations_helper.dart'; import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/models/marathon_question_model.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:provider/provider.dart'; @@ -48,7 +49,7 @@ class _QuestionCardState extends State { Widget build(BuildContext context) { return CupertinoPageScaffold( child: SizedBox( - height: 420, + height: 440, width: double.infinity, child: Consumer( builder: (BuildContext context, MarathonProvider provider, _) { @@ -200,8 +201,6 @@ class _AnswerContentState extends State { updateOption(0, true); }, child: Container( - height: 60, - width: MediaQuery.of(context).size.width - 75, alignment: Alignment.centerLeft, decoration: getContainerColor(0), child: Center( @@ -212,7 +211,7 @@ class _AnswerContentState extends State { fontWeight: FontWeight.w600, fontSize: 16, ), - ), + ).paddingOnly(top: 17, bottom: 17), ), ), ), @@ -231,8 +230,6 @@ class _AnswerContentState extends State { updateOption(1, true); }, child: Container( - height: 60, - width: MediaQuery.of(context).size.width - 75, alignment: Alignment.centerLeft, decoration: getContainerColor(1), child: Center( @@ -243,7 +240,7 @@ class _AnswerContentState extends State { fontWeight: FontWeight.w600, fontSize: 16, ), - ), + ).paddingOnly(top: 17, bottom: 17), ), ), ), @@ -262,8 +259,6 @@ class _AnswerContentState extends State { updateOption(2, true); }, child: Container( - height: 60, - width: MediaQuery.of(context).size.width - 75, alignment: Alignment.centerLeft, decoration: getContainerColor(2), child: Center( @@ -274,7 +269,7 @@ class _AnswerContentState extends State { fontWeight: FontWeight.w600, fontSize: 16, ), - ), + ).paddingOnly(top: 17, bottom: 17), ), ), ), @@ -293,8 +288,6 @@ class _AnswerContentState extends State { updateOption(3, true); }, child: Container( - height: 60, - width: MediaQuery.of(context).size.width - 75, alignment: Alignment.centerLeft, decoration: getContainerColor(3), child: Center( @@ -305,7 +298,7 @@ class _AnswerContentState extends State { fontWeight: FontWeight.w600, fontSize: 16, ), - ), + ).paddingOnly(top: 17, bottom: 17), ), ), ), From ea676e19ca319bb299b15e39406329f9e925ad2c Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 3 Nov 2022 14:39:33 +0300 Subject: [PATCH 06/23] JIRA Fixes --- assets/images/monthly_attendance.svg | 6 +++--- lib/ui/attendance/monthly_attendance_screen.dart | 1 - lib/ui/landing/widget/services_widget.dart | 4 ++-- lib/ui/my_team/view_attendance.dart | 1 - lib/ui/work_list/worklist_detail_screen.dart | 3 ++- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/assets/images/monthly_attendance.svg b/assets/images/monthly_attendance.svg index c84a9a1..b77ccc3 100644 --- a/assets/images/monthly_attendance.svg +++ b/assets/images/monthly_attendance.svg @@ -7,9 +7,9 @@ - - - + + + diff --git a/lib/ui/attendance/monthly_attendance_screen.dart b/lib/ui/attendance/monthly_attendance_screen.dart index 439a5f4..de35da0 100644 --- a/lib/ui/attendance/monthly_attendance_screen.dart +++ b/lib/ui/attendance/monthly_attendance_screen.dart @@ -287,7 +287,6 @@ class _MonthlyAttendanceScreenState extends State { cellBorderColor: Colors.white, selectionDecoration: BoxDecoration( border: Border.all(color: MyColors.white, width: 10), - borderRadius: const BorderRadius.all(Radius.circular(100)), shape: BoxShape.circle, ), dataSource: MeetingDataSource(_getDataSource()), diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index d822920..0b257c5 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -22,8 +22,8 @@ class ServicesWidget extends StatelessWidget { "assets/images/monthly_attendance.svg", "assets/images/monthly_attendance.svg", "assets/images/ticket_request.svg", - "assets/images/ticket_request.svg", - "assets/images/ticket_request.svg", + "assets/images/ticket_bal.svg", + "assets/images/vacation_rule.svg", "assets/images/ticket_request.svg", "assets/images/ticket_request.svg", "assets/images/ticket_request.svg" diff --git a/lib/ui/my_team/view_attendance.dart b/lib/ui/my_team/view_attendance.dart index c77b1b4..90414d1 100644 --- a/lib/ui/my_team/view_attendance.dart +++ b/lib/ui/my_team/view_attendance.dart @@ -283,7 +283,6 @@ class _ViewAttendanceState extends State { cellBorderColor: Colors.white, selectionDecoration: BoxDecoration( border: Border.all(color: MyColors.white, width: 10), - borderRadius: const BorderRadius.all(Radius.circular(100)), shape: BoxShape.circle, ), dataSource: MeetingDataSource(_getDataSource()), diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 0e769e7..de7c152 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -846,6 +846,8 @@ class _WorkListDetailScreenState extends State { void getAttachments() async { try { + isAttachmentLoaded = false; + getAttachmentList.clear(); // if (apiCallCount == 0) Utils.showLoading(context); // apiCallCount++; getAttachmentList = await WorkListApiClient().getAttachments(workListData!.nOTIFICATIONID!); @@ -868,7 +870,6 @@ class _WorkListDetailScreenState extends State { 'assets/lottie/loading.json', repeat: true, reverse: false, - fit: BoxFit.contain, ); } } From 8f088c78da1c1a66b37e8521f9dba9cf8dd585fb Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Thu, 3 Nov 2022 15:24:59 +0300 Subject: [PATCH 07/23] Position Fix --- lib/ui/marathon/widgets/marathon_banner.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart index 379df20..6fcb514 100644 --- a/lib/ui/marathon/widgets/marathon_banner.dart +++ b/lib/ui/marathon/widgets/marathon_banner.dart @@ -115,9 +115,8 @@ class MarathonBanner extends StatelessWidget { ], ), ), - Positioned( - top: 0, - left: 0, + Align( + alignment: Alignment.topLeft, child: SizedBox( height: 20, width: 35, @@ -136,7 +135,7 @@ class MarathonBanner extends StatelessWidget { ), ), ), - ).paddingOnly(top: 3), + ).paddingOnly(top: 5), !AppState().isArabic(context) ? Positioned( right: 0, From c0e7bc7c7da84d691b9e35c25bca4dce9f558b94 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 6 Nov 2022 11:23:56 +0300 Subject: [PATCH 08/23] Last Login fixes --- lib/ui/login/verify_last_login_screen.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ui/login/verify_last_login_screen.dart b/lib/ui/login/verify_last_login_screen.dart index 6e51e51..0b07b43 100644 --- a/lib/ui/login/verify_last_login_screen.dart +++ b/lib/ui/login/verify_last_login_screen.dart @@ -58,7 +58,8 @@ class _VerifyLastLoginScreenState extends State { @override Widget build(BuildContext context) { mobileLoginInfoListModel ??= ModalRoute.of(context)!.settings.arguments as GetMobileLoginInfoListModel; - String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!; + // String empName = AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr! : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn!; + String empName = mobileLoginInfoListModel!.employeeName!; return Scaffold( appBar: AppBar( @@ -68,7 +69,7 @@ class _VerifyLastLoginScreenState extends State { ? LocaleKeys.viewBusinessCard.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() { showMDialog(context, child: BusinessCardDialog()); }) - : null, + : Container(), actions: [ Center( child: LocaleKeys.employeeDigitalID.tr().toText12(color: MyColors.textMixColor, isUnderLine: true).onPress(() { From fe8c6f90600166df69f192c76022b2a1380048f6 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Sun, 6 Nov 2022 12:54:19 +0300 Subject: [PATCH 09/23] Updated Marathon Banner Design --- assets/images/marathon_banner_bg.svg | 254 ++++++++++--------- lib/classes/colors.dart | 1 + lib/ui/marathon/widgets/countdown_timer.dart | 12 +- lib/ui/marathon/widgets/marathon_banner.dart | 14 +- 4 files changed, 142 insertions(+), 139 deletions(-) diff --git a/assets/images/marathon_banner_bg.svg b/assets/images/marathon_banner_bg.svg index 9053afc..767a78c 100644 --- a/assets/images/marathon_banner_bg.svg +++ b/assets/images/marathon_banner_bg.svg @@ -28,87 +28,91 @@ - + + + + + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - + + - + - + - + @@ -117,121 +121,121 @@ - - + + - + - + - - - - - - - - - - + + + + + + + + + + - - + + - + - - - - + + + + - - + + - + - - + + - + - - - + + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - + - - + + - + - - - + + + - + - + - + @@ -239,19 +243,19 @@ - - - - - - - - + + + + + + + + - - + + - + @@ -271,10 +275,10 @@ - + - - + + @@ -302,8 +306,8 @@ - - + + diff --git a/lib/classes/colors.dart b/lib/classes/colors.dart index ad91de7..b77e7b1 100644 --- a/lib/classes/colors.dart +++ b/lib/classes/colors.dart @@ -59,4 +59,5 @@ class MyColors { static const Color greyC4Color = Color(0xffC4C4C4); static const Color grey35Color = Color(0xff535353); static const Color grey9DColor = Color(0xff9D9D9D); + static const Color darkDigitColor = Color(0xff2D2F39); } diff --git a/lib/ui/marathon/widgets/countdown_timer.dart b/lib/ui/marathon/widgets/countdown_timer.dart index f5eb92f..93db057 100644 --- a/lib/ui/marathon/widgets/countdown_timer.dart +++ b/lib/ui/marathon/widgets/countdown_timer.dart @@ -14,25 +14,23 @@ class BuildCountdownTimer extends StatelessWidget { final MarathonProvider provider; final int screenFlag; - const BuildCountdownTimer({ + BuildCountdownTimer({ Key? key, required this.provider, required this.timeToMarathon, required this.screenFlag, }) : super(key: key); - final TextStyle styleTextHome = const TextStyle( - // fontSize: 7, - color: MyColors.greyACColor, + final TextStyle styleTextHome = TextStyle( + color: MyColors.grey3AColor.withOpacity(0.45), fontStyle: FontStyle.italic, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w800, letterSpacing: -0.4, ); final TextStyle styleDigitHome = const TextStyle( height: 23 / 27, - color: MyColors.white, - // fontSize: 24, + color: MyColors.darkDigitColor, fontStyle: FontStyle.italic, letterSpacing: -1.44, fontWeight: FontWeight.bold, diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart index 6fcb514..10fe17d 100644 --- a/lib/ui/marathon/widgets/marathon_banner.dart +++ b/lib/ui/marathon/widgets/marathon_banner.dart @@ -46,7 +46,7 @@ class MarathonBanner extends StatelessWidget { child: Container( width: 65, height: 32, - color: MyColors.gradiantStartColor, + color: MyColors.darkDigitColor, ), ), ), @@ -80,20 +80,20 @@ class MarathonBanner extends StatelessWidget { LocaleKeys.getReadyForContest.tr(), minFontSize: 08, maxFontSize: 11, - style: const TextStyle( + style: TextStyle( fontStyle: FontStyle.italic, fontWeight: FontWeight.w600, - color: MyColors.lightGreyEFColor, + color: MyColors.grey3AColor.withOpacity(0.8), letterSpacing: -0.4, ), ), - const AutoSizeText( + AutoSizeText( "Saudi Arabia", style: TextStyle( fontStyle: FontStyle.italic, fontSize: 19, fontWeight: FontWeight.bold, - color: MyColors.lightGreyEFColor, + color: MyColors.grey3AColor.withOpacity(0.8), height: 32 / 22, ), ), @@ -142,7 +142,7 @@ class MarathonBanner extends StatelessWidget { bottom: 0, child: RotatedBox( quarterTurns: 4, - child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white), + child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkDigitColor), ).paddingAll(15), ) : Positioned( @@ -150,7 +150,7 @@ class MarathonBanner extends StatelessWidget { left: 0, child: RotatedBox( quarterTurns: 2, - child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white), + child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.darkDigitColor), ).paddingAll(15), ), ], From b2e03b26477bd2e66db8bfaf1ede05cb2a9ae8f6 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Sun, 6 Nov 2022 14:34:12 +0300 Subject: [PATCH 10/23] Added attendance svg --- assets/images/attendance.svg | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 assets/images/attendance.svg diff --git a/assets/images/attendance.svg b/assets/images/attendance.svg new file mode 100644 index 0000000..974fba3 --- /dev/null +++ b/assets/images/attendance.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From 034436425a8d2686c245f3933492af7969fdb794 Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Sun, 6 Nov 2022 17:18:42 +0300 Subject: [PATCH 11/23] Added success tone --- assets/audio/success_tone_android.mp3 | Bin 0 -> 21741 bytes assets/audio/success_tone_ios.caf | Bin 0 -> 254144 bytes lib/ui/dialogs/success_dialog.dart | 55 ++++++++++++++++++++++---- pubspec.yaml | 2 + 4 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 assets/audio/success_tone_android.mp3 create mode 100644 assets/audio/success_tone_ios.caf diff --git a/assets/audio/success_tone_android.mp3 b/assets/audio/success_tone_android.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b8ad93f95e2b4628ce07ba6493e9f7f96584d660 GIT binary patch literal 21741 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/ui/dialogs/success_dialog.dart b/lib/ui/dialogs/success_dialog.dart index 8e1de54..5150110 100644 --- a/lib/ui/dialogs/success_dialog.dart +++ b/lib/ui/dialogs/success_dialog.dart @@ -1,11 +1,41 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:just_audio/just_audio.dart'; import 'package:lottie/lottie.dart'; -class SuccessDialog extends StatelessWidget { +class SuccessDialog extends StatefulWidget { bool isFromDashboard; SuccessDialog(this.isFromDashboard); + @override + State createState() => _SuccessDialogState(); +} + +class _SuccessDialogState extends State with TickerProviderStateMixin { + late AnimationController _controller; + + @override + void initState() { + _controller = AnimationController(vsync: this); + + super.initState(); + } + + Future playSuccessSound() async { + AudioPlayer player = AudioPlayer(); + String audioAsset = ""; + if (Platform.isAndroid) { + audioAsset = "assets/audio/success_tone_android.mp3"; + } else { + audioAsset = "assets/audio/success_tone_ios.caf"; + } + await player.setAsset(audioAsset); + await player.load(); + player.play(); + } + @override Widget build(BuildContext context) { double size = MediaQuery.of(context).size.width / 1.8; @@ -18,13 +48,22 @@ class SuccessDialog extends StatelessWidget { width: size, height: size, child: Card( - child: Lottie.asset('assets/lottie/lt_success.json', repeat: false, reverse: false, onLoaded: (v) { - print("calling_lottie " + v.seconds.toString()); - Future.delayed(Duration(seconds: 2)).then((value) { - Navigator.pop(context); - if (isFromDashboard) Navigator.pop(context); - }); - }), + child: Lottie.asset( + 'assets/lottie/lt_success.json', + repeat: false, + reverse: false, + controller: _controller, + onLoaded: (LottieComposition v) async { + print("calling_lottie " + v.seconds.toString()); + await playSuccessSound(); + _controller + ..duration = v.duration + ..forward().whenComplete(() async { + Navigator.pop(context); + if (widget.isFromDashboard) Navigator.pop(context); + }); + }, + ), ), ), ], diff --git a/pubspec.yaml b/pubspec.yaml index 633edd7..16c5737 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -92,6 +92,7 @@ dependencies: video_player: ^2.4.7 + just_audio: ^0.9.30 dev_dependencies: flutter_test: @@ -124,6 +125,7 @@ flutter: - assets/langs/ - assets/icons/ - assets/lottie/ + - assets/audio/ - assets/images/ - assets/images/login/ - assets/icons/chat/ From 28a882a2f6455f9636ebc15a42c2a97b2c3cfedf Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 6 Nov 2022 17:44:15 +0300 Subject: [PATCH 12/23] Updates & Fixes --- lib/ui/landing/widget/missing_swipe.dart | 8 --- .../leave_balance/leave_balance_screen.dart | 27 ++++++--- .../dynamic_listview_screen.dart | 58 ++++++++++++++++--- lib/ui/work_list/worklist_detail_screen.dart | 3 +- .../dialogs/accept_reject_input_dialog.dart | 16 ++--- 5 files changed, 78 insertions(+), 34 deletions(-) diff --git a/lib/ui/landing/widget/missing_swipe.dart b/lib/ui/landing/widget/missing_swipe.dart index ebd011a..c5bc4fb 100644 --- a/lib/ui/landing/widget/missing_swipe.dart +++ b/lib/ui/landing/widget/missing_swipe.dart @@ -1,20 +1,12 @@ -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:mohem_flutter_app/classes/colors.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/dashboard/menu_entries.dart'; -import 'package:mohem_flutter_app/models/dashboard/menus.dart'; import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; -import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; -import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; -import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:provider/provider.dart'; class MissingSwipe extends StatelessWidget { diff --git a/lib/ui/leave_balance/leave_balance_screen.dart b/lib/ui/leave_balance/leave_balance_screen.dart index f3a1f91..548ca99 100644 --- a/lib/ui/leave_balance/leave_balance_screen.dart +++ b/lib/ui/leave_balance/leave_balance_screen.dart @@ -62,7 +62,7 @@ class _LeaveBalanceState extends State { physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), children: [ - BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true), + BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true), 12.height, absenceTransList == null ? const SizedBox() @@ -76,14 +76,23 @@ class _LeaveBalanceState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - ItemDetailView(LocaleKeys.startDateT.tr(), absenceTransList![index].sTARTDATE ?? ""), - ItemDetailView(LocaleKeys.endDateT.tr(), absenceTransList![index].eNDDATE ?? ""), - ItemDetailView(LocaleKeys.absenceType.tr(), absenceTransList![index].aBSENCETYPE ?? ""), - ItemDetailView(LocaleKeys.absenceCategory.tr(), absenceTransList![index].aBSENCECATEGORY ?? ""), - ItemDetailView(LocaleKeys.days.tr(), absenceTransList![index].aBSENCEDAYS?.toString() ?? ""), - ItemDetailView(LocaleKeys.hours.tr(), absenceTransList![index].aBSENCEHOURS?.toString() ?? ""), - ItemDetailView(LocaleKeys.approvalStatus.tr(), absenceTransList![index].aPPROVALSTATUS ?? ""), - ItemDetailView(LocaleKeys.absenceStatus.tr(), absenceTransList![index].aBSENCESTATUS ?? ""), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.startDateT.tr(), absenceTransList![index].sTARTDATE ?? ""), + ItemDetailViewCol(LocaleKeys.endDateT.tr(), absenceTransList![index].eNDDATE ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.absenceType.tr(), absenceTransList![index].aBSENCETYPE ?? ""), + ItemDetailViewCol(LocaleKeys.absenceCategory.tr(), absenceTransList![index].aBSENCECATEGORY ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.days.tr(), absenceTransList![index].aBSENCEDAYS?.toString() ?? ""), + ItemDetailViewCol(LocaleKeys.hours.tr(), absenceTransList![index].aBSENCEHOURS?.toString() ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.approvalStatus.tr(), absenceTransList![index].aPPROVALSTATUS ?? ""), + ItemDetailViewCol(LocaleKeys.absenceStatus.tr(), absenceTransList![index].aBSENCESTATUS ?? ""), + isItLast: true, + ), ], ).objectContainerView(), separatorBuilder: (cxt, index) => 12.height, diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart index 57b61d9..bdfb391 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -62,6 +62,17 @@ class _DynamicListViewScreenState extends State { late bool isTicketRequest; + List getEITWidgetsList(List? collectionTransaction) { + List itemsList = []; + + for (int t = 0; t < (collectionTransaction ?? []).length; t++) { + if (collectionTransaction![t].dISPLAYFLAG == "Y") { + itemsList.add(ItemDetailViewCol(collectionTransaction[t].sEGMENTPROMPT!, collectionTransaction[t].sEGMENTVALUEDSP ?? "")); + } + } + return itemsList; + } + @override Widget build(BuildContext context) { if (dynamicParams == null) { @@ -84,16 +95,45 @@ class _DynamicListViewScreenState extends State { 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 ?? ""), - ], + : GridView( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 1.9 / 0.75), + padding: const EdgeInsets.all(12.0), + shrinkWrap: true, + primary: false, + physics: const ScrollPhysics(), + children: getEITWidgetsList(getEITTransactionList![parentIndex].collectionTransaction), ).objectContainerView(), + // 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 ?? ""), + // // GridView( + // // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), + // // padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 12), + // // shrinkWrap: true, + // // primary: false, + // // physics: const ScrollPhysics(), + // // children: getEITWidgetsList(getEITTransactionList![parentIndex].collectionTransaction), + // // ) + // // ItemDetailViewCol(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, + // // getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), + // + // // GridView( + // // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), + // // padding: const EdgeInsets.only(left: 21, right: 21, bottom: 21, top: 12), + // // shrinkWrap: true, + // // primary: false, + // // physics: const ScrollPhysics(), + // // children: getEITWidgetsList(getEITTransactionList![parentIndex].collectionTransaction), + // // ) + // // ItemDetailView(getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, + // // getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), + // ], + // ).objectContainerView(), separatorBuilder: (cxt, index) => 12.height, itemCount: getEITTransactionList!.length)), ], diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index de7c152..4dd9a04 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -425,7 +425,8 @@ class _WorkListDetailScreenState extends State { child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); break; case "REJECT": - performNetworkCall(context, email: "", userId: ""); + // performNetworkCall(context, email: "", userId: ""); + performAction(notificationButton.bUTTONACTION!); break; case "RETURNED": Navigator.pop(context); diff --git a/lib/widgets/dialogs/accept_reject_input_dialog.dart b/lib/widgets/dialogs/accept_reject_input_dialog.dart index db9c5d6..0008a1d 100644 --- a/lib/widgets/dialogs/accept_reject_input_dialog.dart +++ b/lib/widgets/dialogs/accept_reject_input_dialog.dart @@ -88,16 +88,18 @@ class AcceptRejectInputDialog extends StatelessWidget { ).expanded, 10.width, DefaultButton( - actionMode == "REJECTED" ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(), + (actionMode == "REJECTED" || actionMode == "REJECT") ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(), () { - if(note.isNotEmpty) { - Navigator.pop(context); - onTap(note); - } else { - Utils.showToast(LocaleKeys.pleaseEnterComments.tr()); + if (note.isEmpty) { + if (actionMode == "APPROVED" || actionMode == "APPROVE") { + Navigator.pop(context); + onTap(note); + } else { + Utils.showToast(LocaleKeys.pleaseEnterComments.tr()); + } } }, - colors: actionMode == "REJECTED" + colors: (actionMode == "REJECTED" || actionMode == "REJECT") ? const [ Color(0xffE47A7E), Color(0xffE47A7E), From b834c52b5fbbd695b5ab48501e478f089cec5963 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 7 Nov 2022 12:04:42 +0300 Subject: [PATCH 13/23] Updated Profile screen --- lib/ui/profile/profile_screen.dart | 76 +++++++++++++++++------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/lib/ui/profile/profile_screen.dart b/lib/ui/profile/profile_screen.dart index 0bf007e..0a78873 100644 --- a/lib/ui/profile/profile_screen.dart +++ b/lib/ui/profile/profile_screen.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'dart:ui'; import 'package:easy_localization/easy_localization.dart'; @@ -16,6 +17,7 @@ import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/ui/profile/widgets/profile_panel.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; +import 'package:mohem_flutter_app/widgets/image_picker.dart'; class ProfileScreen extends StatefulWidget { const ProfileScreen({Key? key}) : super(key: key); @@ -28,6 +30,7 @@ class _ProfileScreenState extends State { late MemberInformationListModel memberInformationList; final ImagePicker _picker = ImagePicker(); List getEmployeeBasicDetailsList = []; + List images = []; @override void initState() { @@ -46,24 +49,25 @@ class _ProfileScreenState extends State { children: [ memberInformationList!.eMPLOYEEIMAGE != null ? Container( - height: 300, - margin: const EdgeInsets.only(top: 50), - decoration: BoxDecoration( - image: DecorationImage( - image: MemoryImage( - Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!), + height: 300, + margin: const EdgeInsets.only(top: 50), + decoration: BoxDecoration( + image: DecorationImage( + image: MemoryImage( + Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!), + ), + fit: BoxFit.cover), ), - fit: BoxFit.cover), - ), - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), - child: Container( - color: Colors.white.withOpacity(0.0), - ), - ), - ): Container( - decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)), - ), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: Container( + color: Colors.white.withOpacity(0.0), + ), + ), + ) + : Container( + decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)), + ), SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( @@ -83,7 +87,14 @@ class _ProfileScreenState extends State { ), InkWell( onTap: () { - startImageSheet(); + // startImageSheet(); + ImageOptions.showImageOptionsNew(context, false, (String image, File file) { + setState(() { + // images.add(image); + Navigator.of(context).pop(); + openGallery(image); + }); + }); }, child: Container( padding: const EdgeInsets.only(left: 17, right: 17, top: 8, bottom: 8), @@ -112,7 +123,8 @@ class _ProfileScreenState extends State { } void startImageSheet() { - showMyBottomSheet(context, callBackFunc: (){}, + showMyBottomSheet(context, + callBackFunc: () {}, child: Column( children: [ Container( @@ -123,14 +135,14 @@ class _ProfileScreenState extends State { )), BottomSheetItem( onTap: () { - openGallery(false); + // openGallery(false); }, title: 'Open Gallery', icon: Icons.browse_gallery_outlined, ), BottomSheetItem( onTap: () { - openGallery(true); + // openGallery(true); }, title: 'Open Camera', icon: Icons.camera, @@ -139,19 +151,17 @@ class _ProfileScreenState extends State { )); } - void openGallery(bool isCamera) async { - XFile? image = await _picker.pickImage(source: isCamera ? ImageSource.camera : ImageSource.gallery); + void openGallery(String image) async { + // XFile? image = await _picker.pickImage(source: isCamera ? ImageSource.camera : ImageSource.gallery); - if (image != null) { - String img = base64.encode(await image!.readAsBytes()); - Utils.showLoading(context); - dynamic empImageUpdteResp = await ProfileApiClient().updateEmpImage(img); - Utils.hideLoading(context); - if (empImageUpdteResp['P_RETURN_STATUS'] == 'S') { - setState(() { - memberInformationList.eMPLOYEEIMAGE = img; - }); - } + // String img = base64.encode(await image!.readAsBytes()); + Utils.showLoading(context); + dynamic empImageUpdteResp = await ProfileApiClient().updateEmpImage(image); + Utils.hideLoading(context); + if (empImageUpdteResp['P_RETURN_STATUS'] == 'S') { + setState(() { + memberInformationList.eMPLOYEEIMAGE = image; + }); } } } From c83f0c11994aa5f93259d91431fbf06ac5c89230 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Tue, 8 Nov 2022 08:13:05 +0300 Subject: [PATCH 14/23] fix issues --- lib/api/profile_api_client.dart | 2 +- lib/models/get_employee_address_model.dart | 2 +- lib/models/profile/get_address_dff_structure_list.dart | 6 +++--- .../dynamic_screens/dynamic_input_screen.dart | 10 +++++----- .../dynamic_screens/dynamic_input_address_screen.dart | 5 ++--- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index d7ceba0..210d179 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -293,7 +293,7 @@ class ProfileApiClient { "P_COUNTRY_CODE": countryCode, //"SA", "P_DESC_FLEX_CONTEXT_CODE": "SA", "P_FUNCTION_NAME": pFunctionName, - "P_ACTION": correctOrNew == 1 ? 'CORRECT' : 'NEW', + "P_ACTION": correctOrNew == 1 ? 'CORRECT' : 'CHANGE', "P_EFFECTIVE_DATE": effectiveDate, //"EITTransactionTBL": list, diff --git a/lib/models/get_employee_address_model.dart b/lib/models/get_employee_address_model.dart index 8531ced..71c5885 100644 --- a/lib/models/get_employee_address_model.dart +++ b/lib/models/get_employee_address_model.dart @@ -5,7 +5,7 @@ String? dATATYPE; String? dATEVALUE; String? dISPLAYFLAG; - Null? nUMBERVALUE; + dynamic? nUMBERVALUE; String? sEGMENTPROMPT; int? sEGMENTSEQNUM; String? sEGMENTVALUEDSP; diff --git a/lib/models/profile/get_address_dff_structure_list.dart b/lib/models/profile/get_address_dff_structure_list.dart index 786e683..61f6b5e 100644 --- a/lib/models/profile/get_address_dff_structure_list.dart +++ b/lib/models/profile/get_address_dff_structure_list.dart @@ -5,7 +5,7 @@ class GetAddressDffStructureList { String? aLPHANUMERICALLOWEDFLAG; String? aPPLICATIONCOLUMNNAME; String? cHILDSEGMENTSVS; - Null? cHILDSEGMENTSVSSplited; + dynamic? cHILDSEGMENTSVSSplited; String? dEFAULTTYPE; String? dEFAULTVALUE; String? dESCFLEXCONTEXTCODE; @@ -27,9 +27,9 @@ class GetAddressDffStructureList { String? nUMBERPRECISION; String? nUMERICMODEENABLEDFLAG; String? pARENTSEGMENTSDV; - List? pARENTSEGMENTSDVSplited; + List? pARENTSEGMENTSDVSplited; String? pARENTSEGMENTSVS; - List? pARENTSEGMENTSVSSplitedVS; + List? pARENTSEGMENTSVSSplitedVS; String? rEADONLY; String? rEQUIREDFLAG; String? sEGMENTNAME; diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index c1b8a43..0a6c9d4 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -136,7 +136,7 @@ class _DynamicInputScreenState extends State { } Future getDefaultValues(GetEITDFFStructureList structureList) async { - // try { + try { Utils.showLoading(context); for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; @@ -163,10 +163,10 @@ class _DynamicInputScreenState extends State { await Future.delayed(const Duration(seconds: 1)); Utils.hideLoading(context); setState(() {}); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } } // List> calGetValueSetValuesIonicLogic(GetEITDFFStructureList structureElement) { diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart index cc8e861..ecc2426 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart @@ -266,16 +266,15 @@ class _DynamicInputScreenState extends State { if (e.fORMATTYPE == "X") { // for date format type, date format is changed tempVar = e.eSERVICESDV?.pVALUECOLUMNNAME ?? ""; - if (tempVar.isNotEmpty) { DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - tempVar = DateFormat('dd/MMM/yyy').format(date); + tempVar = DateFormat('dd-MMM-yyy').format(date); if (e.aPPLICATIONCOLUMNNAME == null) { effectiveDate = tempVar; } } } else if (e.eSERVICESVS?.isNotEmpty ?? false) { - tempVar = e.getEmployeeAddressList!.vARCHAR2VALUE!; + tempVar = e.getEmployeeAddressList!.vARCHAR2VALUE ?? ""; if (e.aPPLICATIONCOLUMNNAME == null) { countryCode = tempVar; } From 965edf9141730de2a70cc75be10930ab5e49f7fc Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Tue, 8 Nov 2022 10:20:08 +0300 Subject: [PATCH 15/23] fix issues --- .../profile/dynamic_screens/dynamic_input_address_screen.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart index 6933a28..ecc2426 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart @@ -266,7 +266,6 @@ class _DynamicInputScreenState extends State { if (e.fORMATTYPE == "X") { // for date format type, date format is changed tempVar = e.eSERVICESDV?.pVALUECOLUMNNAME ?? ""; - if (tempVar.isNotEmpty) { DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); tempVar = DateFormat('dd-MMM-yyy').format(date); @@ -275,7 +274,7 @@ class _DynamicInputScreenState extends State { } } } else if (e.eSERVICESVS?.isNotEmpty ?? false) { - e.getEmployeeAddressList!.vARCHAR2VALUE != null ? tempVar = e.getEmployeeAddressList!.vARCHAR2VALUE! : tempVar = ""; + tempVar = e.getEmployeeAddressList!.vARCHAR2VALUE ?? ""; if (e.aPPLICATIONCOLUMNNAME == null) { countryCode = tempVar; } From a0201efbfb084e6e800b39f6af0b6b7de6d0a5dc Mon Sep 17 00:00:00 2001 From: Sultan khan <> Date: Tue, 8 Nov 2022 10:24:05 +0300 Subject: [PATCH 16/23] dynamic screen updated --- .../dynamic_screens/dynamic_input_screen.dart | 259 ++++++++++-------- lib/ui/profile/add_update_family_member.dart | 171 ++++++------ lib/ui/screens/my_requests/new_request.dart | 4 +- 3 files changed, 242 insertions(+), 192 deletions(-) diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 1c97b28..01895a7 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -57,51 +57,51 @@ class _DynamicInputScreenState extends State { } void validateTransaction() async { - try { - Utils.showLoading(context); - List> values = getEitDffStructureList!.map((e) { - String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; - if (e.fORMATTYPE == "X") { - // for date format type, date format is changed - tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; - if (tempVar.isNotEmpty) { - if (!tempVar.contains("/")) { - DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); - } + /// try { + Utils.showLoading(context); + List> values = getEitDffStructureList!.map((e) { + String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + if (e.fORMATTYPE == "X") { + // for date format type, date format is changed + tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + if (tempVar.isNotEmpty) { + if (!tempVar.contains("/")) { + DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); } } - // else if (e.fORMATTYPE == "N") { - // // for date format type, date format is changed - // tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; - // print("------------------------sEGMENTNAME:${e.sEGMENTNAME}"); - // print("------------------------tempVar:$tempVar"); - // if (tempVar.isNotEmpty) { - // if (!tempVar.contains("/")) { - // DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - // tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); - // } - // } - // } - return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); - }).toList(); - - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); - - genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); - SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); - Utils.hideLoading(context); - await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, - arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); - Utils.showLoading(context); - await LeaveBalanceApiClient().cancelHrTransaction(submitEITTransactionList.pTRANSACTIONID!); - Utils.hideLoading(context); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } + } + // else if (e.fORMATTYPE == "N") { + // // for date format type, date format is changed + // tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + // print("------------------------sEGMENTNAME:${e.sEGMENTNAME}"); + // print("------------------------tempVar:$tempVar"); + // if (tempVar.isNotEmpty) { + // if (!tempVar.contains("/")) { + // DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + // tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + // } + // } + // } + return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); + }).toList(); + + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); + + genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); + SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); + Utils.hideLoading(context); + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitEITTransactionList.pTRANSACTIONID!); + Utils.hideLoading(context); + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // } } String dESCFLEXCONTEXTCODE = ""; @@ -119,6 +119,19 @@ class _DynamicInputScreenState extends State { sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); + + // if (structureList.pARENTSEGMENTSVSSplitedVS!.isNotEmpty) { + // structureList.pARENTSEGMENTSVSSplitedVS!.forEach((element2) { + // filteredList = getEitDffStructureList?.where((element) => element.sEGMENTNAME == element2.name).toList() ?? []; + // values = filteredList + // .map((e) => GetSetValuesRequestModel( + // sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) + // .toJson()) + // .toList(); + // }); + // List filteredList2 = getEitDffStructureList?.where((element) => element.fLEXVALUESETNAME == structureList.fLEXVALUESETNAME).toList() ?? []; + // } + List eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List abc = genericResponseModel?.getEITDFFStructureList ?? []; getEitDffStructureList = abc; @@ -158,6 +171,25 @@ class _DynamicInputScreenState extends State { ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, getSetList); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); getEitDffStructureList![index].eSERVICESDV = defaultValue; + GetEITDFFStructureList defaultValueCheck = getEitDffStructureList!.where((GetEITDFFStructureList element) => element.sEGMENTNAME == segmentId).toList().first; + + if (defaultValueCheck.cHILDSEGMENTSDVSplited!.isNotEmpty && defaultValueCheck.rEADONLY == 'Y') { + getDefaultValues(defaultValueCheck); + Utils.hideLoading(context); + + // GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); + // List> getSetList = getDefaultValuesIonicLogic(parent); + // ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, defaultValueCheck.dESCFLEXCONTEXTCODE!, defaultValueCheck.dESCFLEXNAME!, getSetList); + // int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); + // getEitDffStructureList![index].eSERVICESDV = defaultValue; + } else if (defaultValueCheck.cHILDSEGMENTSVSSplited!.isNotEmpty && defaultValueCheck.rEADONLY == 'Y') { + calGetValueSetValues(defaultValueCheck); + Utils.hideLoading(context); + } + } else if (values.isNotEmpty) { + ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); + getEitDffStructureList![index].eSERVICESDV = defaultValue; } } await Future.delayed(const Duration(seconds: 1)); @@ -180,79 +212,79 @@ class _DynamicInputScreenState extends State { // } List> getDefaultValuesIonicLogic(GetEITDFFStructureList structureElement) { - try { - List parentValue = structureElement.pARENTSEGMENTSVSSplitedVS ?? []; - List parentsList = structureElement.pARENTSEGMENTSDVSplited ?? []; - - List> dependenciesList = []; - String? parentVal; - bool isStandardDate = false; - bool isStandardTimeDate = false; - bool isStandardTime = false; - bool isHidden = false; - bool isReadOnlyList = false; - bool isSelectElement = false; - - // isStandardDate = this.isStandardDate(obj); - // isStandardTimeDate = this.isStandardDateTime(obj); - // isStandardTime = this.isStandardTime(obj); - if (structureElement.dISPLAYFLAG == "N") isHidden = true; - if (structureElement.vALIDATIONTYPE != "N" && structureElement.rEADONLY == "Y") { - isReadOnlyList = true; - } - if (structureElement.vALIDATIONTYPE != "N" && structureElement.rEADONLY == "N") { - isSelectElement = true; - } + //try { + List parentValue = structureElement.pARENTSEGMENTSVSSplitedVS ?? []; + List parentsList = structureElement.pARENTSEGMENTSDVSplited ?? []; + + List> dependenciesList = []; + String? parentVal; + bool isStandardDate = false; + bool isStandardTimeDate = false; + bool isStandardTime = false; + bool isHidden = false; + bool isReadOnlyList = false; + bool isSelectElement = false; + + // isStandardDate = this.isStandardDate(obj); + // isStandardTimeDate = this.isStandardDateTime(obj); + // isStandardTime = this.isStandardTime(obj); + if (structureElement.dISPLAYFLAG == "N") isHidden = true; + if (structureElement.vALIDATIONTYPE != "N" && structureElement.rEADONLY == "Y") { + isReadOnlyList = true; + } + if (structureElement.vALIDATIONTYPE != "N" && structureElement.rEADONLY == "N") { + isSelectElement = true; + } - if (parentValue.isNotEmpty && (structureElement.vALIDATIONTYPE == "D" || structureElement.vALIDATIONTYPE == "Y")) { - List parValue = getDependenciesParams(parentValue); + if (parentValue.isNotEmpty && (structureElement.vALIDATIONTYPE == "D" || structureElement.vALIDATIONTYPE == "Y")) { + List parValue = getDependenciesParams(parentValue); - if (parValue.isNotEmpty) { - parentVal = parValue.first.ID_COLUMN_NAME; - } + if (parValue.isNotEmpty) { + parentVal = parValue.first.ID_COLUMN_NAME; + } - if (parentVal == null) { - return []; - } + if (parentVal == null) { + return []; } - if (parentsList.isNotEmpty) { - if (parentValue.isNotEmpty) { - parentsList = parentsList + parentValue.map((e) => PARENTSEGMENTSDVSplited.fromJson(e.toJson())).toList(); - // parentsList.addAll(parentValue.map((e) => PARENTSEGMENTSDVSplited.fromJson(e.toJson()))); - // parentsList.concat(parentValue); - } - dependenciesList = getDependenciesParams(parentsList); + } + if (parentsList.isNotEmpty) { + if (parentValue.isNotEmpty) { + parentsList = parentsList + parentValue.map((e) => PARENTSEGMENTSDVSplited.fromJson(e.toJson())).toList(); + // parentsList.addAll(parentValue.map((e) => PARENTSEGMENTSDVSplited.fromJson(e.toJson()))); + // parentsList.concat(parentValue); } - return dependenciesList; - // for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { - // String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; - // print("segmentId:$segmentId"); - // print("segmentName:${structureList.sEGMENTNAME}"); - // GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); - // List parentDvRequired = parent.pARENTSEGMENTSDVSplited ?? []; - // List parentVsRequired = parent.pARENTSEGMENTSVSSplitedVS ?? []; - // - // List filteredList = - // getEitDffStructureList!.where((outerElement) => parentDvRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); - // - // List> values = filteredList - // .map((e) => GetSetValuesRequestModel( - // sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) - // .toJson()) - // .toList(); - // print("values:$values"); - // - // ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); - // int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); - // getEitDffStructureList![index].eSERVICESDV = defaultValue; - // } - // Utils.hideLoading(context); - // setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - return []; + dependenciesList = getDependenciesParams(parentsList); } + return dependenciesList; + // for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { + // String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; + // print("segmentId:$segmentId"); + // print("segmentName:${structureList.sEGMENTNAME}"); + // GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); + // List parentDvRequired = parent.pARENTSEGMENTSDVSplited ?? []; + // List parentVsRequired = parent.pARENTSEGMENTSVSSplitedVS ?? []; + // + // List filteredList = + // getEitDffStructureList!.where((outerElement) => parentDvRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); + // + // List> values = filteredList + // .map((e) => GetSetValuesRequestModel( + // sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) + // .toJson()) + // .toList(); + // print("values:$values"); + // + // ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + // int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); + // getEitDffStructureList![index].eSERVICESDV = defaultValue; + // } + // Utils.hideLoading(context); + // setState(() {}); + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // return []; + // } } List> getDependenciesParams(parentsList) { @@ -260,7 +292,7 @@ class _DynamicInputScreenState extends State { for (int i = 0; i < parentsList.length; i++) { for (int j = 0; j < (getEitDffStructureList?.length ?? 0); j++) { - if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i].opt1) { + if (getEitDffStructureList![j].sEGMENTNAME == parentsList[i]?.name) { if (getEitDffStructureList![j].dISPLAYFLAG != "N") { if (getEitDffStructureList![j].vALIDATIONTYPE == "N") { String? idColName; @@ -455,6 +487,11 @@ class _DynamicInputScreenState extends State { model.eSERVICESDV ??= ESERVICESDV(); model.eSERVICESDV!.pIDCOLUMNNAME = text; }, + onTap: () async { + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + await getDefaultValues(model); + } + }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "X") { String displayText = model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""); diff --git a/lib/ui/profile/add_update_family_member.dart b/lib/ui/profile/add_update_family_member.dart index 00ad7fc..528e38d 100644 --- a/lib/ui/profile/add_update_family_member.dart +++ b/lib/ui/profile/add_update_family_member.dart @@ -224,8 +224,8 @@ class _AddUpdateFamilyMemberState extends State { onTap: () async { DateTime dateValue = await _selectDate(context); //date = DateFormat('yyyy/MM/dd').format(dateValue); - date = "2022-10-23T09:17:38.653+03:00"; - // date = (DateFormat('yyyy-MM-dd').format(dateValue)+"T"+ dateTime.toString() + dateTime1.toString()); + //date = "2022-10-23T09:17:38.653+03:00"; + date = (DateFormat('yyyy-MM-dd').format(dateValue)); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; print(dateTime); print(dateTime1); @@ -288,7 +288,7 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - date = "2022-10-23T09:17:38.653+03:00"; + date = (DateFormat('yyyy-MM-dd').format(dateValue)); // date = (DateFormat('yyyy-MM-dd').format(dateValue) +"T"+ dateTime.toString() + dateTime1.toString()); // date = DateFormat('yyyy/MM/dd').format(dateValue); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; @@ -349,8 +349,8 @@ class _AddUpdateFamilyMemberState extends State { isEnable: false, onTap: () async { DateTime dateValue = await _selectDate(context); - date = "2022-10-23T09:17:38.653+03:00"; - // date = (DateFormat('yyyy-MM-dd').format(dateValue)+"T"+ dateTime.toString() + dateTime1.toString()); + // date = "2022-10-23T09:17:38.653+03:00"; + date = (DateFormat('yyyy-MM-dd').format(dateValue)); // date = DateFormat('yyyy/MM/dd').format(dateValue); model!.getContactDetailsList!.sEGMENTVALUEDSP = date; setState(() {}); @@ -392,80 +392,93 @@ class _AddUpdateFamilyMemberState extends State { } void submitUpdateForm() async { - // try { - List> values1 = getBasicDetDffStructureList!.map((e) { - String? dateVal = ''; - String? vatcherVal = ''; - int? numberVal; - if (e!.fORMATTYPE == 'N') { - dateVal = null; - vatcherVal = null; - numberVal = int.parse(e.getContactDetailsList!.sEGMENTVALUEDSP??"0"); - } else if (e.fORMATTYPE == 'X') { - dateVal = e!.getContactDetailsList!.sEGMENTVALUEDSP.toString(); - vatcherVal = null; - numberVal = null; - } else { - dateVal = null; - vatcherVal = e!.getContactDetailsList!.sEGMENTVALUEDSP; - numberVal = null; - } - return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: vatcherVal.toString()).toJson(); - }).toList(); - List> values2 = getContactDffStructureList!.map((e) { - String? dateVal = ''; - String? vatcherVal = ''; - int? numberVal; - if (e!.fORMATTYPE == 'N') { - dateVal = null; - vatcherVal = null; - numberVal = int.parse(e.getContactDetailsList!.sEGMENTVALUEDSP??"0"); - } else if (e.fORMATTYPE == 'X') { - dateVal = e!.getContactDetailsList!.sEGMENTVALUEDSP; - vatcherVal = null; - numberVal = null; - } else { - dateVal = null; - numberVal = null; - vatcherVal = e!.getContactDetailsList!.sEGMENTVALUEDSP; - } - return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: vatcherVal.toString()).toJson(); - }).toList(); - List> values3 = getContactColsStructureList!.map((e) { - // String tempVar = e!.getContactDetailsList!.sEGMENTVALUEDSP ?? ""; - String? dateVal = ''; - String? vatcherVal = ''; - int? numberVal; + print("submit"); + try { + List> values1 = getBasicDetDffStructureList!.map((e) { + String? dateVal = ''; + String? varChar = ''; + int? numberVal; + if (e!.fORMATTYPE == 'N') { + dateVal = null; + varChar = null; + numberVal = int.parse(e.getContactDetailsList!.sEGMENTVALUEDSP ?? "0"); + } else if (e.fORMATTYPE == 'X') { + dateVal = e!.getContactDetailsList!.sEGMENTVALUEDSP.toString(); + varChar = null; + numberVal = null; + } else if (e.eSERVICESVS!.isNotEmpty) { + dateVal = null; + varChar = e!.getContactDetailsList!.vARCHAR2VALUE; + numberVal = null; + } else { + dateVal = null; + varChar = e!.getContactDetailsList!.sEGMENTVALUEDSP; + numberVal = null; + } + return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: varChar).toJson(); + }).toList(); + List> values2 = getContactDffStructureList!.map((e) { + String? dateVal = ''; + String? varChar = ''; + int? numberVal; + if (e!.fORMATTYPE == 'N') { + dateVal = null; + varChar = null; + numberVal = int.parse(e.getContactDetailsList!.sEGMENTVALUEDSP ?? "0"); + } else if (e.fORMATTYPE == 'X') { + dateVal = e!.getContactDetailsList!.dATEVALUE; + varChar = null; + numberVal = null; + } else if (e.eSERVICESVS!.isNotEmpty) { + dateVal = null; + varChar = e!.getContactDetailsList!.vARCHAR2VALUE; + numberVal = null; + } else { + dateVal = null; + numberVal = null; + varChar = e!.getContactDetailsList!.sEGMENTVALUEDSP; + } + return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: varChar).toJson(); + }).toList(); + List> values3 = getContactColsStructureList!.map((e) { + // String tempVar = e!.getContactDetailsList!.sEGMENTVALUEDSP ?? ""; + String? dateVal = ''; + dynamic? varChar1 = ''; + int? numberVal; - print("e.dATATYPE:${e?.dATATYPE}"); - if (e!.dATATYPE == 'VARCHAR2') { - dateVal = null; - numberVal = null; - vatcherVal = e.getContactDetailsList?.sEGMENTVALUEDSP ?? ""; - } else if (e.dATATYPE == 'DATE') { - dateVal = e.getContactDetailsList!.sEGMENTVALUEDSP.toString(); - print("dateVal:${dateVal ?? ""}"); - vatcherVal = null; - numberVal = null; - } else if (e.dATATYPE == 'NUMBER') { - dateVal = null; - vatcherVal = null; - numberVal = int.parse(e.getContactDetailsList!.sEGMENTVALUEDSP??"0"); - } else {} - return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: vatcherVal).toJson(); - }).toList(); - List> valuesFinal = [...values1, ...values2, ...values3]; - Utils.showLoading(context); - submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(args['actionType'], args['relationID'] ?? null, valuesFinal); - var transactionId = submitContactTransactionList!.pTRANSACTIONID; - var itemKey = submitContactTransactionList!.pITEMKEY; - Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, - arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), transactionId!.toInt(), itemKey.toString(), 'family_member')); - setState(() {}); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } + print("e.dATATYPE:${e?.dATATYPE}"); + if (e!.dATATYPE == 'VARCHAR2') { + dateVal = null; + numberVal = null; + if (e.objectValuesList != null && e.objectValuesList!.isNotEmpty) { + varChar1 = e.getContactDetailsList?.vARCHAR2VALUE ?? ""; + } else { + varChar1 = e.getContactDetailsList?.sEGMENTVALUEDSP ?? ""; + } + } else if (e.dATATYPE == 'DATE') { + dateVal = e.getContactDetailsList!.sEGMENTVALUEDSP.toString(); + varChar1 = null; + numberVal = null; + } else if (e.dATATYPE == 'NUMBER') { + dateVal = null; + varChar1 = null; + numberVal = int.parse(e.getContactDetailsList!.sEGMENTVALUEDSP ?? "0"); + } + return ValidateEitTransactionModel(dATEVALUE: dateVal, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: numberVal, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: varChar1).toJson(); + }).toList(); + List> valuesFinal = [...values1, ...values2, ...values3]; + Utils.showLoading(context); + submitContactTransactionList = await ProfileApiClient().submitContactTransactionAddAndUpdate(args['actionType'], args['relationID'] ?? null, valuesFinal); + var transactionId = submitContactTransactionList!.pTRANSACTIONID; + var itemKey = submitContactTransactionList!.pITEMKEY; + Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.profile_familyDetails.tr(), transactionId!.toInt(), itemKey.toString(), 'family_member')); + setState(() {}); + } catch (ex) { + print(ex); + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } } } diff --git a/lib/ui/screens/my_requests/new_request.dart b/lib/ui/screens/my_requests/new_request.dart index b476ecc..851b82f 100644 --- a/lib/ui/screens/my_requests/new_request.dart +++ b/lib/ui/screens/my_requests/new_request.dart @@ -84,9 +84,9 @@ class _NewRequestState extends State { 1.divider, DefaultButton(LocaleKeys.submit.tr(), () { // todo need to add submit method + print("hi"); // openNewRequest(); - }) - .insideContainer, + }).insideContainer, ], ), ); From 26ddc0004846a0e36c6770bc27027cd1843aac3e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 8 Nov 2022 11:09:45 +0300 Subject: [PATCH 17/23] Updates & fixes --- lib/api/worklist/worklist_api_client.dart | 10 ++++++ lib/ui/work_list/sheets/delegate_sheet.dart | 35 +++++++++++++++---- .../work_list/sheets/selected_item_sheet.dart | 29 +++++++++------ lib/ui/work_list/worklist_detail_screen.dart | 1 + .../dialogs/accept_reject_input_dialog.dart | 2 +- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 1b00383..5ea1b72 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -481,6 +481,16 @@ class WorkListApiClient { }, url, postParams); } + Future?> getFavoriteReplacementWithImageNew(String selectedFavLetter) async { + String url = "${ApiConsts.erpRest}Mohemm_GetFavoriteReplacements_Images"; + Map postParams = {"ItgFilter": selectedFavLetter}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData.mohemmGetFavoriteReplacementsList; + }, url, postParams); + } + Future changeFavoriteReplacements({required String email, required String employeName, required String image, required String userName, bool isFav = false}) async { String url = "${ApiConsts.erpRest}Mohemm_ChangeFavoriteReplacements"; Map postParamsObj = { diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index bd3b010..6d39fc8 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -91,6 +91,15 @@ class _DelegateSheetState extends State { favUsersList = await WorkListApiClient().getFavoriteReplacementWithImage(selectedFavLetter ?? ""); if (isNeedLoading) Utils.hideLoading(context); setState(() {}); + fetchFavUsersListNew(isNeedLoading: false); + return null; + } + + Future fetchFavUsersListNew({bool isNeedLoading = true}) async { + if (isNeedLoading) Utils.showLoading(context); + favUsersList = await WorkListApiClient().getFavoriteReplacementWithImageNew(selectedFavLetter ?? ""); + if (isNeedLoading) Utils.hideLoading(context); + setState(() {}); return null; } @@ -195,7 +204,7 @@ class _DelegateSheetState extends State { ).onPress(() { showMyBottomSheet( context, - callBackFunc: (){}, + callBackFunc: () {}, child: SearchOptionsSheet( selectedType, onSelection: (String value) { @@ -478,12 +487,24 @@ class _DelegateSheetState extends State { }, child: Row( children: [ - CircularAvatar( - url: actionHistory.employeeImage, - height: 30, - width: 30, - isImageBase64: (actionHistory.employeeImage != null || actionHistory.employeeImage!.isNotEmpty) ? true : false, - ), + actionHistory.employeeImage != "" + ? CircularAvatar( + url: actionHistory.employeeImage, + height: 40, + width: 40, + isImageBase64: (actionHistory.employeeImage != null || actionHistory.employeeImage!.isNotEmpty) ? true : false, + ) + : ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(50), + ), + child: Image.network( + "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", + fit: BoxFit.cover, + height: 40, + width: 40, + ).toShimmer(), + ), 16.width, Expanded( child: (actionHistory.employeeDisplayName ?? "").toText12(), diff --git a/lib/ui/work_list/sheets/selected_item_sheet.dart b/lib/ui/work_list/sheets/selected_item_sheet.dart index e053218..355fee6 100644 --- a/lib/ui/work_list/sheets/selected_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_item_sheet.dart @@ -133,26 +133,33 @@ class SelectedItemSheet extends StatelessWidget { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), - color: Color(0xffF7F7F7), + color: const Color(0xffF7F7F7), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), width: 1, ), ), - padding: EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21), + padding: const EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21), child: Row( children: [ - (actionHistoryList != null && actionHistoryList!.eMPLOYEEIMAGE != null) + (isFav != null && isFav) ? CircularAvatar( - height: 30, - width: 30, - url: actionHistoryList!.eMPLOYEEIMAGE, + height: 40, + width: 40, + url: favoriteReplacements != null ? favoriteReplacements!.employeeImage : actionHistoryList!.eMPLOYEEIMAGE, isImageBase64: true, ) - : CircularAvatar( - height: 30, - width: 30, - ), + : (actionHistoryList != null && actionHistoryList!.eMPLOYEEIMAGE != null) + ? CircularAvatar( + height: 40, + width: 40, + url: actionHistoryList!.eMPLOYEEIMAGE, + isImageBase64: true, + ) + : CircularAvatar( + height: 40, + width: 40, + ), 16.width, Expanded( child: (name ?? "").toText12(), diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 4dd9a04..1d5931d 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -520,6 +520,7 @@ class _WorkListDetailScreenState extends State { } void performAction(String actionMode, {String? title}) { + print(actionMode); showDialog( context: context, builder: (cxt) => AcceptRejectInputDialog( diff --git a/lib/widgets/dialogs/accept_reject_input_dialog.dart b/lib/widgets/dialogs/accept_reject_input_dialog.dart index 0008a1d..e335453 100644 --- a/lib/widgets/dialogs/accept_reject_input_dialog.dart +++ b/lib/widgets/dialogs/accept_reject_input_dialog.dart @@ -91,7 +91,7 @@ class AcceptRejectInputDialog extends StatelessWidget { (actionMode == "REJECTED" || actionMode == "REJECT") ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(), () { if (note.isEmpty) { - if (actionMode == "APPROVED" || actionMode == "APPROVE") { + if (actionMode != "REJECTED" || actionMode != "REJECT") { Navigator.pop(context); onTap(note); } else { From 9bdb6bfb718969ec053e0e8573f6bb4a4c5d703c Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Tue, 8 Nov 2022 11:46:03 +0300 Subject: [PATCH 18/23] Updated Banner Again :D --- assets/images/marathon_banner_bg.svg | 14 +++++--------- lib/ui/marathon/widgets/countdown_timer.dart | 4 ++-- lib/ui/marathon/widgets/marathon_banner.dart | 4 ++-- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/assets/images/marathon_banner_bg.svg b/assets/images/marathon_banner_bg.svg index 767a78c..fb7159d 100644 --- a/assets/images/marathon_banner_bg.svg +++ b/assets/images/marathon_banner_bg.svg @@ -1,4 +1,4 @@ - + @@ -33,10 +33,6 @@ - - - - @@ -53,10 +49,10 @@ - + - + @@ -243,7 +239,7 @@ - + @@ -307,7 +303,7 @@ - + diff --git a/lib/ui/marathon/widgets/countdown_timer.dart b/lib/ui/marathon/widgets/countdown_timer.dart index 93db057..6ab8dba 100644 --- a/lib/ui/marathon/widgets/countdown_timer.dart +++ b/lib/ui/marathon/widgets/countdown_timer.dart @@ -22,7 +22,7 @@ class BuildCountdownTimer extends StatelessWidget { }) : super(key: key); final TextStyle styleTextHome = TextStyle( - color: MyColors.grey3AColor.withOpacity(0.45), + color: MyColors.white.withOpacity(0.45), fontStyle: FontStyle.italic, fontWeight: FontWeight.w800, letterSpacing: -0.4, @@ -30,7 +30,7 @@ class BuildCountdownTimer extends StatelessWidget { final TextStyle styleDigitHome = const TextStyle( height: 23 / 27, - color: MyColors.darkDigitColor, + color: MyColors.white, fontStyle: FontStyle.italic, letterSpacing: -1.44, fontWeight: FontWeight.bold, diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart index 10fe17d..5da5ed2 100644 --- a/lib/ui/marathon/widgets/marathon_banner.dart +++ b/lib/ui/marathon/widgets/marathon_banner.dart @@ -83,7 +83,7 @@ class MarathonBanner extends StatelessWidget { style: TextStyle( fontStyle: FontStyle.italic, fontWeight: FontWeight.w600, - color: MyColors.grey3AColor.withOpacity(0.8), + color: MyColors.white.withOpacity(0.83), letterSpacing: -0.4, ), ), @@ -93,7 +93,7 @@ class MarathonBanner extends StatelessWidget { fontStyle: FontStyle.italic, fontSize: 19, fontWeight: FontWeight.bold, - color: MyColors.grey3AColor.withOpacity(0.8), + color: MyColors.white.withOpacity(0.83), height: 32 / 22, ), ), From 143d0772f281a5cf99407ddbeeef3842b4f3db52 Mon Sep 17 00:00:00 2001 From: Zohaib Iqbal Kambrani <> Date: Tue, 8 Nov 2022 16:43:47 +0300 Subject: [PATCH 19/23] test commit from iMac with nothing special --- pubspec.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pubspec.yaml b/pubspec.yaml index 16c5737..257d80b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -182,3 +182,6 @@ flutter: # # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages + + +# Adding this to test the push from iMac From b9f9c31f01e5a14c5edfe7069292d40e009e57e7 Mon Sep 17 00:00:00 2001 From: Sultan khan <> Date: Wed, 9 Nov 2022 12:39:08 +0300 Subject: [PATCH 20/23] lynx access issue fixed --- .../dynamic_screens/dynamic_input_screen.dart | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 0e71b09..9aafdd8 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -110,16 +110,26 @@ class _DynamicInputScreenState extends State { Future calGetValueSetValues(GetEITDFFStructureList structureList) async { try { Utils.showLoading(context); + List> values = []; String segmentId = structureList.cHILDSEGMENTSVS!; + if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; List filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVSSplited!.contains(segmentId)).toList() ?? []; - List> values = filteredList + + if (filteredList.isEmpty && structureList.cHILDSEGMENTSVSSplited!.isNotEmpty) { + segmentId = structureList.cHILDSEGMENTSVSSplited![0]; + filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVSSplited!.contains(segmentId)).toList() ?? []; + } + values = filteredList .map((e) => GetSetValuesRequestModel( sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); + // if (parentValue.isNotEmpty && (structureList.vALIDATIONTYPE == "F")) { + // values = getDependenciesParams(parentValue); + // } // if (structureList.pARENTSEGMENTSVSSplitedVS!.isNotEmpty) { // structureList.pARENTSEGMENTSVSSplitedVS!.forEach((element2) { // filteredList = getEitDffStructureList?.where((element) => element.sEGMENTNAME == element2.name).toList() ?? []; @@ -135,7 +145,7 @@ class _DynamicInputScreenState extends State { List eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); List abc = genericResponseModel?.getEITDFFStructureList ?? []; getEitDffStructureList = abc; - int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); + int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); getEitDffStructureList![index].eSERVICESVS!.clear(); if (eServicesResponseModel.isNotEmpty) getEitDffStructureList![index].eSERVICESVS!.addAll(eServicesResponseModel); // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; From 21d396b3bb968e2cb5eaa357edf3e948a7369e34 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 9 Nov 2022 14:37:17 +0300 Subject: [PATCH 21/23] Worklist updates --- lib/api/my_attendance_api_client.dart | 16 ++ lib/api/worklist/worklist_api_client.dart | 38 +++- lib/app_state/app_state.dart | 4 + lib/models/generic_response_model.dart | 18 +- lib/models/worklist/GetRFCEmployeeList.dart | 48 +++++ .../get_favorite_replacements_model.dart | 8 +- .../worklist/replacement_list_model.dart | 2 +- .../worklist/resubmit_eit_response_model.dart | 22 +++ .../dynamic_listview_screen.dart | 5 +- lib/ui/work_list/itg_detail_screen.dart | 126 ++++++++++++- .../approval_level_fragment.dart | 3 +- lib/ui/work_list/sheets/delegate_sheet.dart | 37 ++-- .../work_list/sheets/selected_item_sheet.dart | 94 ++++++++-- .../sheets/selected_itg_item_sheet.dart | 5 +- .../sheets/update_continue_sheet.dart | 131 +++++++++++++ lib/ui/work_list/worklist_detail_screen.dart | 175 ++++++++++++++++-- .../dialogs/accept_reject_input_dialog.dart | 5 +- pubspec.yaml | 1 + 18 files changed, 673 insertions(+), 65 deletions(-) create mode 100644 lib/models/worklist/GetRFCEmployeeList.dart create mode 100644 lib/models/worklist/resubmit_eit_response_model.dart create mode 100644 lib/ui/work_list/sheets/update_continue_sheet.dart diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index eb66a8b..72d9bcb 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/resubmit_eit_response_model.dart'; class MyAttendanceApiClient { static final MyAttendanceApiClient _instance = MyAttendanceApiClient._internal(); @@ -108,6 +109,21 @@ class MyAttendanceApiClient { }, url, postParams); } + Future reSubmitEitTransaction(String itemKey, var notifID, List> list) async { + String url = "${ApiConsts.erpRest}RESUBMIT_EIT_TRANSACTION"; + Map postParams = { + "P_NOTIFICATION_ID": notifID, + "P_ITEM_KEY": itemKey, + "P_EMAIL_ADDRESS": AppState().memberInformationList!.eMPLOYEEEMAILADDRESS, + "EITTransactionTBL": list + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData.resubmitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); + }, url, postParams); + } + Future> getApproversList(String pAmeTransactionType, int pTransactionId) async { String url = "${ApiConsts.erpRest}GET_APPROVERS_LIST"; Map postParams = { diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 5ea1b72..d999d18 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -23,6 +23,7 @@ import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; import 'package:mohem_flutter_app/models/update_user_item_type_list.dart'; +import 'package:mohem_flutter_app/models/worklist/GetRFCEmployeeList.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; @@ -88,6 +89,16 @@ class WorkListApiClient { }, url, postParams); } + Future> getRFCEmployeeeList(int pNotificationID) async { + String url = "${ApiConsts.erpRest}GET_RFC_EMPLOYEE_LIST"; + Map postParams = {"P_NOTIFICATION_ID": pNotificationID, "P_PAGE_NUM": 1, "P_PAGE_LIMIT": 10}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData.getRFCEmployeeListList ?? []; + }, url, postParams); + } + Future> getActionHistory(int pNotificationID) async { String url = "${ApiConsts.erpRest}GET_ACTION_HISTORY"; Map postParams = { @@ -357,7 +368,7 @@ class WorkListApiClient { }, url, postParams); } - Future delegateITGRequest(String requestType, int taskId, int itemId, String employeeNumber,String newUserEMPId, String comments) async { + Future delegateITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String newUserEMPId, String comments) async { String url = "${ApiConsts.cocRest}ITGDelegateRequest"; Map postParams = { "RequestType": requestType, @@ -373,7 +384,26 @@ class WorkListApiClient { return responseData.itgRequest; }, url, postParams); } - Future informationITGRequest(String requestType, int taskId, int itemId, String employeeNumber,String newUserEMPId, String comments) async { + + // ANSWER = 'Services/COCWS.svc/REST/ITGAnswer'; + + Future answerITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String newUserEMPId, String comments) async { + String url = "${ApiConsts.cocRest}ITGAnswer"; + Map 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 informationITGRequest(String requestType, int taskId, int itemId, String employeeNumber, String newUserEMPId, String comments) async { String url = "${ApiConsts.cocRest}ITGRequestInformation"; Map postParams = { "RequestType": requestType, @@ -526,7 +556,7 @@ class WorkListApiClient { }, url, postParams); } - Future submitComment({String? comment, String? email, String? userId, int? notificationId, required String apiMode}) async { + Future submitComment({String? comment, String? email, String? userId, int? notificationId, required String apiMode, int? approverIndex = null}) async { String url = "${ApiConsts.erpRest}NOTIFICATION_ACTIONS"; Map postParams = { "P_COMMENTS": comment, @@ -534,7 +564,7 @@ class WorkListApiClient { "P_EMAIL_ADDRESS": email, "P_FORWARD_TO_USER_NAME": userId, "P_NOTIFICATION_ID": notificationId, - "P_APPROVER_INDEX": null, + "P_APPROVER_INDEX": approverIndex, "RespondAttributeList": [] }; postParams.addAll(AppState().postParamsJson); diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 44de36f..9e61872 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -125,4 +125,8 @@ class AppState { set setchatUserDetails(UserAutoLoginModel details) => chatDetails = details; UserAutoLoginModel? get getchatUserDetails => chatDetails; + + String? _base64ImageEmp = "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"; + + String? get getBase64ImageEmp => _base64ImageEmp; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 2c8e98f..bf8d166 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -99,12 +99,14 @@ import 'package:mohem_flutter_app/models/vacation_rule/respond_attributes_list_m import 'package:mohem_flutter_app/models/vacation_rule/vr_item_types_list_model.dart'; import 'package:mohem_flutter_app/models/vacation_rule/wf_look_up_list_model.dart'; import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/GetRFCEmployeeList.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/resubmit_eit_response_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'package:mohem_flutter_app/start_term_approval_process_list_model.dart'; @@ -224,7 +226,7 @@ class GenericResponseModel { GetPoNotificationBodyList? getPoNotificationBodyList; GetPrNotificationBodyList? getPrNotificationBodyList; List? getQuotationAnalysisList; - List? getRFCEmployeeListList; + List? getRFCEmployeeListList; List? getRespondAttributeValueList; List? getSITCollectionNotificationBodyList; List? getSITDFFStructureList; @@ -326,7 +328,7 @@ class GenericResponseModel { List? respondAttributesList; List? respondRolesList; String? resubmitAbsenceTransactionList; - String? resubmitEITTransactionList; + ResubmitEITRequestResponse? resubmitEITTransactionList; String? resubmitHrTransactionList; String? sFHGetPoNotificationBodyList; String? sFHGetPrNotificationBodyList; @@ -975,7 +977,7 @@ class GenericResponseModel { getQuotationAnalysisList!.add(GetQuotationAnalysisList.fromJson(v)); }); } - getRFCEmployeeListList = json['GetRFCEmployeeListList']; + getRespondAttributeValueList = json['GetRespondAttributeValueList']; getSITCollectionNotificationBodyList = json['GetSITCollectionNotificationBodyList']; getSITDFFStructureList = json['GetSITDFFStructureList']; @@ -986,6 +988,14 @@ class GenericResponseModel { getScheduleShiftsDetailsList!.add(GetScheduleShiftsDetailsList.fromJson(v)); }); } + + if (json['GetRFCEmployeeListList'] != null) { + getRFCEmployeeListList = []; + json['GetRFCEmployeeListList'].forEach((v) { + getRFCEmployeeListList!.add(GetRFCEmployeeList.fromJson(v)); + }); + } + getShiftTypesList = json['GetShiftTypesList']; if (json['GetStampMsNotificationBodyList'] != null) { @@ -1277,7 +1287,7 @@ class GenericResponseModel { }); } resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList']; - resubmitEITTransactionList = json['ResubmitEITTransactionList']; + resubmitEITTransactionList = json['ResubmitEITTransactionList'] != null ? ResubmitEITRequestResponse.fromJson(json['ResubmitEITTransactionList']) : null; resubmitHrTransactionList = json['ResubmitHrTransactionList']; sFHGetPoNotificationBodyList = json['SFH_GetPoNotificationBodyList']; sFHGetPrNotificationBodyList = json['SFH_GetPrNotificationBodyList']; diff --git a/lib/models/worklist/GetRFCEmployeeList.dart b/lib/models/worklist/GetRFCEmployeeList.dart new file mode 100644 index 0000000..33881c7 --- /dev/null +++ b/lib/models/worklist/GetRFCEmployeeList.dart @@ -0,0 +1,48 @@ +class GetRFCEmployeeList { + String? aCTION; + String? eMPLOYEEDISPLAYNAME; + String? eMPLOYEEIMAGE; + int? fROMROWNUM; + int? nOOFROWS; + int? rOWNUM; + int? sEQ; + int? tOROWNUM; + String? uSERNAME; + + GetRFCEmployeeList( + {this.aCTION, + this.eMPLOYEEDISPLAYNAME, + this.eMPLOYEEIMAGE, + this.fROMROWNUM, + this.nOOFROWS, + this.rOWNUM, + this.sEQ, + this.tOROWNUM, + this.uSERNAME}); + + GetRFCEmployeeList.fromJson(Map json) { + aCTION = json['ACTION']; + eMPLOYEEDISPLAYNAME = json['EMPLOYEE_DISPLAY_NAME']; + eMPLOYEEIMAGE = json['EMPLOYEE_IMAGE']; + fROMROWNUM = json['FROM_ROW_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + rOWNUM = json['ROW_NUM']; + sEQ = json['SEQ']; + tOROWNUM = json['TO_ROW_NUM']; + uSERNAME = json['USER_NAME']; + } + + Map toJson() { + Map data = new Map(); + data['ACTION'] = this.aCTION; + data['EMPLOYEE_DISPLAY_NAME'] = this.eMPLOYEEDISPLAYNAME; + data['EMPLOYEE_IMAGE'] = this.eMPLOYEEIMAGE; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ROW_NUM'] = this.rOWNUM; + data['SEQ'] = this.sEQ; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['USER_NAME'] = this.uSERNAME; + return data; + } +} diff --git a/lib/models/worklist/get_favorite_replacements_model.dart b/lib/models/worklist/get_favorite_replacements_model.dart index b5cefad..feee917 100644 --- a/lib/models/worklist/get_favorite_replacements_model.dart +++ b/lib/models/worklist/get_favorite_replacements_model.dart @@ -16,10 +16,10 @@ class GetFavoriteReplacements { this.employeeImage, }); - final String? userName; - final String? employeeDisplayName; - final String? emailAddress; - final String? employeeImage; + String? userName; + String? employeeDisplayName; + String? emailAddress; + String? employeeImage; factory GetFavoriteReplacements.fromJson(Map json) => GetFavoriteReplacements( userName: json["USER_NAME"] == null ? null : json["USER_NAME"], diff --git a/lib/models/worklist/replacement_list_model.dart b/lib/models/worklist/replacement_list_model.dart index f77b991..864cbe1 100644 --- a/lib/models/worklist/replacement_list_model.dart +++ b/lib/models/worklist/replacement_list_model.dart @@ -23,7 +23,7 @@ class ReplacementList { final String? emailAddress; final String? employeeDisplayName; - final String? employeeImage; + String? employeeImage; final int? fromRowNum; bool? isFavorite; final int? noOfRows; diff --git a/lib/models/worklist/resubmit_eit_response_model.dart b/lib/models/worklist/resubmit_eit_response_model.dart new file mode 100644 index 0000000..1da90ba --- /dev/null +++ b/lib/models/worklist/resubmit_eit_response_model.dart @@ -0,0 +1,22 @@ +class ResubmitEITRequestResponse { + String? pRETURNMSG; + String? pRETURNSTATUS; + int? pTRANSACTIONID; + + ResubmitEITRequestResponse( + {this.pRETURNMSG, this.pRETURNSTATUS, this.pTRANSACTIONID}); + + ResubmitEITRequestResponse.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pTRANSACTIONID = json['P_TRANSACTION_ID']; + } + + Map toJson() { + Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_TRANSACTION_ID'] = this.pTRANSACTIONID; + return data; + } +} diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart index bdfb391..ec52304 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -6,6 +6,7 @@ import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/balances_dashboard_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; @@ -16,8 +17,10 @@ class DynamicListViewParams { String uRL; String requestID; String colsURL; + bool isUpdate; + List? collectionNotificationList; - DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = ''}); + DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.isUpdate = false, this.collectionNotificationList}); } class DynamicListViewScreen extends StatefulWidget { diff --git a/lib/ui/work_list/itg_detail_screen.dart b/lib/ui/work_list/itg_detail_screen.dart index 84bd9bd..b215435 100644 --- a/lib/ui/work_list/itg_detail_screen.dart +++ b/lib/ui/work_list/itg_detail_screen.dart @@ -127,7 +127,10 @@ class _ItgDetailScreenState extends State { }, children: [ RequestDetailFragment(fields: itgRequest?.fieldGoups?[1].fields ?? []), - ApprovalLevelfragment(wFHistory: itgRequest?.wFHistory ?? [], voidCallback: reloadITG,), + ApprovalLevelfragment( + wFHistory: itgRequest?.wFHistory ?? [], + voidCallback: reloadITG, + ), RequestDetailFragment(fields: itgRequest?.fieldGoups?[0].fields ?? []), ], ).expanded, @@ -256,24 +259,106 @@ class _ItgDetailScreenState extends State { if (allowedActionList[i].action! == "Reject" || allowedActionList[i].action! == "Approve" || allowedActionList[i].action! == "CLOSE") { continue; } - fabs.add(myFab(allowedActionList[i].action!, "", isIconAsset: false).paddingOnly(bottom: 12).onPress(() => handleFabAction(allowedActionList[i]))); + fabs.add(myFab(getFabActionTitle(allowedActionList[i].action!), getFabActionImages(allowedActionList[i].action!)).paddingOnly(bottom: 12).onPress(() => handleFabAction(allowedActionList[i]))); } return fabs; } + String getFabActionImages(String actionTitle) { + String returnActionImage = ""; + switch (actionTitle) { + case "Delegate": + returnActionImage = "assets/images/delegate.svg"; + break; + case "RequestInformation": + returnActionImage = "assets/images/request_info.svg"; + break; + case "ReportGenerated": + returnActionImage = "assets/images/request_info.svg"; + break; + case "DataCorrected": + returnActionImage = "assets/images/request_info.svg"; + break; + case "Doable": + returnActionImage = "assets/images/request_info.svg"; + break; + case "NotDoable": + returnActionImage = "assets/images/request_info.svg"; + break; + default: + returnActionImage = "assets/images/request_info.svg"; + break; + } + + return returnActionImage; + } + + String getFabActionTitle(String title) { + String returnTitle = ""; + switch (title) { + case "Delegate": + returnTitle = "Delegate"; + break; + case "RequestInformation": + returnTitle = "Request Information"; + break; + case "ReportGenerated": + returnTitle = "Report Generated"; + break; + case "DataCorrected": + returnTitle = "Data Corrected"; + break; + case "Doable": + returnTitle = "Doable"; + break; + case "NotDoable": + returnTitle = "Not Doable"; + break; + default: + returnTitle = title; + break; + } + return returnTitle; + } + void handleFabAction(AllowedActions action) { print(action.toJson()); switch (action.action) { case "Delegate": - showMyBottomSheet(context, callBackFunc: reloadITG, - child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [], callBackFunc: reloadITG,)); + showMyBottomSheet(context, + callBackFunc: reloadITG, + child: DelegateSheet( + title: LocaleKeys.delegate.tr(), + apiMode: action.action!, + notificationID: null, + actionHistoryList: null, + wFHistory: itgRequest?.wFHistory ?? [], + callBackFunc: reloadITG, + )); break; case "RequestInformation": - showMyBottomSheet(context, callBackFunc: reloadITG, - child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: action.action!, notificationID: null, actionHistoryList: null, wFHistory: itgRequest?.wFHistory ?? [], callBackFunc: reloadITG,)); - + showMyBottomSheet(context, + callBackFunc: reloadITG, + child: DelegateSheet( + title: LocaleKeys.request_info.tr(), + apiMode: action.action!, + notificationID: null, + actionHistoryList: null, + wFHistory: itgRequest?.wFHistory ?? [], + callBackFunc: reloadITG, + )); break; + case "Doable": + performAction("APPROVED"); + break; + case "NotDoable": + performAction("REJECTED"); + break; + case "Answer": + performAction("Answer"); + break; + case "RFC": // do something else break; @@ -356,6 +441,8 @@ class _ItgDetailScreenState extends State { onTap: (note) { if (actionMode == "APPROVED") { performApproveAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note); + } else if (actionMode == "Answer") { + performAnswerAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note); } else { performRejectAction(requestDetails!.requestType!, requestDetails!.iD!, requestDetails!.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", note); } @@ -364,6 +451,30 @@ class _ItgDetailScreenState extends State { ); } + void performAnswerAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async { + try { + Utils.showLoading(context); + ITGRequest? itgRequest = await WorkListApiClient().answerITGRequest(requestType, taskId, itemId, employeeNumber, "", comments); + Utils.hideLoading(context); + Utils.showToast(LocaleKeys.yourChangeHasBeenSavedSuccessfully.tr()); + // Navigator.pop(context, "delegate_reload"); + AppState().requestAllList!.removeAt(AppState().itgWorkListIndex!); + if (AppState().requestAllList!.isEmpty) { + Navigator.pop(context, "delegate_reload"); + } else { + if (AppState().requestAllList!.length <= AppState().itgWorkListIndex!) { + Navigator.pop(context, "delegate_reload"); + } else { + requestDetails = null; + getDataFromState(); + } + } + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + void performRejectAction(String requestType, int taskId, int itemId, String employeeNumber, String comments) async { try { Utils.showLoading(context); @@ -425,5 +536,4 @@ class _ItgDetailScreenState extends State { } } } - } diff --git a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart index eb478af..52915ab 100644 --- a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart +++ b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart @@ -138,7 +138,8 @@ class ApprovalLevelfragment extends StatelessWidget { } else if (code.toLowerCase() == "approved" || code.toLowerCase() == "auto-approve" || code.toLowerCase() == "auto-approved" || - code.toLowerCase() == "doable") { + code.toLowerCase() == "doable" || + code.toLowerCase() == "answer") { return MyColors.greenColor; } else if (code.toLowerCase() == "requested information" || code.toLowerCase() == "assign" || code.toLowerCase() == "reassign") { return MyColors.orange; diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index 6d39fc8..2a5f453 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -47,6 +47,8 @@ class _DelegateSheetState extends State { List? favUsersList; List? replacementList; + bool isImageLoaded = false; + @override void initState() { super.initState(); @@ -99,7 +101,9 @@ class _DelegateSheetState extends State { if (isNeedLoading) Utils.showLoading(context); favUsersList = await WorkListApiClient().getFavoriteReplacementWithImageNew(selectedFavLetter ?? ""); if (isNeedLoading) Utils.hideLoading(context); - setState(() {}); + setState(() { + isImageLoaded = true; + }); return null; } @@ -410,6 +414,7 @@ class _DelegateSheetState extends State { apiMode: widget.apiMode, actionHistoryList: actionHistory, notificationID: widget.notificationID, + isITGRequest: widget.wFHistory != null, )); }, child: Row( @@ -483,6 +488,7 @@ class _DelegateSheetState extends State { apiMode: widget.apiMode, favoriteReplacements: actionHistory, notificationID: widget.notificationID, + isITGRequest: widget.wFHistory != null, )); }, child: Row( @@ -494,17 +500,23 @@ class _DelegateSheetState extends State { width: 40, isImageBase64: (actionHistory.employeeImage != null || actionHistory.employeeImage!.isNotEmpty) ? true : false, ) - : ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(50), - ), - child: Image.network( - "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", - fit: BoxFit.cover, - height: 40, - width: 40, - ).toShimmer(), - ), + : isImageLoaded + ? CircularAvatar( + height: 40, + width: 40, + isImageBase64: false, + ) + : ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(50), + ), + child: Image.network( + "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", + fit: BoxFit.cover, + height: 40, + width: 40, + ).toShimmer(), + ), 16.width, Expanded( child: (actionHistory.employeeDisplayName ?? "").toText12(), @@ -542,6 +554,7 @@ class _DelegateSheetState extends State { apiMode: widget.apiMode, replacementList: actionHistory, notificationID: widget.notificationID, + isITGRequest: widget.wFHistory != null, )); }, child: Row( diff --git a/lib/ui/work_list/sheets/selected_item_sheet.dart b/lib/ui/work_list/sheets/selected_item_sheet.dart index 355fee6..4f7f6b3 100644 --- a/lib/ui/work_list/sheets/selected_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_item_sheet.dart @@ -1,12 +1,15 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_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/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_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -19,8 +22,11 @@ class SelectedItemSheet extends StatelessWidget { GetActionHistoryList? actionHistoryList; GetFavoriteReplacements? favoriteReplacements; ReplacementList? replacementList; + MemberInformationListModel? memberInformationListModel; - SelectedItemSheet(this.title, {required this.apiMode, this.notificationID, this.actionHistoryList, this.favoriteReplacements, this.replacementList}); + bool isITGRequest; + + SelectedItemSheet(this.title, {required this.apiMode, this.notificationID, this.actionHistoryList, this.favoriteReplacements, this.replacementList, this.isITGRequest = false}); TextEditingController username = TextEditingController(); String comment = ""; @@ -41,9 +47,9 @@ class SelectedItemSheet extends StatelessWidget { children: [ title.toText24(isBold: true), 21.height, - if (actionHistoryList != null) showItem(actionHistoryList!.nAME, actionHistoryList!.isFavorite), - if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, true), - if (replacementList != null) showItem(replacementList!.employeeDisplayName, replacementList!.isFavorite), + if (actionHistoryList != null) showItem(actionHistoryList!.nAME, context, actionHistoryList!.isFavorite), + if (favoriteReplacements != null) showItem(favoriteReplacements!.employeeDisplayName, context, true), + if (replacementList != null) showItem(replacementList!.employeeDisplayName, context, replacementList!.isFavorite), 14.height, InputWidget( "Enter a note", @@ -97,7 +103,7 @@ class SelectedItemSheet extends StatelessWidget { email = replacementList!.emailAddress; userId = replacementList!.userName; } - performNetworkCall(context, email: email ?? "", userId: userId ?? ""); + isITGRequest ? performITGNetworkCall(context, email: email ?? "", userId: userId ?? "") : performNetworkCall(context, email: email ?? "", userId: userId ?? ""); } else { Utils.showToast("Please enter comments"); } @@ -115,10 +121,26 @@ class SelectedItemSheet extends StatelessWidget { ); } + void getUserInformation(BuildContext context) async { + String? empID = ""; + if (actionHistoryList != null) empID = actionHistoryList!.uSERNAME; + if (favoriteReplacements != null) empID = favoriteReplacements!.userName; + if (replacementList != null) empID = replacementList!.userName; + try { + memberInformationListModel = await WorkListApiClient().getUserInformation(-999, empID!); + if (actionHistoryList != null) empID = actionHistoryList!.eMPLOYEEIMAGE = memberInformationListModel!.eMPLOYEEIMAGE ?? AppState().getBase64ImageEmp; + if (favoriteReplacements != null) empID = favoriteReplacements!.employeeImage = memberInformationListModel!.eMPLOYEEIMAGE ?? AppState().getBase64ImageEmp; + if (replacementList != null) empID = replacementList!.employeeImage = memberInformationListModel!.eMPLOYEEIMAGE ?? AppState().getBase64ImageEmp; + (context as Element).markNeedsBuild(); + } catch (ex) { + Utils.handleException(ex, context, null); + } + } + Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { Utils.showLoading(context); try { - await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode); + await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode, approverIndex: actionHistoryList!.sEQUENCE); Utils.hideLoading(context); // Navigator.pop(context); // Navigator.pop(context); @@ -129,7 +151,44 @@ class SelectedItemSheet extends StatelessWidget { } } - Widget showItem(String? name, bool? isFav) { + Future performITGNetworkCall(BuildContext context, {String? email, String? userId}) async { + Utils.showLoading(context); + try { + var requestDetails = AppState().requestAllList![AppState().itgWorkListIndex!]; + if (apiMode == "Delegate") { + await WorkListApiClient().delegateITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", + isITGRequest ? favoriteReplacements!.userName! : actionHistoryList!.uSERNAME!, comment); + } else if (apiMode == "RequestInformation") { + await WorkListApiClient().informationITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", + isITGRequest ? favoriteReplacements!.userName! : actionHistoryList!.uSERNAME!, comment); + } else if (apiMode == "Answer") { + await WorkListApiClient().answerITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", + isITGRequest ? favoriteReplacements!.userName! : actionHistoryList!.uSERNAME!, comment); + } + Utils.hideLoading(context); + Navigator.pop(context, "delegate_reload"); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + Widget showItem(String? name, BuildContext context, bool? isFav) { + if (actionHistoryList != null) { + if (actionHistoryList!.eMPLOYEEIMAGE == null || actionHistoryList!.eMPLOYEEIMAGE == "") { + // getUserInformation(context); + } + } + if (favoriteReplacements != null) { + if (favoriteReplacements!.employeeImage == null || favoriteReplacements!.employeeImage == "") { + // getUserInformation(context); + } + } + if (replacementList != null) { + if (replacementList!.employeeImage == null || replacementList!.employeeImage == "") { + // getUserInformation(context); + } + } return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(15), @@ -142,13 +201,18 @@ class SelectedItemSheet extends StatelessWidget { padding: const EdgeInsets.only(top: 16, bottom: 16, left: 21, right: 21), child: Row( children: [ - (isFav != null && isFav) - ? CircularAvatar( - height: 40, - width: 40, - url: favoriteReplacements != null ? favoriteReplacements!.employeeImage : actionHistoryList!.eMPLOYEEIMAGE, - isImageBase64: true, - ) + (isFav != null && isFav && favoriteReplacements != null) + ? favoriteReplacements!.employeeImage != "" + ? CircularAvatar( + height: 40, + width: 40, + url: favoriteReplacements != null ? favoriteReplacements!.employeeImage : actionHistoryList!.eMPLOYEEIMAGE, + isImageBase64: true, + ) + : CircularAvatar( + height: 40, + width: 40, + ).toShimmer() : (actionHistoryList != null && actionHistoryList!.eMPLOYEEIMAGE != null) ? CircularAvatar( height: 40, @@ -159,7 +223,7 @@ class SelectedItemSheet extends StatelessWidget { : CircularAvatar( height: 40, width: 40, - ), + ).toShimmer(), 16.width, Expanded( child: (name ?? "").toText12(), diff --git a/lib/ui/work_list/sheets/selected_itg_item_sheet.dart b/lib/ui/work_list/sheets/selected_itg_item_sheet.dart index f44ca04..e836a07 100644 --- a/lib/ui/work_list/sheets/selected_itg_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_itg_item_sheet.dart @@ -126,10 +126,11 @@ class SelectedItgItemSheet extends StatelessWidget { } else if (apiMode == "RequestInformation") { await WorkListApiClient() .informationITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment); + } else if (apiMode == "Answer") { + await WorkListApiClient() + .answerITGRequest(requestDetails.requestType!, requestDetails.iD!, requestDetails.itemID!, AppState().memberInformationList?.eMPLOYEENUMBER ?? "", wfHistory.employeeID!, comment); } Utils.hideLoading(context); - // Navigator.pop(context); - // Navigator.pop(context); Navigator.pop(context, "delegate_reload"); } catch (ex) { Utils.hideLoading(context); diff --git a/lib/ui/work_list/sheets/update_continue_sheet.dart b/lib/ui/work_list/sheets/update_continue_sheet.dart new file mode 100644 index 0000000..169e12e --- /dev/null +++ b/lib/ui/work_list/sheets/update_continue_sheet.dart @@ -0,0 +1,131 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_attendance_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/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/resubmit_eit_response_model.dart'; +import 'package:mohem_flutter_app/models/worklist_response_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/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; + +class UpdateContinueSheet extends StatefulWidget { + WorkListResponseModel? workListData; + List? getEitCollectionNotificationBodyList; + DynamicListViewParams? dynamicParams; + + UpdateContinueSheet({this.workListData, this.getEitCollectionNotificationBodyList, this.dynamicParams, Key? key}) : super(key: key); + + @override + State createState() => _UpdateContinueSheetState(); +} + +class _UpdateContinueSheetState extends State { + double itemHeight = 0; + double itemWidth = 0; + + @override + Widget build(BuildContext context) { + var size = MediaQuery.of(context).size; + itemHeight = (size.height - kToolbarHeight - 24) / 9; + itemWidth = size.width / 2; + return Column( + children: [ + if ((widget.workListData?.sUBJECT ?? "").isNotEmpty) widget.workListData!.sUBJECT!.toText14().paddingOnly(top: 10, right: 21, left: 21, bottom: 21), + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + List dataList = widget.getEitCollectionNotificationBodyList!.isEmpty ? [] : (widget.getEitCollectionNotificationBodyList![index].collectionNotification ?? []); + dataList = dataList.where((o) => o.displayFlag == "Y").toList(); + bool isOdd = false; + if (dataList.length % 2 != 0) { + isOdd = true; + dataList.add(new CollectionNotificationEit()); + } + return GridView.builder( + itemCount: dataList.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) => ItemDetailViewGridItem( + index, + dataList[index].segmentPrompt, + dataList[index].segmentValueDsp, + isNeedToShowEmptyDivider: (dataList.length == index + 1) + ? isOdd + ? true + : false + : false, + ), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: (itemWidth / itemHeight), + ), + ).objectContainerView(); + }, + separatorBuilder: (cxt, index) => 12.height, + itemCount: widget.getEitCollectionNotificationBodyList!.length, + ), + Padding( + padding: const EdgeInsets.only(right: 21, left: 21, bottom: 21), + child: Row( + children: [ + DefaultButton( + LocaleKeys.edit.tr(), + () => performEditAction(), + colors: const [Color(0xffE47A7E), Color(0xffDE6D71)], + ).expanded, + 8.width, + DefaultButton( + LocaleKeys.next.tr(), + () => performNextAction(), + colors: const [Color(0xff28C884), Color(0xff1BB271)], + ).expanded, + ], + ), + ), + ], + ); + } + + void performNextAction() async { + //Resubmit EIT Transaction + try { + Utils.showLoading(context); + List> values = []; + for (GetEitCollectionNotificationBodyList element in widget.getEitCollectionNotificationBodyList!) { + for (CollectionNotificationEit collectionElement in element.collectionNotification!) { + values.add({ + "TRANSACTION_NUMBER": collectionElement.transactionNumber, + "NAME": collectionElement.applicationColumnName, + "VARCHAR2_VALUE": collectionElement.varchar2Value, + "NUMBER_VALUE": collectionElement.numberValue, + "DATE_VALUE": collectionElement.dateValue, + }); + } + } + ResubmitEITRequestResponse resubmitEITRequestResponse = await MyAttendanceApiClient().reSubmitEitTransaction(widget.workListData!.iTEMKEY!, widget.workListData!.nOTIFICATIONID, values); + Utils.hideLoading(context); + await Navigator.pushNamed( + context, + AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), resubmitEITRequestResponse.pTRANSACTIONID!, widget.workListData!.iTEMKEY!, 'eit'), + ); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void performEditAction() { + //Open EIT Edit Screen + + Navigator.pushNamed(context, AppRoutes.addDynamicInput, arguments: widget.dynamicParams); + } +} diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 1d5931d..262ec4f 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -23,12 +23,16 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/GetRFCEmployeeList.dart'; import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart'; +import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart'; +import 'package:mohem_flutter_app/ui/work_list/sheets/update_continue_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/actions_fragment.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/attachments_fragment.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/detail_fragment.dart'; @@ -65,6 +69,8 @@ class _WorkListDetailScreenState extends State { List getNotificationRespondAttributes = []; NotificationGetRespondAttributesList? notificationNoteInput; + List getRFCEmployeeList = []; + //HR Details Screen Requests List? getEitCollectionNotificationBodyList = []; List? getPhonesNotificationBodyList = []; @@ -375,57 +381,115 @@ class _WorkListDetailScreenState extends State { } fabs.add(myFab( notificationButtonsList[i].bUTTONLABEL!, - notificationButtonsList[i].bUTTONACTION == "DELEGATE" ? "assets/images/delegate.svg" : notificationButtonsList[i].bUTTONICON ?? "", - isIconAsset: notificationButtonsList[i].bUTTONACTION == "DELEGATE" ? true : false, + getActionImage(notificationButtonsList[i].bUTTONACTION!), + isIconAsset: true, ).paddingOnly(bottom: 12).onPress(() => handleFabAction(notificationButtonsList[i]))); } return fabs; } + String getActionImage(String action) { + String returnActionImage = ""; + + switch (action) { + case "DELEGATE": + returnActionImage = "assets/images/delegate.svg"; + break; + case "REQUEST_INFO": + returnActionImage = "assets/images/request_info.svg"; + break; + case "RFC": + returnActionImage = "assets/images/worklist/return.svg"; + break; + case "UPDATE_ACTION": + returnActionImage = "assets/images/worklist/update_action.svg"; + break; + } + + return returnActionImage; + } + void handleFabAction(GetNotificationButtonsList notificationButton) { print("notificationButton:${notificationButton.bUTTONACTION}"); switch (notificationButton.bUTTONACTION) { case "DELEGATE": showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); + child: DelegateSheet( + title: LocaleKeys.delegate.tr(), + apiMode: notificationButton.bUTTONACTION!, + notificationID: workListData!.nOTIFICATIONID, + actionHistoryList: actionHistoryList, + callBackFunc: reloadWorkList, + )); break; case "REQUEST_INFO": // do something else showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); + child: DelegateSheet( + title: LocaleKeys.request_info.tr(), + apiMode: "REQUEST_INFO", + notificationID: workListData!.nOTIFICATIONID, + actionHistoryList: actionHistoryList, + callBackFunc: reloadWorkList, + )); break; case "TRANSFER_INFO": // do something else showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: - DelegateSheet(title: notificationButton.bUTTONLABEL!, apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); + child: DelegateSheet( + title: notificationButton.bUTTONLABEL!, + apiMode: notificationButton.bUTTONACTION!, + notificationID: workListData!.nOTIFICATIONID, + actionHistoryList: actionHistoryList, + callBackFunc: reloadWorkList, + )); break; case "ANSWER_INFO": performAction(notificationButton.bUTTONACTION!, title: notificationButton.bUTTONLABEL); break; case "RFC": - // do something else + getRFCEmployeeListFunc(); break; case "APPROVE": performAction(notificationButton.bUTTONACTION!); break; case "UPDATE_ACTION": - // do something else + showMyBottomSheet( + context, + callBackFunc: reloadWorkList, + child: UpdateContinueSheet( + workListData: workListData, + getEitCollectionNotificationBodyList: getEitCollectionNotificationBodyList, + dynamicParams: DynamicListViewParams(workListData!.sUBJECT!, workListData!.fUNCTIONNAME!, + isUpdate: true, collectionNotificationList: getEitCollectionNotificationBodyList![0].collectionNotification)), + ); + break; case "APPROVE_AND_FORWARD": showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: "Approve and Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); + child: DelegateSheet( + title: "Approve and Forward", + apiMode: notificationButton.bUTTONACTION!, + notificationID: workListData!.nOTIFICATIONID, + actionHistoryList: actionHistoryList, + callBackFunc: reloadWorkList, + )); break; case "FORWARD": showMyBottomSheet(context, callBackFunc: reloadWorkList, - child: DelegateSheet(title: "Forward", apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList, callBackFunc: reloadWorkList,)); + child: DelegateSheet( + title: "Forward", + apiMode: notificationButton.bUTTONACTION!, + notificationID: workListData!.nOTIFICATIONID, + actionHistoryList: actionHistoryList, + callBackFunc: reloadWorkList, + )); break; case "REJECT": - // performNetworkCall(context, email: "", userId: ""); performAction(notificationButton.bUTTONACTION!); break; case "RETURNED": @@ -437,6 +501,28 @@ class _WorkListDetailScreenState extends State { }); } + void getRFCEmployeeListFunc() async { + try { + Utils.showLoading(context); + getRFCEmployeeList = await WorkListApiClient().getRFCEmployeeeList(workListData!.nOTIFICATIONID!); + Utils.hideLoading(context); + actionHistoryList.last.sEQUENCE = getRFCEmployeeList[0].sEQ; + showMyBottomSheet(context, + callBackFunc: reloadWorkList, + child: SelectedItemSheet( + "Comment", + apiMode: "RFC", + actionHistoryList: actionHistoryList.last, + notificationID: workListData!.nOTIFICATIONID, + isITGRequest: false, + )); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { showDialog( context: context, @@ -543,7 +629,7 @@ class _WorkListDetailScreenState extends State { } ], }; - if (actionMode == "APPROVED" || actionMode == "APPROVE" || actionMode == "CLOSE") { + if (actionMode == "APPROVED" || actionMode == "APPROVE" || actionMode == "CLOSE" || actionMode == "ANSWER_INFO" || actionMode == "RFC") { performNotificationAction(payload); } else if (note.isNotEmpty && (actionMode != "APPROVED" || actionMode != "APPROVE")) { performNotificationAction(payload); @@ -867,6 +953,71 @@ class _WorkListDetailScreenState extends State { } } + // Widget showUpdateContinueSheet(List list) { + // double itemHeight = 0; + // double itemWidth = 0; + // var size = MediaQuery.of(context).size; + // itemHeight = (size.height - kToolbarHeight - 24) / 9; + // itemWidth = size.width / 2; + // return Column( + // children: [ + // if ((workListData?.sUBJECT ?? "").isNotEmpty) workListData!.sUBJECT!.toText14().paddingOnly(top: 10, right: 21, left: 21, bottom: 21), + // ListView.separated( + // shrinkWrap: true, + // physics: const NeverScrollableScrollPhysics(), + // itemBuilder: (cxt, index) { + // List dataList = list.isEmpty ? [] : (list[index].collectionNotification ?? []); + // dataList = dataList.where((o) => o.displayFlag == "Y").toList(); + // bool isOdd = false; + // if (dataList.length % 2 != 0) { + // isOdd = true; + // dataList.add(new CollectionNotificationEit()); + // } + // return GridView.builder( + // itemCount: dataList.length, + // shrinkWrap: true, + // physics: const NeverScrollableScrollPhysics(), + // itemBuilder: (context, index) => ItemDetailViewGridItem( + // index, + // dataList[index].segmentPrompt, + // dataList[index].segmentValueDsp, + // isNeedToShowEmptyDivider: (dataList.length == index + 1) + // ? isOdd + // ? true + // : false + // : false, + // ), + // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + // crossAxisCount: 2, + // childAspectRatio: (itemWidth / itemHeight), + // ), + // ).objectContainerView(); + // }, + // separatorBuilder: (cxt, index) => 12.height, + // itemCount: list.length, + // ), + // Padding( + // padding: const EdgeInsets.only(right: 21, left: 21, bottom: 21), + // child: Row( + // children: [ + // DefaultButton( + // LocaleKeys.edit.tr(), + // () => performEditAction(), + // colors: const [Color(0xffE47A7E), Color(0xffDE6D71)], + // ).expanded, + // 8.width, + // DefaultButton( + // LocaleKeys.next.tr(), + // () => performNextAction(), + // colors: const [Color(0xff28C884), Color(0xff1BB271)], + // ).expanded, + // ], + // ), + // ), + // ], + // ); + // } + Widget showLoadingAnimation() { return Lottie.asset( 'assets/lottie/loading.json', diff --git a/lib/widgets/dialogs/accept_reject_input_dialog.dart b/lib/widgets/dialogs/accept_reject_input_dialog.dart index e335453..ac5db05 100644 --- a/lib/widgets/dialogs/accept_reject_input_dialog.dart +++ b/lib/widgets/dialogs/accept_reject_input_dialog.dart @@ -91,12 +91,15 @@ class AcceptRejectInputDialog extends StatelessWidget { (actionMode == "REJECTED" || actionMode == "REJECT") ? LocaleKeys.reject.tr() : LocaleKeys.ok.tr(), () { if (note.isEmpty) { - if (actionMode != "REJECTED" || actionMode != "REJECT") { + if ((actionMode != "REJECTED" && actionMode != "REJECT") && actionMode != "ANSWER_INFO" && actionMode != "RFC") { Navigator.pop(context); onTap(note); } else { Utils.showToast(LocaleKeys.pleaseEnterComments.tr()); } + } else { + Navigator.pop(context); + onTap(note); } }, colors: (actionMode == "REJECTED" || actionMode == "REJECT") diff --git a/pubspec.yaml b/pubspec.yaml index 16c5737..40fd3bc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -127,6 +127,7 @@ flutter: - assets/lottie/ - assets/audio/ - assets/images/ + - assets/images/worklist/ - assets/images/login/ - assets/icons/chat/ - assets/images/logos/ From 89812c0f726a9772b3cacd45117e9c6e885ced94 Mon Sep 17 00:00:00 2001 From: Sultan khan <> Date: Wed, 9 Nov 2022 17:10:12 +0300 Subject: [PATCH 22/23] Worklist changes --- .../dynamic_screens/dynamic_input_screen.dart | 100 ++++++++++-------- .../dynamic_input_address_screen.dart | 2 +- .../sheets/update_continue_sheet.dart | 32 +++--- 3 files changed, 78 insertions(+), 56 deletions(-) diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 9aafdd8..c0fbc2b 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -48,6 +48,17 @@ class _DynamicInputScreenState extends State { descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? ""; getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + if (dynamicParams!.collectionNotificationList != null && dynamicParams!.collectionNotificationList!.isNotEmpty) { + getEitDffStructureList!.forEach((element) { + dynamicParams!.collectionNotificationList!.forEach((element2) { + if (element.sEGMENTNAME == element2.segmentName) { + element.fieldAnswer = element2.varchar2Value; + element.eSERVICESDV ??= ESERVICESDV(); + element.eSERVICESDV!.pIDCOLUMNNAME = element2.varchar2Value; + } + }); + }); + } Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -57,51 +68,56 @@ class _DynamicInputScreenState extends State { } void validateTransaction() async { - /// try { - Utils.showLoading(context); - List> values = getEitDffStructureList!.map((e) { - String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; - if (e.fORMATTYPE == "X") { - // for date format type, date format is changed - tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; - if (tempVar.isNotEmpty) { - if (!tempVar.contains("/")) { - DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + try { + Utils.showLoading(context); + List> values = getEitDffStructureList!.map((e) { + String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + if (e.fORMATTYPE == "X") { + // for date format type, date format is changed + tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + if (tempVar.isNotEmpty) { + if (!tempVar.contains("/")) { + DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + } } } + // else if (e.fORMATTYPE == "N") { + // // for date format type, date format is changed + // tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + // print("------------------------sEGMENTNAME:${e.sEGMENTNAME}"); + // print("------------------------tempVar:$tempVar"); + // if (tempVar.isNotEmpty) { + // if (!tempVar.contains("/")) { + // DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + // tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + // } + // } + // } + return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); + }).toList(); + + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); + + genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); + if (dynamicParams!.collectionNotificationList != null && dynamicParams!.collectionNotificationList!.isNotEmpty) { + Utils.hideLoading(context); + Navigator.pop(context, values); + return; } - // else if (e.fORMATTYPE == "N") { - // // for date format type, date format is changed - // tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; - // print("------------------------sEGMENTNAME:${e.sEGMENTNAME}"); - // print("------------------------tempVar:$tempVar"); - // if (tempVar.isNotEmpty) { - // if (!tempVar.contains("/")) { - // DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); - // tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); - // } - // } - // } - return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); - }).toList(); - - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); - - genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); - SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); - Utils.hideLoading(context); - await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, - arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); - Utils.showLoading(context); - await LeaveBalanceApiClient().cancelHrTransaction(submitEITTransactionList.pTRANSACTIONID!); - Utils.hideLoading(context); - // } catch (ex) { - // Utils.hideLoading(context); - // Utils.handleException(ex, context, null); - // } + SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); + Utils.hideLoading(context); + await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); + Utils.showLoading(context); + await LeaveBalanceApiClient().cancelHrTransaction(submitEITTransactionList.pTRANSACTIONID!); + Utils.hideLoading(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } } String dESCFLEXCONTEXTCODE = ""; diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart index ecc2426..226eae9 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_address_screen.dart @@ -88,7 +88,7 @@ class _DynamicInputScreenState extends State { getAddressDffStructureList! .insert(1, GetAddressDffStructureList(fORMATTYPE: 'C', sEGMENTPROMPT: LocaleKeys.profile_country.tr(), eSERVICESVS: eSerivceList, getEmployeeAddressList: GetEmployeeAddressList())); } - print(getAddressDffStructureList); + // genericResponseModel = await ProfileApiClient().getColStructure(dynamicParams!.dynamicId, 'GET_BASIC_DET_COLS_STRUCTURE', dynamicParams!.requestID); // getBasicDetColsStructureList = genericResponseModel?.getBasicDetColsStructureList ?? []; // getBasicDetColsStructureList?.forEach((element) { diff --git a/lib/ui/work_list/sheets/update_continue_sheet.dart b/lib/ui/work_list/sheets/update_continue_sheet.dart index 169e12e..1e4e5f3 100644 --- a/lib/ui/work_list/sheets/update_continue_sheet.dart +++ b/lib/ui/work_list/sheets/update_continue_sheet.dart @@ -29,7 +29,7 @@ class UpdateContinueSheet extends StatefulWidget { class _UpdateContinueSheetState extends State { double itemHeight = 0; double itemWidth = 0; - + List> validatedValues = []; @override Widget build(BuildContext context) { var size = MediaQuery.of(context).size; @@ -99,17 +99,22 @@ class _UpdateContinueSheetState extends State { try { Utils.showLoading(context); List> values = []; - for (GetEitCollectionNotificationBodyList element in widget.getEitCollectionNotificationBodyList!) { - for (CollectionNotificationEit collectionElement in element.collectionNotification!) { - values.add({ - "TRANSACTION_NUMBER": collectionElement.transactionNumber, - "NAME": collectionElement.applicationColumnName, - "VARCHAR2_VALUE": collectionElement.varchar2Value, - "NUMBER_VALUE": collectionElement.numberValue, - "DATE_VALUE": collectionElement.dateValue, - }); + if (validatedValues!.isNotEmpty) { + values = validatedValues; + } else { + for (GetEitCollectionNotificationBodyList element in widget.getEitCollectionNotificationBodyList!) { + for (CollectionNotificationEit collectionElement in element.collectionNotification!) { + values.add({ + "TRANSACTION_NUMBER": collectionElement.transactionNumber, + "NAME": collectionElement.applicationColumnName, + "VARCHAR2_VALUE": collectionElement.varchar2Value, + "NUMBER_VALUE": collectionElement.numberValue, + "DATE_VALUE": collectionElement.dateValue, + }); + } } } + ResubmitEITRequestResponse resubmitEITRequestResponse = await MyAttendanceApiClient().reSubmitEitTransaction(widget.workListData!.iTEMKEY!, widget.workListData!.nOTIFICATIONID, values); Utils.hideLoading(context); await Navigator.pushNamed( @@ -124,8 +129,9 @@ class _UpdateContinueSheetState extends State { } void performEditAction() { - //Open EIT Edit Screen - - Navigator.pushNamed(context, AppRoutes.addDynamicInput, arguments: widget.dynamicParams); + // ignore: avoid_annotating_with_dynamic + Navigator.pushNamed(context, AppRoutes.addDynamicInput, arguments: widget.dynamicParams).then((dynamic value) { + validatedValues = value; + }); } } From 22ac89e74435f182da5fe6f1d5c1174db4e54520 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Thu, 10 Nov 2022 09:45:29 +0300 Subject: [PATCH 23/23] fix issues --- lib/classes/consts.dart | 4 +- lib/models/generic_response_model.dart | 2 +- .../attendance/add_vacation_rule_screen.dart | 2 +- .../dynamic_screens/dynamic_input_screen.dart | 37 ++++++++++--------- 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index eea2481..6276213 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - static String baseUrl = "https://hmgwebservices.com"; // Live server + static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + //static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 2c8e98f..cf799fd 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1273,7 +1273,7 @@ class GenericResponseModel { if (json['RespondRolesList'] != null) { respondRolesList = []; json['RespondRolesList'].forEach((v) { - respondRolesList!.add(v); + // respondRolesList!.add(v); }); } resubmitAbsenceTransactionList = json['ResubmitAbsenceTransactionList']; diff --git a/lib/ui/attendance/add_vacation_rule_screen.dart b/lib/ui/attendance/add_vacation_rule_screen.dart index a698adc..caa1ee3 100644 --- a/lib/ui/attendance/add_vacation_rule_screen.dart +++ b/lib/ui/attendance/add_vacation_rule_screen.dart @@ -98,7 +98,7 @@ class _AddVacationRuleScreenState extends State { } void callCombineApis() async { - try { + try { Utils.showLoading(context); List results = await Future.wait([ VacationRuleApiClient().getNotificationReassignMode(), diff --git a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart index 519bb6c..f71e6f1 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -57,7 +57,7 @@ class _DynamicInputScreenState extends State { } void validateTransaction() async { - try { + // try { Utils.showLoading(context); List> values = getEitDffStructureList!.map((e) { String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; @@ -98,10 +98,10 @@ class _DynamicInputScreenState extends State { Utils.showLoading(context); await LeaveBalanceApiClient().cancelHrTransaction(submitEITTransactionList.pTRANSACTIONID!); Utils.hideLoading(context); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // } } String dESCFLEXCONTEXTCODE = ""; @@ -136,7 +136,7 @@ class _DynamicInputScreenState extends State { } Future getDefaultValues(GetEITDFFStructureList structureList) async { - try { + // try { Utils.showLoading(context); for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; @@ -163,10 +163,10 @@ class _DynamicInputScreenState extends State { await Future.delayed(const Duration(seconds: 1)); Utils.hideLoading(context); setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // } } // List> calGetValueSetValuesIonicLogic(GetEITDFFStructureList structureElement) { @@ -180,7 +180,7 @@ class _DynamicInputScreenState extends State { // } List> getDefaultValuesIonicLogic(GetEITDFFStructureList structureElement) { - try { + // try { List parentValue = structureElement.pARENTSEGMENTSVSSplitedVS ?? []; List parentsList = structureElement.pARENTSEGMENTSDVSplited ?? []; @@ -248,11 +248,11 @@ class _DynamicInputScreenState extends State { // } // Utils.hideLoading(context); // setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - return []; - } + // } catch (ex) { + // Utils.hideLoading(context); + // Utils.handleException(ex, context, null); + // return []; + // } } List> getDependenciesParams(parentsList) { @@ -340,7 +340,7 @@ class _DynamicInputScreenState extends State { String? text = data?.pVALUECOLUMNNAME; String? val = data?.pIDCOLUMNNAME; - if ((val ?? "").isEmpty && parentsList[i].IsRequired == "REQUIRED") { + if ((val ?? "").isEmpty && parentsList[i].isRequired == "REQUIRED") { //alert(parentsList[i].Name +" Is required"); return []; } else {} @@ -362,7 +362,8 @@ class _DynamicInputScreenState extends State { String? text = data?.pVALUECOLUMNNAME; String? val = data?.pIDCOLUMNNAME; - if ((val ?? "").isEmpty && parentsList[i].IsRequired == "REQUIRED") { + /// + if ((val ?? "").isEmpty && parentsList[i].isRequired == "REQUIRED") { //alert(parentsList[i].Name +" Is required"); return []; } else {}