From f62253374de2000af2bb847b37092f5dcc81f17a Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Sun, 18 Dec 2022 09:37:20 +0300 Subject: [PATCH 01/13] Chat Error Handling --- lib/api/chat/chat_api_client.dart | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart index 35e4f79..5bceb24 100644 --- a/lib/api/chat/chat_api_client.dart +++ b/lib/api/chat/chat_api_client.dart @@ -3,10 +3,12 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/models/chat/chat_user_image_model.dart'; @@ -22,6 +24,7 @@ class ChatApiClient { factory ChatApiClient() => _instance; Future getUserLoginToken() async { + user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel(); Response response = await ApiClient().postJsonForResponse( "${ApiConsts.chatLoginTokenUrl}externaluserlogin", { @@ -32,7 +35,14 @@ class ChatApiClient { if (!kReleaseMode) { logger.i("res: " + response.body); } - user.UserAutoLoginModel userLoginResponse = user.userAutoLoginModelFromJson(response.body); + if (response.statusCode == 200) { + userLoginResponse = user.userAutoLoginModelFromJson(response.body); + } else if (response.statusCode == 504) { + getUserLoginToken(); + } else { + userLoginResponse = user.userAutoLoginModelFromJson(response.body); + Utils.showToast(userLoginResponse.errorResponses!.first.message!); + } return userLoginResponse; } @@ -141,6 +151,7 @@ class ChatApiClient { } Future> getUsersImages({required List encryptedEmails}) async { + List imagesData = []; Response response = await ApiClient().postJsonForResponse( "${ApiConsts.chatUserImages}images", {"encryptedEmails": encryptedEmails, "fromClient": false}, @@ -148,7 +159,16 @@ class ChatApiClient { ); if (!kReleaseMode) { logger.i("res: " + response.body); + print("Images Status Coe is ============== " + response.statusCode.toString()); + } + if (response.statusCode == 200) { + imagesData = chatUserImageModelFromJson(response.body); + } else if (response.statusCode == 504 || response.statusCode == 500) { + getUsersImages(encryptedEmails: encryptedEmails); + } else { + Utils.showToast("Something went wrong while loading images"); + imagesData = []; } - return chatUserImageModelFromJson(response.body); + return imagesData; } } From ece6a68a9569ffe3a361ac9cf5d488a0d0f535cb Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 19 Dec 2022 09:45:22 +0300 Subject: [PATCH 02/13] fixes --- .../get_po_Item_history_list_model.dart | 2 +- .../get_quotation_analysis_list_model.dart | 2 +- .../leave_balance/leave_balance_screen.dart | 4 +- lib/ui/login/login_screen.dart | 6 +- lib/ui/marathon/marathon_provider.dart | 1 + lib/ui/marathon/widgets/marathon_banner.dart | 374 +++++++++--------- lib/ui/work_list/item_history_screen.dart | 3 +- 7 files changed, 198 insertions(+), 194 deletions(-) diff --git a/lib/models/get_po_Item_history_list_model.dart b/lib/models/get_po_Item_history_list_model.dart index 35e81d6..28a4f28 100644 --- a/lib/models/get_po_Item_history_list_model.dart +++ b/lib/models/get_po_Item_history_list_model.dart @@ -4,7 +4,7 @@ class GetPoItemHistoryList { String? bUYER; String? cLOSEDCODE; String? cREATIONDATE; - int? dISCOUNTPERCENTAGE; + num? dISCOUNTPERCENTAGE; int? fROMROWNUM; int? iTEMID; num? nETPRICE; diff --git a/lib/models/get_quotation_analysis_list_model.dart b/lib/models/get_quotation_analysis_list_model.dart index e041f95..e1926f0 100644 --- a/lib/models/get_quotation_analysis_list_model.dart +++ b/lib/models/get_quotation_analysis_list_model.dart @@ -5,7 +5,7 @@ class GetQuotationAnalysisList { int? nOOFROWS; String? qUOTBONUSQTY; String? qUOTDELIVERYDATE; - int? qUOTLINETOTAL; + num? qUOTLINETOTAL; String? qUOTMFGPARTNUM; String? qUOTNUM; num? qUOTQTY; diff --git a/lib/ui/leave_balance/leave_balance_screen.dart b/lib/ui/leave_balance/leave_balance_screen.dart index d1a64c6..8c346bc 100644 --- a/lib/ui/leave_balance/leave_balance_screen.dart +++ b/lib/ui/leave_balance/leave_balance_screen.dart @@ -43,9 +43,9 @@ class _LeaveBalanceState extends State { void getAbsenceTransactions() async { try { - // Utils.showLoading(context); + Utils.showLoading(context); absenceTransList = await LeaveBalanceApiClient().getAbsenceTransactions(-999, empID: selectedEmp); - //Utils.hideLoading(context); + Utils.hideLoading(context); setState(() {}); } catch (ex) { Utils.hideLoading(context); diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index a0ab3c9..04c3077 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -58,9 +58,9 @@ class _LoginScreenState extends State { void initState() { super.initState(); // checkFirebaseToken(); - if (kReleaseMode) { - checkDeviceSafety(); - } + // if (kReleaseMode) { + // checkDeviceSafety(); + // } } void checkDeviceSafety() async { diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index 128b634..bde62aa 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -390,6 +390,7 @@ class MarathonProvider extends ChangeNotifier { } bool checkIfPrivilegedForMarathon() { + return true; for (PrivilegeListModel element in AppState().privilegeListModel!) { if (element.serviceName == "Marathon") { if (element.previlege != null) { diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart index 0487c74..1b5533b 100644 --- a/lib/ui/marathon/widgets/marathon_banner.dart +++ b/lib/ui/marathon/widgets/marathon_banner.dart @@ -184,200 +184,202 @@ class MarathonBanner extends StatelessWidget { Widget build(BuildContext context) { MarathonProvider provider = context.read(); - return !provider.isPrivilegedWithMarathon - ? getUnPrivilegedMarathon(context) - : provider.marathonDetailModel.startTime != null - ? Container( - decoration: MyDecorations.shadowDecoration, - height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, - clipBehavior: Clip.antiAlias, - child: Stack( - children: [ - Transform( - alignment: Alignment.center, - transform: Matrix4.rotationY( - AppState().isArabic(context) ? math.pi : 0, - ), - child: SvgPicture.asset( - "assets/images/marathon_banner_bg.svg", - fit: BoxFit.fill, - width: double.infinity, - ), + return + // !provider.isPrivilegedWithMarathon + // ? getUnPrivilegedMarathon(context) + // : provider.marathonDetailModel.startTime != null + // ? + Container( + decoration: MyDecorations.shadowDecoration, + height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, + clipBehavior: Clip.antiAlias, + child: Stack( + children: [ + Transform( + alignment: Alignment.center, + transform: Matrix4.rotationY( + AppState().isArabic(context) ? math.pi : 0, + ), + child: SvgPicture.asset( + "assets/images/marathon_banner_bg.svg", + fit: BoxFit.fill, + width: double.infinity, + ), + ), + AppState().isArabic(context) + ? Positioned( + right: -15, + top: -10, + child: Transform.rotate( + angle: 10, + child: Container( + width: isTablet ? 70 : 65, + height: isTablet ? 40 : 32, + color: MyColors.darkDigitColor, ), - AppState().isArabic(context) - ? Positioned( - right: -15, - top: -10, - child: Transform.rotate( - angle: 10, - child: Container( - width: isTablet ? 70 : 65, - height: isTablet ? 40 : 32, - color: MyColors.darkDigitColor, + ), + ) + : Positioned( + left: -20, + top: -10, + child: Transform.rotate( + angle: 15, + child: Container( + width: isTablet ? 70 : 65, + height: isTablet ? 40 : 32, + color: MyColors.darkDigitColor, + ), + ), + ), + SizedBox( + width: double.infinity, + height: double.infinity, + child: Row( + children: [ + const Expanded( + flex: 3, + child: SizedBox( + width: double.infinity, + height: double.infinity, + ), + ), + Expanded( + flex: AppState().isArabic(context) ? 4 : 5, + child: SizedBox( + width: double.infinity, + height: double.infinity, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + AppState().isArabic(context) ? 0.height : 5.height, + Text( + LocaleKeys.getReadyForContest.tr(), + style: TextStyle( + fontSize: isTablet ? 20 : 11, + fontStyle: FontStyle.italic, + fontWeight: FontWeight.w600, + color: MyColors.white.withOpacity(0.83), + letterSpacing: -0.4, ), ), - ) - : Positioned( - left: -20, - top: -10, - child: Transform.rotate( - angle: 15, - child: Container( - width: isTablet ? 70 : 65, - height: isTablet ? 40 : 32, - color: MyColors.darkDigitColor, + Text( + AppState().isArabic(context) ? provider.marathonDetailModel.titleAr ?? "" : provider.marathonDetailModel.titleEn ?? "", + style: TextStyle( + fontStyle: FontStyle.italic, + fontSize: isTablet ? 30 : 19, + fontWeight: FontWeight.bold, + color: MyColors.white.withOpacity(0.83), + height: 32 / 22, ), ), - ), - SizedBox( - width: double.infinity, - height: double.infinity, - child: Row( - children: [ - const Expanded( - flex: 3, - child: SizedBox( - width: double.infinity, - height: double.infinity, - ), - ), - Expanded( - flex: AppState().isArabic(context) ? 4 : 5, - child: SizedBox( - width: double.infinity, - height: double.infinity, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - AppState().isArabic(context) ? 0.height : 5.height, - Text( - LocaleKeys.getReadyForContest.tr(), - style: TextStyle( - fontSize: isTablet ? 20 : 11, - fontStyle: FontStyle.italic, - fontWeight: FontWeight.w600, - color: MyColors.white.withOpacity(0.83), - letterSpacing: -0.4, - ), - ), - Text( - AppState().isArabic(context) ? provider.marathonDetailModel.titleAr ?? "" : provider.marathonDetailModel.titleEn ?? "", - style: TextStyle( - fontStyle: FontStyle.italic, - fontSize: isTablet ? 30 : 19, - fontWeight: FontWeight.bold, - color: MyColors.white.withOpacity(0.83), - height: 32 / 22, - ), - ), - isTablet ? 10.height : 3.height, - BuildCountdownTimer( - timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch, - provider: provider, - screenFlag: 0, - ), - ], - ).paddingOnly( - left: AppState().isArabic(context) ? 12 : 3, - right: AppState().isArabic(context) ? 3 : 12, - ) - ], - ), + isTablet ? 10.height : 3.height, + BuildCountdownTimer( + timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch, + provider: provider, + screenFlag: 0, ), - ), - ], + ], + ).paddingOnly( + left: AppState().isArabic(context) ? 12 : 3, + right: AppState().isArabic(context) ? 3 : 12, + ) + ], + ), + ), + ), + ], + ), + ), + AppState().isArabic(context) + ? Align( + alignment: Alignment.topRight, + child: SizedBox( + height: isTablet ? 30 : 20, + width: isTablet ? 45 : 35, + child: Transform.rotate( + angle: math.pi / 4.5, + child: Text( + LocaleKeys.brainMarathon.tr(), + textAlign: TextAlign.center, + maxLines: 2, + style: TextStyle( + color: MyColors.white, + fontWeight: FontWeight.bold, + fontSize: isTablet ? 8 : 6, + height: 1.2, + ), ), ), - AppState().isArabic(context) - ? Align( - alignment: Alignment.topRight, - child: SizedBox( - height: isTablet ? 30 : 20, - width: isTablet ? 45 : 35, - child: Transform.rotate( - angle: math.pi / 4.5, - child: Text( - LocaleKeys.brainMarathon.tr(), - textAlign: TextAlign.center, - maxLines: 2, - style: TextStyle( - color: MyColors.white, - fontWeight: FontWeight.bold, - fontSize: isTablet ? 8 : 6, - height: 1.2, - ), - ), - ), - ), - ).paddingOnly(top: 5) - : Align( - alignment: Alignment.topLeft, - child: SizedBox( - height: isTablet ? 30 : 20, - width: isTablet ? 45 : 35, - child: Transform.rotate( - angle: -math.pi / 4.5, - child: Text( - LocaleKeys.brainMarathon.tr(), - textAlign: TextAlign.center, - maxLines: 2, - style: TextStyle( - color: MyColors.kWhiteColor, - fontWeight: FontWeight.bold, - fontSize: isTablet ? 8 : 6, - height: 1.2, - ), - ), - ), - ), - ).paddingOnly(top: 5), - !AppState().isArabic(context) - ? Positioned( - right: 0, - bottom: 0, - child: RotatedBox( - quarterTurns: 4, - child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), - ).paddingAll(isTablet ? 20 : 15), - ) - : Positioned( - bottom: 0, - left: 0, - child: RotatedBox( - quarterTurns: 2, - child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), - ).paddingAll(isTablet ? 20 : 15), - ), - - ], - ).onPress(() async { - int remainingTimeInMinutes = DateTime.parse(provider.marathonDetailModel.startTime!).difference(DateTime.now()).inMinutes; + ), + ).paddingOnly(top: 5) + : Align( + alignment: Alignment.topLeft, + child: SizedBox( + height: isTablet ? 30 : 20, + width: isTablet ? 45 : 35, + child: Transform.rotate( + angle: -math.pi / 4.5, + child: Text( + LocaleKeys.brainMarathon.tr(), + textAlign: TextAlign.center, + maxLines: 2, + style: TextStyle( + color: MyColors.kWhiteColor, + fontWeight: FontWeight.bold, + fontSize: isTablet ? 8 : 6, + height: 1.2, + ), + ), + ), + ), + ).paddingOnly(top: 5), + !AppState().isArabic(context) + ? Positioned( + right: 0, + bottom: 0, + child: RotatedBox( + quarterTurns: 4, + child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), + ).paddingAll(isTablet ? 20 : 15), + ) + : Positioned( + bottom: 0, + left: 0, + child: RotatedBox( + quarterTurns: 2, + child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), + ).paddingAll(isTablet ? 20 : 15), + ), + ], + ).onPress(() async { + int remainingTimeInMinutes = DateTime.parse(provider.marathonDetailModel.startTime!).difference(DateTime.now()).inMinutes; - if (remainingTimeInMinutes > 2) { - Utils.showLoading(context); - try { - await provider.initializeVideoPlayer().then((_) { - Utils.hideLoading(context); - provider.startTimerForSponsorVideo(); - Navigator.pushNamed(context, AppRoutes.marathonSponsorVideoScreen); - }); - } catch (e) { - if (kDebugMode) { - print("Error in VideoPlayer: ${e.toString()}"); - } - Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); - } - } else { - Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); - } - }), - ) - : const SizedBox(); + if (remainingTimeInMinutes > 2) { + Utils.showLoading(context); + try { + await provider.initializeVideoPlayer().then((_) { + Utils.hideLoading(context); + provider.startTimerForSponsorVideo(); + Navigator.pushNamed(context, AppRoutes.marathonSponsorVideoScreen); + }); + } catch (e) { + if (kDebugMode) { + print("Error in VideoPlayer: ${e.toString()}"); + } + Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); + } + } else { + Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); + } + }), + ); + // ) + // : const SizedBox(); } } diff --git a/lib/ui/work_list/item_history_screen.dart b/lib/ui/work_list/item_history_screen.dart index 562b59f..a3c34a9 100644 --- a/lib/ui/work_list/item_history_screen.dart +++ b/lib/ui/work_list/item_history_screen.dart @@ -88,7 +88,8 @@ class _ItemHistoryScreenState extends State { children: [ if (moItemHistoryList.isNotEmpty) loadMoItemHistoryData(), if (poItemHistoryList.isNotEmpty) loadPoItemHistoryData(), - if (quotationAnalysisList.isNotEmpty) loadQuotationAnalysisData() + if (quotationAnalysisList.isNotEmpty) loadQuotationAnalysisData(), + if (moItemHistoryList.isEmpty && poItemHistoryList.isEmpty && quotationAnalysisList.isEmpty) Utils.getNoDataWidget(context), ], ), ); From 9602e95fe7b5161a7bd98c06c81a22589bf31b87 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 19 Dec 2022 09:48:25 +0300 Subject: [PATCH 03/13] improvements --- lib/classes/consts.dart | 4 ++-- lib/extensions/widget_extensions.dart | 2 +- lib/ui/profile/personal_info.dart | 13 ++++++------- lib/ui/profile/profile_screen.dart | 17 +++++++---------- lib/ui/profile/widgets/profile_panel.dart | 4 ++-- 5 files changed, 18 insertions(+), 22 deletions(-) diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index ac520b1..3d58efd 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -2,9 +2,9 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; 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://uat.hmgwebservices.com"; // UAT server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA server - // static String baseUrl = "https://hmgwebservices.com"; // Live 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/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index b52ef3e..a52f11a 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -58,7 +58,7 @@ extension WidgetExtensions on Widget { ), ], ), - alignment: center == true ? Alignment.center : null, + alignment: center ? Alignment.center : null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/ui/profile/personal_info.dart b/lib/ui/profile/personal_info.dart index 79d0995..a4a9700 100644 --- a/lib/ui/profile/personal_info.dart +++ b/lib/ui/profile/personal_info.dart @@ -21,25 +21,24 @@ class PersonalInfo extends StatelessWidget { title: LocaleKeys.profile_personalInformation.tr(), ), backgroundColor: MyColors.backgroundColor, - body: SizedBox( - width: MediaQuery.of(context).size.width, + body: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, - // mainAxisSize: MainAxisSize.min, + mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: [ LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), (memberInformationList.eMPLOYMENTCATEGORYMEANING ?? "").toText16(), - 20.height, + 12.height, LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), (memberInformationList.lOCATIONNAME ?? "").toText16(), - 20.height, + 12.height, LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), (memberInformationList.eMPLOYEEMOBILENUMBER ?? "").toText16(), - 20.height, + 12.height, LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), (memberInformationList.bUSINESSGROUPNAME ?? "").toText16(), - 20.height, + 12.height, LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), (memberInformationList.pAYROLLNAME ?? "").toText16(), ], diff --git a/lib/ui/profile/profile_screen.dart b/lib/ui/profile/profile_screen.dart index 0a78873..6060cbf 100644 --- a/lib/ui/profile/profile_screen.dart +++ b/lib/ui/profile/profile_screen.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:io'; import 'dart:ui'; @@ -76,15 +75,13 @@ class _ProfileScreenState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon( - Icons.arrow_back_ios, - color: Colors.white, - ), - ), + CircleAvatar( + radius: 18, + backgroundColor: Colors.black.withOpacity(.21), + child: const Icon(Icons.arrow_back_ios_rounded, color: Colors.white, size: 18).paddingOnly(right: 4), + ).onPress(() { + Navigator.pop(context); + }), InkWell( onTap: () { // startImageSheet(); diff --git a/lib/ui/profile/widgets/profile_panel.dart b/lib/ui/profile/widgets/profile_panel.dart index 440fbb3..3440cc9 100644 --- a/lib/ui/profile/widgets/profile_panel.dart +++ b/lib/ui/profile/widgets/profile_panel.dart @@ -51,8 +51,8 @@ class ProfilePanel extends StatelessWidget { : ClipOval( child: Image.memory( Utils.dataFromBase64String(memberInformationList.eMPLOYEEIMAGE!), - width: 75, - height: 75, + width: 68, + height: 68, fit: BoxFit.fill, ), ); From 5be9adca31b54bde811b8a22f7bc62b080401830 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 19 Dec 2022 15:00:08 +0300 Subject: [PATCH 04/13] fixes --- lib/classes/date_uitl.dart | 2 +- lib/ui/my_team/team_members.dart | 160 ++++++++++++++++--------------- 2 files changed, 83 insertions(+), 79 deletions(-) diff --git a/lib/classes/date_uitl.dart b/lib/classes/date_uitl.dart index a1e52d9..29edb2f 100644 --- a/lib/classes/date_uitl.dart +++ b/lib/classes/date_uitl.dart @@ -40,7 +40,7 @@ class DateUtil { } static DateTime convertSimpleStringDateToDate(String date) { - return DateFormat("MM/dd/yyyy hh:mm:ss").parse(date); + return DateFormat("MM/dd/yyyy hh:mm:ss a").parse(date.toUpperCase()); } static DateTime convertSimpleStringDateToDateddMMyyyy(String date) { diff --git a/lib/ui/my_team/team_members.dart b/lib/ui/my_team/team_members.dart index f6d33d8..c4defc4 100644 --- a/lib/ui/my_team/team_members.dart +++ b/lib/ui/my_team/team_members.dart @@ -15,6 +15,7 @@ import 'package:url_launcher/url_launcher.dart'; class TeamMembers extends StatefulWidget { final String? selectedEmp; + const TeamMembers({this.selectedEmp, Key? key}) : super(key: key); @override @@ -22,8 +23,8 @@ class TeamMembers extends StatefulWidget { } class _TeamMembersState extends State { - String searchEmpEmail =""; - String searchEmpName =""; + String searchEmpEmail = ""; + String searchEmpName = ""; String searchEmpNo = ""; String? empId; @@ -32,14 +33,14 @@ class _TeamMembersState extends State { void initState() { super.initState(); - employeeSubordinates(); + employeeSubordinates(); } void employeeSubordinates() async { try { Utils.showLoading(context); getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); - getEmployeeSubordinatesList = await MyTeamApiClient().employeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString(),getEmployeeSubordinates?.eMPLOYEENUMBER); + getEmployeeSubordinatesList = await MyTeamApiClient().employeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString(), getEmployeeSubordinates?.eMPLOYEENUMBER); Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -52,80 +53,83 @@ class _TeamMembersState extends State { Widget build(BuildContext context) { getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; return Scaffold( - appBar: AppBarWidget( - context, - title: LocaleKeys.teamMembers.tr(), + appBar: AppBarWidget( + context, + title: LocaleKeys.teamMembers.tr(), + ), + backgroundColor: MyColors.backgroundColor, + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + getEmployeeSubordinatesList.isEmpty + ? Container(margin: const EdgeInsets.only(top: 100), child: Utils.getNoDataWidget(context)) + : ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: const EdgeInsets.only(top: 12), + separatorBuilder: (BuildContext cxt, int index) => 12.height, + itemCount: getEmployeeSubordinatesList.length, + itemBuilder: (BuildContext context, int index) { + var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER}'); + return InkWell( + onTap: () async { + Navigator.pushNamed(context, AppRoutes.employeeDetails, arguments: getEmployeeSubordinatesList[index]); + }, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + getEmployeeSubordinatesList[index].eMPLOYEEIMAGE == null + ? SvgPicture.asset( + "assets/images/user.svg", + height: 34, + width: 34, + ).paddingOnly(top: 4) + : Container( + height: 34, + width: 34, + child: CircleAvatar( + radius: 25, + backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinatesList[index].eMPLOYEEIMAGE!)), + backgroundColor: Colors.black, + ).paddingOnly(top: 4), + ), + 9.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // "Present".toText13(color: MyColors.greenColor), + "${getEmployeeSubordinatesList[index].eMPLOYEENAME}".toText16(color: MyColors.grey3AColor), + "${getEmployeeSubordinatesList[index].pOSITIONNAME}".toText10(color: MyColors.grey57Color), + ], + ).expanded, + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER == "" + ? SvgPicture.asset("assets/images/call-disable.svg", width: 22, height: 22) + : InkWell( + onTap: () { + launchUrl(phoneNumber); + }, + child: SvgPicture.asset("assets/images/call.svg", width: 22, height: 22), + ), + 8.height, + const Icon( + Icons.arrow_forward_outlined, + color: MyColors.grey3AColor, + size: 18, + ), + ], + ), + ], + ).paddingOnly(top: 13, bottom: 13, right: 12, left: 14).objectContainerView(radius: 10, disablePadding: true), + ).paddingOnly(left: 16.0, right: 16.0); + }), + ], ), - backgroundColor: MyColors.backgroundColor, - body: SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Column( - children: [ - getEmployeeSubordinatesList.isEmpty - ? Container( - margin: const EdgeInsets.only(top: 100), - child: Utils.getNoDataWidget(context)): - ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - padding: const EdgeInsets.only(top: 12), - separatorBuilder: (BuildContext cxt,int index) => 12.height, - itemCount: getEmployeeSubordinatesList.length, - itemBuilder: (BuildContext context, int index) { - var phoneNumber = Uri.parse('tel:${getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER}'); - return InkWell( - onTap: () async { - Navigator.pushNamed(context, AppRoutes.employeeDetails, arguments: getEmployeeSubordinatesList[index]); - }, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - getEmployeeSubordinatesList[index].eMPLOYEEIMAGE == null - ? SvgPicture.asset("assets/images/user.svg",height: 34, width: 34, ).paddingOnly(top: 4) - : Container( - height: 34, - width: 34, - child: CircleAvatar( - radius: 25, - backgroundImage: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinatesList[index].eMPLOYEEIMAGE!)), - backgroundColor: Colors.black, - ).paddingOnly(top: 4), - ), - 9.width, - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // "Present".toText13(color: MyColors.greenColor), - "${getEmployeeSubordinatesList[index].eMPLOYEENAME}".toText16(color: MyColors.grey3AColor), - "${getEmployeeSubordinatesList[index].pOSITIONNAME}".toText10( color: MyColors.grey57Color), - ], - ).expanded, - Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - getEmployeeSubordinatesList[index].eMPLOYEEMOBILENUMBER == "" - ? SvgPicture.asset("assets/images/call-disable.svg", width: 22, height: 22) - :InkWell( - onTap: () { - launchUrl(phoneNumber); - }, - child: SvgPicture.asset("assets/images/call.svg", width: 22, height: 22), - ), - 8.height, - const Icon( - Icons.arrow_forward_outlined, - color: MyColors.grey3AColor, - size: 18, - ), - ], - ), - ], - ).paddingOnly(top: 13, bottom: 13, right: 12, left: 14).objectContainerView(radius: 10, disablePadding: true), - ); - }), - ], - ) - )); + ), + ); } } From 0077a876d9f260cc90fcbe75b375fce9839c9751 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 19 Dec 2022 16:29:27 +0300 Subject: [PATCH 05/13] improvements --- lib/generated_plugin_registrant.dart | 2 -- lib/ui/profile/personal_info.dart | 46 +++++++++++++++------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/generated_plugin_registrant.dart b/lib/generated_plugin_registrant.dart index 288ba42..37be8d8 100644 --- a/lib/generated_plugin_registrant.dart +++ b/lib/generated_plugin_registrant.dart @@ -16,7 +16,6 @@ import 'package:image_picker_for_web/image_picker_for_web.dart'; import 'package:shared_preferences_web/shared_preferences_web.dart'; import 'package:url_launcher_web/url_launcher_web.dart'; import 'package:video_player_web/video_player_web.dart'; -import 'package:wakelock_web/wakelock_web.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; @@ -32,6 +31,5 @@ void registerPlugins(Registrar registrar) { SharedPreferencesPlugin.registerWith(registrar); UrlLauncherPlugin.registerWith(registrar); VideoPlayerPlugin.registerWith(registrar); - WakelockWeb.registerWith(registrar); registrar.registerMessageHandler(); } diff --git a/lib/ui/profile/personal_info.dart b/lib/ui/profile/personal_info.dart index a4a9700..84e45ff 100644 --- a/lib/ui/profile/personal_info.dart +++ b/lib/ui/profile/personal_info.dart @@ -21,28 +21,30 @@ class PersonalInfo extends StatelessWidget { title: LocaleKeys.profile_personalInformation.tr(), ), backgroundColor: MyColors.backgroundColor, - body: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), - (memberInformationList.eMPLOYMENTCATEGORYMEANING ?? "").toText16(), - 12.height, - LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), - (memberInformationList.lOCATIONNAME ?? "").toText16(), - 12.height, - LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), - (memberInformationList.eMPLOYEEMOBILENUMBER ?? "").toText16(), - 12.height, - LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), - (memberInformationList.bUSINESSGROUPNAME ?? "").toText16(), - 12.height, - LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), - (memberInformationList.pAYROLLNAME ?? "").toText16(), - ], - ).objectContainerView().paddingAll(21), + body: ListView( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + LocaleKeys.category.tr().toText13(color: MyColors.lightGrayColor), + (memberInformationList.eMPLOYMENTCATEGORYMEANING ?? "").toText16(), + 12.height, + LocaleKeys.address.tr().toText13(color: MyColors.lightGrayColor), + (memberInformationList.lOCATIONNAME ?? "").toText16(), + 12.height, + LocaleKeys.phoneNumber.tr().toText13(color: MyColors.lightGrayColor), + (memberInformationList.eMPLOYEEMOBILENUMBER ?? "").toText16(), + 12.height, + LocaleKeys.businessGroup.tr().toText13(color: MyColors.lightGrayColor), + (memberInformationList.bUSINESSGROUPNAME ?? "").toText16(), + 12.height, + LocaleKeys.Payroll.tr().toText13(color: MyColors.lightGrayColor), + (memberInformationList.pAYROLLNAME ?? "").toText16(), + ], + ).objectContainerView(center: false).paddingAll(21), + ], ), ); } From e40cd2c5c82616367a664f5c5899d38d2c3c4e6f Mon Sep 17 00:00:00 2001 From: "Aamir.Muhammad" Date: Mon, 19 Dec 2022 16:49:04 +0300 Subject: [PATCH 06/13] Chat Error Handling & Voice --- lib/api/chat/chat_api_client.dart | 11 +- lib/classes/consts.dart | 4 +- lib/provider/chat_provider_model.dart | 143 +++++++++++++++++++- lib/ui/chat/chat_bubble.dart | 78 ++++++++++- lib/ui/chat/chat_detailed_screen.dart | 186 +++++++++++++++++++------- pubspec.yaml | 4 + 6 files changed, 363 insertions(+), 63 deletions(-) diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart index 5bceb24..409295f 100644 --- a/lib/api/chat/chat_api_client.dart +++ b/lib/api/chat/chat_api_client.dart @@ -33,11 +33,12 @@ class ChatApiClient { }, ); if (!kReleaseMode) { + print("Status Code is ================" + response.statusCode.toString()); logger.i("res: " + response.body); } if (response.statusCode == 200) { userLoginResponse = user.userAutoLoginModelFromJson(response.body); - } else if (response.statusCode == 504) { + } else if (response.statusCode == 501 || response.statusCode == 502 || response.statusCode == 503 || response.statusCode == 504) { getUserLoginToken(); } else { userLoginResponse = user.userAutoLoginModelFromJson(response.body); @@ -141,11 +142,16 @@ class ChatApiClient { // Download File For Chat Future downloadURL({required String fileName, required String fileTypeDescription}) async { + print(fileName); + print(fileTypeDescription); + print("${ApiConsts.chatMediaImageUploadUrl}download"); + print(AppState().chatDetails!.response!.token); Response response = await ApiClient().postJsonForResponse( "${ApiConsts.chatMediaImageUploadUrl}download", {"fileType": fileTypeDescription, "fileName": fileName, "fileSource": 1}, token: AppState().chatDetails!.response!.token, ); + Uint8List data = Uint8List.fromList(response.bodyBytes); return data; } @@ -159,11 +165,10 @@ class ChatApiClient { ); if (!kReleaseMode) { logger.i("res: " + response.body); - print("Images Status Coe is ============== " + response.statusCode.toString()); } if (response.statusCode == 200) { imagesData = chatUserImageModelFromJson(response.body); - } else if (response.statusCode == 504 || response.statusCode == 500) { + } else if (response.statusCode == 500 || response.statusCode == 504) { getUsersImages(encryptedEmails: encryptedEmails); } else { Utils.showToast("Something went wrong while loading images"); diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 0559996..c147ea3 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -3,8 +3,8 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA 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/provider/chat_provider_model.dart b/lib/provider/chat_provider_model.dart index a62016f..5f28b0b 100644 --- a/lib/provider/chat_provider_model.dart +++ b/lib/provider/chat_provider_model.dart @@ -2,18 +2,20 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; import 'package:http/http.dart'; -import 'package:just_audio/just_audio.dart'; +import 'package:just_audio/just_audio.dart' as JustAudio; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/app_permissions.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/encryption.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/main.dart'; -import 'package:mohem_flutter_app/models/chat/chat_count_conversation_model.dart'; import 'package:mohem_flutter_app/models/chat/chat_user_image_model.dart'; import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart'; import 'package:mohem_flutter_app/models/chat/get_single_user_chat_list_model.dart'; @@ -23,6 +25,7 @@ import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart'; import 'package:mohem_flutter_app/widgets/image_picker.dart'; import 'package:open_file/open_file.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/signalr_client.dart'; import 'package:uuid/uuid.dart'; @@ -37,7 +40,6 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { bool isLoading = true; bool isChatScreenActive = false; int receiverID = 0; - late File selectedFile; bool isFileSelected = false; String sFileType = ""; @@ -53,9 +55,13 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { Future getUserAutoLoginToken() async { userLoginToken.UserAutoLoginModel userLoginResponse = await ChatApiClient().getUserLoginToken(); + print("======================================= Chat Login Token Check ====================================="); + logger.d(userLoginResponse.toJson()); + print("======================================= Chat Login Token Check ====================================="); if (userLoginResponse.response != null) { AppState().setchatUserDetails = userLoginResponse; } else { + AppState().setchatUserDetails = userLoginResponse; Utils.showToast( userLoginResponse.errorResponses!.first.fieldName.toString() + " Erorr", ); @@ -903,7 +909,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } void setMsgTune() async { - AudioPlayer player = AudioPlayer(); + JustAudio.AudioPlayer player = JustAudio.AudioPlayer(); await player.setVolume(1.0); String audioAsset = ""; if (Platform.isAndroid) { @@ -949,4 +955,133 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { logger.d([reciptUser, currentUser]); await chatHubConnection.invoke("UserTypingAsync", args: [reciptUser, currentUser]); } + + // Audio Recoding Work + Timer? _timer; + int _recodeDuration = 0; + bool isRecoding = false; + bool isPause = false; + bool isPlaying = false; + String? path; + String? musicFile; + late Directory appDirectory; + late RecorderController recorderController; + late PlayerController playerController; + + //////// Audio Recoding Work //////////////////// + + Future initAudio() async { + appDirectory = await getApplicationDocumentsDirectory(); + path = "${appDirectory.path}/${AppState().chatDetails!.response!.id}-${DateTime.now().microsecondsSinceEpoch}.aac"; + recorderController = RecorderController() + ..androidEncoder = AndroidEncoder.aac + ..androidOutputFormat = AndroidOutputFormat.mpeg4 + ..iosEncoder = IosEncoder.kAudioFormatMPEG4AAC + ..sampleRate = 8000 + ..bitRate = 32000; + playerController = PlayerController(); + } + + void disposeAudio() { + isRecoding = false; + isPlaying = false; + isPause = false; + recorderController.dispose(); + playerController.dispose(); + } + + void startRecoding() async { + PermissionStatus status = await Permission.microphone.request(); + print(status); + if (status.isDenied == true) { + startRecoding(); + } else { + recorderController.reset(); + await recorderController.record(path); + _recodeDuration = 0; + _startTimer(); + isRecoding = !isRecoding; + notifyListeners(); + } + } + + void _startTimer() { + _timer?.cancel(); + _timer = Timer.periodic(const Duration(seconds: 1), (Timer t) { + _recodeDuration++; + buildTimer(); + notifyListeners(); + }); + } + + Future pauseRecoding() async { + isPause = true; + isPlaying = true; + recorderController.pause(); + path = await recorderController.stop(false); + print(path); + File file = File(path!); + file.readAsBytesSync(); + await playerController.preparePlayer(file.path, 1.0); + var tempDuration = _recodeDuration; + _recodeDuration = tempDuration; + _timer?.cancel(); + notifyListeners(); + } + + void resumeRecoding() { + isPause = false; + isPlaying = false; + isRecoding = true; + recorderController.record(path); + _startTimer(); + } + + Future deleteRecoding() async { + print(path); + _recodeDuration = 0; + _timer?.cancel(); + // path = await recorderController.stop(false); + recorderController.reset(); + print(path); + if (path != null && path!.isNotEmpty) { + File delFile = File(path!); + double fileSizeInKB = delFile.lengthSync() / 1024; + double fileSizeInMB = fileSizeInKB / 1024; + debugPrint("Deleted file size: ${delFile.lengthSync()}"); + debugPrint("Deleted file size in KB: " + fileSizeInKB.toString()); + debugPrint("Deleted file size in MB: " + fileSizeInMB.toString()); + if (await delFile.exists()) { + delFile.delete(); + } + isPause = false; + isRecoding = false; + isPlaying = false; + notifyListeners(); + } + } + + String buildTimer() { + String minutes = _formatNum(_recodeDuration ~/ 60); + String seconds = _formatNum(_recodeDuration % 60); + return '$minutes : $seconds'; + } + + String _formatNum(int number) { + String numberStr = number.toString(); + if (number < 10) { + numberStr = '0' + numberStr; + } + return numberStr; + } + + void playRecoding() async { + isPlaying = true; + await playerController.startPlayer(finishMode: FinishMode.stop); + } + + void playOrPause() async { + playerController.playerState == PlayerState.playing ? await playerController.pausePlayer() : playRecoding(); + notifyListeners(); + } } diff --git a/lib/ui/chat/chat_bubble.dart b/lib/ui/chat/chat_bubble.dart index 8978ff1..06afecf 100644 --- a/lib/ui/chat/chat_bubble.dart +++ b/lib/ui/chat/chat_bubble.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; @@ -120,10 +121,14 @@ class ChatBubble extends StatelessWidget { else Row( children: [ - if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) + if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 + // || fileTypeID == 2 + ) SvgPicture.asset(data.getType(fileTypeName ?? ""), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 0, right: 10), (cItem.contant ?? "").toText12().expanded, - if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) const Icon(Icons.remove_red_eye, size: 16) + if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 + //|| fileTypeID == 2 + ) const Icon(Icons.remove_red_eye, size: 16) ], ), Align( @@ -217,10 +222,15 @@ class ChatBubble extends StatelessWidget { else Row( children: [ - if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) + if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 + // || fileTypeID == 2 + ) SvgPicture.asset(data.getType(fileTypeName ?? ""), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 0, right: 10), (cItem.contant ?? "").toText12(color: Colors.white).expanded, - if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 || fileTypeID == 2) const Icon(Icons.remove_red_eye, color: Colors.white, size: 16) + if (fileTypeID == 1 || fileTypeID == 5 || fileTypeID == 7 || fileTypeID == 6 || fileTypeID == 8 + //|| fileTypeID == 2 + ) + const Icon(Icons.remove_red_eye, color: Colors.white, size: 16) ], ), Align( @@ -274,3 +284,63 @@ class ChatBubble extends StatelessWidget { } } } + +class WaveBubble extends StatelessWidget { + final PlayerController playerController; + final VoidCallback onTap; + final bool isPlaying; + + const WaveBubble({ + Key? key, + required this.playerController, + required this.onTap, + required this.isPlaying, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + gradient: const LinearGradient( + transform: GradientRotation(.83), + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ], + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + onPressed: onTap, + icon: Icon(isPlaying ? Icons.stop : Icons.play_arrow), + color: Colors.white, + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + ), + AudioFileWaveforms( + size: Size(MediaQuery.of(context).size.width / 2, 10), + playerController: playerController, + padding: EdgeInsets.zero, + margin: EdgeInsets.zero, + playerWaveStyle: const PlayerWaveStyle( + fixedWaveColor: Colors.white, + liveWaveColor:MyColors.lightGreenColor, + showTop: true, + showBottom: true, + waveCap: StrokeCap.round, + seekLineThickness: 3, + visualizerHeight: 6, + backgroundColor: Colors.transparent + ), + ), + ], + ), + ); + } +} diff --git a/lib/ui/chat/chat_detailed_screen.dart b/lib/ui/chat/chat_detailed_screen.dart index 379fe2b..5d3648e 100644 --- a/lib/ui/chat/chat_detailed_screen.dart +++ b/lib/ui/chat/chat_detailed_screen.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -62,6 +63,12 @@ class _ChatDetailScreenState extends State { _rc.loadComplete(); } + @override + void dispose() { + data.disposeAudio(); + super.dispose(); + } + @override Widget build(BuildContext context) { params = ModalRoute.of(context)!.settings.arguments as ChatDetailedScreenParams; @@ -73,6 +80,7 @@ class _ChatDetailScreenState extends State { loadMore: false, isNewChat: params!.isNewChat!, ); + data.initAudio(); } return Scaffold( @@ -181,62 +189,140 @@ class _ChatDetailScreenState extends State { height: 1, color: MyColors.lightGreyEFColor, ), - TextField( - controller: m.message, - decoration: InputDecoration( - hintText: m.isFileSelected ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(), - hintStyle: TextStyle(color: m.isFileSelected ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14), - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - errorBorder: InputBorder.none, - disabledBorder: InputBorder.none, - filled: true, - fillColor: MyColors.white, - contentPadding: const EdgeInsets.only( - left: 21, - top: 20, - bottom: 20, - ), - prefixIconConstraints: const BoxConstraints(), - prefixIcon: m.sFileType.isNotEmpty - ? SvgPicture.asset(m.getType(m.sFileType), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 21, right: 15) - : null, - suffixIcon: SizedBox( - width: 100, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, // added line - children: [ - if (m.sFileType.isNotEmpty) - Row( - children: [ - const Icon(Icons.cancel, size: 15, color: MyColors.redA3Color).paddingOnly(right: 5), - ("Clear").toText11(color: MyColors.redA3Color, isUnderLine: true).paddingOnly(left: 0), - ], - ).onPress(() => m.removeAttachment()).paddingOnly(right: 25), - if (m.sFileType.isEmpty) - RotationTransition( - turns: const AlwaysStoppedAnimation(45 / 360), - child: const Icon(Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor).onPress( - () => m.selectImageToUpload(context), + if (m.isRecoding) + Column( + children: [ + Row( + children: [ + Text(m.buildTimer()).paddingAll(10), + if (m.isRecoding && m.isPlaying) + WaveBubble( + playerController: m.playerController, + onTap: () { + m.playOrPause(); + }, + isPlaying: m.playerController.playerState == PlayerState.playing) + .expanded + else + AudioWaveforms( + waveStyle: const WaveStyle( + waveColor: MyColors.lightGreenColor, + middleLineColor: Colors.transparent, + extendWaveform: true, + showBottom: true, + showTop: true, + waveThickness: 2, + showMiddleLine: false, + middleLineThickness: 0, ), - ).paddingOnly(right: 25), - SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26).onPress( + padding: const EdgeInsets.all(5), + shouldCalculateScrolledPosition: false, + margin: EdgeInsets.zero, + size: const Size(double.infinity, 30.0), + recorderController: m.recorderController, + backgroundColor: Colors.white, + ).expanded, + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Icon( + Icons.delete_outlined, + size: 26, + color: MyColors.lightGreenColor, + ).paddingAll(10).onPress(() { + m.deleteRecoding(); + }), + if (m.isPause) + const Icon( + Icons.mic, + size: 26, + color: MyColors.lightGreenColor, + ).paddingOnly(right: 15).onPress(() { + m.resumeRecoding(); + }), + if (!m.isPause) + const Icon( + Icons.pause_circle_outline, + size: 26, + color: MyColors.lightGreenColor, + ).paddingOnly(right: 15).onPress(() { + m.pauseRecoding(); + }), + SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26) + .onPress( + () => m.sendChatMessage(context, + targetUserId: params!.chatUser!.id!, + userStatus: params!.chatUser!.userStatus ?? 0, + userEmail: params!.chatUser!.email!, + targetUserName: params!.chatUser!.userName!), + ) + .paddingOnly(right: 21), + ], + ), + ], + ).objectContainerView(disablePadding: true, radius: 0), + if (!m.isRecoding) + Row( + children: [ + TextField( + controller: m.message, + decoration: InputDecoration( + hintText: m.isFileSelected ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(), + hintStyle: TextStyle(color: m.isFileSelected ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14), + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + filled: true, + fillColor: MyColors.white, + contentPadding: const EdgeInsets.only( + left: 21, + top: 20, + bottom: 20, + ), + prefixIconConstraints: const BoxConstraints(), + prefixIcon: m.sFileType.isNotEmpty + ? SvgPicture.asset(m.getType(m.sFileType), height: 30, width: 22, alignment: Alignment.center, fit: BoxFit.cover).paddingOnly(left: 21, right: 15) + : null, + ), + onChanged: (val) { + m.userTypingInvoke(currentUser: AppState().chatDetails!.response!.id!, reciptUser: params!.chatUser!.id!); + }, + ).expanded, + if (m.sFileType.isNotEmpty) + Row( + children: [ + const Icon(Icons.cancel, size: 15, color: MyColors.redA3Color).paddingOnly(right: 5), + ("Clear").toText11(color: MyColors.redA3Color, isUnderLine: true).paddingOnly(left: 0), + ], + ).onPress(() => m.removeAttachment()).paddingOnly(right: 15), + if (m.sFileType.isEmpty) + RotationTransition( + turns: const AlwaysStoppedAnimation(45 / 360), + child: const Icon(Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor).onPress( + () => m.selectImageToUpload(context), + ), + ).paddingOnly(right: 15), + Icon( + Icons.mic, + color: MyColors.lightGreenColor, + ).paddingOnly(right: 15).onPress(() { + m.startRecoding(); + }), + SvgPicture.asset("assets/icons/chat/chat_send_icon.svg", height: 26, width: 26) + .onPress( () => m.sendChatMessage(context, targetUserId: params!.chatUser!.id!, userStatus: params!.chatUser!.userStatus ?? 0, userEmail: params!.chatUser!.email!, targetUserName: params!.chatUser!.userName!), - ), - ], - ), - ).paddingOnly(right: 21), - ), - onChanged: (val) { - m.userTypingInvoke(currentUser: AppState().chatDetails!.response!.id!, reciptUser: params!.chatUser!.id!); - }, - ), + ) + .paddingOnly(right: 21), + ], + ).objectContainerView(disablePadding: true, radius: 0), ], )); }, diff --git a/pubspec.yaml b/pubspec.yaml index baa5e9f..c0b77bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -92,6 +92,10 @@ dependencies: swipe_to: ^1.0.2 flutter_webrtc: ^0.9.16 camera: ^0.10.0+4 + + #Chat Voice Message Recoding & Play + record: ^4.4.3 + audio_waveforms: ^0.1.5+1 # animated_text_kit: ^4.2.2 #Encryption From 696a6881c4ba38a61eff6398089eaf554a87b6cf Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 20 Dec 2022 15:23:03 +0300 Subject: [PATCH 07/13] date fixes & Items of sale updates --- lib/classes/date_uitl.dart | 26 +++++++++++++++++-- .../fragments/my_posted_ads_fragment.dart | 19 ++++++++++---- pubspec.yaml | 2 +- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/lib/classes/date_uitl.dart b/lib/classes/date_uitl.dart index 29edb2f..ec5358d 100644 --- a/lib/classes/date_uitl.dart +++ b/lib/classes/date_uitl.dart @@ -6,7 +6,6 @@ class DateUtil { /// /// - static DateTime convertStringToDateMarathon(String date) { // /Date(1585774800000+0300)/ if (date != null) { @@ -40,7 +39,30 @@ class DateUtil { } static DateTime convertSimpleStringDateToDate(String date) { - return DateFormat("MM/dd/yyyy hh:mm:ss a").parse(date.toUpperCase()); + // print(date.toUpperCase()); + return getDateTimeFromString(date.split(" ")[0], date.toUpperCase().split(" ")[1] + " " + date.toUpperCase().split(" ")[2]); + } + + static DateTime getDateTimeFromString(String date, String time) { + var hours = num.parse(time.split(":")[0]); + var mins = time.split(":")[1]; + var secs = time.split(":")[2].split(" ")[0]; + + String meridium = time.split(" ")[1]; + if (meridium == "PM") { + if (hours != 12) { + hours = hours + 12; + } + } + if (meridium == "AM") { + if (hours == 12) { + hours = 00; + } + } + date = date + " $hours:$mins:$secs"; + DateTime returnDate = DateFormat("MM/dd/yyyy HH:mm:ss").parse(date); + + return returnDate; } static DateTime convertSimpleStringDateToDateddMMyyyy(String date) { diff --git a/lib/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart b/lib/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart index 64b8bf9..02db148 100644 --- a/lib/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart +++ b/lib/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart @@ -141,7 +141,7 @@ class _MyPostedAdsFragmentState extends State { Row( children: [ LocaleKeys.remove.tr().toText12(color: MyColors.redColor).center.onPress(() { - updateItemForSale(employeePostedAdsList[index].itemSaleID!); + updateItemForSale(employeePostedAdsList[index]); }).expanded, Container(width: 1, height: 30, color: MyColors.lightGreyEFColor), LocaleKeys.edit.tr().toText12(color: MyColors.gradiantEndColor).center.onPress(() { @@ -172,7 +172,7 @@ class _MyPostedAdsFragmentState extends State { ); } - void updateItemForSale(int itemSaleID) async { + void updateItemForSale(EmployeePostedAds employeePostedAds) async { Utils.showLoading(context); String? empNum = AppState().memberInformationList?.eMPLOYEENUMBER; @@ -180,15 +180,24 @@ class _MyPostedAdsFragmentState extends State { String? loginTokenID = AppState().postParamsObject?.logInTokenID; String? tokenID = AppState().postParamsObject?.tokenID; - var request = http.MultipartRequest('POST', Uri.parse("${ApiConsts.cocRest}Mohemm_ITG_UpdateItemForSale")); - request.fields['itemSaleID'] = itemSaleID.toString(); + var request = http.MultipartRequest('POST', Uri.parse("${ApiConsts.cocRest}Mohemm_ITG_UpdateItemForSaleMobile")); + request.fields['ItgItemSaleID'] = employeePostedAds.itemSaleID.toString(); + request.fields['ItgCategoryID'] = employeePostedAds.categoryID.toString(); + request.fields['ItgTitle'] = employeePostedAds.title!; + request.fields['ItgDescription'] = employeePostedAds.description!; + request.fields['ItgQuotePrice'] = employeePostedAds.quotePrice.toString(); + request.fields['RegionID'] = employeePostedAds.regionID.toString(); + request.fields['Itg_EndDate'] = employeePostedAds.endDate.toString(); request.fields['Channel'] = "31"; - request.fields['isActive'] = "false"; + request.fields['ItgIsActive'] = "false"; request.fields['LogInToken'] = loginTokenID!; request.fields['Token'] = tokenID!; request.fields['MobileNo'] = empMobNum!; request.fields['EmployeeNumber'] = empNum!; request.fields['employeeNumber'] = empNum; + + // debugPrint(json.encode(request.fields.toString())); + var response = await request.send().catchError((e) { Utils.hideLoading(context); Utils.handleException(e, context, null); diff --git a/pubspec.yaml b/pubspec.yaml index c0b77bb..2f3fffa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -94,7 +94,7 @@ dependencies: camera: ^0.10.0+4 #Chat Voice Message Recoding & Play - record: ^4.4.3 +# record: ^4.4.3 audio_waveforms: ^0.1.5+1 # animated_text_kit: ^4.2.2 From fe02776a69223e0e55e83b69beca2de9d180ae7f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 21 Dec 2022 12:29:29 +0300 Subject: [PATCH 08/13] leave balance issues fixed. --- lib/api/dashboard_api_client.dart | 10 +- lib/api/leave_balance_api_client.dart | 61 ++++----- lib/api/my_attendance_api_client.dart | 28 +--- lib/classes/consts.dart | 4 +- .../add_leave_balance_screen.dart | 121 +++++++++--------- .../leave_balance/leave_balance_screen.dart | 111 ++++++++-------- .../dynamic_screens/dynamic_input_screen.dart | 19 ++- .../dynamic_listview_screen.dart | 7 +- .../services_menu_list_screen.dart | 9 +- lib/ui/my_team/create_request.dart | 3 +- lib/widgets/balances_dashboard_widget.dart | 19 ++- 11 files changed, 171 insertions(+), 221 deletions(-) diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 5f2ad7e..95631a9 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -1,12 +1,10 @@ import 'dart:async'; import 'dart:convert'; -import 'package:http/http.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; -import 'package:mohem_flutter_app/models/chat/chat_count_conversation_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; @@ -14,7 +12,6 @@ import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_main_response.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; - import 'package:uuid/uuid.dart'; class DashboardApiClient { @@ -47,7 +44,6 @@ class DashboardApiClient { Future getCOCNotifications() async { String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks"; Map postParams = {"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER}; - postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); @@ -69,9 +65,7 @@ class DashboardApiClient { String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES"; Map postParams = {"P_EFFECTIVE_DATE": effectiveDate}; postParams.addAll(AppState().postParamsJson); - if (empID != null && empID.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); return responseData.getAccrualBalancesList ?? []; @@ -205,8 +199,6 @@ class DashboardApiClient { }, url, postParams); } - - // Future setAdvertisementViewed(String masterID, int advertisementId) async { // String url = "${ApiConsts.cocRest}Mohemm_ITG_UpdateAdvertisementAsViewed"; // diff --git a/lib/api/leave_balance_api_client.dart b/lib/api/leave_balance_api_client.dart index f9c5e21..ae855ee 100644 --- a/lib/api/leave_balance_api_client.dart +++ b/lib/api/leave_balance_api_client.dart @@ -17,13 +17,11 @@ class LeaveBalanceApiClient { factory LeaveBalanceApiClient() => _instance; - Future> getAbsenceTransactions(int pSelectedResopID, {String? empID}) async { + Future> getAbsenceTransactions(int pSelectedResopID, String? empID) async { String url = "${ApiConsts.erpRest}GET_ABSENCE_TRANSACTIONS"; Map postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": pSelectedResopID}; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.getAbsenceTransactionList ?? []; @@ -34,16 +32,15 @@ class LeaveBalanceApiClient { String url = "${ApiConsts.erpRest}GET_ABSENCE_ATTENDANCE_TYPES"; Map postParams = {}; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; + return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.getAbsenceAttendanceTypesList ?? []; }, url, postParams); } - Future calculateAbsenceDuration(int pAbsenceAttendanceTypeID, String pDateStart, String pDateEnd, int pSelectedResopID, {String? empID}) async { + Future calculateAbsenceDuration(int pAbsenceAttendanceTypeID, String pDateStart, String pDateEnd, int pSelectedResopID, {String? empID}) async { String url = "${ApiConsts.erpRest}CALCULATE_ABSENCE_DURATION"; Map postParams = { "P_ABSENCE_ATTENDANCE_TYPE_ID": pAbsenceAttendanceTypeID, @@ -52,25 +49,26 @@ class LeaveBalanceApiClient { "P_SELECTED_RESP_ID": pSelectedResopID, "P_MENU_TYPE": "E", "P_TIME_END": null, - "P_TIME_START": null, + "P_TIME_START": null }; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.calculateAbsenceDuration!; }, url, postParams); } - Future> getAbsenceDffStructure(String pDescFlexContextCode, String pFunctionName, int pSelectedResopID, {String? empID}) async { + Future> getAbsenceDffStructure(String pDescFlexContextCode, String pFunctionName, int pSelectedResopID, {String? empID}) async { String url = "${ApiConsts.erpRest}GET_ABSENCE_DFF_STRUCTURE"; - Map postParams = {"P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_FUNCTION_NAME": pFunctionName, "P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": pSelectedResopID}; + Map postParams = { + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_FUNCTION_NAME": pFunctionName, + "P_MENU_TYPE": "E", + "P_SELECTED_RESP_ID": pSelectedResopID, + }; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.getAbsenceDffStructureList ?? []; @@ -79,7 +77,7 @@ class LeaveBalanceApiClient { Future validateAbsenceTransaction( String pDescFlexContextCode, String pFunctionName, int pAbsenceAttendanceTypeID, String pReplacementUserName, String pDateStart, String pDateEnd, int pSelectedResopID, Map data, - {String comments = "", String? empID}) async { + {String comments = "", String? empID}) async { String url = "${ApiConsts.erpRest}VALIDATE_ABSENCE_TRANSACTION"; Map postParams = { "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, @@ -94,13 +92,11 @@ class LeaveBalanceApiClient { "P_SELECTED_RESP_ID": pSelectedResopID, "P_MENU_TYPE": "E", "P_TIME_END": null, - "P_TIME_START": null, + "P_TIME_START": null }; postParams.addAll(data); postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData; @@ -109,7 +105,7 @@ class LeaveBalanceApiClient { Future submitAbsenceTransaction( String pDescFlexContextCode, String pFunctionName, int pAbsenceAttendanceTypeID, String pReplacementUserName, String pDateStart, String pDateEnd, int pSelectedResopID, Map data, - {String comments = "", String? empID}) async { + {String comments = "", String? empID}) async { String url = "${ApiConsts.erpRest}SUBMIT_ABSENCE_TRANSACTION"; Map postParams = { "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, @@ -124,13 +120,11 @@ class LeaveBalanceApiClient { "P_SELECTED_RESP_ID": pSelectedResopID, "P_MENU_TYPE": "E", "P_TIME_END": null, - "P_TIME_START": null, + "P_TIME_START": null }; postParams.addAll(data); postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.sumbitAbsenceTransactionList!; @@ -147,18 +141,11 @@ class LeaveBalanceApiClient { }, url, postParams); } - Future startAbsenceApprovalProcess(int pTransactionID, String comments, int pSelectedResopID,{String? empID}) async { + Future startAbsenceApprovalProcess(int pTransactionID, String comments, int pSelectedResopID, {String? empID}) async { String url = "${ApiConsts.erpRest}START_ABSENCE_APPROVAL_PROCESS"; - Map postParams = { - "P_TRANSACTION_ID": pTransactionID, - "P_SELECTED_RESP_ID": pSelectedResopID, - "P_COMMENTS": comments, - "P_MENU_TYPE": "E", - }; + Map postParams = {"P_TRANSACTION_ID": pTransactionID, "P_SELECTED_RESP_ID": pSelectedResopID, "P_COMMENTS": comments, "P_MENU_TYPE": "E", 'P_SELECTED_EMPLOYEE_NUMBER': empID}; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.startAbsenceApprovalProccess!; diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index 0f078a2..78742a3 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -22,11 +22,7 @@ class MyAttendanceApiClient { String url = "${ApiConsts.erpRest}GET_EIT_TRANSACTIONS"; Map postParams = {"P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1, "P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName}; postParams.addAll(AppState().postParamsJson); - // postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - // AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.getEITTransactionList ?? []; @@ -37,9 +33,7 @@ class MyAttendanceApiClient { String url = "${ApiConsts.erpRest}GET_EIT_DFF_STRUCTURE"; Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E", "P_FUNCTION_NAME": pFunctionName}; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData; @@ -53,16 +47,14 @@ class MyAttendanceApiClient { "P_MENU_TYPE": "E", "P_PAGE_LIMIT": 1000, "P_PAGE_NUM": 1, - "P_PARENT_VALUE": empID!.isNotEmpty ? parentValue : null, + "P_PARENT_VALUE": empID != null ? parentValue : null, "P_SEGMENT_NAME": pSegmentName, "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_DESC_FLEX_NAME": pDescFlexName, "GetValueSetValuesTBL": list, }; postParams.addAll(AppState().postParamsJson); - if (empID.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.getValueSetValuesList ?? []; @@ -81,9 +73,7 @@ class MyAttendanceApiClient { "GetValueSetValuesTBL": list, }; postParams.addAll(AppState().postParamsJson); - if (empID != null && empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); @@ -100,9 +90,7 @@ class MyAttendanceApiClient { "EITTransactionTBL": list, }; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); @@ -120,9 +108,7 @@ class MyAttendanceApiClient { "EITTransactionTBLModel": list, }; postParams.addAll(AppState().postParamsJson); - if (empID!.isNotEmpty) { - postParams['P_SELECTED_EMPLOYEE_NUMBER'] = empID; - } + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index c147ea3..52d0407 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -3,8 +3,8 @@ import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server // static String baseUrl = "https://erptstapp.srca.org.sa"; // SRCA 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/ui/leave_balance/add_leave_balance_screen.dart b/lib/ui/leave_balance/add_leave_balance_screen.dart index 5ef03f4..71404a9 100644 --- a/lib/ui/leave_balance/add_leave_balance_screen.dart +++ b/lib/ui/leave_balance/add_leave_balance_screen.dart @@ -4,7 +4,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; -import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; @@ -25,8 +24,7 @@ import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; class AddLeaveBalanceScreen extends StatefulWidget { - final String selectedEmp; - AddLeaveBalanceScreen({this.selectedEmp = '', Key? key}) : super(key: key); + AddLeaveBalanceScreen({Key? key}) : super(key: key); @override _AddLeaveBalanceScreenState createState() { @@ -44,15 +42,21 @@ class _AddLeaveBalanceScreenState extends State { int? totalDays; String comment = ""; ReplacementList? selectedReplacementEmployee; - dynamic dynamicParams; - String selectedEmp = ""; + String? selectedEmp; DateTime selectedDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day); @override void initState() { super.initState(); - //getAbsenceAttendanceTypes(); + + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + var dynamicParam = ModalRoute.of(context)!.settings.arguments; + if (dynamicParam != null) { + selectedEmp = dynamicParam.toString(); + } + getAbsenceAttendanceTypes(); + }); } void getAbsenceAttendanceTypes() async { @@ -85,7 +89,6 @@ class _AddLeaveBalanceScreenState extends State { Utils.showLoading(context); CalculateAbsenceDuration duration = await LeaveBalanceApiClient() .calculateAbsenceDuration(selectedAbsenceType!.aBSENCEATTENDANCETYPEID!, Utils.getMonthNamedFormat(startDateTime!), Utils.getMonthNamedFormat(endDateTime!), -999, empID: selectedEmp); - totalDays = duration.pABSENCEDAYS?.toInt(); Utils.hideLoading(context); setState(() {}); @@ -95,56 +98,56 @@ class _AddLeaveBalanceScreenState extends State { } } - void validateAbsenceTransaction(selectedID) async { + void validateAbsenceTransaction(String? selectedID) async { try { - Utils.showLoading(context); - Map dffDataMap = {}; - for (int i = 1; i <= 20; i++) { - dffDataMap["P_ATTRIBUTE$i"] = null; - 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!) : ""; - } else { - dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV?.pIDCOLUMNNAME; + Utils.showLoading(context); + Map dffDataMap = {}; + for (int i = 1; i <= 20; i++) { + dffDataMap["P_ATTRIBUTE$i"] = null; + 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!) : ""; + } else { + dffDataMap["P_ATTRIBUTE$i"] = getabsenceDffStructureList[dffIndex].eSERVICESDV?.pIDCOLUMNNAME; + } + break; } - break; } } - } - 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, - empID: selectedEmp); + 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, + empID: selectedID); - SumbitAbsenceTransactionList submit = await LeaveBalanceApiClient().submitAbsenceTransaction( - 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, - empID: selectedEmp); + SumbitAbsenceTransactionList submit = await LeaveBalanceApiClient().submitAbsenceTransaction( + 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, + empID: selectedID); - Utils.hideLoading(context); + Utils.hideLoading(context); - var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance")); - if (res != null && res == true) { - Utils.showLoading(context); - } - await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!); - Utils.hideLoading(context); + var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance")); + if (res != null && res == true) { + Utils.showLoading(context); + } + await LeaveBalanceApiClient().cancelHrTransaction(submit.pTRANSACTIONID!); + Utils.hideLoading(context); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); @@ -158,16 +161,6 @@ class _AddLeaveBalanceScreenState extends State { @override Widget build(BuildContext context) { - if (dynamicParams == null) { - dynamicParams = ModalRoute.of(context)!.settings.arguments; - if (dynamicParams!= null && dynamicParams.isNotEmpty) { - AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = dynamicParams; - selectedEmp = dynamicParams; - getAbsenceAttendanceTypes(); - } else { - getAbsenceAttendanceTypes(); - } - } return Scaffold( backgroundColor: Colors.white, appBar: AppBarWidget( @@ -187,13 +180,13 @@ class _AddLeaveBalanceScreenState extends State { isPopup: true, ), itemBuilder: (_) => >[ - for (int i = 0; i < absenceList.length; i++) PopupMenuItem(value: i, child: Text(absenceList[i].aBSENCEATTENDANCETYPENAME!)), + for (int i = 0; i < (absenceList?.length ?? 0); i++) PopupMenuItem(value: i, child: Text(absenceList![i].aBSENCEATTENDANCETYPENAME!)), ], onSelected: (int popupIndex) { - if (selectedAbsenceType == absenceList[popupIndex]) { + if (selectedAbsenceType == absenceList![popupIndex]) { return; } - selectedAbsenceType = absenceList[popupIndex]; + selectedAbsenceType = absenceList![popupIndex]; setState(() {}); getAbsenceDffStructure(); }, @@ -285,7 +278,7 @@ class _AddLeaveBalanceScreenState extends State { validateFieldData() ? null : () { - validateAbsenceTransaction(selectedEmp); + validateAbsenceTransaction(selectedEmp!.isEmpty ? null : selectedEmp); }, ).insideContainer ], diff --git a/lib/ui/leave_balance/leave_balance_screen.dart b/lib/ui/leave_balance/leave_balance_screen.dart index 8c346bc..881828e 100644 --- a/lib/ui/leave_balance/leave_balance_screen.dart +++ b/lib/ui/leave_balance/leave_balance_screen.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; -import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; @@ -14,8 +13,7 @@ import 'package:mohem_flutter_app/widgets/balances_dashboard_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; class LeaveBalance extends StatefulWidget { - final String selectedEmp; - LeaveBalance({this.selectedEmp = '', Key? key}) : super(key: key); + LeaveBalance({Key? key}) : super(key: key); @override _LeaveBalanceState createState() { @@ -27,13 +25,18 @@ class _LeaveBalanceState extends State { List? absenceTransList; DateTime accrualDateTime = DateTime.now(); - dynamic dynamicParams; - String selectedEmp = ""; + String? employeeId; @override void initState() { super.initState(); - absenceTransList = []; + WidgetsBinding.instance.addPostFrameCallback((timeStamp) { + var dynamicParam = ModalRoute.of(context)!.settings.arguments; + if (dynamicParam != null) { + employeeId = dynamicParam.toString(); + } + getAbsenceTransactions(); + }); } @override @@ -44,7 +47,7 @@ class _LeaveBalanceState extends State { void getAbsenceTransactions() async { try { Utils.showLoading(context); - absenceTransList = await LeaveBalanceApiClient().getAbsenceTransactions(-999, empID: selectedEmp); + absenceTransList = await LeaveBalanceApiClient().getAbsenceTransactions(-999, employeeId); Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -55,63 +58,53 @@ class _LeaveBalanceState extends State { @override Widget build(BuildContext context) { - if (dynamicParams == null) { - dynamicParams = ModalRoute.of(context)!.settings.arguments; - if (dynamicParams!= null && dynamicParams.isNotEmpty) { - AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = dynamicParams; - selectedEmp = dynamicParams; - getAbsenceTransactions(); - } else { - getAbsenceTransactions(); - } - } return Scaffold( backgroundColor: Colors.white, appBar: AppBarWidget( context, title: LocaleKeys.leaveBalance.tr(), ), - body: ListView( - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.all(21), - children: [ - BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp), - 12.height, - absenceTransList == null - ? const SizedBox() - : (absenceTransList!.isEmpty - ? Utils.getNoDataWidget(context).paddingOnly(top: 50) - : ListView.separated( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: EdgeInsets.zero, - itemBuilder: (cxt, int index) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - 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, - itemCount: absenceTransList!.length)), - ], - ), + body: absenceTransList == null + ? const SizedBox() + : (absenceTransList!.isEmpty + ? Utils.getNoDataWidget(context).paddingOnly(top: 50) + : ListView( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(21), + children: [ + BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId), + 12.height, + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.zero, + itemBuilder: (cxt, int index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 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, + itemCount: absenceTransList!.length), + ], + )), floatingActionButton: Container( height: 54, width: 54, @@ -124,7 +117,7 @@ class _LeaveBalanceState extends State { ), child: const Icon(Icons.add, color: Colors.white, size: 30), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.addLeaveBalance, arguments: selectedEmp ?? ''); + Navigator.pushNamed(context, AppRoutes.addLeaveBalance, arguments: employeeId); }), ); } 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 228f1d6..9c0c51b 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -5,7 +5,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/leave_balance_api_client.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; -import 'package:mohem_flutter_app/app_state/app_state.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'; @@ -431,9 +430,6 @@ class _DynamicInputScreenState extends State { Widget build(BuildContext context) { if (dynamicParams == null) { dynamicParams = ModalRoute.of(context)!.settings.arguments as DynamicListViewParams; - if (dynamicParams!.selectedEmp.isNotEmpty) { - AppState().postParamsJson['P_SELECTED_EMPLOYEE_NUMBER'] = dynamicParams!.selectedEmp; - } getTransactionsStructure(); } return Scaffold( @@ -627,12 +623,15 @@ class _DynamicInputScreenState extends State { ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ if (model.rEADONLY != "Y") - for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(value: i, child: Column( - children: [ - Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), - const PopupMenuDivider(), - ], - )), + for (int i = 0; i < model.eSERVICESVS!.length; i++) + PopupMenuItem( + value: i, + child: Column( + children: [ + Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), + const PopupMenuDivider(), + ], + )), ], onSelected: (int popipIndex) async { ESERVICESDV eservicesdv = ESERVICESDV( 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 68727e5..a9c9694 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -21,10 +21,10 @@ class DynamicListViewParams { bool isUpdate; List? collectionNotificationList; - final String selectedEmp; + final String? selectedEmp; DynamicListViewParams(this.title, this.dynamicId, - {this.selectedEmp = '', this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.isUpdate = false, this.collectionNotificationList}); + {this.selectedEmp, this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.isUpdate = false, this.collectionNotificationList}); } class DynamicListViewScreen extends StatefulWidget { @@ -54,7 +54,6 @@ class _DynamicListViewScreenState extends State { getEITTransactionList?.forEach((element) { element.collectionTransaction = element.collectionTransaction?.where((elemen) => elemen.dISPLAYFLAG == "Y").toList() ?? []; }); - getEITTransactionList = getEITTransactionList?.where((element) => element.collectionTransaction?.isNotEmpty ?? false).toList() ?? []; Utils.hideLoading(context); setState(() {}); @@ -94,7 +93,7 @@ class _DynamicListViewScreenState extends State { padding: const EdgeInsets.all(21), children: [ // HMG_TKT_NEW_EIT_SS Id used for ticket balance dashboard - if (isTicketRequest) ...[const BalancesDashboardWidget("Current Ticket Balance", false, ""), 12.height], + if (isTicketRequest) ...[const BalancesDashboardWidget("Current Ticket Balance", false, showLoading: false), 12.height], getEITTransactionList == null ? const SizedBox() : (getEITTransactionList!.isEmpty diff --git a/lib/ui/my_attendance/services_menu_list_screen.dart b/lib/ui/my_attendance/services_menu_list_screen.dart index 7a61029..097a63a 100644 --- a/lib/ui/my_attendance/services_menu_list_screen.dart +++ b/lib/ui/my_attendance/services_menu_list_screen.dart @@ -17,9 +17,9 @@ import 'package:provider/provider.dart'; class ServicesMenuListScreenParams { final String title; final List list; - final String selectedEmp; + final String? selectedEmp; GetEmployeeSubordinatesList? getEmployeeSubordinates; - ServicesMenuListScreenParams(this.title, this.list, {this.selectedEmp =''}); + ServicesMenuListScreenParams(this.title, this.list, {this.selectedEmp}); } class ServicesMenuListScreen extends StatelessWidget { @@ -54,11 +54,12 @@ class ServicesMenuListScreen extends StatelessWidget { } return; } else if (servicesMenuData.list[index].requestType == "ABSENCE") { - Navigator.pushNamed(context, AppRoutes.leaveBalance, arguments: servicesMenuData?.selectedEmp ??''); + Navigator.pushNamed(context, AppRoutes.leaveBalance, arguments: servicesMenuData.selectedEmp); return; } if (servicesMenuData.list[index].requestType == "EIT") { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!, selectedEmp: servicesMenuData.selectedEmp)); + Navigator.pushNamed(context, AppRoutes.dynamicScreen, + arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!, selectedEmp: servicesMenuData.selectedEmp)); } else { if (servicesMenuData.list[index].requestType == "TERMINATION") { Navigator.pushNamed(context, AppRoutes.endEmploymentScreen, diff --git a/lib/ui/my_team/create_request.dart b/lib/ui/my_team/create_request.dart index 2b3e063..94ac415 100644 --- a/lib/ui/my_team/create_request.dart +++ b/lib/ui/my_team/create_request.dart @@ -68,7 +68,8 @@ class _CreateRequestState extends State { void handleOnPress(context, Menus menu) { if (menu.menuEntry.menuEntryType == "FUNCTION") { if (menu.menuEntry.requestType == "EIT") { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menu.menuEntry.prompt!, menu.menuEntry.functionName!, selectedEmp: getEmployeeSubordinates?.eMPLOYEENUMBER ?? '')); + Navigator.pushNamed(context, AppRoutes.dynamicScreen, + arguments: DynamicListViewParams(menu.menuEntry.prompt!, menu.menuEntry.functionName!, selectedEmp: getEmployeeSubordinates?.eMPLOYEENUMBER ?? '')); } else {} } else { Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, diff --git a/lib/widgets/balances_dashboard_widget.dart b/lib/widgets/balances_dashboard_widget.dart index 9689de4..aaac793 100644 --- a/lib/widgets/balances_dashboard_widget.dart +++ b/lib/widgets/balances_dashboard_widget.dart @@ -31,9 +31,10 @@ class BalancesDashboardWidget extends StatefulWidget { final String title; final List chartModelList; final bool isLeaveBalance; - final String selectedEmp; + final String? selectedEmp; + final bool showLoading; - const BalancesDashboardWidget(this.title, this.isLeaveBalance, this.selectedEmp, {Key? key, this.chartModelList = const []}) : super(key: key); + const BalancesDashboardWidget(this.title, this.isLeaveBalance, {Key? key, this.selectedEmp, this.showLoading = true, this.chartModelList = const []}) : super(key: key); @override _BalancesDashboardWidgetState createState() { @@ -46,14 +47,12 @@ class _BalancesDashboardWidgetState extends State { late DateTime accrualDateTime; GetAccrualBalancesList? leaveBalanceAccrual; List? ticketBalanceAccrualList; - dynamic dynamicParams; - String selectedEmp = ""; @override void initState() { super.initState(); accrualDateTime = DateTime.now(); - changeAccrualDate(); + changeAccrualDate(widget.showLoading); } @override @@ -61,9 +60,9 @@ class _BalancesDashboardWidgetState extends State { super.dispose(); } - void changeAccrualDate() async { + void changeAccrualDate(bool showLoading) async { try { - // Utils.showLoading(context); + if (showLoading) Utils.showLoading(context); List accrualList = await DashboardApiClient().getAccrualBalances(DateFormat("MM/dd/yyyy").format(accrualDateTime), empID: widget.selectedEmp); if (accrualList.isNotEmpty) { if (widget.isLeaveBalance) { @@ -80,10 +79,10 @@ class _BalancesDashboardWidgetState extends State { ]; } } - // Utils.hideLoading(context); + if (showLoading) Utils.hideLoading(context); setState(() {}); } catch (ex) { - Utils.hideLoading(context); + if (showLoading) Utils.hideLoading(context); Utils.handleException(ex, context, null); } } @@ -125,7 +124,7 @@ class _BalancesDashboardWidgetState extends State { DateTime selectedDate = await Utils.selectDate(context, accrualDateTime); if (selectedDate != accrualDateTime) { accrualDateTime = selectedDate; - changeAccrualDate(); + changeAccrualDate(true); } }), ], From 3a6d1c3273bb3c09b5ec25b64ae3db5865b1bec2 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 21 Dec 2022 15:28:45 +0300 Subject: [PATCH 09/13] leave balance issues fixed-2. --- lib/api/leave_balance_api_client.dart | 4 +- lib/api/worklist/worklist_api_client.dart | 2 +- .../add_leave_balance_screen.dart | 5 +- lib/ui/misc/request_submit_screen.dart | 16 ++-- .../dynamic_screens/dynamic_input_screen.dart | 8 +- lib/ui/my_team/employee_details.dart | 89 +++++++++---------- 6 files changed, 56 insertions(+), 68 deletions(-) diff --git a/lib/api/leave_balance_api_client.dart b/lib/api/leave_balance_api_client.dart index ae855ee..e0330fb 100644 --- a/lib/api/leave_balance_api_client.dart +++ b/lib/api/leave_balance_api_client.dart @@ -143,9 +143,9 @@ class LeaveBalanceApiClient { Future startAbsenceApprovalProcess(int pTransactionID, String comments, int pSelectedResopID, {String? empID}) async { String url = "${ApiConsts.erpRest}START_ABSENCE_APPROVAL_PROCESS"; - Map postParams = {"P_TRANSACTION_ID": pTransactionID, "P_SELECTED_RESP_ID": pSelectedResopID, "P_COMMENTS": comments, "P_MENU_TYPE": "E", 'P_SELECTED_EMPLOYEE_NUMBER': empID}; + Map postParams = {"P_TRANSACTION_ID": pTransactionID, "P_SELECTED_RESP_ID": pSelectedResopID, "P_COMMENTS": comments, "P_MENU_TYPE": "E"}; postParams.addAll(AppState().postParamsJson); - + if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); return responseData.startAbsenceApprovalProccess!; diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index dcbb415..82b865c 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -157,7 +157,7 @@ class WorkListApiClient { "P_PAGE_NUM": 1, }; postParams.addAll(AppState().postParamsJson); - postParams["P_SELECTED_EMPLOYEE_NUMBER"] = selectedEmployeeNumber; + if (selectedEmployeeNumber != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = selectedEmployeeNumber; return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); return responseData.memberInformationList![0]; diff --git a/lib/ui/leave_balance/add_leave_balance_screen.dart b/lib/ui/leave_balance/add_leave_balance_screen.dart index 71404a9..9eefc62 100644 --- a/lib/ui/leave_balance/add_leave_balance_screen.dart +++ b/lib/ui/leave_balance/add_leave_balance_screen.dart @@ -142,7 +142,8 @@ class _AddLeaveBalanceScreenState extends State { Utils.hideLoading(context); - var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance")); + var res = await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submit.pTRANSACTIONID!, "", "add_leave_balance", selectedEmployeeID: selectedID)); if (res != null && res == true) { Utils.showLoading(context); } @@ -278,7 +279,7 @@ class _AddLeaveBalanceScreenState extends State { validateFieldData() ? null : () { - validateAbsenceTransaction(selectedEmp!.isEmpty ? null : selectedEmp); + validateAbsenceTransaction(selectedEmp); }, ).insideContainer ], diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart index 170e288..50096c7 100644 --- a/lib/ui/misc/request_submit_screen.dart +++ b/lib/ui/misc/request_submit_screen.dart @@ -31,13 +31,13 @@ class RequestSubmitScreenParams { int transactionId; String pItemId; String approvalFlag; + String? selectedEmployeeID; - RequestSubmitScreenParams(this.title, this.transactionId, this.pItemId, this.approvalFlag); + RequestSubmitScreenParams(this.title, this.transactionId, this.pItemId, this.approvalFlag, {this.selectedEmployeeID}); } class RequestSubmitScreen extends StatefulWidget { - final String selectedEmp; - RequestSubmitScreen({this.selectedEmp ='',Key? key}) : super(key: key); + RequestSubmitScreen({Key? key}) : super(key: key); @override _RequestSubmitScreenState createState() { @@ -53,7 +53,7 @@ class _RequestSubmitScreenState extends State { List attachmentFiles = []; List attachments = []; dynamic dynamicParams; - String selectedEmp =""; + String selectedEmp = ""; @override void initState() { @@ -64,7 +64,6 @@ class _RequestSubmitScreenState extends State { try { Utils.showLoading(context); approverList = await MyAttendanceApiClient().getApproversList("SSHRMS", params!.transactionId); - Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -123,12 +122,7 @@ class _RequestSubmitScreenState extends State { params!.transactionId, ); } else if (params!.approvalFlag == 'add_leave_balance') { - await LeaveBalanceApiClient().startAbsenceApprovalProcess( - params!.transactionId, - comments.text, - -999, - empID: widget.selectedEmp - ); + await LeaveBalanceApiClient().startAbsenceApprovalProcess(params!.transactionId, comments.text, -999, empID: params!.selectedEmployeeID); } else if (params!.approvalFlag == 'eit') { await MyAttendanceApiClient().startEitApprovalProcess( "SUBMIT", 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 9c0c51b..fe7a6f3 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -43,7 +43,6 @@ class _DynamicInputScreenState extends State { void getTransactionsStructure() async { try { Utils.showLoading(context); - genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId, dynamicParams!.selectedEmp); dESCFLEXCONTEXTCODE = genericResponseModel!.pDESCFLEXCONTEXTCODE ?? ""; descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? ""; @@ -91,9 +90,8 @@ class _DynamicInputScreenState extends State { 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, empID: dynamicParams!.selectedEmp ?? ''); - SubmitEITTransactionList submitEITTransactionList = - await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp ?? ''); + genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp); + SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values, empID: dynamicParams!.selectedEmp); Utils.hideLoading(context); await Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams(LocaleKeys.submit.tr(), submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!, 'eit')); @@ -130,7 +128,7 @@ class _DynamicInputScreenState extends State { .toList(); List eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values, - empID: dynamicParams!.selectedEmp ?? '', parentValue: structureList.eSERVICESDV!.pVALUECOLUMNNAME); + empID: dynamicParams!.selectedEmp, parentValue: structureList.eSERVICESDV!.pVALUECOLUMNNAME); List abc = genericResponseModel?.getEITDFFStructureList ?? []; getEitDffStructureList = abc; int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); diff --git a/lib/ui/my_team/employee_details.dart b/lib/ui/my_team/employee_details.dart index 9fc0070..1412641 100644 --- a/lib/ui/my_team/employee_details.dart +++ b/lib/ui/my_team/employee_details.dart @@ -67,23 +67,25 @@ class _EmployeeDetailsState extends State { } return Scaffold( - extendBody: true, - backgroundColor: MyColors.lightGreyEFColor, - body: Stack(children: [ - getEmployeeSubordinates!.eMPLOYEEIMAGE != null ? - Container( - height: 200, - margin: EdgeInsets.only(top: 30), - decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), fit: BoxFit.cover)), - child: new BackdropFilter( - filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), - child: new Container( - decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), - ), - ), - ) : Container( - decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)), - ), + extendBody: true, + backgroundColor: MyColors.lightGreyEFColor, + body: Stack( + children: [ + getEmployeeSubordinates!.eMPLOYEEIMAGE != null + ? Container( + height: 200, + margin: EdgeInsets.only(top: 30), + decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), fit: BoxFit.cover)), + child: new BackdropFilter( + filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: new Container( + decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), + ), + ), + ) + : Container( + decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)), + ), SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( @@ -95,15 +97,13 @@ class _EmployeeDetailsState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - color: Colors.white, - ), - ), + CircleAvatar( + radius: 18, + backgroundColor: Colors.black.withOpacity(.21), + child: const Icon(Icons.arrow_back_ios_rounded, color: Colors.white, size: 18).paddingOnly(right: 4), + ).onPress(() { + Navigator.pop(context); + }), ], ), ), @@ -111,7 +111,9 @@ class _EmployeeDetailsState extends State { ], ), ) - ])); + ], + ), + ); } Widget myTeamInfo() { @@ -202,16 +204,8 @@ class _EmployeeDetailsState extends State { } Widget ProfileImage() => getEmployeeSubordinates?.eMPLOYEEIMAGE == null - ? SvgPicture.asset( - "assets/images/user.svg", - height: 68, - width: 68, - ) - : CircleAvatar( - radius: 68, - backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSubordinates?.eMPLOYEEIMAGE)), - backgroundColor: Colors.black, - ); + ? SvgPicture.asset("assets/images/user.svg", height: 68, width: 68) + : CircleAvatar(radius: 68, backgroundImage: MemoryImage(Utils.getPostBytes(getEmployeeSubordinates?.eMPLOYEEIMAGE)), backgroundColor: Colors.black); void setMenu() { menu = [ @@ -256,16 +250,17 @@ class _EmployeeDetailsState extends State { child: Column( children: [ Text(LocaleKeys.addFavoriteList).tr(namedArgs: {'name': '${getEmployeeSubordinates!.eMPLOYEENAME}'}), - 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, - ), + 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 ?? "", From bcf67895b9928c5e1ca5227cbbfe7b48057dc22d Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 21 Dec 2022 19:11:17 +0300 Subject: [PATCH 10/13] Dynamic forms & my team fixes --- assets/icons/chat/chat.svg | 26 +- assets/icons/create_req.svg | 10 +- assets/icons/home.svg | 8 +- assets/icons/item_for_sale.svg | 12 +- assets/icons/work_list.svg | 17 +- lib/classes/utils.dart | 13 +- lib/ui/marathon/widgets/marathon_banner.dart | 374 +++++++++--------- .../dynamic_screens/dynamic_input_screen.dart | 2 +- .../services_menu_list_screen.dart | 1 + lib/ui/my_team/create_request.dart | 10 +- lib/ui/my_team/employee_details.dart | 10 +- lib/ui/my_team/team_members.dart | 9 +- 12 files changed, 247 insertions(+), 245 deletions(-) diff --git a/assets/icons/chat/chat.svg b/assets/icons/chat/chat.svg index 29d4471..bf8977d 100644 --- a/assets/icons/chat/chat.svg +++ b/assets/icons/chat/chat.svg @@ -1,23 +1,13 @@ - - - - - + + + + + - - - - - - - - - - - - - + + + diff --git a/assets/icons/create_req.svg b/assets/icons/create_req.svg index a87e809..76f414f 100644 --- a/assets/icons/create_req.svg +++ b/assets/icons/create_req.svg @@ -1,7 +1,5 @@ - - - - - - + + + + diff --git a/assets/icons/home.svg b/assets/icons/home.svg index fb67997..91992ad 100644 --- a/assets/icons/home.svg +++ b/assets/icons/home.svg @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/assets/icons/item_for_sale.svg b/assets/icons/item_for_sale.svg index 0a87567..a908b3f 100644 --- a/assets/icons/item_for_sale.svg +++ b/assets/icons/item_for_sale.svg @@ -1,3 +1,11 @@ - - + + + + + + + + + + diff --git a/assets/icons/work_list.svg b/assets/icons/work_list.svg index a802c53..becb368 100644 --- a/assets/icons/work_list.svg +++ b/assets/icons/work_list.svg @@ -1,15 +1,6 @@ - - - - - - - - - - - - - + + + + diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 57bb888..572c09e 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -310,7 +310,18 @@ class Utils { } static String formatDateDefault(String date) { - return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MMM-yyyy').parseLoose(date)); + if (date.toLowerCase().contains("t")) { + date = date.toLowerCase().split("t")[0]; + // return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MM-yyyy').parseLoose(date)); + return DateFormat('dd-MM-yyyy').format(DateFormat('yyyy-MM-dd').parseLoose(date)); + } else { + if(date.toLowerCase().split("-")[1].length == 3) { + return DateFormat('dd-MM-yyyy').format(DateFormat('dd-MMM-yyyy').parseLoose(date)); + } else { + return DateFormat('dd-MM-yyyy').format(DateFormat('yyyy-MM-dd').parseLoose(date)); + } + // return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MM-yyyy').parseLoose(date)); + } } static Future selectDate(BuildContext context, DateTime selectedDate) async { diff --git a/lib/ui/marathon/widgets/marathon_banner.dart b/lib/ui/marathon/widgets/marathon_banner.dart index 1b5533b..29c4fd3 100644 --- a/lib/ui/marathon/widgets/marathon_banner.dart +++ b/lib/ui/marathon/widgets/marathon_banner.dart @@ -184,202 +184,200 @@ class MarathonBanner extends StatelessWidget { Widget build(BuildContext context) { MarathonProvider provider = context.read(); - return - // !provider.isPrivilegedWithMarathon - // ? getUnPrivilegedMarathon(context) - // : provider.marathonDetailModel.startTime != null - // ? - Container( - decoration: MyDecorations.shadowDecoration, - height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, - clipBehavior: Clip.antiAlias, - child: Stack( - children: [ - Transform( - alignment: Alignment.center, - transform: Matrix4.rotationY( - AppState().isArabic(context) ? math.pi : 0, - ), - child: SvgPicture.asset( - "assets/images/marathon_banner_bg.svg", - fit: BoxFit.fill, - width: double.infinity, - ), - ), - AppState().isArabic(context) - ? Positioned( - right: -15, - top: -10, - child: Transform.rotate( - angle: 10, - child: Container( - width: isTablet ? 70 : 65, - height: isTablet ? 40 : 32, - color: MyColors.darkDigitColor, - ), - ), - ) - : Positioned( - left: -20, - top: -10, - child: Transform.rotate( - angle: 15, - child: Container( - width: isTablet ? 70 : 65, - height: isTablet ? 40 : 32, - color: MyColors.darkDigitColor, + return provider.isPrivilegedWithMarathon + ? getUnPrivilegedMarathon(context) + : provider.marathonDetailModel.startTime != null + ? Container( + decoration: MyDecorations.shadowDecoration, + height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11, + clipBehavior: Clip.antiAlias, + child: Stack( + children: [ + Transform( + alignment: Alignment.center, + transform: Matrix4.rotationY( + AppState().isArabic(context) ? math.pi : 0, + ), + child: SvgPicture.asset( + "assets/images/marathon_banner_bg.svg", + fit: BoxFit.fill, + width: double.infinity, + ), ), - ), - ), - SizedBox( - width: double.infinity, - height: double.infinity, - child: Row( - children: [ - const Expanded( - flex: 3, - child: SizedBox( - width: double.infinity, - height: double.infinity, - ), - ), - Expanded( - flex: AppState().isArabic(context) ? 4 : 5, - child: SizedBox( - width: double.infinity, - height: double.infinity, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - AppState().isArabic(context) ? 0.height : 5.height, - Text( - LocaleKeys.getReadyForContest.tr(), - style: TextStyle( - fontSize: isTablet ? 20 : 11, - fontStyle: FontStyle.italic, - fontWeight: FontWeight.w600, - color: MyColors.white.withOpacity(0.83), - letterSpacing: -0.4, + AppState().isArabic(context) + ? Positioned( + right: -15, + top: -10, + child: Transform.rotate( + angle: 10, + child: Container( + width: isTablet ? 70 : 65, + height: isTablet ? 40 : 32, + color: MyColors.darkDigitColor, ), ), - Text( - AppState().isArabic(context) ? provider.marathonDetailModel.titleAr ?? "" : provider.marathonDetailModel.titleEn ?? "", - style: TextStyle( - fontStyle: FontStyle.italic, - fontSize: isTablet ? 30 : 19, - fontWeight: FontWeight.bold, - color: MyColors.white.withOpacity(0.83), - height: 32 / 22, + ) + : Positioned( + left: -20, + top: -10, + child: Transform.rotate( + angle: 15, + child: Container( + width: isTablet ? 70 : 65, + height: isTablet ? 40 : 32, + color: MyColors.darkDigitColor, ), ), - isTablet ? 10.height : 3.height, - BuildCountdownTimer( - timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch, - provider: provider, - screenFlag: 0, + ), + SizedBox( + width: double.infinity, + height: double.infinity, + child: Row( + children: [ + const Expanded( + flex: 3, + child: SizedBox( + width: double.infinity, + height: double.infinity, ), - ], - ).paddingOnly( - left: AppState().isArabic(context) ? 12 : 3, - right: AppState().isArabic(context) ? 3 : 12, - ) - ], - ), - ), - ), - ], - ), - ), - AppState().isArabic(context) - ? Align( - alignment: Alignment.topRight, - child: SizedBox( - height: isTablet ? 30 : 20, - width: isTablet ? 45 : 35, - child: Transform.rotate( - angle: math.pi / 4.5, - child: Text( - LocaleKeys.brainMarathon.tr(), - textAlign: TextAlign.center, - maxLines: 2, - style: TextStyle( - color: MyColors.white, - fontWeight: FontWeight.bold, - fontSize: isTablet ? 8 : 6, - height: 1.2, - ), - ), - ), - ), - ).paddingOnly(top: 5) - : Align( - alignment: Alignment.topLeft, - child: SizedBox( - height: isTablet ? 30 : 20, - width: isTablet ? 45 : 35, - child: Transform.rotate( - angle: -math.pi / 4.5, - child: Text( - LocaleKeys.brainMarathon.tr(), - textAlign: TextAlign.center, - maxLines: 2, - style: TextStyle( - color: MyColors.kWhiteColor, - fontWeight: FontWeight.bold, - fontSize: isTablet ? 8 : 6, - height: 1.2, - ), + ), + Expanded( + flex: AppState().isArabic(context) ? 4 : 5, + child: SizedBox( + width: double.infinity, + height: double.infinity, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + AppState().isArabic(context) ? 0.height : 5.height, + Text( + LocaleKeys.getReadyForContest.tr(), + style: TextStyle( + fontSize: isTablet ? 20 : 11, + fontStyle: FontStyle.italic, + fontWeight: FontWeight.w600, + color: MyColors.white.withOpacity(0.83), + letterSpacing: -0.4, + ), + ), + Text( + AppState().isArabic(context) ? provider.marathonDetailModel.titleAr ?? "" : provider.marathonDetailModel.titleEn ?? "", + style: TextStyle( + fontStyle: FontStyle.italic, + fontSize: isTablet ? 30 : 19, + fontWeight: FontWeight.bold, + color: MyColors.white.withOpacity(0.83), + height: 32 / 22, + ), + ), + isTablet ? 10.height : 3.height, + BuildCountdownTimer( + timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch, + provider: provider, + screenFlag: 0, + ), + ], + ).paddingOnly( + left: AppState().isArabic(context) ? 12 : 3, + right: AppState().isArabic(context) ? 3 : 12, + ) + ], + ), + ), + ), + ], ), ), - ), - ).paddingOnly(top: 5), - !AppState().isArabic(context) - ? Positioned( - right: 0, - bottom: 0, - child: RotatedBox( - quarterTurns: 4, - child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), - ).paddingAll(isTablet ? 20 : 15), - ) - : Positioned( - bottom: 0, - left: 0, - child: RotatedBox( - quarterTurns: 2, - child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), - ).paddingAll(isTablet ? 20 : 15), - ), - ], - ).onPress(() async { - int remainingTimeInMinutes = DateTime.parse(provider.marathonDetailModel.startTime!).difference(DateTime.now()).inMinutes; + AppState().isArabic(context) + ? Align( + alignment: Alignment.topRight, + child: SizedBox( + height: isTablet ? 30 : 20, + width: isTablet ? 45 : 35, + child: Transform.rotate( + angle: math.pi / 4.5, + child: Text( + LocaleKeys.brainMarathon.tr(), + textAlign: TextAlign.center, + maxLines: 2, + style: TextStyle( + color: MyColors.white, + fontWeight: FontWeight.bold, + fontSize: isTablet ? 8 : 6, + height: 1.2, + ), + ), + ), + ), + ).paddingOnly(top: 5) + : Align( + alignment: Alignment.topLeft, + child: SizedBox( + height: isTablet ? 30 : 20, + width: isTablet ? 45 : 35, + child: Transform.rotate( + angle: -math.pi / 4.5, + child: Text( + LocaleKeys.brainMarathon.tr(), + textAlign: TextAlign.center, + maxLines: 2, + style: TextStyle( + color: MyColors.kWhiteColor, + fontWeight: FontWeight.bold, + fontSize: isTablet ? 8 : 6, + height: 1.2, + ), + ), + ), + ), + ).paddingOnly(top: 5), + !AppState().isArabic(context) + ? Positioned( + right: 0, + bottom: 0, + child: RotatedBox( + quarterTurns: 4, + child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), + ).paddingAll(isTablet ? 20 : 15), + ) + : Positioned( + bottom: 0, + left: 0, + child: RotatedBox( + quarterTurns: 2, + child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor), + ).paddingAll(isTablet ? 20 : 15), + ), + ], + ).onPress(() async { + int remainingTimeInMinutes = DateTime.parse(provider.marathonDetailModel.startTime!).difference(DateTime.now()).inMinutes; - if (remainingTimeInMinutes > 2) { - Utils.showLoading(context); - try { - await provider.initializeVideoPlayer().then((_) { - Utils.hideLoading(context); - provider.startTimerForSponsorVideo(); - Navigator.pushNamed(context, AppRoutes.marathonSponsorVideoScreen); - }); - } catch (e) { - if (kDebugMode) { - print("Error in VideoPlayer: ${e.toString()}"); - } - Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); - } - } else { - Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); - } - }), - ); - // ) - // : const SizedBox(); + if (remainingTimeInMinutes > 2) { + Utils.showLoading(context); + try { + await provider.initializeVideoPlayer().then((_) { + Utils.hideLoading(context); + provider.startTimerForSponsorVideo(); + Navigator.pushNamed(context, AppRoutes.marathonSponsorVideoScreen); + }); + } catch (e) { + if (kDebugMode) { + print("Error in VideoPlayer: ${e.toString()}"); + } + Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); + } + } else { + Navigator.pushNamed(context, AppRoutes.marathonIntroScreen); + } + }), + // ); + ) + : const SizedBox(); } } 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 fe7a6f3..a94a6e2 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -188,7 +188,7 @@ class _DynamicInputScreenState extends State { // Utils.hideLoading(context); } } else if (values.isNotEmpty) { - ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values, empID: dynamicParams!.selectedEmp); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); getEitDffStructureList![index].eSERVICESDV = defaultValue; } diff --git a/lib/ui/my_attendance/services_menu_list_screen.dart b/lib/ui/my_attendance/services_menu_list_screen.dart index 097a63a..8e44324 100644 --- a/lib/ui/my_attendance/services_menu_list_screen.dart +++ b/lib/ui/my_attendance/services_menu_list_screen.dart @@ -19,6 +19,7 @@ class ServicesMenuListScreenParams { final List list; final String? selectedEmp; GetEmployeeSubordinatesList? getEmployeeSubordinates; + ServicesMenuListScreenParams(this.title, this.list, {this.selectedEmp}); } diff --git a/lib/ui/my_team/create_request.dart b/lib/ui/my_team/create_request.dart index 94ac415..b77ac30 100644 --- a/lib/ui/my_team/create_request.dart +++ b/lib/ui/my_team/create_request.dart @@ -38,13 +38,13 @@ class _CreateRequestState extends State { @override void initState() { super.initState(); - employeeSubRequest(); + // employeeSubRequest(); } void employeeSubRequest() async { try { Utils.showLoading(context); - getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); + // getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); getMenuEntriesList = await MyTeamApiClient().employeeSubordinatesRequest(getEmployeeSubordinates?.eMPLOYEENUMBER); homeMenus = parseMenus(getMenuEntriesList); Utils.hideLoading(context); @@ -80,8 +80,10 @@ class _CreateRequestState extends State { @override Widget build(BuildContext context) { - getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; - + if (getEmployeeSubordinates == null) { + getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + employeeSubRequest(); + } return Scaffold( backgroundColor: Colors.white, appBar: AppBarWidget( diff --git a/lib/ui/my_team/employee_details.dart b/lib/ui/my_team/employee_details.dart index 1412641..e78c304 100644 --- a/lib/ui/my_team/employee_details.dart +++ b/lib/ui/my_team/employee_details.dart @@ -74,12 +74,12 @@ class _EmployeeDetailsState extends State { getEmployeeSubordinates!.eMPLOYEEIMAGE != null ? Container( height: 200, - margin: EdgeInsets.only(top: 30), + margin: const EdgeInsets.only(top: 30), decoration: BoxDecoration(image: DecorationImage(image: MemoryImage(Utils.dataFromBase64String(getEmployeeSubordinates!.eMPLOYEEIMAGE!)), fit: BoxFit.cover)), - child: new BackdropFilter( - filter: new ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), - child: new Container( - decoration: new BoxDecoration(color: Colors.white.withOpacity(0.0)), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0), + child: Container( + decoration: BoxDecoration(color: Colors.white.withOpacity(0.0)), ), ), ) diff --git a/lib/ui/my_team/team_members.dart b/lib/ui/my_team/team_members.dart index c4defc4..8847c36 100644 --- a/lib/ui/my_team/team_members.dart +++ b/lib/ui/my_team/team_members.dart @@ -33,13 +33,13 @@ class _TeamMembersState extends State { void initState() { super.initState(); - employeeSubordinates(); + // employeeSubordinates(); } void employeeSubordinates() async { try { Utils.showLoading(context); - getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); + // getEmployeeSubordinatesList = await MyTeamApiClient().getEmployeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString()); getEmployeeSubordinatesList = await MyTeamApiClient().employeeSubordinates(searchEmpEmail.toString(), searchEmpName.toString(), searchEmpNo.toString(), getEmployeeSubordinates?.eMPLOYEENUMBER); Utils.hideLoading(context); setState(() {}); @@ -51,7 +51,10 @@ class _TeamMembersState extends State { @override Widget build(BuildContext context) { - getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + if (getEmployeeSubordinates == null) { + getEmployeeSubordinates ??= ModalRoute.of(context)?.settings.arguments as GetEmployeeSubordinatesList; + employeeSubordinates(); + } return Scaffold( appBar: AppBarWidget( context, From b3782f634222830f676521a1d2a335bcc2ca9d70 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 22 Dec 2022 10:02:50 +0300 Subject: [PATCH 11/13] updates & fixes --- lib/classes/utils.dart | 24 +++++++++++++++--------- lib/provider/chat_provider_model.dart | 2 +- lib/ui/login/new_password_screen.dart | 8 ++++---- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 572c09e..09fab3f 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -310,17 +310,23 @@ class Utils { } static String formatDateDefault(String date) { - if (date.toLowerCase().contains("t")) { - date = date.toLowerCase().split("t")[0]; - // return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MM-yyyy').parseLoose(date)); - return DateFormat('dd-MM-yyyy').format(DateFormat('yyyy-MM-dd').parseLoose(date)); - } else { - if(date.toLowerCase().split("-")[1].length == 3) { - return DateFormat('dd-MM-yyyy').format(DateFormat('dd-MMM-yyyy').parseLoose(date)); + if (date.isNotEmpty) { + if (date.toLowerCase().contains("t")) { + date = date.toLowerCase().split("t")[0]; + if (!date.contains("00:00:00")) { + date = date + ' 00:00:00'; + } + return date; } else { - return DateFormat('dd-MM-yyyy').format(DateFormat('yyyy-MM-dd').parseLoose(date)); + if (date.toLowerCase().split("-")[1].length == 3) { + return DateFormat('dd-MM-yyyy').format(DateFormat('dd-MMM-yyyy').parseLoose(date)); + } else { + return DateFormat('dd-MM-yyyy').format(DateFormat('yyyy-MM-dd').parseLoose(date)); + } + // return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MM-yyyy').parseLoose(date)); } - // return DateFormat('yyyy-MM-dd').format(DateFormat('dd-MM-yyyy').parseLoose(date)); + } else { + return date; } } diff --git a/lib/provider/chat_provider_model.dart b/lib/provider/chat_provider_model.dart index 5f28b0b..a96080b 100644 --- a/lib/provider/chat_provider_model.dart +++ b/lib/provider/chat_provider_model.dart @@ -828,7 +828,7 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { void deleteData() { List exists = [], unique = []; - exists.addAll(searchedChats!); + if(searchedChats != null) exists.addAll(searchedChats!); exists.addAll(favUsersList!); Map profileMap = {}; for (ChatUser item in exists) { diff --git a/lib/ui/login/new_password_screen.dart b/lib/ui/login/new_password_screen.dart index 8bb1443..217e049 100644 --- a/lib/ui/login/new_password_screen.dart +++ b/lib/ui/login/new_password_screen.dart @@ -102,8 +102,8 @@ class _NewPasswordScreenState extends State { passwordConstraintsUI(LocaleKeys.minimum8Characters.tr(), password.text.length >= 8), 8.height, passwordConstraintsUI(LocaleKeys.doNotAddRepeatingLetters.tr(), checkRepeatedChars(password.text)), - 8.height, - passwordConstraintsUI(LocaleKeys.itShouldContainSpecialCharacter.tr(), checkRegEx(r'[!@#$%^&*(),.?":{}|<>]')), + // 8.height, + // passwordConstraintsUI(LocaleKeys.itShouldContainSpecialCharacter.tr(), checkRegEx(r'[!@#$%^&*(),.?":{}|<>]')), 8.height, passwordConstraintsUI(LocaleKeys.confirmPasswordMustMatch.tr(), password.text.isNotEmpty && password.text == confirmPassword.text), ], @@ -146,11 +146,11 @@ class _NewPasswordScreenState extends State { bool hasUppercase = password.contains(RegExp(r'[A-Z]')); bool hasDigits = password.contains(RegExp(r'[0-9]')); bool hasLowercase = password.contains(RegExp(r'[a-z]')); - bool hasSpecialCharacters = password.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); + // bool hasSpecialCharacters = password.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); bool hasMinLength = password.length >= minLength; bool isMatched = password == confirmPassword.text; - return hasDigits && hasUppercase && hasLowercase && hasSpecialCharacters && hasMinLength && isMatched && checkRepeatedChars(password); + return hasDigits && hasUppercase && hasLowercase && hasMinLength && isMatched && checkRepeatedChars(password); } bool checkRepeatedChars(String password) { From 8a393c1e73fdfab997d3827964ccbc54357fbfc7 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 22 Dec 2022 13:17:09 +0300 Subject: [PATCH 12/13] App update screen implemented --- lib/api/api_client.dart | 11 +++---- lib/app_state/app_state.dart | 2 +- lib/classes/utils.dart | 50 +++++++++++++++++-------------- lib/config/routes.dart | 3 ++ lib/ui/app_update_screen.dart | 56 +++++++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 lib/ui/app_update_screen.dart diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index 1e66d45..ff26054 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -14,11 +14,12 @@ typedef FactoryConstructor = U Function(dynamic); class APIError { int? errorCode; + int? errorType; String? errorMessage; - APIError(this.errorCode, this.errorMessage); + APIError(this.errorCode, this.errorMessage, this.errorType); - Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; + Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage, 'errorType': errorType,}; @override String toString() { @@ -33,14 +34,14 @@ APIException _throwAPIException(Response response) { if (response.body != null && response.body.isNotEmpty) { var jsonError = jsonDecode(response.body); print(jsonError); - apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); + apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType']); } return APIException(APIException.BAD_REQUEST, error: apiError); case 400: APIError? apiError; if (response.body != null && response.body.isNotEmpty) { var jsonError = jsonDecode(response.body); - apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']); + apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage'], jsonError['ErrorType']); } return APIException(APIException.BAD_REQUEST, error: apiError); case 401: @@ -90,7 +91,7 @@ class ApiClient { return factoryConstructor(jsonData); } else { APIError? apiError; - apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); + apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage'], jsonData['ErrorType']); throw APIException(APIException.BAD_REQUEST, error: apiError); } // } catch (ex) { diff --git a/lib/app_state/app_state.dart b/lib/app_state/app_state.dart index 5060195..7d175b5 100644 --- a/lib/app_state/app_state.dart +++ b/lib/app_state/app_state.dart @@ -64,7 +64,7 @@ class AppState { String? get getMarathonProjectId => _projectID; - final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 5.0, mobileType: Platform.isAndroid ? "android" : "ios"); + final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 3.8, mobileType: Platform.isAndroid ? "android" : "ios"); void setPostParamsInitConfig() { isAuthenticated = false; diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 09fab3f..bac8616 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -98,33 +98,37 @@ class Utils { static void handleException(dynamic exception, cxt, Function(String)? onErrorMessage) { String errorMessage; - if (exception is APIException) { - if (exception.message == APIException.UNAUTHORIZED) { - return; + if (exception.error.errorType != null && exception.error.errorType == 4) { + Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.appUpdateScreen, (_) => false, arguments: exception.error?.errorMessage); + } else { + if (exception is APIException) { + if (exception.message == APIException.UNAUTHORIZED) { + return; + } else { + errorMessage = exception.error?.errorMessage ?? exception.message; + } } else { - errorMessage = exception.error?.errorMessage ?? exception.message; + errorMessage = APIException.UNKNOWN; } - } else { - errorMessage = APIException.UNKNOWN; - } - if (onErrorMessage != null) { - onErrorMessage(errorMessage); - } else { - if (!AppState().isAuthenticated) { - showDialog( - context: cxt, - builder: (cxt) => ConfirmDialog( - message: errorMessage, - onTap: () { - Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route route) => false); - }, - ), - ); + if (onErrorMessage != null) { + onErrorMessage(errorMessage); } else { - if (cxt != null) { - confirmDialog(cxt, errorMessage); + if (!AppState().isAuthenticated) { + showDialog( + context: cxt, + builder: (cxt) => ConfirmDialog( + message: errorMessage, + onTap: () { + Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route route) => false); + }, + ), + ); } else { - showToast(errorMessage); + if (cxt != null) { + confirmDialog(cxt, errorMessage); + } else { + showToast(errorMessage); + } } } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index dc6b553..905f4de 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/ui/app_update_screen.dart'; import 'package:mohem_flutter_app/ui/attendance/add_vacation_rule_screen.dart'; import 'package:mohem_flutter_app/ui/attendance/monthly_attendance_screen.dart'; import 'package:mohem_flutter_app/ui/attendance/vacation_rule_screen.dart'; @@ -191,6 +192,7 @@ class AppRoutes { static const String marathonWaitingScreen = "/marathonWaitingScreen"; static const String unsafeDeviceScreen = "/unsafeDeviceScreen"; + static const String appUpdateScreen = "/appUpdateScreen"; static final Map routes = { login: (BuildContext context) => LoginScreen(), @@ -302,5 +304,6 @@ class AppRoutes { marathonWaitingScreen: (BuildContext context) => const MarathonWaitingScreen(), unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(), + appUpdateScreen: (BuildContext context) => const AppUpdateScreen(), }; } diff --git a/lib/ui/app_update_screen.dart b/lib/ui/app_update_screen.dart new file mode 100644 index 0000000..4a769c3 --- /dev/null +++ b/lib/ui/app_update_screen.dart @@ -0,0 +1,56 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.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/widgets/button/default_button.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class AppUpdateScreen extends StatefulWidget { + const AppUpdateScreen({Key? key}) : super(key: key); + + @override + State createState() => _UnsafeDeviceScreenState(); +} + +class _UnsafeDeviceScreenState extends State { + String? dynamicParams; + + @override + Widget build(BuildContext context) { + dynamicParams ??= ModalRoute.of(context)!.settings.arguments as String; + return Scaffold( + body: SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + 21.height, + Center(child: Image.asset("assets/images/logos/main_mohemm_logo.png", width: 200, height: 50)), + 50.height, + "Please Update Your App".toText24(isBold: true), + 48.height, + dynamicParams.toString().toText14(isCenter: true).paddingOnly(left: 20.0, right: 20.0), + 21.height, + DefaultButton(LocaleKeys.ok.tr(), () async { + if (Platform.isAndroid || Platform.isIOS) { + var appId = Platform.isAndroid ? 'hmg.cloudSolutions.mohem' : '1468856602'; + var url = Uri.parse( + Platform.isAndroid ? "market://details?id=$appId" : "https://apps.apple.com/app/id$appId", + ); + launchUrl( + url, + mode: LaunchMode.externalApplication, + ); + } + }).paddingAll(24) + ], + ), + ), + ); + } +} From 78f6ebf6225cddc095edb89cfcb338ac1b4f3f3e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 26 Dec 2022 11:54:08 +0300 Subject: [PATCH 13/13] bug fixes --- lib/provider/chat_provider_model.dart | 8 ++++---- lib/provider/dashboard_provider_model.dart | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/provider/chat_provider_model.dart b/lib/provider/chat_provider_model.dart index a96080b..7b551d0 100644 --- a/lib/provider/chat_provider_model.dart +++ b/lib/provider/chat_provider_model.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; + import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; @@ -11,7 +12,6 @@ import 'package:http/http.dart'; import 'package:just_audio/just_audio.dart' as JustAudio; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; -import 'package:mohem_flutter_app/classes/app_permissions.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/encryption.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; @@ -820,15 +820,15 @@ class ChatProviderModel with ChangeNotifier, DiagnosticableTreeMixin { sFileType = ""; deleteData(); favUsersList.clear(); - searchedChats!.clear(); - pChatHistory!.clear(); + if (searchedChats != null) searchedChats!.clear(); + if (pChatHistory != null) pChatHistory!.clear(); chatHubConnection.stop(); AppState().chatDetails = null; } void deleteData() { List exists = [], unique = []; - if(searchedChats != null) exists.addAll(searchedChats!); + if (searchedChats != null) exists.addAll(searchedChats!); exists.addAll(favUsersList!); Map profileMap = {}; for (ChatUser item in exists) { diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index c1a186a..ff860b3 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -107,7 +107,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { DrawerMenuItem("assets/images/drawer/performance_evaluation.svg", LocaleKeys.performanceEvaluation.tr(), AppRoutes.performanceEvaluation), DrawerMenuItem("assets/images/drawer/mowadhafi.svg", LocaleKeys.mowadhafhi.tr(), AppRoutes.mowadhafhi), DrawerMenuItem("assets/images/drawer/pending_trasactions.svg", LocaleKeys.pendingTransactions.tr(), AppRoutes.pendingTransactions), - DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen), + // DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen), DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword), ];