From 9cc86751eb3aa2b821e484389efe0e8d2ced12b9 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 8 Jun 2022 10:29:45 +0300 Subject: [PATCH 01/22] missing swipe cont --- lib/api/login_api_client.dart | 2 + lib/api/my_attendance_api_client.dart | 34 ++++ lib/classes/consts.dart | 4 +- lib/classes/utils.dart | 2 +- lib/main.dart | 10 +- .../validate_eit_transaction_model.dart | 27 +++ lib/models/generic_response_model.dart | 9 +- lib/models/get_default_value_list_model.dart | 28 +++ .../get_eit_dff_structure_list_model.dart | 2 - lib/models/post_params_model.dart | 15 +- .../dynamic_screens/dynamic_input_screen.dart | 178 ++++++++++++++++-- .../dynamic_textfield_widget.dart | 4 +- 12 files changed, 283 insertions(+), 32 deletions(-) create mode 100644 lib/models/dyanmic_forms/validate_eit_transaction_model.dart create mode 100644 lib/models/get_default_value_list_model.dart diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart index 2761ebe..ed7191c 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api/login_api_client.dart @@ -90,6 +90,8 @@ class LoginApiClient { AppState().postParamsObject?.pSessionId = responseData.pSESSIONID; AppState().postParamsObject?.pUserName = AppState().getUserName; AppState().postParamsObject?.pSelectedEmployeeNumber = AppState().getUserName; + AppState().postParamsObject?.setPLegislationCode = responseData.basicMemberInformation!.pLEGISLATIONCODE; + AppState().postParamsObject?.setPayrollCodeStr = responseData.memberInformationList!.first.pAYROLLCODE; return responseData; }, url, postParams); diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index f49aa1e..4c88ec1 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -54,4 +54,38 @@ class MyAttendanceApiClient { return responseData.getValueSetValuesList!.first; }, url, postParams); } + + Future getDefaultValue(String pSegmentName, String pDescFlexContextCode, String pDescFlexName, List> list) async { + String url = "${ApiConsts.erpRest}GET_DEFAULT_VALUE"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_PARENT_VALUE": null, + "P_SEGMENT_NAME": pSegmentName, + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_DESC_FLEX_NAME": pDescFlexName, + "GetValueSetValuesTBL": list, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); + }, url, postParams); + } + + Future validateEitTransaction(String pDescFlexContextCode, String pFunctionName, List> list) async { + String url = "${ApiConsts.erpRest}VALIDATE_EIT_TRANSACTION"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_FUNCTION_NAME": pFunctionName, + "EITTransactionTBL": list, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); + }, url, postParams); + } } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index ca8e2f0..a95e5b4 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,7 +1,7 @@ class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server - // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server - static String baseUrl = "https://hmgwebservices.com"; // Live server + static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server + // static String baseUrl = "https://hmgwebservices.com"; // Live server static String baseUrlServices = baseUrl + "/Services/"; // server // static String baseUrlServices = "https://api.cssynapses.com/tangheem/"; // Live server static String utilitiesRest = baseUrlServices + "Utilities.svc/REST/"; diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 1634fd5..8837c40 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -36,7 +36,7 @@ class Utils { } static void showLoading(BuildContext context) { - WidgetsBinding.instance?.addPostFrameCallback((_) { + WidgetsBinding.instance.addPostFrameCallback((_) { _isLoadingVisible = true; showDialog( context: context, diff --git a/lib/main.dart b/lib/main.dart index 29a8e17..8120cd8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,22 +1,18 @@ import 'dart:io'; -import 'dart:typed_data'; import 'package:easy_localization/easy_localization.dart'; +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'package:logger/logger.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; -import 'package:mohem_flutter_app/config/app_provider.dart'; import 'package:mohem_flutter_app/generated/codegen_loader.g.dart'; import 'package:mohem_flutter_app/models/post_params_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; -import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; -import 'package:nfc_manager/nfc_manager.dart'; -import 'package:nfc_manager/platform_tags.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; -import 'package:firebase_core/firebase_core.dart'; + import 'config/routes.dart'; -import 'package:logger/logger.dart'; var logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) diff --git a/lib/models/dyanmic_forms/validate_eit_transaction_model.dart b/lib/models/dyanmic_forms/validate_eit_transaction_model.dart new file mode 100644 index 0000000..a543e5c --- /dev/null +++ b/lib/models/dyanmic_forms/validate_eit_transaction_model.dart @@ -0,0 +1,27 @@ +class ValidateEitTransactionModel { + int? tRANSACTIONNUMBER; + String? nAME; + String? vARCHAR2VALUE; + int? nUMBERVALUE; + String? dATEVALUE; + + ValidateEitTransactionModel({this.tRANSACTIONNUMBER, this.nAME, this.vARCHAR2VALUE, this.nUMBERVALUE, this.dATEVALUE}); + + ValidateEitTransactionModel.fromJson(Map json) { + tRANSACTIONNUMBER = json['TRANSACTION_NUMBER']; + nAME = json['NAME']; + vARCHAR2VALUE = json['VARCHAR2_VALUE']; + nUMBERVALUE = json['NUMBER_VALUE']; + dATEVALUE = json['DATE_VALUE']; + } + + Map toJson() { + final Map data = new Map(); + data['TRANSACTION_NUMBER'] = this.tRANSACTIONNUMBER; + data['NAME'] = this.nAME; + data['VARCHAR2_VALUE'] = this.vARCHAR2VALUE; + data['NUMBER_VALUE'] = this.nUMBERVALUE; + data['DATE_VALUE'] = this.dATEVALUE; + return data; + } +} diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index ecad452..c9edf47 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -2,6 +2,7 @@ import 'package:mohem_flutter_app/models/get_absence_collection_notification_bod import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_attachement_list_model.dart'; import 'package:mohem_flutter_app/models/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_default_value_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.dart'; @@ -108,7 +109,7 @@ class GenericResponseModel { List? getCountriesList; List? getDayHoursTypeDetailsList; List? getDeductionsList; - List? getDefaultValueList; + GetDefaultValueList? getDefaultValueList; List? getEITCollectionNotificationBodyList; List? getEITDFFStructureList; List? getEITTransactionList; @@ -641,7 +642,7 @@ class GenericResponseModel { getCountriesList = json['GetCountriesList']; getDayHoursTypeDetailsList = json['GetDayHoursTypeDetailsList']; getDeductionsList = json['GetDeductionsList']; - getDefaultValueList = json['GetDefaultValueList']; + getDefaultValueList = json['GetDefaultValueList'] != null ? GetDefaultValueList.fromJson(json['GetDefaultValueList']) : null; getEITCollectionNotificationBodyList = json['GetEITCollectionNotificationBodyList']; if (json['GetEITDFFStructureList'] != null) { getEITDFFStructureList = []; @@ -1022,7 +1023,9 @@ class GenericResponseModel { data['GetCountriesList'] = this.getCountriesList; data['GetDayHoursTypeDetailsList'] = this.getDayHoursTypeDetailsList; data['GetDeductionsList'] = this.getDeductionsList; - data['GetDefaultValueList'] = this.getDefaultValueList; + if (this.getDefaultValueList != null) { + data['GetDefaultValueList'] = this.getDefaultValueList!.toJson(); + } data['GetEITCollectionNotificationBodyList'] = this.getEITCollectionNotificationBodyList; if (this.getEITDFFStructureList != null) { data['GetEITDFFStructureList'] = this.getEITDFFStructureList!.map((v) => v.toJson()).toList(); diff --git a/lib/models/get_default_value_list_model.dart b/lib/models/get_default_value_list_model.dart new file mode 100644 index 0000000..3ee7fc1 --- /dev/null +++ b/lib/models/get_default_value_list_model.dart @@ -0,0 +1,28 @@ +class GetDefaultValueList { + String? pIDCOLUMNNAME; + String? pRETURNMSG; + String? pRETURNSTATUS; + String? pVALUECOLUMNNAME; + + GetDefaultValueList( + {this.pIDCOLUMNNAME, + this.pRETURNMSG, + this.pRETURNSTATUS, + this.pVALUECOLUMNNAME}); + + GetDefaultValueList.fromJson(Map json) { + pIDCOLUMNNAME = json['P_ID_COLUMN_NAME']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pVALUECOLUMNNAME = json['P_VALUE_COLUMN_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['P_ID_COLUMN_NAME'] = this.pIDCOLUMNNAME; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_VALUE_COLUMN_NAME'] = this.pVALUECOLUMNNAME; + return data; + } +} \ No newline at end of file diff --git a/lib/models/get_eit_dff_structure_list_model.dart b/lib/models/get_eit_dff_structure_list_model.dart index d559794..baf7f95 100644 --- a/lib/models/get_eit_dff_structure_list_model.dart +++ b/lib/models/get_eit_dff_structure_list_model.dart @@ -83,8 +83,6 @@ class GetEITDFFStructureList { this.fieldAnswer}); GetEITDFFStructureList.fromJson(Map json) { - print("----------------=============================="); - print("----------------:$json"); aLPHANUMERICALLOWEDFLAG = json['ALPHANUMERIC_ALLOWED_FLAG']; aPPLICATIONCOLUMNNAME = json['APPLICATION_COLUMN_NAME']; cHILDSEGMENTSDV = json['CHILD_SEGMENTS_DV']; diff --git a/lib/models/post_params_model.dart b/lib/models/post_params_model.dart index 1ab86f7..0bb48d0 100644 --- a/lib/models/post_params_model.dart +++ b/lib/models/post_params_model.dart @@ -9,6 +9,8 @@ class PostParamsModel { String? pEmailAddress; String? pUserName; String? pSelectedEmployeeNumber; + String? pLegislationCode; + String? payrollCodeStr; int? pSessionId; String? userName; @@ -25,6 +27,8 @@ class PostParamsModel { this.pSessionId, this.pUserName, this.pSelectedEmployeeNumber, + this.payrollCodeStr, + this.pLegislationCode, }); PostParamsModel.fromJson(Map json) { @@ -33,6 +37,8 @@ class PostParamsModel { languageID = json['LanguageID']; mobileType = json['MobileType']; logInTokenID = json['LogInTokenID']; + payrollCodeStr = json['payrollCodeStr']; + pLegislationCode = json['LegislationCodeStr']; tokenID = json['TokenID']; } @@ -43,6 +49,8 @@ class PostParamsModel { data['LanguageID'] = this.languageID; data['MobileType'] = this.mobileType; data['LogInTokenID'] = this.logInTokenID; + data['payrollCodeStr'] = this.payrollCodeStr; + data['LegislationCodeStr'] = this.pLegislationCode; data['TokenID'] = this.tokenID; return data; } @@ -59,9 +67,10 @@ class PostParamsModel { data['UserName'] = this.userName; data['P_EMAIL_ADDRESS'] = this.pEmailAddress; data['P_SESSION_ID'] = this.pSessionId; + data['payrollCodeStr'] = this.payrollCodeStr; + data['LegislationCodeStr'] = this.pLegislationCode; data['P_SELECTED_EMPLOYEE_NUMBER'] = this.pSelectedEmployeeNumber; data['P_USER_NAME'] = this.pUserName; - return data; } @@ -80,4 +89,8 @@ class PostParamsModel { set setPUserName(String? v) => pUserName = v; set setPSelectedEmployeeNumber(String? v) => pSelectedEmployeeNumber = v; + + set setPLegislationCode(String? v) => pLegislationCode = v; + + set setPayrollCodeStr(String? v) => payrollCodeStr = v; } 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 6fe23ae..f668ea2 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -10,6 +10,7 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; +import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; @@ -50,20 +51,63 @@ class _DynamicInputScreenState extends State { } } + void validateTransaction() async { + try { + Utils.showLoading(context); + + // List> values = getEitDffStructureList! + // .map((e) => + // ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: e.eSERVICESDV?.pIDCOLUMNNAME ?? "").toJson()) + // .toList(); + + List> values = getEitDffStructureList!.map((e) { + String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; + if (e.fORMATTYPE == "X") { + // for date format type, date format is changed + tempVar = e.eSERVICESDV?.pVALUECOLUMNNAME ?? ""; + if (tempVar.isNotEmpty) { + DateTime date = DateFormat('yyyy-MM-dd').parse(tempVar); + tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); + } + } + return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: tempVar).toJson(); + }).toList(); + values.forEach((element) { + print(element); + }); + + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: "NEW_ROW").toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: null).toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: null).toJson()); + + genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(genericResponseModel!.pDESCFLEXCONTEXTCODE!, dynamicParams!.dynamicId, values); + getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; + //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + void calGetValueSetValues(GetEITDFFStructureList structureList) async { try { Utils.showLoading(context); String segmentId = structureList.cHILDSEGMENTSVS!; + List filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; List> values = filteredList .map((e) => GetSetValuesRequestModel( sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); - ESERVICESVS genericResponseModel = await MyAttendanceApiClient().getValueSetValues(structureList.cHILDSEGMENTSVS!, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); - + ESERVICESVS eServicesResponseModel = await MyAttendanceApiClient().getValueSetValues(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + List abc = genericResponseModel?.getEITDFFStructureList ?? []; + getEitDffStructureList = abc; int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == structureList.cHILDSEGMENTSVS); - getEitDffStructureList![index].eSERVICESVS!.add(genericResponseModel); + getEitDffStructureList![index].eSERVICESVS!.clear(); + getEitDffStructureList![index].eSERVICESVS!.add(eServicesResponseModel); // getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); Utils.hideLoading(context); @@ -74,6 +118,36 @@ class _DynamicInputScreenState extends State { } } + void getDefaultValues(GetEITDFFStructureList structureList) async { + if ((structureList.cHILDSEGMENTSDVSplited?.length ?? 0) < 1) { + return; + } + try { + Utils.showLoading(context); + for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { + String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; + GetEITDFFStructureList? reqObj = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); + List parentRequired = reqObj.pARENTSEGMENTSDVSplited ?? []; + List filteredList = + getEitDffStructureList!.where((outerElement) => parentRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); + List> values = filteredList + .map((e) => GetSetValuesRequestModel( + sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) + .toJson()) + .toList(); + + ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); + int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); + getEitDffStructureList![index].eSERVICESDV = defaultValue; + } + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + @override void dispose() { super.dispose(); @@ -109,9 +183,11 @@ class _DynamicInputScreenState extends State { LocaleKeys.next.tr(), (getEitDffStructureList ?? []).isEmpty ? null - : () => { - //Navigator.of(context).pushNamed(LOGIN_TYPE) - }, + : () { + validateTransaction(); + + //Navigator.of(context).pushNamed(LOGIN_TYPE) + }, ).insideContainer, ], ), @@ -129,22 +205,24 @@ class _DynamicInputScreenState extends State { return PopupMenuButton( child: DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + model.eSERVICESDV?.pVALUECOLUMNNAME ?? "", isEnable: false, isPopup: true, ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), ], - onSelected: (int index) { - + onSelected: (int popipIndex) { ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME, + pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, pRETURNMSG: "null", - pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: model.eSERVICESVS![index].vALUECOLUMNNAME); - - print(model.eSERVICESVS![index].toJson()); + pRETURNSTATUS: getEitDffStructureList![popipIndex].dEFAULTVALUE, + pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } }); } @@ -163,6 +241,9 @@ class _DynamicInputScreenState extends State { suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); getEitDffStructureList![index].fieldAnswer = date.toString(); @@ -178,6 +259,34 @@ class _DynamicInputScreenState extends State { } }, ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "I") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""), + suffixIconData: Icons.access_time_filled_rounded, + isEnable: false, + onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + var timeString = getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.split(":"); + selectedDate = DateTime(0, 0, 0, int.parse(timeString[0]), int.parse(timeString[1])); + + //DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } + TimeOfDay _time = await _selectTime(context); + // TimeOfDay.fromDateTime(time) + + String time = DateFormat('HH:mm').format(DateFormat("hh:mm a").parse(_time.format(context))).trim(); + + // DateTime date1 = DateTime(date.year, date.month, date.day); + // getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV(pIDCOLUMNNAME: time, pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, pVALUECOLUMNNAME: time); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + }, + ).paddingOnly(bottom: 12); } return Column( @@ -218,4 +327,45 @@ class _DynamicInputScreenState extends State { } return time; } + + Future _selectTime(BuildContext context) async { + TimeOfDay time = TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute); + if (!Platform.isIOS) { + await showCupertinoModalPopup( + context: context, + builder: (cxt) => Container( + height: 250, + color: Colors.white, + child: CupertinoDatePicker( + backgroundColor: Colors.white, + mode: CupertinoDatePickerMode.time, + use24hFormat: true, + onDateTimeChanged: (value) { + if (value != null && value != selectedDate) { + time = TimeOfDay(hour: value.hour, minute: value.minute); + } + }, + initialDateTime: selectedDate, + ), + ), + ); + } else { + final TimeOfDay? picked = await showTimePicker( + context: context, + initialTime: time, + builder: (cxt, child) { + return MediaQuery(data: MediaQuery.of(context).copyWith(alwaysUse24HourFormat: true), child: child ?? Container()); + }); + + if (picked != null && picked != time) { + time = picked; + } + // final DateTime? picked = + // await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + // if (picked != null && picked != selectedDate) { + // time = picked; + // } + } + return time; + } } diff --git a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart index 23404ca..c44be0d 100644 --- a/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart +++ b/lib/widgets/dynamic_forms/dynamic_textfield_widget.dart @@ -98,8 +98,8 @@ class DynamicTextFieldWidget extends StatelessWidget { ], ), ), - if (isPopup) const Icon(Icons.keyboard_arrow_down_outlined, color: MyColors.darkTextColor), - if (onTap != null) Icon(suffixIconData ?? Icons.keyboard_arrow_down_outlined, color: MyColors.darkTextColor), + if (isPopup) const Icon(Icons.keyboard_arrow_down_outlined, color: MyColors.darkIconColor), + if (onTap != null) Icon(suffixIconData ?? Icons.keyboard_arrow_down_outlined, color: MyColors.darkIconColor,size: 20), ], ), ), From 1e9a26e3df1e7900632df701e4f95ef78dc9ddde Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 9 Jun 2022 14:04:35 +0300 Subject: [PATCH 02/22] missing swipe cont --- assets/langs/ar-SA.json | 1 + assets/langs/en-US.json | 1 + lib/api/my_attendance_api_client.dart | 34 + lib/config/routes.dart | 4 + lib/generated/locale_keys.g.dart | 1 + lib/models/generic_response_model.dart | 41 +- lib/models/get_approves_list_model.dart | 60 ++ .../submit_eit_transaction_list_model.dart | 28 + .../validate_eit_transaction_list_model.dart | 18 + lib/ui/misc/request_submit_screen.dart | 206 +++++ .../dynamic_screens/dynamic_input_screen.dart | 14 +- .../my_attendance/my_attendance_screen.dart | 6 +- lib/ui/screens/tangheem_detail_screen.dart | 819 ------------------ lib/widgets/button/default_button.dart | 46 +- lib/widgets/button/simple_button.dart | 42 + pubspec.yaml | 1 + 16 files changed, 446 insertions(+), 876 deletions(-) create mode 100644 lib/models/get_approves_list_model.dart create mode 100644 lib/models/submit_eit_transaction_list_model.dart create mode 100644 lib/models/validate_eit_transaction_list_model.dart create mode 100644 lib/ui/misc/request_submit_screen.dart delete mode 100644 lib/ui/screens/tangheem_detail_screen.dart create mode 100644 lib/widgets/button/simple_button.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index fe71e90..27f1ab0 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -210,6 +210,7 @@ "myAttendance": "حضوري", "workOnBreak": "العمل على استراحة", "next": "التالي", + "submit": "ارسال", "profile": { "reset_password": { "label": "Reset Password", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index a1bfdfa..498d3e1 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -210,6 +210,7 @@ "myAttendance": "My Attendance", "workOnBreak": "Work On Break", "next": "Next", + "submit": "Submit", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index 4c88ec1..44b91da 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -3,8 +3,10 @@ import 'dart:async'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'api_client.dart'; @@ -88,4 +90,36 @@ class MyAttendanceApiClient { return responseData; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); }, url, postParams); } + + Future submitEitTransaction(String pDescFlexContextCode, String pFunctionName, List> list) async { + String url = "${ApiConsts.erpRest}SUBMIT_EIT_TRANSACTION"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, + "P_FUNCTION_NAME": pFunctionName, + "EITTransactionTBL": list, + "EITTransactionTBLModel": list, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); + }, url, postParams); + } + + Future> getApproversList(String pAmeTransactionType, int pTransactionId) async { + String url = "${ApiConsts.erpRest}GET_APPROVERS_LIST"; + Map postParams = { + "P_AME_TRANSACTION_TYPE": pAmeTransactionType, + "P_PAGE_LIMIT": 1000, + "P_PAGE_NUM": 1, + "P_TRANSACTION_ID": pTransactionId, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getApprovesList ?? []; + }, url, postParams); + } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index a31d24c..929924a 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -6,6 +6,7 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart'; import 'package:mohem_flutter_app/ui/login/new_password_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; +import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; @@ -37,6 +38,7 @@ class AppRoutes { static const String myAttendance = "/myAttendance"; static const String dynamicScreen = "/dynamicScreen"; static const String addDynamicInput = "/addDynamicInput"; + static const String requestSubmitScreen = "/requestSubmitScreen"; static final Map routes = { login: (context) => LoginScreen(), @@ -56,5 +58,7 @@ class AppRoutes { myAttendance: (context) => MyAttendanceScreen(), dynamicScreen: (context) => DynamicListViewScreen(), addDynamicInput: (context) => DynamicInputScreen(), + + requestSubmitScreen: (context) => RequestSubmitScreen(), }; } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index fed6ef6..bb7f085 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -221,5 +221,6 @@ abstract class LocaleKeys { static const myAttendance = 'myAttendance'; static const workOnBreak = 'workOnBreak'; static const next = 'next'; + static const submit = 'submit'; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index c9edf47..de0404d 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1,5 +1,6 @@ import 'package:mohem_flutter_app/models/get_absence_collection_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_attachement_list_model.dart'; import 'package:mohem_flutter_app/models/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_default_value_list_model.dart'; @@ -17,7 +18,9 @@ import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_mod import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; +import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'basic_member_information_model.dart'; @@ -88,7 +91,7 @@ class GenericResponseModel { List? getActionHistoryList; List? getAddressDffStructureList; List? getAddressNotificationBodyList; - List? getApprovesList; + List? getApprovesList; List? getAttachementList; GetAttendanceTracking? getAttendanceTrackingList; List? getBasicDetColsStructureList; @@ -253,7 +256,7 @@ class GenericResponseModel { String? submitCEITransactionList; String? submitCcpTransactionList; String? submitContactTransactionList; - String? submitEITTransactionList; + SubmitEITTransactionList? submitEITTransactionList; String? submitHrTransactionList; String? submitPhonesTransactionList; String? submitSITTransactionList; @@ -272,7 +275,7 @@ class GenericResponseModel { String? vHRGetProjectByCodeList; bool? vHRIsVerificationCodeValid; String? validateAbsenceTransactionList; - String? validateEITTransactionList; + ValidateEITTransactionList? validateEITTransactionList; String? validatePhonesTransactionList; String? vrItemTypesList; String? wFLookUpList; @@ -608,7 +611,13 @@ class GenericResponseModel { getAddressDffStructureList = json['GetAddressDffStructureList']; getAddressNotificationBodyList = json['GetAddressNotificationBodyList']; - getApprovesList = json['GetApprovesList']; + + if (json['GetApprovesList'] != null) { + getApprovesList = []; + json['GetApprovesList'].forEach((v) { + getApprovesList!.add(new GetApprovesList.fromJson(v)); + }); + } if (json['GetAttachementList'] != null) { getAttachementList = []; @@ -887,7 +896,8 @@ class GenericResponseModel { submitCEITransactionList = json['SubmitCEITransactionList']; submitCcpTransactionList = json['SubmitCcpTransactionList']; submitContactTransactionList = json['SubmitContactTransactionList']; - submitEITTransactionList = json['SubmitEITTransactionList']; + submitEITTransactionList = json['SubmitEITTransactionList'] != null ? new SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null; + submitHrTransactionList = json['SubmitHrTransactionList']; submitPhonesTransactionList = json['SubmitPhonesTransactionList']; submitSITTransactionList = json['SubmitSITTransactionList']; @@ -913,7 +923,9 @@ class GenericResponseModel { vHRGetProjectByCodeList = json['VHR_GetProjectByCodeList']; vHRIsVerificationCodeValid = json['VHR_IsVerificationCodeValid']; validateAbsenceTransactionList = json['ValidateAbsenceTransactionList']; - validateEITTransactionList = json['ValidateEITTransactionList']; + + validateEITTransactionList = json['ValidateEITTransactionList'] != null ? new ValidateEITTransactionList.fromJson(json['ValidateEITTransactionList']) : null; + validatePhonesTransactionList = json['ValidatePhonesTransactionList']; vrItemTypesList = json['VrItemTypesList']; wFLookUpList = json['WFLookUpList']; @@ -994,7 +1006,10 @@ class GenericResponseModel { data['GetAddressDffStructureList'] = this.getAddressDffStructureList; data['GetAddressNotificationBodyList'] = this.getAddressNotificationBodyList; - data['GetApprovesList'] = this.getApprovesList; + + if (this.getApprovesList != null) { + data['GetApprovesList'] = this.getApprovesList!.map((v) => v.toJson()).toList(); + } if (this.getAttachementList != null) { data['GetAttachementList'] = this.getAttachementList!.map((v) => v.toJson()).toList(); @@ -1226,7 +1241,11 @@ class GenericResponseModel { data['SubmitCEITransactionList'] = this.submitCEITransactionList; data['SubmitCcpTransactionList'] = this.submitCcpTransactionList; data['SubmitContactTransactionList'] = this.submitContactTransactionList; - data['SubmitEITTransactionList'] = this.submitEITTransactionList; + + if (this.submitEITTransactionList != null) { + data['SubmitEITTransactionList'] = this.submitEITTransactionList!.toJson(); + } + data['SubmitHrTransactionList'] = this.submitHrTransactionList; data['SubmitPhonesTransactionList'] = this.submitPhonesTransactionList; data['SubmitSITTransactionList'] = this.submitSITTransactionList; @@ -1250,7 +1269,11 @@ class GenericResponseModel { data['VHR_GetProjectByCodeList'] = this.vHRGetProjectByCodeList; data['VHR_IsVerificationCodeValid'] = this.vHRIsVerificationCodeValid; data['ValidateAbsenceTransactionList'] = this.validateAbsenceTransactionList; - data['ValidateEITTransactionList'] = this.validateEITTransactionList; + + if (this.validateEITTransactionList != null) { + data['ValidateEITTransactionList'] = this.validateEITTransactionList!.toJson(); + } + data['ValidatePhonesTransactionList'] = this.validatePhonesTransactionList; data['VrItemTypesList'] = this.vrItemTypesList; data['WFLookUpList'] = this.wFLookUpList; diff --git a/lib/models/get_approves_list_model.dart b/lib/models/get_approves_list_model.dart new file mode 100644 index 0000000..f5a4d82 --- /dev/null +++ b/lib/models/get_approves_list_model.dart @@ -0,0 +1,60 @@ +class GetApprovesList { + String? aPPROVALSTATUS; + String? aPPROVER; + String? aPPROVERCATEGORY; + int? aPPROVERORDERNUMBER; + String? aPPROVERTYPE; + String? eMPLOYEEIMAGE; + int? fROMROWNUM; + int? lINENO; + int? nOOFROWS; + String? pOSITIONTITLE; + int? rOWNUM; + int? tOROWNUM; + + GetApprovesList( + {this.aPPROVALSTATUS, + this.aPPROVER, + this.aPPROVERCATEGORY, + this.aPPROVERORDERNUMBER, + this.aPPROVERTYPE, + this.eMPLOYEEIMAGE, + this.fROMROWNUM, + this.lINENO, + this.nOOFROWS, + this.pOSITIONTITLE, + this.rOWNUM, + this.tOROWNUM}); + + GetApprovesList.fromJson(Map json) { + aPPROVALSTATUS = json['APPROVAL_STATUS']; + aPPROVER = json['APPROVER']; + aPPROVERCATEGORY = json['APPROVER_CATEGORY']; + aPPROVERORDERNUMBER = json['APPROVER_ORDER_NUMBER']; + aPPROVERTYPE = json['APPROVER_TYPE']; + eMPLOYEEIMAGE = json['EMPLOYEE_IMAGE']; + fROMROWNUM = json['FROM_ROW_NUM']; + lINENO = json['LINE_NO']; + nOOFROWS = json['NO_OF_ROWS']; + pOSITIONTITLE = json['POSITION_TITLE']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['APPROVAL_STATUS'] = this.aPPROVALSTATUS; + data['APPROVER'] = this.aPPROVER; + data['APPROVER_CATEGORY'] = this.aPPROVERCATEGORY; + data['APPROVER_ORDER_NUMBER'] = this.aPPROVERORDERNUMBER; + data['APPROVER_TYPE'] = this.aPPROVERTYPE; + data['EMPLOYEE_IMAGE'] = this.eMPLOYEEIMAGE; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['LINE_NO'] = this.lINENO; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['POSITION_TITLE'] = this.pOSITIONTITLE; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/submit_eit_transaction_list_model.dart b/lib/models/submit_eit_transaction_list_model.dart new file mode 100644 index 0000000..288ce8e --- /dev/null +++ b/lib/models/submit_eit_transaction_list_model.dart @@ -0,0 +1,28 @@ +class SubmitEITTransactionList { + String? pITEMKEY; + String? pRETURNMSG; + String? pRETURNSTATUS; + int? pTRANSACTIONID; + + SubmitEITTransactionList( + {this.pITEMKEY, + this.pRETURNMSG, + this.pRETURNSTATUS, + this.pTRANSACTIONID}); + + SubmitEITTransactionList.fromJson(Map json) { + pITEMKEY = json['P_ITEM_KEY']; + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + pTRANSACTIONID = json['P_TRANSACTION_ID']; + } + + Map toJson() { + final Map data = new Map(); + data['P_ITEM_KEY'] = this.pITEMKEY; + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + data['P_TRANSACTION_ID'] = this.pTRANSACTIONID; + return data; + } +} \ No newline at end of file diff --git a/lib/models/validate_eit_transaction_list_model.dart b/lib/models/validate_eit_transaction_list_model.dart new file mode 100644 index 0000000..02f2af0 --- /dev/null +++ b/lib/models/validate_eit_transaction_list_model.dart @@ -0,0 +1,18 @@ +class ValidateEITTransactionList { + String? pRETURNMSG; + String? pRETURNSTATUS; + + ValidateEITTransactionList({this.pRETURNMSG, this.pRETURNSTATUS}); + + ValidateEITTransactionList.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart new file mode 100644 index 0000000..c57ce6b --- /dev/null +++ b/lib/ui/misc/request_submit_screen.dart @@ -0,0 +1,206 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/button/simple_button.dart'; +import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; +import 'package:mohem_flutter_app/widgets/input_widget.dart'; + +class RequestSubmitScreenParams { + String title; + int transactionId; + + RequestSubmitScreenParams(this.title, this.transactionId); +} + +class RequestSubmitScreen extends StatefulWidget { + RequestSubmitScreen({Key? key}) : super(key: key); + + @override + _RequestSubmitScreenState createState() { + return _RequestSubmitScreenState(); + } +} + +class _RequestSubmitScreenState extends State { + RequestSubmitScreenParams? params; + + List approverList = []; + List attachmentFiles = []; + + @override + void initState() { + super.initState(); + } + + void getApproverList() async { + try { + Utils.showLoading(context); + approverList = await MyAttendanceApiClient().getApproversList("SSHRMS", params!.transactionId); + + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (params == null) { + params = ModalRoute.of(context)!.settings.arguments as RequestSubmitScreenParams; + getApproverList(); + } + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: params!.title, + ), + body: Column( + children: [ + ListView( + padding: const EdgeInsets.all(21).copyWith(top: 14), + physics: const BouncingScrollPhysics(), + children: [ + attachmentView("Attachments"), + 14.height, + InputWidget( + "Comments", + "Write a comment", + TextEditingController(), + isBackgroundEnable: true, + lines: 3, + onChange: (String note) { + // this.note = note; + }, + ), //.objectContainerView(title: "Comments"), + 14.height, + "Approvers List".toSectionHeading(), + 14.height, + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + return approverView(cxt, approverList[index]); + }, + separatorBuilder: (cxt, index) => 12.height, + itemCount: approverList.length, + ) + ], + ).expanded, + DefaultButton( + LocaleKeys.submit.tr(), + () { + //Navigator.of(context).pushNamed(LOGIN_TYPE) + }, + ).insideContainer, + ], + ), + ); + } + + Widget approverView(BuildContext context, GetApprovesList approver) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CircularAvatar(url: approver.eMPLOYEEIMAGE, isImageBase64: true, height: 40, width: 40), + 9.width, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + approver.aPPROVER!.toText16(), + approver.pOSITIONTITLE!.toText12(color: MyColors.lightTextColor), + ], + ), + ) + ], + ).objectContainerView(); + } + + Widget attachmentView(String title) { + return Container( + padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + title.toText16().expanded, + 6.width, + SimpleButton("Add", () async { + FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); + if (result != null) { + attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList(); + attachmentFiles = attachmentFiles.toSet().toList(); + setState(() {}); + } + }, fontSize: 14), + ], + ), + if (attachmentFiles.isNotEmpty) 12.height, + if (attachmentFiles.isNotEmpty) + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + String fileName = attachmentFiles[index].path.split('/').last; + + return Row( + children: [ + fileName.toText13().expanded, + 6.width, + IconButton( + padding: EdgeInsets.zero, + iconSize: 20, + icon: const Icon(Icons.cancel_rounded), + color: MyColors.redColor, + constraints: const BoxConstraints(), + onPressed: () async { + attachmentFiles.removeAt(index); + setState(() {}); + }, + ) + ], + ); + }, + separatorBuilder: (cxt, index) => 6.height, + itemCount: attachmentFiles.length), + ], + ), + ); + } +} 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 f668ea2..bdbc1d6 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; @@ -13,6 +14,8 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_mo import 'package:mohem_flutter_app/models/dyanmic_forms/validate_eit_transaction_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; +import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -54,12 +57,6 @@ class _DynamicInputScreenState extends State { void validateTransaction() async { try { Utils.showLoading(context); - - // List> values = getEitDffStructureList! - // .map((e) => - // ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: e.eSERVICESDV?.pIDCOLUMNNAME ?? "").toJson()) - // .toList(); - List> values = getEitDffStructureList!.map((e) { String tempVar = e.eSERVICESDV?.pIDCOLUMNNAME ?? ""; if (e.fORMATTYPE == "X") { @@ -81,10 +78,9 @@ class _DynamicInputScreenState extends State { values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: null).toJson()); genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(genericResponseModel!.pDESCFLEXCONTEXTCODE!, dynamicParams!.dynamicId, values); - getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; - //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); + SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(genericResponseModel!.pDESCFLEXCONTEXTCODE!, dynamicParams!.dynamicId, values); Utils.hideLoading(context); - setState(() {}); + Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", submitEITTransactionList.pTRANSACTIONID!)); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index 2b74c98..e00a5c6 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -7,6 +7,7 @@ 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/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; @@ -31,7 +32,6 @@ class MyAttendanceScreen extends StatelessWidget { LocaleKeys.missingSwipes.tr(), ).onPress(() { Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS")); - }), 12.height, itemView( @@ -44,7 +44,9 @@ class MyAttendanceScreen extends StatelessWidget { itemView( "assets/images/pdf.svg", LocaleKeys.workOnBreak.tr(), - ), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", 8724807)); + }), ], ).paddingAll(21)), ); diff --git a/lib/ui/screens/tangheem_detail_screen.dart b/lib/ui/screens/tangheem_detail_screen.dart deleted file mode 100644 index 0f4ea7b..0000000 --- a/lib/ui/screens/tangheem_detail_screen.dart +++ /dev/null @@ -1,819 +0,0 @@ -// import 'package:flutter/cupertino.dart'; -// import 'package:flutter/material.dart'; -// import 'package:flutter_html/flutter_html.dart'; -// import 'package:flutter_svg/flutter_svg.dart'; -// import 'package:shared_preferences/shared_preferences.dart'; -// import 'package:tangheem/api/admin_configuration_api_client.dart'; -// import 'package:tangheem/api/tangheem_user_api_client.dart'; -// import 'package:tangheem/app_state/app_state.dart'; -// import 'package:tangheem/classes/colors.dart'; -// import 'package:tangheem/classes/consts.dart'; -// import 'package:tangheem/classes/utils.dart'; -// import 'package:tangheem/extensions/string_extensions.dart'; -// import 'package:tangheem/models/aya_tangheem_type_mapped.dart'; -// import 'package:tangheem/models/discussion_model.dart'; -// import 'package:tangheem/ui/dialogs/discussion_input_dialog.dart'; -// import 'package:tangheem/widgets/aya_player_widget.dart'; -// import 'package:tangheem/widgets/aya_record_widget.dart'; -// import 'package:tangheem/widgets/text_highlight_widget.dart'; -// -// import 'login_screen.dart'; -// -// class TangheemDetailParams { -// final String selectedTangheemTypeId; -// final List ayatTangheemTypeMappedDataList; -// -// TangheemDetailParams({@required this.selectedTangheemTypeId, @required this.ayatTangheemTypeMappedDataList}); -// } -// -// class TangheemDetailScreen extends StatefulWidget { -// static const String routeName = "/tangheem_detail"; -// final TangheemDetailParams tangheemDetailParams; -// -// TangheemDetailScreen({Key key, this.tangheemDetailParams}) : super(key: key); -// -// @override -// _TangheemDetailScreenState createState() { -// return _TangheemDetailScreenState(); -// } -// } -// -// class _TangheemDetailScreenState extends State { -// GlobalKey _globalKey = GlobalKey(); -// -// List voiceNoteList = []; -// -// List ayatTangheemTypeMappedDataList = []; -// -// List _dataList = []; -// -// int _discussionPage = -1; -// AyatTangheemTypeMappedData _ayatTangheemTypeMappedFirstData; -// DiscussionModel _discussionModel; -// -// bool showAyaPlayer = false; -// -// @override -// void initState() { -// super.initState(); -// ayatTangheemTypeMappedDataList = widget.tangheemDetailParams.ayatTangheemTypeMappedDataList; -// _ayatTangheemTypeMappedFirstData = ayatTangheemTypeMappedDataList.first; -// filterVoiceListData(); -// getPrefs(); -// getTangheemDiscussionAndRelatedData(); -// } -// -// double fontSize = 18; -// -// SharedPreferences prefs; -// -// void getPrefs() async { -// prefs = await SharedPreferences.getInstance(); -// fontSize = (prefs.getInt(GlobalConsts.fontZoomSize) ?? 18) + 0.0; -// setState(() {}); -// } -// -// String getArabicIndexWord(int index) { -// if (index == 0) { -// return 'الأولى'; -// } else if (index == 1) { -// return 'الثانية'; -// } else if (index == 2) { -// return 'الثالثة'; -// } else if (index == 3) { -// return 'الرابعة'; -// } else if (index == 4) { -// return 'الخامسة'; -// } -// return ""; -// } -// -// void getTangheemDiscussionAndRelatedData() async { -// Utils.showLoading(context); -// try { -// _discussionModel = await TangheemUserApiClient().getDiscussionByTangheemID(_discussionPage, widget.tangheemDetailParams.selectedTangheemTypeId); -// if (!_ayatTangheemTypeMappedFirstData.ayatNumberInSurahs.contains(",")) { -// _dataList = await getTangheemRelatedData(); -// } -// Utils.hideLoading(context); -// setState(() {}); -// } catch (ex) { -// print(ex); -// Utils.handleException(ex, context, null); -// Utils.hideLoading(context); -// } -// } -// -// Future> getTangheemRelatedData() async { -// _dataList = []; -// AyatTangheemTypeMapped _ayatTangheemTypeMapped = -// await TangheemUserApiClient().getAyaTangheemTypeMappedRelated(_ayatTangheemTypeMappedFirstData.surahNo, _ayatTangheemTypeMappedFirstData.ayatNumberInSurahs); -// _dataList = _ayatTangheemTypeMapped?.data ?? []; -// if (_dataList.isNotEmpty) { -// _dataList = _dataList.where((element) => element.tangheemTypeId != _ayatTangheemTypeMappedFirstData.tangheemTypeId)?.toList() ?? []; -// var _tempList = _dataList.map((e) => e.tangheemTypeId).toList().toSet().toList(); -// var _dataTempList = []; -// _tempList.forEach((_tempElement) { -// _dataTempList.add(_dataList.firstWhere((element) { -// return !element.ayatNumberInSurahs.contains(",") && (element.tangheemTypeId == _tempElement); -// }, orElse: null)); -// }); -// _dataList = _dataTempList; -// } -// -// return _dataList; -// } -// -// void sendComment(String discussionText) async { -// Utils.showLoading(context); -// try { -// await AdminConfigurationApiClient().addDiscussion(discussionText, _ayatTangheemTypeMappedFirstData.ayaTangheemTypeId); -// Utils.showToast("تم إرسال التعليق ، سيكون مرئيًا بمجرد موافقة المسؤول عليه"); -// Utils.hideLoading(context); -// Navigator.pop(context); -// } catch (ex) { -// Utils.handleException(ex, context, null); -// Utils.hideLoading(context); -// } -// } -// -// void filterVoiceListData() { -// ayatTangheemTypeMappedDataList.forEach((element) { -// voiceNoteList.addAll(element.voiceNote); -// }); -// } -// -// @override -// void dispose() { -// super.dispose(); -// } -// -// @override -// Widget build(BuildContext context) { -// return Container( -// padding: EdgeInsets.fromLTRB(16, 0, 16, 0), -// width: double.infinity, -// child: _ayatTangheemTypeMappedFirstData == null -// ? SizedBox() -// : Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Expanded( -// child: ListView( -// physics: BouncingScrollPhysics(), -// padding: EdgeInsets.only(bottom: 16, top: 16), -// children: [ -// Text( -// _ayatTangheemTypeMappedFirstData.tangheemTypeName ?? "", -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// SizedBox(height: 8), -// Text( -// _ayatTangheemTypeMappedFirstData.tangheemTypeDescription ?? "", -// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1), -// ), -// SizedBox(height: 8), -// Container( -// margin: EdgeInsets.only(top: 4, bottom: 4), -// padding: EdgeInsets.only(top: 8, bottom: 8, right: 4, left: 4), -// decoration: BoxDecoration( -// color: Colors.white, -// borderRadius: BorderRadius.circular(8), -// ), -// child: SingleChildScrollView( -// physics: NeverScrollableScrollPhysics(), -// child: RepaintBoundary( -// key: _globalKey, -// child: Material( -// color: Colors.white, -// child: ListView.builder( -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// itemCount: ayatTangheemTypeMappedDataList.length > 5 ? 5 : ayatTangheemTypeMappedDataList.length, -// itemBuilder: (context, index) { -// var _ayatTangheemTypeMappedData = ayatTangheemTypeMappedDataList[index]; -// List _tangheemInsideTableList = []; -// List _tangheemAboveTableList = []; -// List _tangheemBelowTableList = []; -// List _tangheemWords = []; -// -// List _tempPropertyList = List() + _ayatTangheemTypeMappedData?.property ?? []; -// int firstIndex = _tempPropertyList.indexWhere((element) => element.isInsideTable); -// if (firstIndex >= 0) { -// var _tempPropertyListTop = _tempPropertyList.take(firstIndex); -// _tempPropertyListTop = _tempPropertyListTop.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// _tangheemAboveTableList = _tempPropertyListTop; -// _tempPropertyListTop.forEach((element) { -// _tempPropertyList.remove(element); -// }); -// var _tempPropertyListInside = _tempPropertyList?.where((element) => (element.isInsideTable))?.toList() ?? []; -// _tempPropertyListInside.forEach((element) { -// _tempPropertyList.remove(element); -// }); -// _tempPropertyListInside = _tempPropertyListInside.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// _tangheemInsideTableList = _tempPropertyListInside; -// var _tempPropertyListBelow = _tempPropertyList; -// _tempPropertyListBelow = _tempPropertyListBelow.where((element) => (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// _tangheemBelowTableList = _tempPropertyListBelow; -// } -// -// _tangheemWords.add(_ayatTangheemTypeMappedData.highlightText ?? ""); -// // _tangheemInsideTableList = -// // _ayatTangheemTypeMappedData?.property?.where((element) => (element.isInsideTable) && (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// // _tangheemAboveTableList = -// // _ayatTangheemTypeMappedData?.property?.where((element) => (!element.isInsideTable) && (element.propertyValue ?? "").isNotEmpty)?.toList() ?? []; -// // -// // -// -// var _tempTangheemIndexWord = ""; -// if (ayatTangheemTypeMappedDataList.length == 1) { -// _tempTangheemIndexWord = ""; -// } else { -// _tempTangheemIndexWord = getArabicIndexWord(index) + " "; -// } -// -// return ListView( -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// padding: EdgeInsets.all(4), -// children: [ -// Row( -// children: [ -// Text( -// " جملة ${_ayatTangheemTypeMappedData.tangheemTypeName} $_tempTangheemIndexWord", -// style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white, backgroundColor: ColorConsts.primaryBlue), -// ), -// Expanded( -// child: Container(height: 2, color: ColorConsts.primaryBlue), -// ), -// ], -// ), -// SizedBox(height: 8), -// TextHighLightWidget( -// text: _ayatTangheemTypeMappedData.reverseAyatNumber() ?? "", -// valueColor: ColorConsts.primaryBlue, -// highlights: _tangheemWords, -// highLightFontSize: fontSize, -// style: TextStyle( -// fontFamily: "UthmanicHafs", -// fontSize: fontSize, -// fontWeight: FontWeight.bold, -// ), -// ), -// SizedBox(height: 16), -// ListView.separated( -// itemCount: _tangheemAboveTableList.length, -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// separatorBuilder: (context, index) { -// return Divider( -// color: Colors.white, -// height: 4, -// thickness: 0, -// ); -// }, -// itemBuilder: (context, index) { -// return Row( -// children: [ -// Expanded( -// child: Container( -// height: 40, -// padding: EdgeInsets.only(left: 4, right: 8), -// alignment: Alignment.centerRight, -// child: Text( -// _tangheemAboveTableList[index].propertyText, -// maxLines: 1, -// style: TextStyle(fontWeight: FontWeight.bold, color: ColorConsts.secondaryOrange), -// ), -// color: ColorConsts.secondaryWhite, -// ), -// ), -// SizedBox(width: 4), -// Expanded( -// child: Container( -// color: ColorConsts.secondaryWhite, -// padding: EdgeInsets.all(4), -// child: Container( -// color: Colors.white, -// padding: EdgeInsets.only(left: 4, right: 8), -// // alignment: Alignment.centerRight, -// child: Html( -// data: _tangheemAboveTableList[index]?.propertyValue ?? "", -// style: { -// 'html': Style(textAlign: TextAlign.left), -// }, -// ), -// -// // Text( -// // _tangheemAboveTableList[index].propertyValue, -// // maxLines: 1, -// // style: TextStyle( -// // color: Color( -// // Utils.stringToHex(_tangheemAboveTableList[index].textColor), -// // ), -// // ), -// // ), -// ), -// ), -// ) -// ], -// ); -// }), -// if (_tangheemInsideTableList.isNotEmpty) -// Container( -// color: ColorConsts.primaryBlue, -// margin: EdgeInsets.only(top: 8, bottom: 8), -// padding: EdgeInsets.all(8), -// child: Column( -// children: [ -// Text( -// "خط النبر و التنغيم ل${_ayatTangheemTypeMappedData.tangheemTypeName ?? ""}", -// style: TextStyle(fontWeight: FontWeight.bold, color: Colors.white), -// ), -// SizedBox(height: 8), -// tangheemInsideTablePropertyView(_tangheemInsideTableList) -// ], -// ), -// ), -// tangheemOutSideTablePropertyView(_tangheemBelowTableList) -// ], -// ); -// }), -// ), -// ), -// ), -// ), -// SizedBox(height: 8), -// discussionView(_discussionModel?.data ?? []), -// if (_dataList.isNotEmpty) -// Container( -// margin: EdgeInsets.only(top: 8), -// padding: EdgeInsets.only(bottom: 20), -// width: double.infinity, -// decoration: BoxDecoration( -// color: Colors.white, -// borderRadius: BorderRadius.circular(8), -// ), -// child: Column( -// children: [ -// Container( -// height: 60, -// width: double.infinity, -// margin: EdgeInsets.only(bottom: 8), -// alignment: Alignment.center, -// decoration: BoxDecoration( -// color: ColorConsts.primaryBlue, -// borderRadius: BorderRadius.only( -// topLeft: Radius.circular(8), -// topRight: Radius.circular(8), -// ), -// ), -// child: Text( -// "قائمة الأساليب اللغوية في هذه الآية", -// style: TextStyle(fontSize: 16, color: Colors.white), -// ), -// ), -// ListView.separated( -// padding: EdgeInsets.fromLTRB(4, 8, 4, 4), -// shrinkWrap: true, -// physics: NeverScrollableScrollPhysics(), -// itemCount: _dataList.length, -// separatorBuilder: (context, index) => SizedBox(height: 16), -// itemBuilder: (context, index) { -// return InkWell( -// onTap: () { -// List list = _dataList; -// var removedData = list[index]; -// list.remove(removedData); -// list.insert(0, removedData); -// TangheemDetailParams tangheem = TangheemDetailParams(selectedTangheemTypeId: _dataList[index].ayaTangheemTypeId, ayatTangheemTypeMappedDataList: list); -// Navigator.pushNamed(context, TangheemDetailScreen.routeName, arguments: tangheem); -// }, -// child: Text( -// _dataList[index].tangheemTypeName, -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: ColorConsts.secondaryOrange, height: 1.5), -// ), -// ); -// }, -// ), -// ], -// ), -// ), -// SizedBox(height: 16), -// AyaRecordWidget() -// ], -// ), -// ), -// if (MediaQuery.of(context).orientation == Orientation.portrait) -// AyaPlayerWidget( -// surahName: _ayatTangheemTypeMappedFirstData?.surahNameAr ?? "", -// ayaTangheemTypeId: _ayatTangheemTypeMappedFirstData?.ayaTangheemTypeId ?? "", -// globalKey: _globalKey, -// ayaNo: _ayatTangheemTypeMappedFirstData?.ayahNo, -// surahNo: _ayatTangheemTypeMappedFirstData?.surahNo, -// voiceNoteList: voiceNoteList), -// if (MediaQuery.of(context).orientation == Orientation.landscape) -// Column( -// mainAxisSize: MainAxisSize.min, -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Container( -// height: 24, -// margin: EdgeInsets.only(bottom: 8, top: 8), -// // color: Colors.transparent, -// child: TextButton( -// onPressed: () { -// setState(() { -// showAyaPlayer = !showAyaPlayer; -// }); -// }, -// child: Text( -// showAyaPlayer ? "إخفاء التسجيلات" : "إظهار التسجيلات", -// style: TextStyle(color: Colors.black87, fontSize: 12), -// ), -// style: TextButton.styleFrom( -// backgroundColor: ColorConsts.gradientOrange, -// primary: ColorConsts.primaryBlue, -// padding: EdgeInsets.only(top: 4, bottom: 4, right: 8, left: 8), -// textStyle: TextStyle(color: Colors.white, fontSize: 12), -// ), -// ), -// ), -// if (showAyaPlayer) -// AyaPlayerWidget( -// surahName: _ayatTangheemTypeMappedFirstData?.surahNameAr ?? "", -// ayaTangheemTypeId: _ayatTangheemTypeMappedFirstData?.ayaTangheemTypeId ?? "", -// ayaNo: _ayatTangheemTypeMappedFirstData?.ayahNo, -// surahNo: _ayatTangheemTypeMappedFirstData?.surahNo, -// globalKey: _globalKey, -// voiceNoteList: voiceNoteList), -// ], -// ) -// ], -// ), -// ); -// } -// -// Widget nextOptionButton(String icon, String text, VoidCallback onPressed) { -// return InkWell( -// onTap: onPressed, -// child: onPressed == null -// ? SizedBox() -// : Row( -// crossAxisAlignment: CrossAxisAlignment.center, -// mainAxisSize: MainAxisSize.min, -// children: [ -// SvgPicture.asset(icon, height: 12, width: 12), -// SizedBox(width: 4), -// Text( -// text, -// style: TextStyle(color: ColorConsts.textGrey), -// ), -// ], -// ), -// ); -// } -// -// Widget previousOptionButton(String icon, String text, VoidCallback onPressed) { -// return InkWell( -// onTap: onPressed, -// child: onPressed == null -// ? SizedBox() -// : Row( -// crossAxisAlignment: CrossAxisAlignment.center, -// mainAxisSize: MainAxisSize.min, -// children: [ -// Text( -// text, -// style: TextStyle(color: ColorConsts.textGrey), -// ), -// SizedBox(width: 4), -// SvgPicture.asset(icon, height: 12, width: 12), -// ], -// ), -// ); -// } -// -// Widget tangheemOutSideTablePropertyView(List tangheemPropertyList) { -// return ListView.separated( -// itemCount: tangheemPropertyList.length, -// physics: NeverScrollableScrollPhysics(), -// shrinkWrap: true, -// separatorBuilder: (context, index) { -// return Divider( -// color: Colors.white, -// height: 4, -// thickness: 0, -// ); -// }, -// itemBuilder: (context, index) { -// return Row( -// children: [ -// Expanded( -// child: Container( -// height: 40, -// padding: EdgeInsets.only(left: 4, right: 8), -// alignment: Alignment.centerRight, -// child: Text( -// tangheemPropertyList[index].propertyText, -// maxLines: 1, -// style: TextStyle(fontWeight: FontWeight.bold, color: ColorConsts.secondaryOrange), -// ), -// color: ColorConsts.secondaryWhite, -// ), -// ), -// SizedBox(width: 4), -// Expanded( -// child: Container( -// color: ColorConsts.secondaryWhite, -// padding: EdgeInsets.all(4), -// child: Container( -// color: Colors.white, -// padding: EdgeInsets.only(left: 4, right: 8), -// // alignment: Alignment.centerRight, -// child: Html( -// data: tangheemPropertyList[index]?.propertyValue ?? "", -// style: { -// 'html': Style(textAlign: TextAlign.left), -// }, -// ), -// // Text( -// // tangheemPropertyList[index].propertyValue, -// // maxLines: 1, -// // style: TextStyle( -// // color: Color( -// // Utils.stringToHex(tangheemPropertyList[index].textColor), -// // ), -// // ), -// // ), -// ), -// ), -// ) -// ], -// ); -// }); -// } -// -// Widget tangheemInsideTablePropertyView(List tangheemPropertyList) { -// return Container( -// color: Colors.white, -// padding: EdgeInsets.all(2), -// child: Row( -// children: [ -// for (var property in tangheemPropertyList) -// Expanded( -// child: Container( -// // color: ColorConsts.secondaryWhite, -// // padding: EdgeInsets.all(8), -// margin: EdgeInsets.only(left: 2, right: 2), -// child: Column( -// mainAxisSize: MainAxisSize.min, -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// Container( -// color: ColorConsts.secondaryWhite, -// //height: 30, -// alignment: Alignment.center, -// padding: EdgeInsets.only(left: 2, right: 4), -// width: double.infinity, -// child: Text( -// property.propertyText ?? "", -// // maxLines: 1, -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12, color: ColorConsts.secondaryOrange), -// ), -// ), -// Container(width: double.infinity, height: 4, color: Colors.white), -// Container( -// color: ColorConsts.secondaryWhite, -// padding: EdgeInsets.all(4), -// child: Container( -// color: Colors.white, -// padding: EdgeInsets.only(left: 2, right: 4), -// width: double.infinity, -// child: Html( -// data: property.propertyValue ?? "", -// style: { -// 'html': Style(textAlign: TextAlign.left), -// }, -// ), -// -// // Text( -// // property.propertyValue ?? "", -// // maxLines: 1, -// // style: TextStyle( -// // fontSize: 12, -// // color: Color( -// // Utils.stringToHex(property.textColor), -// // ), -// // ), -// // ), -// ), -// ), -// ], -// ), -// ), -// ) -// ], -// ) -// -// //@todo sikander :commented these line for later discussion -// // ListView.separated( -// // itemCount: tangheemPropertyList.length, -// // physics: NeverScrollableScrollPhysics(), -// // padding: EdgeInsets.zero, -// // shrinkWrap: true, -// // separatorBuilder: (context, index) { -// // return Divider( -// // color: Colors.white, -// // height: 1, -// // thickness: 0, -// // ); -// // }, -// // itemBuilder: (context, index) { -// // return Container( -// // color: ColorConsts.secondaryWhite, -// // padding: EdgeInsets.all(8), -// // child: Column( -// // mainAxisSize: MainAxisSize.min, -// // crossAxisAlignment: CrossAxisAlignment.start, -// // mainAxisAlignment: MainAxisAlignment.center, -// // children: [ -// // Text( -// // tangheemPropertyList[index].propertyText ?? "", -// // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 12, color: ColorConsts.secondaryOrange), -// // ), -// // SizedBox(height: 4), -// // Text( -// // tangheemPropertyList[index].propertyValue ?? "", -// // style: TextStyle( -// // fontSize: 12, -// // color: Color( -// // Utils.stringToHex(tangheemPropertyList[index].textColor), -// // ), -// // ), -// // ), -// // ], -// // ), -// // ); -// // }, -// // ), -// ); -// } -// -// Widget discussionView(List _discussionList) { -// _discussionList = _discussionList.where((element) => element.status.toLowerCase() == "Accept".toLowerCase()).toList(); -// return Stack( -// alignment: Alignment.bottomCenter, -// children: [ -// Container( -// margin: EdgeInsets.only(top: 4, bottom: 25), -// padding: EdgeInsets.all(8), -// width: double.infinity, -// decoration: BoxDecoration( -// color: Colors.white, -// borderRadius: BorderRadius.circular(8), -// ), -// child: _discussionList.length > 0 -// ? ListView.separated( -// padding: EdgeInsets.only(top: 4, bottom: 24), -// shrinkWrap: true, -// physics: NeverScrollableScrollPhysics(), -// itemCount: _discussionList.length, -// separatorBuilder: (context, index) => SizedBox(height: 16), -// itemBuilder: (context, index) { -// return Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisSize: MainAxisSize.min, -// children: [ -// Row( -// children: [ -// SvgPicture.asset( -// "assets/icons/chat_user.svg", -// width: 60, -// height: 60, -// ), -// SizedBox(width: 8), -// Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// mainAxisAlignment: MainAxisAlignment.center, -// children: [ -// Text( -// "تعليق على الآية ${_ayatTangheemTypeMappedFirstData.ayatNumberInSurahs}", -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// SizedBox(height: 4), -// Directionality( -// textDirection: TextDirection.ltr, -// child: Text( -// _discussionList[index].date.toFormattedDate(), -// style: TextStyle(fontSize: 12, color: ColorConsts.textGrey, height: 1), -// ), -// ), -// ], -// ) -// ], -// ), -// SizedBox(height: 4), -// Column( -// crossAxisAlignment: CrossAxisAlignment.start, -// children: [ -// Text( -// "تعليق من: " + _discussionList[index].userName, -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// Text( -// _discussionList[index].discussionText, -// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1.4), -// ), -// if ((_discussionList[index]?.adminResponse ?? "").isNotEmpty) SizedBox(height: 4), -// if ((_discussionList[index]?.adminResponse ?? "").isNotEmpty) -// Text( -// "رد من المسؤول: " + _discussionList[index].adminResponse, -// style: TextStyle(fontSize: 14, color: ColorConsts.textGrey, height: 1.4), -// ), -// ], -// ) -// ], -// ); -// }, -// ) -// : Text( -// "لا يوجد تعليقات", -// style: TextStyle(fontSize: 12, color: ColorConsts.primaryBlue, height: 1.5), -// ), -// ), -// Positioned( -// bottom: 0, -// child: InkWell( -// borderRadius: BorderRadius.circular(30), -// onTap: () async { -// if (!AppState().isUserLogin) { -// Widget cancelButton = FlatButton( -// child: Text("أرغب بالتسجيل"), -// onPressed: () async { -// Navigator.pop(context); -// await Navigator.pushNamed(context, LoginScreen.routeName); -// if (!AppState().isUserLogin) { -// return; -// } -// }, -// ); -// Widget continueButton = FlatButton( -// child: Text("استمرار كضيف"), -// onPressed: () { -// Navigator.pop(context); -// return; -// }, -// ); -// -// AlertDialog alert = AlertDialog( -// content: Text("هذه الخاصية متاحه فقط للأعضاء المسجلين"), -// actions: [ -// cancelButton, -// continueButton, -// ], -// ); -// -// showDialog( -// context: context, -// builder: (BuildContext context) { -// return alert; -// }, -// ); -// -// return; -// } -// showDialog( -// context: context, -// barrierColor: ColorConsts.secondaryWhite.withOpacity(0.8), -// builder: (BuildContext context) => DiscussionInputDialog(onCommentPress: (comment) { -// sendComment(comment); -// }), -// ); -// }, -// child: Container( -// height: 40, -// padding: EdgeInsets.only(left: 24, right: 24), -// alignment: Alignment.centerRight, -// decoration: BoxDecoration( -// borderRadius: BorderRadius.circular(30), -// color: ColorConsts.gradientPink, -// gradient: LinearGradient( -// stops: [0.0, 0.5], -// begin: Alignment.topCenter, -// end: Alignment.bottomCenter, -// colors: [ColorConsts.gradientPink, ColorConsts.gradientOrange], -// ), -// ), -// child: Text( -// "إضافة تعليق", -// style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: Colors.white, height: 1.5), -// ), -// ), -// ), -// ), -// ], -// ); -// } -// } diff --git a/lib/widgets/button/default_button.dart b/lib/widgets/button/default_button.dart index 77d1c61..d572d0c 100644 --- a/lib/widgets/button/default_button.dart +++ b/lib/widgets/button/default_button.dart @@ -3,10 +3,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; extension WithContainer on Widget { - Widget get insideContainer => Container( - color: Colors.white, - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), - child: this); + Widget get insideContainer => Container(color: Colors.white, padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this); } class DefaultButton extends StatelessWidget { @@ -23,15 +20,7 @@ class DefaultButton extends StatelessWidget { final List? colors; DefaultButton(this.text, this.onPress, - {this.color, - this.isTextExpanded = true, - this.svgIcon, - this.disabledColor, - this.count = 0, - this.textColor = Colors.white, - this.iconData, - this.fontSize, - this.colors}); + {this.color, this.isTextExpanded = true, this.svgIcon, this.disabledColor, this.count = 0, this.textColor = Colors.white, this.iconData, this.fontSize, this.colors}); @override Widget build(BuildContext context) { @@ -42,8 +31,7 @@ class DefaultButton extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.0), gradient: onPress == null - ? const LinearGradient( - colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) + ? const LinearGradient(colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) : LinearGradient( transform: GradientRotation(.83), begin: Alignment.topRight, @@ -58,20 +46,14 @@ class DefaultButton extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ if (iconData != null) Icon(iconData, color: textColor), - if (svgIcon != null) - SvgPicture.asset(svgIcon ?? "", color: textColor), + if (svgIcon != null) SvgPicture.asset(svgIcon ?? "", color: textColor), if (!isTextExpanded) Padding( - padding: EdgeInsets.only( - left: (iconData ?? svgIcon) != null ? 6 : 0), + padding: EdgeInsets.only(left: (iconData ?? svgIcon) != null ? 6 : 0), child: Text( text, textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize ?? 16, - fontWeight: FontWeight.w600, - color: textColor, - letterSpacing: -0.48), + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), ), ), if (isTextExpanded) @@ -79,11 +61,7 @@ class DefaultButton extends StatelessWidget { child: Text( text, textAlign: TextAlign.center, - style: TextStyle( - fontSize: fontSize ?? 16, - fontWeight: FontWeight.w600, - color: textColor, - letterSpacing: -0.48), + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), ), ), if (count > 0) @@ -94,17 +72,11 @@ class DefaultButton extends StatelessWidget { padding: const EdgeInsets.only(left: 5, right: 5), alignment: Alignment.center, height: 16, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10.0), - color: Colors.white), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(10.0), color: Colors.white), child: Text( "$count", textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 12, - fontWeight: FontWeight.w700, - color: Color(0xffD02127), - letterSpacing: -0.6), + style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w700, color: Color(0xffD02127), letterSpacing: -0.6), ), ), ) diff --git a/lib/widgets/button/simple_button.dart b/lib/widgets/button/simple_button.dart new file mode 100644 index 0000000..eecce21 --- /dev/null +++ b/lib/widgets/button/simple_button.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; + +class SimpleButton extends StatelessWidget { + final String text; + final VoidCallback? onPress; + final Color textColor; + final Color? color; + final double? fontSize; + final List? colors; + + SimpleButton(this.text, this.onPress, {this.color, this.textColor = Colors.white, this.fontSize, this.colors}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onPress, + child: Container( + alignment: Alignment.center, + padding: const EdgeInsets.only(left: 12, right: 12, top: 4, bottom: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.0), + gradient: onPress == null + ? const LinearGradient(colors: [Color(0xffEAEAEA), Color(0xffEAEAEA)]) + : LinearGradient( + transform: const GradientRotation(.83), + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: colors ?? + [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: Text( + text, + style: TextStyle(fontSize: fontSize ?? 16, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48), + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index d38cc5a..a28ba95 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,7 @@ dependencies: flutter_countdown_timer: ^4.1.0 nfc_manager: ^3.1.1 uuid: ^3.0.6 + file_picker: ^4.6.1 # maps google_maps_flutter: ^2.0.2 From 3e6fdd2cb591f8c16b60e477b1fca4133f587145 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 13 Jun 2022 10:56:22 +0300 Subject: [PATCH 03/22] missing swipe added. --- assets/langs/ar-SA.json | 5 ++ assets/langs/en-US.json | 5 ++ lib/api/my_attendance_api_client.dart | 35 +++++++++- lib/generated/codegen_loader.g.dart | 18 +++++ lib/generated/locale_keys.g.dart | 13 ++-- lib/models/add_att_success_list_model.dart | 18 +++++ lib/models/add_attachment_list_model.dart | 18 +++++ lib/models/attachment_model.dart | 27 ++++++++ lib/models/generic_response_model.dart | 36 +++++++--- .../start_eit_approval_process_model.dart | 18 +++++ lib/ui/misc/request_submit_screen.dart | 65 +++++++++++++++++-- .../dynamic_screens/dynamic_input_screen.dart | 25 +++---- .../my_attendance/my_attendance_screen.dart | 2 +- 13 files changed, 251 insertions(+), 34 deletions(-) create mode 100644 lib/models/add_att_success_list_model.dart create mode 100644 lib/models/add_attachment_list_model.dart create mode 100644 lib/models/attachment_model.dart create mode 100644 lib/models/start_eit_approval_process_model.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 27f1ab0..84e20d9 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -211,6 +211,11 @@ "workOnBreak": "العمل على استراحة", "next": "التالي", "submit": "ارسال", + "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟", + "comments": "تعليقات", + "writeComment": "أكتب تعليقا", + "approversList": "قائمة الموافقين", + "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", "profile": { "reset_password": { "label": "Reset Password", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 498d3e1..f12f294 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -211,6 +211,11 @@ "workOnBreak": "Work On Break", "next": "Next", "submit": "Submit", + "areYouSureYouWantToSubmit": "Are you sure you want to submit?", + "comments": "Comments", + "writeComment": "Write a comment", + "approversList": "Approvers List", + "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index 44b91da..60247dc 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -6,6 +6,7 @@ import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; +import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'api_client.dart'; @@ -98,10 +99,13 @@ class MyAttendanceApiClient { "P_MENU_TYPE": "E", "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_FUNCTION_NAME": pFunctionName, - "EITTransactionTBL": list, - "EITTransactionTBLModel": list, + //"EITTransactionTBL": list, + // "EITTransactionTBLModel": list, }; postParams.addAll(AppState().postParamsJson); + print("postParams:$postParams"); + postParams["EITTransactionTBL"] = list; + postParams["EITTransactionTBLModel"] = list; return await ApiClient().postJsonForObject((json) { GenericResponseModel responseData = GenericResponseModel.fromJson(json); return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); @@ -122,4 +126,31 @@ class MyAttendanceApiClient { return responseData.getApprovesList ?? []; }, url, postParams); } + + Future> addAttachment(List> list) async { + String url = "${ApiConsts.erpRest}ADD_ATTACHMENT"; + Map postParams = {"AddAttachmentList": list}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getApprovesList ?? []; + }, url, postParams); + } + + Future startEitApprovalProcess(String action, String comments, String itemKey, int transactionId) async { + String url = "${ApiConsts.erpRest}START_EIT_APPROVAL_PROCESS"; + Map postParams = { + "P_SELECTED_RESP_ID": -999, + "P_MENU_TYPE": "E", + "P_ACTION_MODE": action, + "P_COMMENTS": comments, + "P_ITEM_KEY": itemKey, + "P_TRANSACTION_ID": transactionId, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.startEitApprovalProcess; + }, url, postParams); + } } diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 7afe58a..ca6b210 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -223,6 +223,15 @@ class CodegenLoader extends AssetLoader{ "requestDetails": "طلب تفاصيل", "approvalLevel": "مستوى الموافقة", "requesterDetails": "تفاصيل مقدم الطلب", + "myAttendance": "حضوري", + "workOnBreak": "العمل على استراحة", + "next": "التالي", + "submit": "ارسال", + "areYouSureYouWantToSubmit": "هل أنت متأكد أنك تريد أن تقدم؟", + "comments": "تعليقات", + "writeComment": "أكتب تعليقا", + "approversList": "قائمة الموافقين", + "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", "profile": { "reset_password": { "label": "Reset Password", @@ -465,6 +474,15 @@ static const Map en_US = { "requestDetails": "Request Details", "approvalLevel": "Approval Level", "requesterDetails": "Requester Details", + "myAttendance": "My Attendance", + "workOnBreak": "Work On Break", + "next": "Next", + "submit": "Submit", + "areYouSureYouWantToSubmit": "Are you sure you want to submit?", + "comments": "Comments", + "writeComment": "Write a comment", + "approversList": "Approvers List", + "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index bb7f085..e190f4d 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -208,6 +208,15 @@ abstract class LocaleKeys { static const requestDetails = 'requestDetails'; static const approvalLevel = 'approvalLevel'; static const requesterDetails = 'requesterDetails'; + static const myAttendance = 'myAttendance'; + static const workOnBreak = 'workOnBreak'; + static const next = 'next'; + static const submit = 'submit'; + static const areYouSureYouWantToSubmit = 'areYouSureYouWantToSubmit'; + static const comments = 'comments'; + static const writeComment = 'writeComment'; + static const approversList = 'approversList'; + static const yourRequestHasBeenSubmittedForApprovals = 'yourRequestHasBeenSubmittedForApprovals'; static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_password = 'profile.reset_password.password'; @@ -218,9 +227,5 @@ abstract class LocaleKeys { static const gender_with_arg = 'gender.with_arg'; static const gender = 'gender'; static const reset_locale = 'reset_locale'; - static const myAttendance = 'myAttendance'; - static const workOnBreak = 'workOnBreak'; - static const next = 'next'; - static const submit = 'submit'; } diff --git a/lib/models/add_att_success_list_model.dart b/lib/models/add_att_success_list_model.dart new file mode 100644 index 0000000..e33fff2 --- /dev/null +++ b/lib/models/add_att_success_list_model.dart @@ -0,0 +1,18 @@ +class AddAttSuccessList { + bool? addSuccess; + int? attachmentID; + + AddAttSuccessList({this.addSuccess, this.attachmentID}); + + AddAttSuccessList.fromJson(Map json) { + addSuccess = json['AddSuccess']; + attachmentID = json['AttachmentID']; + } + + Map toJson() { + final Map data = new Map(); + data['AddSuccess'] = this.addSuccess; + data['AttachmentID'] = this.attachmentID; + return data; + } +} \ No newline at end of file diff --git a/lib/models/add_attachment_list_model.dart b/lib/models/add_attachment_list_model.dart new file mode 100644 index 0000000..e34d80c --- /dev/null +++ b/lib/models/add_attachment_list_model.dart @@ -0,0 +1,18 @@ +class AddAttachmentList { + String? pRETURNMSG; + String? pRETURNSTATUS; + + AddAttachmentList({this.pRETURNMSG, this.pRETURNSTATUS}); + + AddAttachmentList.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/models/attachment_model.dart b/lib/models/attachment_model.dart new file mode 100644 index 0000000..eb51dcf --- /dev/null +++ b/lib/models/attachment_model.dart @@ -0,0 +1,27 @@ +class AttachmentModel { + int? attachmentID; + String? pFILECONTENTTYPE; + String? pFILEDATA; + String? pFILENAME; + int? pTRANSACTIONID; + + AttachmentModel({this.attachmentID, this.pFILECONTENTTYPE, this.pFILEDATA, this.pFILENAME, this.pTRANSACTIONID}); + + AttachmentModel.fromJson(Map json) { + attachmentID = json['AttachmentID']; + pFILECONTENTTYPE = json['P_FILE_CONTENT_TYPE']; + pFILEDATA = json['P_FILE_DATA']; + pFILENAME = json['P_FILE_NAME']; + pTRANSACTIONID = json['P_TRANSACTION_ID']; + } + + Map toJson() { + final Map data = new Map(); + data['AttachmentID'] = this.attachmentID; + data['P_FILE_CONTENT_TYPE'] = this.pFILECONTENTTYPE; + data['P_FILE_DATA'] = this.pFILEDATA; + data['P_FILE_NAME'] = this.pFILENAME; + data['P_TRANSACTION_ID'] = this.pTRANSACTIONID; + return data; + } +} diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index de0404d..2e510a8 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1,3 +1,5 @@ +import 'package:mohem_flutter_app/models/add_att_success_list_model.dart'; +import 'package:mohem_flutter_app/models/add_attachment_list_model.dart'; import 'package:mohem_flutter_app/models/get_absence_collection_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; @@ -18,6 +20,7 @@ import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_mod import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart'; @@ -61,8 +64,8 @@ class GenericResponseModel { String? successMsg; String? successMsgN; String? vidaUpdatedResponse; - String? addAttSuccessList; - String? addAttachmentList; + List? addAttSuccessList; + AddAttachmentList? addAttachmentList; String? bCDomain; String? bCLogo; BasicMemberInformationModel? basicMemberInformation; @@ -246,7 +249,7 @@ class GenericResponseModel { String? startBasicDetApprProcessList; String? startCeiApprovalProcess; String? startContactApprovalProcessList; - String? startEitApprovalProcess; + StartEitApprovalProcess? startEitApprovalProcess; String? startHrApprovalProcessList; String? startPhonesApprovalProcessList; String? startSitApprovalProcess; @@ -567,8 +570,13 @@ class GenericResponseModel { successMsg = json['SuccessMsg']; successMsgN = json['SuccessMsgN']; vidaUpdatedResponse = json['VidaUpdatedResponse']; - addAttSuccessList = json['AddAttSuccessList']; - addAttachmentList = json['AddAttachment_List']; + if (json['AddAttSuccessList'] != null) { + addAttSuccessList = []; + json['AddAttSuccessList'].forEach((v) { + addAttSuccessList!.add(new AddAttSuccessList.fromJson(v)); + }); + } + addAttachmentList = json['AddAttachment_List'] != null ? new AddAttachmentList.fromJson(json['AddAttachment_List']) : null; bCDomain = json['BC_Domain']; bCLogo = json['BC_Logo']; basicMemberInformation = json['BasicMemberInformation'] != null ? new BasicMemberInformationModel.fromJson(json['BasicMemberInformation']) : null; @@ -886,7 +894,8 @@ class GenericResponseModel { startBasicDetApprProcessList = json['StartBasicDetApprProcessList']; startCeiApprovalProcess = json['StartCeiApprovalProcess']; startContactApprovalProcessList = json['StartContactApprovalProcessList']; - startEitApprovalProcess = json['StartEitApprovalProcess']; + + startEitApprovalProcess = json['StartEitApprovalProcess'] != null ? new StartEitApprovalProcess.fromJson(json['StartEitApprovalProcess']) : null; startHrApprovalProcessList = json['StartHrApprovalProcessList']; startPhonesApprovalProcessList = json['StartPhonesApprovalProcessList']; startSitApprovalProcess = json['StartSitApprovalProcess']; @@ -966,8 +975,14 @@ class GenericResponseModel { data['SuccessMsg'] = this.successMsg; data['SuccessMsgN'] = this.successMsgN; data['VidaUpdatedResponse'] = this.vidaUpdatedResponse; - data['AddAttSuccessList'] = this.addAttSuccessList; - data['AddAttachment_List'] = this.addAttachmentList; + + if (this.addAttSuccessList != null) { + data['AddAttSuccessList'] = this.addAttSuccessList!.map((v) => v.toJson()).toList(); + } + if (this.addAttachmentList != null) { + data['AddAttachment_List'] = this.addAttachmentList!.toJson(); + } + data['BC_Domain'] = this.bCDomain; data['BC_Logo'] = this.bCLogo; if (this.basicMemberInformation != null) { @@ -1231,7 +1246,10 @@ class GenericResponseModel { data['StartBasicDetApprProcessList'] = this.startBasicDetApprProcessList; data['StartCeiApprovalProcess'] = this.startCeiApprovalProcess; data['StartContactApprovalProcessList'] = this.startContactApprovalProcessList; - data['StartEitApprovalProcess'] = this.startEitApprovalProcess; + + if (this.startEitApprovalProcess != null) { + data['StartEitApprovalProcess'] = this.startEitApprovalProcess!.toJson(); + } data['StartHrApprovalProcessList'] = this.startHrApprovalProcessList; data['StartPhonesApprovalProcessList'] = this.startPhonesApprovalProcessList; data['StartSitApprovalProcess'] = this.startSitApprovalProcess; diff --git a/lib/models/start_eit_approval_process_model.dart b/lib/models/start_eit_approval_process_model.dart new file mode 100644 index 0000000..f49043b --- /dev/null +++ b/lib/models/start_eit_approval_process_model.dart @@ -0,0 +1,18 @@ +class StartEitApprovalProcess { + String? pRETURNMSG; + String? pRETURNSTATUS; + + StartEitApprovalProcess({this.pRETURNMSG, this.pRETURNSTATUS}); + + StartEitApprovalProcess.fromJson(Map json) { + pRETURNMSG = json['P_RETURN_MSG']; + pRETURNSTATUS = json['P_RETURN_STATUS']; + } + + Map toJson() { + final Map data = new Map(); + data['P_RETURN_MSG'] = this.pRETURNMSG; + data['P_RETURN_STATUS'] = this.pRETURNSTATUS; + return data; + } +} \ No newline at end of file diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart index c57ce6b..196ee01 100644 --- a/lib/ui/misc/request_submit_screen.dart +++ b/lib/ui/misc/request_submit_screen.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; @@ -6,22 +7,26 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/attachment_model.dart'; import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/simple_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; class RequestSubmitScreenParams { String title; int transactionId; + String pItemId; - RequestSubmitScreenParams(this.title, this.transactionId); + RequestSubmitScreenParams(this.title, this.transactionId, this.pItemId); } class RequestSubmitScreen extends StatefulWidget { @@ -35,6 +40,7 @@ class RequestSubmitScreen extends StatefulWidget { class _RequestSubmitScreenState extends State { RequestSubmitScreenParams? params; + TextEditingController comments = TextEditingController(); List approverList = []; List attachmentFiles = []; @@ -57,6 +63,44 @@ class _RequestSubmitScreenState extends State { } } + void submitRequest() async { + try { + Utils.showLoading(context); + List> list = []; + if (attachmentFiles.isNotEmpty) { + attachmentFiles.asMap().forEach((index, value) async { + String type = value.path.split('.').last; + String name = value.path.split('/').last; + List fileContent = await value.readAsBytes(); + String encodedFile = base64Encode(fileContent); + list.add(AttachmentModel( + attachmentID: index, + pFILECONTENTTYPE: type, + pFILENAME: name, + pFILEDATA: encodedFile, + pTRANSACTIONID: params!.transactionId, + ).toJson()); + }); + } + await MyAttendanceApiClient().addAttachment(list); + await MyAttendanceApiClient().startEitApprovalProcess( + "SUBMIT", + comments.text, + params!.pItemId, + params!.transactionId, + ); + Utils.hideLoading(context); + Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr()); + Navigator.of(context).popUntil((route) { + return route.settings.name == AppRoutes.dashboard; + }); + Navigator.pushNamed(context, AppRoutes.workList); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + @override void dispose() { super.dispose(); @@ -83,9 +127,9 @@ class _RequestSubmitScreenState extends State { attachmentView("Attachments"), 14.height, InputWidget( - "Comments", - "Write a comment", - TextEditingController(), + LocaleKeys.comments.tr(), + LocaleKeys.writeComment.tr(), + comments, isBackgroundEnable: true, lines: 3, onChange: (String note) { @@ -93,7 +137,7 @@ class _RequestSubmitScreenState extends State { }, ), //.objectContainerView(title: "Comments"), 14.height, - "Approvers List".toSectionHeading(), + LocaleKeys.approversList.tr().toSectionHeading(), 14.height, ListView.separated( shrinkWrap: true, @@ -109,7 +153,16 @@ class _RequestSubmitScreenState extends State { DefaultButton( LocaleKeys.submit.tr(), () { - //Navigator.of(context).pushNamed(LOGIN_TYPE) + showDialog( + context: context, + builder: (cxt) => ConfirmDialog( + message: LocaleKeys.areYouSureYouWantToSubmit.tr(), + onTap: () { + Navigator.pop(context); + submitRequest(); + }, + ), + ); }, ).insideContainer, ], 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 bdbc1d6..f855c67 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -67,30 +67,32 @@ class _DynamicInputScreenState extends State { tempVar = DateFormat('yyyy/MM/dd HH:mm:ss').format(date); } } - return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: tempVar).toJson(); + return ValidateEitTransactionModel(dATEVALUE: null, nAME: e.aPPLICATIONCOLUMNNAME, nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: tempVar.toString()).toJson(); }).toList(); + + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: "NEW_ROW").toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); + values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 1, vARCHAR2VALUE: null).toJson()); values.forEach((element) { print(element); }); - - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_ACTION", nUMBERVALUE: null, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: "NEW_ROW").toJson()); - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_EXTRA_INFO_ID", nUMBERVALUE: -1, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: null).toJson()); - values.add(ValidateEitTransactionModel(dATEVALUE: null, nAME: "PEI_OBJECT_VERSION_NUMBER", nUMBERVALUE: 0, tRANSACTIONNUMBER: 2, vARCHAR2VALUE: null).toJson()); - - genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(genericResponseModel!.pDESCFLEXCONTEXTCODE!, dynamicParams!.dynamicId, values); - SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(genericResponseModel!.pDESCFLEXCONTEXTCODE!, dynamicParams!.dynamicId, values); + genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); + SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", submitEITTransactionList.pTRANSACTIONID!)); + Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!)); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } + String dESCFLEXCONTEXTCODE = ""; + void calGetValueSetValues(GetEITDFFStructureList structureList) async { try { Utils.showLoading(context); String segmentId = structureList.cHILDSEGMENTSVS!; + dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; List filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; List> values = filteredList @@ -269,9 +271,8 @@ class _DynamicInputScreenState extends State { //DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); } TimeOfDay _time = await _selectTime(context); - // TimeOfDay.fromDateTime(time) - - String time = DateFormat('HH:mm').format(DateFormat("hh:mm a").parse(_time.format(context))).trim(); + DateTime tempTime = DateTime(0, 1, 1, _time.hour, _time.minute); + String time = DateFormat('HH:mm').format(tempTime).trim(); // DateTime date1 = DateTime(date.year, date.month, date.day); // getEitDffStructureList![index].fieldAnswer = date.toString(); diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index e00a5c6..8e6ab0c 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -45,7 +45,7 @@ class MyAttendanceScreen extends StatelessWidget { "assets/images/pdf.svg", LocaleKeys.workOnBreak.tr(), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", 8724807)); + // Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", 8724807)); }), ], ).paddingAll(21)), From d2a6ed8de7797d863fe90ab4393181b551f64351 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Thu, 16 Jun 2022 10:45:12 +0300 Subject: [PATCH 04/22] fix monthly attendance --- assets/langs/ar-SA.json | 10 +- assets/langs/en-US.json | 9 +- lib/api/monthlyAttendance_api_client.dart | 3 +- lib/generated/codegen_loader.g.dart | 19 +- lib/main.dart | 19 +- ...get_day_hours_type_details_list_model.dart | 18 +- .../get_time_card_summary_list_model.dart | 46 +- lib/ui/attendance/monthly_attendance.dart | 449 +++++++++--------- .../my_attendance/my_attendance_screen.dart | 7 + lib/ui/profile/basic_details.dart | 6 +- lib/ui/profile/contact_details.dart | 153 +++--- lib/ui/profile/family_members.dart | 260 +++++----- lib/ui/profile/personal_info.dart | 2 +- pubspec.yaml | 3 + 14 files changed, 513 insertions(+), 491 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 9efc35d..7a65f43 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -24,7 +24,7 @@ "checkIn": "تحقق في", "workList": "قائمة العمل", "leaveBalance": "رصيد الاجازات", - "missingSwipes": "الضربات الشديدة في عداد المفقودين", + "missingSwipes": "تسجيل بصمة حضور", "ticketBalance": "رصيد التذكرة", "other": "آخر", "services": "خدمات", @@ -56,10 +56,10 @@ "order": "الطلبات", "earlyOut": "الخروج مبكرا", "shortage": "ساعات التقصير", - "excess": "Excess", + "excess": "فائض", "lateIn": "القدوم المتاخر", - "approvedCheckOut": "وقت الخروج", - "approvedCheckIn": "وقت الدخول", + "approvedCheckOut": "اعتماد وقت الخروج", + "approvedCheckIn": "اعتماد وقت الدخول", "actualCheckOut": "وقت الخروج", "actualCheckIn": "وقت الدخول", "present": "حضور", @@ -229,7 +229,7 @@ "approvalLevel": "مستوى الموافقة", "requesterDetails": "تفاصيل مقدم الطلب", "myAttendance": "حضوري", - "workOnBreak": "العمل على استراحة", + "workOnBreak": "التعويض عن العمل اثناءالاستراحه", "next": "التالي", "completingYear": "نحن نقدر لك لاستكمال خدمة", "year": "سنة", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index dd2d2a4..07e8546 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -62,10 +62,10 @@ "approvedCheckIn": "Approved Check In", "actualCheckOut": "Actual Check Out", "actualCheckIn": "Actual Check In", - "present": "PRESENT 11", + "present": "PRESENT", "pres": "present", "shiftTime": "Shift Time", - "absent": "ABSENT 10", + "absent": "ABSENT", "attendance": "Attendance", "scheduleDays": "Schedule\nDays", "offDays": "Off\nDays", @@ -244,8 +244,9 @@ "dateOfBirth" : "Date of Birth", "maritalStatus ": "Marital Status ", "fullName": "Full Name", - "remove": "remove", - "update": "update", + "remove": "Remove", + "update": "Update", + "Attendance":"Attendance", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/api/monthlyAttendance_api_client.dart b/lib/api/monthlyAttendance_api_client.dart index 4f6aca7..bcbf69f 100644 --- a/lib/api/monthlyAttendance_api_client.dart +++ b/lib/api/monthlyAttendance_api_client.dart @@ -26,9 +26,11 @@ class MonthlyAttendanceApiClient { "SearchMonth": month, "SearchYear": year, }; + postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + print(responseData); return (responseData.getTimeCardSummaryList?.length ?? 0) > 0 ? responseData.getTimeCardSummaryList!.first : null; }, url, postParams); } @@ -48,7 +50,6 @@ class MonthlyAttendanceApiClient { // postParams["DeviceType"] = deviceType; return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); - print("Response Data______"); print(responseData.getDayHoursTypeDetailsList!.length); return responseData.getDayHoursTypeDetailsList ?? []; }, url, postParams); diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 5e6c80e..2baa9d2 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -40,7 +40,7 @@ class CodegenLoader extends AssetLoader{ "checkIn": "تحقق في", "workList": "قائمة العمل", "leaveBalance": "رصيد الاجازات", - "missingSwipes": "الضربات الشديدة في عداد المفقودين", + "missingSwipes": "تسجيل بصمة حضور", "ticketBalance": "رصيد التذكرة", "other": "آخر", "services": "خدمات", @@ -72,10 +72,10 @@ class CodegenLoader extends AssetLoader{ "order": "الطلبات", "earlyOut": "الخروج مبكرا", "shortage": "ساعات التقصير", - "excess": "Excess", + "excess": "فائض", "lateIn": "القدوم المتاخر", - "approvedCheckOut": "وقت الخروج", - "approvedCheckIn": "وقت الدخول", + "approvedCheckOut": "اعتماد وقت الخروج", + "approvedCheckIn": "اعتماد وقت الدخول", "actualCheckOut": "وقت الخروج", "actualCheckIn": "وقت الدخول", "present": "حضور", @@ -245,7 +245,7 @@ class CodegenLoader extends AssetLoader{ "approvalLevel": "مستوى الموافقة", "requesterDetails": "تفاصيل مقدم الطلب", "myAttendance": "حضوري", - "workOnBreak": "العمل على استراحة", + "workOnBreak": "التعويض عن العمل اثناءالاستراحه", "next": "التالي", "completingYear": "نحن نقدر لك لاستكمال خدمة", "year": "سنة", @@ -340,7 +340,7 @@ static const Map en_US = { "setTheNewPassword": "Set the new password", "typeYourNewPasswordBelow": "Type your new password below", "confirmPassword": "Confirm Password", - "update": "update", + "update": "Update", "title": "Title", "home": "Home", "mySalary": "My Salary", @@ -363,10 +363,10 @@ static const Map en_US = { "approvedCheckIn": "Approved Check In", "actualCheckOut": "Actual Check Out", "actualCheckIn": "Actual Check In", - "present": "PRESENT 11", + "present": "PRESENT", "pres": "present", "shiftTime": "Shift Time", - "absent": "ABSENT 10", + "absent": "ABSENT", "attendance": "Attendance", "scheduleDays": "Schedule\nDays", "offDays": "Off\nDays", @@ -544,7 +544,8 @@ static const Map en_US = { "dateOfBirth": "Date of Birth", "maritalStatus ": "Marital Status ", "fullName": "Full Name", - "remove": "remove", + "remove": "Remove", + "Attendance": "Attendance", "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/main.dart b/lib/main.dart index 9952762..50f7daf 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,6 +11,7 @@ import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; +import 'package:month_year_picker/month_year_picker.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:nfc_manager/platform_tags.dart'; import 'package:provider/provider.dart'; @@ -30,7 +31,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); AppState().setPostParamsModel( - PostParamsModel(channel: 31, versionID: 3.4, mobileType: Platform.isAndroid ? "android" : "ios"), + PostParamsModel(channel: 31, versionID: 4.0, mobileType: Platform.isAndroid ? "android" : "ios"), ); runApp( EasyLocalization( @@ -68,12 +69,22 @@ class MyApp extends StatelessWidget { builder: (context, orientation, deviceType) { print(AppState().postParamsObject?.toJson()); var obj = AppState().postParamsObject; - obj?.languageID = EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2; + obj?.languageID = EasyLocalization + .of(context) + ?.locale + .languageCode == "ar" ? 1 : 2; AppState().setPostParamsModel(obj!); + List delegates = context.localizationDelegates; + // delegates.add(GlobalMaterialLocalizations.delegate); + delegates.add(MonthYearPickerLocalizations.delegate,); return MaterialApp( - theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), + theme: AppTheme.getTheme(EasyLocalization + .of(context) + ?.locale + .languageCode == "ar"), debugShowCheckedModeBanner: false, - localizationsDelegates: context.localizationDelegates, + localizationsDelegates + :delegates, supportedLocales: context.supportedLocales, locale: context.locale, initialRoute: AppRoutes.initialRoute, diff --git a/lib/models/get_day_hours_type_details_list_model.dart b/lib/models/get_day_hours_type_details_list_model.dart index 5d0a0ab..daaac74 100644 --- a/lib/models/get_day_hours_type_details_list_model.dart +++ b/lib/models/get_day_hours_type_details_list_model.dart @@ -1,14 +1,14 @@ class GetDayHoursTypeDetailsList { - Null? aBSENCEATTENDANCEID; - Null? aBSENCEATTENDANCETYPEID; + dynamic? aBSENCEATTENDANCEID; + dynamic? aBSENCEATTENDANCETYPEID; String? aBSENTFLAG; String? aCTUALHRS; String? aNALAYZEDFLAG; String? aPPROVEDTIMEBACKHRS; String? aPPRTIMEBACKFLAG; - int? aSSIGNMENTID; + dynamic? aSSIGNMENTID; String? aTTENDEDFLAG; - Null? cALENDARENTRYID; + dynamic? cALENDARENTRYID; String? cOMPOFFFLAG; String? cOMPOFFHRS; String? cOMPOFFHHRS; @@ -19,18 +19,18 @@ class GetDayHoursTypeDetailsList { String? eARLYOUTHRS; String? eXCESSFLAG; String? eXCESSHRS; - int? fROMROWNUM; + dynamic? fROMROWNUM; String? lATEINFLAG; String? lATEINHRS; String? mISSINGSWIPEFLAG; String? nONSCHEDULEDFLAG; - Null? nOOFROWS; + dynamic? nOOFROWS; String? oNCALLHRS; - Null? pERSONEXTRAINFOID; + dynamic? pERSONEXTRAINFOID; String? pLANNEDOTHRS; String? pLANNEDOTHRSFLAG; String? rEMARKS; - int? rOWNUM; + dynamic? rOWNUM; int? rTPID; String? sCHEDULEDHRS; String? sCHEDULEDONCALLHRS; @@ -40,7 +40,7 @@ class GetDayHoursTypeDetailsList { String? sHORTAGEHRS; String? tIMEBACKFLAG; String? tIMEBACKHRS; - int? tOROWNUM; + dynamic? tOROWNUM; GetDayHoursTypeDetailsList( {this.aBSENCEATTENDANCEID, diff --git a/lib/models/get_time_card_summary_list_model.dart b/lib/models/get_time_card_summary_list_model.dart index 6799bfa..727e29f 100644 --- a/lib/models/get_time_card_summary_list_model.dart +++ b/lib/models/get_time_card_summary_list_model.dart @@ -2,39 +2,39 @@ class GetTimeCardSummaryList { int? aBSENTDAYS; - int? aCTUALHRS; - int? aPPROVEDTIMEBACKHRS; + dynamic? aCTUALHRS; + dynamic? aPPROVEDTIMEBACKHRS; int? aSSIGNMENTID; int? aTTENDEDDAYS; int? bUSINESSTRIP; - int? cOMPOFFHHRS; - int? cOMPOFFNHRS; - int? cOMPOFFWHRS; - int? dESIREDSCHEDULEDHRS; - int? eARLYOUTHRS; - int? eXCESSHRS; + dynamic? cOMPOFFHHRS; + dynamic? cOMPOFFNHRS; + dynamic? cOMPOFFWHRS; + dynamic? dESIREDSCHEDULEDHRS; + dynamic? eARLYOUTHRS; + dynamic? eXCESSHRS; int? hALFDAYLEAVE; - int? lATEINHRS; - int? lEAVESHOLIDAYSHRS; - int? nONSCHEDULEDAYS; - int? nOTANALYZEDDAYS; + dynamic? lATEINHRS; + dynamic? lEAVESHOLIDAYSHRS; + dynamic? nONSCHEDULEDAYS; + dynamic? nOTANALYZEDDAYS; int? oFFDAYS; - int? oNCALLHRS; - int? pAIDLEAVE; + dynamic? oNCALLHRS; + dynamic? pAIDLEAVE; int? pERIODDAYS; - int? pLANNEDOTHRS; + dynamic? pLANNEDOTHRS; int? pUBLICHOLIDAY; - int? sCHEDULEDHRS; - int? sCHEDULEDONCALLHRS; - int? sCHEDULEDPLANNEDOTHRS; + dynamic? sCHEDULEDHRS; + dynamic? sCHEDULEDONCALLHRS; + dynamic? sCHEDULEDPLANNEDOTHRS; int? sCHEDULEDAYS; - int? sHORTAGEHRS; - int? sHORTAGESCHEDULEHRS; + dynamic? sHORTAGEHRS; + dynamic? sHORTAGESCHEDULEHRS; int? sICKLEAVE; - int? tIMEBACKHRS; - double? tIMEBACKBALANCE; + dynamic? tIMEBACKHRS; + dynamic? tIMEBACKBALANCE; int? uNAUTHORIZEDLEAVE; - int? uNCOVERDSHORTAGEHRS; + dynamic? uNCOVERDSHORTAGEHRS; int? uNPAIDLEAVE; GetTimeCardSummaryList( diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance.dart index 7391211..5ba0937 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; +import 'package:flutter/scheduler.dart'; import 'package:mohem_flutter_app/api/monthlyAttendance_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; @@ -17,6 +18,10 @@ import 'package:syncfusion_flutter_calendar/calendar.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:flutter/cupertino.dart'; import 'package:pie_chart/pie_chart.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:intl/intl.dart'; +import 'package:month_year_picker/month_year_picker.dart'; +import 'package:month_picker_dialog/month_picker_dialog.dart'; class MonthlyAttendance extends StatefulWidget { MonthlyAttendance({Key? key}) : super(key: key); @@ -28,12 +33,12 @@ class MonthlyAttendance extends StatefulWidget { } class _MonthlyAttendanceState extends State { - bool isPresent = true; - bool isAbsent = true; - bool isMissingDays = true; - bool isOffDays = true; + bool isPresent = false; + bool isAbsent = false; + bool isMissing = false; + bool isOff = false; DateTime date = DateTime.now(); - late var formattedDate; + late DateTime formattedDate; var currentMonth = DateTime.now().month; String searchMonth = getMonth(DateTime.now().month); int searchYear = DateTime.now().year; @@ -41,84 +46,42 @@ class _MonthlyAttendanceState extends State { List getDayHoursTypeDetailsList = []; GetTimeCardSummaryList? getTimeCardSummaryList; - - // GetDayHoursTypeDetailsList? getDayHoursTypeDetailsList; GetScheduleShiftsDetailsList? getScheduleShiftsDetailsList; @override void initState() { super.initState(); - getTimeCardSummary(searchMonth, searchYear); - getDayHoursTypeDetails(date.day, searchMonth, searchYear); - formattedDate = DateFormat('MMM-yyyy').format(date); + formattedDate = date; + callTimeCardAndHourDetails(date.day, searchMonth, searchYear); } - void getTimeCardSummary(searchMonth, searchYear) async { + void callTimeCardAndHourDetails(index, searchMonth, searchYear) async { try { Utils.showLoading(context); getTimeCardSummaryList = await MonthlyAttendanceApiClient().getTimeCardSummary(searchMonth, searchYear); - Utils.hideLoading(context); - setState(() {}); - } catch (ex) { - Utils.hideLoading(context); - Utils.handleException(ex, context, null); - } - } - - void getDayHoursTypeDetails(index, searchMonth, searchYear) async { - try { - Utils.showLoading(context); getDayHoursTypeDetailsList = await MonthlyAttendanceApiClient().getDayHoursTypeDetails(searchMonth, searchYear); Utils.hideLoading(context); - pRTPID = getDayHoursTypeDetailsList[index].rTPID; + _calendarController.displayDate = formattedDate; setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } - countAllAttendDays(); - getScheduleShiftsDetails(pRTPID); } - getScheduleShiftsDetails(pRTPID) async { + + Future getScheduleShiftsDetails(index, pRTPID) async { try { Utils.showLoading(context); getScheduleShiftsDetailsList = await MonthlyAttendanceApiClient().getScheduleShiftsDetails(pRTPID); Utils.hideLoading(context); - setState(() {}); + //setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } } - countAllAttendDays() { - // print(getDayHoursTypeDetailsList.length); - for (int i = 0; i < getDayHoursTypeDetailsList.length; i++) { - if (getDayHoursTypeDetailsList[i].aTTENDEDFLAG == 'Y') { - isPresent = true; - isAbsent = false; - isMissingDays = false; - isOffDays = false; - } else if (getDayHoursTypeDetailsList[i].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[i].aBSENTFLAG == 'Y') { - isPresent = false; - isAbsent = true; - isMissingDays = false; - isOffDays = false; - } else if (getDayHoursTypeDetailsList[i].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[i].dAYTYPE == 'OFF') { - isPresent = false; - isAbsent = false; - isMissingDays = false; - isOffDays = true; - } else { - isPresent = false; - isAbsent = false; - isMissingDays = true; - isOffDays = false; - } - } - } - final CalendarController _calendarController = CalendarController(); final List _colorList = [Color(0xff2AB2AB), Color(0xff202529)]; @@ -126,8 +89,8 @@ class _MonthlyAttendanceState extends State { @override Widget build(BuildContext context) { Map dataMap = { - "Present": getTimeCardSummaryList!.aTTENDEDDAYS!.toDouble(), - "Absent": getTimeCardSummaryList!.aBSENTDAYS!.toDouble(), + "Present": getTimeCardSummaryList?.aTTENDEDDAYS != null ? getTimeCardSummaryList!.aTTENDEDDAYS!.toDouble() : 0, + "Absent": getTimeCardSummaryList?.aBSENTDAYS != null ? getTimeCardSummaryList!.aBSENTDAYS!.toDouble() : 0, }; return Scaffold( appBar: AppBar( @@ -150,61 +113,42 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Attendance".toText24(isBold: true, color: MyColors.darkIconColor), + LocaleKeys.attendance.tr().toText24(isBold: true, color: MyColors.darkIconColor), Row( children: [ - Text(formattedDate), + "${DateFormat("MMMM-yyyy").format(formattedDate)}".toText16(color: MyColors.greyACColor), const Icon(Icons.keyboard_arrow_down_rounded, color: MyColors.greyACColor), ], ).onPress(() async { - await showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: DateTime(2021), + showMonthPicker( + context: context, //locale: EasyLocalization.of(context)?.locale, + initialDate: formattedDate, + firstDate: DateTime(searchYear - 2), lastDate: DateTime.now(), - builder: (context, child) { - return Theme( - data: ThemeData.dark().copyWith( - colorScheme: const ColorScheme.dark( - primary: MyColors.lightGreenColor, - onPrimary: MyColors.white, - surface: MyColors.lightGreenColor, - onSurface: MyColors.darkTextColor, - ), - dialogBackgroundColor: Colors.white, - ), - child: child!, - ); - }, ).then((selectedDate) { if (selectedDate != null) { - var selectedMonth = DateFormat('MMMM').format(selectedDate); - var selectedYear = DateFormat('yyyy').format(selectedDate); - searchMonth = selectedMonth; - searchYear = int.parse(selectedYear); - setState(() { - // date = selectedDate; - formattedDate = DateFormat('MMMM-yyyy').format(selectedDate); - getTimeCardSummary(searchMonth, searchYear); - getDayHoursTypeDetails(selectedDate.day, searchMonth, searchYear); - }); + searchMonth = getMonth(selectedDate.month); + searchYear = selectedDate.year; + formattedDate = selectedDate; //DateFormat('MMMM-yyyy').format(selectedDate); + // _calendarController.selectedDate = formattedDate; + callTimeCardAndHourDetails(selectedDate.day, searchMonth, searchYear); } }); }) ], ).paddingOnly(left: 21, right: 21), 18.height, - AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()).paddingOnly(left: 21, right: 21), + AspectRatio(aspectRatio: 333 / 270, child: calendarWidget()).paddingOnly(left: 18, right: 25), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - optionUI("Schedule\nDays", "${getTimeCardSummaryList!.sCHEDULEDAYS}"), + optionUI(LocaleKeys.scheduleDays.tr(), "${getTimeCardSummaryList?.sCHEDULEDAYS}"), 6.width, - optionUI("Off\nDays", "${getTimeCardSummaryList!.oFFDAYS}"), + optionUI(LocaleKeys.offDays.tr(), "${getTimeCardSummaryList?.oFFDAYS}"), 6.width, - optionUI("Non\nAnalyzed", "${getTimeCardSummaryList!.uNAUTHORIZEDLEAVE}"), + optionUI(LocaleKeys.nonAnalyzed.tr(), "${getTimeCardSummaryList?.uNAUTHORIZEDLEAVE}"), 6.width, - optionUI("Shortage\nHour", "${getTimeCardSummaryList!.sHORTAGEHRS}"), + optionUI(LocaleKeys.shortageHour.tr(), "${getTimeCardSummaryList?.sHORTAGEHRS}"), ], ).paddingOnly(left: 21, right: 21), 35.height, @@ -229,10 +173,10 @@ class _MonthlyAttendanceState extends State { children: [ Column( children: [ - "Attendance".toText12(isBold: true, color: MyColors.grey3AColor), - "Stats".toText24(isBold: true, color: MyColors.grey3AColor), + LocaleKeys.attendance.tr().toText12(isBold: true, color: MyColors.grey3AColor), + LocaleKeys.stats.tr().toText24(isBold: true, color: MyColors.grey3AColor), ], - ).paddingOnly(left: 21, top: 29, bottom: 36), + ).paddingOnly(left: 21, top: 29, bottom: 36, right: 23), Row( children: [ Container( @@ -245,7 +189,7 @@ class _MonthlyAttendanceState extends State { ), Container( margin: const EdgeInsets.only(left: 5, right: 5), - child: "PRESENT ${getTimeCardSummaryList!.aTTENDEDDAYS}".toText16(isBold: true, color: MyColors.lightGreenColor), + child: "${LocaleKeys.present.tr()} ${getTimeCardSummaryList!.aTTENDEDDAYS}".toText16(isBold: true, color: MyColors.lightGreenColor), ), ], ).paddingOnly(left: 21, right: 23), @@ -262,13 +206,13 @@ class _MonthlyAttendanceState extends State { ), Container( margin: const EdgeInsets.only(left: 5, right: 5), - child: "ABSENT ${getTimeCardSummaryList!.aBSENTDAYS}".toText16( + child: "${LocaleKeys.absent.tr()} ${getTimeCardSummaryList!.aBSENTDAYS}".toText16( isBold: true, color: MyColors.backgroundBlackColor, ), ) ], - ).paddingOnly(left: 21, top: 8), + ).paddingOnly(left: 21, top: 8, right: 23), ], ), Column( @@ -342,70 +286,116 @@ class _MonthlyAttendanceState extends State { Widget calendarWidget() { return SfCalendar( view: CalendarView.month, - // onViewChanged: viewChanged, + showDatePickerButton: false, controller: _calendarController, headerHeight: 0, todayHighlightColor: MyColors.grey3AColor, + showNavigationArrow: false, + showCurrentTimeIndicator: false, + showWeekNumber: false, + cellBorderColor: Colors.white, + selectionDecoration: BoxDecoration( + border: Border.all(color: MyColors.white, width: 10), + borderRadius: const BorderRadius.all(Radius.circular(100)), + shape: BoxShape.circle, + ), + dataSource: MeetingDataSource(_getDataSource()), + onTap: calendarTapped, + monthViewSettings: const MonthViewSettings( + dayFormat: 'EEE', + showTrailingAndLeadingDates: false, + showAgenda: false, + navigationDirection: MonthNavigationDirection.horizontal, + monthCellStyle: MonthCellStyle( + textStyle: TextStyle( + fontStyle: FontStyle.normal, + fontSize: 13, + color: Colors.white, + ), + ), + ), viewHeaderStyle: const ViewHeaderStyle( dayTextStyle: TextStyle(color: MyColors.grey3AColor, fontSize: 13, fontWeight: FontWeight.w600), ), - monthCellBuilder: (cxt, build) { - int val = build.date.day; - val == countAllAttendDays(); - if (isPresent) { - return Container( - margin: const EdgeInsets.all(4), - decoration: BoxDecoration( - gradient: const LinearGradient( - transform: GradientRotation(.46), - begin: Alignment.topRight, - end: Alignment.bottomLeft, - colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor], + monthCellBuilder: (build, details) { + if (details.date.month == formattedDate.month && details.date.year == formattedDate.year) { + int val = details.date.day; + //check day is off + if (getDayHoursTypeDetailsList[val - 1].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[val - 1].dAYTYPE == 'OFF') { + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: MyColors.greyACColor.withOpacity(.12), + shape: BoxShape.circle, ), - shape: BoxShape.circle, - boxShadow: [ - BoxShadow( - offset: const Offset(0, 2), - blurRadius: 26, - color: MyColors.blackColor.withOpacity(0.100), + alignment: Alignment.center, + child: Text( + "${val}", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: MyColors.greyA5Color, ), - ], - ), - alignment: Alignment.center, - child: Text( - "${build.date.day}", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.white, ), - ), - ); - } else if (isAbsent) { - return Container( - margin: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: MyColors.backgroundBlackColor, - shape: BoxShape.circle, - boxShadow: [ - BoxShadow( - offset: const Offset(0, 2), - blurRadius: 26, - color: MyColors.blackColor.withOpacity(0.100), + ); + } + //check day is Present + else if (getDayHoursTypeDetailsList[val - 1].aTTENDEDFLAG == 'Y') { + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + gradient: const LinearGradient( + transform: GradientRotation(.46), + begin: Alignment.topRight, + end: Alignment.bottomLeft, + colors: [MyColors.gradiantEndColor, MyColors.gradiantStartColor], ), - ], - ), - alignment: Alignment.center, - child: Text( - "${build.date.day}", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 26, + color: MyColors.blackColor.withOpacity(0.100), + ), + ], ), - ), - ); - } else if (isMissingDays) { + alignment: Alignment.center, + child: Text( + "${val}", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: MyColors.white, + ), + ), + ); + } + //check day is Absent + else if (getDayHoursTypeDetailsList[val - 1].aTTENDEDFLAG == 'N' && getDayHoursTypeDetailsList[val - 1].aBSENTFLAG == 'Y') { + return Container( + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: MyColors.backgroundBlackColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + offset: const Offset(0, 2), + blurRadius: 26, + color: MyColors.blackColor.withOpacity(0.100), + ), + ], + ), + alignment: Alignment.center, + child: Text( + "${val}", + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w500, + color: MyColors.white, + ), + ), + ); + } return Container( margin: const EdgeInsets.all(4), decoration: BoxDecoration( @@ -421,7 +411,7 @@ class _MonthlyAttendanceState extends State { ), alignment: Alignment.center, child: Text( - "${build.date.day}", + "${val}", style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w500, @@ -429,66 +419,35 @@ class _MonthlyAttendanceState extends State { ), ), ); - } else if (isOffDays) { - return Container( - margin: const EdgeInsets.all(4), - decoration: BoxDecoration( - color: MyColors.greyACColor.withOpacity(.12), - shape: BoxShape.circle, - ), - alignment: Alignment.center, - child: Text( - "${build.date.day}", - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.w500, - color: MyColors.greyA5Color, - ), - ), - ); + // return Container( + // alignment: Alignment.center, + // child: Text("$val"), + // ); } else { - return Container(); + return const SizedBox(); } }, - monthViewSettings: const MonthViewSettings( - dayFormat: 'EEE', - showTrailingAndLeadingDates: false, - appointmentDisplayMode: MonthAppointmentDisplayMode.appointment, - showAgenda: false, - navigationDirection: MonthNavigationDirection.horizontal, - monthCellStyle: MonthCellStyle( - textStyle: TextStyle( - fontStyle: FontStyle.normal, - fontSize: 13, - color: Colors.white, - ), - ), - ), - showNavigationArrow: false, - showDatePickerButton: false, - showCurrentTimeIndicator: false, - showWeekNumber: false, - cellBorderColor: Colors.white, - selectionDecoration: BoxDecoration( - border: Border.all(color: MyColors.white, width: 10), - borderRadius: const BorderRadius.all(Radius.circular(100)), - shape: BoxShape.circle, - ), - dataSource: MeetingDataSource(_getDataSource()), - onTap: calendarTapped, ); } - calendarTapped(CalendarTapDetails details) { - dynamic string = getScheduleShiftsDetailsList!.pERCENTAGE; - dynamic percentage = string!.indexOf('%'); - print(percentage); - print(details.date?.day.toString()); - int? index = details.date?.day; + calendarTapped(CalendarTapDetails details) async { + dynamic index = details.date?.day; if (index != null) { index = index - 1; } - getDayHoursTypeDetails(index, getMonth(details.date!.month), details.date?.year); + pRTPID = getDayHoursTypeDetailsList[index].rTPID; + await getScheduleShiftsDetails(index, pRTPID); + dynamic value = getScheduleShiftsDetailsList!.pERCENTAGE; + dynamic percentage; + if (value!.indexOf('%') == 3) { + percentage = int.parse(value!.substring(0, 3)); + } else if (value!.indexOf('%') == 2) { + percentage = int.parse(value!.substring(0, 2)); + } else if (value!.indexOf('%') == 1 && value!.indexOf('%') != 0 && value!.indexOf('%') != "") { + percentage = int.parse(value!.substring(0, 1)); + } else if (value!.indexOf('%') == 0 || value!.indexOf('%') == "") { + percentage = 0; + } showModalBottomSheet( context: context, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(25)), @@ -499,6 +458,8 @@ class _MonthlyAttendanceState extends State { maxChildSize: 0.9, expand: false, builder: (_, controller) { + dynamic dmyString = getScheduleShiftsDetailsList!.sCHEDULEDATE; + DateTime dateTime1 = DateFormat("MM/dd/yyyy hh:mm:ss a").parse(dmyString); return Column( children: [ Container( @@ -524,11 +485,12 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column(children: [ - "${getScheduleShiftsDetailsList!.sCHEDULEDATE!.substring(0, 9)}".toText24(isBold: true, color: Colors.white), - "Attendance Details".tr().toText16(color: MyColors.lightGreyEFColor), - 21.height, - ]).paddingOnly(top: 25, left: 21, right: 21, bottom: 10), + Container(child: + "${DateFormat("MMMM-dd-yyyy").format(dateTime1).replaceAll('-', " ")}".toText24(isBold: true, color: Colors.white), + ).paddingOnly(top: 26, left: 21, right: 21), + Container( + child: LocaleKeys.attendanceDetails.tr().toText16(color: MyColors.greyACColor).paddingOnly(left: 21,bottom: 16), + ), Center( child: CircularStepProgressBar( totalSteps: 16 * 4, @@ -542,9 +504,9 @@ class _MonthlyAttendanceState extends State { mainAxisSize: MainAxisSize.min, children: [ "${getScheduleShiftsDetailsList!.pERCENTAGE}".toText44(color: Colors.white, isBold: true), - "Completed".tr().toText11(color: MyColors.greyACColor), + LocaleKeys.completed.tr().toText11(color: MyColors.greyACColor), 19.height, - "Shift Time".tr().toText11(color: MyColors.greyACColor), + LocaleKeys.shiftTime.tr().toText11(color: MyColors.greyACColor), "${getScheduleShiftsDetailsList!.sHTNAME}".toText22(color: Colors.white, isBold: true), ], ), @@ -574,11 +536,13 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Actual Check In ".tr().toText11( + LocaleKeys.actualCheckIn.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true), + "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}" !="" + ? "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true) + : "__".toText22(color: Colors.black, isBold: true), ], ), ), @@ -586,11 +550,13 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Actual Check Out".tr().toText11( + LocaleKeys.actualCheckOut.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true), + "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}" != "" + ? "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true) + : "__".toText22(color: Colors.black, isBold: true), ], ), ], @@ -609,11 +575,13 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Approved Check In".tr().toText11( + LocaleKeys.approvedCheckIn.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true), + "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}" !="" + ? "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true) + :"__".toText22(color: MyColors.greenColor, isBold: true), ], ), ), @@ -621,11 +589,13 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Approved Check Out".tr().toText11( + LocaleKeys.approvedCheckOut.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true), + "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}"!= "" + ? "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true) + :"__".toText22(color: MyColors.greenColor, isBold: true), ], ), ], @@ -644,11 +614,11 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Late In".tr().toText11( + LocaleKeys.lateIn.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true), + "${getDayHoursTypeDetailsList[index].lATEINHRS}".toText22(color: MyColors.redColor, isBold: true), ], ), ), @@ -656,11 +626,11 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Excess".tr().toText11( + LocaleKeys.excess.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].eXCESSHRS}".toText22(color: Colors.black, isBold: true), + "${getDayHoursTypeDetailsList[index].eXCESSHRS}".toText22(color: Colors.black, isBold: true), ], ), ], @@ -679,11 +649,11 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Shortage".tr().toText11( + LocaleKeys.shortage.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].sHORTAGEHRS}".toText22(color: Colors.black, isBold: true), + "${getDayHoursTypeDetailsList[index].sHORTAGEHRS}".toText22(color: Colors.black, isBold: true), ], ), ), @@ -691,11 +661,11 @@ class _MonthlyAttendanceState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - "Early Out".tr().toText11( + LocaleKeys.earlyOut.tr().toText11( color: MyColors.grey67Color, ), 8.height, - "${getDayHoursTypeDetailsList[i].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true), + "${getDayHoursTypeDetailsList[index].eARLYOUTHRS}".toText22(color: Colors.black, isBold: true), ], ), ], @@ -752,6 +722,35 @@ class _MonthlyAttendanceState extends State { return "December"; } } + + static getMonthAr(int month){ + switch (month) { + case 1: + return 'يناير'; + case 2: + return ' فبراير'; + case 3: + return 'مارس'; + case 4: + return 'أبريل'; + case 5: + return 'مايو'; + case 6: + return 'يونيو'; + case 7: + return 'يوليو'; + case 8: + return 'أغسطس'; + case 9: + return 'سبتمبر'; + case 10: + return ' اكتوبر'; + case 11: + return ' نوفمبر'; + case 12: + return 'ديسمبر'; + } + } } class MeetingDataSource extends CalendarDataSource { diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index f171577..8be702f 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -25,6 +25,13 @@ class MyAttendanceScreen extends StatelessWidget { height: double.infinity, child: ListView( children: [ + itemView( + "assets/images/pdf.svg", + LocaleKeys.monthlyAttendance.tr(), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.monthlyAttendance); + }), + 12.height, itemView( "assets/images/pdf.svg", LocaleKeys.missingSwipes.tr(), diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index e229918..4bcd235 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -97,11 +97,7 @@ class _BasicDetailsState extends State { children: [ Container( width: double.infinity, - margin: EdgeInsets.only( - top: 28, - left: 26, - right: 26, - ), + margin: EdgeInsets.only(top: 20, left: 21, right: 21,bottom: 20), padding: EdgeInsets.only(left: 14, right: 14, top: 13, bottom: 5), height: 280, decoration: BoxDecoration( diff --git a/lib/ui/profile/contact_details.dart b/lib/ui/profile/contact_details.dart index 32f0ce8..4471f31 100644 --- a/lib/ui/profile/contact_details.dart +++ b/lib/ui/profile/contact_details.dart @@ -78,83 +78,86 @@ class _ContactDetailsState extends State { ), backgroundColor: MyColors.backgroundColor, bottomSheet:footer(), - body: Column( - children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only(top: 28, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), - height: 150, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only(top: 20, left: 21, right: 21,bottom: 20), + padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), + height: 150, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${getEmployeePhonesList[0].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), + "${getEmployeePhonesList[0].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20,), + "${getEmployeePhonesList[1].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), + "${getEmployeePhonesList[1].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), + ] + ), ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${getEmployeePhonesList[0].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), - "${getEmployeePhonesList[0].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeePhonesList[1].pHONETYPEMEANING}".toText13(color: MyColors.lightGrayColor), - "${getEmployeePhonesList[1].pHONENUMBER}".toText16(isBold: true, color: MyColors.blackColor), - ] + Container( + width: double.infinity, + margin: EdgeInsets.only( left: 26, right: 26,bottom: 100), + padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), + height: 400, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${getEmployeeAddressList[0].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${getEmployeeAddressList[0].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20,), + "${getEmployeeAddressList[2].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${getEmployeeAddressList[2].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20,), + "${getEmployeeAddressList[3].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${getEmployeeAddressList[3].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20,), + "${getEmployeeAddressList[4].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${getEmployeeAddressList[4].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20,), + "${getEmployeeAddressList[5].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${getEmployeeAddressList[5].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + SizedBox( + height: 20,), + "${getEmployeeAddressList[6].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), + "${getEmployeeAddressList[6].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), + ] + ), ), - ), - Container( - width: double.infinity, - margin: EdgeInsets.only(top: 28, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), - height: 400, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${getEmployeeAddressList[0].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[0].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[2].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[2].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[3].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[3].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[4].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[4].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[5].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[5].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - SizedBox( - height: 20,), - "${getEmployeeAddressList[6].sEGMENTPROMPT}".toText13(color: MyColors.lightGrayColor), - "${getEmployeeAddressList[6].sEGMENTVALUEDSP}".toText16(isBold: true, color: MyColors.blackColor), - ] - ), - ), - ], + ], + ), ) ); diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index d62f101..6f50c51 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -59,146 +59,146 @@ class _FamilyMembersState extends State { ), backgroundColor: MyColors.backgroundColor, bottomSheet:footer(), - body: Column( - children: [ - SizedBox(height: 20,), - getEmployeeContactsList.length != 0 - ? SingleChildScrollView( - child: Column( - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: getEmployeeContactsList.length, - itemBuilder: (context, index) { - return Container( - child: Column( - children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only(top: 10, left: 26, right: 26,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, ), - height: 110, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${getEmployeeContactsList[index].cONTACTNAME}".toText16(color: MyColors.blackColor), - "${getEmployeeContactsList[index].rELATIONSHIP}".toText11(isBold: true, color: MyColors.textMixColor), - SizedBox(height: 5,), - Divider( - color: MyColors.lightGreyEFColor, - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, + body: Container( + width: MediaQuery.of(context).size.width, + child: getEmployeeContactsList.length != 0 + ? SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: getEmployeeContactsList.length, + itemBuilder: (context, index) { + return Container( + child: Column( + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only(top: 20, left: 21, right: 21,), + padding: EdgeInsets.only(left: 14, right: 14,top: 13, ), + height: 110, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - child: InkWell( - onTap: () { - - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Icon( - Icons.edit, - size: 15, - color: MyColors.grey67Color, + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "${getEmployeeContactsList[index].cONTACTNAME}".toText16(color: MyColors.blackColor), + "${getEmployeeContactsList[index].rELATIONSHIP}".toText11(isBold: true, color: MyColors.textMixColor), + SizedBox(height: 5,), + Divider( + color: MyColors.lightGreyEFColor, + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + child: InkWell( + onTap: () { + + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.edit, + size: 15, + color: MyColors.grey67Color, + ), ), - ), - TextSpan( - text: LocaleKeys.update.tr(), - style: TextStyle( - color: MyColors.grey67Color, - fontSize: 12, - fontWeight: FontWeight.bold, + TextSpan( + text: LocaleKeys.update.tr(), + style: TextStyle( + color: MyColors.grey67Color, + fontSize: 12, + fontWeight: FontWeight.bold, + ), ), - ), - ], + ], + ), ), + ) + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SizedBox( + child: Container( + width: 3, + color: MyColors.lightGreyEFColor, ), - ) - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: SizedBox( - child: Container( - width: 3, - color: MyColors.lightGreyEFColor, ), ), - ), - Container( - child: InkWell( - onTap: () { - showAlertDialog(context); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Icon( - Icons.delete, - size: 15, - color: Color(0x99FF0000), + Container( + child: InkWell( + onTap: () { + showAlertDialog(context); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.delete, + size: 15, + color: Color(0x99FF0000), + ), ), - ), - TextSpan( - text:LocaleKeys.remove.tr(), - style: TextStyle( - color: MyColors.DarkRedColor, - fontSize: 12, - fontWeight: FontWeight.bold, + TextSpan( + text:LocaleKeys.remove.tr(), + style: TextStyle( + color: MyColors.DarkRedColor, + fontSize: 12, + fontWeight: FontWeight.bold, + ), ), - ), - ], + ], + ), ), - ), - ) - ), - // ElevatedButton.icon( - // icon: Icon( - // Icons.delete, - // size: 15, - // color: Color(0x99FF0000), - // ), - // style: ElevatedButton.styleFrom( - // shadowColor: Colors.white, - // primary: Colors.white, - // ), - // label: "remove".toText12(color: MyColors.DarkRedColor), - // onPressed: (){}, - // ), - ], - ), - ] + ) + ), + // ElevatedButton.icon( + // icon: Icon( + // Icons.delete, + // size: 15, + // color: Color(0x99FF0000), + // ), + // style: ElevatedButton.styleFrom( + // shadowColor: Colors.white, + // primary: Colors.white, + // ), + // label: "remove".toText12(color: MyColors.DarkRedColor), + // onPressed: (){}, + // ), + ], + ), + ] + ), ), - ), - ], - ) - ); - }) + ], + ) + ); + }) ], ), - ):Container(), - ], + ):Container(), + // SizedBox(height: 20), ) @@ -223,17 +223,17 @@ class _FamilyMembersState extends State { showAlertDialog(BuildContext context) { Widget cancelButton = TextButton( - child: Text("CANCEL"), + child: Text(LocaleKeys.cancel.tr(),), onPressed: () { Navigator.pop(context); }, ); Widget continueButton = TextButton( - child: Text("OK"), + child: Text(LocaleKeys.ok.tr(),), onPressed: () {}, ); AlertDialog alert = AlertDialog( - title: Text("Confirm"), + title: Text(LocaleKeys.confirm.tr(),), content: Text("Are You Sure You Want to Remove this Member?"), actions: [ cancelButton, diff --git a/lib/ui/profile/personal_info.dart b/lib/ui/profile/personal_info.dart index b136141..c4d2c6f 100644 --- a/lib/ui/profile/personal_info.dart +++ b/lib/ui/profile/personal_info.dart @@ -58,7 +58,7 @@ class _PesonalInfoState extends State { children: [ Container( width: double.infinity, - margin: EdgeInsets.only(top: 28, left: 26, right: 26,), + margin: EdgeInsets.only(top: 20, left: 21, right: 21,bottom: 20), padding: EdgeInsets.only(left: 14, right: 14,top: 13, bottom: 20), height: 350, decoration: BoxDecoration( diff --git a/pubspec.yaml b/pubspec.yaml index 8afdae3..2447b3d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: nfc_manager: ^3.1.1 uuid: ^3.0.6 + # maps google_maps_flutter: ^2.0.2 google_maps_utils: ^1.4.0+1 @@ -62,6 +63,8 @@ dependencies: geolocator: any # flutter_compass: ^0.6.1 google_maps_flutter_web: ^0.3.2 + month_year_picker: ^0.2.0+1 + month_picker_dialog: ^0.4.0 dev_dependencies: From 959750da9be6edf8e6523f375844ed6cbb238f09 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 19 Jun 2022 11:35:49 +0300 Subject: [PATCH 05/22] ticket request cont. --- lib/classes/utils.dart | 10 +- lib/config/routes.dart | 21 ++- lib/main.dart | 2 +- .../get_eit_dff_structure_list_model.dart | 2 + lib/ui/landing/widget/drawer_item.dart | 1 + lib/ui/landing/widget/services_widget.dart | 16 +- lib/ui/misc/request_submit_screen.dart | 2 +- .../dynamic_screens/dynamic_input_screen.dart | 149 +++++++++++++++++- .../dynamic_listview_screen.dart | 29 ++-- .../my_attendance/my_attendance_screen.dart | 44 +++--- lib/ui/work_list/worklist_detail_screen.dart | 9 +- .../worklist_fragments/detail_fragment.dart | 6 +- 12 files changed, 220 insertions(+), 71 deletions(-) diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index c63f842..959333e 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -17,9 +17,15 @@ class Utils { static bool get isLoading => _isLoadingVisible; - static void showToast(String message) { + static void showToast(String message, {bool longDuration = false}) { Fluttertoast.showToast( - msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 1, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0); + msg: message, + toastLength: longDuration ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT, + gravity: ToastGravity.BOTTOM, + timeInSecForIosWeb: 1, + backgroundColor: Colors.black54, + textColor: Colors.white, + fontSize: 16.0); } static dynamic getNotNullValue(List list, int index) { diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 461a385..366d35c 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/ui/attendance/monthly_attendance.dart'; +import 'package:mohem_flutter_app/ui/bottom_sheets/attendence_details_bottom_sheet.dart'; import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart'; import 'package:mohem_flutter_app/ui/landing/today_attendance_screen.dart'; import 'package:mohem_flutter_app/ui/login/forgot_password_screen.dart'; @@ -8,25 +10,22 @@ import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/basic_details.dart'; +import 'package:mohem_flutter_app/ui/profile/contact_details.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/family_members.dart'; +import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; + // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/family_members.dart'; -import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/item_history_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/itg_detail_screen.dart'; -import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; -import 'package:mohem_flutter_app/ui/bottom_sheets/attendence_details_bottom_sheet.dart'; -import 'package:mohem_flutter_app/ui/attendance/monthly_attendance.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; -import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; -import 'package:mohem_flutter_app/ui/profile/basic_details.dart'; -import 'package:mohem_flutter_app/ui/profile/contact_details.dart'; -import 'package:mohem_flutter_app/ui/profile/family_members.dart'; +import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; class AppRoutes { static const String splash = "/splash"; @@ -58,6 +57,7 @@ class AppRoutes { //profile static const String addDynamicInputProfile = 'addDynamicInputProfile'; + //Attendance static const String attendance = "/attendance"; static const String monthlyAttendance = "/monthlyAttendance"; @@ -113,6 +113,5 @@ class AppRoutes { addDynamicInput: (context) => DynamicInputScreen(), addDynamicInputProfile: (context) => DynamicInputScreenProfile(), requestSubmitScreen: (context) => RequestSubmitScreen(), - }; } diff --git a/lib/main.dart b/lib/main.dart index 1e8b674..c987451 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -26,7 +26,7 @@ Future main() async { await EasyLocalization.ensureInitialized(); await Firebase.initializeApp(); AppState().setPostParamsModel( - PostParamsModel(channel: 31, versionID: 3.4, mobileType: Platform.isAndroid ? "android" : "ios"), + PostParamsModel(channel: 31, versionID: 5.0, mobileType: Platform.isAndroid ? "android" : "ios"), ); runApp( EasyLocalization( diff --git a/lib/models/get_eit_dff_structure_list_model.dart b/lib/models/get_eit_dff_structure_list_model.dart index baf7f95..5856014 100644 --- a/lib/models/get_eit_dff_structure_list_model.dart +++ b/lib/models/get_eit_dff_structure_list_model.dart @@ -205,6 +205,8 @@ class GetEITDFFStructureList { data['VALIDATION_TYPE_DSP'] = this.vALIDATIONTYPEDSP; return data; } + + bool get isDefaultTypeIsCDPS => (dEFAULTTYPE == "C" || dEFAULTTYPE == "D" || dEFAULTTYPE == "P" || dEFAULTTYPE == "S"); } class ESERVICESDV { diff --git a/lib/ui/landing/widget/drawer_item.dart b/lib/ui/landing/widget/drawer_item.dart index 301719b..65c3132 100644 --- a/lib/ui/landing/widget/drawer_item.dart +++ b/lib/ui/landing/widget/drawer_item.dart @@ -1,4 +1,5 @@ import 'dart:ui'; + import 'package:flutter/material.dart'; class DrawerItem extends StatefulWidget { diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index f69776c..fc873cd 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -85,10 +85,10 @@ class ServicesWidget extends StatelessWidget { ) ], ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12), - ), - ).onPress(() { - handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]); - }); + ).onPress(() { + handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]); + }), + ); }, separatorBuilder: (cxt, index) => 9.width, itemCount: data.homeMenus![parentIndex].menuEntiesList.length), @@ -108,7 +108,13 @@ class ServicesWidget extends StatelessWidget { } void handleOnPress(context, GetMenuEntriesList menuEntry) { - print(menuEntry.menuName); + var pro = Provider.of(context, listen: false); + List? menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && element.menuEntryType == "FUNCTION").toList(); + menuEntry.icon = ""; + print(menuEntry.toJson()); + Navigator.pushNamed(context, AppRoutes.myAttendance, arguments: menuList ?? []); + return; + if (menuEntry.menuName == "HMG_OTL_SS" || menuEntry.menuName == "HMG_PT_OTL_SS") { Navigator.pushNamed(context, AppRoutes.myAttendance); } else { diff --git a/lib/ui/misc/request_submit_screen.dart b/lib/ui/misc/request_submit_screen.dart index 196ee01..a0722da 100644 --- a/lib/ui/misc/request_submit_screen.dart +++ b/lib/ui/misc/request_submit_screen.dart @@ -90,7 +90,7 @@ class _RequestSubmitScreenState extends State { params!.transactionId, ); Utils.hideLoading(context); - Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr()); + Utils.showToast(LocaleKeys.yourRequestHasBeenSubmittedForApprovals.tr(), longDuration: true); Navigator.of(context).popUntil((route) { return route.settings.name == AppRoutes.dashboard; }); 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 f855c67..ec129c8 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -194,11 +194,133 @@ class _DynamicInputScreenState extends State { Widget parseDynamicFormatType(GetEITDFFStructureList model, int index) { if (model.dISPLAYFLAG != "N") { + if (model.vALIDATIONTYPE == "N") { + if (model.fORMATTYPE == "C") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isReadOnly: model.rEADONLY == "Y", + onChange: (text) { + model.fieldAnswer = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "N") { + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pIDCOLUMNNAME ?? "", + isReadOnly: model.rEADONLY == "Y", + isInputTypeNum: true, + onChange: (text) { + model.fieldAnswer = text; + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "X") { + String displayText = model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""); + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + if (displayText.contains(" 00:00:00")) { + displayText = displayText.replaceAll(" 00:00:00", ""); + } + if (!displayText.contains("-")) { + displayText = DateFormat('yyyy-MM-dd').format(DateFormat("yyyy/MM/dd").parse(displayText)); + } + } + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + displayText, + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + selectedDate = DateFormat("yyyy/MM/dd").parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.replaceAll('/"', '').replaceAll(" 00:00:00", "")); + } else { + selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } + } + DateTime date = await _selectDate(context); + DateTime date1 = DateTime(date.year, date.month, date.day); + getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + }, + ).paddingOnly(bottom: 12); + } else if (model.fORMATTYPE == "Y") { + String displayText = model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""); + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + if (displayText.contains(" 00:00:00")) { + displayText = displayText.replaceAll(" 00:00:00", ""); + } + if (!displayText.contains("-")) { + displayText = DateFormat('yyyy-MM-dd').format(DateFormat("yyyy/MM/dd").parse(displayText)); + } + } + return DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + displayText, + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + selectedDate = DateFormat("yyyy-MM-dd").parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.replaceAll('/"', '').replaceAll(" 00:00:00", "")); + } else { + selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } + } + DateTime date = await _selectDate(context); + DateTime date1 = DateTime(date.year, date.month, date.day); + getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } + }, + ).paddingOnly(bottom: 12); + } + } else { + return PopupMenuButton( + child: DynamicTextFieldWidget( + (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), + model.eSERVICESDV?.pVALUECOLUMNNAME ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: model.rEADONLY == "Y", + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), + ], + onSelected: (int popipIndex) { + ESERVICESDV eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: model.eSERVICESVS![popipIndex].iDCOLUMNNAME, + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![popipIndex].dEFAULTVALUE, + pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); + getEitDffStructureList![index].eSERVICESDV = eservicesdv; + setState(() {}); + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } + }); + } } else { return const SizedBox(); } - - if (model.fORMATTYPE == "C") { + if (model.fORMATTYPE == "N") { if (model.eSERVICESVS?.isNotEmpty ?? false) { return PopupMenuButton( child: DynamicTextFieldWidget( @@ -206,6 +328,8 @@ class _DynamicInputScreenState extends State { model.eSERVICESDV?.pVALUECOLUMNNAME ?? "", isEnable: false, isPopup: true, + isInputTypeNum: true, + isReadOnly: model.rEADONLY == "Y", ).paddingOnly(bottom: 12), itemBuilder: (_) => >[ for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), @@ -232,15 +356,28 @@ class _DynamicInputScreenState extends State { model.fieldAnswer = text; }, ).paddingOnly(bottom: 12); - } else if (model.fORMATTYPE == "X") { + } else if (model.fORMATTYPE == "X" || model.fORMATTYPE == "Y") { + String displayText = model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""); + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + if (displayText.contains(" 00:00:00")) { + displayText = displayText.replaceAll(" 00:00:00", ""); + } + if (!displayText.contains("-")) { + displayText = DateFormat('yyyy-MM-dd').format(DateFormat("yyyy/MM/dd").parse(displayText)); + } + } return DynamicTextFieldWidget( (model.sEGMENTPROMPT ?? "") + (model.rEQUIREDFLAG == "Y" ? "*" : ""), - model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""), + displayText, suffixIconData: Icons.calendar_today, isEnable: false, onTap: () async { if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { - selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + selectedDate = DateFormat("yyyy/MM/dd").parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.replaceAll('/"', '').replaceAll(" 00:00:00", "")); + } else { + selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); + } } DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); @@ -249,7 +386,7 @@ class _DynamicInputScreenState extends State { pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { 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 37ba465..129dc5b 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -18,6 +18,7 @@ class DynamicListViewParams { String uRL; String requestID; String colsURL; + DynamicListViewParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = ''}); } @@ -33,6 +34,7 @@ class DynamicListViewScreen extends StatefulWidget { class _DynamicListViewScreenState extends State { List? getEITTransactionList; DynamicListViewParams? dynamicParams; + @override void initState() { super.initState(); @@ -42,6 +44,9 @@ class _DynamicListViewScreenState extends State { try { Utils.showLoading(context); getEITTransactionList = await MyAttendanceApiClient().getEitTransaction(dynamicParams!.dynamicId); + getEITTransactionList?.forEach((element) { + element.collectionTransaction = element.collectionTransaction?.where((elemen) => elemen.dISPLAYFLAG == "Y").toList() ?? []; + }); Utils.hideLoading(context); setState(() {}); } catch (ex) { @@ -74,17 +79,19 @@ class _DynamicListViewScreenState extends State { ? LocaleKeys.noDataAvailable.tr().toText16().center : ListView.separated( physics: const BouncingScrollPhysics(), - padding: EdgeInsets.all(21), - itemBuilder: (cxt, int parentIndex) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++) - if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y") - ItemDetailView( - getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), - ], - ).objectContainerView(), + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, int parentIndex) => getEITTransactionList![parentIndex].collectionTransaction!.isEmpty + ? const SizedBox() + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + for (int t = 0; t < (getEITTransactionList![parentIndex].collectionTransaction ?? []).length; t++) + if (getEITTransactionList![parentIndex].collectionTransaction![t].dISPLAYFLAG == "Y") + ItemDetailView( + getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTPROMPT!, getEITTransactionList![parentIndex].collectionTransaction![t].sEGMENTVALUEDSP ?? ""), + ], + ).objectContainerView(), separatorBuilder: (cxt, index) => 12.height, itemCount: getEITTransactionList!.length)), floatingActionButton: Container( diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index 8e6ab0c..56a3875 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -7,15 +7,18 @@ 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/ui/misc/request_submit_screen.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; class MyAttendanceScreen extends StatelessWidget { - MyAttendanceScreen({Key? key}) : super(key: key); + List list; + + MyAttendanceScreen({Key? key, this.list = const []}) : super(key: key); @override Widget build(BuildContext context) { + list = ModalRoute.of(context)!.settings.arguments as List; return Scaffold( backgroundColor: Colors.white, appBar: AppBarWidget( @@ -25,30 +28,19 @@ class MyAttendanceScreen extends StatelessWidget { body: SizedBox( width: double.infinity, height: double.infinity, - child: ListView( - children: [ - itemView( - "assets/images/pdf.svg", - LocaleKeys.missingSwipes.tr(), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS")); - }), - 12.height, - itemView( - "assets/images/pdf.svg", - LocaleKeys.workFromHome.tr(), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.workFromHome.tr(), "HMG_OTL_WFH_EIT_SS")); - }), - 12.height, - itemView( - "assets/images/pdf.svg", - LocaleKeys.workOnBreak.tr(), - ).onPress(() { - // Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", 8724807)); - }), - ], - ).paddingAll(21)), + child: list.isEmpty + ? LocaleKeys.noDataAvailable.tr().toText16().center + : ListView.separated( + padding: const EdgeInsets.all(21), + itemBuilder: (cxt, index) => itemView( + "assets/images/pdf.svg", + //LocaleKeys.missingSwipes.tr(), + list[index].prompt!, + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(list[index].prompt!, list[index].functionName!)); + }), + separatorBuilder: (cxt, index) => 12.height, + itemCount: list.length)), ); } diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index c64d91b..44625f5 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -86,9 +86,12 @@ class _WorkListDetailScreenState extends State { memberInformationListModel = await WorkListApiClient().getUserInformation(-999, workListData!.sELECTEDEMPLOYEENUMBER!); } if (workListData!.iTEMTYPE == "HRSSA") { - getBasicNTFBody = await WorkListApiClient().getBasicDetNTFBody(workListData!.nOTIFICATIONID!, -999); - getAbsenceCollectionNotifications = await WorkListApiClient().getAbsenceNotificationBody(workListData!.nOTIFICATIONID!, -999); - subordinatesLeavesModel = await WorkListApiClient().getSubordinatesLeaves("", ""); + if (workListData!.rEQUESTTYPE == "EIT") { + } else { + getBasicNTFBody = await WorkListApiClient().getBasicDetNTFBody(workListData!.nOTIFICATIONID!, -999); + getAbsenceCollectionNotifications = await WorkListApiClient().getAbsenceNotificationBody(workListData!.nOTIFICATIONID!, -999); + subordinatesLeavesModel = await WorkListApiClient().getSubordinatesLeaves("", ""); + } } if (workListData!.iTEMTYPE == "STAMP") { if (workListData!.rEQUESTTYPE == "STAMP_MS") { diff --git a/lib/ui/work_list/worklist_fragments/detail_fragment.dart b/lib/ui/work_list/worklist_fragments/detail_fragment.dart index a8e6282..7e2567e 100644 --- a/lib/ui/work_list/worklist_fragments/detail_fragment.dart +++ b/lib/ui/work_list/worklist_fragments/detail_fragment.dart @@ -1,9 +1,7 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; @@ -45,8 +43,7 @@ class _DetailFragmentState extends State { mainAxisSize: MainAxisSize.min, children: [ ItemDetailView(LocaleKeys.employeeNumber.tr(), widget.memberInformationListModel!.eMPLOYEENUMBER ?? ""), - ItemDetailView(LocaleKeys.employeeName.tr(), - (AppState().isArabic(context) ? widget.memberInformationListModel!.eMPLOYEENAMEAr : widget.memberInformationListModel!.eMPLOYEENAMEEn) ?? ""), + ItemDetailView(LocaleKeys.employeeName.tr(), (AppState().isArabic(context) ? widget.memberInformationListModel!.eMPLOYEENAMEAr : widget.memberInformationListModel!.eMPLOYEENAMEEn) ?? ""), ItemDetailView(LocaleKeys.jobTitle.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")), ItemDetailView(LocaleKeys.grade.tr(), widget.memberInformationListModel!.gRADENAME ?? ""), ItemDetailView(LocaleKeys.jobCategory.tr(), makePositionName(widget.memberInformationListModel!.pOSITIONNAME ?? "")), @@ -68,5 +65,4 @@ class _DetailFragmentState extends State { } return jobName; } - } From 1841057ce6857fbed6145bccc3b41d4bbb5901f6 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 19 Jun 2022 11:51:24 +0300 Subject: [PATCH 06/22] app icon added. --- android/app/src/main/AndroidManifest.xml | 3 +- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 3408 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 8033 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5544 bytes .../src/main/res/mipmap-ldpi/ic_launcher.png | Bin 0 -> 1404 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 1873 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4200 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3073 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 3856 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 9718 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6763 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 7524 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 34556 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11927 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 9348 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 45316 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15240 bytes .../res/values/ic_launcher_background.xml | 4 + icon.png | Bin 0 -> 76623 bytes .../AppIcon.appiconset/Contents.json | 244 +++++++++--------- .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 684 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1744 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 3206 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 1126 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 3080 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 4773 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1744 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 4864 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 8663 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 8663 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 14340 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 4393 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 12620 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 12647 bytes .../AppIcon.appiconset/ItunesArtwork@2x.png | Bin 0 -> 62440 bytes 35 files changed, 131 insertions(+), 120 deletions(-) create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-ldpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 icon.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7be27d5..4ebc7c5 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,7 +7,8 @@ + android:icon="@mipmap/ic_launcher" + android:roundIcon="@mipmap/ic_launcher_round"> ZCNidiO0+_S`B0<|! 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 AQ2+n{ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..6671a95caa4e7e0f8b592203f840ab9fe653cc1c GIT binary patch literal 8033 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 j&E1Eh-v^yt>`00000NkvXXu0mjfAK`T9 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b3ca39d0f6a46423501b7c411c6a400f5eb20e GIT binary patch literal 5544 zcmV;Z6<6wsP)s#lZq zdL#VJB>O(ps&6Rotk^fB4!+ho=foS~=}qQu8WF5dgZ|$TL8W#GG;Usvs;lVe=%CL& z`>b-;U3YC(RkcS^lx>8NJpg(LA)BR?+Xx|HXJ0904#0H)vjC>0l!HQu>xN-Wzxn2y zvkyM_Ae)()5$lj=&Aeh2>NwJ>b8gq`mIoeqK)HPRvcFg??lw*He$M%0oby*W=YyQ{ z1tEkkgpizb$vKy`c&q4~^98H#E1dJkOw+tSm&@IL{`~pi;lqa&7dbbIuQ*X%+yJY- zzT*6`W5*QJG-rD7ySqoS+3dQbn452@=aZDPXV3bJ z#o|8B`6$-l(O4j%%1)N5CUZO!=*AKn++H3wbXi?onkpiGSJv~&@w0*W&ZKR*rC=F_~ z4`b|9u~^*K-rim>&nuVeDCT-B7K^)8RsB98f*hojex<9c>vmN7-!kv9 z!2}>JpyVTuJVK8gIr0P{c1md^l}f$%?z`{W zH~RAu;`0+n3n9^H|NhQLS+{iU)vei*cNt{1Cd};DSI%3N8tz(g~cK z7+CSJ+;~dq1HHYyy^2z)ZBFMbjvqfxeLmmq0B)^?xP5e*o)8kTR2s2V8oWVM%j!Bt zZ!92HEHu=fOM&^^62?+<73ZatNNWWY389=In$u3n@Z@>Tk z`zr!gMdhJ~9#Sc#cMw84R}>8-*$$!~+2WAqj*9l9Yf~QOiI&L3QCfJs!^;k38~- z>YS%jpXin?TeeY34*{UHLbUT}aE?{S00Ms65Hk-wXOP6u( z`ZWZ-6tTq{IIv}FO~D!G7)s9JsSB^d4>V>V;PsW|=xy!Br`oq-V0HwY0004j zMA#R?fh~O%U^*YJleePvq3zqZZv!w=2E{Q4p{i;RA!KvCr|AT10HPv4jkCB3p-l65pejQMhbu^rF75nL}K!1Nf+S=MEA*82f@0Ek0$Y5zhWf@#p!p|>X#k;eKitL+l2`*3x zs-(!93~x+a!!JMl07cU%-$P0XCQ;HhERWA6!E|N`zaDxIBgt7X%O7n}>FMd|q2X{C zKq-?Z_uhLicJJQp@9XP(lu{aXf>1AtogAJkg;NkPX|GmFU?lPdynbyO3xxtq&LO10 zRHlIOr5pePlk?@)1TZX48y7{}EcDP(m6LP~HcA!R8-Nt8_R;_Miv zGf8mCK}pF+DIR6r>qaT17#<$}$=h$gZKl)d5k~_9e7KOrrFa4%Rl%2U+krzp-H7^BWOM^LgMkoP z1}kgm7*E~6m4!J>XHw|v>c%}gda=E!1(XmhX+?0!K}e~+fIu>z!B}bz(6P7V-t$($a(jn>!KpsW`Ny6TfMW;JNpQkueGurUYC_ayA%v!Bu+>R0#;BB12q82nWwcQf zs}?@!^&q6GR#I0o0S;1rfmE9Ca<)tfLDcU92LP*&Ga)Q3K3DEVHTeRNB||R#+2%%Q z1*p!9ycSir5khFC_oAW<5R%CxIOm3Gnn_hvJKeOyEs8mB;DF8w%MySny;&j>5E25F z`^d5s0wL@+M1nwqQwl(WOHwv5=Y*sznXM$2k025tqO<~YJcMds-0IcmOw&wKN{w_n zEo^|OX`0AnGJA5;e7?YG|+hG7g_erQcm ztjq&|T#jJEib}QvmY|N!%o2I%^1959c;zT4X?emG_mgzFj}-{Y5zPT=mGfQIX$v7V zUDt;%UAn~VKIKn5VzHReb^RLWJfkQ|upZ)WCI$csCGaVp($giSOp#PL-O6#KlxXt# zR%jeAu{BLBsH%{b#t3PTZfOx#QX{#YloFitC0*CA4Gj&I&zJY4CnqP7&*#S(V~M&W z)d9{+3EF}xIF=We&XDa~SK6Sq2USqwvD(<7+Uje8Rz1lUe*lDfT+;&KFtJ)Gi(8!# z0>)S}pU;nvkB?UXROTlqC&!D$;uT?SVA+B-YGMJe2ZwuFAf=~lGR|!ZH=h#pD%iiN zeHk2wxd|(|tiIpw_Et3c0wq(l`q<_yEv;KC2_aA{7OzZBPL4azJ73a^g@uKsLZR>h zW2~^AM3DfvqdS6ITS5RRgyon;*#|8P?=;gt+}?>Mzq(>qKuGuYy)DhSwY3F;Sed#* zi=#6e?f);Nr!LS|*cuU)S~cYKYg022r1azv$b9Ccn4* zW}$2XcJQytrS93$iTv}w$ zPQQQY(k0D#-D4F3Kn@NLk}rMfONB@z(%aP3)L#o2w_L)hU45NlbcKAF&ge)MOw0EW z?Cp%;?rrVxE0rtlCZ893I-4ORFus_BDN0FS(CfkBZQa<>9I3cJ0kEUF3B9e&xO!s| z1(QJt2||D!&CNKlWi$MWcSRyt&j-ch@n6Scv0py==%Z=I%0aCBZe9X_X`1rxyYFU! zK)}=8-TkMEqIhaKJLgTSd4*Ek(j35Nx}u2q6to3YvaMb6; z?Hx_%3J1^@^dag~u_+S3!7ZKG6bY`lKP3d4!a?-5G@&CDMAYv?L{+h?tqprRI-q(Q z+wPE3!Zb~G_3G8{kB*LBe(}W@P3QG;n1{7u8WsKzq<%9@lPf^BziY z$EGgq?QBQZFp$>`1ifDP6{W(lS7*!B^H^M59G{+^ersT0K&!rPzncfFRlvoI7vc4K zv-|e#QzMbcXT4r;(AlAuiB;RXGdBvW3R(jyLaG83Ud>}Nk)kw#TGX`4TJ@}x*6lV{TD z^n09h*DVmI0QRvO99IBp2wIEQ+I}s>ITz`4`n_Z_`TDPZ^()t(VpM#KXY-n-VSIdi zB#}tGoX_V|ZXIhbH(dB?@M;0)2DV+V)uwu^>g#Uzv+MbMK9xu$ULGGGAIazQZqr<8 zV)hur!^38OfB%e>GSJb{@dvgqs%2tMzSdK3B;|LbT0z0B?v$}!8^#!}T)Fa-v9YnA zKla#TsimbQ*Zk7e#86s#h|$r}#Psy^bMy1_R~TcWo{80RfKI-V^-wimJz2NKXT5RU z>WnclKRN(e!RhK9u6y?bwjLLq-R9NrrU1R}LG z$4QO&o_eak*7l9~Dd)At#l^X?v9YJGUcGwi$tRy=i;IgjS0^=141mbxa`Kf|Ug7uL zbI&jU;q&?WLZMJ-HM4Sa()G+_wKny5H;~+leQjZ3ArXtko{Ys}KYjS&hjX<|%L$MT zj(wDlIsiabRr8ixZizF-yiH9_cX+*CrO}9H*WFA3s07#z?A7>2NeF>lE~kx-j{a*r z9)Iq|7hjAI4i2vRBf^>{=HSWT;Gpd9?_VN>j8aPXg~Q>^s;ZVjT5TJ%8Vo0`Hc_|K zq0uDJ*(R6EX=7t!|1&l=_T9^uFHijV$3JE@J2!uf6t~xOnm6Vt;@CJBDGX zs;ce`g+hU9q3a3k1Y@lctzP@pd{82hNR5n)JUccv_TBG%=Q}a$OV);{;uGL1eg%z> zk7HtDV#4S1{R?9(M+kYSrKP3W>-Ey=$=d?EIqD!9&T{6=8P?O&bHnfV59+!e@pwGjg27SQVAOLSI-|V7J|N+YDpuL&Go#V=O``jrx2(&w8@xTIoZ*2xyZK0_k+x zn46osIypIca&B(!pR?KQ#pj=YzHsf@we{@60$7KM!J%2x)6??YxpRzjKHt^Vbt#+8 zPG&M0l@PMS@AoUtkFsxOqNwXS=H}+K(b3VDXJ%%8l1L<;J9+Zt*bjd21ASy!uIB{ab{`V1q%TJ+Jp_;$(R8>_RJa~|P{p(*> zo0^)s1A)M<*4EZPjz**V!r^dlG#c#=1Ok3lRjJqOUEy%uw8VN}1;!W*!w{OLX_-tW zp3P>*Gnvf$sZ{FKVzD@qPN(BfJ@u3^JUlGc>WJ%6Ee)#HCMPxYboTDuOCNstVYIim zHxoj76h+w;jYjVd1OmH#K3{Jr6zcYuhz5f}I03V^K~XFgQ7jgPrfFI}pO0&rHeM_i zhqKx2ImXzCuItkmE?ihTb?OwRrlxMnf6UrY6RXAhd_EjGas>C?cb^i8L{v&?Ga;mh z5Yi2xlMvD_rHnXaF$f`fDP;vdV71()zwAsyz@@l+1W|M;jrTK`4mD3CDun1Qc5AE6uPdnbUMxE=H|q}z<`*U qnZeZ5l;G9}pdSa_G!y&3LjMZ}S6hvMR;gCo{ga}X|P6&=4iH#z!_hoO^-kIrc4&K?! z&OR~;aY>`CZOv4D^;LCE^#~vd7#@m@{O=^;d*bM^8ZE@)*aF!V&xb&o)$xN*vV}OJ2|%2VvK2VxLwk*-vo8i zD`nvtdz9XT#WpgwJ!JrPYoX1K5TcEYj(~a@k6Ek$Xk+;1w+k#+mU&_481KLQc8k4` z-6pWE^%IuTrpxt}0_Dwm3&@%L3U@2z76)tf4Q5vEvFW>b+UI6|nR30(&HQ4lAYuWU zo?YVW-~VQzvfgxD+}Px+YuET?=^nZPsOEWGTDZ**vwu?Bcz~l6dxmzQM3Ox_Mw_J& zzM@#VrYy|F)UUH><1(0>=V)#ifD8XDFq5y~8#p|iHoC@EO2)eyp= z=E0S_b2vis+TH`~NcW+niq$+7p|qVnd-ixLm3l)6kqX~5(w{~O!ECY0On#O5a+&>^ zL5}X+$-nDW=1N88N-JPBC!X8Kx?5*yt;9n4KBZcTT;CwsX9n7XHKtyx)h?eqckW69 zN3#!fttBZ0lSfAR`1ldVcjYK<8g8wwlX4tBI`$$b4;{p}3Fb>x3LAA^**(e!6R(o% z%TlQuZWZ#BH#a)=u?R!Wl*JmxQc97K4z5vn2DA}KAxNnN+A3Tl@f-0arGpd+JT38z z!qB~^Mdgt-)HEVMTZyL?t^s33BP@Y$Bt|HFBe7Os5%^Z(nulvKz(~LZZ~LAsS!+ot zMSn7hs}-K6$wq%7g%D|6t?|v)TH0|)sx+=vxLToYtY&HgRIyUlmr$J8GmH?R zc7JAoeVHL#-CzSjHl5}`b{Hv>xJEYF?AHCm600!^AxJ5~JBM<-dw4fPsT9F`@!;?P zA5I)#qo@KR);-_1UPEuQPv|#_0b}Ls<_n(UYqQFZ4`VH^<#1%3zmivMpt8 zjj@}fu(9Y-sKX=}3v|Oya0F{2YwDiot!k}nJ+1Tr9v;-9Q(<(?T8q}YTCdkv!&q8& zSw5e?o=7BqN~hCrDWwL&J>zMgIJDN)YPEW)P$>LCx0FpyP0gJ?efo=`p`o9pl+SP1 zu}27j=Xv*v#p2bA7cbr>l(LquAApfklF4Mq<#ITVgHj5uHHkz5DJ8z|L+e)!14!3( z;o-&z>uq04j4@_yZH;_BFO4xRg&hVIS03kMm3-W1{tuvSk^caZ$us7peDw7I0000< KMNUMnLSTY751HHm literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..6b8a269319799362b644105cebf0e14ba78d9711 100644 GIT binary patch delta 1869 zcmV-T2eSCO1JMqU8Gi-<00374`G)`i010qNS#tmY4#WTe4#WYKD-Ig~00#p}L_t(& zfz_E!Y#d1y$A4AbGvgWBcI@>BYbR@yD62Thf)`9SBnNUJoX`phBn0#FMNdawSkURS>sfX)9gT2Wp%>6d$<$WGCU0sE?8GXxFL)GJ(OKnCiqLRLLD zO70jz17sqR;PmO!T)ld=r>m>0&$6rzAw=W@j4`{Jzv+12_g9yemKHBuxbR|fa*{%! zP}4667;*00Ie#u+zT7=BGV*iFvPOjv2bw7$gm`IEYrU+Lx_jr&ou6E~bSZQ5=1oO_ zJ-fP0Pfs7r<#NCAec!yQqP1=+v)SygCnhEi2KBA;KgV%CZCTbRKqJ?A)v#@Q)N!1H zZ0$h};Zdkt2+;vs?$HRl-2<&cO4$SSv9;+X)J6c!_J1SHo}j!4O{6r&1S6rYHb4@v z?p2}8ax+*8wpE+Isvlnz^cFGZ$)!0c{NPYc5Jl zvVX2(eEJEq*>w!y`aaKdMU;^!Be*p)$K=9%Wuh0kJgzc$T9D2x^S7A?6qJV)g7!p` zPsQ6Bu6|VCwixgYeC9wWdCz4jzd<^a=leHqasKciqp!b4n;oM!)lRmMV{SFa<=eM; zw7kSy{rw0b>2L31IhUcJJbwSL5BU2+nt!hxIl(}C7ky4wr1FhmvH4YIN>X3Ec=52~ zIPY4P)fr?!2sky^#XEzqac?n8rcflWJRYrNn8~hi{>UND9~q+H`=m2j0A^N~xxcu; z*uVf^d-FKTXcpF1QNCiOuughqo}%w@y!VZUiu%64n#p8tT)A@PKh^D$h*M}-6n_%H z(Qb#chkE$Isbh4ur6~H6^`ha~MiD0-aUJYS;OnpBti zq%fs=sm}-u60dX+wzNQ*`qO9dyPOxJJQZbvDv^Q7MfYMftk_XyS%&q2;0$|HHOG=!08=h}rjKCHGRexe*8^`H- zg-dApEYu#i>35QqV}LS(>S=~L9l%0qfzqPnUV@mE40N=kjKDXdB6o_Q0Zq?BW%N67 zzWeqeoOlAIEtIxuT;UrdZ!pr^h0+#Yg&l(>1?PqiG1Aiq#PED;PYr090ZRzJbg+{j zo*L$4Uk4yDRh#%&PY2%{dw-MTz1<|N7@G-&awL*m_`+M98y+HN#lcvWaXa}`t;uxF z&dz?dSS+Tun_bHnJyTT5_`YvcNtR1dsY+k4cuE=9^NiNIVaez7vr|)3U#IrnB_q@8 zQBf!;%ZSP7myHz&k2QT#B12X^?B1x=4@FcIirN!pyLW zy&-qozg@JH|0&n2W!Sx8?NMVIwQmR8W}wmitthqENrG+ffiP4XSG~!@j1OM#)}{6= z3bm4okBTf|ZDG$h#?RiZm-F4sh*PHEu-9({g%7?Wpr82JTt~WIxo6SDW=kxbJ zX;ElxZS6ren|&H=uYYr)>({R@oH=vmr(d4B9W-sSYe-o!AAeO+tOZZa=9GobQ(91 zC~IUu=(C9a)4s2WWS|Po+-F~n2vbf{pKb|e?)K$BLKyxBOo~rJ=8fz-00000NkvXX Hu0mjfA(^7t literal 442 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e64c1925e1c9550c0d104dc1857f096cde07ce95 GIT binary patch literal 9718 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 Ef*>;RkN^Mx literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..006bdc22e64db8772480412a86496ab362e26fbf GIT binary patch literal 6763 zcmV-x8kFUUP)y^oHf>qfg>*>k1-jC&WeTJ^+&dra9*hB64xghgDUb*LB_b^2;wPKmPHLFRMB2vJt@k{rmB?uYIk} zWHLPfU@L$d0JIZP3xHYx#&XINLPUuu2w+|a;RJ9B!0Bi-dT@Mv+|}FLTkS`v2$xI% z{r&x{r>CdZVzF!kumiwf1K5HxJGufy0SpKs_UpQS!t3?+|Ms`P4gBzjKfENGK>+0V z-_>eBLZIp8ail0M(=?4S#{NPG@l_)F5@Mz$+oY^C6d}YkfcJ>#_XiIie0%rq-P%QN z!^P78&N&0nE`)f5h`s^fwu@138TdG^6>t3RcfWHz`skw$-lQ zuImRl=i*8_bX`B7Y1;iCeDHzUVzHFdH)S0wW`bsBX6oD8+I9o@2@$PZsd`orTnI4= z;J*fg!8aQk8iFfPN!10Qs;UfNGh^%p0Cy0Pyi}gc9GVc~kD8|asK3Ae?5(%n8m(sG zRqgyA{NM**jNQu^dx40)colR$0LVo2MOl{r@#dRv{_}eSLk5 zh@J-USj8>4a`6}uJ^kjJZ!Sv{DxL!rMQM>``A3Ygzh6!Ru5<_?{zotv{KtldhKlBd ziag=Hd-r0;jvbE^(NjcJQ%S{F5jGhN2CvuaJ%0T7@v<{7r2#p1|IC>)#@^oE`xs-t zK`M~nD^gfM_(jO_HP+i0G~g8hX`22yskR)xR^F&Hd%%Tgv_? zJHNiZp1EAEdP$P@eBSxFAfmer2E!hw(^=oz+FEkHk|*FphYrb&jg1fC@(UwhHXx$g znwy&+djI|ROZJ6InuI$$JMr9e&;18UlAa@?#&Q}ZMDd6&(TYdIFD3}UjZIBW=YqlD z@W&s2ykv%wG~k!N{3TD!eyC}DyMov&6%lJxD{ zZo92xsr!lw;HjscVrH}X5hB{PoW>Lr!cqdd6lWm>bgo0=dd1}s(Jrgi`pDytKVGzt zi(Y*A;fEPx>>ET>TkO882@y@j`MEJ18vY1}hd#u)IXl9tQb|#@jInRrci(+Q`?#PZ z_KRQqf<5-wW4lcz({C!NJ%KBQ1?ik)((l4+r~fbJ7rh|jAP6uLXtvhlk?a2)Yi%8n zm{eA|kx1mxqeqXvdGEdV=H2#FP&yAi^pH)K<*%0c967jBSdcs9$D!d9a4vYkMa%;g zAP4}SPyp|ae1y40Pub>9IB3Jbc_6E6Ua`d!d; zo;LCcLI6Cj1)30;@H@+Xej;j@Bx&cDzVxNM*At$wh@bKEpZ^^9+;fkyx3~8N#@LcH zsu)zA8Y#PsQU5&lpZ*AMUpR?#b5jNHYqHiuP{Q`7?0@>vXensQi$ap5Ywx`C&W^8t z{p&f`ay+&6_I6`)bMphs*-{eGbv*ykX&kaoK;tST00S-$wzs!IVwn?fp^13Z=fgjL zb`mFNroc#mLtuJg0oT}?N@|17Iqcp!?D_aGg3&M};u!JHLDe-Fq|~D&>c3@85A2>< zc*B11M3V#o#6bY+O*OcwP!&6W+9-G7f*u4P+qS2CB(80kW{AqR$95Fk*5Q$>U?<=_-^PwQ#8axGmM2WK+ zLNFS^^g@0n)7{jLot-^M#3s{6K0vs!y%*h0T_x9_4M~!=_V)H#v(s}%xz%dzV2o|4 zw4!0p0{-dKA%s*8Mg#%@ApB|8g8`QZU%aOHv?7E+zjF?64UPcdkQf6X5Y+|V9kJtq zP1nI{Tsqo&*nS@UGgIIoFd$~j1#on15Un*0uo_Gm_tzNB_{(c|qOGO@r<@MVE_y%! zR@KyF%c^y_eeD*oWzc5E*cPkR+JV?xJW1pTK$hip0Bx04bZXWIhj%f?YejsN3jvQ3 z!3U$$_`=%N$;mIF0g1nb5KuH7A5Kg|6M#enE@J$ENMLp`gwLGQxV>{NB*rrGrJr@q z@zLZsqB;j-1Q0;+YlHJMm=(Cd;xqKVEiQ zyl>B@r)QX;7hil4vMg^TqS6d)9vmB=hcBXo$9Z((P<7xB_Hi5?pMj?Hf-K0j7{aMp zcUoQ+Gh>{fbHZ=V3}DbbpOY{BJnWf=GZ+LHEXL(ICI6mU@Zqh&PoZdPQfTQ1BZhjD z6`l1h=&Wx+gSiG0v7GzLJ&34DmgS8vzW8EBe`N^3X0rjn8Y0TERi$Dq5RTjZ_>uTq z02(Lk8yJGa7buuNsA>pAwYWnRn?JZnv669r0B;SRht3PX&@;QZn4EjkxjYvHT>$6i zW^iK44vp)TK4#eBPTH8 z_2=zGMb#12cv{}r=+)!pMRb8H-J6IPosY} z|6V2mO0u8y@_3qedSrYQeSi84ekGg}@Jni7QiD=j$m3-PqfxwLKaHcK=dc*9DB4*z z7-Q|6b9vpmb;-2kNN;a%2N6|40I>&-agRjD2!JOhLjnZw(WDEX&baXKbsKPdXFGbD zY_J++2p~4v1p|Zt#r+0C;v6e?F{0tv_&A2WZrpv%dfd788Z=p~uo{dpA#nl`z&Qg* zfJ7`G2_9<}0~Vqx_MQGCj*XqeS9-Rg%hrk}ODznN1hxW;fAPMRZ8lrd7f6O8cJACs zJv}{^&6_trElE;crImQYDmFFMqS2$&F^3f& zJZ_SBvR+WC91yS&31i4J4ZCL=&Y&C90XG^gHLx10`{Je$A~HBQ_);hoikv)o5; zXqpBggb~Z!UjFp$8ali6BzR^Bu5?r;9wvKL^KZPLKv=K2#f@_u4=;H z-*p?-)Wz0-rUF6yerObLoE<_`S3x``$;3z|CJ<3M>>dvsUNO^M!eC1voWkke0o|HG9=xlcS^y#X0egam5jQe{! z@bGnO!AJtG#?vY#_Ld?j`&B+9&PO*86DhScayuo@uAZepy7a`FN| zi`9bbTbpC-DlfZ9XcncW{;cQesB6I5hQ=gAN@!uWzrxeXSc(2vNTbh50r>rX@EEH8 zhPV&{>uoh?Fqz^bmt~GXLC_QF$n}r`z#uVnH`(G0iBg)xvos^M zf^LY7GJ*h)FGEv;r^lnFMZXv#5c3ZpVzGJwfW=m=csy!KNNGU+_Qd=QCgSyS22KJ< z^ABQ?)BKv4j&jpgRrN5&qLD}>`IzY%z#@@|78gL(km`IS?R;|8DJ|BMWHWgt(Bv9! z+P%qG4^lQ;q+Kh7j5#EYQKj<6&nut=s;YW)UDwj*fTRYDjEwM5D5PncHqANbEN+vk zhZOUHpt$H09&(D;C(J=c&MXZ|jC6oN9I+uAF9)217coH`aScGar=3{)6-iIKm=G%g z=bUSrHtqBIG`roNOwZ`#U@)jfqfsa4ylSuGr%y!bwm%i6OxgA9(VLHzr8B5(_QMlQ zDzU1SCx3c;DphZKxw*bbHNZKKs;cS?27?(SCnM^4=FAx$4u|c!t_NjVu9_bnV+4pt zMJevVW{%{<)+C-bCbDfQ#kB}P+>=e4LquvMC;C0FEf$G+D7Hug7N3jaBR^4YHVewv zrgGACT@Qvrp`o#{v5aXhLj%I$Fcd|Z)-}n4(aRX&3u_x8GnTeu7LNfHu;2Mu%q<Yn*ghCojYdc2=jT7>RZ;^H>t$?euE962 zUmXi8$48)^78ern(Of8&0|57KXvfVR&B-|AKG6=jT6;Mx&$q_U&6*07FAVSX^8TEi5dYh(@EKQaZR8vL~d!zP=rs zTWT}dPckxzr9WP}y3UMmZMi0{N$DPR%9C9R8yf5JMbY89iQs;Y(-78Xt{ zE-nVMH|7F)-V+W40$5mB;5&Bg;0+B8H`UbCENh2!HdfafaeJ2y{mvjfVHJAfN#pCq z9d%~>dG{*V%!a)A84=dmYS3P5!DJu|PdF0uD-wHy0BmZp;qD?k@E8%cu4;kRV8GzK z7b@q;yr7s9uxtG~tf`N!h%JW&c|4v|qoboQJ^Spljtdtqiov_GqW^5;B%yW>f>i2D2jsN_G>v3ymD-5!fF_KHsf?9(C z4_@1i$G2}mZ*xU1V?*q#rqPH?ezQozQMu4{cgA0 zRp`EA0?-;88_&92u2VHNHFwFfydp1YH(3n0XMHnvt!sqN1sD-zR-6f?r!yj~sx@PG zZx=X^ZDUX0$C>upXx{upv0%t`EzRg{Zi3D^1OPcL7FkIsLf3UZH#c{RbAHzCb{Aaa zD)_C4_uhL?Y}~jp)YjI9`uh5ttX6A7p+btGlny|=(CdO{}fbK14~W6S};95ecb2s9e?%JSBnz6q5^O_o$&kpBZGs3FVD`-I;-IpF^yU7|ImhhmtaEU1@MXW>KQcNxTC_iwwCjftACBs}-aj=pbxcu|Wv>$~ zHS+Tbs95^t21QY#)6>((bY1U1eE9H^{k7!xf(8Z#L`O%5($v&6%NSeV($ccNnx>-= z+X0rg+1YmYQiF4jp`oE84u|9Uciwqt@K?Y3)siNoBxdu$2OscYFgW0FI1YHd-er5o z`LGn*St`9;&8gBhlZ?ab^@bb{$AL&BGVsP5ZV2E^gcMnA(k&e2$ zx^9cbVp=L+qLDyx7E}t`DU@F5zVtduP0y~QoOGYh7dU(N?CWl~`-KxHPWaw?@4b@j zWy#+Sot~Z+TeohFS}c~JuIt_H?d>I*qDoj$Iq9XQm6~43-@2~j?Afy)I-Sm6I2?}i zd-v|;*(+a#KqzxRXkTBS*8GFmMANi`-}=_KD*ATxa^gE4A;jB5Lql&&OiUCEHkFDijRj3iOt^-Jhu?_zLB+cX zEB+a)0|yQWm&+Br;f5Pd&CJZWj7H;4H8nL>S(Y=(yV_WgqA1+qaLk@OdGfzUB9VXo z+0TA9vw#2oiao?-{f^k!*ck4(B^^aLna${Zlj=ef!9fBY}el4^|~GRWS=HguQ$B z8XFoK)|t)bC%d}3?%lL$(*~>6T5z-V<;sFM=Lm&D{KAC`BNG!7hZRNHqbSPg_rCYN zs{W2x)qhKJe0*GN+qTUo%kq%l@1F~WLfwq9`ntM0shADU$5cv5&lXatnv*X*y{_r$ z>F9+E7ltP$CibYRx=&Trk-ok@-QjRlH6&Yg4MR+ZEa>*&irE4a#&2YSdb6`nx?_!aw(IOlapg(WB&@^_klp*)S*L%q6ZEfD6gedGIC=7G61UMN!tsvTUrWsiDh-1p$ED?dBsRBmUvx z;kVsx_bZ(9{a&wk^qFU#iGK3QCk68@7b~U#+34%*lO;*2XN>J)jQv?xSJ%C(R;_Ap zZEdYJo6Shqii-hF)1W8{=H}*tPN&m3IXQWlbN)W(`~#226L|8;CojtH312h;baZs! z;fEh)cieG@nTT45=q{7VbZ28@-D}9i9|jWLL3u9%>Vk=zg7+(KAiC?=}O|F2_PFk{pnBHrcIlSvMg@^u!V^3u~;md z)~s2xu|5W?$z)Nho)(WL?TcWg)b~DgaUy;U}|b=I2;aN5JJ2w zgcwj&b>#f{^U-IYefE<5ru-!l!1nFi@x&8Pz+^JXa?Jj;6Hz-6Z8I8;J!Z4{29wFu zVYOP@OeT}nVzC&_W;3%`EHIf&V2ou5f^&{YB$9Z`hlj)AXe1H|g+d`$Bodhphr_2- zRUHyS^a~-J0GxKaUE8;BpEf)^3`My(-weveB@;k4T3cK3#1l_o^XAP=*L4{{JrUW2 z5FLmKrxQRUfF=Oe_>pM420#H20^kAQ6+%n`a1zn95W*LUL;^!YL)z)nr}>d1N8tDS zFZwg)!(}6YbZpzU4R_ytH~fA-+qP{RYiw+kIp;=`$z)`V83D*b2$|wPsUn2nM5F=G zIOowwBod88B2mBJubn%0j*pLzV`OB6FSSMFQsA-_z`rMa-uagp{~uz^nN1FX27Ukl N002ovPDHLkV1fqb7Bc_< literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..00ee14e8f2dcd6daa5c2d16bd10384b4a8e05b41 100644 GIT binary patch literal 7524 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%0DLgS)QsX~j4pp_{AxnNsxrPf9`tVG`lWP+P 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2fc9dd7292297269117815bed19d016467a63d08 GIT binary patch literal 34556 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�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 z%0A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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372eebdb28e45604e46eeda8dd24651419bc0..258b751eb91aeaed649247f09e378fb1b086a029 100644 GIT binary patch literal 9348 zcmeHtRZv_{_~kIz-~@LkxFk411_Hs|Awcj14^D;v0|eIqL4s?r!GZ;Mf(-69KwtsXTzCk390Ro97UF%c&1|LjbeTEwkG_$pdAmAgXUcGj?*m!(p5k$m}4yMQjursD0S zHOo&jzC|*XsGX?LW;r^%;24|ZMJJz<(%bgC$@%@99EeXT?OC8f=(UTMR?zX^z~kG% zV@Ne60K5@`dn`A2pKCDebZ;Rd^(|WmVf9Xl$CD^J5OLc^gG@^Vv4^m{cxglL+aT06 z7A&aH{pFXw9~$gTXx-uAto+$P*ySvuLb_|t5umoFVBx}6HJ7OHPIwi~Gh-oxd z9AA?YM&Gp0q&d-JR4nG(kEDNSP60EAq<~5IFu9;T&=1K`$|!RgTiQHdXrBwD|_uhFOI*Ckxun<#3|DKI!{F znH@O0zg}2aD4eQl<>yEB+lvMr9X-X9P=0hrzqj8PkhJ9!WcuU>j5YbE-~biOycG*T zMNdy|Fi`FpviYQQ0jM!cZSCbnR;G^|8X79hkieRxtlcZfX%h>~3nTtkZh9d}B1VMY z3jhcXyrIHUVH2#4f0l<3&Kt-QQa;$vf(GSqbyb@b&U zRk`A5!=J4G@OE;8Kp>RNY;cJtq2LrtJ^&Bib3p8~lCjazqSBHQ3eMt8*gj3MK6akN zbLx-(?B4B&8M!nB%(6{*j!Q>$cgtm}KQ-tT+$=9IIqJAQl18;MSM_N!5qET5sO}OG z(@`3FRo_>a&W!uUJ4GS2c0i zJje5^s}p>@z1by@^h7dO2v(F?%b39}qO@C>f>Wp`On{H?e)sPBY+b_lXoX9DD5T__ z$w2x;YIT63(gOQLcPRGnp`l1zrp5L3^&mtSbluI(?GZQlm!taA!gzbFp59@C-t_kO zTLX+8f9K2up2(MwE1C@3K41ETN7)zUv8r9^i|Z*!+*}w6K+K+mViSF?GHcQuFkTKP zpbcjTyxNe}EY`II=0(rOzw)?6e)BLRQ9jyEnQDZ?;aY_F_=&Z(we?w^ah|U3@HivO zkF)WCGk-cWTY{KJI~AMC`@unw7lHO zIh-=PLn6kvTcYvxp?6_n;k2x*EVh92=H#TN{e|55WTxMQA!yK@nm;gYVC#M6IC3kt z_NcqN`w>*}gA^;{i4VVJv1NHVY`w)3Da#Rd?g`h+&d&Do@|rnr6*&bvTx9ECWKB-$ zph_nEq;i(pA(uG{EbnvErwnPgb>A(tD7+(d@+*;ul(0p++f?CTeWJUuSx9*B7flr$k)-kyo(h)QI$v@dJ^E}{shlhu^IPX?5b4;5R>~@cj*CD5y z{bFe9j+u=!v$O0sE*f}N-fDR$$V+Q$gaAiNOUuska@MY;k}JU>DlVuYdvE;1VuwZq*P0?NyRUVxTHl zb4%g0$!RLdHxGUtYBEKYfvrMbi6@HuI^>*yZ{@1q=9i3?5S(9G%F=jFx#GSUS-FlP`OQe`i%p07B2Wa^b>=~qe+UcE{F09%)K)E7X@Joe4Lj` z*J_G^U-i0DWyaE#!{r8)ab~<`c%j2~Q0>CS3?=)T39u>?PLv}vyEdp<;UyD$;-hg& zv%+d3iL!iwDGCnoKUBYDDcJdS#86NZzftG{KLx7^W9R~}6BMJ=W(c^TY;5J9P>~!# zLI6zxKiKGOTD^o%)D%^Li*Y44xj2i;TGx2w#)$e-lEHFBJ!DdNOp=?XuXLgYm`k1f z9{0HD+8>_m)SXSlNpUhOmp^kpUJbkNh14`SP+^E^?R+NT#E`;o7KD%sWcv}2j?^>qh6igqAPjY{cM*`26gvs@2?AucJg-e+DY!{KLDZo|W?>_VMFY=}>(e`7#c; z&nHusHg@ae@3gW5oYQJ!%o5eiH_+ ze@KAYU-rt61<^b^=bG52O#u3%+tB&yyQl2A%1Gj z+a4_Y@lhOQIJldNVL>>|?898@uH(J9m{8m?{WSn-UkVV66&NjivDoN%Aug_|5x=!P zeQX^Nh>K&;-BU&F)yKo5Rbq|9^TUiK*X&q_j;;%xjBzi zL051cUZjXNAPkT^!c!qiMUC{kKIdxl+obY%#gLNTV=Y<#x-R>#GWLLkh14mbMW-K0 zEG<(QQz@erkZ_YX~xA!^B- zM+BvKzI0%gs8w}zf)7YHrh$A<5@HCR0YpU-3rMvV#&{{&4qmLdTc+3nH(W;4G zm+&$h`)G_g#69sS5y&vkD1&ETwc}n9-Hn#@RfDyHw!6LZNvvm^`xVGSI;i{m)~;>6 zsfVi%7M7c{^CWezFHw6G5zO3&EXq7%gHBu)Qn=~FK1(H2zr`=^9Y`o>)jcxzIG2#K zwfa-@VBHI{B{|2I@)cmj0tE#)!YONX8+t+abB8+f4JUH zgCQbH$1^W5%r5d;g~cL%tCt*jm;2wJui&)32>dxM*0o()GLSD+xVcYH)j|M?XcP|x z`7q+Htp@58Afn7W<6#OAjgQ~{8el=8Ep(k+<>0dxsho%YC%>p)4^j#Nu>ZtvFb)hz zXOuGp+PtFjh~hA_0#GdyH|{f!;*7Tvn6>x<4Nws(X;J=|x2&b9!o zN?ey5ZT-8it&IK2z7M45-@PTzsOAZY_4HRnYcRE>PcRP{JF1Qz!Z4GnfnyFL0grul zgV)*pbcF8KsTYyIdDSxGJMVX&KlH;6y$u3)>P+qqTViT_RWdtXjrQxg3UFow1iVK( zwxk^l{n|vIt2z)2NhlNafMeGVk9$Cu_VUGz_>;FWB7RYpo6P z!{&!;B6L3hr$^2rxyZiG6TE?pW8r&WgoKywZ7De!Lf3BmXh=s)02nhKU_v0VkfUz* z1~|A=Jdh&6WjzcQX4VN4J-a*TA*UMU&uWGbiK|1bX{iP;6M`bKMdQSIU~==k5n}x2 z!SLoqrB+)3d`bC(0~>z#``uCOD*KP>1 zFy1#SX4LN+c)R$c2?!C{r?l~v9tR)J>kTw&&#$-7r2;)J)XhbSEIW6S zrRG}g=5vS^kXczjqA#m0zAf5UF#R#eyR3#&qyW*5gWW5H?Y(!4rzzi`4|r*$=3ZBZ z<9Xs~noMM)`(e`{vXwjh{!qdA`DgSofBXL*17=kcm{ z#jgyZb5vV+Cf(O6`Fh5a)WGpQ{Kxw-BEiD2eN!Vz@B|DW9^! zWj`SKc%4kUMMm1E7J2LZU#6#jxZSa5em{ZcxrpE4dqp`!`@vxLOHIdc-e0yvlQYVo zYeV+1TOmLe{+nFL$9I^8Zfyzde3k{bpN96rnZ)i0m2r!rJQ+YTnK|9LZI?c?2Kkk+ z*2X?L%0z#u!_BTqTBDPxpS~64xD6yMd{BEM;pq)2opoAvYD)S(?^kf>B}{V@VHQza zuura*NA4uj(v>q#&Fo%l@i>>teruc0jpn`1(jo3PsaP?1-9{pyQla0}{Y?JOLM(NoNPl{@3)sK=DvGF z#{C4>)rij*=s;I6i%P@ zDK!2)VsnKqC-Ct2#Aq1Ob(->I?|S6w4qoNwylj7P zaLo6*tL~uZ3o8pH#Q+_=rNve=l2zl4gwNCJE$q_xjbnIjzk^#l0czmAu{BSqF75kl ze&J)ge}i#S{p#y;Vwpuu>q*lX$!@UXLedO8Lc$FyWWQIoR-F`Ci`C1HjUqZN6ygwESc`{5 zh!u*Z_RJkwj5-KW9UTCf>9U00j)Gr}Fpr-H%V9gXujs8L*r=#3J7 z_;Y1Pm#h9Yc`L+)WF=GmLzBuvvKi!gwh)z!g>m0inc_Z|Ks-VAq2IMyu5U*vHU1W! znz*P$C}U1XaIM$UcjO3QC%uNUW)vTMuzO(38(-;)*!tujD^QXhVeZOE)#Dqqf2P?f zbS>q|%eT4EN6_}+2>wnw`D49A=}+9x|AUJ5MD4Q zYS7B^Ah(h+@pTBaWqYuXyRIs7x2!*8#J!JfLkVG=YwR@-QpFc7bxa ztF>rB7gzUGdv86Rc5?ort^X2!!;C`==Xp2Q*SX@2*KuElJ(;cEV*+h-c@bkvyoAVI z`JrVO<-&`Vs(W{F)PA*ePsEx(AhmA8nRNn5=yoYQZZnkoUIA7t7iL*soR50E{@prJ zQm#0h+}E0JSUCms9eF9y>Ptj`xMcjH^lboSXZ$FNWAzyCz?kGFWZ8oIlhv$o-T3;?Xo4-gHiRV(a3p)aTEWn&XL$;XE(i9d_DwS(#h?RJFPfERf(zCyIoFx?%KH zILw-Cy#2le_yrspe_-m^=k@Lr{z91I!%L=478s3;Q>M+90~o*WtU;eJaO;d>AD5In z=kulOdiT?g#U2p{Q#!&!h~~*znOS>R6tj&6HN+$U`GHOK2BzrzkVA* zgGR%^CbfIN~oyPY~u7e@gkCvO1samUgKt2(}>*K;3GEtZE! zF)w&x!(QM}Vt1r+A=(+MSfG8WZ=NY)sN`F()Dznm(r}bT7?H}&vD?5{iOu9Q8a!^R zbE6s{)Rp9$JQ&7rSY^wgipo! zImj3P{9*a?6pY(K&T1vYblyTzhES$i?=$l=v<3*2|?m$vN$N@Kd zw{a563Il)(dUp~1zKa8$NtMwu<@@D~UmeuH?T51gr^HIc+W?ax+0%;!n0;Pyj}zGl zR?cwRRrauRm52Zu7j#%HFL)2{b;OBbL_lc&wPpi#`9wY*W5MYNzfrt9hl>FRwCxNu zZ#cn-AH1N|?1CS9kVNtgN&;HRBBqd{v+<|e=qn@ihm$%>rj#`NwWB2elhy1)X>SQS5Vw#uCQ^be{<7aWA;3CZ)& zR5Ys5Xmt_l;cRybGb3Uod0*TD+O0=cU<&>2CzHNfJEFEcMG3!4LIYc;IDgdER^I}6 zO+O;wjY~g$@a2~N)<1Z!&LCfCsa0Y1I#??gvb25CqFaVYGw1#0wz<+pE#9L z=s_9B);GRa?>BP@ejRJk6*%f+4yz6Kce{}%;-H=58NOr&Ekc~=q z9JiRk#}v7&ANCH%)Bnn9NFwuZh8o&Sd%d~Wd#`*_2P@~miRNF(YKw4`ymhT!Iz;Hb ze=cD27mcoj!h>#ypj|}4Gguz7pH?u2PeB6I2y4x&Sn1BAaVAt_%)w|UVqUdGz$l) zW#)pcQBJ<(CO6jdasb3NU`nCJ?uAU&R$qpn5jXi;NFC zW&)JIQb^wFIrNMHFBGPc?rWX-TfT{V%U4lrga_v9=7QaS3Cnw&0l7kkth5&de{J-P zIDpt9l#NoLML288D+<(qh|K4i*md53dyL|aBSYN~n9CLxC^cC*f;xpWmAri#;XJ;7h8Hqbs#DTI%4WDC-(o@b%8PTA~~ zai=7SHrQE_XSxsC(`z|wsma4hDVU&?2Qa9=A=NTd$?Y|H24d+vj18N6W5 z=ln$Kviv2Lz*z!_tX~55nZHE88oxYz8Ox2DI2TUr0Xn#bPELG&{{jMEr>`Hq#nssA z!bA?|5MYhK24+z``(=!gn!1Zo>Iac|RP*u8nqyp$yyIm91M7gKgY_<$?Rv1^r5?(dATsL=-M#&l>nDV9yLe2MC}lUntYlzQrBBZ*RNMxS43vE z6)eChawVZNP9r-_L|z+i9an-m*A3Fm4NW7INs6Uj9BZPE+qYt{!Ccu>+N;aU10k`| zsM*qxYw*WL!0Af_Vb=Aj4@tw}AHyDnu-Sea{dKr$j;6g?Oe)d=y*)-#`tLi7u z-0b_3@@RDe6EJ}vuc$E?z)u8-oV;OA%q_L%K3ZOgxD~xH5v8VRkoqD_4@lG}*RrJT zUbf+8Son^1Nkn8KO2F$#WB5lB6dbS6hCr=&u)*iOl0KPwD@iv9P{l2FvAYDB}bj+@}fV({kK|)eohoK3K9|kazPco>in`wq|n(w zOC%X`6L9?h-~8|XX*$jz+DHT&Zl$MB6=QrR`IeORtb{f^AN@^_v~vf>bA0sJXSa}1 z*K^Z?#pfjq3}2vBKCV>ZU&fK%a0xGSC7Ila;2q_>*ZkNT(_k*UA26rbX9O}RVS-(o zwb_a)(~63QS;5F4l|5M{Z;^zPAz_))1`m~fz_fUx>r_;kxS%v+^@|5UHR;dmk|;YB4knnO`_E}i<%`LJn>&8c^eqWP^LdT z_mHu;xM*`C_s{O$Ho*OGsUZgN1;lIumq2N#;B1m10q>9^BA$LFC8fp9O%@O{4KthP z(MpRiwT*LCfqZ?TE^Bl4Cc6Nfl9IC2!QNg5tENk0URYz=$j}fl&+(40joARz+QG^{ zGgB)oE2$Y78J8&S0@ZH;&dvv%%(f(88n7rsLjCo%Kj`h6{KBtaY-Ea)5=ayIp@TBL z(!i{7WZFUUf4?x~XqIw}=gJ0=brGok4k_R?eVS~AQkQ+$+;T90!6Spff#3c2r)!aqTsdecAqx#q!l@eWDf3gJ z)9-wDG7XjLTYU~c@FppHMgAsun}va^_Psn}`95i-jq$hFhYJ+CM{yycGyY&9zyJ>O zyI#TXYH9qK*G?L*p<;W>le7*%$OYlyW_4-u~e) z4Pa_*ZLO3udTIA7xp(CKTRTF)+1VLhsaCE`;IE-1vF911RsasP*Lf+Leb%+=lG*T} zE!y=rCpS)GZ8>yw%{`)$lB$=7%cXli7?4@M=u|+#9tlRY8aqEfKP5}c^^%T`j(lTY z3L`RhRLfPlFp(>ksh^uAy2X*|^WLk1_|jj;>`@x}Q;w%kVa3zG-@~sBZny`5{RF zm!ghtbU`0i@k}&^2l2|?n=H?NV{5>e0!*<3oTozuWTtP!-^mXNBLn1gQV#z7sYA)@ zSowd@g~7mUA@GDnUgpU`{rJ?_SF!2FM$yz~6b`Y)058DqW|pt9lnN-SH!~)ZI*&$z z%C^Zeaoqw?FPus6irF2L4J(>7AAq(FX{m47R^}a8ML(rLA_Mtuaj; z(?5!}ilJj(AS{j)#774tDzl}-_Ji4D>K1vYh2u0dH8+2k<~DXtX)m(=F-Qh0!lF>) z1JE@PN1M-yi=s+pyTV&1C#OV}D8bNY;a-w)D4w&C;PCSE%TEiBj*rJocI4}p;#cEf znz0PK<3vs5Gee-mC%W@*F{&G-t+p%t6W9dc(wsMP^v2VK3S?sp0ab9Po=mEwL}LvM zMLimKsmMZki#?h+gjFOH>Xn31HSquL=X@iNvN7Pb&b`SILDaP(fQq7~0!;o*$o~M- CF_Gi| literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd8bfd3e39f5795b6d6ade467c597fc19d38bed GIT binary patch literal 45316 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 + + #ffffff + \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..47451444a18ecf465c5d9af7ceacf3984d91fce5 GIT binary patch literal 76623 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..b1f58f0002a1c673815250eb726e609f9a095f8f 100644 GIT binary patch delta 1729 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 delta 1572 zcmV+<2HW|D8MF+LBYy?^Nklc)UfJ<2uenUn3ARN>mf|M z+(eagCX~wv_9N9Br6dE4W@{R1X8yU75JVAXqB_2?1W&7xoYHg zkR5NEVWsUG^?wLzRHH9Aa#eCDK9NvdPE(De9-HaQc(6~^lpTe2pm3&x9G1K5Xawdi z4F*DRWI%>vgEBPFqaRR51|&E>B!fiay027YsK+Vrn=1PqDKdi{m<&P1nQ3_Gw<%cH zHU+slT8moWCbIKH=(W3t1j5BNfsIKQ#Mzi(J59kx zT!xVJ&SKqb4XjdxWQV7$IrZ-{l-x3`7M}qzHsPzP1S_$c=96h(q%b9ZXPvcV z;D5oPsau6Q(U`-YLD*G41z_cgz)a99av0W_U=aHAj?mj@2KZI50efIA zO8^kn_?FjaZ_hfbhSh@3^GzxJx*P{Jc7Hi*OHPZ!wvEV2a9XKq###zPPeRs75i0(W zU?doBGb9yqT58~qn?wQ4oCi3oWdc^W%JAgTVR)*l33@Ky3ip4Rqz14Wx_gwsGYGq) zMY~B;*z8j>WF8xV`^#!USYHDVZf}I{OZGzBnutHA1D(}!4{};5>;)mO27l7F zHh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG;P%vktHcXwTj~+IE(~px)3*MY z77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC(zYC$g|@+I+kY;dg_dE>scBf& zbP1Nc@Hz<3R)V`=AGkc;8CXqdi+`PV3Vc;#lxQO~AoO*}pfE+=*r3ffZ_YMC zflq>i%a-`Xw)YRuK;MUtq{SGa7vtY^gg0bKSp&F>y|A>h5qhqSvgdtV{(lh0c$xz5 z;*U?KQl%W)htLmD=yhL!@aldLHW(=H00^&qu7J0mA5v0IaX@pn_bKobsC(e>(nAjI zzjyto3Dmc!oOxjlw&JZqeL%+vsN0Zy8@1@rs~rRNAqO?umG&QV WYK#ibz}*4>00007mASaV2SX1c4o{{O13?rI6cP*s)VL`25M!+$lyc~u>=N$Q8X;hdWl zC`n92#+*!&8S2ygsVXLIVUqot)I%Ox44MU@pzRupN3hq|HOq%nM-WZBPB z7ejHA8~!0cN&Sa_n&HofEJ`DiHBNqq|L?8dNkUmiV$wGDF^Xcvj@cZ0WG2sDa?#k_ zKr#Anbq@G#{eN#FAM#OsnTyp0%)5l9gNg`Y?Ahz}2#leU&y5^*!;p5r&wR0nGXqE7 z$F%!BL?CAa{%vh?f9(;_C)SvS%2^67Hx{u;f&q9{p6%@O!^7wN{(2MtHi~W(@$0K~ z?ml_UUbj0UvT=C8&#V9Npt(jEM;K#3EQ-V6m@Gk6eSddOhtdsW?!9Po_vuS+oU3xZ zQD?r8Pun@A(r}YBes**IAx#@XeLaiG0MRT7$s4 zv7kg`I=$UE=GpEM8|{ccUhi`MWs{qWXW3|XSl{om+v)Ms>MFHTk)_H>*7x?=I_lwd zi@%y{e1EaH!u4~P0SK(ch?%Mfd+XM%J4q%{th_l2X@{O>yTijb+pO>J(}^PT&e4xO z&vtiM-Q8xVbBG`~>)1YO^P=^J=HWIuE1W8o$-7`OrUB^f+qdr|(;HafV)XJb%xZ=P$C~>#^3_VY9tQtRa_b4a)iA zRFR6v;KEOaZbYaS0BSJMV8mcdK%|ylY>CvOntp*y z6@OCFNCZR-k+-ONB5&Si!T^@g8$u6?fGUC^*1>$_2L!X)ok@m0YR-Ta!`Zn4feq+; zI{;NEILoPG39pVYw!|uk7)}<7c~H0DYefirU@zP)mpMtKe=N+}4YZllq@_WS+!_B5|b=oMASS;4$z zAA2SA9%lq+%qX4lutJR)*&Yiz`Fb1fF&X@j%CYfGa08iqh^6&lGfTN( zl4;tb?YM_q5-d$W6=@plNt>(-B}>N7zfAYjH1Jtu)-|d9G|BA$kg-U!fYRPdS$4C^ Ye_@S7mQ({%+yDRo07*qoM6N<$g7v#5W&i*H delta 1004 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 delta 1906 zcmV-&2aWipC4di*BYy`+Nkl^fDmF(5(5$|?Cx}D zKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q?YG}tx;sY@GzV#^0C$Z`m}blr)&(OPMHT6T@%AxHOWYGG zm>@=0?<)?0r0XK9>leRXyD^j4O4bXT!@LESVI<~>`yB+S2b_f__vvyMHkwGyyXedq3usx&X*}E{O;}+nJ#G_xm zJbQX5 zuFrVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~ ztSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Yuz!}~S^-;|MX;9Py1im8!}VY-!u4P+ z!nLEvx?+Rogo+Kw9OBXy&lGIvJ51_7Hl6Q>*MAJa!lMDGGML530`Te&0ciU({DC7` z;RKg{uC>($*mdXnVQQBjiVyqYC7mf!Z%e-Q!?Oo{ufu`G3CAC=UjiTpU<94UTFz2KEDuNS@KKkg)K8!v1L8RUP$_! z({LG$Dy&JLEVpiNVe^G(HCbA*SpsX?292)#=JVQDUMp-cOJPl`+yTHTD!AOit-zAD zptXYa!q%OVLa^mo25b7^Z>kE`3rqgr-G4i;Lw<+P(8khESW8aaBmxfY`WS#6j<92Q z-++&Y z$gbH4#2sT0cU0SdFs=*W*4hKGpuR1QGacHFy;`# zR&NJkbTNp}Ee5f08HmLzK%D(q3@lH;Tzx$?VT;&xJq-KyHV__o3dD)?KrE<6*iXV0 z8;6<{IKw@dyDwJ90H5^3h;|9?twz{UGr|>1Pzhdn6W(r0ifeZd=JI+AAz<~yL(QJk zAWW))+=`8mGj|J!70oF@d4B;WxB=jBM1bWWRBb&1!ie3BUzOdm}yC-xA%SY``k$rbfk;CHqifhU*jfGM@DkYCec zD9&E@F9*za0?~OQZiDE|Cf;;0 z`uZ%H=IeGyG^H0ruev{yIVARgwZUG)j7>F#3~dh+8DOtPByR=(VDhz2enf#EjcXCI z=NUPYr4@S)GhX!?s(0Eh(nGe!y$#$r1B$||I~`wPhUuCQEo;#Xb$EXk=6HgBBRd#c ziK|jN$e~{zV~|;*E@Ij-Z(+tI^B8RW51ptE!nMnPyZ`_I07*qoM6N<$g4KwOA^-pY diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..b1f58f0002a1c673815250eb726e609f9a095f8f 100644 GIT binary patch delta 1729 zcmV;y20rCX$k@z|h--s6$326~TAOS*12%#lx5@(%^lX%DW zTs)Va?sHD@FqibSyJsemOB&70xm5kD>QvP^rHnBmA|y#fP=89zegm`rH$h4%(lWD1 zM9|ZPA~O4AFRJmsWyh84&6w{EdttMlph0o`yw zv)^W~w#I|KLrQ*-4=^u4`jO$^XC01PL!89?{eQH{k3QJtXnPZ_;Jf~i|1{g24`YVL z@Q+ug>{hGXs?~5JyzI1ja&bvNigG4qCy_4iEUj{w`Nh%$weT&|1!V9ZotI ze7LsGPY*w4r&8r&IN)j&(vOCm^)6|JU3RPM>{jZT-b>=htt3U?<8HmeoqC16YQW_% z;?c<~2C=0%i0DU_57%pav{|PX6nN3OqS^0p6&Z|-0L91KJKWpYWMnO0Jqzha1Akm( zX!Zy6qZm=3Gj2^u(s}u3c8L&SEhw;6E+OJ!L}5i^MIoZlO0iWgQ7QyjQ5dJOZafbV z_#X9Q8BYfo(HN&OP9cfnwx}vyyDX$N5yo0-o*f9gB zltw8JCmzOWV6u0tJHov6(xo&vihpODCf|;+b;dvh>!tw4tDIp(c6G8@pJhiYk!#sLi^R zECnb)QET?AMFP*q$XL+S#Q@cU&rYQb_>*&{#tNX&T2U{Rs0L-6cvv?+$A8nkc};_b zkES{60YzVPv{U15eOx!Kj9opYTHy2f{w7{Tm# zaqkYjIOfU4Ipu;sD{o2HW`E)E7d;iPt!2IvuVF|&+?PFcLx?tz@`Ptq zkhIK&L6V!qr=P5M1lOMiS?}t+@^-D%<#n~*mGYWGGvM#h!V{6@mE>Ijz0Y{wx>=%L zwDEm}ttm67j;nI7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~ahS(%I#+V>J-vjIic7FmrfXn)08SZW zzL?HZgo}SSNcu|m&n`&XRLWEe_q?Rh_`)DQ!Ucc|OZ-XFn511rB_$bP9dH@wh-Ggo zqynVM3)3?_gVf#>E5u8iY)EMfQ#c-AONh%-O{IL)jaDpDp>fGZ;* z&NNa1u7PwxJb%(=S<`N2yPs}=Qd>tT)H6o27G=V5iPc4VS!_#@l|b>qnm9t zrveTdNw3GcyxNRs+YhS;I5HWpo!3ygInT3 zP$EweZn5FmW{(G2OmSWnlaVUrTdi!)jr#2-s*s1Y*W_xKW$+MV)+W zCJONO)jWe^^@a6LPGuFcfUl@%=t@<;i?RwP48wWx&VbMLbZu~j*zqUV3tSiqXmuv* zLdA3PVSjYZn;Sj4Qq`Z+ib)a*a^cJc%E9^JB;4s+K@rARbcBLT5P=@r;IVnBMKvT* z)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$KvMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y z6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nhet(}(@b2R=TnMg(!~JoOB@~U_c{58&x0vLE`&u6Jl1aUEMx=WS<^6F&44hq+zu3- z_YL@*xZ%^Cib8GTu|*xK0`9Mn-Pm>9AUJNoFl&j-KxEN_kAlACY{ z$$uG-fx8)AdpOV5PKzI?;TLyZ)r=v66R`IomuI>x!+GH*&chH~4;$pUapo+qzkiN9 z<5@h%5QL2t?hTdv#T`vf9JrKYa7=W%A%T-Zg*<e+2=O{vx$^4} zFC06^KjT>(Tk|t13k)ZJ8iKTjKw?FACl`;u#Kx8F_~|Syo`Y)*u46%BQD+-het*Bi z?&DuFlF8#(Lxtca1NV%iv%qemMnJ6c{JImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$pt}{a=*RiD2Ikv6o=IM1kgc7zq zpaZ;OB)P!1zz*i3{U()Dq#jG)erW`rGV!8YiTcE;xq_^g1lF2L%K5-fW6V#bE#SS9 zvT+;sezt(~lJ><+Gy2p|Ncw&Opk}j6l6FjiD+x;i=}0=DsM|lR`BgEDeVmu{s-k?D a0{1_&;gnn2jcRKE0000f%Iv;HvdTt5nGRm0tE-{ec;|8GR2MF4;Wov6P{cR>|BcFIoz0f;I)=@I%UlsS z&$v0qCD$g)Co?b0S0Y?dE`&%^*d!nHa5--tDB{~$U;6k;j7#6^)>adVxa7_>k-Vc^ zP{v%$EXZYc&o!@X7cQeu8JZWvniSfcUBuR7`h>?F@R*63+crJq(%gBIo z$5L0F53`45ol<6=uXC3H;67|w6wUKQa?yG|06xhuGXm#PBtO?o6Cb`T+mw7wqKLPM zikeJWS(6&*YZ_(9=R6om0mVw&AGmao2N7ucUxf~6+ zj0Pwa^{~cbwN5ptl+wY}BcsrK=u0_Q2h2yFX_T#*xNzA#jmySkQYNDxk9ctWl&_8- zbJROU>x9*Mlh-%y@!I+h%e5v_2n7C*Yi(7c{!UVOvz&MBiLL1|DLBBeOGJmbrk4>{-@6YIpfZjlZ%XJNBt+s39A z5CRPhO z;4+Tb?_BWYtj*ol3cIW8gccxc>s^Y7n2<$0&WdVPTx zogRO&u}Ubzsrlw^_T!lUIXK|o9z5XN_Ay#3o_8+j$1%0g4=psBXXmGU@c3&!fBBSt z+-D)Ea6Y_bV{w^K1`|hZEw#9}vdzh5he(ak8WaKngh9xSrA@Y%)(C@eNY*5;EJ&u9;Z zX}U^i5BfYlJL1)~8*DGNCJiB!0lTZ)R9<_BN2dq8?6y%lVPmn$?&?kMEN{}NELb<& zhJQ`G9GYob2Fyl@;>r0XUmSMmMOi{fBBgnF+To+ULv~k|S*b0|LJQ#Vvd^E6+nf#} zVl4=efaYv4;^X}nys^2-y_MBTdgRN%Ad2|<=!k<}k638}DG*w6If{6Aa>)JFLs|Xqt*cOk5Be`T9n%{7K`gho>hLTX`klJ2I>rXy|GS8Hv*k+yk1|9qGz_PYa)`y&!1 zCh$NhxEMx!_;jDo4^N2r(j0Uz`0U^*hrRO|NF#-yQCVQMzQkI+$x^j`RVzJ>)O??>=R%0t z>nsyk+lp$W6zxI8Al4*0=RhQ}g740{y#M7xKHWd2AH~MzKz9_=jS^y&7W69_a5^0F z!ILNa=E-B){XR-hfB9$-$6O3YDGyhCN((NdgwJ0-=ffx8@VwI|R?1rZ&Bo}1DJ~~w zzr&(qnRRy*V_?cuR}&fpk|R3Fb3U;N`Dljcmhp=NUOfm zyy$fK)uTsft@+9AJ8Uj4QIY9hD>R9QL<>kyuUG4%=|vGA?>|PN`038;+-a^+4J*uA zab;i8k5N7^eWk-YH#fP_Y!C=Z ztQAs7LJ^`#$Rr2_Lc%D~JU+kRUmrf;pxfcyTerE}TA@*?62%E12xTyKU+O}IN(-#k zwEKPjd+!nFgC0M=wafk0O`6p@l^`UP63HyiblGYPtSM)f`B2H+or_`2ub&+8%ST6a zM-iv}0Y|+)-O&h5LLfAO&`6=E2Cz~K*iQX?b^DYLaT)d1FO zbzWKB;FZ<}YmFuDE^l(9xi&c|xyYB|Q;y6WX!EX(vg6yuAf`QtxQt?+U0m|X{we>t zcf|8f52aEkrp73w&{U+RUJq(9`rX`A0Xea?67Gh!7X#~YCG z20~K}1WVPBTgy$}+kJ!G)eU;lh^J?5{_yez-<-UpGwdUTnm91s1WhH-)WeXq#v*^S z^Fx02%3o3mLht2;8C0%Ik;$iWHqV<5)mnoP1i)&&!fL&O23}uZ;?0dF&4rME`Ff9+ zz5Y0*uj*s0G?$SgQ6pld*=p3;X*IdO3U6$zuwJk6&tE;{+jff6(rTI3MWJD&H0Q%1 z&0&>hwaT4V3$$jZwZhHjGSwj9)BR`klU#)|tH` z8!!BBjLo?^_gVneKytU$;P38j^UX zoh~oBUAn_$>~pnZl%0X5J!KBgs21e}pveOs&^hwu=MX zt&DAFYGJ_EVvTALqLoAmg%DX3rKgn?`iP8aVo(6A)oLtOsuO2Jn!f2lC+B=)UnQ_u zt+KpOM~Z+%OBk1sNhHIJ^Yiw)0;lLoYwFuswtRPmuuEVykO(1BT3jhFK#U!dk3RC9 z4$@=Um>1IfrfiDPl4M*0Tso&00%?g*NQ73?4pd^s`DMrqn0z2jMWD6bSpcMqvbr=e zV7%W-YtlGTxd^mH!d0s4tbve5q0)?N=+y>HWkiMvbr!uElt?2#!{|&$px2gy+Luvi z3s;{Y+w+N&(^`#2kZ6#T6T xH@*Zbk7_hCcGd->NPpOj(74->Lz5#n`j9-b)C*R z-)qN|KC`E@{Mg*z()aGn#CfS9XgM}VPYg>8N(tgWyeZ=RX-;W zlt4(CroXlai7QR5cIK$mSA2cVWBR?AG9(?5spEtirx7!Sd}^(63g_#lKq7=1r?8mn z;3jX9b6}dtGCk<2Y;&f0ZFS!!+Xbe>Jd^7bVlumSM+lH|T+4JCdzmR(34~-)11G2E z+}ct|0wh`q5E3OaK&%m3Adq7|OJs=gRv8Y=HX;$zHBhI_R@-dkDs@xeOz@?%YoY1J z1NBNkD1&htW~!#fCtA&<*reN&cJO+ol17cba-Pa{WEU6?rA%+JvsBG0;kXuOSz*>e z*G-h~q>|^Is|NbgH@jS1t5s<&q)yOd7@@|F5K5rrtOGK|>S4foqlOTYL}e`@y{$&8 zsRoq6!))zJAX#3hQ46bR2B{N;A{k@Q32#UrS&3<^}p%{zMqC-KcW6 zm3}UK)fL6n>0;bT^OS8wqY`p&Wr=zvM3EYtjQO+foYt_}Mplsln~M!r7Sat!0k<$N zY_kqNTjy*UW$Ks5#o6zv8|k75DG@fZ=&Q|eMNzF1@}sQ{{`$^Mww4-*F|R_9Fx`NP8fMvN zGv5z1C%J^V@Drrn^yfRP2;luM5BTixoX#jpcN0GjtVqER)|dFFw{}>phJ3Vl#9^;b ztl}y7V>J#~tJipM_Z1pp$OljMc-A>*6vru^o}{quGy@T092HWzFB_~t5~9-Q*@tV3rMvAwiF zqY}=nnUNHNTg^rO@wNNBw!X?AULNx8X`8b_pL!@+snxyzs>D_EZ0iXjX8&)D%Yjo4 zvdnimRcXy2R-6xG&Ib{LSkbD5++13q76vo(O}UZMbVm^v!-!rK6G*}BW`kz6GSS5q zF^SgnqnOTcNH?NYbhN5wE9bo!15mR~pxz}!7-hk;{o0d_8E6w}JqFW=cPGD^w<{3Y)x3Bh1 zZM5w#m3)oEchqqiGLOMUSgc477x}KKT(4d8^CZnd7o+c@!Kbt<9c%@Ew+lS~H6fpDng%EP`w1`Q!>&1aCfo0}j$H~5kxo-W;%P!*eWuc2o z{R2jGkurF&j2s)eYLcyM&$G_F7}wOroSXg3oP}NWW}ZdL)EFC;jqoy&Srl=u=1`^v z=hvP2ZcI^Y|G!ec`;{pJWumUAuI9(*iDFmN%9Hi~#+YL^=wMT}NEx4ObNw<9#HX_j z^SShKVL~60m;us7i`d?mjU?01A`EE*tYxVPGurf-r!$)=J@u)a4HDR%o626tKvSW- zVnw*EOuZ{|ny(SMbhOE{e!1v6?c65EN7sp5TRn4~Sc)1_QPc31kNmSjAZ=?d`9@$G zW;51CWeRkeF6v7^TdA;}Fif3H*yM7k)^mQa?jo};n2Y4+xYE^B^tyoAg&TcxZ6_F0 zf0rETQ?{rp&tt61Q9fX9>y#$VQ*MgJi%OVH&(IZ~u7%0~T$?hkBJXmR4Fk^W7*n1L zAG%}};YRC8#GGJz?<&BiB4s*u87KKRqX=%4Z7e>_XVW2BYy`jNklFQtfgmaf zE#=YDCq`qUBt#QpG%*H6QHY765~R=qZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1 zK4#~5?#|rh?sS)(-JQqX*}ciXJ56_Hdw=^s_srbAdqxlvG=BhaYkq$ewHUPpbsRN- z8b*0hBN-yE`ach%PN2R+y^b1xyS^vYaA%P{0B)C}TGSVIY9nx4Q57f`g-BQ=3(v)D zPe=Wtd7%(WQXl0E1}1Cz!nR|m!dOgn!NW%nYBh5}NtNti2g*!8Xk4x|Mj*C>NiaUs%#fyzU5=HSJJNOHlQqY?|vw)nU< z2QMMS`lwSJ2Hx}P6M{KbaT{e*9AT%9eI(=l&SYCYM|Ig4rI}dB5qd~wj*Nx4QJx9# zIBAs8%j_7~&YS~r*CZ9*v7r#G>JGqH=K`>%Cppo5K7Ymi`@M4Hq%TE)WY?~6BEcUM zP<~#WN8ug07J`z4J}B(;!E97f5}JKL(X{rPu)SY0B9!TP_yhs?Hm~6u1@Dj#7NDxT zd{CK$s#MKEfIkjM={PS|7%w9Lck&33!aK^qBS6Xz>sN&;;@I6+q^RQ>aFs$@8v%HZ zxenykd4DOxJ773GmQ_Cic%3JJhC0t2cx>|vJcVusIB!%F90{+}8hG3QU4KNeK zmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u7JyDj7`6d)qVp^R=%j>UIY6f+3`+qz zIc!Y_=+uN^3BYV|o+$vGo-j-Wm<R zS$}xdX~O$Yg=geSue3vW@1PX^2Pqgc;1#9_uPTP~j9w;ZND^rqkiuhAB8Yn75d}l( zInN4shMvYGf|$&hM>@LV6yMG>^v=H@#E$v_c z;k|a$2M;%S5%$e6j53blnKqfwHmE=(;D0K+l7~0B^#+XJeFJ88=!a+rJX5E$s1u7i z^}~Beg*Rc3BE1mpf@k`KYV%(b?7W;BJgR~O5bcC#>Xg1L$DatG2}6PBj|(s2#67Vg z+6~Y250zrAhS%%7L{8)Zp6LKbxe`)?r-it%>n6kA|=8iMUiFYvM zoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS*ZdmT`g5-`BuJs`0LVhz+D9NN za3<=6m;cQLaF?tCv8)zcRSh66*na@qY=&sd0?S|&MDJ}O7BnNgc7XiN=fOQ^B?u*J zL9DI^H_BDH3B*!+A=rxG>mqY4 zM0QLJ!^4D;-*^T*Q{Mn##xf8~RwJw$1h^p#P^_xgK)hf%MBBgS5EEjH3V*NRG`OEE z2jS^OAQmnMao*=3me)q$QMnh|=R_{PXcGmoX#^&90F0|Y3GPY7AWSX;aVEO2bPYO> zfNO|?7lCL~ICJw=F9o6u+b&CRf6WQVn}V*J@g73MF|WE&Q4DY~AzGMNxcahTP(8<~ zYxxy~;u`S0v;|xX8%Kq#E`Nv?IgtPy0ghS(;=XPW=B@(|LUC0$=muzUVhIp{y>Vup z?1QLwwr<}U5az8<4WhY;g|fOr0JhT0Ri2zkJ6pFm4T$E2Gd)NL0r)J0wVqVe+n)AbQCx)yh9;w+J6?NF5LmoecS@ieAKL8%bVd@+-KT{ zyI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^EkL$}tsQt5>QA^;QgjgMV83iI%^s)DX_K`0jg!)|u7T5Zs=Fm=Ip`s2bC17?Wgj52`x{ zF)qCGsQXk_u6PxE^HG=RsaTF(1Rkk+UXZAgubV0N&N?xah2Uh3^Cs#l56?g(R{cTq zPGkefkY@O5Mm?BRZGDI?1^+6lFUF-zrk8I7P)6UwrVv|I249912?sS(Is0lob+XO5!3eAZCDBfWb1@dS5EjhpMc~%Fe9{ z7=~U1qPwdyU%q_%ds*EeQ510iAcTN(4gumxh zvA#-+i|!&csO$L9s9Re%MmIMsy12L}uK6}ZS$r(hG|@z}=tD7tQJdR@3^ z*T5q8UBuXM6}e_w$7b1OLW>MV_EpxE%X7}cPeMpuz&^-)h%OQz)j6)XtlPA&)vI{a zxwbK`>n;l}5=u<8sqcN1JhTz+8yjU;Wt!&;s+)E(*|nbP{!QaeNsdjSU7^7hQ(b&A zDX_{L-53Gk*cFe31;Vp{iD)0K_Qiizn$8Mm33Wxs>6DKU0xBaCui{U=?z@O7v2cx5 ztxcxGv=Q4HrtwAay5`y}-bJU4w>lctxjq?qsIw%KyOP1=@_frCHA_|9s1BD6RJzr5 zY*42BkmvcvZXL}!{HCnDh{qFSsBRJYn$Q$eVqp`W%5d9Uc^#dwU4qv!*`#MHgDnh|P1JnXFB6VTm4L~8Q{6=!0V>h9 z#7QMYbx~zDqAHLrRu)-Dx2F1D#_wC&_^#y&ai(O`MrRI36h+*XQTikiuA0mz+cbF$ z-*t7MGE(>1^xkI;lgHA5Zy=Wa`6Y-`@&g8;fbA6dwmI1o?Wh~tXpG{G9 z>zV{!gg)KavC|~eU|WzsE7&$`Vvfzl$v9kAqbjm(u4?JJOxlMon*rEDkV~0$bWs~I zF7S0rE+MFK##CzfCNL&f>pRXjMCtC!_|$#*CR}F;6)FwdR;3CiLHcBwCTlF~T75Qb z3oSPHT!to7B5GUPRk@gOyFgn7o%eC!d4p-aGA`^q*O%`D?mXsc(`2F})D5zMF5`5K z_o+oqxJ~Q1+`c;IJdzk4Zr%QLiKC4cpGv@#$hica>tw0%Lr09bcNSM-BHp)jFyS#> z(=pVirq$74nr9N4nm@?bY_#iexvr~tIp_LTrH&{U0cuiF#A?gNcO5R5;B1UF(e1OJ zBD9`IKBK#?^MqqD_{#>J1^Xsby3)lp&UH_h6c%-_zTwM8zfM@Lb#>r8Y|yF24dQqSJLkHF}sVq_xE}h2e+)G(yGLRi_xT_!GGUF+-al~F=f!Or5+%NQA9 zjHR=_%=&hW5KA_#(^}VD8zX(J)wI4k#-~OW<9ye3?bmfrzCLzb=mTY3sIFwOxlJ2W zRUEz+D{g;sgsM>DYkD$kP-$k>jYA|^S8RvNb`3$6^#wwa;~Icv<-DU``2yK)SlgvX`~@^t~jXoTZl3%jiY?6;55 z8}$*=0CN)!tTZlQadHmzN?jY~T)B=6>UbH4^{}C+D=m|-_=4|To13-aak)z$_bB7) z4*R%!xQ!2Yzrcf&$7uFjV4Q(cpdMDR(pbW+3(w%zg`1eI&wv)-wNC;jUPIF)op$QR z$e(T6WlP42Y{sQ@t_)O%vnUNN7)2v|@#GQS+58DrWY4Z$~^*HDu#frt87sVgpCrJu=jwDqvZnTmJJfAd6^KjoRs1SmA4S)dH>zjpM?-wN{{WlEdl*I$1S-x6H~n=qWktZ`&ee5QSF5vP-%Qz7mgrpi*f``B zNvF`_dVA2v!_z0|j)veInNW!ku5^t95$D+N9O0;Y0w%>ylb0##T|$*{rW#BKCiiQ? z6LF6IXoU7)h}n7#6`DB^-xzBG#yR@Y2>nrn$x4W75SEIyD$U|=5RK3q4KPuu<#5Zu z!OjMz2M9noiLI3oFwW5%4bU8Pz!(E)kfX=Mo7}n<532nFxM|bs zXB*?>dyFx(h9lfPJi%`t@8Pi9#Xr1s8_QFZC|(JVuhSk5aR1~OAMZWJAd2vvXKrA1 zdNy@WzWIZ!n1cT9aDeURAwE5Lh~BV|Z(g~D)#-(F?ig9zDQ&j~-z2=n0l4C-L&d6T;>3M`i_p}qiL|DUAbpmnpi{hxt2^auM5*mgKBu;YfL8V9!s)xOfD)|0jGl@ z{%dmwKm2S9n|F^w~cQ!xAcIyO#h=Bv>4Ei|ev@o#Xu7wpmySReosrlGah5Joj z<0OkDmJLi)>UehXDrW1`&IXDMzJk}PxbH$XH!_GA-o3wzfBnN2HjmpFMI4;R@u@dr z_~hUSPr5zm$aiJtgDAp#+uQizXY1H*HW9HHF9$(Cim-loh|^vV%rj2OpL?Sre)sqx zes=dWJZ?1+F%E_}PIgB_JZc`|q}K+AzSIjS#nssh_|Ekgu`;~~N@J(mCxrLW5J%?IYwbCm1qN{Rr;{=TTjFN4z3c7?0h&S`_w2hzM-NF6S4n_ z4s0Gbarfvn$u^6@Zo7lG@7>2vvkjKSH(@Cw2HZb6#>3N-6t{^^wbo>u<8kX0@9#Xo zPU{pAN0I==e%s@^9Uo!`{a1Ufoc%qrHj|_y=Py=?WHT2u1+B!0VtuMBtSK& zVrAw6-njY_zIF9$n5i|4do|@nHjq73C|`7Sj(is$Mhw5-J;n#S#~4IBaa8~(v87Q0 z?6!OO-QxqixV(VHiMp0R6a0Q>51$?!qR&{GopQp#I03-1*Y4n>y*=DoTE+~e)<%hZ zZx}^be{z70!vl0j5eQ;hW9tJV4m|0$uyObp&n{fVe9$mj(^R#Nmsg&_>dXS}AMfMA z$sRhx9x61%a$^?P=PzMpdI3|)VZ(U>=Z2p$^qmaoE&QlEz^@-2;;=i6-4P)mJnr03 z#INmPgx~D!reJ^*zF-=KtKo>5y%06qca%dlY?!1WoZ>N^+^PlM6MQ8aCv4C zE7SA1vw8y&XCNS`1R+97K|G2?TcWE=j8!;Ot5Pf|TLI%7yPZD1IBH?YcomsA5#wdZ+^AURQL~AkY^>v`+Z|(ysiSq& z?cl-5Df*)*DQ!esQS^}G@bdWd6u)}#1@_yg&NvSM0il?v)G$@4W3p01g$B8dxh(j& zY_G4bxCAe^{6>u9pwq`mZ-hu{u5%v8;j~?sBwO!4KEThnwsF!Qq%A??IsgtjJ)HIi zsiFv_5rReXo-yEq-Cg|R!4_JBL287ic3;Ffj(a_v4hD$0Xip||3t=N(bHErrd-52+ z-PuI5pDBTZ0jL5z81ZtXNT?I1G&N_Px7!|M523gMpPXjB|8`BlM#v^8}Cun4Dj5b>8}%m)D| z2O`FC@3@H{d~z32#PP1K$_n50@wPJReTnj~^W9C&nkgtzZ~48|E=UAc~_YE6q* z$4gT;>MWM70_QyYr8`$$rMe+o3zGq9NhGpnCMtUZP&umxFo-z*uz!T!XoRC)4}Wp} zGM1;})?KdYpP&%#Id1LpoYf{7Rovt!1cQiU{qPWj=u@2ZyZH9C>zJRIL?C&ll<5#k zLO@Ae|E7lpBvxLUcpgGH28?6#_z4CZAD}xN;I*|In5$3aTBIruO+xlbm~8SfK`0BV zNE2KBoG-5=txv2;Xnk7bgF{r2G#T5EI5rNO_`%>VcH13%_r?`Gw=joV7>v;+EQ)gR z9*IYYm4Fj*EXTnJ(2p24PfpPKVjU;F9$vqE1=r^nFcDVr`{9{laxMv+WOOpb$|ICu z#2B`lCwTkbM>y;@acA`guFfr?7F2RPH3?6R(Yl)5=b8=(k$$Vvx1piaz}#3h?j}uj z5x+p^@`Vk(r+8B%?L@Yvk*vDbFjn<%#VKf3EF>Xqb(9B|b!PCzH0YXAB zS*>7YdJb1+m#{cFjcc>ZxHfkYmEEe@v zL;QAUA0O=NZcC!Tzmbyfiw74iqTrH1}>NqE0B)%8L znG~u)fLa)$24J#M!AfHq&n_-vb$SMG-TfR-I<1&LNfHKRu^)t_IRWJyoKSGi5h2dH zWfuA*w<_;-Nv&&s;cxh>8MUcqRp(R#ikk}!OjXvvIPfnYY{m@;j?^_LHUJ71Usua2 zAaTBVs09J8&COu4QbBh#!jIPP;k4h+$Im3r5<;@;B#z&lWHqizcO?k0Iz59opSg+F zppSR9HgMYSCK+{>go)BiC~3Tx7-Reu&J3^G2QQmF%XF%^1yEB{L%yynq+N5=4FEt$ zDOP7D@wd;f;nhp?2q?{(2~x+4OC^>NFyrDhD&v*BRzL_YHYV|xH?QKwA(Ur4>7;~UVR91RzIFpIT)2cvP#J69h{tZksadX3!fBdd%K9mLN?SKf zyjR=8s!Y@n3m96JY29gvxw+a@8Rv5C1i-~c9j~t~qEV?NW3uzyT<;pvQJ{F`(AaQ> zd!^C9*Or&is8-YQYKKd-HDzVuB5jtC=NJs&!qgO=U%Y@uwFYn@NMyLhp}xE)soctG zr)CWmY<$(>&{;CI3COg#D|NRK0RXjt;@O31EKSxjYemMaOaQUUr^1Egq74~;H3)EH zeik#e8X&bA)mEmAGZhj@DgYhsdRW2A^bF=|lNlZ^wMpfJiJbQkC8L`^J`E?;uynLq zEm%e-FMbxtDH0)As8=ytuStx`EHt$SK(gp0N#Vj8^h!nvurN_WqgqLnKxTaA@}t~? z0{O;S)wz03oS6=BnjF@J8G<72 zIh_Zf8dB84Bu;V)3LYQ5CFF>6WAPerfKg|U06=^^M@f)c7m}_QBjP=eTaO7Xa??fL z+ZazcM}-D)eCIUDrZb@mpokMXN|L6F@D2*tx`?i3hv_gzm1n4%Y$~0Kf@%ROeh4?L zlo|4$$X2sRHAh0rrkVcKt2=kr`LD7t1Mqvm2P5wSVj6Ms#)c0UVv=KOd|!A2(K4k89+s=|%_WV_f?a&h@zS6WX_8eYangaV z7*~l*ugRr^$YgWn1*Gx=X(A@XXr_-KeN0suC=h?wNQ%Yr@hF$vwmE}V`C7o zekO!0?!}*ZDi{E{xW>|Q1Y=gF(vrFK7*qXcnPwSt;!%h= zLX>Eh^9i0TWaEWL%qGGNZc|b$@3XpG(iwsw*_x9J*$5q z9Xf~u49MOmd(gq=rt`GtjmpGpAL|}FY;b9h$u*lSTqYzJ$CH{gpG6}*Xh)ivW)_!P z8T1M%$1_SOvL;6|7E+8%q)fPo?<9v?^|fjYbX82kwWawgR473uplO{N*SaxR2uB(x<40uT@7Sh~#u{i5 z??Xb92kA+2R49~3#JgBT;;9T#0dZm87N}5)FgYX8yt;>dP2sUce?AY9WnVm7;t}tSFA} zJhd(nj|s?_XHfTnc9n7P37a-r1*8w%xircr z%k%B20>DHiz{RN=sx-hb5)aGelM{-pc_6x3YOkc;Pi0aH7DY+BlO(TkTU4Ca zQWC$WCqasb$gM%*1BZqB1S&L)zedV4*Pj(+S?5iZfGG+icd|82`HPV*%k|v&`F8n1pX~y{_hmcwY?& zZp=+!d8(Ss%Z}XAXR0ChlgASw(;6WqxIRCHg^5~fUFwOC{3^bOFN9$02UG%z)tLt7 z>vg1wpF~^!TNYCGZ{e|NFJ~#21dIvT6gy2Bo()t>mMtS71lQ&!@WN69)gVyXhnZXB zs?}MRm1(*;-@x+=GiiL41+7&arTjAC4k^WIV+uDGX5$kp$miF{_8=cqLZCKR8m9Hm zDr72^!y6D8`P(U;%RSRU~;b zfoj2o#AVVq)@JeMwRudYXT#%eIz9U1aoQ!?UQK0B3* z!LhZu!cRykzPh}Kudgkm9#$lmPn11S<(r9q$*8=R>pUR8=gd$AeyU1b{VY#b$EXYH z=Gs0J#8&+MTg$j}X$IARW(fVT@2rT)p+Wde2gO!H+T)O#T%c=_Tq z{`s}b_|waCx%yQIluOp8bJM2H5dbeN&EOwjc?NG>Ud(Vy)|^_erpA^*-A_OWZY?h0 z?_YQxcP_=23@!;-t^!0Gv;>&=?xIh?ST9-!rWkGON9%~xxf}qfhZNtrHjlZ95dZe+ z9{%V4A+}q+_-B@Q@^mrbX%eF*E2`_0UEo9|!0T&^n5k9plP`Ag&iy^?cY4WJXjsl; z`0zk}Ukd}=Sy{$Rt%@ISY~uaxT^#m0$&Zl6X`L)&zZQpn&9X4|{a_V*gja+RbL~p; z+NBv>nyTUDi_`e!!y~L8wz1ppqdOcye4nWn1W4Q2hE}DzMm-Gh)#W)XPu20<;xvB0 zdxVXnQ|z~U=#7Tp;HU=i6PW~gMbzz2eqRYFo?o2DY`uzGiwpR8e;->Xr#NW0(T_$D z1yeN$N@c{hp0n#3fb19F)d5A@m#z%kG;ZuZ;vZ4j>kM%Jq>D$VJ?ymyXb(r=oZ-dg zX?*YIGA2U5A8pa$e$wq@yV=1`vy1&s7oFhlG}%m5_15(;RwgQ z9v-*b*lD$K-0h(|9D;%2`Nai%V{Hu+q2HHD%CsuAc%J6}54N?`d@{;7PI3$)hKR-e zs|qEkhnW?Zfp|TFh;s~C6yxSV7!cIM(CA2g4_Y{nzw0z&3{eu=DnXEXh$3)SH|_QH zQFQ}0_oWI?fUR)%bvNqzy172!@=j-sdu4EyUDwsG);>1tLS%JShFE19^EB?Oa2`2= z?_6D3=)!pxrLr|bIOpT7N>d$d(h{{H^0c97EvRFj&6|{|HBI+zWsPqWsVJyMsQu4p zau?++LbJIJlgl@a&k^kz!*$_9;Bh5SwsngnnXZi7MYDR{6rN0>GH1cE#<}90uEC+Z zrz5hc#;P=_OjFme;ZcR_n&(r7`K)D{>uW$JFXS5U^-Fgu(LQn3h0ErmWY3`!rf(8v zQ!*8FO60Q_d7h7DoA4D~*M(1j@wX~{-JlA##L8ynu6w>prSlNJ%-1zEio{);b-M5r z^(eA|h_SjkV=h`ppe~WJC1ORHqRTwb1B&1^F-b?CEs zg+*PZjK?<-dfK4#Or}>KJhnv6mlj*aVoIJ|Ig$YFHyetS8#dz9aYY1KHbmIQ+xBG> zn2mn*o=q4g{;4=zR<6UPo5wkij|+7~>t1c3#y*`}E8>Q9^q6p~_iStEV!3b9Ca-PF z33LLrC44H)HsQI9Q4JZ!pA$9_qQ+v^qOLe-Qwkf{7^X|KOtcAHwsloS@L{rTT^X0j z`c+(}J=v_Da}F{ZjkqnrPzkiT9G`JtcFgsGA~c}^>dNE+wk~+yg%(@vo3ewyNC{aODP+^qD<0x5K~fAbPbuA zF4t^Res#Pm2VH2?%~9{?o~qOlq}z}QnT@GBeDXatzMs{~i)7L2o=o|OuebBzle$mW z923p*UUhSF&t#bp>yY^f(B;Z?pViFLXKooVB}_gv%JbFtMd-6-@g{sWV^Iaox#qY~ zrwuO4Q?J>;C*#zCiH4$+nP zT*l%GiPj`b&P314RjCI{+JZe*65Ids;)Pc?gpJxW_19GE7CumfZ3X|>{f pp=d${ob3edEc1(k9QITN{ePCe;lWscHE#d_002ovPDHLkV1oHqp1}YB delta 2657 zcmV-n3ZC`XL+KQdBYz4oNkloFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf=(`%i diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..4476421062c023508300eaacfdea5836d403fbbc 100644 GIT binary patch literal 8663 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 delta 2657 zcmV-n3ZC`XL+KQdBYz4oNkloFh3q0M zFesq&64WThn3$;G69TfjsAv=f2G9}pgSx99+!YO}2Uveik)GA5ewEg1Va|1@=x;Pyj3t}zC)T-c zzoz+u9TyK|)jteh(` z;D6}gLagCR0hn*76kN#wCv*`b8GyswI1s7kNaT!{fEXv;5ofK|nu3vU_1cRKLBd@TQ@Ei6F6QJ?HM!O!+{x(L<6rNAv)=55QOzlPWhqI{ zjSR5c$#aW1xy}c;$06La(Y*xlX>0w3EDGGn02k}7*%ZplRLFsw%E3MJO@BuPkU#Ja zcbp(_BL!RxGHHe;wff^+2G>u>ah(dq7O)#K0ekx={yBF*$P%aJSOMmjHHmAxvW0cp zt8@K;ETVH`1(=8Ie(Z;Hy+9V#xv>Mxz*+%0w;aeKJ2#eqVJL7nrpksp7|5bKS2)0a zId?FSYb0>4P=MLsl6(J^Q-5;@54jg=+fq2sO~Hz-hVXEO0L<$0j+BKdGX;Npqt{os zJmk~Y_Q1L83|RfW)5G^!;(u>i7{EI*HIqAp9`Cbzna*hHhI2Lm9I{{?%y{Hgdzxli z7Fd?00Ed;L$qk&zI`y$@{Dn;5j(iW`=!aXNV*G=kjb8%Qi`UtJMSq7ZT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah-w13P)xT`>~eFoJC!>{2X zL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw>F+gN+i+VD?gMXwcIhn8 zrz`>e>J^TI3E-MW>VM=sWZual)ns9B%8_$25BcpOz+KP;+J(1(UiAp*Q=dc!FQL}*R43bTaVm7wy#IrC-VD&k-4FWYMd;wg6!1z8a3SP;O>P#-$->_l zEAM2>hI~v3$Y(TlIdJE^0@|6AK_7#uc{~E1^f2gGJ^}i)rGJ>FDPRt4F~}m-WGQZK zw?8N6;NJH#XeW;Webf!0kG=!+v2#G5xX^L14Y#o*Tz9&z7NjOib92f(6aq==Ntoo74a!u6w~r!$mq|FDi7h6+6fTa4$$0Y>@Y*O}J#< z8ic&ucAQ^e_cw)#3uFTLcly|p7IMmPAXha6205mSA%EQja0eR?DV=N%;eS$2zHI*MpiObUuA|j7`m5?j`@^G6SO!-;(G1aCOu{sGli$ zGck~Eqx{gt?U$`9P3JRJO>}Ku- zRew#6AKb$jGi@lro`A;#P%m@cnyJP&(r%f}Zq^V3mIc=hnLfVXHRn=pj;2#4v8WiM zav|%So5|ksmkM-bV7H;F_%f>b72G`eFJ!d@wTC-#ALO^GRCtHl=K|Y}dX%fTm0A$N zzc4;N3AGsYM~OOND&T_#%8wZzWYfL@by`|620=mAU7(LZ-At!cdlWCvu@AK#bt~#< z9;~k^d5}}7VXmK@h?&@_rUHYJ9zD=M%4AFQ`}k8OC$9ssPq=LnkwKG P00000NkvXXu0mjf=(`%i diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..addf702c4eaed01909c7a9ce2f14c8180aa1a684 100644 GIT binary patch literal 14340 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..74bfa80fc3b480ea73547737b3b0b41224b16290 100644 GIT binary patch literal 4393 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 VDiT%YA$0%%002ovPDHLkV1gAI!|nh8 literal 3612 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 OTnkgnQ$@y3G5-gVLIjHd literal 0 HcmV?d00001 From 7be1bdcdc203cede471b1bc4a511c1cb880569dc Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Sun, 19 Jun 2022 12:02:14 +0300 Subject: [PATCH 07/22] fix family member --- lib/api/profile_api_client.dart | 1 + lib/config/routes.dart | 3 + lib/ui/profile/contact_details.dart | 2 +- lib/ui/profile/delete_familyMember.dart | 74 +++++++++++++++++ .../dynamic_input_familyMembers_screen.dart | 83 +++++++++++++++++++ .../dynamic_input_profile_screen.dart | 2 + lib/ui/profile/family_members.dart | 52 ++++++++++-- 7 files changed, 210 insertions(+), 7 deletions(-) create mode 100644 lib/ui/profile/delete_familyMember.dart create mode 100644 lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index 3e254b4..ec79fd7 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -27,6 +27,7 @@ class ProfileApiClient { postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + print(responseData); return responseData.getEmployeeContactsList ?? []; }, url, postParams); } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index e377b8a..75f4293 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -8,6 +8,7 @@ import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart'; import 'package:mohem_flutter_app/ui/login/verify_login_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/delete_familyMember.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; @@ -69,6 +70,7 @@ class AppRoutes { static const String basicDetails = "/basicDetails"; static const String contactDetails = "/contactDetails"; static const String familyMembers = "/familyMembers"; + static const String deleteFamilyMember = "/deleteFamilyMember"; static final Map routes = { login: (context) => LoginScreen(), @@ -110,5 +112,6 @@ class AppRoutes { dynamicScreen: (context) => DynamicListViewScreen(), addDynamicInput: (context) => DynamicInputScreen(), addDynamicInputProfile: (context) => DynamicInputScreenProfile(), + deleteFamilyMember: (context) => DeleteFamilyMember(), }; } diff --git a/lib/ui/profile/contact_details.dart b/lib/ui/profile/contact_details.dart index c387047..a67283d 100644 --- a/lib/ui/profile/contact_details.dart +++ b/lib/ui/profile/contact_details.dart @@ -210,7 +210,7 @@ class _ContactDetailsState extends State { //]), //), //], - ])); + ]))); } footer() { diff --git a/lib/ui/profile/delete_familyMember.dart b/lib/ui/profile/delete_familyMember.dart new file mode 100644 index 0000000..4876ef3 --- /dev/null +++ b/lib/ui/profile/delete_familyMember.dart @@ -0,0 +1,74 @@ + + +import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/profile_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/dialogs/otp_dialog.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; +import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/profile.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class DeleteFamilyMember extends StatefulWidget { + const DeleteFamilyMember({Key? key}) : super(key: key); + + @override + _DeleteFamilyMemberState createState() => _DeleteFamilyMemberState(); +} + +class _DeleteFamilyMemberState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBarWidget( + context, + title: "Dependents And Beneficiaries", + ), + backgroundColor: MyColors.backgroundColor, + bottomSheet: footer(), + body:Column( + children: [ + + ], + ) + + ); + } + footer() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + color: MyColors.gradiantEndColor, + // margin: EdgeInsets.only(left: 50,right: 20), + padding: EdgeInsets.only(left: 50,right: 50), + child: TextButton( + style: TextButton.styleFrom( + primary:MyColors.white, + onSurface: MyColors.white, + backgroundColor: MyColors.gradiantEndColor, + ), + onPressed: (){}, + child: Text('Next', + style: TextStyle( + fontStyle: FontStyle.normal, + fontSize: 16, + color: Colors.white, + fontWeight: FontWeight.w600 + ),), + ) + ), + ], + ); + } +} diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart new file mode 100644 index 0000000..0fa6845 --- /dev/null +++ b/lib/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart @@ -0,0 +1,83 @@ + +import 'dart:io'; + + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; +import 'package:mohem_flutter_app/api/profile_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_model.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; +import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; +import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; +import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; +import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class DynamicFamilyMembersParams { + String title; + //String dynamicId; + // String uRL; + // String requestID; + // String colsURL; + List? getEmployeeContactsList; + + DynamicFamilyMembersParams(this.title, + {this.getEmployeeContactsList = const []}); +} + +class DynamicFamilyMembersScreen extends StatefulWidget { + DynamicFamilyMembersScreen({Key? key}) : super(key: key); + + @override + _DynamicFamilyMembersScreenState createState() { + return _DynamicFamilyMembersScreenState(); + } +} + +class _DynamicFamilyMembersScreenState extends State { + // GenericResponseModel? genericResponseModel; + DynamicFamilyMembersParams? dynamicFamilyParams; + + @override + void initState() { + super.initState(); + } + + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if(dynamicFamilyParams == null) { + dynamicFamilyParams = ModalRoute.of(context)!.settings.arguments as DynamicFamilyMembersParams; + } + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: dynamicFamilyParams!.title, + ), + body: Column( + children: [ + + ], + ), + ); + } + + +} diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart index 6e054c9..3e25917 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart @@ -15,6 +15,7 @@ import 'package:mohem_flutter_app/models/dyanmic_forms/get_set_values_request_mo import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; +import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; @@ -30,6 +31,7 @@ class DynamicProfileParams { String colsURL; List? getEmployeeBasicDetailsList; + DynamicProfileParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.getEmployeeBasicDetailsList = const []}); } diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index 6f50c51..bcc5b32 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/dialogs/otp_dialog.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -15,6 +16,8 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; +import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -30,7 +33,7 @@ class _FamilyMembersState extends State { List getEmployeeContactsList = []; - + int? relationId; @override void initState() { super.initState(); @@ -111,7 +114,7 @@ class _FamilyMembersState extends State { Container( child: InkWell( onTap: () { - + showUpdateAlertDialog(context); }, child: RichText( text: TextSpan( @@ -148,7 +151,7 @@ class _FamilyMembersState extends State { Container( child: InkWell( onTap: () { - showAlertDialog(context); + showRemoveAlertDialog(context, getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt()); }, child: RichText( text: TextSpan( @@ -214,14 +217,42 @@ class _FamilyMembersState extends State { BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), ], ), - child: DefaultButton(LocaleKeys.update.tr(), () async { + child: DefaultButton("Add New Family Member", () async { // context.setLocale(const Locale("en", "US")); // to change Loacle Profile(); }).insideContainer, ); } - showAlertDialog(BuildContext context) { + showUpdateAlertDialog(BuildContext context) { + Widget cancelButton = TextButton( + child: Text(LocaleKeys.cancel.tr(),), + onPressed: () { + Navigator.pop(context); + }, + ); + Widget continueButton = TextButton( + child: Text(LocaleKeys.ok.tr(),), + onPressed: () { + continueDynamicForms(); + }, + ); + AlertDialog alert = AlertDialog( + title: Text(LocaleKeys.confirm.tr(),), + content: Text("Are You Sure You Want to Update this Member?"), + actions: [ + cancelButton, + continueButton, + ], + ); + showDialog( + context: context, + builder: (BuildContext context) { + return alert; + }, + ); + } + showRemoveAlertDialog(BuildContext context,int relationId) { Widget cancelButton = TextButton( child: Text(LocaleKeys.cancel.tr(),), onPressed: () { @@ -230,7 +261,10 @@ class _FamilyMembersState extends State { ); Widget continueButton = TextButton( child: Text(LocaleKeys.ok.tr(),), - onPressed: () {}, + onPressed: () { + Navigator.pushNamed(context, AppRoutes.deleteFamilyMember); + // continueDynamicForms(); + }, ); AlertDialog alert = AlertDialog( title: Text(LocaleKeys.confirm.tr(),), @@ -248,4 +282,10 @@ class _FamilyMembersState extends State { ); } + + void continueDynamicForms() { + Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, + arguments: DynamicFamilyMembersParams(LocaleKeys.profile_familyDetails.tr(), getEmployeeContactsList: getEmployeeContactsList)); + } + } From 15cfc0b9f4dad761ff0318be4b5a67efd35d2be6 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Sun, 19 Jun 2022 12:24:41 +0300 Subject: [PATCH 08/22] merge conflict fixed --- lib/extensions/string_extensions.dart | 5 +++- lib/generated/codegen_loader.g.dart | 35 ++++++++++++++++++++++----- lib/generated/locale_keys.g.dart | 1 + 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 6dab1da..b6cb2dd 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -64,7 +64,10 @@ extension EmailValidator on String { this, style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); - + Widget toText20({Color? color, bool isBold = false}) => Text( + this, + style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), + ); Widget toText22({Color? color, bool isBold = false}) => Text( this, style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 22, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 365e775..c5ea1c4 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -211,9 +211,6 @@ class CodegenLoader extends AssetLoader{ "rfqUOM": "RFQ UOM", "rfqQty": "RFQ الكمية", "rfqNumber": "رقم RFQ", - "msg": "Hello {} in the {} world ", - "msg_named": "{} are written in the {lang} language", - "clickMe": "Click me", "human": "بشري", "resources": "موارد", "details": "تفاصيل", @@ -250,12 +247,32 @@ class CodegenLoader extends AssetLoader{ "myAttendance": "حضوري", "workOnBreak": "التعويض عن العمل اثناءالاستراحه", "next": "التالي", + "mobile": "التليفون المحمول", + "completingYear": "نحن نقدر لك لاستكمال خدمة", + "year": "سنة", + "month": "شهر", + "day": "يوم", + "address": "العنوان", + "phoneNumber": "رقم الجوال", + "businessGroup": "مجموعة العمل", + "Payroll": "الراتب", + "civilIdentityNumber": "رقم الهويه", + "dateOfBirth": "تاريخ الميلاد", + "maritalStatus ": "الحالة الاجتماعية", + "fullName": "الأسم الكامل", + "remove": "حذف", "profile": { "reset_password": { "label": "Reset Password", "username": "Username", "password": "password" - } + }, + "profileCompletionPer": "استكمال الملف الشخصي", + "completeProfile": "الملف الشخصي الكامل", + "personalInformation": "معلومات شخصية", + "basicDetails": "تفاصيل أساسية", + "contactDetails": "بيانات التواصل", + "familyDetails": "تفاصيل عائلية" }, "clicked": { "zero": "You clicked {} times!", @@ -372,7 +389,6 @@ static const Map en_US = { "whatsapp": "Whatsapp", "reject": "Reject", "approve": "Approve", - "attendanceDetails": "Attendence Details", "cancel": "Cancel", "requestedItems": "Requested Items", "request": "Request", @@ -517,6 +533,7 @@ static const Map en_US = { "myAttendance": "My Attendance", "workOnBreak": "Work On Break", "next": "Next", + "mobile": "Mobile", "year": "Year", "month": "Month", "day": "Day", @@ -536,7 +553,13 @@ static const Map en_US = { "label": "Reset Password", "username": "Username", "password": "password" - } + }, + "profileCompletionPer": "Profile Completion", + "completeProfile": "Complete Profile", + "personalInformation": "Personal Information", + "basicDetails": "Basic Details", + "contactDetails": "Contact Details", + "familyDetails": "Family Members" }, "clicked": { "zero": "You clicked {} times!", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 230e45b..e4bf2dd 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -232,6 +232,7 @@ abstract class LocaleKeys { static const myAttendance = 'myAttendance'; static const workOnBreak = 'workOnBreak'; static const next = 'next'; + static const mobile = 'mobile'; static const completingYear = 'completingYear'; static const year = 'year'; static const month = 'month'; From eaac923580e58ce692f2e4f0d548c86b463a2b3d Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 19 Jun 2022 12:31:03 +0300 Subject: [PATCH 09/22] imp --- lib/extensions/string_extensions.dart | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index a953734..98cc830 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -1,8 +1,6 @@ -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/cupertino.dart'; import 'package:intl/intl.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; extension CapExtension on String { String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}"; @@ -63,10 +61,11 @@ extension EmailValidator on String { this, style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); + Widget toText20({Color? color, bool isBold = false}) => Text( - this, - style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), - ); + this, + style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), + ); Widget toText22({Color? color, bool isBold = false}) => Text( this, @@ -84,9 +83,9 @@ extension EmailValidator on String { ); Widget toText44({Color? color, bool isBold = false}) => Text( - this, - style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 44, letterSpacing: -2.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - ); + this, + style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 44, letterSpacing: -2.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), + ); Widget toSectionHeading({String upperHeading = "", String lowerHeading = ""}) { String upper = ""; From ce7183a137051ef83ca4b304ead8c5a11e2b43a0 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 19 Jun 2022 12:55:16 +0300 Subject: [PATCH 10/22] merge conflicts fixed. --- android/app/src/main/AndroidManifest.xml | 5 ++--- lib/generated/codegen_loader.g.dart | 16 +++++++--------- lib/generated/locale_keys.g.dart | 6 +++--- lib/models/generic_response_model.dart | 1 - lib/ui/login/login_screen.dart | 5 ++--- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 39cd59d..d44cea3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -10,9 +10,8 @@ + android:networkSecurityConfig="@xml/network_security_config" + android:roundIcon="@mipmap/ic_launcher_round"> en_US = { "writeComment": "Write a comment", "approversList": "Approvers List", "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", - "profile": { "reset_password": { "label": "Reset Password", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index e8ea462..21d18f5 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1,6 +1,6 @@ // DO NOT EDIT. This is code generated via package:easy_localization/generate.dart -abstract class LocaleKeys { +abstract class LocaleKeys { static const mohemm = 'mohemm'; static const english = 'english'; static const arabic = 'arabic'; @@ -243,7 +243,7 @@ abstract class LocaleKeys { static const Payroll = 'Payroll'; static const civilIdentityNumber = 'civilIdentityNumber'; static const dateOfBirth = 'dateOfBirth'; - static const maritalStatus = 'maritalStatus '; + static const maritalStatus = 'maritalStatus '; static const fullName = 'fullName'; static const remove = 'remove'; static const submit = 'submit'; @@ -252,7 +252,6 @@ abstract class LocaleKeys { static const writeComment = 'writeComment'; static const approversList = 'approversList'; static const yourRequestHasBeenSubmittedForApprovals = 'yourRequestHasBeenSubmittedForApprovals'; - static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_password = 'profile.reset_password.password'; @@ -269,4 +268,5 @@ abstract class LocaleKeys { static const gender_with_arg = 'gender.with_arg'; static const gender = 'gender'; static const reset_locale = 'reset_locale'; + } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 54a7b8d..952b9e6 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -4,7 +4,6 @@ import 'package:mohem_flutter_app/models/get_absence_collection_notification_bod import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_attachement_list_model.dart'; -import 'package:mohem_flutter_app/models/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_default_value_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index b20ec58..d02fd74 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -132,10 +132,9 @@ class _LoginScreenState extends State { @override Widget build(BuildContext context) { - // username.text = "15153"; + username.text = "15153"; password.text = "Abcd@1234"; - username.text = "15444"; - + // username.text = "15444"; return Scaffold( body: Column( From cf523566cded204bc3c1331ad4c517f69bfbb8af Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 20 Jun 2022 12:23:30 +0300 Subject: [PATCH 11/22] Mowadhafi home & details page done --- lib/api/mowadhafhi/mowadhafhi_api_client.dart | 50 ++++ lib/config/routes.dart | 11 + lib/models/generic_response_model.dart | 44 +++- lib/models/mowadhafhi/get_ticket_details.dart | 80 +++++++ .../mowadhafhi/get_ticket_transactions.dart | 40 ++++ lib/models/mowadhafhi/get_tickets_list.dart | 184 +++++++++++++++ lib/ui/landing/widget/app_drawer.dart | 17 +- .../screens/mowadhafhi/mowadhafhi_home.dart | 124 ++++++++++ .../screens/mowadhafhi/request_details.dart | 213 ++++++++++++++++++ 9 files changed, 753 insertions(+), 10 deletions(-) create mode 100644 lib/api/mowadhafhi/mowadhafhi_api_client.dart create mode 100644 lib/models/mowadhafhi/get_ticket_details.dart create mode 100644 lib/models/mowadhafhi/get_ticket_transactions.dart create mode 100644 lib/models/mowadhafhi/get_tickets_list.dart create mode 100644 lib/ui/screens/mowadhafhi/mowadhafhi_home.dart create mode 100644 lib/ui/screens/mowadhafhi/request_details.dart diff --git a/lib/api/mowadhafhi/mowadhafhi_api_client.dart b/lib/api/mowadhafhi/mowadhafhi_api_client.dart new file mode 100644 index 0000000..b36dcd0 --- /dev/null +++ b/lib/api/mowadhafhi/mowadhafhi_api_client.dart @@ -0,0 +1,50 @@ +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/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; + +import '../../models/mowadhafhi/get_tickets_list.dart'; + +class MowadhafhiApiClient { + static final MowadhafhiApiClient _instance = MowadhafhiApiClient._internal(); + + MowadhafhiApiClient._internal(); + + factory MowadhafhiApiClient() => _instance; + + Future> getTicketsByEmployee() async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketsByEmployee"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgPageSize": 10, "ItgPageNo": 1}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketsByEmployeeList ?? []; + }, url, postParams); + } + + Future> getTicketDetailsByEmployee(String? itgTicketID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketDetails"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgTicketId": itgTicketID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketDetailsByEmployee ?? []; + }, url, postParams); + } + + Future> getTicketTransactions(String? itgTicketID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketTransaction"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgTicketId": itgTicketID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketTransactions ?? []; + }, url, postParams); + } + +} diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 8abcfdc..14b3abe 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -21,6 +21,7 @@ import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; +import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/item_history_screen.dart'; @@ -28,6 +29,8 @@ import 'package:mohem_flutter_app/ui/work_list/itg_detail_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; +import '../ui/screens/mowadhafhi/mowadhafhi_home.dart'; + class AppRoutes { static const String splash = "/splash"; static const String registerSelection = "/registerSelection"; @@ -74,6 +77,10 @@ class AppRoutes { static const String familyMembers = "/familyMembers"; static const String deleteFamilyMember = "/deleteFamilyMember"; + // Mowadhafhi + static const String mowadhafhi = "/mowadhafhi"; + static const String mowadhafhiDetails = "/mowadhafhiDetails"; + static final Map routes = { login: (context) => LoginScreen(), verifyLogin: (context) => VerifyLoginScreen(), @@ -116,5 +123,9 @@ class AppRoutes { addDynamicInputProfile: (context) => DynamicInputScreenProfile(), deleteFamilyMember: (context) => DeleteFamilyMember(), requestSubmitScreen: (context) => RequestSubmitScreen(), + + //mowadhafhi + mowadhafhi: (context) => MowadhafhiHome(), + mowadhafhiDetails: (context) => MowadhafhiRequestDetails(), }; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 952b9e6..095a330 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -4,11 +4,10 @@ import 'package:mohem_flutter_app/models/get_absence_collection_notification_bod import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; import 'package:mohem_flutter_app/models/get_attachement_list_model.dart'; +import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_default_value_list_model.dart'; -import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_dff_structure_list_model.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; -import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; @@ -25,6 +24,9 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; @@ -33,12 +35,13 @@ import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/subordinates_on_leaves_model.dart'; -import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; -import 'package:mohem_flutter_app/models/validate_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'basic_member_information_model.dart'; @@ -186,6 +189,9 @@ class GenericResponseModel { List? getTermDffStructureList; List? getTermNotificationBodyList; List? getTimeCardSummaryList; + List? getTicketsByEmployeeList; + List? getTicketDetailsByEmployee; + List? getTicketTransactions; List? getUserItemTypesList; List? getVacationRulesList; List? getVaccinationOnHandList; @@ -439,6 +445,9 @@ class GenericResponseModel { this.getTermDffStructureList, this.getTermNotificationBodyList, this.getTimeCardSummaryList, + this.getTicketsByEmployeeList, + this.getTicketDetailsByEmployee, + this.getTicketTransactions, this.getUserItemTypesList, this.getVacationRulesList, this.getVaccinationOnHandList, @@ -680,7 +689,7 @@ class GenericResponseModel { getContactColsStructureList = json['GetContactColsStructureList']; getContactDetailsList = json['GetContactDetailsList']; getContactDffStructureList = json['GetContactDffStructureList']; - getContactNotificationBodyList= json["GetContactNotificationBodyList"] == null ? null : GetContactNotificationBodyList.fromJson(json["GetContactNotificationBodyList"]); + getContactNotificationBodyList = json["GetContactNotificationBodyList"] == null ? null : GetContactNotificationBodyList.fromJson(json["GetContactNotificationBodyList"]); getCountriesList = json['GetCountriesList']; if (json['GetDayHoursTypeDetailsList'] != null) { getDayHoursTypeDetailsList = []; @@ -779,7 +788,8 @@ class GenericResponseModel { getPendingReqDetailsList = json['GetPendingReqDetailsList']; getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; getPerformanceAppraisalList = json['GetPerformanceAppraisalList']; - getPhonesNotificationBodyList= json["GetPhonesNotificationBodyList"] == null ? null : List.from(json["GetPhonesNotificationBodyList"].map((x) => GetPhonesNotificationBodyList.fromJson(x))); + getPhonesNotificationBodyList = + json["GetPhonesNotificationBodyList"] == null ? null : List.from(json["GetPhonesNotificationBodyList"].map((x) => GetPhonesNotificationBodyList.fromJson(x))); if (json['GetPoItemHistoryList'] != null) { getPoItemHistoryList = []; json['GetPoItemHistoryList'].forEach((v) { @@ -842,6 +852,28 @@ class GenericResponseModel { getTimeCardSummaryList!.add(new GetTimeCardSummaryList.fromJson(v)); }); } + + if (json['Mohemm_ITG_TicketsByEmployeeList'] != null) { + getTicketsByEmployeeList = []; + json['Mohemm_ITG_TicketsByEmployeeList'].forEach((v) { + getTicketsByEmployeeList!.add(new GetTicketsByEmployeeList.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_TicketDetailsList'] != null) { + getTicketDetailsByEmployee = []; + json['Mohemm_ITG_TicketDetailsList'].forEach((v) { + getTicketDetailsByEmployee!.add(new GetTicketDetailsByEmployee.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_TicketTransactionsList'] != null) { + getTicketTransactions = []; + json['Mohemm_ITG_TicketTransactionsList'].forEach((v) { + getTicketTransactions!.add(new GetTicketTransactions.fromJson(v)); + }); + } + getUserItemTypesList = json['GetUserItemTypesList']; getVacationRulesList = json['GetVacationRulesList']; getVaccinationOnHandList = json['GetVaccinationOnHandList']; diff --git a/lib/models/mowadhafhi/get_ticket_details.dart b/lib/models/mowadhafhi/get_ticket_details.dart new file mode 100644 index 0000000..5f896bd --- /dev/null +++ b/lib/models/mowadhafhi/get_ticket_details.dart @@ -0,0 +1,80 @@ +class GetTicketDetailsByEmployee { + String? closedBy; + String? created; + int? departmentId; + String? departmentName; + String? description; + String? positionTitle; + int? projectId; + String? projectName; + int? sectionId; + String? sectionName; + String? ticketId; + String? ticketReferenceNo; + String? ticketStatusInternalName; + String? ticketStatusName; + int? ticketTypeId; + int? topicId; + String? topicName; + + GetTicketDetailsByEmployee( + {this.closedBy, + this.created, + this.departmentId, + this.departmentName, + this.description, + this.positionTitle, + this.projectId, + this.projectName, + this.sectionId, + this.sectionName, + this.ticketId, + this.ticketReferenceNo, + this.ticketStatusInternalName, + this.ticketStatusName, + this.ticketTypeId, + this.topicId, + this.topicName}); + + GetTicketDetailsByEmployee.fromJson(Map json) { + closedBy = json['closedBy']; + created = json['created']; + departmentId = json['departmentId']; + departmentName = json['departmentName']; + description = json['description']; + positionTitle = json['positionTitle']; + projectId = json['projectId']; + projectName = json['projectName']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + ticketId = json['ticketId']; + ticketReferenceNo = json['ticketReferenceNo']; + ticketStatusInternalName = json['ticketStatusInternalName']; + ticketStatusName = json['ticketStatusName']; + ticketTypeId = json['ticketTypeId']; + topicId = json['topicId']; + topicName = json['topicName']; + } + + Map toJson() { + final Map data = new Map(); + data['closedBy'] = this.closedBy; + data['created'] = this.created; + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['description'] = this.description; + data['positionTitle'] = this.positionTitle; + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + data['sectionId'] = this.sectionId; + data['sectionName'] = this.sectionName; + data['ticketId'] = this.ticketId; + data['ticketReferenceNo'] = this.ticketReferenceNo; + data['ticketStatusInternalName'] = this.ticketStatusInternalName; + data['ticketStatusName'] = this.ticketStatusName; + data['ticketTypeId'] = this.ticketTypeId; + data['topicId'] = this.topicId; + data['topicName'] = this.topicName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_ticket_transactions.dart b/lib/models/mowadhafhi/get_ticket_transactions.dart new file mode 100644 index 0000000..9091761 --- /dev/null +++ b/lib/models/mowadhafhi/get_ticket_transactions.dart @@ -0,0 +1,40 @@ +class GetTicketTransactions { + String? actionBy; + String? actionDate; + String? comments; + String? statusDisplayText; + String? statusName; + String? ticketId; + int? ticketTransactionId; + + GetTicketTransactions( + {this.actionBy, + this.actionDate, + this.comments, + this.statusDisplayText, + this.statusName, + this.ticketId, + this.ticketTransactionId}); + + GetTicketTransactions.fromJson(Map json) { + actionBy = json['actionBy']; + actionDate = json['actionDate']; + comments = json['comments']; + statusDisplayText = json['statusDisplayText']; + statusName = json['statusName']; + ticketId = json['ticketId']; + ticketTransactionId = json['ticketTransactionId']; + } + + Map toJson() { + final Map data = new Map(); + data['actionBy'] = this.actionBy; + data['actionDate'] = this.actionDate; + data['comments'] = this.comments; + data['statusDisplayText'] = this.statusDisplayText; + data['statusName'] = this.statusName; + data['ticketId'] = this.ticketId; + data['ticketTransactionId'] = this.ticketTransactionId; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_tickets_list.dart b/lib/models/mowadhafhi/get_tickets_list.dart new file mode 100644 index 0000000..34005df --- /dev/null +++ b/lib/models/mowadhafhi/get_tickets_list.dart @@ -0,0 +1,184 @@ +class GetTicketsByEmployeeList { + dynamic agentRating; + dynamic assignedSpecialist; + String? assignedSpecialistName; + String? assignedToSpecialistAt; + int? channelId; + String? channelName; + String? closedBy; + String? closedDate; + String? created; + int? departmentId; + String? departmentName; + String? description; + String? employeeEmail; + String? employeeName; + int? employeeNumber; + String? firstName; + dynamic isActive; + bool? isClosedDirectly; + dynamic isEscalated; + bool? isExceedTAT; + String? lastName; + String? mobileNumber; + dynamic pageNo; + dynamic pageSize; + String? positionTitle; + int? projectId; + String? projectManager; + String? projectName; + String? providedSolution; + int? sectionId; + String? sectionName; + dynamic serviceRating; + String? specialistDeadline; + String? ticketId; + String? ticketReferenceNo; + int? ticketStatusId; + String? ticketStatusInternalName; + String? ticketStatusName; + int? ticketTypeId; + String? ticketTypeName; + int? topicId; + String? topicName; + int? totalItemsCount; + + GetTicketsByEmployeeList( + {this.agentRating, + this.assignedSpecialist, + this.assignedSpecialistName, + this.assignedToSpecialistAt, + this.channelId, + this.channelName, + this.closedBy, + this.closedDate, + this.created, + this.departmentId, + this.departmentName, + this.description, + this.employeeEmail, + this.employeeName, + this.employeeNumber, + this.firstName, + this.isActive, + this.isClosedDirectly, + this.isEscalated, + this.isExceedTAT, + this.lastName, + this.mobileNumber, + this.pageNo, + this.pageSize, + this.positionTitle, + this.projectId, + this.projectManager, + this.projectName, + this.providedSolution, + this.sectionId, + this.sectionName, + this.serviceRating, + this.specialistDeadline, + this.ticketId, + this.ticketReferenceNo, + this.ticketStatusId, + this.ticketStatusInternalName, + this.ticketStatusName, + this.ticketTypeId, + this.ticketTypeName, + this.topicId, + this.topicName, + this.totalItemsCount}); + + GetTicketsByEmployeeList.fromJson(Map json) { + agentRating = json['agentRating']; + assignedSpecialist = json['assignedSpecialist']; + assignedSpecialistName = json['assignedSpecialistName']; + assignedToSpecialistAt = json['assignedToSpecialistAt']; + channelId = json['channelId']; + channelName = json['channelName']; + closedBy = json['closedBy']; + closedDate = json['closedDate']; + created = json['created']; + departmentId = json['departmentId']; + departmentName = json['departmentName']; + description = json['description']; + employeeEmail = json['employeeEmail']; + employeeName = json['employeeName']; + employeeNumber = json['employeeNumber']; + firstName = json['firstName']; + isActive = json['isActive']; + isClosedDirectly = json['isClosedDirectly']; + isEscalated = json['isEscalated']; + isExceedTAT = json['isExceedTAT']; + lastName = json['lastName']; + mobileNumber = json['mobileNumber']; + pageNo = json['pageNo']; + pageSize = json['pageSize']; + positionTitle = json['positionTitle']; + projectId = json['projectId']; + projectManager = json['projectManager']; + projectName = json['projectName']; + providedSolution = json['providedSolution']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + serviceRating = json['serviceRating']; + specialistDeadline = json['specialistDeadline']; + ticketId = json['ticketId']; + ticketReferenceNo = json['ticketReferenceNo']; + ticketStatusId = json['ticketStatusId']; + ticketStatusInternalName = json['ticketStatusInternalName']; + ticketStatusName = json['ticketStatusName']; + ticketTypeId = json['ticketTypeId']; + ticketTypeName = json['ticketTypeName']; + topicId = json['topicId']; + topicName = json['topicName']; + totalItemsCount = json['totalItemsCount']; + } + + Map toJson() { + final Map data = {}; + data['agentRating'] = agentRating; + data['assignedSpecialist'] = assignedSpecialist; + data['assignedSpecialistName'] = assignedSpecialistName; + data['assignedToSpecialistAt'] = assignedToSpecialistAt; + data['channelId'] = channelId; + data['channelName'] = channelName; + data['closedBy'] = closedBy; + data['closedDate'] = closedDate; + data['created'] = created; + data['departmentId'] = departmentId; + data['departmentName'] = departmentName; + data['description'] = description; + data['employeeEmail'] = employeeEmail; + data['employeeName'] = employeeName; + data['employeeNumber'] = employeeNumber; + data['firstName'] = firstName; + data['isActive'] = isActive; + data['isClosedDirectly'] = isClosedDirectly; + data['isEscalated'] = isEscalated; + data['isExceedTAT'] = isExceedTAT; + data['lastName'] = lastName; + data['mobileNumber'] = mobileNumber; + data['pageNo'] = pageNo; + data['pageSize'] = pageSize; + data['positionTitle'] = positionTitle; + data['projectId'] = projectId; + data['projectManager'] = projectManager; + data['projectName'] = projectName; + data['providedSolution'] = providedSolution; + data['sectionId'] = sectionId; + data['sectionName'] = sectionName; + data['serviceRating'] = serviceRating; + data['specialistDeadline'] = specialistDeadline; + data['ticketId'] = ticketId; + data['ticketReferenceNo'] = ticketReferenceNo; + data['ticketStatusId'] = ticketStatusId; + data['ticketStatusInternalName'] = ticketStatusInternalName; + data['ticketStatusName'] = ticketStatusName; + data['ticketTypeId'] = ticketTypeId; + data['ticketTypeName'] = ticketTypeName; + data['topicId'] = topicId; + data['topicName'] = topicName; + data['totalItemsCount'] = totalItemsCount; + return data; + } +} diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index 4ef5eb4..4732d36 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/ui/landing/widget/drawer_item.dart'; -import 'package:provider/provider.dart'; class AppDrawer extends StatefulWidget { @override @@ -21,16 +20,26 @@ class _AppDrawerState extends State { ), Expanded( child: ListView(padding: const EdgeInsets.all(21), physics: const BouncingScrollPhysics(), children: [ - Divider(), + const Divider(), InkWell( - child: DrawerItem( + child: const DrawerItem( 'My Profile', icon: Icons.person, color: Colors.grey, ), onTap: () { drawerNavigator(context, AppRoutes.profile); - }) + }), + const Divider(), + InkWell( + child: const DrawerItem( + 'Mowadhafhi', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.mowadhafhi); + }) ])) ]))); } diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart new file mode 100644 index 0000000..9438be1 --- /dev/null +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; + +import '../../../widgets/app_bar_widget.dart'; + +class MowadhafhiHome extends StatefulWidget { + const MowadhafhiHome({Key? key}) : super(key: key); + + @override + _MowadhafhiHomeState createState() => _MowadhafhiHomeState(); +} + +class _MowadhafhiHomeState extends State { + List getTicketsByEmployeeList = []; + + @override + void initState() { + getOpenTickets(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + openRequestDetails(getTicketsByEmployeeList[index].ticketId!); + }, + child: Container( + width: double.infinity, + // height: 100.0, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList[index].ticketTypeName!.toText14(color: MyColors.grey57Color), + getTicketsByEmployeeList[index].created!.split(" ")[0].toText12(color: MyColors.grey70Color), + ], + ), + Container( + padding: const EdgeInsets.only(top: 10.0), + child: getTicketsByEmployeeList[index].description!.toText12(color: MyColors.grey57Color), + ), + Container( + padding: const EdgeInsets.only(top: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList[index].ticketStatusInternalName!.toText14(color: MyColors.gradiantEndColor), + SvgPicture.asset( + "assets/images/arrow_next.svg", + color: MyColors.darkIconColor, + ) + ], + ), + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => 12.height, + itemCount: getTicketsByEmployeeList.length ?? 0)) + ], + ), + ), + ); + } + + void openRequestDetails(String itgTicketID) async { + await Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: itgTicketID); + } + + void getOpenTickets() async { + try { + Utils.showLoading(context); + getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketsByEmployee(); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/mowadhafhi/request_details.dart b/lib/ui/screens/mowadhafhi/request_details.dart new file mode 100644 index 0000000..ec7db4b --- /dev/null +++ b/lib/ui/screens/mowadhafhi/request_details.dart @@ -0,0 +1,213 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class MowadhafhiRequestDetails extends StatefulWidget { + const MowadhafhiRequestDetails({Key? key}) : super(key: key); + + @override + _RequestDetailsState createState() => _RequestDetailsState(); +} + +class _RequestDetailsState extends State { + String? itgTicketID; + List getTicketsByEmployeeList = []; + List getTicketTransactionsList = []; + + @override + void initState() { + // TODO: implement initState + super.initState(); + } + + getRequestID() { + if (itgTicketID == null) { + itgTicketID = ModalRoute.of(context)?.settings.arguments as String; + debugPrint(itgTicketID); + getTicketDetails(); + } + } + + @override + Widget build(BuildContext context) { + getRequestID(); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: SingleChildScrollView( + child: getTicketsByEmployeeList.length != 0 + ? Column( + children: [ + Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + margin: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList![0].ticketStatusName!.toText14(color: MyColors.gradiantEndColor), + getTicketsByEmployeeList![0].created!.split(" ")[0].toText12(color: MyColors.grey70Color), + ], + ), + 8.height, + "Ticket Reference: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].ticketReferenceNo!.toText14(color: MyColors.grey57Color), + 8.height, + "Section: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].sectionName!.toText14(color: MyColors.grey57Color), + 8.height, + "Topic: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].topicName!.toText14(color: MyColors.grey57Color), + 8.height, + "Description: ".toText12(color: MyColors.grey98Color), + getTicketsByEmployeeList![0].description!.toText14(color: MyColors.grey57Color), + ], + ), + ), + Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + margin: const EdgeInsets.only(left: 12, right: 12, top: 12, bottom: 12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListView.builder( + shrinkWrap: true, + physics: const ScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return Stack( + children: [ + Padding( + padding: const EdgeInsets.only(left: 50.0), + child: Card( + elevation: 0.0, + margin: const EdgeInsets.fromLTRB(0.0, 20.0, 20.0, 10.0), + child: Container( + padding: const EdgeInsets.all(12.0), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + "Action By: ".toText14(color: MyColors.grey57Color), + getTicketTransactionsList![index].actionBy!.toText14(color: MyColors.grey57Color), + ], + ), + getTicketTransactionsList![index].comments!.toText14(color: MyColors.grey98Color), + 12.height, + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + getTicketTransactionsList![0].actionDate!.split(" ")[0].toText12(color: MyColors.grey70Color), + ], + ), + ], + ), + ), + ), + ), + Positioned( + top: 0.0, + bottom: 0.0, + left: 28.0, + child: Container( + height: double.infinity, + width: 3.0, + color: MyColors.lightTextColor.withOpacity(0.5), + ), + ), + Positioned( + top: 0.0, + left: 15.0, + child: Container( + height: 30.0, + width: 30.0, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + ), + child: Container( + margin: const EdgeInsets.all(5.0), + height: 30.0, + width: 30.0, + decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.gradiantEndColor), + ), + ), + ) + ], + ); + }, + itemCount: getTicketTransactionsList.length ?? 0, + ) + ], + ), + ), + ], + ) + : Container(), + ), + ); + } + + void getTicketDetails() async { + try { + Utils.showLoading(context); + getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketDetailsByEmployee(itgTicketID); + Utils.hideLoading(context); + setState(() {}); + getTicketTransactions(); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getTicketTransactions() async { + try { + Utils.showLoading(context); + getTicketTransactionsList = await MowadhafhiApiClient().getTicketTransactions(itgTicketID); + debugPrint(getTicketTransactionsList![0].actionDate); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} From 42e93e42a97be2fae24c5cfd457bb4f0d87fdd46 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 20 Jun 2022 12:58:44 +0300 Subject: [PATCH 12/22] merge issue fixed --- lib/ui/my_attendance/my_attendance_screen.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index cb347a1..2a337a3 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -36,7 +36,7 @@ class MyAttendanceScreen extends StatelessWidget { "assets/images/pdf.svg", LocaleKeys.missingSwipes.tr(), ).onPress(() { - Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS")); + Navigator.pushNamed(context, AppRoutes.monthlyAttendance); }), 12.height, ListView.separated( From 9e8bc47f7e29adc64d1dcee892f6d652b54c8404 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 20 Jun 2022 16:47:47 +0300 Subject: [PATCH 13/22] Mowadhafhi request completed --- lib/api/mowadhafhi/mowadhafhi_api_client.dart | 86 ++++ lib/config/routes.dart | 3 + lib/models/generic_response_model.dart | 50 +++ .../mowadhafhi/get_department_sections.dart | 44 ++ .../mowadhafhi/get_project_departments.dart | 32 ++ lib/models/mowadhafhi/get_projects.dart | 18 + lib/models/mowadhafhi/get_section_topics.dart | 60 +++ lib/models/mowadhafhi/get_ticket_types.dart | 21 + .../mowadhafhi_attachement_request.dart | 22 + .../screens/mowadhafhi/mowadhafhi_home.dart | 24 +- .../mowadhafhi/mowadhafhi_hr_request.dart | 387 ++++++++++++++++++ 11 files changed, 746 insertions(+), 1 deletion(-) create mode 100644 lib/models/mowadhafhi/get_department_sections.dart create mode 100644 lib/models/mowadhafhi/get_project_departments.dart create mode 100644 lib/models/mowadhafhi/get_projects.dart create mode 100644 lib/models/mowadhafhi/get_section_topics.dart create mode 100644 lib/models/mowadhafhi/get_ticket_types.dart create mode 100644 lib/models/mowadhafhi/mowadhafhi_attachement_request.dart create mode 100644 lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart diff --git a/lib/api/mowadhafhi/mowadhafhi_api_client.dart b/lib/api/mowadhafhi/mowadhafhi_api_client.dart index b36dcd0..935a22f 100644 --- a/lib/api/mowadhafhi/mowadhafhi_api_client.dart +++ b/lib/api/mowadhafhi/mowadhafhi_api_client.dart @@ -2,8 +2,13 @@ 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/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; import '../../models/mowadhafhi/get_tickets_list.dart'; @@ -47,4 +52,85 @@ class MowadhafhiApiClient { }, url, postParams); } + Future> getTicketTypes() async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetTicketTypes"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getTicketTypes ?? []; + }, url, postParams); + } + + Future> getProjects() async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetProjects"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgProjectCode": AppState().memberInformationList?.pAYROLLCODE}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getMowadhafhiProjects ?? []; + }, url, postParams); + } + + Future> getProjectDepartments(int projectID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetProjectDepartments"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgProjectId": projectID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getProjectDepartments ?? []; + }, url, postParams); + } + + Future> getDepartmentSections(int? projectDepartmentID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetDepartmentSections"; + Map postParams = { + "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, + "ItgDepartmentSectionId": projectDepartmentID, + "ItgProjectDepartmentId": projectDepartmentID + }; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getDepartmentSections ?? []; + }, url, postParams); + } + + Future> getSectionTopics(int? departmentSectionID) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_GetSectionTopics"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, "ItgDepartmentSectionId": departmentSectionID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getSectionTopics ?? []; + }, url, postParams); + } + + Future submitRequest(int? departmentID, String description, int? projectID, String? sectionID, String? sectionTopicID, int? ticketTypeID, List> attachmentList) async { + String url = "${ApiConsts.cocRest}Mohemm_ITG_CreateTicketMobile"; + Map postParams = { + "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, + "ItgImageCollList" : attachmentList, + "channelId": 3, + "departmentId": departmentID, + "description": description, + "employeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, + "projectId": projectID, + "sectionId": sectionID, + "sectionTopicId": sectionTopicID, + "ticketStatus": "new", + "ticketTypeId": ticketTypeID + }; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.messageStatus; + }, url, postParams); + } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 14b3abe..e181e9a 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -21,6 +21,7 @@ import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; +import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart'; import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; @@ -80,6 +81,7 @@ class AppRoutes { // Mowadhafhi static const String mowadhafhi = "/mowadhafhi"; static const String mowadhafhiDetails = "/mowadhafhiDetails"; + static const String mowadhafhiHRRequest = "/mowadhafhiHRRequest"; static final Map routes = { login: (context) => LoginScreen(), @@ -127,5 +129,6 @@ class AppRoutes { //mowadhafhi mowadhafhi: (context) => MowadhafhiHome(), mowadhafhiDetails: (context) => MowadhafhiRequestDetails(), + mowadhafhiHRRequest: (context) => MowadhafhiHRRequest(), }; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 095a330..edc3b90 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -24,8 +24,13 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; @@ -192,6 +197,11 @@ class GenericResponseModel { List? getTicketsByEmployeeList; List? getTicketDetailsByEmployee; List? getTicketTransactions; + List? getTicketTypes; + List? getSectionTopics; + List? getMowadhafhiProjects; + List? getProjectDepartments; + List? getDepartmentSections; List? getUserItemTypesList; List? getVacationRulesList; List? getVaccinationOnHandList; @@ -448,6 +458,11 @@ class GenericResponseModel { this.getTicketsByEmployeeList, this.getTicketDetailsByEmployee, this.getTicketTransactions, + this.getTicketTypes, + this.getSectionTopics, + this.getMowadhafhiProjects, + this.getProjectDepartments, + this.getDepartmentSections, this.getUserItemTypesList, this.getVacationRulesList, this.getVaccinationOnHandList, @@ -874,6 +889,41 @@ class GenericResponseModel { }); } + if (json['Mohemm_Itg_TicketTypesList'] != null) { + getTicketTypes = []; + json['Mohemm_Itg_TicketTypesList'].forEach((v) { + getTicketTypes!.add(new GetTicketTypes.fromJson(v)); + }); + } + + if (json['Mohemm_Itg_ProjectsList'] != null) { + getMowadhafhiProjects = []; + json['Mohemm_Itg_ProjectsList'].forEach((v) { + getMowadhafhiProjects!.add(new GetMowadhafhiProjects.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_ProjectDepartmentsList'] != null) { + getProjectDepartments = []; + json['Mohemm_ITG_ProjectDepartmentsList'].forEach((v) { + getProjectDepartments!.add(new GetProjectDepartments.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_DepartmentSectionsList'] != null) { + getDepartmentSections = []; + json['Mohemm_ITG_DepartmentSectionsList'].forEach((v) { + getDepartmentSections!.add(new GetDepartmentSections.fromJson(v)); + }); + } + + if (json['Mohemm_ITG_SectionTopicsList'] != null) { + getSectionTopics = []; + json['Mohemm_ITG_SectionTopicsList'].forEach((v) { + getSectionTopics!.add(new GetSectionTopics.fromJson(v)); + }); + } + getUserItemTypesList = json['GetUserItemTypesList']; getVacationRulesList = json['GetVacationRulesList']; getVaccinationOnHandList = json['GetVaccinationOnHandList']; diff --git a/lib/models/mowadhafhi/get_department_sections.dart b/lib/models/mowadhafhi/get_department_sections.dart new file mode 100644 index 0000000..2d534ba --- /dev/null +++ b/lib/models/mowadhafhi/get_department_sections.dart @@ -0,0 +1,44 @@ +class GetDepartmentSections { + int? departmentId; + String? departmentName; + int? departmentSectionId; + String? projectCode; + int? projectId; + String? projectName; + int? sectionId; + String? sectionName; + + GetDepartmentSections( + {this.departmentId, + this.departmentName, + this.departmentSectionId, + this.projectCode, + this.projectId, + this.projectName, + this.sectionId, + this.sectionName}); + + GetDepartmentSections.fromJson(Map json) { + departmentId = json['departmentId']; + departmentName = json['departmentName']; + departmentSectionId = json['departmentSectionId']; + projectCode = json['projectCode']; + projectId = json['projectId']; + projectName = json['projectName']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + } + + Map toJson() { + final Map data = new Map(); + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['departmentSectionId'] = this.departmentSectionId; + data['projectCode'] = this.projectCode; + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + data['sectionId'] = this.sectionId; + data['sectionName'] = this.sectionName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_project_departments.dart b/lib/models/mowadhafhi/get_project_departments.dart new file mode 100644 index 0000000..436399d --- /dev/null +++ b/lib/models/mowadhafhi/get_project_departments.dart @@ -0,0 +1,32 @@ +class GetProjectDepartments { + int? departmentId; + String? departmentName; + String? projectCode; + int? projectDepartmentId; + String? projectName; + + GetProjectDepartments( + {this.departmentId, + this.departmentName, + this.projectCode, + this.projectDepartmentId, + this.projectName}); + + GetProjectDepartments.fromJson(Map json) { + departmentId = json['departmentId']; + departmentName = json['departmentName']; + projectCode = json['projectCode']; + projectDepartmentId = json['projectDepartmentId']; + projectName = json['projectName']; + } + + Map toJson() { + final Map data = new Map(); + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['projectCode'] = this.projectCode; + data['projectDepartmentId'] = this.projectDepartmentId; + data['projectName'] = this.projectName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_projects.dart b/lib/models/mowadhafhi/get_projects.dart new file mode 100644 index 0000000..62b99c3 --- /dev/null +++ b/lib/models/mowadhafhi/get_projects.dart @@ -0,0 +1,18 @@ +class GetMowadhafhiProjects { + int? projectId; + String? projectName; + + GetMowadhafhiProjects({this.projectId, this.projectName}); + + GetMowadhafhiProjects.fromJson(Map json) { + projectId = json['projectId']; + projectName = json['projectName']; + } + + Map toJson() { + final Map data = new Map(); + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_section_topics.dart b/lib/models/mowadhafhi/get_section_topics.dart new file mode 100644 index 0000000..c596527 --- /dev/null +++ b/lib/models/mowadhafhi/get_section_topics.dart @@ -0,0 +1,60 @@ +class GetSectionTopics { + int? departmentId; + String? departmentName; + String? projectCode; + int? projectDepartmentId; + int? projectId; + String? projectName; + int? sectionId; + String? sectionName; + int? sectionTopicId; + int? tatInHours; + int? topicId; + String? topicName; + + GetSectionTopics( + {this.departmentId, + this.departmentName, + this.projectCode, + this.projectDepartmentId, + this.projectId, + this.projectName, + this.sectionId, + this.sectionName, + this.sectionTopicId, + this.tatInHours, + this.topicId, + this.topicName}); + + GetSectionTopics.fromJson(Map json) { + departmentId = json['departmentId']; + departmentName = json['departmentName']; + projectCode = json['projectCode']; + projectDepartmentId = json['projectDepartmentId']; + projectId = json['projectId']; + projectName = json['projectName']; + sectionId = json['sectionId']; + sectionName = json['sectionName']; + sectionTopicId = json['sectionTopicId']; + tatInHours = json['tatInHours']; + topicId = json['topicId']; + topicName = json['topicName']; + } + + Map toJson() { + final Map data = new Map(); + data['departmentId'] = this.departmentId; + data['departmentName'] = this.departmentName; + data['projectCode'] = this.projectCode; + data['projectDepartmentId'] = this.projectDepartmentId; + data['projectId'] = this.projectId; + data['projectName'] = this.projectName; + data['sectionId'] = this.sectionId; + data['sectionName'] = this.sectionName; + data['sectionTopicId'] = this.sectionTopicId; + data['tatInHours'] = this.tatInHours; + data['topicId'] = this.topicId; + data['topicName'] = this.topicName; + return data; + } +} diff --git a/lib/models/mowadhafhi/get_ticket_types.dart b/lib/models/mowadhafhi/get_ticket_types.dart new file mode 100644 index 0000000..ae68e2d --- /dev/null +++ b/lib/models/mowadhafhi/get_ticket_types.dart @@ -0,0 +1,21 @@ +class GetTicketTypes { + String? ticketIdPrefix; + int? ticketTypeId; + String? typeName; + + GetTicketTypes({this.ticketIdPrefix, this.ticketTypeId, this.typeName}); + + GetTicketTypes.fromJson(Map json) { + ticketIdPrefix = json['ticketIdPrefix']; + ticketTypeId = json['ticketTypeId']; + typeName = json['typeName']; + } + + Map toJson() { + final Map data = new Map(); + data['ticketIdPrefix'] = this.ticketIdPrefix; + data['ticketTypeId'] = this.ticketTypeId; + data['typeName'] = this.typeName; + return data; + } +} diff --git a/lib/models/mowadhafhi/mowadhafhi_attachement_request.dart b/lib/models/mowadhafhi/mowadhafhi_attachement_request.dart new file mode 100644 index 0000000..a72bd16 --- /dev/null +++ b/lib/models/mowadhafhi/mowadhafhi_attachement_request.dart @@ -0,0 +1,22 @@ +class MowadhafhiRequestAttachment { + String? base64Data; + String? fileName; + String? contentType; + + MowadhafhiRequestAttachment( + {this.base64Data, this.fileName, this.contentType}); + + MowadhafhiRequestAttachment.fromJson(Map json) { + base64Data = json['Base64Data']; + fileName = json['FileName']; + contentType = json['ContentType']; + } + + Map toJson() { + final Map data = new Map(); + data['Base64Data'] = this.base64Data; + data['FileName'] = this.fileName; + data['ContentType'] = this.contentType; + return data; + } +} diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart index 9438be1..6dd0f0d 100644 --- a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart @@ -1,3 +1,4 @@ +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; @@ -6,7 +7,9 @@ import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import '../../../widgets/app_bar_widget.dart'; @@ -99,10 +102,22 @@ class _MowadhafhiHomeState extends State { ); }, separatorBuilder: (BuildContext context, int index) => 12.height, - itemCount: getTicketsByEmployeeList.length ?? 0)) + itemCount: getTicketsByEmployeeList.length ?? 0)), + 80.height ], ), ), + bottomSheet: Container( + decoration: const BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton(LocaleKeys.createRequest.tr(), () async { + openHRRequest(); + }).insideContainer, + ) ); } @@ -110,9 +125,16 @@ class _MowadhafhiHomeState extends State { await Navigator.pushNamed(context, AppRoutes.mowadhafhiDetails, arguments: itgTicketID); } + void openHRRequest() async { + await Navigator.pushNamed(context, AppRoutes.mowadhafhiHRRequest).then((value) { + getOpenTickets(); + }); + } + void getOpenTickets() async { try { Utils.showLoading(context); + getTicketsByEmployeeList.clear(); getTicketsByEmployeeList = await MowadhafhiApiClient().getTicketsByEmployee(); Utils.hideLoading(context); setState(() {}); diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart new file mode 100644 index 0000000..6ed9cb5 --- /dev/null +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart @@ -0,0 +1,387 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/mowadhafhi_attachement_request.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/button/simple_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; +import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; + +class MowadhafhiHRRequest extends StatefulWidget { + const MowadhafhiHRRequest({Key? key}) : super(key: key); + + @override + _MowadhafhiHRRequestState createState() => _MowadhafhiHRRequestState(); +} + +class _MowadhafhiHRRequestState extends State { + List getTicketTypesList = []; + List getMowadhafhiProjectsList = []; + List getProjectDepartmentsList = []; + List getDepartmentSectionsList = []; + List getSectionTopicsList = []; + + GetProjectDepartments? selectedDepartment; + GetDepartmentSections? selectedSection; + GetSectionTopics? selectedTopic; + List attachmentFiles = []; + + String selectedServiceType = ""; + String description = ""; + int? projectID; + + @override + void initState() { + getTicketTypes(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: SingleChildScrollView( + child: getTicketTypesList.isNotEmpty + ? Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Service Type: ".toText16(), + 12.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + height: 40, + child: ListView.separated( + itemBuilder: (context, index) { + return Container( + padding: const EdgeInsets.only(right: 6, top: 8, bottom: 8), + child: ShowRadio( + title: getTicketTypesList[index].typeName!, + value: getTicketTypesList[index].ticketTypeId!.toString(), + groupValue: selectedServiceType, + selectedColor: MyColors.gradiantStartColor), + ).onPress(() { + debugPrint(getTicketTypesList[index].typeName!); + selectedServiceType = getTicketTypesList[index].ticketTypeId!.toString(); + setState(() {}); + }); + }, + separatorBuilder: (context, index) => 1.width, + shrinkWrap: true, + itemCount: getTicketTypesList.length ?? 0, + scrollDirection: Axis.horizontal, + ), + ), + ], + ), + 12.height, + "Department Name: ".toText16(), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Select Department", + selectedDepartment?.departmentName ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getProjectDepartmentsList!.length; i++) PopupMenuItem(child: Text(getProjectDepartmentsList![i].departmentName!), value: i), + ], + onSelected: (int popupIndex) { + selectedDepartment = getProjectDepartmentsList![popupIndex]; + getDepartmentSections(selectedDepartment?.projectDepartmentId); + setState(() {}); + }), + 12.height, + "Related Section: ".toText16(), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Select Section", + selectedSection?.sectionName ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getDepartmentSectionsList!.length; i++) PopupMenuItem(child: Text(getDepartmentSectionsList![i].sectionName!), value: i), + ], + onSelected: (int popupIndex) { + selectedSection = getDepartmentSectionsList![popupIndex]; + getSectionTopics(selectedSection?.departmentSectionId); + setState(() {}); + }), + 12.height, + "Related Topic: ".toText16(), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Select Topic", + selectedTopic?.topicName ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getSectionTopicsList!.length; i++) PopupMenuItem(child: Text(getSectionTopicsList![i].topicName!), value: i), + ], + onSelected: (int popupIndex) { + selectedTopic = getSectionTopicsList![popupIndex]; + // getDepartmentSections(selectedSection?.departmentSectionId); + setState(() {}); + }), + 12.height, + "Supporting Document: ".toText16(), + 12.height, + attachmentView("Attachments"), + 12.height, + "Description: ".toText16(), + 12.height, + DynamicTextFieldWidget( + "", + "", + isEnable: true, + isPopup: false, + lines: 4, + isInputTypeNum: false, + isReadOnly: false, + onChange: (String value) { + debugPrint(value); + description = value; + }, + ), + 50.height + ], + ), + ) + : Container(), + ), + bottomSheet: Container( + padding: const EdgeInsets.only(top: 8.0, bottom: 8.0), + decoration: const BoxDecoration( + color: MyColors.white, + ), + child: Row( + children: [ + 12.width, + Expanded( + child: DefaultButton( + "Submit", + !checkValidation() + ? null + : () { + submitHRRequest(); + }, + color: const Color(0xFFD02127), + ), + ), + 12.width, + ], + ), + ), + ); + } + + bool checkValidation() { + if (selectedServiceType == "" || selectedDepartment == null || selectedSection == null || selectedTopic == null) { + return false; + } else { + return true; + } + } + + Widget attachmentView(String title) { + return Container( + padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + title.toText16().expanded, + 6.width, + SimpleButton("Add", () async { + FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true); + if (result != null) { + attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList(); + attachmentFiles = attachmentFiles.toSet().toList(); + setState(() {}); + } + }, fontSize: 14), + ], + ), + if (attachmentFiles.isNotEmpty) 12.height, + if (attachmentFiles.isNotEmpty) + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + String fileName = attachmentFiles[index].path.split('/').last; + + return Row( + children: [ + fileName.toText13().expanded, + 6.width, + IconButton( + padding: EdgeInsets.zero, + iconSize: 20, + icon: const Icon(Icons.cancel_rounded), + color: MyColors.redColor, + constraints: const BoxConstraints(), + onPressed: () async { + attachmentFiles.removeAt(index); + setState(() {}); + }, + ) + ], + ); + }, + separatorBuilder: (cxt, index) => 6.height, + itemCount: attachmentFiles.length), + ], + ), + ); + } + + void getTicketTypes() async { + try { + Utils.showLoading(context); + getTicketTypesList = await MowadhafhiApiClient().getTicketTypes(); + Utils.hideLoading(context); + getMowadhafhiProjects(); + // setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getMowadhafhiProjects() async { + try { + Utils.showLoading(context); + getMowadhafhiProjectsList = await MowadhafhiApiClient().getProjects(); + Utils.hideLoading(context); + getProjectDepartments(getMowadhafhiProjectsList[0].projectId!); + projectID = getMowadhafhiProjectsList[0].projectId!; + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getProjectDepartments(int projectID) async { + try { + Utils.showLoading(context); + getProjectDepartmentsList = await MowadhafhiApiClient().getProjectDepartments(projectID); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getDepartmentSections(int? projectDepartmentID) async { + try { + Utils.showLoading(context); + getDepartmentSectionsList = await MowadhafhiApiClient().getDepartmentSections(projectDepartmentID); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void getSectionTopics(int? departmentSectionID) async { + try { + Utils.showLoading(context); + getSectionTopicsList = await MowadhafhiApiClient().getSectionTopics(departmentSectionID); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void submitHRRequest() async { + try { + Utils.showLoading(context); + List> list = []; + if (attachmentFiles.isNotEmpty) { + for (int i = 0; i < attachmentFiles.length; i++) { + String type = attachmentFiles[i].path.split('.').last; + String name = attachmentFiles[i].path.split('/').last; + List fileContent = await attachmentFiles[i].readAsBytes(); + String encodedFile = base64Encode(fileContent); + list.add(MowadhafhiRequestAttachment( + contentType: "image/" + type, + fileName: name, + base64Data: encodedFile, + ).toJson()); + } + } + int? messageStatus = await MowadhafhiApiClient().submitRequest(selectedDepartment?.projectDepartmentId, description, projectID, selectedSection?.departmentSectionId.toString(), + selectedTopic?.sectionTopicId.toString(), int.parse(selectedServiceType), list); + Utils.showToast("Request created successfully"); + Utils.hideLoading(context); + Navigator.pop(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} From cb88f12ced8a2cc6207c05c84ee173510f15fee7 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 21 Jun 2022 10:04:55 +0300 Subject: [PATCH 14/22] return from leave done. --- lib/api/api_client.dart | 2 +- lib/api/my_attendance_api_client.dart | 6 +- .../dynamic_screens/dynamic_input_screen.dart | 69 ++++++++++++++----- 3 files changed, 59 insertions(+), 18 deletions(-) diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index 3263bf4..258b2af 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -89,7 +89,7 @@ class ApiClient { return factoryConstructor(jsonData); } else { APIError? apiError; - apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorMessage']); + apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']); throw APIException(APIException.BAD_REQUEST, error: apiError); } // } catch (ex) { diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index 60247dc..afae637 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -83,8 +83,12 @@ class MyAttendanceApiClient { "P_MENU_TYPE": "E", "P_DESC_FLEX_CONTEXT_CODE": pDescFlexContextCode, "P_FUNCTION_NAME": pFunctionName, - "EITTransactionTBL": list, + // "EITTransactionTBL": list, }; + print(postParams); + postParams["EITTransactionTBL"] =list; + + postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); 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 ec129c8..1a430ea 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -44,6 +44,8 @@ class _DynamicInputScreenState extends State { try { Utils.showLoading(context); genericResponseModel = await MyAttendanceApiClient().getEitDffStructure(dynamicParams!.dynamicId); + dESCFLEXCONTEXTCODE = genericResponseModel!.pDESCFLEXCONTEXTCODE ?? ""; + descFlexConTextTitle = genericResponseModel!.pDESCFLEXCONTEXTNAME ?? ""; getEitDffStructureList = genericResponseModel?.getEITDFFStructureList ?? []; //getEitDffStructureList = getEitDffStructureList!.where((element) => element.dISPLAYFLAG != "N").toList(); Utils.hideLoading(context); @@ -79,7 +81,8 @@ class _DynamicInputScreenState extends State { genericResponseModel = await MyAttendanceApiClient().validateEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); SubmitEITTransactionList submitEITTransactionList = await MyAttendanceApiClient().submitEitTransaction(dESCFLEXCONTEXTCODE, dynamicParams!.dynamicId, values); Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, arguments: RequestSubmitScreenParams("title", submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!)); + Navigator.pushNamed(context, AppRoutes.requestSubmitScreen, + arguments: RequestSubmitScreenParams(descFlexConTextTitle, submitEITTransactionList.pTRANSACTIONID!, submitEITTransactionList.pITEMKEY!)); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); @@ -87,12 +90,13 @@ class _DynamicInputScreenState extends State { } String dESCFLEXCONTEXTCODE = ""; + String descFlexConTextTitle = ""; void calGetValueSetValues(GetEITDFFStructureList structureList) async { try { Utils.showLoading(context); String segmentId = structureList.cHILDSEGMENTSVS!; - dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; + if (dESCFLEXCONTEXTCODE.isEmpty) dESCFLEXCONTEXTCODE = structureList.dESCFLEXCONTEXTCODE!; List filteredList = getEitDffStructureList?.where((element) => element.cHILDSEGMENTSVS == segmentId).toList() ?? []; List> values = filteredList @@ -202,6 +206,10 @@ class _DynamicInputScreenState extends State { isReadOnly: model.rEADONLY == "Y", onChange: (text) { model.fieldAnswer = text; + if (model.eSERVICESDV == null) { + model.eSERVICESDV = ESERVICESDV(); + } + model.eSERVICESDV!.pIDCOLUMNNAME = text; }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "N") { @@ -212,6 +220,10 @@ class _DynamicInputScreenState extends State { isInputTypeNum: true, onChange: (text) { model.fieldAnswer = text; + if (model.eSERVICESDV == null) { + model.eSERVICESDV = ESERVICESDV(); + } + model.eSERVICESDV!.pIDCOLUMNNAME = text; }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "X") { @@ -239,12 +251,21 @@ class _DynamicInputScreenState extends State { } DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); - getEitDffStructureList![index].fieldAnswer = date.toString(); - ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), - pRETURNMSG: "null", - pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + // getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv; + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy/MM/dd HH:MM:SS').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy/MM/dd HH:MM:SS').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + } else { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + } getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { @@ -270,23 +291,39 @@ class _DynamicInputScreenState extends State { onTap: () async { if ((getEitDffStructureList![index].eSERVICESDV?.pVALUECOLUMNNAME != null)) { if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { - selectedDate = DateFormat("yyyy-MM-dd").parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!.replaceAll('/"', '').replaceAll(" 00:00:00", "")); + String tempDate = getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!; + if (tempDate.contains("00:00:00")) { + tempDate = tempDate.replaceAll("00:00:00", '').trim(); + } + selectedDate = DateFormat("yyyy/MM/dd").parse(tempDate); } else { selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); } } DateTime date = await _selectDate(context); DateTime date1 = DateTime(date.year, date.month, date.day); - getEitDffStructureList![index].fieldAnswer = date.toString(); - ESERVICESDV eservicesdv = ESERVICESDV( - pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), - pRETURNMSG: "null", - pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, - pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + // getEitDffStructureList![index].fieldAnswer = date.toString(); + ESERVICESDV eservicesdv; + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy/MM/dd HH:MM:SS').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd HH:MM:SS').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + } else { + eservicesdv = ESERVICESDV( + pIDCOLUMNNAME: DateFormat('yyyy-MM-dd').format(date1), + pRETURNMSG: "null", + pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, + pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); + } + getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - calGetValueSetValues(model); + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { + calGetValueSetValues(model); + } else {} } }, ).paddingOnly(bottom: 12); From 427c5fb5b66ac9e41e8cee0a5f8c453c3fea1c39 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 21 Jun 2022 14:55:26 +0300 Subject: [PATCH 15/22] Pending Transactions implemented --- lib/api/pending_transactions_api_client.dart | 36 ++++ lib/classes/date_uitl.dart | 2 +- lib/classes/utils.dart | 15 ++ lib/config/routes.dart | 11 ++ lib/models/generic_response_model.dart | 36 +++- .../get_pending_transactions_details.dart | 56 ++++++ .../get_req_functions.dart | 22 +++ lib/ui/landing/widget/app_drawer.dart | 10 + .../pending_transactions.dart | 182 ++++++++++++++++++ .../pending_transactions_details.dart | 137 +++++++++++++ 10 files changed, 498 insertions(+), 9 deletions(-) create mode 100644 lib/api/pending_transactions_api_client.dart create mode 100644 lib/models/pending_transactions/get_pending_transactions_details.dart create mode 100644 lib/models/pending_transactions/get_req_functions.dart create mode 100644 lib/ui/screens/pending_transactions/pending_transactions.dart create mode 100644 lib/ui/screens/pending_transactions/pending_transactions_details.dart diff --git a/lib/api/pending_transactions_api_client.dart b/lib/api/pending_transactions_api_client.dart new file mode 100644 index 0000000..45e87af --- /dev/null +++ b/lib/api/pending_transactions_api_client.dart @@ -0,0 +1,36 @@ +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/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; + +class PendingTransactionsApiClient { + static final PendingTransactionsApiClient _instance = PendingTransactionsApiClient._internal(); + + PendingTransactionsApiClient._internal(); + + factory PendingTransactionsApiClient() => _instance; + + Future> getPendingReqFunctions() async { + String url = "${ApiConsts.erpRest}GET_PENDING_REQ_FUNCTIONS"; + Map postParams = {}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPendingTransactionsFunctions ?? []; + }, url, postParams); + } + + Future> getPendingTransactionsDetails(String functionID, String dateFrom, String dateTo) async { + String url = "${ApiConsts.erpRest}GET_PENDING_REQ_DETAILS"; + Map postParams = {"P_FUNCTION_ID": functionID, "P_PAGE_LIMIT": 20, "P_PAGE_NUM": 1, "P_CREATION_DATE_FROM": dateFrom, "P_CREATION_DATE_TO": dateTo}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPendingTransactionsDetails ?? []; + }, url, postParams); + } +} diff --git a/lib/classes/date_uitl.dart b/lib/classes/date_uitl.dart index c350cb6..7fb4b9f 100644 --- a/lib/classes/date_uitl.dart +++ b/lib/classes/date_uitl.dart @@ -61,7 +61,7 @@ class DateUtil { static String convertDateToString(DateTime date) { const start = "/Date("; - const end = "+0300)"; + const end = "+0300)/"; int milliseconds = date.millisecondsSinceEpoch; return start + "$milliseconds" + end; diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 959333e..ea7b559 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/config/routes.dart'; @@ -118,6 +119,20 @@ class Utils { ); } + static Widget getNoDataWidget(BuildContext context) { + return Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset('assets/images/not_found.svg', width: 110.0, height: 110.0), + Container(margin: const EdgeInsets.only(top: 15.0), child: const Text("No Result Found", style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xFFBABABA)))), + ], + ), + ), + ); + } + static getPostBytes(img) { try { var b64 = img.replaceFirst('data:image/png;base64,', ''); diff --git a/lib/config/routes.dart b/lib/config/routes.dart index e181e9a..fad3e9d 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -23,6 +23,8 @@ import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart'; import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart'; +import 'package:mohem_flutter_app/ui/screens/pending_transactions/pending_transactions.dart'; +import 'package:mohem_flutter_app/ui/screens/pending_transactions/pending_transactions_details.dart'; import 'package:mohem_flutter_app/ui/screens/profile/profile_screen.dart'; import 'package:mohem_flutter_app/ui/screens/submenu_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/item_history_screen.dart'; @@ -83,6 +85,12 @@ class AppRoutes { static const String mowadhafhiDetails = "/mowadhafhiDetails"; static const String mowadhafhiHRRequest = "/mowadhafhiHRRequest"; + + static const String pendingTransactions = "/pendingTransactions"; + static const String pendingTransactionsDetails = "/pendingTransactionsDetails"; + + + static final Map routes = { login: (context) => LoginScreen(), verifyLogin: (context) => VerifyLoginScreen(), @@ -130,5 +138,8 @@ class AppRoutes { mowadhafhi: (context) => MowadhafhiHome(), mowadhafhiDetails: (context) => MowadhafhiRequestDetails(), mowadhafhiHRRequest: (context) => MowadhafhiHRRequest(), + + pendingTransactions: (context) => PendingTransactions(), + pendingTransactionsDetails: (context) => PendingTransactionsDetails() }; } diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index edc3b90..00404f4 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -34,6 +34,8 @@ import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; @@ -168,8 +170,8 @@ class GenericResponseModel { List? getOrganizationsSalariesList; List? getPaymentInformationList; List? getPayslipList; - List? getPendingReqDetailsList; - List? getPendingReqFunctionsList; + // List? getPendingReqDetailsList; + // List? getPendingReqFunctionsList; List? getPerformanceAppraisalList; List? getPhonesNotificationBodyList; List? getPoItemHistoryList; @@ -202,6 +204,8 @@ class GenericResponseModel { List? getMowadhafhiProjects; List? getProjectDepartments; List? getDepartmentSections; + List? getPendingTransactionsFunctions; + List? getPendingTransactionsDetails; List? getUserItemTypesList; List? getVacationRulesList; List? getVaccinationOnHandList; @@ -429,8 +433,8 @@ class GenericResponseModel { this.getOrganizationsSalariesList, this.getPaymentInformationList, this.getPayslipList, - this.getPendingReqDetailsList, - this.getPendingReqFunctionsList, + // this.getPendingReqDetailsList, + // this.getPendingReqFunctionsList, this.getPerformanceAppraisalList, this.getPhonesNotificationBodyList, this.getPoItemHistoryList, @@ -463,6 +467,8 @@ class GenericResponseModel { this.getMowadhafhiProjects, this.getProjectDepartments, this.getDepartmentSections, + this.getPendingTransactionsFunctions, + this.getPendingTransactionsDetails, this.getUserItemTypesList, this.getVacationRulesList, this.getVaccinationOnHandList, @@ -800,8 +806,8 @@ class GenericResponseModel { getOrganizationsSalariesList = json['GetOrganizationsSalariesList']; getPaymentInformationList = json['GetPaymentInformationList']; getPayslipList = json['GetPayslipList']; - getPendingReqDetailsList = json['GetPendingReqDetailsList']; - getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; + // getPendingReqDetailsList = json['GetPendingReqDetailsList']; + // getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; getPerformanceAppraisalList = json['GetPerformanceAppraisalList']; getPhonesNotificationBodyList = json["GetPhonesNotificationBodyList"] == null ? null : List.from(json["GetPhonesNotificationBodyList"].map((x) => GetPhonesNotificationBodyList.fromJson(x))); @@ -924,6 +930,20 @@ class GenericResponseModel { }); } + if (json['GetPendingReqFunctionsList'] != null) { + getPendingTransactionsFunctions = []; + json['GetPendingReqFunctionsList'].forEach((v) { + getPendingTransactionsFunctions!.add(new GetPendingTransactionsFunctions.fromJson(v)); + }); + } + + if (json['GetPendingReqDetailsList'] != null) { + getPendingTransactionsDetails = []; + json['GetPendingReqDetailsList'].forEach((v) { + getPendingTransactionsDetails!.add(new GetPendingTransactionsDetails.fromJson(v)); + }); + } + getUserItemTypesList = json['GetUserItemTypesList']; getVacationRulesList = json['GetVacationRulesList']; getVaccinationOnHandList = json['GetVaccinationOnHandList']; @@ -1264,8 +1284,8 @@ class GenericResponseModel { data['GetOrganizationsSalariesList'] = this.getOrganizationsSalariesList; data['GetPaymentInformationList'] = this.getPaymentInformationList; data['GetPayslipList'] = this.getPayslipList; - data['GetPendingReqDetailsList'] = this.getPendingReqDetailsList; - data['GetPendingReqFunctionsList'] = this.getPendingReqFunctionsList; + // data['GetPendingReqDetailsList'] = this.getPendingReqDetailsList; + // data['GetPendingReqFunctionsList'] = this.getPendingReqFunctionsList; data['GetPerformanceAppraisalList'] = this.getPerformanceAppraisalList; data['GetPhonesNotificationBodyList'] = this.getPhonesNotificationBodyList; if (this.getPoItemHistoryList != null) { diff --git a/lib/models/pending_transactions/get_pending_transactions_details.dart b/lib/models/pending_transactions/get_pending_transactions_details.dart new file mode 100644 index 0000000..0752269 --- /dev/null +++ b/lib/models/pending_transactions/get_pending_transactions_details.dart @@ -0,0 +1,56 @@ +class GetPendingTransactionsDetails { + String? cREATIONDATE; + int? fROMROWNUM; + String? iTEMKEY; + int? nOOFROWS; + String? rEQUESTTYPE; + int? rOWNUM; + int? tOROWNUM; + String? tRANSACTIONCREATEDFOR; + int? tRANSACTIONID; + String? tRANSACTIONINITIATOR; + String? uSERFUNCTIONNAME; + + GetPendingTransactionsDetails( + {this.cREATIONDATE, + this.fROMROWNUM, + this.iTEMKEY, + this.nOOFROWS, + this.rEQUESTTYPE, + this.rOWNUM, + this.tOROWNUM, + this.tRANSACTIONCREATEDFOR, + this.tRANSACTIONID, + this.tRANSACTIONINITIATOR, + this.uSERFUNCTIONNAME}); + + GetPendingTransactionsDetails.fromJson(Map json) { + cREATIONDATE = json['CREATION_DATE']; + fROMROWNUM = json['FROM_ROW_NUM']; + iTEMKEY = json['ITEM_KEY']; + nOOFROWS = json['NO_OF_ROWS']; + rEQUESTTYPE = json['REQUEST_TYPE']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + tRANSACTIONCREATEDFOR = json['TRANSACTION_CREATED_FOR']; + tRANSACTIONID = json['TRANSACTION_ID']; + tRANSACTIONINITIATOR = json['TRANSACTION_INITIATOR']; + uSERFUNCTIONNAME = json['USER_FUNCTION_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['CREATION_DATE'] = this.cREATIONDATE; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['ITEM_KEY'] = this.iTEMKEY; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['REQUEST_TYPE'] = this.rEQUESTTYPE; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['TRANSACTION_CREATED_FOR'] = this.tRANSACTIONCREATEDFOR; + data['TRANSACTION_ID'] = this.tRANSACTIONID; + data['TRANSACTION_INITIATOR'] = this.tRANSACTIONINITIATOR; + data['USER_FUNCTION_NAME'] = this.uSERFUNCTIONNAME; + return data; + } +} diff --git a/lib/models/pending_transactions/get_req_functions.dart b/lib/models/pending_transactions/get_req_functions.dart new file mode 100644 index 0000000..bfb5892 --- /dev/null +++ b/lib/models/pending_transactions/get_req_functions.dart @@ -0,0 +1,22 @@ +class GetPendingTransactionsFunctions { + int? fUNCTIONID; + String? fUNCTIONNAME; + String? fUNCTIONPROMPT; + + GetPendingTransactionsFunctions( + {this.fUNCTIONID, this.fUNCTIONNAME, this.fUNCTIONPROMPT}); + + GetPendingTransactionsFunctions.fromJson(Map json) { + fUNCTIONID = json['FUNCTION_ID']; + fUNCTIONNAME = json['FUNCTION_NAME']; + fUNCTIONPROMPT = json['FUNCTION_PROMPT']; + } + + Map toJson() { + final Map data = new Map(); + data['FUNCTION_ID'] = this.fUNCTIONID; + data['FUNCTION_NAME'] = this.fUNCTIONNAME; + data['FUNCTION_PROMPT'] = this.fUNCTIONPROMPT; + return data; + } +} diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index 4732d36..c19fab7 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -39,6 +39,16 @@ class _AppDrawerState extends State { ), onTap: () { drawerNavigator(context, AppRoutes.mowadhafhi); + }), + const Divider(), + InkWell( + child: const DrawerItem( + 'Pending Transactions', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.pendingTransactions); }) ])) ]))); diff --git a/lib/ui/screens/pending_transactions/pending_transactions.dart b/lib/ui/screens/pending_transactions/pending_transactions.dart new file mode 100644 index 0000000..e074ad7 --- /dev/null +++ b/lib/ui/screens/pending_transactions/pending_transactions.dart @@ -0,0 +1,182 @@ +import 'dart:io'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.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'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class PendingTransactions extends StatefulWidget { + const PendingTransactions({Key? key}) : super(key: key); + + @override + _PendingTransactionsState createState() => _PendingTransactionsState(); +} + +class _PendingTransactionsState extends State { + List getPendingTransactionsFunctions = []; + GetPendingTransactionsFunctions? selectedFunction; + + DateTime selectedDateFrom = DateTime.now(); + DateTime selectedDateTo = DateTime.now(); + + @override + void initState() { + getRequestTypes(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Pending Transactions", + ), + body: SingleChildScrollView( + child: Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + children: [ + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + "Please select request type", + selectedFunction?.fUNCTIONPROMPT ?? "", + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getPendingTransactionsFunctions!.length; i++) PopupMenuItem(child: Text(getPendingTransactionsFunctions![i].fUNCTIONPROMPT!), value: i), + ], + onSelected: (int popupIndex) { + selectedFunction = getPendingTransactionsFunctions![popupIndex]; + setState(() {}); + }), + 12.height, + DynamicTextFieldWidget( + "Date From: ", + selectedDateFrom.toString().split(" ")[0], + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDateFrom = await _selectDate(context, DateTime.now()); + setState(() {}); + }, + ).paddingOnly(bottom: 12), + 12.height, + DynamicTextFieldWidget( + "Date To: ", + selectedDateTo.toString().split(" ")[0], + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDateTo = await _selectDate(context, DateTime.now()); + setState(() {}); + }, + ).paddingOnly(bottom: 12), + ], + ), + ), + ), + bottomSheet: Container( + decoration: const BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton( + LocaleKeys.submit.tr(), + selectedFunction == null + ? null + : () async { + openRequestDetails(); + }) + .insideContainer, + )); + } + + Future _selectDate(BuildContext context, DateTime selectedDate) async { + DateTime time = selectedDate; + if (!Platform.isIOS) { + await showCupertinoModalPopup( + context: context, + builder: (cxt) => Container( + height: 250, + color: Colors.white, + child: CupertinoDatePicker( + backgroundColor: Colors.white, + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: (value) { + if (value != null && value != selectedDate) { + time = value; + } + }, + initialDateTime: selectedDate, + ), + ), + ); + } else { + final DateTime? picked = + await showDatePicker(context: context, initialDate: selectedDate, initialEntryMode: DatePickerEntryMode.calendarOnly, firstDate: DateTime(2015, 8), lastDate: DateTime(2101)); + if (picked != null && picked != selectedDate) { + time = picked; + } + } + return time; + } + + void getRequestTypes() async { + try { + Utils.showLoading(context); + getPendingTransactionsFunctions = await PendingTransactionsApiClient().getPendingReqFunctions(); + Utils.hideLoading(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void openRequestDetails() async { + await Navigator.pushNamed(context, AppRoutes.pendingTransactionsDetails, + arguments: {"selectedFunctionID": selectedFunction?.fUNCTIONID, "dateFrom": DateUtil.convertDateToString(selectedDateFrom), "dateTo": DateUtil.convertDateToString(selectedDateTo)}); + } + + void getPendingReqDetails() async { + try { + Utils.showLoading(context); + getPendingTransactionsFunctions = await PendingTransactionsApiClient().getPendingReqFunctions(); + Utils.hideLoading(context); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/pending_transactions/pending_transactions_details.dart b/lib/ui/screens/pending_transactions/pending_transactions_details.dart new file mode 100644 index 0000000..931ba50 --- /dev/null +++ b/lib/ui/screens/pending_transactions/pending_transactions_details.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class PendingTransactionsDetails extends StatefulWidget { + const PendingTransactionsDetails({Key? key}) : super(key: key); + + @override + _PendingTransactionsDetailsState createState() => _PendingTransactionsDetailsState(); +} + +class _PendingTransactionsDetailsState extends State { + String functionID = ""; + String dateFrom = ""; + String dateTo = ""; + + List getPendingTransactionsDetails = []; + + @override + void initState() { + super.initState(); + } + + getFunctionID() { + if (functionID == "") { + final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map; + functionID = arguments["selectedFunctionID"].toString(); + dateFrom = arguments["dateFrom"]; + dateTo = arguments["dateTo"]; + getTicketTransactions(); + } + } + + @override + Widget build(BuildContext context) { + getFunctionID(); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Pending Transactions", + ), + body: getPendingTransactionsDetails.isNotEmpty + ? Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return Container( + width: double.infinity, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + "Created For ".toText14(color: MyColors.grey57Color), + getPendingTransactionsDetails[index].tRANSACTIONCREATEDFOR!.toText14(color: MyColors.grey57Color), + ], + ), + Column( + children: [ + getPendingTransactionsDetails[index].cREATIONDATE!.split(" ")[0].toText12(color: MyColors.grey70Color), + getPendingTransactionsDetails[index].cREATIONDATE!.split(" ")[1].toText12(color: MyColors.grey70Color), + ], + ), + ], + ), + Container( + child: Row( + children: [ + "Request Name: ".toText14(color: MyColors.grey57Color), + getPendingTransactionsDetails[index].uSERFUNCTIONNAME!.toText12(color: MyColors.grey57Color), + ], + ), + ), + Container( + padding: const EdgeInsets.only(top: 0.0), + child: Row( + children: [ + "Request Type: ".toText14(color: MyColors.grey57Color), + getPendingTransactionsDetails[index].rEQUESTTYPE!.toText14(color: MyColors.redColor), + ], + ), + ), + ], + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => 12.height, + itemCount: getPendingTransactionsDetails.length ?? 0)) + ], + ), + ) + : Utils.getNoDataWidget(context), + ); + } + + void getTicketTransactions() async { + try { + Utils.showLoading(context); + getPendingTransactionsDetails = await PendingTransactionsApiClient().getPendingTransactionsDetails(functionID, dateFrom, dateTo); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} From a55c98c5baafa0af3d277ad78bd5b579a3ce0855 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 23 Jun 2022 09:44:43 +0300 Subject: [PATCH 16/22] Not found svg added --- assets/images/not_found.svg | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 assets/images/not_found.svg diff --git a/assets/images/not_found.svg b/assets/images/not_found.svg new file mode 100644 index 0000000..80aed53 --- /dev/null +++ b/assets/images/not_found.svg @@ -0,0 +1,8 @@ + + + + + + + + From e04537470350231ae4b0a40dce2fcd2690863723 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 23 Jun 2022 09:45:50 +0300 Subject: [PATCH 17/22] Not found svg added, Pending transactions, Announcements. --- lib/api/pending_transactions_api_client.dart | 11 ++ lib/classes/utils.dart | 8 + lib/models/get_announcement_details.dart | 72 ++++++++ lib/models/get_announcements.dart | 72 ++++++++ lib/ui/landing/dashboard_screen.dart | 5 +- .../announcements/announcement_details.dart | 104 +++++++++++ .../screens/announcements/announcements.dart | 168 ++++++++++++++++++ 7 files changed, 438 insertions(+), 2 deletions(-) create mode 100644 lib/models/get_announcement_details.dart create mode 100644 lib/models/get_announcements.dart create mode 100644 lib/ui/screens/announcements/announcement_details.dart create mode 100644 lib/ui/screens/announcements/announcements.dart diff --git a/lib/api/pending_transactions_api_client.dart b/lib/api/pending_transactions_api_client.dart index 45e87af..30c6241 100644 --- a/lib/api/pending_transactions_api_client.dart +++ b/lib/api/pending_transactions_api_client.dart @@ -33,4 +33,15 @@ class PendingTransactionsApiClient { return responseData.getPendingTransactionsDetails ?? []; }, url, postParams); } + + Future getAnnouncements(int itgAwarenessID, int itgPageNo, int itgRowID) async { + String url = "${ApiConsts.cocRest}GetAnnouncementDiscountsConfigData"; + Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER.toString(), "ItgAwarenessID": itgAwarenessID, "ItgPageNo": itgPageNo, "ItgPageSize": 5, "ItgRowID": itgRowID}; + + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.mohemmITGResponseItem ?? ""; + }, url, postParams); + } } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index ea7b559..20d791b 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -141,6 +141,14 @@ class Utils { return null; } + static getBase64FromJpeg(img) { + try { + var b64 = img.replaceFirst('data:image/jpeg;base64,', ''); + return b64; + } catch (e) {} + return null; + } + static bool isBase64(String str) { RegExp _base64 = RegExp(r'^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$'); return _base64.hasMatch(str); diff --git a/lib/models/get_announcement_details.dart b/lib/models/get_announcement_details.dart new file mode 100644 index 0000000..33628ce --- /dev/null +++ b/lib/models/get_announcement_details.dart @@ -0,0 +1,72 @@ +class GetAnnouncementDetails { + String? titleEN; + String? titleAR; + String? emailBodyEN; + String? emailBodyAR; + String? bodyEN; + String? bodyAR; + String? bannerImage; + String? rowID; + String? awarenessName; + String? created; + String? publishedDesc; + String? published; + String? twoLanguageTemplateDesc; + String? wFStatus; + String? totalItems; + + GetAnnouncementDetails( + {this.titleEN, + this.titleAR, + this.emailBodyEN, + this.emailBodyAR, + this.bodyEN, + this.bodyAR, + this.bannerImage, + this.rowID, + this.awarenessName, + this.created, + this.publishedDesc, + this.published, + this.twoLanguageTemplateDesc, + this.wFStatus, + this.totalItems}); + + GetAnnouncementDetails.fromJson(Map json) { + titleEN = json['Title_EN']; + titleAR = json['Title_AR']; + emailBodyEN = json['EmailBody_EN']; + emailBodyAR = json['EmailBody_AR']; + bodyEN = json['Body_EN']; + bodyAR = json['Body_AR']; + bannerImage = json['Banner_Image']; + rowID = json['rowID']; + awarenessName = json['awarenessName']; + created = json['created']; + publishedDesc = json['PublishedDesc']; + published = json['Published']; + twoLanguageTemplateDesc = json['TwoLanguageTemplateDesc']; + wFStatus = json['WFStatus']; + totalItems = json['TotalItems']; + } + + Map toJson() { + final Map data = new Map(); + data['Title_EN'] = this.titleEN; + data['Title_AR'] = this.titleAR; + data['EmailBody_EN'] = this.emailBodyEN; + data['EmailBody_AR'] = this.emailBodyAR; + data['Body_EN'] = this.bodyEN; + data['Body_AR'] = this.bodyAR; + data['Banner_Image'] = this.bannerImage; + data['rowID'] = this.rowID; + data['awarenessName'] = this.awarenessName; + data['created'] = this.created; + data['PublishedDesc'] = this.publishedDesc; + data['Published'] = this.published; + data['TwoLanguageTemplateDesc'] = this.twoLanguageTemplateDesc; + data['WFStatus'] = this.wFStatus; + data['TotalItems'] = this.totalItems; + return data; + } +} diff --git a/lib/models/get_announcements.dart b/lib/models/get_announcements.dart new file mode 100644 index 0000000..05b6988 --- /dev/null +++ b/lib/models/get_announcements.dart @@ -0,0 +1,72 @@ +class GetAnnouncementsObject { + String? titleEN; + String? titleAR; + String? bannerImage; + String? rowID; + String? awarenessName; + String? created; + String? publishedDesc; + String? published; + String? twoLanguageTemplateDesc; + String? wFStatus; + String? totalItems; + String? emailBodyEN; + String? emailBodyAR; + String? bodyEN; + String? bodyAR; + + GetAnnouncementsObject( + {this.titleEN, + this.titleAR, + this.bannerImage, + this.rowID, + this.awarenessName, + this.created, + this.publishedDesc, + this.published, + this.twoLanguageTemplateDesc, + this.wFStatus, + this.totalItems, + this.emailBodyEN, + this.emailBodyAR, + this.bodyEN, + this.bodyAR}); + + GetAnnouncementsObject.fromJson(Map json) { + titleEN = json['Title_EN']; + titleAR = json['Title_AR']; + bannerImage = json['Banner_Image']; + rowID = json['rowID']; + awarenessName = json['awarenessName']; + created = json['created']; + publishedDesc = json['PublishedDesc']; + published = json['Published']; + twoLanguageTemplateDesc = json['TwoLanguageTemplateDesc']; + wFStatus = json['WFStatus']; + totalItems = json['TotalItems']; + emailBodyEN = json['EmailBody_EN']; + emailBodyAR = json['EmailBody_AR']; + bodyEN = json['Body_EN']; + bodyAR = json['Body_AR']; + } + + Map toJson() { + final Map data = new Map(); + data['Title_EN'] = this.titleEN; + data['Title_AR'] = this.titleAR; + data['Banner_Image'] = this.bannerImage; + data['rowID'] = this.rowID; + data['awarenessName'] = this.awarenessName; + data['created'] = this.created; + data['PublishedDesc'] = this.publishedDesc; + data['Published'] = this.published; + data['TwoLanguageTemplateDesc'] = this.twoLanguageTemplateDesc; + data['WFStatus'] = this.wFStatus; + data['TotalItems'] = this.totalItems; + data['EmailBody_EN'] = this.emailBodyEN; + data['EmailBody_AR'] = this.emailBodyAR; + data['Body_EN'] = this.bodyEN; + data['Body_AR'] = this.bodyAR; + return data; + } +} diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 354e0db..2e7757c 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -101,8 +101,9 @@ class _DashboardScreenState extends State { ) ], ), - ).onPress(() { - data.update(context); + ).onPress(() async { + // data.update(context); + await Navigator.pushNamed(context, AppRoutes.announcements); }) ], ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), diff --git a/lib/ui/screens/announcements/announcement_details.dart b/lib/ui/screens/announcements/announcement_details.dart new file mode 100644 index 0000000..a3de742 --- /dev/null +++ b/lib/ui/screens/announcements/announcement_details.dart @@ -0,0 +1,104 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_html/flutter_html.dart'; +import 'package:mohem_flutter_app/api/pending_transactions_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/models/get_announcement_details.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; + +class AnnouncementDetails extends StatefulWidget { + const AnnouncementDetails({Key? key}) : super(key: key); + + @override + _AnnouncementDetailsState createState() => _AnnouncementDetailsState(); +} + +class _AnnouncementDetailsState extends State { + String jsonResponse = ""; + int currentPageNo = 0; + int rowID = 0; + + GetAnnouncementDetails? getAnnouncementDetailsObj; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + getRequestID(); + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Announcements", + ), + body: SingleChildScrollView( + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(10.0), + margin: const EdgeInsets.all(12.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: double.infinity, + height: 150.0, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.memory( + base64Decode(Utils.getBase64FromJpeg(getAnnouncementDetailsObj?.bannerImage)), + fit: BoxFit.cover, + ), + ), + ), + Container( + margin: const EdgeInsets.only(top: 12.0), + child: Html( + data: getAnnouncementDetailsObj?.bodyEN, + ), + ), + ], + ), + ), + ), + ); + } + + getRequestID() { + if (currentPageNo == 0) { + final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map; + currentPageNo = arguments["currentPageNo"]; + rowID = arguments["rowID"]; + getAnnouncementDetails(0, rowID); + } + } + + void getAnnouncementDetails(int itgAwarenessID, int itgRowID) async { + try { + Utils.showLoading(context); + jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID); + var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']); + getAnnouncementDetailsObj = GetAnnouncementDetails.fromJson(jsonDecodedData[0]); + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } +} diff --git a/lib/ui/screens/announcements/announcements.dart b/lib/ui/screens/announcements/announcements.dart new file mode 100644 index 0000000..cad3a9a --- /dev/null +++ b/lib/ui/screens/announcements/announcements.dart @@ -0,0 +1,168 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/pending_transactions_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'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/models/get_announcements.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class Announcements extends StatefulWidget { + const Announcements({Key? key}) : super(key: key); + + @override + _AnnouncementsState createState() => _AnnouncementsState(); +} + +class _AnnouncementsState extends State { + String jsonResponse = ""; + int currentPageNo = 1; + int currentOpenIndex = -1; + + List getAnnouncementsObject = []; + List _foundAnnouncements = []; + TextEditingController searchController = TextEditingController(); + + @override + void initState() { + getAnnouncements(0, 0); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Announcements", + ), + body: getAnnouncementsObject.isNotEmpty + ? Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 12.height, + Container( + margin: const EdgeInsets.fromLTRB(12.0, 0.0, 12.0, 0.0), + child: DynamicTextFieldWidget( + "Search", + "Search Announcements", + isEnable: true, + suffixIconData: Icons.search, + isPopup: false, + lines: 1, + isInputTypeNum: false, + isReadOnly: false, + onChange: (String value) { + _runFilter(value); + }, + ), + ), + 12.height, + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + openAnnouncementsDetails(int.parse(_foundAnnouncements[index].rowID!)); + }, + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(10.0), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: 80.0, + height: 80.0, + child: ClipRRect( + borderRadius: BorderRadius.circular(10), + child: Image.memory( + base64Decode(Utils.getBase64FromJpeg(_foundAnnouncements[index].bannerImage)), + fit: BoxFit.cover, + ), + ), + ), + 12.width, + SizedBox( + height: 80.0, + width: 200.0, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppState().isArabic(context) ? _foundAnnouncements[index].titleAR!.toText13() : getAnnouncementsObject[index].titleEN!.toText13(), + 8.height, + _foundAnnouncements[index].created!.toText10(color: MyColors.grey98Color) + ], + ), + ), + ], + ), + ), + ); + }, + separatorBuilder: (BuildContext context, int index) => 1.height, + itemCount: _foundAnnouncements.length ?? 0)) + ], + ), + ) + : Utils.getNoDataWidget(context), + ); + } + + void _runFilter(String enteredKeyword) { + List results = []; + if (enteredKeyword.isEmpty) { + results = getAnnouncementsObject; + } else { + results = getAnnouncementsObject.where((user) => user.titleEN!.toLowerCase().contains(enteredKeyword.toLowerCase())).toList(); + } + setState(() { + _foundAnnouncements = results; + }); + } + + void getAnnouncements(int itgAwarenessID, int itgRowID) async { + try { + Utils.showLoading(context); + jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID); + var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']); + for (int i = 0; i < jsonDecodedData.length; i++) { + getAnnouncementsObject.add(GetAnnouncementsObject.fromJson(jsonDecodedData[i])); + } + _foundAnnouncements = getAnnouncementsObject; + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + void openAnnouncementsDetails(int rowID) async { + await Navigator.pushNamed(context, AppRoutes.announcementsDetails, arguments: {"currentPageNo": currentPageNo, "rowID": rowID}); + } +} From 556215807b8c38ad3df04df1e1ba98fb6f128144 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 23 Jun 2022 09:53:21 +0300 Subject: [PATCH 18/22] pubspec update --- lib/config/routes.dart | 15 +++++++++++++-- pubspec.yaml | 3 ++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index fad3e9d..502d852 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -18,6 +18,8 @@ import 'package:mohem_flutter_app/ui/profile/delete_familyMember.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; import 'package:mohem_flutter_app/ui/profile/family_members.dart'; import 'package:mohem_flutter_app/ui/profile/personal_info.dart'; +import 'package:mohem_flutter_app/ui/screens/announcements/announcement_details.dart'; +import 'package:mohem_flutter_app/ui/screens/announcements/announcements.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; @@ -85,10 +87,14 @@ class AppRoutes { static const String mowadhafhiDetails = "/mowadhafhiDetails"; static const String mowadhafhiHRRequest = "/mowadhafhiHRRequest"; - + // Pending Transactions static const String pendingTransactions = "/pendingTransactions"; static const String pendingTransactionsDetails = "/pendingTransactionsDetails"; + // Announcements + static const String announcements = "/announcements"; + static const String announcementsDetails = "/announcementsDetails"; + static final Map routes = { @@ -140,6 +146,11 @@ class AppRoutes { mowadhafhiHRRequest: (context) => MowadhafhiHRRequest(), pendingTransactions: (context) => PendingTransactions(), - pendingTransactionsDetails: (context) => PendingTransactionsDetails() + pendingTransactionsDetails: (context) => PendingTransactionsDetails(), + + announcements: (context) => Announcements(), + announcementsDetails: (context) => AnnouncementDetails(), + + }; } diff --git a/pubspec.yaml b/pubspec.yaml index af67f0f..365819d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,7 +40,7 @@ dependencies: easy_localization: ^3.0.0 http: ^0.13.4 permission_handler: ^9.2.0 - flutter_svg: ^1.0.0 + flutter_svg: ^0.23.0+1 sizer: ^2.0.15 local_auth: ^1.1.9 fluttertoast: ^8.0.8 @@ -67,6 +67,7 @@ dependencies: month_picker_dialog: ^0.4.0 open_file: ^3.2.1 wifi_iot: ^0.3.16 + flutter_html: ^2.2.1 dev_dependencies: flutter_test: From f1c36b5821b50c7888a404fbe6bd3fc5afbef36e Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 27 Jun 2022 15:29:03 +0300 Subject: [PATCH 19/22] monthly pay slip added. --- assets/langs/ar-SA.json | 24 +- assets/langs/en-US.json | 22 +- lib/api/monthlyAttendance_api_client.dart | 2 +- lib/api/monthly_pay_slip_api_client.dart | 68 +++ lib/api/pending_transactions_api_client.dart | 3 +- lib/api/tangheem_user_api_client.dart | 34 -- lib/classes/utils.dart | 62 +- lib/config/routes.dart | 7 +- lib/generated/codegen_loader.g.dart | 40 +- lib/generated/locale_keys.g.dart | 13 +- lib/main.dart | 19 +- lib/models/generic_response_model.dart | 77 ++- .../get_deductions_List_model.dart | 36 ++ .../get_earnings_list_model.dart | 36 ++ .../get_pay_slip_list_model.dart | 36 ++ .../get_payment_information_list_model.dart | 32 + .../get_summary_of_payment_list_model.dart | 36 ++ lib/ui/attendance/monthly_attendance.dart | 2 + lib/ui/landing/dashboard_screen.dart | 568 ++++++++++-------- lib/ui/landing/widget/services_widget.dart | 19 +- .../dynamic_screens/dynamic_input_screen.dart | 57 +- .../my_attendance/my_attendance_screen.dart | 3 +- lib/ui/payslip/monthly_pay_slip_screen.dart | 289 +++++++++ .../announcements/announcement_details.dart | 2 + lib/ui/screens/profile/profile_screen.dart | 1 + .../screens/profile/widgets/profile_info.dart | 2 + 26 files changed, 1102 insertions(+), 388 deletions(-) create mode 100644 lib/api/monthly_pay_slip_api_client.dart delete mode 100644 lib/api/tangheem_user_api_client.dart create mode 100644 lib/models/monthly_pay_slip/get_deductions_List_model.dart create mode 100644 lib/models/monthly_pay_slip/get_earnings_list_model.dart create mode 100644 lib/models/monthly_pay_slip/get_pay_slip_list_model.dart create mode 100644 lib/models/monthly_pay_slip/get_payment_information_list_model.dart create mode 100644 lib/models/monthly_pay_slip/get_summary_of_payment_list_model.dart create mode 100644 lib/ui/payslip/monthly_pay_slip_screen.dart diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 7f22931..f26ddca 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -236,12 +236,12 @@ "year": "سنة", "month": "شهر", "day": "يوم", - "address" : "العنوان", + "address": "العنوان", "phoneNumber": "رقم الجوال", "businessGroup": "مجموعة العمل", "Payroll": "الراتب", "civilIdentityNumber": "رقم الهويه", - "dateOfBirth" : "تاريخ الميلاد", + "dateOfBirth": "تاريخ الميلاد", "maritalStatus ": "الحالة الاجتماعية", "fullName": "الأسم الكامل", "remove": "حذف", @@ -251,6 +251,18 @@ "writeComment": "أكتب تعليقا", "approversList": "قائمة الموافقين", "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", + "monthlyPaySlip": "قسيمة الراتب الشهرية", + "particular": "خاص", + "earnings": "أرباح", + "deductions": "الخصومات", + "paymentMethodName": "اسم طريقة الدفع", + "bankName": "اسم البنك", + "branchCode": "رمز الفرع", + "accountNo": "رقم الحساب", + "summaryOfInformation": "ملخص المعلومات", + "totalPayAmount": "المبلغ الإجمالي للدفع", + "paymentInformation": "معلومات الدفع", + "amount": "مقدار", "profile": { "reset_password": { "label": "Reset Password", @@ -272,14 +284,6 @@ "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 5934ab3..bfcac3c 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -245,13 +245,25 @@ "maritalStatus ": "Marital Status ", "fullName": "Full Name", "remove": "Remove", - "Attendance":"Attendance", + "Attendance": "Attendance", "submit": "Submit", "areYouSureYouWantToSubmit": "Are you sure you want to submit?", "comments": "Comments", "writeComment": "Write a comment", "approversList": "Approvers List", "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", + "monthlyPaySlip": "Monthly Pay Slip", + "particular": "Particular", + "earnings": "Earnings", + "deductions": "Deductions", + "paymentMethodName": "Payment Method Name", + "bankName": "Bank Name", + "branchCode": "Branch Code", + "accountNo": "Account No", + "summaryOfInformation": "Summary of Information", + "totalPayAmount": "Total Pay Amount", + "paymentInformation": "Payment Information", + "amount": "Amount", "profile": { "reset_password": { "label": "Reset Password", @@ -273,14 +285,6 @@ "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", diff --git a/lib/api/monthlyAttendance_api_client.dart b/lib/api/monthlyAttendance_api_client.dart index bcbf69f..4de2481 100644 --- a/lib/api/monthlyAttendance_api_client.dart +++ b/lib/api/monthlyAttendance_api_client.dart @@ -10,6 +10,7 @@ import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model. import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'api_client.dart'; +// todo '@fatima' change file name according to structure class MonthlyAttendanceApiClient { static final MonthlyAttendanceApiClient _instance = MonthlyAttendanceApiClient._internal(); @@ -17,7 +18,6 @@ class MonthlyAttendanceApiClient { factory MonthlyAttendanceApiClient() => _instance; - Future getTimeCardSummary(String month, int year) async { String url = "${ApiConsts.erpRest}GET_TIME_CARD_SUMMARY"; Map postParams = { diff --git a/lib/api/monthly_pay_slip_api_client.dart b/lib/api/monthly_pay_slip_api_client.dart new file mode 100644 index 0000000..95bf847 --- /dev/null +++ b/lib/api/monthly_pay_slip_api_client.dart @@ -0,0 +1,68 @@ +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/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_deductions_List_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_pay_slip_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_payment_information_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_summary_of_payment_list_model.dart'; + +class MonthlyPaySlipApiClient { + static final MonthlyPaySlipApiClient _instance = MonthlyPaySlipApiClient._internal(); + + MonthlyPaySlipApiClient._internal(); + + factory MonthlyPaySlipApiClient() => _instance; + + Future> getPaySlip() async { + String url = "${ApiConsts.erpRest}GET_PAYSLIP"; + Map postParams = {"P_MENU_TYPE": "E", "P_SELECTED_RESP_ID": -999}; + postParams.addAll(AppState().postParamsJson); + print(postParams); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPayslipList ?? []; + }, url, postParams); + } + + Future> getSummaryOfPayment(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_SUMMARY_OF_PAYMENT"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getSummaryOfPaymentList ?? []; + }, url, postParams); + } + + Future> getPaymentInformation(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_PAYMENT_INFORMATION"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getPaymentInformationList ?? []; + }, url, postParams); + } + + Future> getDeductions(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_DEDUCTIONS"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID, "P_PAGE_LIMIT": 100, "P_PAGE_NUM": 1}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getDeductionsList ?? []; + }, url, postParams); + } + + Future> getEarnings(int pActionContextID) async { + String url = "${ApiConsts.erpRest}GET_EARNINGS"; + Map postParams = {"P_ACTION_CONTEXT_ID": pActionContextID, "P_PAGE_LIMIT": 100, "P_PAGE_NUM": 1}; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel? responseData = GenericResponseModel.fromJson(json); + return responseData.getEarningsList ?? []; + }, url, postParams); + } +} diff --git a/lib/api/pending_transactions_api_client.dart b/lib/api/pending_transactions_api_client.dart index 30c6241..b8ddd60 100644 --- a/lib/api/pending_transactions_api_client.dart +++ b/lib/api/pending_transactions_api_client.dart @@ -5,6 +5,8 @@ import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; +// todo '@haroon' kindly format code + class PendingTransactionsApiClient { static final PendingTransactionsApiClient _instance = PendingTransactionsApiClient._internal(); @@ -37,7 +39,6 @@ class PendingTransactionsApiClient { Future getAnnouncements(int itgAwarenessID, int itgPageNo, int itgRowID) async { String url = "${ApiConsts.cocRest}GetAnnouncementDiscountsConfigData"; Map postParams = {"EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER.toString(), "ItgAwarenessID": itgAwarenessID, "ItgPageNo": itgPageNo, "ItgPageSize": 5, "ItgRowID": itgRowID}; - postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { GenericResponseModel? responseData = GenericResponseModel.fromJson(json); diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart deleted file mode 100644 index 32a5a82..0000000 --- a/lib/api/tangheem_user_api_client.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'dart:async'; - -import 'package:mohem_flutter_app/classes/consts.dart'; -import 'package:mohem_flutter_app/models/content_info_model.dart'; -import 'package:mohem_flutter_app/models/member_login_list_model.dart'; -import 'package:mohem_flutter_app/models/surah_model.dart'; - -import 'api_client.dart'; - -class TangheemUserApiClient { - static final TangheemUserApiClient _instance = TangheemUserApiClient._internal(); - - TangheemUserApiClient._internal(); - - factory TangheemUserApiClient() => _instance; - - // Future getSurahs() async { - // String url = "${ApiConsts.tangheemUsers}AlSuar_Get"; - // var postParams = {}; - // return await ApiClient().postJsonForObject((json) => SurahModel.fromJson(json), url, postParams); - // } - // - // Future getMembers() async { - // String url = "${ApiConsts.tangheemUsers}Committee_Get"; - // var postParams = {}; - // return await ApiClient().postJsonForObject((json) => MemberModel.fromJson(json), url, postParams); - // } - // - // Future getContentInfo(int contentId) async { - // String url = "${ApiConsts.tangheemUsers}ContentInfo_Get"; - // var postParams = {"contentTypeId": contentId}; - // return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); - // } -} diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 20d791b..114f32c 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -1,17 +1,24 @@ import 'dart:convert'; import 'dart:typed_data'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; // import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.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/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:sizer/sizer.dart'; class Utils { static bool _isLoadingVisible = false; @@ -120,17 +127,13 @@ class Utils { } static Widget getNoDataWidget(BuildContext context) { - return Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgPicture.asset('assets/images/not_found.svg', width: 110.0, height: 110.0), - Container(margin: const EdgeInsets.only(top: 15.0), child: const Text("No Result Found", style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: Color(0xFFBABABA)))), - ], - ), - ), - ); + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset('assets/images/not_found.svg', width: 110.0, height: 110.0), + Container(margin: const EdgeInsets.only(top: 15.0), child: LocaleKeys.noDataAvailable.tr().toText16().center), + ], + ).center; } static getPostBytes(img) { @@ -157,4 +160,41 @@ class Utils { static Uint8List dataFromBase64String(String base64String) { return base64Decode(base64String); } + + static Widget tableColumnTitle(String? text, {bool showDivider = true}) { + text ??= ""; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 6.height, + text.toText12(), + 5.height, + if (showDivider) + const Divider( + height: 1, + color: Color(0xff2E303A), + thickness: 1, + ) + ], + ); + } + + static Widget tableColumnValue(String text, {bool isLast = false, bool isCapitable = true}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + 12.height, + (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor), + 12.height, + if (!isLast) + const Divider( + height: 1, + color: Color(0xffEFEFEF), + thickness: 1, + ) + ], + ); + } } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 502d852..7733347 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -12,6 +12,7 @@ import 'package:mohem_flutter_app/ui/misc/request_submit_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/my_attendance_screen.dart'; +import 'package:mohem_flutter_app/ui/payslip/monthly_pay_slip_screen.dart'; import 'package:mohem_flutter_app/ui/profile/basic_details.dart'; import 'package:mohem_flutter_app/ui/profile/contact_details.dart'; import 'package:mohem_flutter_app/ui/profile/delete_familyMember.dart'; @@ -95,7 +96,8 @@ class AppRoutes { static const String announcements = "/announcements"; static const String announcementsDetails = "/announcementsDetails"; - + //Pay slip + static const String monthlyPaySlip = "/monthlyPaySlip"; static final Map routes = { login: (context) => LoginScreen(), @@ -151,6 +153,7 @@ class AppRoutes { announcements: (context) => Announcements(), announcementsDetails: (context) => AnnouncementDetails(), - + //pay slip + monthlyPaySlip: (context) => MonthlyPaySlipScreen(), }; } diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index ad3a70e..8ab7d0b 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -267,6 +267,18 @@ class CodegenLoader extends AssetLoader{ "writeComment": "أكتب تعليقا", "approversList": "قائمة الموافقين", "yourRequestHasBeenSubmittedForApprovals": "تم تقديم طلبك للموافقات", + "monthlyPaySlip": "قسيمة الراتب الشهرية", + "particular": "خاص", + "earnings": "أرباح", + "deductions": "الخصومات", + "paymentMethodName": "اسم طريقة الدفع", + "bankName": "اسم البنك", + "branchCode": "رمز الفرع", + "accountNo": "رقم الحساب", + "summaryOfInformation": "ملخص المعلومات", + "totalPayAmount": "المبلغ الإجمالي للدفع", + "paymentInformation": "معلومات الدفع", + "amount": "مقدار", "profile": { "reset_password": { "label": "Reset Password", @@ -288,14 +300,6 @@ class CodegenLoader extends AssetLoader{ "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", @@ -560,6 +564,18 @@ static const Map en_US = { "writeComment": "Write a comment", "approversList": "Approvers List", "yourRequestHasBeenSubmittedForApprovals": "Your request has been submitted for approvals", + "monthlyPaySlip": "Monthly Pay Slip", + "particular": "Particular", + "earnings": "Earnings", + "deductions": "Deductions", + "paymentMethodName": "Payment Method Name", + "bankName": "Bank Name", + "branchCode": "Branch Code", + "accountNo": "Account No", + "summaryOfInformation": "Summary of Information", + "totalPayAmount": "Total Pay Amount", + "paymentInformation": "Payment Information", + "amount": "Amount", "profile": { "reset_password": { "label": "Reset Password", @@ -581,14 +597,6 @@ static const Map en_US = { "many": "You clicked {} times!", "other": "You clicked {} times!" }, - "amount": { - "zero": "Your amount : {} ", - "one": "Your amount : {} ", - "two": "Your amount : {} ", - "few": "Your amount : {} ", - "many": "Your amount : {} ", - "other": "Your amount : {} " - }, "gender": { "male": "Hi man ;) ", "female": "Hello girl :)", diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 21d18f5..5271370 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -252,6 +252,18 @@ abstract class LocaleKeys { static const writeComment = 'writeComment'; static const approversList = 'approversList'; static const yourRequestHasBeenSubmittedForApprovals = 'yourRequestHasBeenSubmittedForApprovals'; + static const monthlyPaySlip = 'monthlyPaySlip'; + static const particular = 'particular'; + static const earnings = 'earnings'; + static const deductions = 'deductions'; + static const paymentMethodName = 'paymentMethodName'; + static const bankName = 'bankName'; + static const branchCode = 'branchCode'; + static const accountNo = 'accountNo'; + static const summaryOfInformation = 'summaryOfInformation'; + static const totalPayAmount = 'totalPayAmount'; + static const paymentInformation = 'paymentInformation'; + static const amount = 'amount'; static const profile_reset_password_label = 'profile.reset_password.label'; static const profile_reset_password_username = 'profile.reset_password.username'; static const profile_reset_password_password = 'profile.reset_password.password'; @@ -264,7 +276,6 @@ abstract class LocaleKeys { static const profile_familyDetails = 'profile.familyDetails'; static const profile = 'profile'; static const clicked = 'clicked'; - static const amount = 'amount'; static const gender_with_arg = 'gender.with_arg'; static const gender = 'gender'; static const reset_locale = 'reset_locale'; diff --git a/lib/main.dart b/lib/main.dart index 77e94e8..39a5f48 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -68,22 +68,17 @@ class MyApp extends StatelessWidget { builder: (context, orientation, deviceType) { print(AppState().postParamsObject?.toJson()); var obj = AppState().postParamsObject; - obj?.languageID = EasyLocalization - .of(context) - ?.locale - .languageCode == "ar" ? 1 : 2; + obj?.languageID = EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2; AppState().setPostParamsModel(obj!); List delegates = context.localizationDelegates; - // delegates.add(GlobalMaterialLocalizations.delegate); - delegates.add(MonthYearPickerLocalizations.delegate,); + // delegates.add(GlobalMaterialLocalizations.delegate); + delegates.add( + MonthYearPickerLocalizations.delegate, + ); return MaterialApp( - theme: AppTheme.getTheme(EasyLocalization - .of(context) - ?.locale - .languageCode == "ar"), + theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), debugShowCheckedModeBanner: false, - localizationsDelegates - :delegates, + localizationsDelegates: delegates, supportedLocales: context.supportedLocales, locale: context.locale, initialRoute: AppRoutes.initialRoute, diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 00404f4..5302e64 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -24,6 +24,11 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_deductions_List_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_pay_slip_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_payment_information_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_summary_of_payment_list_model.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart'; @@ -139,12 +144,12 @@ class GenericResponseModel { GetContactNotificationBodyList? getContactNotificationBodyList; List? getCountriesList; List? getDayHoursTypeDetailsList; - List? getDeductionsList; + List? getDeductionsList; GetDefaultValueList? getDefaultValueList; List? getEITCollectionNotificationBodyList; List? getEITDFFStructureList; List? getEITTransactionList; - List? getEarningsList; + List? getEarningsList; List? getEmployeeAddressList; List? getEmployeeBasicDetailsList; List? getEmployeeContactsList; @@ -168,8 +173,9 @@ class GenericResponseModel { List? getOpenNotificationsNumList; List? getOpenPeriodDatesList; List? getOrganizationsSalariesList; - List? getPaymentInformationList; - List? getPayslipList; + List? getPaymentInformationList; + List? getPayslipList; + // List? getPendingReqDetailsList; // List? getPendingReqFunctionsList; List? getPerformanceAppraisalList; @@ -190,7 +196,7 @@ class GenericResponseModel { List? getSubordinatesAttdStatusList; List? getSubordinatesLeavesList; List? getSubordinatesLeavesTotalVacationsList; - List? getSummaryOfPaymentList; + List? getSummaryOfPaymentList; List? getSwipesList; List? getTermColsStructureList; List? getTermDffStructureList; @@ -718,7 +724,13 @@ class GenericResponseModel { getDayHoursTypeDetailsList!.add(new GetDayHoursTypeDetailsList.fromJson(v)); }); } - getDeductionsList = json['GetDeductionsList']; + + if (json['GetDeductionsList'] != null) { + getDeductionsList = []; + json['GetDeductionsList'].forEach((v) { + getDeductionsList!.add(new GetDeductionsList.fromJson(v)); + }); + } getDefaultValueList = json['GetDefaultValueList'] != null ? GetDefaultValueList.fromJson(json['GetDefaultValueList']) : null; getEITCollectionNotificationBodyList = json["GetEITCollectionNotificationBodyList"] == null ? null @@ -735,7 +747,13 @@ class GenericResponseModel { getEITTransactionList!.add(new GetEITTransactionList.fromJson(v)); }); } - getEarningsList = json['GetEarningsList']; + + if (json['GetEarningsList'] != null) { + getEarningsList = []; + json['GetEarningsList'].forEach((v) { + getEarningsList!.add(new GetEarningsList.fromJson(v)); + }); + } if (json['GetEmployeeAddressList'] != null) { getEmployeeAddressList = []; json['GetEmployeeAddressList'].forEach((v) { @@ -804,8 +822,20 @@ class GenericResponseModel { getOpenNotificationsNumList = json['GetOpenNotificationsNumList']; getOpenPeriodDatesList = json['GetOpenPeriodDatesList']; getOrganizationsSalariesList = json['GetOrganizationsSalariesList']; - getPaymentInformationList = json['GetPaymentInformationList']; - getPayslipList = json['GetPayslipList']; + + if (json['GetPaymentInformationList'] != null) { + getPaymentInformationList = []; + json['GetPaymentInformationList'].forEach((v) { + getPaymentInformationList!.add(new GetPaymentInformationList.fromJson(v)); + }); + } + + if (json['GetPayslipList'] != null) { + getPayslipList = []; + json['GetPayslipList'].forEach((v) { + getPayslipList!.add(new GetPayslipList.fromJson(v)); + }); + } // getPendingReqDetailsList = json['GetPendingReqDetailsList']; // getPendingReqFunctionsList = json['GetPendingReqFunctionsList']; getPerformanceAppraisalList = json['GetPerformanceAppraisalList']; @@ -861,7 +891,12 @@ class GenericResponseModel { } getSubordinatesLeavesTotalVacationsList = json['GetSubordinatesLeavesTotalVacationsList']; - getSummaryOfPaymentList = json['GetSummaryOfPaymentList']; + if (json['GetSummaryOfPaymentList'] != null) { + getSummaryOfPaymentList = []; + json['GetSummaryOfPaymentList'].forEach((v) { + getSummaryOfPaymentList!.add(new GetSummaryOfPaymentList.fromJson(v)); + }); + } getSwipesList = json['GetSwipesList']; getTermColsStructureList = json['GetTermColsStructureList']; getTermDffStructureList = json['GetTermDffStructureList']; @@ -1226,7 +1261,10 @@ class GenericResponseModel { if (this.getDayHoursTypeDetailsList != null) { data['GetDayHoursTypeDetailsList'] = this.getDayHoursTypeDetailsList!.map((v) => v.toJson()).toList(); } - data['GetDeductionsList'] = this.getDeductionsList; + + if (this.getDeductionsList != null) { + data['GetDeductionsList'] = this.getDeductionsList!.map((v) => v.toJson()).toList(); + } if (this.getDefaultValueList != null) { data['GetDefaultValueList'] = this.getDefaultValueList!.toJson(); } @@ -1237,7 +1275,10 @@ class GenericResponseModel { if (this.getEITTransactionList != null) { data['GetEITTransactionList'] = this.getEITTransactionList!.map((v) => v.toJson()).toList(); } - data['GetEarningsList'] = this.getEarningsList; + + if (this.getEarningsList != null) { + data['GetEarningsList'] = this.getEarningsList!.map((v) => v.toJson()).toList(); + } if (this.getEmployeeAddressList != null) { data['GetEmployeeAddressList'] = this.getEmployeeAddressList!.map((v) => v.toJson()).toList(); } @@ -1282,8 +1323,12 @@ class GenericResponseModel { data['GetOpenNotificationsNumList'] = this.getOpenNotificationsNumList; data['GetOpenPeriodDatesList'] = this.getOpenPeriodDatesList; data['GetOrganizationsSalariesList'] = this.getOrganizationsSalariesList; - data['GetPaymentInformationList'] = this.getPaymentInformationList; - data['GetPayslipList'] = this.getPayslipList; + if (this.getPaymentInformationList != null) { + data['GetPaymentInformationList'] = this.getPaymentInformationList!.map((v) => v.toJson()).toList(); + } + if (this.getPayslipList != null) { + data['GetPayslipList'] = this.getPayslipList!.map((v) => v.toJson()).toList(); + } // data['GetPendingReqDetailsList'] = this.getPendingReqDetailsList; // data['GetPendingReqFunctionsList'] = this.getPendingReqFunctionsList; data['GetPerformanceAppraisalList'] = this.getPerformanceAppraisalList; @@ -1326,7 +1371,9 @@ class GenericResponseModel { } data['GetSubordinatesLeavesTotalVacationsList'] = this.getSubordinatesLeavesTotalVacationsList; - data['GetSummaryOfPaymentList'] = this.getSummaryOfPaymentList; + if (this.getSummaryOfPaymentList != null) { + data['GetSummaryOfPaymentList'] = this.getSummaryOfPaymentList!.map((v) => v.toJson()).toList(); + } data['GetSwipesList'] = this.getSwipesList; data['GetTermColsStructureList'] = this.getTermColsStructureList; data['GetTermDffStructureList'] = this.getTermDffStructureList; diff --git a/lib/models/monthly_pay_slip/get_deductions_List_model.dart b/lib/models/monthly_pay_slip/get_deductions_List_model.dart new file mode 100644 index 0000000..7a99447 --- /dev/null +++ b/lib/models/monthly_pay_slip/get_deductions_List_model.dart @@ -0,0 +1,36 @@ +class GetDeductionsList { + int? aMOUNT; + String? eLEMENTNAME; + int? fROMROWNUM; + int? nOOFROWS; + int? rOWNUM; + int? tOROWNUM; + + GetDeductionsList( + {this.aMOUNT, + this.eLEMENTNAME, + this.fROMROWNUM, + this.nOOFROWS, + this.rOWNUM, + this.tOROWNUM}); + + GetDeductionsList.fromJson(Map json) { + aMOUNT = json['AMOUNT']; + eLEMENTNAME = json['ELEMENT_NAME']; + fROMROWNUM = json['FROM_ROW_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['AMOUNT'] = this.aMOUNT; + data['ELEMENT_NAME'] = this.eLEMENTNAME; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/monthly_pay_slip/get_earnings_list_model.dart b/lib/models/monthly_pay_slip/get_earnings_list_model.dart new file mode 100644 index 0000000..4c38fa6 --- /dev/null +++ b/lib/models/monthly_pay_slip/get_earnings_list_model.dart @@ -0,0 +1,36 @@ +class GetEarningsList { + int? aMOUNT; + String? eLEMENTNAME; + int? fROMROWNUM; + int? nOOFROWS; + int? rOWNUM; + int? tOROWNUM; + + GetEarningsList( + {this.aMOUNT, + this.eLEMENTNAME, + this.fROMROWNUM, + this.nOOFROWS, + this.rOWNUM, + this.tOROWNUM}); + + GetEarningsList.fromJson(Map json) { + aMOUNT = json['AMOUNT']; + eLEMENTNAME = json['ELEMENT_NAME']; + fROMROWNUM = json['FROM_ROW_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + } + + Map toJson() { + final Map data = new Map(); + data['AMOUNT'] = this.aMOUNT; + data['ELEMENT_NAME'] = this.eLEMENTNAME; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + return data; + } +} \ No newline at end of file diff --git a/lib/models/monthly_pay_slip/get_pay_slip_list_model.dart b/lib/models/monthly_pay_slip/get_pay_slip_list_model.dart new file mode 100644 index 0000000..7cf8883 --- /dev/null +++ b/lib/models/monthly_pay_slip/get_pay_slip_list_model.dart @@ -0,0 +1,36 @@ +class GetPayslipList { + int? aCTIONCONTEXTID; + String? pAYMENTDATE; + String? pAYSLIPCHOICE; + String? pERIODENDDATE; + String? pERIODNAME; + String? pERIODSTARTDATE; + + GetPayslipList( + {this.aCTIONCONTEXTID, + this.pAYMENTDATE, + this.pAYSLIPCHOICE, + this.pERIODENDDATE, + this.pERIODNAME, + this.pERIODSTARTDATE}); + + GetPayslipList.fromJson(Map json) { + aCTIONCONTEXTID = json['ACTION_CONTEXT_ID']; + pAYMENTDATE = json['PAYMENT_DATE']; + pAYSLIPCHOICE = json['PAYSLIP_CHOICE']; + pERIODENDDATE = json['PERIOD_END_DATE']; + pERIODNAME = json['PERIOD_NAME']; + pERIODSTARTDATE = json['PERIOD_START_DATE']; + } + + Map toJson() { + final Map data = new Map(); + data['ACTION_CONTEXT_ID'] = this.aCTIONCONTEXTID; + data['PAYMENT_DATE'] = this.pAYMENTDATE; + data['PAYSLIP_CHOICE'] = this.pAYSLIPCHOICE; + data['PERIOD_END_DATE'] = this.pERIODENDDATE; + data['PERIOD_NAME'] = this.pERIODNAME; + data['PERIOD_START_DATE'] = this.pERIODSTARTDATE; + return data; + } +} \ No newline at end of file diff --git a/lib/models/monthly_pay_slip/get_payment_information_list_model.dart b/lib/models/monthly_pay_slip/get_payment_information_list_model.dart new file mode 100644 index 0000000..75ed21c --- /dev/null +++ b/lib/models/monthly_pay_slip/get_payment_information_list_model.dart @@ -0,0 +1,32 @@ +class GetPaymentInformationList { + String? aCCOUNTNUMBER; + String? aMOUNT; + String? bANKNAME; + String? bRANCHNAME; + String? pAYMENTMETHODNAME; + + GetPaymentInformationList( + {this.aCCOUNTNUMBER, + this.aMOUNT, + this.bANKNAME, + this.bRANCHNAME, + this.pAYMENTMETHODNAME}); + + GetPaymentInformationList.fromJson(Map json) { + aCCOUNTNUMBER = json['ACCOUNT_NUMBER']; + aMOUNT = json['AMOUNT']; + bANKNAME = json['BANK_NAME']; + bRANCHNAME = json['BRANCH_NAME']; + pAYMENTMETHODNAME = json['PAYMENT_METHOD_NAME']; + } + + Map toJson() { + final Map data = new Map(); + data['ACCOUNT_NUMBER'] = this.aCCOUNTNUMBER; + data['AMOUNT'] = this.aMOUNT; + data['BANK_NAME'] = this.bANKNAME; + data['BRANCH_NAME'] = this.bRANCHNAME; + data['PAYMENT_METHOD_NAME'] = this.pAYMENTMETHODNAME; + return data; + } +} \ No newline at end of file diff --git a/lib/models/monthly_pay_slip/get_summary_of_payment_list_model.dart b/lib/models/monthly_pay_slip/get_summary_of_payment_list_model.dart new file mode 100644 index 0000000..72ee89b --- /dev/null +++ b/lib/models/monthly_pay_slip/get_summary_of_payment_list_model.dart @@ -0,0 +1,36 @@ +class GetSummaryOfPaymentList { + int? tOTALDEDUCTIONSAMOUNT; + int? tOTALDEDUCTIONSPERCENTAGE; + int? tOTALEARNINGSAMOUNT; + int? tOTALEARNINGSPERCENTAGE; + int? tOTALPAYAMOUNT; + int? tOTALPAYPERCENTAGE; + + GetSummaryOfPaymentList( + {this.tOTALDEDUCTIONSAMOUNT, + this.tOTALDEDUCTIONSPERCENTAGE, + this.tOTALEARNINGSAMOUNT, + this.tOTALEARNINGSPERCENTAGE, + this.tOTALPAYAMOUNT, + this.tOTALPAYPERCENTAGE}); + + GetSummaryOfPaymentList.fromJson(Map json) { + tOTALDEDUCTIONSAMOUNT = json['TOTAL_DEDUCTIONS_AMOUNT']; + tOTALDEDUCTIONSPERCENTAGE = json['TOTAL_DEDUCTIONS_PERCENTAGE']; + tOTALEARNINGSAMOUNT = json['TOTAL_EARNINGS_AMOUNT']; + tOTALEARNINGSPERCENTAGE = json['TOTAL_EARNINGS_PERCENTAGE']; + tOTALPAYAMOUNT = json['TOTAL_PAY_AMOUNT']; + tOTALPAYPERCENTAGE = json['TOTAL_PAY_PERCENTAGE']; + } + + Map toJson() { + final Map data = new Map(); + data['TOTAL_DEDUCTIONS_AMOUNT'] = this.tOTALDEDUCTIONSAMOUNT; + data['TOTAL_DEDUCTIONS_PERCENTAGE'] = this.tOTALDEDUCTIONSPERCENTAGE; + data['TOTAL_EARNINGS_AMOUNT'] = this.tOTALEARNINGSAMOUNT; + data['TOTAL_EARNINGS_PERCENTAGE'] = this.tOTALEARNINGSPERCENTAGE; + data['TOTAL_PAY_AMOUNT'] = this.tOTALPAYAMOUNT; + data['TOTAL_PAY_PERCENTAGE'] = this.tOTALPAYPERCENTAGE; + return data; + } +} \ No newline at end of file diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance.dart index 9ec5cdd..7a28c96 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance.dart @@ -32,6 +32,8 @@ class MonthlyAttendance extends StatefulWidget { } } +// todo '@fatima' use extension methods for widgets + class _MonthlyAttendanceState extends State { bool isPresent = false; bool isAbsent = false; diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 2e7757c..c125c2d 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -50,276 +50,342 @@ class _DashboardScreenState extends State { List namesD = ["Nostalgia Perfume Perfume", "Al Nafoura", "AlJadi", "Nostalgia Perfume"]; final GlobalKey _key = GlobalKey(); // return Scaffold( - key: _scaffoldState, - body: Column( - children: [ - Row( - children: [ - Builder(builder: (context) { - return Row( - mainAxisSize: MainAxisSize.min, - children: [ - CircularAvatar( - width: 34, - height: 34, - url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", + key: _scaffoldState, + body: Column( + children: [ + Row( + children: [ + Builder(builder: (context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + CircularAvatar( + width: 34, + height: 34, + url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", + ), + 8.width, + SvgPicture.asset("assets/images/side_nav.svg"), + ], + ).onPress(() { + _scaffoldState.currentState!.openDrawer(); + }); + }), + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + //AppLogo(), + 8.width, + LocaleKeys.mohemm.tr().toText14() + ], + ), + ), + SizedBox( + width: 36, + height: 36, + child: Stack( + alignment: Alignment.centerLeft, + children: [ + SvgPicture.asset("assets/images/announcements.svg"), + Positioned( + right: 0, + top: 0, + child: Container( + padding: const EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), + child: "3".toText12(color: Colors.white), ), - 8.width, - SvgPicture.asset("assets/images/side_nav.svg"), - ], - ).onPress(() { - _scaffoldState.currentState!.openDrawer(); - }); - }), - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - //AppLogo(), - 8.width, - LocaleKeys.mohemm.tr().toText14() - ], - ), + ) + ], ), - SizedBox( - width: 36, - height: 36, - child: Stack( - alignment: Alignment.centerLeft, + ).onPress(() async { + await Navigator.pushNamed(context, AppRoutes.announcements); + + }) + ], + ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), + Expanded( + child: SingleChildScrollView( + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - SvgPicture.asset("assets/images/announcements.svg"), - Positioned( - right: 0, - top: 0, - child: Container( - padding: const EdgeInsets.only(left: 5, right: 5), - decoration: BoxDecoration(color: MyColors.redColor, borderRadius: BorderRadius.circular(17)), - child: "3".toText12(color: Colors.white), - ), - ) - ], - ), - ).onPress(() async { - // data.update(context); - await Navigator.pushNamed(context, AppRoutes.announcements); - }) - ], - ).paddingOnly(left: 21, right: 21, top: 48, bottom: 7), - Expanded( - child: SingleChildScrollView( - child: Column( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), - "Mahmoud Shrouf".toText24(isBold: true), - 16.height, - Row( - children: [ - Expanded( - child: AspectRatio( - aspectRatio: 159 / 159, - child: Consumer( - builder: (context, model, child) { - return (model.isAttendanceTrackingLoading - ? GetAttendanceTrackingShimmer() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ - MyColors.gradiantEndColor, - MyColors.gradiantStartColor, - ]), - ), - child: Stack( - alignment: Alignment.center, - children: [ - if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), - if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), - if (model.isTimeRemainingInSeconds != 0) - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - 9.height, - CountdownTimer( - endTime: model.endTime, - onEnd: null, - endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), - textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), - ), - LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), - 9.height, - ClipRRect( - borderRadius: BorderRadius.all( - Radius.circular(20), - ), - child: LinearProgressIndicator( - value: model.progress, - minHeight: 8, - valueColor: const AlwaysStoppedAnimation(Colors.white), - backgroundColor: const Color(0xff196D73), - ), - ), - ], - ), - ], - ).paddingOnly(top: 12, right: 15, left: 12), - ), - Row( + LocaleKeys.goodMorning.tr().toText14(color: MyColors.grey77Color), + "Mahmoud Shrouf".toText24(isBold: true), + 16.height, + Row( + children: [ + Expanded( + child: AspectRatio( + aspectRatio: 159 / 159, + child: Consumer( + builder: (context, model, child) { + return (model.isAttendanceTrackingLoading + ? GetAttendanceTrackingShimmer() + : Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + gradient: const LinearGradient(transform: GradientRotation(.46), begin: Alignment.topRight, end: Alignment.bottomLeft, colors: [ + MyColors.gradiantEndColor, + MyColors.gradiantStartColor, + ]), + ), + child: Stack( + alignment: Alignment.center, + children: [ + if (model.isTimeRemainingInSeconds == 0) SvgPicture.asset("assets/images/thumb.svg"), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: Column( + LocaleKeys.markAttendance.tr().toText14(color: Colors.white, isBold: true), + if (model.isTimeRemainingInSeconds == 0) "01-02-2022".toText12(color: Colors.white), + if (model.isTimeRemainingInSeconds != 0) + Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - LocaleKeys.checkIn.tr().toText12(color: Colors.white), - (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) - .toString() - .toText14(color: Colors.white, isBold: true), - 4.height, + 9.height, + CountdownTimer( + endTime: model.endTime, + onEnd: null, + endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), + textStyle: TextStyle(color: Colors.white, fontSize: 14, letterSpacing: -0.48, fontWeight: FontWeight.bold), + ), + LocaleKeys.timeLeftToday.tr().toText12(color: Colors.white), + 9.height, + ClipRRect( + borderRadius: BorderRadius.all( + Radius.circular(20), + ), + child: LinearProgressIndicator( + value: model.progress, + minHeight: 8, + valueColor: const AlwaysStoppedAnimation(Colors.white), + backgroundColor: const Color(0xff196D73), + ), + ), ], - ).paddingOnly(left: 12), - ), - Container( - width: 45, - height: 45, - padding: const EdgeInsets.only(left: 14, right: 14), - decoration: const BoxDecoration( - color: Color(0xff259EA4), - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(15), - ), ), - child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), - ), ], - ), - ], - ), - ], - ), - ).onPress(() { - Navigator.pushNamed(context, AppRoutes.todayAttendance); - })) - .animatedSwither(); - }, - ), + ).paddingOnly(top: 12, right: 15, left: 12), + ), + Row( + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.checkIn.tr().toText12(color: Colors.white), + (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) + .toString() + .toText14(color: Colors.white, isBold: true), + 4.height, + ], + ).paddingOnly(left: 12), + ), + Container( + width: 45, + height: 45, + padding: const EdgeInsets.only(left: 14, right: 14), + decoration: const BoxDecoration( + color: Color(0xff259EA4), + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(15), + ), + ), + child: SvgPicture.asset(model.isTimeRemainingInSeconds == 0 ? "assets/images/play.svg" : "assets/images/stop.svg"), + ), + ], + ), + ], + ), + ], + ), + ).onPress(() { + Navigator.pushNamed(context, AppRoutes.todayAttendance); + })) + .animatedSwither(); + }, ), ), - 9.width, - Expanded( - child: MenusWidget(), - ), - ], - ), - ], - ).paddingOnly(left: 21, right: 21, top: 7), - ServicesWidget(), - 8.height, - Container( - width: double.infinity, - padding: EdgeInsets.only(top: 31), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + ), + 9.width, + Expanded( + child: MenusWidget(), + ), + ], ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - LocaleKeys.offers.tr().toText12(), - Row( - children: [ - LocaleKeys.discounts.tr().toText24(isBold: true), - 6.width, - Container( - padding: const EdgeInsets.only(left: 8, right: 8), - decoration: BoxDecoration( - color: MyColors.yellowColor, - borderRadius: BorderRadius.circular(10), - ), - child: LocaleKeys.newString.tr().toText10(isBold: true)), - ], - ), - ], - ), - ), - LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true), - ], - ).paddingOnly(left: 21, right: 21), - SizedBox( - height: 103 + 33, - child: ListView.separated( - shrinkWrap: true, - physics: const BouncingScrollPhysics(), - padding: const EdgeInsets.only(left: 21, right: 21, top: 13), - scrollDirection: Axis.horizontal, - itemBuilder: (cxt, index) { - return SizedBox( - width: 73, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Container( - width: 73, - height: 73, + ], + ).paddingOnly(left: 21, right: 21, top: 7), + ServicesWidget(), + 8.height, + Container( + width: double.infinity, + padding: EdgeInsets.only(top: 31), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only(topRight: Radius.circular(50), topLeft: Radius.circular(50)), + border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.offers.tr().toText12(), + Row( + children: [ + LocaleKeys.discounts.tr().toText24(isBold: true), + 6.width, + Container( + padding: const EdgeInsets.only(left: 8, right: 8), decoration: BoxDecoration( - borderRadius: const BorderRadius.all( - Radius.circular(100), - ), - border: Border.all(color: MyColors.lightGreyEDColor, width: 1), + color: MyColors.yellowColor, + borderRadius: BorderRadius.circular(10), ), - child: ClipRRect( - borderRadius: const BorderRadius.all( - Radius.circular(50), - ), - child: Image.network( - "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", - fit: BoxFit.cover, - ), + child: LocaleKeys.newString.tr().toText10(isBold: true)), + ], + ), + ], + ), + ), + LocaleKeys.viewAllOffers.tr().toText12(isUnderLine: true), + ], + ).paddingOnly(left: 21, right: 21), + SizedBox( + height: 103 + 33, + child: ListView.separated( + shrinkWrap: true, + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.only(left: 21, right: 21, top: 13), + scrollDirection: Axis.horizontal, + itemBuilder: (cxt, index) { + return SizedBox( + width: 73, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 73, + height: 73, + decoration: BoxDecoration( + borderRadius: const BorderRadius.all( + Radius.circular(100), ), + border: Border.all(color: MyColors.lightGreyEDColor, width: 1), ), - 4.height, - Expanded( - child: namesD[6 % (index + 1)].toText12(isCenter: true, maxLine: 2), + child: ClipRRect( + borderRadius: const BorderRadius.all( + Radius.circular(50), + ), + child: Image.network( + "https://play-lh.googleusercontent.com/NPo88ojmhah4HDiposucJmfQIop4z4xc8kqJK9ITO9o-yCab2zxIp7PPB_XPj2iUojo", + fit: BoxFit.cover, + ), ), - ], - ), - ); - }, - separatorBuilder: (cxt, index) => 8.width, - itemCount: 6), - ), - ], - ), - ) - ], - ), + ), + 4.height, + Expanded( + child: namesD[6 % (index + 1)].toText12(isCenter: true, maxLine: 2), + ), + ], + ), + ); + }, + separatorBuilder: (cxt, index) => 8.width, + itemCount: 6), + ), + ], + ), + ) + ], + ), + ), + ) + ], + ), + drawer: SafeArea( + child: AppDrawer(), + ), + bottomNavigationBar: BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/home.svg", + width: 20, + height: 20, ), - ) - ], + ), + label: 'Home', + ), + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/create_req.svg", + width: 20, + height: 20, + ), + ), + label: 'Create Request', + ), + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/work_list.svg", + width: 20, + height: 20, + ), + ), + label: 'Work List', + ), + BottomNavigationBarItem( + icon: Padding( + padding: const EdgeInsets.all(4.0), + child: SvgPicture.asset( + "assets/icons/item_for_sale.svg", + width: 20, + height: 20, + ), + ), + label: 'Items for Sale', + ), + ], + currentIndex: 0, + selectedLabelStyle: TextStyle( + fontSize: 8, + color: Color(0xff989898), + fontWeight: FontWeight.w600, + ), + unselectedLabelStyle: TextStyle( + fontSize: 8, + color: Color(0xff989898), + fontWeight: FontWeight.w600, ), - drawer: SafeArea(child: AppDrawer())); + type: BottomNavigationBarType.fixed, + selectedItemColor: Colors.black, + backgroundColor: Color(0xffF8F8F8), + onTap: (v) {}, + ), + ); } } diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index fc873cd..ebb564c 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -1,7 +1,6 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -12,6 +11,8 @@ import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:provider/provider.dart'; +import '../../my_attendance/dynamic_screens/dynamic_listview_screen.dart'; + class ServicesWidget extends StatelessWidget { @override Widget build(BuildContext context) { @@ -109,17 +110,19 @@ class ServicesWidget extends StatelessWidget { void handleOnPress(context, GetMenuEntriesList menuEntry) { var pro = Provider.of(context, listen: false); - List? menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && element.menuEntryType == "FUNCTION").toList(); + List menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && element.menuEntryType == "FUNCTION").toList() ?? []; menuEntry.icon = ""; print(menuEntry.toJson()); - Navigator.pushNamed(context, AppRoutes.myAttendance, arguments: menuList ?? []); - return; - - if (menuEntry.menuName == "HMG_OTL_SS" || menuEntry.menuName == "HMG_PT_OTL_SS") { - Navigator.pushNamed(context, AppRoutes.myAttendance); + if (menuList.isEmpty) { + if (menuEntry.requestType == "EIT") { + Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menuEntry.prompt!, menuEntry.functionName!)); + } else if (menuEntry.requestType == "PAYSLIP") { + Navigator.pushNamed(context, AppRoutes.monthlyPaySlip); + } } else { - Utils.showToast("In Progress"); + Navigator.pushNamed(context, AppRoutes.myAttendance, arguments: menuList); } + return; } String firstWord(String value) { 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 1a430ea..6e020bf 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -121,29 +121,32 @@ class _DynamicInputScreenState extends State { } void getDefaultValues(GetEITDFFStructureList structureList) async { - if ((structureList.cHILDSEGMENTSDVSplited?.length ?? 0) < 1) { - return; - } try { - Utils.showLoading(context); + Utils.showLoading(context); for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; - GetEITDFFStructureList? reqObj = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); - List parentRequired = reqObj.pARENTSEGMENTSDVSplited ?? []; + print("segmentId:${segmentId}"); + print("segmentName:${structureList.sEGMENTNAME}"); + GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); + List parentRequired = parent.pARENTSEGMENTSDVSplited ?? []; + List filteredList = getEitDffStructureList!.where((outerElement) => parentRequired.any((element) => outerElement.sEGMENTNAME == element.name && element.isRequired == "REQUIRED")).toList(); + + List> values = filteredList .map((e) => GetSetValuesRequestModel( sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); + print("values:${values}"); ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); getEitDffStructureList![index].eSERVICESDV = defaultValue; } - Utils.hideLoading(context); - setState(() {}); + Utils.hideLoading(context); + setState(() {}); } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); @@ -228,11 +231,12 @@ class _DynamicInputScreenState extends State { ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "X") { String displayText = model.eSERVICESDV?.pIDCOLUMNNAME ?? (getEitDffStructureList![index].fieldAnswer ?? ""); + if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { if (displayText.contains(" 00:00:00")) { displayText = displayText.replaceAll(" 00:00:00", ""); } - if (!displayText.contains("-")) { + if (displayText.contains("/")) { displayText = DateFormat('yyyy-MM-dd').format(DateFormat("yyyy/MM/dd").parse(displayText)); } } @@ -268,9 +272,12 @@ class _DynamicInputScreenState extends State { } getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); - if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { calGetValueSetValues(model); } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "Y") { @@ -295,7 +302,12 @@ class _DynamicInputScreenState extends State { if (tempDate.contains("00:00:00")) { tempDate = tempDate.replaceAll("00:00:00", '').trim(); } - selectedDate = DateFormat("yyyy/MM/dd").parse(tempDate); + if(tempDate.contains("/")) { + selectedDate = DateFormat("yyyy/MM/dd").parse(tempDate); + } else { + selectedDate = DateFormat("yyyy-MM-dd").parse(tempDate); + } + } else { selectedDate = DateTime.parse(getEitDffStructureList![index].eSERVICESDV!.pVALUECOLUMNNAME!); } @@ -320,10 +332,11 @@ class _DynamicInputScreenState extends State { getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { - if (getEitDffStructureList![index].isDefaultTypeIsCDPS) { - calGetValueSetValues(model); - } else {} + getDefaultValues(model); } }, ).paddingOnly(bottom: 12); @@ -349,6 +362,9 @@ class _DynamicInputScreenState extends State { pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { getDefaultValues(model); } @@ -379,6 +395,9 @@ class _DynamicInputScreenState extends State { pVALUECOLUMNNAME: model.eSERVICESVS![popipIndex].vALUECOLUMNNAME); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { + calGetValueSetValues(model); + } if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { getDefaultValues(model); } @@ -426,9 +445,12 @@ class _DynamicInputScreenState extends State { pVALUECOLUMNNAME: getEitDffStructureList![index].isDefaultTypeIsCDPS ? DateFormat('yyyy-MM-dd hh:mm:ss').format(date) : DateFormat('yyyy-MM-ddThh:mm:ss.s').format(date)); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); - if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { calGetValueSetValues(model); } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "I") { @@ -453,9 +475,12 @@ class _DynamicInputScreenState extends State { ESERVICESDV eservicesdv = ESERVICESDV(pIDCOLUMNNAME: time, pRETURNMSG: "null", pRETURNSTATUS: getEitDffStructureList![index].dEFAULTVALUE, pVALUECOLUMNNAME: time); getEitDffStructureList![index].eSERVICESDV = eservicesdv; setState(() {}); - if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + if (model.cHILDSEGMENTSVSSplited?.isNotEmpty ?? false) { calGetValueSetValues(model); } + if (model.cHILDSEGMENTSDVSplited?.isNotEmpty ?? false) { + getDefaultValues(model); + } }, ).paddingOnly(bottom: 12); } diff --git a/lib/ui/my_attendance/my_attendance_screen.dart b/lib/ui/my_attendance/my_attendance_screen.dart index 2a337a3..276f2cc 100644 --- a/lib/ui/my_attendance/my_attendance_screen.dart +++ b/lib/ui/my_attendance/my_attendance_screen.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -29,7 +30,7 @@ class MyAttendanceScreen extends StatelessWidget { width: double.infinity, height: double.infinity, child: list.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : Column( children: [ itemView( diff --git a/lib/ui/payslip/monthly_pay_slip_screen.dart b/lib/ui/payslip/monthly_pay_slip_screen.dart new file mode 100644 index 0000000..13a7ee0 --- /dev/null +++ b/lib/ui/payslip/monthly_pay_slip_screen.dart @@ -0,0 +1,289 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/api/monthly_pay_slip_api_client.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_deductions_List_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_pay_slip_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_payment_information_list_model.dart'; +import 'package:mohem_flutter_app/models/monthly_pay_slip/get_summary_of_payment_list_model.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; + +class MonthlyPaySlipScreen extends StatefulWidget { + MonthlyPaySlipScreen({Key? key}) : super(key: key); + + @override + _MonthlyPaySlipScreenState createState() { + return _MonthlyPaySlipScreenState(); + } +} + +class _MonthlyPaySlipScreenState extends State { + List paySlipList = []; + List summaryOfPaymentList = []; + List paymentInformationList = []; + List deductionList = []; + List earningList = []; + int? selectedMonthIndex; + + @override + void initState() { + super.initState(); + getData(); + } + + void getData() async { + try { + Utils.showLoading(context); + paySlipList = await MonthlyPaySlipApiClient().getPaySlip(); + if (paySlipList.isNotEmpty) { + selectedMonthIndex = 0; + await getDataByActionContextID(paySlipList[selectedMonthIndex!].aCTIONCONTEXTID!); + } + Utils.hideLoading(context); + setState(() {}); + } catch (ex) { + Utils.hideLoading(context); + Utils.handleException(ex, context, null); + } + } + + Future getDataByActionContextID(int actionContextID, {bool showLoading = false}) async { + try { + if (showLoading) { + Utils.showLoading(context); + } + List results = await Future.wait([ + MonthlyPaySlipApiClient().getSummaryOfPayment(actionContextID), + MonthlyPaySlipApiClient().getPaymentInformation(actionContextID), + MonthlyPaySlipApiClient().getDeductions(actionContextID), + MonthlyPaySlipApiClient().getEarnings(actionContextID), + ]); + summaryOfPaymentList = results[0]; + paymentInformationList = results[1]; + deductionList = results[2]; + earningList = results[3]; + if (showLoading) { + Utils.hideLoading(context); + setState(() {}); + } + } catch (ex) { + if (showLoading) { + Utils.hideLoading(context); + } + Utils.handleException(ex, context, null); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: LocaleKeys.monthlyPaySlip.tr(), + ), + body: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.month.tr().toText17(isBold: true, color: MyColors.darkIconColor), + if (selectedMonthIndex != null) + Row( + children: [ + DateFormat("MMMM-yyyy").format(DateFormat("MM/dd/yyyy").parse(paySlipList[selectedMonthIndex!].pAYMENTDATE!)).toText16(color: MyColors.greyACColor), + const Icon(Icons.keyboard_arrow_down_rounded, color: MyColors.greyACColor), + ], + ).onPress(() async { + int tempIndex = selectedMonthIndex!; + showModalBottomSheet( + context: context, + builder: (cxt) { + return Container( + height: 200, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + LocaleKeys.ok.tr().toText16(color: MyColors.gradiantEndColor).paddingOnly(right: 21, top: 16).onPress(() { + if (selectedMonthIndex != tempIndex) { + selectedMonthIndex = tempIndex; + Navigator.pop(context); + getDataByActionContextID(paySlipList[selectedMonthIndex!].aCTIONCONTEXTID!, showLoading: true); + } + }), + CupertinoPicker( + itemExtent: 40, + onSelectedItemChanged: (index) { + tempIndex = index; + }, + children: [for (int i = 0; i < paySlipList.length; i++) paySlipList[i].pERIODNAME!.toText16().center]).expanded, + ], + ), + ); + }); + }) + ], + ).paddingOnly(left: 21, right: 21), + ListView( + padding: const EdgeInsets.all(21), + children: [ + if (summaryOfPaymentList.isNotEmpty) ...[paymentSummaryData(context)], + if (earningList.isNotEmpty) ...[18.height, earningData(context)], + if (deductionList.isNotEmpty) ...[18.height, deductionData(context)], + if (paymentInformationList.isNotEmpty) ...[12.height, paymentInformationData(context)] + ], + ).expanded, + ], + ), + ); + } + + Widget earningData(context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(LocaleKeys.particular.tr()), + Utils.tableColumnTitle(LocaleKeys.amount.tr()), + ], + ), + ); + for (int i = 0; i < earningList.length; i++) { + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue('${earningList[i].eLEMENTNAME}', isLast: i == earningList.length - 1), + Utils.tableColumnValue('${earningList[i].aMOUNT}', isLast: i == earningList.length - 1), + ]), + ); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.earnings.tr().toSectionHeading(), + 12.height, + Table( + columnWidths: const {0: FlexColumnWidth(1.5), 1: FlexColumnWidth(1.0)}, + children: tableRow, + ).objectContainerView(), + ], + ); + } + + Widget deductionData(context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(LocaleKeys.particular.tr()), + Utils.tableColumnTitle(LocaleKeys.amount.tr()), + ], + ), + ); + for (int i = 0; i < deductionList.length; i++) { + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue('${deductionList[i].eLEMENTNAME}', isLast: i == deductionList.length - 1), + Utils.tableColumnValue('${deductionList[i].aMOUNT}', isLast: i == deductionList.length - 1), + ]), + ); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.deductions.tr().toSectionHeading(), + 12.height, + Table( + columnWidths: const {0: FlexColumnWidth(1.5), 1: FlexColumnWidth(1.0)}, + children: tableRow, + ).objectContainerView(), + ], + ); + } + + Widget paymentSummaryData(context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(LocaleKeys.particular.tr()), + Utils.tableColumnTitle("%"), + Utils.tableColumnTitle(LocaleKeys.amount.tr()), + ], + ), + ); + + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue(LocaleKeys.deductions.tr(), isLast: false), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSPERCENTAGE}', isLast: false), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSAMOUNT}', isLast: false), + ]), + ); + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue(LocaleKeys.earnings.tr(), isLast: false), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSPERCENTAGE}', isLast: false), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSAMOUNT}', isLast: false), + ]), + ); + tableRow.add( + TableRow(children: [ + Utils.tableColumnValue(LocaleKeys.totalPayAmount.tr(), isLast: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYPERCENTAGE}', isLast: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYAMOUNT}', isLast: true), + ]), + ); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.summaryOfInformation.tr().toSectionHeading(), + 12.height, + Table( + columnWidths: const {0: FlexColumnWidth(2.0), 1: FlexColumnWidth(1.0), 2: FlexColumnWidth(1.0)}, + children: tableRow, + ).objectContainerView(), + ], + ); + } + + Widget paymentInformationData(context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + LocaleKeys.paymentInformation.tr().toSectionHeading(), + 12.height, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ItemDetailView(LocaleKeys.paymentMethodName.tr(), paymentInformationList[0].pAYMENTMETHODNAME ?? ""), + ItemDetailView(LocaleKeys.bankName.tr(), paymentInformationList[0].bANKNAME ?? ""), + ItemDetailView(LocaleKeys.branchCode.tr(), paymentInformationList[0].bRANCHNAME ?? ""), + ItemDetailView(LocaleKeys.accountNo.tr(), paymentInformationList[0].aCCOUNTNUMBER ?? ""), + ItemDetailView(LocaleKeys.amount.tr(), paymentInformationList[0].aMOUNT ?? ""), + ], + ).objectContainerView(), + ], + ); + } +} diff --git a/lib/ui/screens/announcements/announcement_details.dart b/lib/ui/screens/announcements/announcement_details.dart index a3de742..9ff6c36 100644 --- a/lib/ui/screens/announcements/announcement_details.dart +++ b/lib/ui/screens/announcements/announcement_details.dart @@ -92,6 +92,8 @@ class _AnnouncementDetailsState extends State { try { Utils.showLoading(context); jsonResponse = await PendingTransactionsApiClient().getAnnouncements(itgAwarenessID, currentPageNo, itgRowID); + // todo '@haroon' move below post processing code to above method and get exact model which you need, + var jsonDecodedData = jsonDecode(jsonDecode(jsonResponse)['result']['data']); getAnnouncementDetailsObj = GetAnnouncementDetails.fromJson(jsonDecodedData[0]); Utils.hideLoading(context); diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index 76f8a20..89d4ba6 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -12,6 +12,7 @@ import 'package:mohem_flutter_app/ui/screens/profile/widgets/header.dart'; import 'package:mohem_flutter_app/ui/screens/profile/widgets/profile_panel.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; +// todo '@sultan' kindly follow structure of code written. use extension methods for widgets and dont hard code strings, use localizations class ProfileScreen extends StatefulWidget { const ProfileScreen({Key? key}) : super(key: key); diff --git a/lib/ui/screens/profile/widgets/profile_info.dart b/lib/ui/screens/profile/widgets/profile_info.dart index 6f30b7a..b777b8e 100644 --- a/lib/ui/screens/profile/widgets/profile_info.dart +++ b/lib/ui/screens/profile/widgets/profile_info.dart @@ -9,6 +9,8 @@ import 'package:mohem_flutter_app/models/profile_menu.model.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart'; import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; +// todo '@sultan' kindly follow structure of code written. use extension methods for widgets, also format code + class ProfileInFo extends StatelessWidget { ProfileInFo(this.memberInfo); MemberInformationListModel memberInfo; From 2966ca129c090665112912e4f660bcc0c28c837d Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 27 Jun 2022 15:54:58 +0300 Subject: [PATCH 20/22] monthly pay slip improvement --- lib/classes/utils.dart | 17 ++++------ lib/ui/payslip/monthly_pay_slip_screen.dart | 37 +++++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 114f32c..74ab127 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -161,14 +161,14 @@ class Utils { return base64Decode(base64String); } - static Widget tableColumnTitle(String? text, {bool showDivider = true}) { + static Widget tableColumnTitle(String? text, {bool showDivider = true, bool alignCenter = false}) { text ??= ""; return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ 6.height, - text.toText12(), + alignCenter ? text.toText12().center : text.toText12(), 5.height, if (showDivider) const Divider( @@ -180,20 +180,17 @@ class Utils { ); } - static Widget tableColumnValue(String text, {bool isLast = false, bool isCapitable = true}) { + static Widget tableColumnValue(String text, { bool isCapitable = true, bool alignCenter = false}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ 12.height, - (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor), + if (alignCenter) + (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor).center + else + (isCapitable ? text.toLowerCase().capitalizeFirstofEach : text).toText12(color: MyColors.normalTextColor), 12.height, - if (!isLast) - const Divider( - height: 1, - color: Color(0xffEFEFEF), - thickness: 1, - ) ], ); } diff --git a/lib/ui/payslip/monthly_pay_slip_screen.dart b/lib/ui/payslip/monthly_pay_slip_screen.dart index 13a7ee0..85ccf8d 100644 --- a/lib/ui/payslip/monthly_pay_slip_screen.dart +++ b/lib/ui/payslip/monthly_pay_slip_screen.dart @@ -99,8 +99,9 @@ class _MonthlyPaySlipScreenState extends State { children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ - LocaleKeys.month.tr().toText17(isBold: true, color: MyColors.darkIconColor), + Container(alignment: Alignment.centerLeft, child: LocaleKeys.month.tr().toText17(isBold: true, color: MyColors.darkIconColor)), if (selectedMonthIndex != null) Row( children: [ @@ -158,15 +159,15 @@ class _MonthlyPaySlipScreenState extends State { TableRow( children: [ Utils.tableColumnTitle(LocaleKeys.particular.tr()), - Utils.tableColumnTitle(LocaleKeys.amount.tr()), + Utils.tableColumnTitle(LocaleKeys.amount.tr(), alignCenter: true), ], ), ); for (int i = 0; i < earningList.length; i++) { tableRow.add( TableRow(children: [ - Utils.tableColumnValue('${earningList[i].eLEMENTNAME}', isLast: i == earningList.length - 1), - Utils.tableColumnValue('${earningList[i].aMOUNT}', isLast: i == earningList.length - 1), + Utils.tableColumnValue('${earningList[i].eLEMENTNAME}'), + Utils.tableColumnValue('${earningList[i].aMOUNT}', alignCenter: true), ]), ); } @@ -190,15 +191,15 @@ class _MonthlyPaySlipScreenState extends State { TableRow( children: [ Utils.tableColumnTitle(LocaleKeys.particular.tr()), - Utils.tableColumnTitle(LocaleKeys.amount.tr()), + Utils.tableColumnTitle(LocaleKeys.amount.tr(), alignCenter: true), ], ), ); for (int i = 0; i < deductionList.length; i++) { tableRow.add( TableRow(children: [ - Utils.tableColumnValue('${deductionList[i].eLEMENTNAME}', isLast: i == deductionList.length - 1), - Utils.tableColumnValue('${deductionList[i].aMOUNT}', isLast: i == deductionList.length - 1), + Utils.tableColumnValue('${deductionList[i].eLEMENTNAME}'), + Utils.tableColumnValue('${deductionList[i].aMOUNT}', alignCenter: true), ]), ); } @@ -223,31 +224,31 @@ class _MonthlyPaySlipScreenState extends State { TableRow( children: [ Utils.tableColumnTitle(LocaleKeys.particular.tr()), - Utils.tableColumnTitle("%"), - Utils.tableColumnTitle(LocaleKeys.amount.tr()), + Utils.tableColumnTitle("%", alignCenter: true), + Utils.tableColumnTitle(LocaleKeys.amount.tr(), alignCenter: true), ], ), ); tableRow.add( TableRow(children: [ - Utils.tableColumnValue(LocaleKeys.deductions.tr(), isLast: false), - Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSPERCENTAGE}', isLast: false), - Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSAMOUNT}', isLast: false), + Utils.tableColumnValue(LocaleKeys.deductions.tr()), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSPERCENTAGE}', alignCenter: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALDEDUCTIONSAMOUNT}', alignCenter: true), ]), ); tableRow.add( TableRow(children: [ - Utils.tableColumnValue(LocaleKeys.earnings.tr(), isLast: false), - Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSPERCENTAGE}', isLast: false), - Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSAMOUNT}', isLast: false), + Utils.tableColumnValue(LocaleKeys.earnings.tr()), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSPERCENTAGE}', alignCenter: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALEARNINGSAMOUNT}', alignCenter: true), ]), ); tableRow.add( TableRow(children: [ - Utils.tableColumnValue(LocaleKeys.totalPayAmount.tr(), isLast: true), - Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYPERCENTAGE}', isLast: true), - Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYAMOUNT}', isLast: true), + Utils.tableColumnValue(LocaleKeys.totalPayAmount.tr()), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYPERCENTAGE}', alignCenter: true), + Utils.tableColumnValue('${summaryOfPaymentList[0].tOTALPAYAMOUNT}', alignCenter: true), ]), ); From 0786a1fa037577f54310a7ac297c3247acd4544b Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 28 Jun 2022 15:38:59 +0300 Subject: [PATCH 21/22] lint rules added. --- analysis_options.yaml | 14 + lib/api/api_client.dart | 3 +- lib/api/dashboard_api_client.dart | 6 +- lib/api/eit_api_client.dart | 4 +- lib/api/login_api_client.dart | 2 +- lib/api/monthlyAttendance_api_client.dart | 2 +- lib/api/mowadhafhi/mowadhafhi_api_client.dart | 5 +- lib/api/my_attendance_api_client.dart | 2 +- lib/api/profile_api_client.dart | 2 +- lib/api/worklist/worklist_api_client.dart | 11 +- lib/classes/app_permissions.dart | 4 +- lib/classes/date_uitl.dart | 26 +- lib/classes/utils.dart | 10 +- lib/config/routes.dart | 3 +- lib/dialogs/otp_dialog.dart | 14 +- lib/extensions/string_extensions.dart | 28 +- lib/extensions/widget_extensions.dart | 2 +- lib/main.dart | 6 +- lib/models/eit/get_eit_transaction_model.dart | 6 +- lib/models/generic_response_model.dart | 21 +- ...llection_notification_body_list_model.dart | 34 +- lib/provider/dashboard_provider_model.dart | 7 +- lib/theme/app_theme.dart | 2 +- lib/ui/attendance/monthly_attendance.dart | 105 +++--- lib/ui/landing/today_attendance_screen.dart | 5 +- lib/ui/landing/widget/app_drawer.dart | 91 ++--- lib/ui/landing/widget/services_widget.dart | 3 +- .../dynamic_screens/dynamic_input_screen.dart | 10 +- .../dynamic_listview_screen.dart | 12 +- lib/ui/payslip/monthly_pay_slip_screen.dart | 16 +- lib/ui/profile/basic_details.dart | 10 +- lib/ui/profile/contact_details.dart | 7 +- lib/ui/profile/delete_familyMember.dart | 64 ++-- .../dynamic_input_profile_screen.dart | 2 +- .../dynamic_listview_screen.dart | 2 +- lib/ui/profile/family_members.dart | 332 +++++++++--------- lib/ui/profile/personal_info.dart | 3 +- lib/ui/profile/phone_numbers.dart | 222 ++++++------ lib/ui/profile/profile.dart | 34 +- .../announcements/announcement_details.dart | 2 +- .../screens/mowadhafhi/mowadhafhi_home.dart | 164 +++++---- .../screens/mowadhafhi/request_details.dart | 2 +- .../pending_transactions_details.dart | 2 +- lib/ui/screens/profile/profile_screen.dart | 5 +- .../approval_level_fragment.dart | 1 - lib/ui/work_list/sheets/delegate_sheet.dart | 18 +- .../sheets/search_options_sheet.dart | 5 +- .../work_list/sheets/selected_item_sheet.dart | 18 +- lib/ui/work_list/worklist_detail_screen.dart | 13 +- .../worklist_fragments/info_fragments.dart | 10 +- lib/widgets/Updater.dart | 2 +- lib/widgets/bottom_sheet.dart | 2 +- lib/widgets/circular_step_progress_bar.dart | 2 +- lib/widgets/location/Location.dart | 35 +- lib/widgets/otp_widget.dart | 6 +- 55 files changed, 684 insertions(+), 735 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 90c25c1..fa4efae 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -9,6 +9,13 @@ # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml +analyzer: + errors: + always_use_package_imports: error + camel_case_types: error + always_declare_return_types: error + + linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` @@ -25,6 +32,13 @@ linter: always_specify_types: true always_declare_return_types: true always_use_package_imports: true + avoid_unnecessary_containers: true + unnecessary_this: true + unnecessary_new: true + camel_case_types: true + sort_child_properties_last: true + camel_case_extensions : true + require_trailing_commas: true avoid_empty_else: true avoid_annotating_with_dynamic: true # avoid_print: false # Uncomment to disable the `avoid_print` rule diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index 258b2af..f4d5f30 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -7,8 +7,7 @@ import 'package:http/http.dart'; import 'package:http/io_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; - -import '../main.dart'; +import 'package:mohem_flutter_app/main.dart'; typedef FactoryConstructor = U Function(dynamic); diff --git a/lib/api/dashboard_api_client.dart b/lib/api/dashboard_api_client.dart index 444eb21..215af90 100644 --- a/lib/api/dashboard_api_client.dart +++ b/lib/api/dashboard_api_client.dart @@ -1,17 +1,13 @@ import 'dart:async'; +import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; -import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; -import 'package:mohem_flutter_app/models/check_mobile_app_version_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; -import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:uuid/uuid.dart'; -import 'api_client.dart'; - class DashboardApiClient { static final DashboardApiClient _instance = DashboardApiClient._internal(); diff --git a/lib/api/eit_api_client.dart b/lib/api/eit_api_client.dart index e3f78bf..9e4f292 100644 --- a/lib/api/eit_api_client.dart +++ b/lib/api/eit_api_client.dart @@ -10,7 +10,7 @@ import 'package:mohem_flutter_app/models/eit/get_eit_transaction_model.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class EITApiClient { static final EITApiClient _instance = EITApiClient._internal(); @@ -24,7 +24,7 @@ class EITApiClient { Map postParams = {'P_FUNCTION_NAME': functionName, "P_MENU_TYPE": "E", "P_PAGE_LIMIT": 50, "P_PAGE_NUM": 1}; postParams.addAll(AppState().postParamsJson); return await ApiClient().postJsonForObject((json) { - List? responseData = GET_EIT_Transactions_Model.fromJson(json['GetEITTransactionList'][0]).collectionTransaction; + List? responseData = GetEitTransactionsModel.fromJson(json['GetEITTransactionList'][0]).collectionTransaction; return responseData; }, url, postParams); } diff --git a/lib/api/login_api_client.dart b/lib/api/login_api_client.dart index ed7191c..8016ab9 100644 --- a/lib/api/login_api_client.dart +++ b/lib/api/login_api_client.dart @@ -8,7 +8,7 @@ import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class LoginApiClient { static final LoginApiClient _instance = LoginApiClient._internal(); diff --git a/lib/api/monthlyAttendance_api_client.dart b/lib/api/monthlyAttendance_api_client.dart index 4de2481..543addb 100644 --- a/lib/api/monthlyAttendance_api_client.dart +++ b/lib/api/monthlyAttendance_api_client.dart @@ -8,7 +8,7 @@ import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.d import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; // todo '@fatima' change file name according to structure class MonthlyAttendanceApiClient { diff --git a/lib/api/mowadhafhi/mowadhafhi_api_client.dart b/lib/api/mowadhafhi/mowadhafhi_api_client.dart index 935a22f..e5ecc4b 100644 --- a/lib/api/mowadhafhi/mowadhafhi_api_client.dart +++ b/lib/api/mowadhafhi/mowadhafhi_api_client.dart @@ -9,8 +9,7 @@ import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_details.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart'; - -import '../../models/mowadhafhi/get_tickets_list.dart'; +import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; class MowadhafhiApiClient { static final MowadhafhiApiClient _instance = MowadhafhiApiClient._internal(); @@ -115,7 +114,7 @@ class MowadhafhiApiClient { String url = "${ApiConsts.cocRest}Mohemm_ITG_CreateTicketMobile"; Map postParams = { "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER, - "ItgImageCollList" : attachmentList, + "ItgImageCollList": attachmentList, "channelId": 3, "departmentId": departmentID, "description": description, diff --git a/lib/api/my_attendance_api_client.dart b/lib/api/my_attendance_api_client.dart index afae637..b98aed4 100644 --- a/lib/api/my_attendance_api_client.dart +++ b/lib/api/my_attendance_api_client.dart @@ -9,7 +9,7 @@ import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/models/start_eit_approval_process_model.dart'; import 'package:mohem_flutter_app/models/submit_eit_transaction_list_model.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class MyAttendanceApiClient { static final MyAttendanceApiClient _instance = MyAttendanceApiClient._internal(); diff --git a/lib/api/profile_api_client.dart b/lib/api/profile_api_client.dart index 3768a64..2d08952 100644 --- a/lib/api/profile_api_client.dart +++ b/lib/api/profile_api_client.dart @@ -9,7 +9,7 @@ import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; -import 'api_client.dart'; +import 'package:mohem_flutter_app/api/api_client.dart'; class ProfileApiClient { static final ProfileApiClient _instance = ProfileApiClient._internal(); diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 2cb4a5c..bc05627 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -20,17 +20,14 @@ import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_mod import 'package:mohem_flutter_app/models/itg_forms_models/itg_request_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; -import '../../models/worklist/hr/eit_otification_body_model.dart'; -import '../../models/worklist/get_favorite_replacements_model.dart'; -import '../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; -import '../../models/worklist/hr/get_contact_notification_body_list_model.dart'; -import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; -import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; - class WorkListApiClient { static final WorkListApiClient _instance = WorkListApiClient._internal(); diff --git a/lib/classes/app_permissions.dart b/lib/classes/app_permissions.dart index a70342c..983b400 100644 --- a/lib/classes/app_permissions.dart +++ b/lib/classes/app_permissions.dart @@ -1,7 +1,7 @@ import 'package:permission_handler/permission_handler.dart'; class AppPermissions{ - static location(Function(bool) completion) { + static void location(Function(bool) completion) { Permission.location.isGranted.then((isGranted){ if(!isGranted){ Permission.location.request().then((granted){ @@ -13,7 +13,7 @@ class AppPermissions{ } - static checkAll(Function(bool) completion){ + static void checkAll(Function(bool) completion){ [ Permission.location ].request().then((value){ diff --git a/lib/classes/date_uitl.dart b/lib/classes/date_uitl.dart index 7fb4b9f..8754fdb 100644 --- a/lib/classes/date_uitl.dart +++ b/lib/classes/date_uitl.dart @@ -133,7 +133,7 @@ class DateUtil { /// get month by /// [month] convert month number in to month name - static getMonth(int month) { + static String getMonth(int month) { switch (month) { case 1: return "January"; @@ -159,12 +159,14 @@ class DateUtil { return "November"; case 12: return "December"; + default: + return ""; } } /// get month by /// [month] convert month number in to month name in Arabic - static getMonthArabic(int month) { + static String getMonthArabic(int month) { switch (month) { case 1: return "يناير"; @@ -190,10 +192,12 @@ class DateUtil { return " نوفمبر"; case 12: return "ديسمبر"; + default: + return ""; } } - static getMonthByName(String month) { + static int getMonthByName(String month) { switch (month.toLowerCase()) { case 'january': return 1; @@ -219,6 +223,8 @@ class DateUtil { return 11; case 'december': return 12; + default: + return 0; } } @@ -234,7 +240,7 @@ class DateUtil { /// get month by /// [weekDay] convert week day in int to week day name - static getWeekDay(int weekDay) { + static String getWeekDay(int weekDay) { switch (weekDay) { case 1: return "Monday"; @@ -250,12 +256,14 @@ class DateUtil { return "Saturday "; case 7: return "Sunday"; + default: + return ""; } } /// get month by /// [weekDay] convert week day in int to week day name arabic - static getWeekDayArabic(int weekDay) { + static String getWeekDayArabic(int weekDay) { switch (weekDay) { case 1: return "الاثنين"; @@ -271,10 +279,12 @@ class DateUtil { return "السبت "; case 7: return "الاحد"; + default: + return ""; } } - static getWeekDayEnglish(int weekDay) { + static String getWeekDayEnglish(int weekDay) { switch (weekDay) { case 1: return "Monday"; @@ -290,6 +300,8 @@ class DateUtil { return "Saturday "; case 7: return "Sunday"; + default: + return ""; } } @@ -415,7 +427,7 @@ class DateUtil { return DateFormat(formattedString).format(dateTime); } - static convertISODateToJsonDate(String isoDate) { + static String convertISODateToJsonDate(String isoDate) { return "/Date(" + DateFormat('mm-dd-yyy').parse(isoDate).millisecondsSinceEpoch.toString() + ")/"; } diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 74ab127..424d656 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -136,20 +136,20 @@ class Utils { ).center; } - static getPostBytes(img) { + static Uint8List getPostBytes(img) { try { var b64 = img.replaceFirst('data:image/png;base64,', ''); if (img != null && Utils.isBase64(b64)) return Utils.dataFromBase64String(b64); } catch (e) {} - return null; + return Uint8List.fromList([]); } - static getBase64FromJpeg(img) { + static String getBase64FromJpeg(img) { try { var b64 = img.replaceFirst('data:image/jpeg;base64,', ''); return b64; } catch (e) {} - return null; + return ""; } static bool isBase64(String str) { @@ -180,7 +180,7 @@ class Utils { ); } - static Widget tableColumnValue(String text, { bool isCapitable = true, bool alignCenter = false}) { + static Widget tableColumnValue(String text, {bool isCapitable = true, bool alignCenter = false}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 7733347..0f71ab5 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -24,6 +24,7 @@ import 'package:mohem_flutter_app/ui/screens/announcements/announcements.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; +import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_home.dart'; import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart'; import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart'; import 'package:mohem_flutter_app/ui/screens/pending_transactions/pending_transactions.dart'; @@ -35,8 +36,6 @@ import 'package:mohem_flutter_app/ui/work_list/itg_detail_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/work_list_screen.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_detail_screen.dart'; -import '../ui/screens/mowadhafhi/mowadhafhi_home.dart'; - class AppRoutes { static const String splash = "/splash"; static const String registerSelection = "/registerSelection"; diff --git a/lib/dialogs/otp_dialog.dart b/lib/dialogs/otp_dialog.dart index 3789980..b761f00 100644 --- a/lib/dialogs/otp_dialog.dart +++ b/lib/dialogs/otp_dialog.dart @@ -218,12 +218,12 @@ class OtpDialog { } } - static getSignature() async { - // if (Platform.isAndroid) { - // return await SmsRetriever.getAppSignature(); - // } else { - // return null; - // } - } + // static getSignature() async { + // // if (Platform.isAndroid) { + // // return await SmsRetriever.getAppSignature(); + // // } else { + // // return null; + // // } + // } } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 69aca90..869b61c 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -23,11 +23,12 @@ extension EmailValidator on String { Widget toText11({Color? color, bool isUnderLine = false, bool isBold = false}) => Text( this, style: TextStyle( - fontSize: 11, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - color: color ?? MyColors.darkTextColor, - letterSpacing: -0.33, - decoration: isUnderLine ? TextDecoration.underline : null), + fontSize: 11, + fontWeight: isBold ? FontWeight.bold : FontWeight.w600, + color: color ?? MyColors.darkTextColor, + letterSpacing: -0.33, + decoration: isUnderLine ? TextDecoration.underline : null, + ), ); Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text( @@ -35,11 +36,12 @@ extension EmailValidator on String { textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, style: TextStyle( - fontSize: 12, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - color: color ?? MyColors.darkTextColor, - letterSpacing: -0.72, - decoration: isUnderLine ? TextDecoration.underline : null), + fontSize: 12, + fontWeight: isBold ? FontWeight.bold : FontWeight.w600, + color: color ?? MyColors.darkTextColor, + letterSpacing: -0.72, + decoration: isUnderLine ? TextDecoration.underline : null, + ), ); Widget toText13({Color? color, bool isUnderLine = false}) => Text( @@ -52,7 +54,7 @@ extension EmailValidator on String { style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); - Widget toText16({Color? color, bool isBold = false,int? maxlines}) => Text( + Widget toText16({Color? color, bool isBold = false, int? maxlines}) => Text( this, maxLines: maxlines, style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), @@ -131,7 +133,7 @@ extension EmailValidator on String { return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; } - getMonth(int month) { + String getMonth(int month) { switch (month) { case 1: return "January"; @@ -157,6 +159,8 @@ extension EmailValidator on String { return "November"; case 12: return "December"; + default: + return ""; } } } diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index f511422..36d523a 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -21,8 +21,8 @@ extension WidgetExtensions on Widget { baseColor: Color(0xffe8eff0), highlightColor: Colors.white, child: Container( - child: this, color: Colors.white, + child: this, ), ) : Container( diff --git a/lib/main.dart b/lib/main.dart index 39a5f48..cd00082 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,20 +5,16 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/generated/codegen_loader.g.dart'; import 'package:mohem_flutter_app/models/post_params_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/eit_provider_model.dart'; import 'package:mohem_flutter_app/theme/app_theme.dart'; -import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:month_year_picker/month_year_picker.dart'; -import 'package:nfc_manager/nfc_manager.dart'; -import 'package:nfc_manager/platform_tags.dart'; import 'package:provider/provider.dart'; import 'package:sizer/sizer.dart'; -import 'config/routes.dart'; - var logger = Logger( // filter: null, // Use the default LogFilter (-> only log in debug mode) printer: PrettyPrinter(lineLength: 0), // Use the PrettyPrinter to format and print log diff --git a/lib/models/eit/get_eit_transaction_model.dart b/lib/models/eit/get_eit_transaction_model.dart index 186ef9c..309c0a4 100644 --- a/lib/models/eit/get_eit_transaction_model.dart +++ b/lib/models/eit/get_eit_transaction_model.dart @@ -1,9 +1,9 @@ -class GET_EIT_Transactions_Model { +class GetEitTransactionsModel { List? collectionTransaction; - GET_EIT_Transactions_Model({this.collectionTransaction}); + GetEitTransactionsModel({this.collectionTransaction}); - GET_EIT_Transactions_Model.fromJson(Map json) { + GetEitTransactionsModel.fromJson(Map json) { if (json['Collection_Transaction'] != null) { collectionTransaction = []; json['Collection_Transaction'].forEach((v) { diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index 5302e64..289b92b 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -1,5 +1,12 @@ import 'package:mohem_flutter_app/models/add_att_success_list_model.dart'; import 'package:mohem_flutter_app/models/add_attachment_list_model.dart'; +import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_open_missing_swipes_list_model.dart'; +import 'package:mohem_flutter_app/models/dashboard/get_open_notifications_list.dart'; +import 'package:mohem_flutter_app/models/dashboard/list_menu.dart'; +import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/get_absence_collection_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_approves_list_model.dart'; @@ -15,6 +22,7 @@ import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_mo_Item_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_mo_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_mobile_login_info_list_model.dart'; import 'package:mohem_flutter_app/models/get_notification_buttons_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_Item_history_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; @@ -23,6 +31,7 @@ import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model. import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; +import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/member_login_list_model.dart'; import 'package:mohem_flutter_app/models/monthly_pay_slip/get_deductions_List_model.dart'; import 'package:mohem_flutter_app/models/monthly_pay_slip/get_earnings_list_model.dart'; @@ -41,6 +50,7 @@ import 'package:mohem_flutter_app/models/notification_action_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; import 'package:mohem_flutter_app/models/pending_transactions/get_pending_transactions_details.dart'; import 'package:mohem_flutter_app/models/pending_transactions/get_req_functions.dart'; +import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_cols_structions.dart'; import 'package:mohem_flutter_app/models/profile/basic_details_dff_structure.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; @@ -56,17 +66,6 @@ import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_bod import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; -import 'basic_member_information_model.dart'; -import 'dashboard/get_accrual_balances_list_model.dart'; -import 'dashboard/get_attendance_tracking_list_model.dart'; -import 'dashboard/get_open_missing_swipes_list_model.dart'; -import 'dashboard/get_open_notifications_list.dart'; -import 'dashboard/list_menu.dart'; -import 'dashboard/menu_entries.dart'; -import 'get_mobile_login_info_list_model.dart'; -import 'member_information_list_model.dart'; -import 'privilege_list_model.dart'; - class GenericResponseModel { String? date; int? languageID; diff --git a/lib/models/get_absence_collection_notification_body_list_model.dart b/lib/models/get_absence_collection_notification_body_list_model.dart index 480a81f..057cb64 100644 --- a/lib/models/get_absence_collection_notification_body_list_model.dart +++ b/lib/models/get_absence_collection_notification_body_list_model.dart @@ -1,4 +1,3 @@ - class GetAbsenceCollectionNotificationBodyList { List? collectionNotification; @@ -16,8 +15,7 @@ class GetAbsenceCollectionNotificationBodyList { Map toJson() { final Map data = new Map(); if (this.collectionNotification != null) { - data['Collection_Notification'] = - this.collectionNotification!.map((v) => v.toJson()).toList(); + data['Collection_Notification'] = this.collectionNotification!.map((v) => v.toJson()).toList(); } return data; } @@ -42,20 +40,20 @@ class CollectionNotificationAbsence { CollectionNotificationAbsence( {this.aCTION, - this.aPPLICATIONCOLUMNNAME, - this.dATATYPE, - this.dATEVALUE, - this.dESCFLEXCONTEXTCODE, - this.dESCFLEXNAME, - this.dISPLAYFLAG, - this.nUMBERVALUE, - this.pREVSEGMENTVALUEDSP, - this.sEGMENTNAME, - this.sEGMENTPROMPT, - this.sEGMENTSEQNUM, - this.sEGMENTVALUEDSP, - this.tRANSACTIONNUMBER, - this.vARCHAR2VALUE}); + this.aPPLICATIONCOLUMNNAME, + this.dATATYPE, + this.dATEVALUE, + this.dESCFLEXCONTEXTCODE, + this.dESCFLEXNAME, + this.dISPLAYFLAG, + this.nUMBERVALUE, + this.pREVSEGMENTVALUEDSP, + this.sEGMENTNAME, + this.sEGMENTPROMPT, + this.sEGMENTSEQNUM, + this.sEGMENTVALUEDSP, + this.tRANSACTIONNUMBER, + this.vARCHAR2VALUE}); CollectionNotificationAbsence.fromJson(Map json) { aCTION = json['ACTION']; @@ -94,4 +92,4 @@ class CollectionNotificationAbsence { data['VARCHAR2_VALUE'] = this.vARCHAR2VALUE; return data; } -} \ No newline at end of file +} diff --git a/lib/provider/dashboard_provider_model.dart b/lib/provider/dashboard_provider_model.dart index 9316182..a78fd67 100644 --- a/lib/provider/dashboard_provider_model.dart +++ b/lib/provider/dashboard_provider_model.dart @@ -11,7 +11,6 @@ import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/models/dashboard/menus.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; -import 'package:mohem_flutter_app/widgets/Updater.dart'; /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool // ignore: prefer_mixin @@ -71,7 +70,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { return ((hour * 60 * 60) + (mints * 60) + seconds); } - update(context) { + void update(context) { fetchAttendanceTracking(context); // isAttendanceTrackingLoading = !isAttendanceTrackingLoading; // isWorkListLoading = !isWorkListLoading; @@ -137,7 +136,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } //List Menu API's & Methods - fetchListMenu() async { + void fetchListMenu() async { try { GenericResponseModel? genericResponseModel = await DashboardApiClient().getListMenu(); Map map = {}; @@ -156,7 +155,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin { } //Menu Entries API's & Methods - fetchMenuEntries() async { + void fetchMenuEntries() async { try { GenericResponseModel? genericResponseModel = await DashboardApiClient().getGetMenuEntries(); getMenuEntriesList = genericResponseModel!.getMenuEntriesList; diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 51987cd..586c3aa 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -3,7 +3,7 @@ import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/theme/colors.dart'; class AppTheme { - static getTheme(isArabic) => ThemeData( + static ThemeData getTheme(isArabic) => ThemeData( fontFamily: isArabic ? 'Cairo' : 'Poppins', primarySwatch: Colors.red, visualDensity: VisualDensity.adaptivePlatformDensity, diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance.dart index 7a28c96..70afd40 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance.dart @@ -1,27 +1,23 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/src/public_ext.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; -import 'package:flutter/scheduler.dart'; +import 'package:intl/intl.dart'; import 'package:mohem_flutter_app/api/monthlyAttendance_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_day_hours_type_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_time_card_summary_list_model.dart'; import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; -import 'package:provider/provider.dart'; -import 'package:syncfusion_flutter_calendar/calendar.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:pie_chart/pie_chart.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:intl/intl.dart'; -import 'package:month_year_picker/month_year_picker.dart'; import 'package:month_picker_dialog/month_picker_dialog.dart'; +import 'package:pie_chart/pie_chart.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; class MonthlyAttendance extends StatefulWidget { MonthlyAttendance({Key? key}) : super(key: key); @@ -71,7 +67,6 @@ class _MonthlyAttendanceState extends State { } } - Future getScheduleShiftsDetails(index, pRTPID) async { try { Utils.showLoading(context); @@ -432,7 +427,7 @@ class _MonthlyAttendanceState extends State { ); } - calendarTapped(CalendarTapDetails details) async { + void calendarTapped(CalendarTapDetails details) async { dynamic index = details.date?.day; if (index != null) { index = index - 1; @@ -460,8 +455,8 @@ class _MonthlyAttendanceState extends State { maxChildSize: 0.9, expand: false, builder: (_, controller) { - dynamic dmyString = getScheduleShiftsDetailsList!.sCHEDULEDATE; - DateTime dateTime1 = DateFormat("MM/dd/yyyy hh:mm:ss a").parse(dmyString); + dynamic dmyString = getScheduleShiftsDetailsList!.sCHEDULEDATE; + DateTime dateTime1 = DateFormat("MM/dd/yyyy hh:mm:ss a").parse(dmyString); return Column( children: [ Container( @@ -487,11 +482,11 @@ class _MonthlyAttendanceState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container(child: - "${DateFormat("MMMM-dd-yyyy").format(dateTime1).replaceAll('-', " ")}".toText24(isBold: true, color: Colors.white), + Container( + child: "${DateFormat("MMMM-dd-yyyy").format(dateTime1).replaceAll('-', " ")}".toText24(isBold: true, color: Colors.white), ).paddingOnly(top: 26, left: 21, right: 21), Container( - child: LocaleKeys.attendanceDetails.tr().toText16(color: MyColors.greyACColor).paddingOnly(left: 21,bottom: 16), + child: LocaleKeys.attendanceDetails.tr().toText16(color: MyColors.greyACColor).paddingOnly(left: 21, bottom: 16), ), Center( child: CircularStepProgressBar( @@ -542,8 +537,8 @@ class _MonthlyAttendanceState extends State { color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}" !="" - ? "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true) + "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}" != "" + ? "${getScheduleShiftsDetailsList!.sHTACTUALSTARTTIME}".toText22(color: Colors.black, isBold: true) : "__".toText22(color: Colors.black, isBold: true), ], ), @@ -557,7 +552,7 @@ class _MonthlyAttendanceState extends State { ), 8.height, "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}" != "" - ? "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true) + ? "${getScheduleShiftsDetailsList!.sHTACTUALENDTIME}".toText22(color: Colors.black, isBold: true) : "__".toText22(color: Colors.black, isBold: true), ], ), @@ -581,9 +576,9 @@ class _MonthlyAttendanceState extends State { color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}" !="" - ? "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true) - :"__".toText22(color: MyColors.greenColor, isBold: true), + "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}" != "" + ? "${getScheduleShiftsDetailsList!.aPPROVEDSTARTTIME}".toText22(color: MyColors.greenColor, isBold: true) + : "__".toText22(color: MyColors.greenColor, isBold: true), ], ), ), @@ -595,9 +590,9 @@ class _MonthlyAttendanceState extends State { color: MyColors.grey67Color, ), 8.height, - "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}"!= "" - ? "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true) - :"__".toText22(color: MyColors.greenColor, isBold: true), + "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}" != "" + ? "${getScheduleShiftsDetailsList!.aPPROVEDENDTIME}".toText22(color: MyColors.greenColor, isBold: true) + : "__".toText22(color: MyColors.greenColor, isBold: true), ], ), ], @@ -695,7 +690,7 @@ class _MonthlyAttendanceState extends State { return meetings; } - static getMonth(int month) { + static String getMonth(int month) { switch (month) { case 1: return "January"; @@ -721,36 +716,40 @@ class _MonthlyAttendanceState extends State { return "November"; case 12: return "December"; + default: + return ""; } } - static getMonthAr(int month){ - switch (month) { - case 1: - return 'يناير'; - case 2: - return ' فبراير'; - case 3: - return 'مارس'; - case 4: - return 'أبريل'; - case 5: - return 'مايو'; - case 6: - return 'يونيو'; - case 7: - return 'يوليو'; - case 8: - return 'أغسطس'; - case 9: - return 'سبتمبر'; - case 10: - return ' اكتوبر'; - case 11: - return ' نوفمبر'; - case 12: - return 'ديسمبر'; - } + static String getMonthAr(int month) { + switch (month) { + case 1: + return 'يناير'; + case 2: + return ' فبراير'; + case 3: + return 'مارس'; + case 4: + return 'أبريل'; + case 5: + return 'مايو'; + case 6: + return 'يونيو'; + case 7: + return 'يوليو'; + case 8: + return 'أغسطس'; + case 9: + return 'سبتمبر'; + case 10: + return ' اكتوبر'; + case 11: + return ' نوفمبر'; + case 12: + return 'ديسمبر'; + default: + return ""; + } } } diff --git a/lib/ui/landing/today_attendance_screen.dart b/lib/ui/landing/today_attendance_screen.dart index 821b01c..4b5332e 100644 --- a/lib/ui/landing/today_attendance_screen.dart +++ b/lib/ui/landing/today_attendance_screen.dart @@ -13,15 +13,14 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/widgets/circular_step_progress_bar.dart'; +import 'package:mohem_flutter_app/widgets/location/Location.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:nfc_manager/nfc_manager.dart'; import 'package:provider/provider.dart'; import 'package:wifi_iot/wifi_iot.dart'; -import '../../provider/dashboard_provider_model.dart'; -import '../../widgets/location/Location.dart'; - class TodayAttendanceScreen extends StatefulWidget { TodayAttendanceScreen({Key? key}) : super(key: key); diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index c19fab7..1c8bf69 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -12,49 +12,58 @@ class _AppDrawerState extends State { @override Widget build(BuildContext context) { return Container( - color: Colors.white, - child: Drawer( - child: Column(children: [ - const SizedBox( - height: 200, - ), - Expanded( - child: ListView(padding: const EdgeInsets.all(21), physics: const BouncingScrollPhysics(), children: [ - const Divider(), - InkWell( - child: const DrawerItem( - 'My Profile', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.profile); - }), - const Divider(), - InkWell( - child: const DrawerItem( - 'Mowadhafhi', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.mowadhafhi); - }), - const Divider(), - InkWell( - child: const DrawerItem( - 'Pending Transactions', - icon: Icons.person, - color: Colors.grey, - ), - onTap: () { - drawerNavigator(context, AppRoutes.pendingTransactions); - }) - ])) - ]))); + color: Colors.white, + child: Drawer( + child: Column( + children: [ + const SizedBox( + height: 200, + ), + Expanded( + child: ListView( + padding: const EdgeInsets.all(21), + physics: const BouncingScrollPhysics(), + children: [ + const Divider(), + InkWell( + child: const DrawerItem( + 'My Profile', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.profile); + }), + const Divider(), + InkWell( + child: const DrawerItem( + 'Mowadhafhi', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.mowadhafhi); + }), + const Divider(), + InkWell( + child: const DrawerItem( + 'Pending Transactions', + icon: Icons.person, + color: Colors.grey, + ), + onTap: () { + drawerNavigator(context, AppRoutes.pendingTransactions); + }) + ], + ), + ) + ], + ), + ), + ); } - drawerNavigator(context, routeName) { + void drawerNavigator(context, routeName) { Navigator.of(context).pushNamed(routeName); } } diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index ebb564c..9500ac4 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -8,11 +8,10 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/dashboard/menu_entries.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; +import 'package:mohem_flutter_app/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:provider/provider.dart'; -import '../../my_attendance/dynamic_screens/dynamic_listview_screen.dart'; - class ServicesWidget extends StatelessWidget { @override Widget build(BuildContext context) { 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 6e020bf..96c1a02 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -175,7 +175,7 @@ class _DynamicInputScreenState extends State { (getEitDffStructureList == null ? const SizedBox() : (getEitDffStructureList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView.separated( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), @@ -209,9 +209,7 @@ class _DynamicInputScreenState extends State { isReadOnly: model.rEADONLY == "Y", onChange: (text) { model.fieldAnswer = text; - if (model.eSERVICESDV == null) { - model.eSERVICESDV = ESERVICESDV(); - } + model.eSERVICESDV ??= ESERVICESDV(); model.eSERVICESDV!.pIDCOLUMNNAME = text; }, ).paddingOnly(bottom: 12); @@ -223,9 +221,7 @@ class _DynamicInputScreenState extends State { isInputTypeNum: true, onChange: (text) { model.fieldAnswer = text; - if (model.eSERVICESDV == null) { - model.eSERVICESDV = ESERVICESDV(); - } + model.eSERVICESDV ??= ESERVICESDV(); model.eSERVICESDV!.pIDCOLUMNNAME = text; }, ).paddingOnly(bottom: 12); 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 129dc5b..54aee5c 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_listview_screen.dart @@ -1,13 +1,10 @@ -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/my_attendance_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_eit_transaction_list_model.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; @@ -47,6 +44,8 @@ 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(() {}); } catch (ex) { @@ -69,14 +68,11 @@ class _DynamicListViewScreenState extends State { return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget( - context, - title: dynamicParams!.title, - ), + appBar: AppBarWidget(context, title: dynamicParams!.title), body: getEITTransactionList == null ? const SizedBox() : (getEITTransactionList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView.separated( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), diff --git a/lib/ui/payslip/monthly_pay_slip_screen.dart b/lib/ui/payslip/monthly_pay_slip_screen.dart index 85ccf8d..a277fcd 100644 --- a/lib/ui/payslip/monthly_pay_slip_screen.dart +++ b/lib/ui/payslip/monthly_pay_slip_screen.dart @@ -97,12 +97,12 @@ class _MonthlyPaySlipScreenState extends State { ), body: Column( children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Container(alignment: Alignment.centerLeft, child: LocaleKeys.month.tr().toText17(isBold: true, color: MyColors.darkIconColor)), - if (selectedMonthIndex != null) + if (selectedMonthIndex != null) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container(alignment: Alignment.centerLeft, child: LocaleKeys.month.tr().toText17(isBold: true, color: MyColors.darkIconColor)), Row( children: [ DateFormat("MMMM-yyyy").format(DateFormat("MM/dd/yyyy").parse(paySlipList[selectedMonthIndex!].pAYMENTDATE!)).toText16(color: MyColors.greyACColor), @@ -137,8 +137,8 @@ class _MonthlyPaySlipScreenState extends State { ); }); }) - ], - ).paddingOnly(left: 21, right: 21), + ], + ).paddingOnly(left: 21, right: 21), ListView( padding: const EdgeInsets.all(21), children: [ diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index e74d21d..ab00560 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -41,8 +41,6 @@ class _BasicDetailsState extends State { getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); Utils.hideLoading(context); basicDetails(); - print("getEmployeeBasicDetailsList.length"); - print(getEmployeeBasicDetailsList.length); setState(() {}); } catch (ex) { Utils.hideLoading(context); @@ -50,7 +48,7 @@ class _BasicDetailsState extends State { } } - basicDetails() { + void basicDetails() { for (int i = 0; i < getEmployeeBasicDetailsList.length; i++) { if (getEmployeeBasicDetailsList[i].aPPLICATIONCOLUMNNAME == 'FULL_NAME') { fullName = getEmployeeBasicDetailsList[i].sEGMENTVALUEDSP; @@ -96,7 +94,7 @@ class _BasicDetailsState extends State { children: [ Container( width: double.infinity, - margin: EdgeInsets.only(top: 20, left: 21, right: 21,bottom: 20), + margin: EdgeInsets.only(top: 20, left: 21, right: 21, bottom: 20), padding: EdgeInsets.only(left: 14, right: 14, top: 13, bottom: 5), height: 280, decoration: BoxDecoration( @@ -135,7 +133,7 @@ class _BasicDetailsState extends State { )); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -150,7 +148,7 @@ class _BasicDetailsState extends State { ); } - showAlertDialog(BuildContext context) { + void showAlertDialog(BuildContext context) { dynamic changeOrNew = 1; Widget cancelButton = TextButton( child: Text("Cancel"), diff --git a/lib/ui/profile/contact_details.dart b/lib/ui/profile/contact_details.dart index d4927cf..514d3cc 100644 --- a/lib/ui/profile/contact_details.dart +++ b/lib/ui/profile/contact_details.dart @@ -3,12 +3,9 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/ui/profile/phone_numbers.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; @@ -212,7 +209,7 @@ class _ContactDetailsState extends State { ]))); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -228,7 +225,7 @@ class _ContactDetailsState extends State { ); } - updatePhone() { + void updatePhone() { Navigator.push( context, MaterialPageRoute(builder: (context) => PhoneNumbers(getEmployeePhonesList: this.getEmployeePhonesList)), diff --git a/lib/ui/profile/delete_familyMember.dart b/lib/ui/profile/delete_familyMember.dart index 4876ef3..a988881 100644 --- a/lib/ui/profile/delete_familyMember.dart +++ b/lib/ui/profile/delete_familyMember.dart @@ -1,23 +1,6 @@ - - -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; -import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/config/routes.dart'; -import 'package:mohem_flutter_app/dialogs/otp_dialog.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; -import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; -import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; -import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; -import 'package:mohem_flutter_app/widgets/button/default_button.dart'; class DeleteFamilyMember extends StatefulWidget { const DeleteFamilyMember({Key? key}) : super(key: key); @@ -30,44 +13,37 @@ class _DeleteFamilyMemberState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBarWidget( - context, - title: "Dependents And Beneficiaries", - ), + appBar: AppBarWidget( + context, + title: "Dependents And Beneficiaries", + ), backgroundColor: MyColors.backgroundColor, bottomSheet: footer(), - body:Column( - children: [ - - ], - ) - - ); + body: Column( + children: [], + )); } - footer() { + + Widget footer() { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( - color: MyColors.gradiantEndColor, - // margin: EdgeInsets.only(left: 50,right: 20), - padding: EdgeInsets.only(left: 50,right: 50), - child: TextButton( + color: MyColors.gradiantEndColor, + // margin: EdgeInsets.only(left: 50,right: 20), + padding: EdgeInsets.only(left: 50, right: 50), + child: TextButton( style: TextButton.styleFrom( - primary:MyColors.white, + primary: MyColors.white, onSurface: MyColors.white, backgroundColor: MyColors.gradiantEndColor, ), - onPressed: (){}, - child: Text('Next', - style: TextStyle( - fontStyle: FontStyle.normal, - fontSize: 16, - color: Colors.white, - fontWeight: FontWeight.w600 - ),), - ) - ), + onPressed: () {}, + child: Text( + 'Next', + style: TextStyle(fontStyle: FontStyle.normal, fontSize: 16, color: Colors.white, fontWeight: FontWeight.w600), + ), + )), ], ); } diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart index 3e25917..dc84bee 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart @@ -125,7 +125,7 @@ class _DynamicInputScreenState extends State { (getBasicDetDffStructureList == null && getBasicDetColsStructureList == null ? const SizedBox() : (getBasicDetDffStructureList!.isEmpty && getBasicDetColsStructureList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView( physics: const BouncingScrollPhysics(), padding: const EdgeInsets.all(21), diff --git a/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart index 5ba4109..ed35527 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_listview_screen.dart @@ -70,7 +70,7 @@ class _DynamicListViewScreenState extends State { body: getEITTransactionList == null ? const SizedBox() : (getEITTransactionList!.isEmpty - ? LocaleKeys.noDataAvailable.tr().toText16().center + ? Utils.getNoDataWidget(context) : ListView.separated( physics: const BouncingScrollPhysics(), padding: EdgeInsets.all(21), diff --git a/lib/ui/profile/family_members.dart b/lib/ui/profile/family_members.dart index bcc5b32..bf65fed 100644 --- a/lib/ui/profile/family_members.dart +++ b/lib/ui/profile/family_members.dart @@ -1,23 +1,13 @@ - - - - - import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; -import 'package:mohem_flutter_app/dialogs/otp_dialog.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_familyMembers_screen.dart'; -import 'package:mohem_flutter_app/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart'; import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -30,15 +20,14 @@ class FamilyMembers extends StatefulWidget { } class _FamilyMembersState extends State { - List getEmployeeContactsList = []; int? relationId; + @override void initState() { super.initState(); getEmployeeContacts(); - } void getEmployeeContacts() async { @@ -53,7 +42,6 @@ class _FamilyMembersState extends State { } } - Widget build(BuildContext context) { return Scaffold( appBar: AppBarWidget( @@ -61,154 +49,156 @@ class _FamilyMembersState extends State { title: LocaleKeys.profile_familyDetails.tr(), ), backgroundColor: MyColors.backgroundColor, - bottomSheet:footer(), + bottomSheet: footer(), body: Container( width: MediaQuery.of(context).size.width, - child: getEmployeeContactsList.length != 0 - ? SingleChildScrollView( - scrollDirection: Axis.vertical, - child: Column( - children: [ - ListView.builder( - scrollDirection: Axis.vertical, - shrinkWrap: true, - physics: ScrollPhysics(), - itemCount: getEmployeeContactsList.length, - itemBuilder: (context, index) { - return Container( - child: Column( - children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only(top: 20, left: 21, right: 21,), - padding: EdgeInsets.only(left: 14, right: 14,top: 13, ), - height: 110, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "${getEmployeeContactsList[index].cONTACTNAME}".toText16(color: MyColors.blackColor), - "${getEmployeeContactsList[index].rELATIONSHIP}".toText11(isBold: true, color: MyColors.textMixColor), - SizedBox(height: 5,), - Divider( - color: MyColors.lightGreyEFColor, - height: 20, - thickness: 1, - indent: 0, - endIndent: 0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Container( - child: InkWell( - onTap: () { - showUpdateAlertDialog(context); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Icon( - Icons.edit, - size: 15, - color: MyColors.grey67Color, - ), - ), - TextSpan( - text: LocaleKeys.update.tr(), - style: TextStyle( - color: MyColors.grey67Color, - fontSize: 12, - fontWeight: FontWeight.bold, - ), - ), - ], - ), - ), - ) + child: getEmployeeContactsList.length != 0 + ? SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + physics: ScrollPhysics(), + itemCount: getEmployeeContactsList.length, + itemBuilder: (context, index) { + return Container( + child: Column( + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 20, + left: 21, + right: 21, + ), + padding: EdgeInsets.only( + left: 14, + right: 14, + top: 13, ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: SizedBox( - child: Container( - width: 3, - color: MyColors.lightGreyEFColor, + height: 110, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), ), - ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), ), - Container( - child: InkWell( - onTap: () { - showRemoveAlertDialog(context, getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt()); - }, - child: RichText( - text: TextSpan( - children: [ - WidgetSpan( - child: Icon( - Icons.delete, - size: 15, - color: Color(0x99FF0000), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + "${getEmployeeContactsList[index].cONTACTNAME}".toText16(color: MyColors.blackColor), + "${getEmployeeContactsList[index].rELATIONSHIP}".toText11(isBold: true, color: MyColors.textMixColor), + SizedBox( + height: 5, + ), + Divider( + color: MyColors.lightGreyEFColor, + height: 20, + thickness: 1, + indent: 0, + endIndent: 0, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Container( + child: InkWell( + onTap: () { + showUpdateAlertDialog(context); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.edit, + size: 15, + color: MyColors.grey67Color, + ), ), - ), - TextSpan( - text:LocaleKeys.remove.tr(), - style: TextStyle( - color: MyColors.DarkRedColor, - fontSize: 12, - fontWeight: FontWeight.bold, + TextSpan( + text: LocaleKeys.update.tr(), + style: TextStyle( + color: MyColors.grey67Color, + fontSize: 12, + fontWeight: FontWeight.bold, + ), ), - ), - ], + ], + ), + ), + )), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: SizedBox( + child: Container( + width: 3, + color: MyColors.lightGreyEFColor, + ), ), ), - ) - ), - // ElevatedButton.icon( - // icon: Icon( - // Icons.delete, - // size: 15, - // color: Color(0x99FF0000), - // ), - // style: ElevatedButton.styleFrom( - // shadowColor: Colors.white, - // primary: Colors.white, - // ), - // label: "remove".toText12(color: MyColors.DarkRedColor), - // onPressed: (){}, - // ), - ], - ), - ] - ), - ), + Container( + child: InkWell( + onTap: () { + showRemoveAlertDialog(context, getEmployeeContactsList[index]!.cONTACTRELATIONSHIPID!.toInt()); + }, + child: RichText( + text: TextSpan( + children: [ + WidgetSpan( + child: Icon( + Icons.delete, + size: 15, + color: Color(0x99FF0000), + ), + ), + TextSpan( + text: LocaleKeys.remove.tr(), + style: TextStyle( + color: MyColors.DarkRedColor, + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + )), + // ElevatedButton.icon( + // icon: Icon( + // Icons.delete, + // size: 15, + // color: Color(0x99FF0000), + // ), + // style: ElevatedButton.styleFrom( + // shadowColor: Colors.white, + // primary: Colors.white, + // ), + // label: "remove".toText12(color: MyColors.DarkRedColor), + // onPressed: (){}, + // ), + ], + ), + ]), + ), + ], + )); + }) ], - ) - ); - }) - ], - ), - ):Container(), - // SizedBox(height: 20), - ) - - - ); + ), + ) + : Container(), + // SizedBox(height: 20), + )); } - footer(){ + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), @@ -224,21 +214,27 @@ class _FamilyMembersState extends State { ); } - showUpdateAlertDialog(BuildContext context) { + void showUpdateAlertDialog(BuildContext context) { Widget cancelButton = TextButton( - child: Text(LocaleKeys.cancel.tr(),), - onPressed: () { + child: Text( + LocaleKeys.cancel.tr(), + ), + onPressed: () { Navigator.pop(context); }, ); Widget continueButton = TextButton( - child: Text(LocaleKeys.ok.tr(),), - onPressed: () { + child: Text( + LocaleKeys.ok.tr(), + ), + onPressed: () { continueDynamicForms(); }, ); AlertDialog alert = AlertDialog( - title: Text(LocaleKeys.confirm.tr(),), + title: Text( + LocaleKeys.confirm.tr(), + ), content: Text("Are You Sure You Want to Update this Member?"), actions: [ cancelButton, @@ -252,22 +248,29 @@ class _FamilyMembersState extends State { }, ); } - showRemoveAlertDialog(BuildContext context,int relationId) { + + void showRemoveAlertDialog(BuildContext context, int relationId) { Widget cancelButton = TextButton( - child: Text(LocaleKeys.cancel.tr(),), - onPressed: () { + child: Text( + LocaleKeys.cancel.tr(), + ), + onPressed: () { Navigator.pop(context); }, ); Widget continueButton = TextButton( - child: Text(LocaleKeys.ok.tr(),), - onPressed: () { + child: Text( + LocaleKeys.ok.tr(), + ), + onPressed: () { Navigator.pushNamed(context, AppRoutes.deleteFamilyMember); - // continueDynamicForms(); + // continueDynamicForms(); }, ); AlertDialog alert = AlertDialog( - title: Text(LocaleKeys.confirm.tr(),), + title: Text( + LocaleKeys.confirm.tr(), + ), content: Text("Are You Sure You Want to Remove this Member?"), actions: [ cancelButton, @@ -282,10 +285,7 @@ class _FamilyMembersState extends State { ); } - void continueDynamicForms() { - Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, - arguments: DynamicFamilyMembersParams(LocaleKeys.profile_familyDetails.tr(), getEmployeeContactsList: getEmployeeContactsList)); + Navigator.pushNamed(context, AppRoutes.addDynamicInputProfile, arguments: DynamicFamilyMembersParams(LocaleKeys.profile_familyDetails.tr(), getEmployeeContactsList: getEmployeeContactsList)); } - } diff --git a/lib/ui/profile/personal_info.dart b/lib/ui/profile/personal_info.dart index 0ad9e2f..7a44004 100644 --- a/lib/ui/profile/personal_info.dart +++ b/lib/ui/profile/personal_info.dart @@ -6,7 +6,6 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; - import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; @@ -98,7 +97,7 @@ class _PesonalInfoState extends State { )); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), diff --git a/lib/ui/profile/phone_numbers.dart b/lib/ui/profile/phone_numbers.dart index cba17d5..0d19d07 100644 --- a/lib/ui/profile/phone_numbers.dart +++ b/lib/ui/profile/phone_numbers.dart @@ -3,15 +3,10 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; -import 'package:mohem_flutter_app/models/get_employee_address_model.dart'; -import 'package:mohem_flutter_app/models/get_employee_basic_details.model.dart'; import 'package:mohem_flutter_app/models/get_employee_phones_model.dart'; import 'package:mohem_flutter_app/models/profile/phone_number_types_modek.dart'; -import 'package:mohem_flutter_app/ui/profile/profile.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; @@ -27,6 +22,7 @@ class PhoneNumbers extends StatefulWidget { class _PhoneNumbersState extends State { List getPhoneNumberTypesList = []; + @override void initState() { super.initState(); @@ -42,117 +38,121 @@ class _PhoneNumbersState extends State { Widget build(BuildContext context) { return Scaffold( - appBar: AppBarWidget( - context, - title: LocaleKeys.profile_contactDetails.tr(), - ), - backgroundColor: MyColors.backgroundColor, - bottomSheet: footer(), - body: SingleChildScrollView( - child: Column(children: [ - Container( - width: double.infinity, - margin: EdgeInsets.only(left: 25, right: 25, top: 25), - padding: EdgeInsets.all(20), - // height: 400, - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Color.fromARGB(255, 209, 207, 207))), - child: InkWell( - child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon( - Icons.add, - color: Color(0xff259CB8), - ), - Text( - 'Add new row', - style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold), - ) - ]), - onTap: () { - addNewRow(); - }, + appBar: AppBarWidget( + context, + title: LocaleKeys.profile_contactDetails.tr(), + ), + backgroundColor: MyColors.backgroundColor, + bottomSheet: footer(), + body: SingleChildScrollView( + child: Column( + children: [ + Container( + width: double.infinity, + margin: EdgeInsets.only(left: 25, right: 25, top: 25), + padding: EdgeInsets.all(20), + // height: 400, + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.0), border: Border.all(color: Color.fromARGB(255, 209, 207, 207))), + child: InkWell( + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Icon( + Icons.add, + color: Color(0xff259CB8), + ), + Text( + 'Add new row', + style: TextStyle(color: Color(0xff259CB8), fontWeight: FontWeight.bold), + ) + ]), + onTap: () { + addNewRow(); + }, + ), ), - ), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: widget.getEmployeePhonesList - .map((e) => e.aCTION != 'DELETE_ROW' - ? Container( - width: double.infinity, - margin: EdgeInsets.only( - top: 20, - left: 26, - right: 26, - ), - padding: EdgeInsets.only(left: 14, right: 14, top: 15, bottom: 15), - // height: 400, - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.grey.withOpacity(0.5), - spreadRadius: 5, - blurRadius: 26, - offset: Offset(0, 3), - ), - ], - color: Colors.white, - borderRadius: BorderRadius.circular(10.0), - ), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - PopupMenuButton( - child: DynamicTextFieldWidget( - "Please Select *", - e.pHONETYPEMEANING ?? "", - isEnable: false, - isPopup: true, - ).paddingOnly(bottom: 12), - itemBuilder: (_) => >[ - for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i), - ], - onSelected: (int index) { - e.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING; - e.pHONETYPE = getPhoneNumberTypesList[index].cODE; - setState(() {}); - }), - DynamicTextFieldWidget( - "", - e.pHONENUMBER ?? "", - isReadOnly: false, - onChange: (text) { - e.pHONENUMBER = text; - }, - ).paddingOnly(bottom: 12), - InkWell( - child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ - Icon( - Icons.delete, - color: Colors.red, - size: 18, - ), - Text( - 'Delete', - style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), - ) - ]), - onTap: () { - // widget.getEmployeePhonesList.removeWhere((item) => item.pHONEID == e.pHONEID); - setState(() { - deleteRow(e); - }); - }, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: widget.getEmployeePhonesList + .map((e) => e.aCTION != 'DELETE_ROW' + ? Container( + width: double.infinity, + margin: EdgeInsets.only( + top: 20, + left: 26, + right: 26, ), - SizedBox( - height: 10, + padding: EdgeInsets.only(left: 14, right: 14, top: 15, bottom: 15), + // height: 400, + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 5, + blurRadius: 26, + offset: Offset(0, 3), + ), + ], + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), ), - ])) - : Container()) - .toList()), - SizedBox( - height: 80, - ) - ]))); + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + PopupMenuButton( + child: DynamicTextFieldWidget( + "Please Select *", + e.pHONETYPEMEANING ?? "", + isEnable: false, + isPopup: true, + ).paddingOnly(bottom: 12), + itemBuilder: (_) => >[ + for (int i = 0; i < getPhoneNumberTypesList.length; i++) PopupMenuItem(child: Text(getPhoneNumberTypesList![i].mEANING!), value: i), + ], + onSelected: (int index) { + e.pHONETYPEMEANING = getPhoneNumberTypesList[index].mEANING; + e.pHONETYPE = getPhoneNumberTypesList[index].cODE; + setState(() {}); + }), + DynamicTextFieldWidget( + "", + e.pHONENUMBER ?? "", + isReadOnly: false, + onChange: (text) { + e.pHONENUMBER = text; + }, + ).paddingOnly(bottom: 12), + InkWell( + child: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ + Icon( + Icons.delete, + color: Colors.red, + size: 18, + ), + Text( + 'Delete', + style: TextStyle(color: Colors.red, fontWeight: FontWeight.bold), + ) + ]), + onTap: () { + // widget.getEmployeePhonesList.removeWhere((item) => item.pHONEID == e.pHONEID); + setState(() { + deleteRow(e); + }); + }, + ), + SizedBox( + height: 10, + ), + ])) + : Container()) + .toList()), + SizedBox( + height: 80, + ) + ], + ), + ), + ); } - footer() { + Widget footer() { return Container( decoration: BoxDecoration( // borderRadius: BorderRadius.circular(10), diff --git a/lib/ui/profile/profile.dart b/lib/ui/profile/profile.dart index 6cbf953..46fe7ea 100644 --- a/lib/ui/profile/profile.dart +++ b/lib/ui/profile/profile.dart @@ -1,13 +1,10 @@ -import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/profile_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/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/models/get_employee_basic_details.model.dart'; -import 'package:mohem_flutter_app/models/get_employee_contacts.model.dart'; class Profile extends StatefulWidget { const Profile({Key? key}) : super(key: key); @@ -16,6 +13,7 @@ class Profile extends StatefulWidget { _ProfileState createState() => _ProfileState(); } +// todo '@fatima' use extension methods for widgets,7 dont use hard code strings, make it localize class _ProfileState extends State { String? fullName = ""; String? maritalStatus = ""; @@ -39,8 +37,6 @@ class _ProfileState extends State { getEmployeeBasicDetailsList = await ProfileApiClient().getEmployeeBasicDetails(); Utils.hideLoading(context); basicDetails(); - print("getEmployeeBasicDetailsList.length"); - print(getEmployeeBasicDetailsList.length); setState(() {}); } catch (ex) { Utils.hideLoading(context); @@ -48,7 +44,7 @@ class _ProfileState extends State { } } - basicDetails() { + void basicDetails() { for (int i = 0; i < getEmployeeBasicDetailsList.length; i++) { if (getEmployeeBasicDetailsList[i].aPPLICATIONCOLUMNNAME == 'FULL_NAME') { fullName = getEmployeeBasicDetailsList[i].sEGMENTVALUEDSP; @@ -116,8 +112,7 @@ class _ProfileState extends State { ], ), ), - ) - ), + )), ), Container( width: double.infinity, @@ -142,19 +137,15 @@ class _ProfileState extends State { indent: 0, endIndent: 0, ), - Container( padding: EdgeInsets.only(left: 10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 15, ), @@ -166,12 +157,9 @@ class _ProfileState extends State { height: 5, ), InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 15, ), @@ -183,12 +171,9 @@ class _ProfileState extends State { height: 5, ), InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 20, ), @@ -200,12 +185,9 @@ class _ProfileState extends State { height: 5, ), InkWell( - onTap: () { - - }, + onTap: () {}, child: Row( children: [ - SizedBox( width: 20, ), @@ -220,7 +202,7 @@ class _ProfileState extends State { ), ), ], - ).paddingOnly( top: 35, bottom: 36), + ).paddingOnly(top: 35, bottom: 36), ), Align( alignment: Alignment.topCenter, diff --git a/lib/ui/screens/announcements/announcement_details.dart b/lib/ui/screens/announcements/announcement_details.dart index 9ff6c36..6909be5 100644 --- a/lib/ui/screens/announcements/announcement_details.dart +++ b/lib/ui/screens/announcements/announcement_details.dart @@ -79,7 +79,7 @@ class _AnnouncementDetailsState extends State { ); } - getRequestID() { + void getRequestID() { if (currentPageNo == 0) { final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map; currentPageNo = arguments["currentPageNo"]; diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart index 6dd0f0d..f3ae4f8 100644 --- a/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_home.dart @@ -9,10 +9,9 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_tickets_list.dart'; +import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; -import '../../../widgets/app_bar_widget.dart'; - class MowadhafhiHome extends StatefulWidget { const MowadhafhiHome({Key? key}) : super(key: key); @@ -32,93 +31,92 @@ class _MowadhafhiHomeState extends State { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.white, - appBar: AppBarWidget( - context, - title: "Mowadhafhi Request", - ), - body: Container( - margin: const EdgeInsets.only(top: 10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Expanded( - child: ListView.separated( - physics: const BouncingScrollPhysics(), - shrinkWrap: true, - itemBuilder: (BuildContext context, int index) { - return InkWell( - onTap: () { - openRequestDetails(getTicketsByEmployeeList[index].ticketId!); - }, - child: Container( - width: double.infinity, - // height: 100.0, - padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), - margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(10), - boxShadow: [ - BoxShadow( - color: const Color(0xff000000).withOpacity(.05), - blurRadius: 26, - offset: const Offset(0, -3), - ), - ], - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - getTicketsByEmployeeList[index].ticketTypeName!.toText14(color: MyColors.grey57Color), - getTicketsByEmployeeList[index].created!.split(" ")[0].toText12(color: MyColors.grey70Color), - ], - ), - Container( - padding: const EdgeInsets.only(top: 10.0), - child: getTicketsByEmployeeList[index].description!.toText12(color: MyColors.grey57Color), - ), - Container( - padding: const EdgeInsets.only(top: 10.0), - child: Row( + backgroundColor: Colors.white, + appBar: AppBarWidget( + context, + title: "Mowadhafhi Request", + ), + body: Container( + margin: const EdgeInsets.only(top: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () { + openRequestDetails(getTicketsByEmployeeList[index].ticketId!); + }, + child: Container( + width: double.infinity, + // height: 100.0, + padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: const Color(0xff000000).withOpacity(.05), + blurRadius: 26, + offset: const Offset(0, -3), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - getTicketsByEmployeeList[index].ticketStatusInternalName!.toText14(color: MyColors.gradiantEndColor), - SvgPicture.asset( - "assets/images/arrow_next.svg", - color: MyColors.darkIconColor, - ) + getTicketsByEmployeeList[index].ticketTypeName!.toText14(color: MyColors.grey57Color), + getTicketsByEmployeeList[index].created!.split(" ")[0].toText12(color: MyColors.grey70Color), ], ), - ), - ], + Container( + padding: const EdgeInsets.only(top: 10.0), + child: getTicketsByEmployeeList[index].description!.toText12(color: MyColors.grey57Color), + ), + Container( + padding: const EdgeInsets.only(top: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + getTicketsByEmployeeList[index].ticketStatusInternalName!.toText14(color: MyColors.gradiantEndColor), + SvgPicture.asset( + "assets/images/arrow_next.svg", + color: MyColors.darkIconColor, + ) + ], + ), + ), + ], + ), ), - ), - ); - }, - separatorBuilder: (BuildContext context, int index) => 12.height, - itemCount: getTicketsByEmployeeList.length ?? 0)), - 80.height - ], - ), - ), - bottomSheet: Container( - decoration: const BoxDecoration( - color: MyColors.white, - boxShadow: [ - BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), - ], + ); + }, + separatorBuilder: (BuildContext context, int index) => 12.height, + itemCount: getTicketsByEmployeeList.length ?? 0)), + 80.height + ], + ), ), - child: DefaultButton(LocaleKeys.createRequest.tr(), () async { - openHRRequest(); - }).insideContainer, - ) - ); + bottomSheet: Container( + decoration: const BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow(color: MyColors.lightGreyEFColor, spreadRadius: 3), + ], + ), + child: DefaultButton(LocaleKeys.createRequest.tr(), () async { + openHRRequest(); + }).insideContainer, + )); } void openRequestDetails(String itgTicketID) async { diff --git a/lib/ui/screens/mowadhafhi/request_details.dart b/lib/ui/screens/mowadhafhi/request_details.dart index ec7db4b..9426929 100644 --- a/lib/ui/screens/mowadhafhi/request_details.dart +++ b/lib/ui/screens/mowadhafhi/request_details.dart @@ -26,7 +26,7 @@ class _RequestDetailsState extends State { super.initState(); } - getRequestID() { + void getRequestID() { if (itgTicketID == null) { itgTicketID = ModalRoute.of(context)?.settings.arguments as String; debugPrint(itgTicketID); diff --git a/lib/ui/screens/pending_transactions/pending_transactions_details.dart b/lib/ui/screens/pending_transactions/pending_transactions_details.dart index 931ba50..1877c5b 100644 --- a/lib/ui/screens/pending_transactions/pending_transactions_details.dart +++ b/lib/ui/screens/pending_transactions/pending_transactions_details.dart @@ -26,7 +26,7 @@ class _PendingTransactionsDetailsState extends State super.initState(); } - getFunctionID() { + void getFunctionID() { if (functionID == "") { final arguments = (ModalRoute.of(context)?.settings.arguments ?? {}) as Map; functionID = arguments["selectedFunctionID"].toString(); diff --git a/lib/ui/screens/profile/profile_screen.dart b/lib/ui/screens/profile/profile_screen.dart index 89d4ba6..73638aa 100644 --- a/lib/ui/screens/profile/profile_screen.dart +++ b/lib/ui/screens/profile/profile_screen.dart @@ -1,5 +1,6 @@ -import 'dart:ui'; import 'dart:convert'; +import 'dart:ui'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; @@ -90,7 +91,7 @@ class _ProfileScreenState extends State { ])); } - startImageSheet() { + void startImageSheet() { showMyBottomSheet(context, child: Column( children: [ diff --git a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart index c09b62e..027d8ca 100644 --- a/lib/ui/work_list/itg_fragments/approval_level_fragment.dart +++ b/lib/ui/work_list/itg_fragments/approval_level_fragment.dart @@ -6,7 +6,6 @@ import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/itg_forms_models/wf_history_model.dart'; -import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/request_more_info_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index 4ce032c..1923c27 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -5,8 +5,12 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/models/generic_response_model.dart'; +import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/search_options_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/selected_item_sheet.dart'; @@ -14,19 +18,13 @@ import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; -import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; - -import '../../../models/generic_response_model.dart'; -import '../../../models/get_action_history_list_model.dart'; -import '../../../models/worklist/get_favorite_replacements_model.dart'; class DelegateSheet extends StatefulWidget { int? notificationID; - String title,apiMode; + String title, apiMode; List? actionHistoryList; - DelegateSheet({required this.title,required this.apiMode,this.notificationID, this.actionHistoryList}); + DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList}); @override State createState() => _DelegateSheetState(); @@ -69,7 +67,7 @@ class _DelegateSheetState extends State { return null; } - fetchChangeFav({required String email, required String employeName, required String image, required String userName, bool isFav = false, bool isNeedToRefresh = false}) async { + void fetchChangeFav({required String email, required String employeName, required String image, required String userName, bool isFav = false, bool isNeedToRefresh = false}) async { Utils.showLoading(context); favLetters = null; selectedFavLetter = null; diff --git a/lib/ui/work_list/sheets/search_options_sheet.dart b/lib/ui/work_list/sheets/search_options_sheet.dart index d773d62..9b794bb 100644 --- a/lib/ui/work_list/sheets/search_options_sheet.dart +++ b/lib/ui/work_list/sheets/search_options_sheet.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; - -import '../../../classes/colors.dart'; -import '../../../widgets/radio/show_radio.dart'; +import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; class SearchOptionsSheet extends StatelessWidget { String selectedType; diff --git a/lib/ui/work_list/sheets/selected_item_sheet.dart b/lib/ui/work_list/sheets/selected_item_sheet.dart index 3c9af9b..aadec34 100644 --- a/lib/ui/work_list/sheets/selected_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_item_sheet.dart @@ -1,19 +1,15 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart'; +import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/circular_avatar.dart'; import 'package:mohem_flutter_app/widgets/input_widget.dart'; -import 'package:mohem_flutter_app/widgets/radio/show_radio.dart'; -import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; - -import '../../../app_state/app_state.dart'; -import '../../../classes/utils.dart'; -import '../../../models/get_action_history_list_model.dart'; -import '../../../models/worklist/get_favorite_replacements_model.dart'; -import '../../../models/worklist/replacement_list_model.dart'; class SelectedItemSheet extends StatelessWidget { String title, apiMode; @@ -115,13 +111,13 @@ class SelectedItemSheet extends StatelessWidget { Future performNetworkCall(BuildContext context, {String? email, String? userId}) async { Utils.showLoading(context); - try{ + try { await WorkListApiClient().submitComment(comment: comment, email: email, userId: userId, notificationId: notificationID, apiMode: apiMode); Utils.hideLoading(context); Navigator.pop(context); Navigator.pop(context); Navigator.pop(context, "delegate_reload"); - }catch (ex) { + } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); } diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 176cb41..1166d83 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -23,6 +23,10 @@ import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_mod import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/member_information_list_model.dart'; import 'package:mohem_flutter_app/models/notification_get_respond_attributes_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'package:mohem_flutter_app/ui/work_list/sheets/delegate_sheet.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/actions_fragment.dart'; @@ -31,15 +35,10 @@ import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/detail_fragmen import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/info_fragments.dart'; import 'package:mohem_flutter_app/ui/work_list/worklist_fragments/request_fragment.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; +import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/dialogs/accept_reject_input_dialog.dart'; - -import '../../models/worklist/hr/eit_otification_body_model.dart'; -import '../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; -import '../../models/worklist/hr/get_contact_notification_body_list_model.dart'; -import '../../models/worklist/hr/get_phones_notification_body_list_model.dart'; -import '../../widgets/bottom_sheet.dart'; -import '../../widgets/dialogs/confirm_dialog.dart'; +import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; class WorkListDetailScreen extends StatefulWidget { WorkListDetailScreen({Key? key}) : super(key: key); diff --git a/lib/ui/work_list/worklist_fragments/info_fragments.dart b/lib/ui/work_list/worklist_fragments/info_fragments.dart index 5156a33..bc47989 100644 --- a/lib/ui/work_list/worklist_fragments/info_fragments.dart +++ b/lib/ui/work_list/worklist_fragments/info_fragments.dart @@ -1,6 +1,5 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/classes/date_uitl.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -11,14 +10,13 @@ import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.d import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ns_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/eit_otification_body_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_contact_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/worklist/hr/get_phones_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; -import '../../../models/worklist/hr/eit_otification_body_model.dart'; -import '../../../models/worklist/hr/get_basic_det_ntf_body_list_model.dart'; -import '../../../models/worklist/hr/get_contact_notification_body_list_model.dart'; -import '../../../models/worklist/hr/get_phones_notification_body_list_model.dart'; - class InfoFragment extends StatelessWidget { WorkListResponseModel? workListData; List poHeaderList; diff --git a/lib/widgets/Updater.dart b/lib/widgets/Updater.dart index 154173d..82cc172 100644 --- a/lib/widgets/Updater.dart +++ b/lib/widgets/Updater.dart @@ -28,7 +28,7 @@ class Updater extends StatelessWidget{ }); } - pushData(T? data) { + void pushData(T? data) { _history.add(data); sink?.sink.add(data); } diff --git a/lib/widgets/bottom_sheet.dart b/lib/widgets/bottom_sheet.dart index f0bf3f8..d151afc 100644 --- a/lib/widgets/bottom_sheet.dart +++ b/lib/widgets/bottom_sheet.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -showMyBottomSheet(BuildContext context, {required Widget child}) { +void showMyBottomSheet(BuildContext context, {required Widget child}) { showModalBottomSheet( context: context, isScrollControlled: true, diff --git a/lib/widgets/circular_step_progress_bar.dart b/lib/widgets/circular_step_progress_bar.dart index 75724c8..6789aed 100644 --- a/lib/widgets/circular_step_progress_bar.dart +++ b/lib/widgets/circular_step_progress_bar.dart @@ -502,7 +502,7 @@ class _CircularIndicatorPainter implements CustomPainter { void removeListener(listener) {} @override - get semanticsBuilder => null; + Null get semanticsBuilder => null; @override bool shouldRebuildSemantics(CustomPainter oldDelegate) => false; diff --git a/lib/widgets/location/Location.dart b/lib/widgets/location/Location.dart index bd39e2e..8456fd2 100644 --- a/lib/widgets/location/Location.dart +++ b/lib/widgets/location/Location.dart @@ -1,23 +1,22 @@ import 'dart:async'; import 'dart:math'; import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_directions_api/google_directions_api.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:mohem_flutter_app/classes/app_permissions.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/theme/colors.dart'; // import 'package:geodesy/geodesy.dart' as geodesy; -import '../../classes/app_permissions.dart'; -import '../../theme/colors.dart'; - - //Created By Mr.Zohaib class Location { static _Map map = _Map(); - static havePermission(Function(bool) callback) { + static void havePermission(Function(bool) callback) { Geolocator.checkPermission().then((value) async { if (value == LocationPermission.denied) { value = await Geolocator.requestPermission(); @@ -28,13 +27,13 @@ class Location { }); } - static isEnabled(Function(bool) callback) { + static void isEnabled(Function(bool) callback) { Geolocator.isLocationServiceEnabled().then((value) => callback(value)); } static bool _listeningSettingChange = true; - static listenGPS({bool change = true, Function(bool)? onChange}) async { + static void listenGPS({bool change = true, Function(bool)? onChange}) async { _listeningSettingChange = change; if (change == false) return; @@ -46,8 +45,8 @@ class Location { }); } - static getCurrentLocation(Function(LatLng?) callback) { - done(Position position) { + static void getCurrentLocation(Function(LatLng?) callback) { + void done(Position position) { //AppStorage.sp.saveLocation(position); LatLng? myCurrentLocation = LatLng(position.latitude, position.longitude); @@ -55,8 +54,7 @@ class Location { } AppPermissions.location((granted) { - - if (granted) + if (granted) { Geolocator.getLastKnownPosition(forceAndroidLocationManager: true).then((value) { if (value == null) { Geolocator.getCurrentPosition().then((value) { @@ -66,6 +64,7 @@ class Location { done(value); } }); + } }); } @@ -125,20 +124,20 @@ class _Map { return camera; } - moveCamera(CameraPosition camera, @required Completer mapController, bool animation) { + void moveCamera(CameraPosition camera, @required Completer mapController, bool animation) { mapController.future.then((controller) { animation ? controller.animateCamera(CameraUpdate.newCameraPosition(camera)) : controller.moveCamera(CameraUpdate.newCameraPosition(camera)); }); } - scrollBy({double x = 0, double y = 0, required Completer mapController, bool animation = true}) { + void scrollBy({double x = 0, double y = 0, required Completer mapController, bool animation = true}) { var camera = CameraUpdate.scrollBy(x, y); mapController.future.then((controller) { animation ? controller.animateCamera(camera) : controller.moveCamera(camera); }); } - goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) { + void goToCurrentLocation({Completer? mapController, double? direction = 0.0, bool? animation}) { Location.getCurrentLocation((location) { moveTo(location!, zoom: 17, mapController: mapController!, animation: animation, direction: direction!); }); @@ -146,7 +145,7 @@ class _Map { var routes = Map(); - setRoutePolylines(LatLng? source, LatLng? destination, Set polylines, Completer mapController, Function(DirectionsRoute?) completion) { + void setRoutePolylines(LatLng? source, LatLng? destination, Set polylines, Completer mapController, Function(DirectionsRoute?) completion) { if (source == null || destination == null) { completion(null); return; @@ -156,7 +155,7 @@ class _Map { var destin = '${destination.latitude},${destination.longitude}'; var routeId = '$origin->$destination'; - createPolyline(DirectionsRoute results) { + void createPolyline(DirectionsRoute results) { List polylineCoordinates = results.overviewPath!.map((e) => LatLng(e.latitude, e.longitude)).toList(); PolylineId id = PolylineId("route"); Polyline polyline = Polyline( @@ -221,7 +220,7 @@ class _Map { return LatLngBounds(northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!)); } - focusCameraToLatLngBounds({LatLngBounds? bound, Completer? mapController, double? padding}) async { + void focusCameraToLatLngBounds({LatLngBounds? bound, Completer? mapController, double? padding}) async { if (bound == null) return; CameraUpdate camera = CameraUpdate.newLatLngBounds(bound, padding!); @@ -229,7 +228,7 @@ class _Map { controller.animateCamera(camera); } - focusCameraTo2Points({LatLng? point1, LatLng? point2, Completer? mapController, double? padding}) async { + void focusCameraTo2Points({LatLng? point1, LatLng? point2, Completer? mapController, double? padding}) async { var source = point1; var destination = point2; if (source != null && destination != null) { diff --git a/lib/widgets/otp_widget.dart b/lib/widgets/otp_widget.dart index a489e61..e90308d 100644 --- a/lib/widgets/otp_widget.dart +++ b/lib/widgets/otp_widget.dart @@ -108,7 +108,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi } } - _calculateStrList() { + void calculateStrList() { if (strList.length > widget.maxLength) { strList.length = widget.maxLength; } @@ -123,7 +123,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi focusNode = widget.focusNode ?? FocusNode(); _initTextController(); - _calculateStrList(); + calculateStrList(); widget.controller?.addListener(_controllerListener); focusNode?.addListener(_focusListener); } @@ -291,7 +291,7 @@ class OTPWidgetState extends State with SingleTickerProviderStateMixi } Widget _pinBoxRow(BuildContext context) { - _calculateStrList(); + calculateStrList(); List pinCodes = List.generate(widget.maxLength, (int i) { return _buildPinCode(i, context); }); From 2f013ba1ad16b21caa0b637970d6371581fb5b7b Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 29 Jun 2022 11:05:24 +0300 Subject: [PATCH 22/22] lint rules added. --- analysis_options.yaml | 10 +++++++++- lib/api/api_client.dart | 1 + lib/classes/utils.dart | 4 +--- lib/ui/attendance/monthly_attendance.dart | 8 ++++---- .../dynamic_screens/dynamic_input_screen.dart | 4 ++-- lib/ui/profile/basic_details.dart | 8 ++++---- .../dynamic_screens/dynamic_input_profile_screen.dart | 7 ++----- lib/ui/profile/profile.dart | 6 +++--- lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart | 3 +-- .../pending_transactions/pending_transactions.dart | 2 +- lib/ui/work_list/worklist_detail_screen.dart | 2 +- 11 files changed, 29 insertions(+), 26 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index fa4efae..a84033c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -14,6 +14,10 @@ analyzer: always_use_package_imports: error camel_case_types: error always_declare_return_types: error + null_check_on_nullable_type_parameter: error + avoid_annotating_with_dynamic: error + unnecessary_null_checks: error + unnecessary_brace_in_string_interps: error linter: @@ -36,11 +40,15 @@ linter: unnecessary_this: true unnecessary_new: true camel_case_types: true + null_check_on_nullable_type_parameter: true sort_child_properties_last: true - camel_case_extensions : true + camel_case_extensions: true require_trailing_commas: true avoid_empty_else: true avoid_annotating_with_dynamic: true + unnecessary_null_checks: true + unnecessary_brace_in_string_interps: true + unnecessary_string_interpolations: true # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index f4d5f30..2f53f78 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -8,6 +8,7 @@ import 'package:http/io_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; import 'package:mohem_flutter_app/main.dart'; +// ignore_for_file: avoid_annotating_with_dynamic typedef FactoryConstructor = U Function(dynamic); diff --git a/lib/classes/utils.dart b/lib/classes/utils.dart index 424d656..292bc4c 100644 --- a/lib/classes/utils.dart +++ b/lib/classes/utils.dart @@ -8,8 +8,6 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; - -// import 'package:fluttertoast/fluttertoast.dart'; import 'package:mohem_flutter_app/exceptions/api_exception.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; @@ -18,7 +16,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/loading_dialog.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:sizer/sizer.dart'; +// ignore_for_file: avoid_annotating_with_dynamic class Utils { static bool _isLoadingVisible = false; diff --git a/lib/ui/attendance/monthly_attendance.dart b/lib/ui/attendance/monthly_attendance.dart index 70afd40..de5c9c9 100644 --- a/lib/ui/attendance/monthly_attendance.dart +++ b/lib/ui/attendance/monthly_attendance.dart @@ -327,7 +327,7 @@ class _MonthlyAttendanceState extends State { ), alignment: Alignment.center, child: Text( - "${val}", + "$val", style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w500, @@ -358,7 +358,7 @@ class _MonthlyAttendanceState extends State { ), alignment: Alignment.center, child: Text( - "${val}", + "$val", style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w500, @@ -384,7 +384,7 @@ class _MonthlyAttendanceState extends State { ), alignment: Alignment.center, child: Text( - "${val}", + "$val", style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w500, @@ -408,7 +408,7 @@ class _MonthlyAttendanceState extends State { ), alignment: Alignment.center, child: Text( - "${val}", + "$val", style: const TextStyle( fontSize: 13, fontWeight: FontWeight.w500, 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 96c1a02..ef75031 100644 --- a/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart +++ b/lib/ui/my_attendance/dynamic_screens/dynamic_input_screen.dart @@ -125,7 +125,7 @@ class _DynamicInputScreenState extends State { Utils.showLoading(context); for (int i = 0; i < (structureList.cHILDSEGMENTSDVSplited?.length ?? 0); i++) { String segmentId = structureList.cHILDSEGMENTSDVSplited![i]; - print("segmentId:${segmentId}"); + print("segmentId:$segmentId"); print("segmentName:${structureList.sEGMENTNAME}"); GetEITDFFStructureList? parent = getEitDffStructureList!.firstWhere((element) => element.sEGMENTNAME == segmentId); List parentRequired = parent.pARENTSEGMENTSDVSplited ?? []; @@ -139,7 +139,7 @@ class _DynamicInputScreenState extends State { sEGMENTNAME: e.sEGMENTNAME, vALUECOLUMNNAME: e.eSERVICESDV!.pVALUECOLUMNNAME, dESCRIPTION: "", iDCOLUMNNAME: e.eSERVICESDV!.pIDCOLUMNNAME, fLEXVALUESETNAME: e.fLEXVALUESETNAME) .toJson()) .toList(); - print("values:${values}"); + print("values:$values"); ESERVICESDV defaultValue = await MyAttendanceApiClient().getDefaultValue(segmentId, structureList.dESCFLEXCONTEXTCODE!, structureList.dESCFLEXNAME!, values); int index = getEitDffStructureList!.indexWhere((element) => element.sEGMENTNAME == segmentId); diff --git a/lib/ui/profile/basic_details.dart b/lib/ui/profile/basic_details.dart index ab00560..d825c2b 100644 --- a/lib/ui/profile/basic_details.dart +++ b/lib/ui/profile/basic_details.dart @@ -111,22 +111,22 @@ class _BasicDetailsState extends State { ), child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.fullName.tr().toText13(color: MyColors.lightGrayColor), - "${fullName}".toText16(isBold: true, color: MyColors.blackColor), + "$fullName".toText16(isBold: true, color: MyColors.blackColor), SizedBox( height: 20, ), LocaleKeys.maritalStatus.tr().toText13(color: MyColors.lightGrayColor), - "${maritalStatus}".toText16(isBold: true, color: MyColors.blackColor), + "$maritalStatus".toText16(isBold: true, color: MyColors.blackColor), SizedBox( height: 20, ), LocaleKeys.dateOfBirth.tr().toText13(color: MyColors.lightGrayColor), - "${birthDate}".toText16(isBold: true, color: MyColors.blackColor), + "$birthDate".toText16(isBold: true, color: MyColors.blackColor), SizedBox( height: 20, ), LocaleKeys.civilIdentityNumber.tr().toText13(color: MyColors.lightGrayColor), - "${civilIdentityNumber}".toText16(isBold: true, color: MyColors.blackColor), + "$civilIdentityNumber".toText16(isBold: true, color: MyColors.blackColor), ]), ), ], diff --git a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart index dc84bee..6fe8046 100644 --- a/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart +++ b/lib/ui/profile/dynamic_screens/dynamic_input_profile_screen.dart @@ -1,6 +1,5 @@ import 'dart:io'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -31,7 +30,6 @@ class DynamicProfileParams { String colsURL; List? getEmployeeBasicDetailsList; - DynamicProfileParams(this.title, this.dynamicId, {this.uRL = 'GET_EIT_DFF_STRUCTURE', this.requestID = '', this.colsURL = '', this.getEmployeeBasicDetailsList = const []}); } @@ -183,7 +181,7 @@ class _DynamicInputScreenState extends State { for (int i = 0; i < model.eSERVICESVS!.length; i++) PopupMenuItem(child: Text(model.eSERVICESVS![i].vALUECOLUMNNAME!), value: i), ], onSelected: (int popupIndex) { - getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.eSERVICESVS![popupIndex].vALUECOLUMNNAME!; + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.eSERVICESVS![popupIndex].vALUECOLUMNNAME; setState(() {}); }); } @@ -194,7 +192,6 @@ class _DynamicInputScreenState extends State { isReadOnly: model.rEADONLY == "Y", onChange: (text) { getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = text; - }, ).paddingOnly(bottom: 12); } else if (model.fORMATTYPE == "X") { @@ -249,7 +246,7 @@ class _DynamicInputScreenState extends State { onSelected: (int popupIndex) { ESERVICESDV eservicesdv = ESERVICESDV(pIDCOLUMNNAME: model.objectValuesList![index].dESCRIPTION, pRETURNMSG: "null", pRETURNSTATUS: model.oBJECTNAME, pVALUECOLUMNNAME: model.aPPLICATIONCOLUMNNAME); - getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.objectValuesList![popupIndex].dESCRIPTION!; + getBasicDetDffStructureList![index].userBasicDetail!.sEGMENTVALUEDSP = model.objectValuesList![popupIndex].dESCRIPTION; setState(() {}); }); } diff --git a/lib/ui/profile/profile.dart b/lib/ui/profile/profile.dart index 46fe7ea..22d062b 100644 --- a/lib/ui/profile/profile.dart +++ b/lib/ui/profile/profile.dart @@ -124,9 +124,9 @@ class _ProfileState extends State { ), child: Column( children: [ - "${fullName}".toText20(isBold: true, color: MyColors.blackColor), - "${employeeNo}".toText12(isBold: false, color: MyColors.lightGrayColor), - "${emailAddress}".toText12(isBold: false, color: MyColors.black), + "$fullName".toText20(isBold: true, color: MyColors.blackColor), + "$employeeNo".toText12(isBold: false, color: MyColors.lightGrayColor), + "$emailAddress".toText12(isBold: false, color: MyColors.black), SizedBox( height: 5, ), diff --git a/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart index 6ed9cb5..4ee819d 100644 --- a/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart +++ b/lib/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart @@ -95,7 +95,6 @@ class _MowadhafhiHRRequestState extends State { groupValue: selectedServiceType, selectedColor: MyColors.gradiantStartColor), ).onPress(() { - debugPrint(getTicketTypesList[index].typeName!); selectedServiceType = getTicketTypesList[index].ticketTypeId!.toString(); setState(() {}); }); @@ -314,7 +313,7 @@ class _MowadhafhiHRRequestState extends State { getMowadhafhiProjectsList = await MowadhafhiApiClient().getProjects(); Utils.hideLoading(context); getProjectDepartments(getMowadhafhiProjectsList[0].projectId!); - projectID = getMowadhafhiProjectsList[0].projectId!; + projectID = getMowadhafhiProjectsList[0].projectId; } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); diff --git a/lib/ui/screens/pending_transactions/pending_transactions.dart b/lib/ui/screens/pending_transactions/pending_transactions.dart index e074ad7..98d7fe3 100644 --- a/lib/ui/screens/pending_transactions/pending_transactions.dart +++ b/lib/ui/screens/pending_transactions/pending_transactions.dart @@ -76,7 +76,7 @@ class _PendingTransactionsState extends State { for (int i = 0; i < getPendingTransactionsFunctions!.length; i++) PopupMenuItem(child: Text(getPendingTransactionsFunctions![i].fUNCTIONPROMPT!), value: i), ], onSelected: (int popupIndex) { - selectedFunction = getPendingTransactionsFunctions![popupIndex]; + selectedFunction = getPendingTransactionsFunctions[popupIndex]; setState(() {}); }), 12.height, diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 1166d83..6ad0a79 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -485,7 +485,7 @@ class _WorkListDetailScreenState extends State { "P_APPROVER_INDEX": null, "P_COMMENTS": "", "P_FORWARD_TO_USER_NAME": "", - "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID!, + "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID, "RespondAttributeList": [ if (notificationNoteInput != null) {notificationNoteInput!.attributeName: note} ],