From 427c5fb5b66ac9e41e8cee0a5f8c453c3fea1c39 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 21 Jun 2022 14:55:26 +0300 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 5/8] 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 6/8] 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 7/8] 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 8/8] 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} ],