diff --git a/lib/api/worklist/worklist_api_client.dart b/lib/api/worklist/worklist_api_client.dart index 8c5aed2..1bd8ec9 100644 --- a/lib/api/worklist/worklist_api_client.dart +++ b/lib/api/worklist/worklist_api_client.dart @@ -14,6 +14,7 @@ import 'package:mohem_flutter_app/models/get_mo_notification_body_list_model.dar 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'; +import 'package:mohem_flutter_app/models/get_pr_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_quotation_analysis_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'; @@ -235,6 +236,21 @@ class WorkListApiClient { }, url, postParams); } + Future getPRNotificationBody(int pNotificationID, int pTransactionID) async { + String url = "${ApiConsts.erpRest}GET_PR_NOTIFICATION_BODY"; + Map postParams = { + "P_NOTIFICATION_ID": pNotificationID, + "P_TRANSACTION_ID": pTransactionID, + "P_PAGE_LIMIT": 100, + "P_PAGE_NUM": 1, + }; + postParams.addAll(AppState().postParamsJson); + return await ApiClient().postJsonForObject((json) { + GenericResponseModel responseData = GenericResponseModel.fromJson(json); + return responseData.getPrNotificationBodyList; + }, url, postParams); + } + Future> getMoItemHistory(int pItemID, int pOrgID) async { String url = "${ApiConsts.erpRest}GET_MO_ITEM_HISTORY"; Map postParams = { diff --git a/lib/models/generic_response_model.dart b/lib/models/generic_response_model.dart index b96098e..b812411 100644 --- a/lib/models/generic_response_model.dart +++ b/lib/models/generic_response_model.dart @@ -28,6 +28,7 @@ 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'; +import 'package:mohem_flutter_app/models/get_pr_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_quotation_analysis_list_model.dart'; import 'package:mohem_flutter_app/models/get_schedule_shifts_details_list_model.dart'; import 'package:mohem_flutter_app/models/get_stamp_ms_notification_body_list_model.dart'; @@ -220,7 +221,7 @@ class GenericResponseModel { List? getPhonesNotificationBodyList; List? getPoItemHistoryList; GetPoNotificationBodyList? getPoNotificationBodyList; - List? getPrNotificationBodyList; + GetPrNotificationBodyList? getPrNotificationBodyList; List? getQuotationAnalysisList; List? getRFCEmployeeListList; List? getRespondAttributeValueList; @@ -985,7 +986,7 @@ class GenericResponseModel { }); } getPoNotificationBodyList = json['GetPoNotificationBodyList'] != null ? GetPoNotificationBodyList.fromJson(json['GetPoNotificationBodyList']) : null; - getPrNotificationBodyList = json['GetPrNotificationBodyList']; + getPrNotificationBodyList = json['GetPrNotificationBodyList'] != null ? GetPrNotificationBodyList.fromJson(json['GetPrNotificationBodyList']) : null; if (json['GetQuotationAnalysisList'] != null) { getQuotationAnalysisList = []; json['GetQuotationAnalysisList'].forEach((v) { @@ -1594,7 +1595,10 @@ class GenericResponseModel { if (this.getPoNotificationBodyList != null) { data['GetPoNotificationBodyList'] = this.getPoNotificationBodyList!.toJson(); } - data['GetPrNotificationBodyList'] = this.getPrNotificationBodyList; + if (this.getPrNotificationBodyList != null) { + data['GetPrNotificationBodyList'] = this.getPrNotificationBodyList!.toJson(); + } + if (this.getQuotationAnalysisList != null) { data['GetQuotationAnalysisList'] = this.getQuotationAnalysisList!.map((v) => v.toJson()).toList(); } diff --git a/lib/models/get_po_notification_body_list_model.dart b/lib/models/get_po_notification_body_list_model.dart index ff18949..3bc92a0 100644 --- a/lib/models/get_po_notification_body_list_model.dart +++ b/lib/models/get_po_notification_body_list_model.dart @@ -150,8 +150,8 @@ class POLines { String? iTEMCODE; String? iTEMDESCRIPTION; int? iTEMID; - int? lINEAMOUNT; - int? lINEDISCPERCENTAGE; + num? lINEAMOUNT; + num? lINEDISCPERCENTAGE; int? lINENUM; String? lINETYPE; String? mFG; diff --git a/lib/models/get_pr_notification_body_list_model.dart b/lib/models/get_pr_notification_body_list_model.dart new file mode 100644 index 0000000..dfc8b39 --- /dev/null +++ b/lib/models/get_pr_notification_body_list_model.dart @@ -0,0 +1,130 @@ +class GetPrNotificationBodyList { + List? pRHeader; + List? pRLines; + String? pCURRENCYCODE; + String? pINFORMATION; + String? pQUESTION; + + GetPrNotificationBodyList( + {this.pRHeader, + this.pRLines, + this.pCURRENCYCODE, + this.pINFORMATION, + this.pQUESTION}); + + GetPrNotificationBodyList.fromJson(Map json) { + if (json['PRHeader'] != null) { + pRHeader = []; + json['PRHeader'].forEach((v) { + pRHeader!.add(new PRHeader.fromJson(v)); + }); + } + if (json['PRLines'] != null) { + pRLines = []; + json['PRLines'].forEach((v) { + pRLines!.add(new PRLines.fromJson(v)); + }); + } + pCURRENCYCODE = json['P_CURRENCY_CODE']; + pINFORMATION = json['P_INFORMATION']; + pQUESTION = json['P_QUESTION']; + } + + Map toJson() { + Map data = new Map(); + if (this.pRHeader != null) { + data['PRHeader'] = this.pRHeader!.map((v) => v.toJson()).toList(); + } + if (this.pRLines != null) { + data['PRLines'] = this.pRLines!.map((v) => v.toJson()).toList(); + } + data['P_CURRENCY_CODE'] = this.pCURRENCYCODE; + data['P_INFORMATION'] = this.pINFORMATION; + data['P_QUESTION'] = this.pQUESTION; + return data; + } +} + +class PRHeader { + String? hDRATTRIBUTENAME; + String? hDRATTRIBUTEVALUE; + + PRHeader({this.hDRATTRIBUTENAME, this.hDRATTRIBUTEVALUE}); + + PRHeader.fromJson(Map json) { + hDRATTRIBUTENAME = json['HDR_ATTRIBUTE_NAME']; + hDRATTRIBUTEVALUE = json['HDR_ATTRIBUTE_VALUE']; + } + + Map toJson() { + Map data = new Map(); + data['HDR_ATTRIBUTE_NAME'] = this.hDRATTRIBUTENAME; + data['HDR_ATTRIBUTE_VALUE'] = this.hDRATTRIBUTEVALUE; + return data; + } +} + +class PRLines { + String? cOSTCENTER; + String? dESCRIPTION; + int? fROMROWNUM; + int? iTEMAMU; + String? iTEMCODE; + num? lINEAMOUNT; + int? lINENUM; + int? nOOFROWS; + int? qUANTITY; + int? rOWNUM; + int? tOROWNUM; + num? uNITPRICE; + String? uOM; + + PRLines( + {this.cOSTCENTER, + this.dESCRIPTION, + this.fROMROWNUM, + this.iTEMAMU, + this.iTEMCODE, + this.lINEAMOUNT, + this.lINENUM, + this.nOOFROWS, + this.qUANTITY, + this.rOWNUM, + this.tOROWNUM, + this.uNITPRICE, + this.uOM}); + + PRLines.fromJson(Map json) { + cOSTCENTER = json['COST_CENTER']; + dESCRIPTION = json['DESCRIPTION']; + fROMROWNUM = json['FROM_ROW_NUM']; + iTEMAMU = json['ITEM_AMU']; + iTEMCODE = json['ITEM_CODE']; + lINEAMOUNT = json['LINE_AMOUNT']; + lINENUM = json['LINE_NUM']; + nOOFROWS = json['NO_OF_ROWS']; + qUANTITY = json['QUANTITY']; + rOWNUM = json['ROW_NUM']; + tOROWNUM = json['TO_ROW_NUM']; + uNITPRICE = json['UNIT_PRICE']; + uOM = json['UOM']; + } + + Map toJson() { + Map data = new Map(); + data['COST_CENTER'] = this.cOSTCENTER; + data['DESCRIPTION'] = this.dESCRIPTION; + data['FROM_ROW_NUM'] = this.fROMROWNUM; + data['ITEM_AMU'] = this.iTEMAMU; + data['ITEM_CODE'] = this.iTEMCODE; + data['LINE_AMOUNT'] = this.lINEAMOUNT; + data['LINE_NUM'] = this.lINENUM; + data['NO_OF_ROWS'] = this.nOOFROWS; + data['QUANTITY'] = this.qUANTITY; + data['ROW_NUM'] = this.rOWNUM; + data['TO_ROW_NUM'] = this.tOROWNUM; + data['UNIT_PRICE'] = this.uNITPRICE; + data['UOM'] = this.uOM; + return data; + } +} diff --git a/lib/ui/dialogs/id/employee_digital_id_dialog.dart b/lib/ui/dialogs/id/employee_digital_id_dialog.dart index 034a133..0e672f8 100644 --- a/lib/ui/dialogs/id/employee_digital_id_dialog.dart +++ b/lib/ui/dialogs/id/employee_digital_id_dialog.dart @@ -32,9 +32,9 @@ class EmployeeDigitialIdDialog extends StatelessWidget { Container( width: 80, height: 80, - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(12)), + borderRadius: BorderRadius.all(Radius.circular(12)), boxShadow: [BoxShadow(color: Colors.white60, blurRadius: 10, spreadRadius: 10)], ), clipBehavior: Clip.antiAlias, @@ -44,7 +44,7 @@ class EmployeeDigitialIdDialog extends StatelessWidget { child: SvgPicture.asset("assets/images/user.svg"), ) : Image.memory( - Utils.getPostBytes( + Utils.dataFromBase64String( AppState().memberInformationList!.eMPLOYEEIMAGE ?? "", ), fit: BoxFit.cover, diff --git a/lib/ui/landing/dashboard_screen.dart b/lib/ui/landing/dashboard_screen.dart index 4ecb644..cf14b3a 100644 --- a/lib/ui/landing/dashboard_screen.dart +++ b/lib/ui/landing/dashboard_screen.dart @@ -80,7 +80,7 @@ class _DashboardScreenState extends State { mainAxisSize: MainAxisSize.min, children: [ Image.memory( - Utils.getPostBytes( + Utils.dataFromBase64String( AppState().memberInformationList!.eMPLOYEEIMAGE ?? "", ), errorBuilder: (BuildContext context, error, stackTrace) { diff --git a/lib/ui/landing/widget/app_drawer.dart b/lib/ui/landing/widget/app_drawer.dart index ea6343b..d828270 100644 --- a/lib/ui/landing/widget/app_drawer.dart +++ b/lib/ui/landing/widget/app_drawer.dart @@ -52,7 +52,7 @@ class _AppDrawerState extends State { ) : CircleAvatar( radius: 52 / 2, - backgroundImage: MemoryImage(Utils.getPostBytes(AppState().memberInformationList!.eMPLOYEEIMAGE)), + backgroundImage: MemoryImage(Utils.dataFromBase64String(AppState().memberInformationList!.eMPLOYEEIMAGE!)), backgroundColor: Colors.black, ), 12.width, diff --git a/lib/ui/landing/widget/services_widget.dart b/lib/ui/landing/widget/services_widget.dart index 7a6e976..ecb0641 100644 --- a/lib/ui/landing/widget/services_widget.dart +++ b/lib/ui/landing/widget/services_widget.dart @@ -49,6 +49,7 @@ class ServicesWidget extends StatelessWidget { padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13), scrollDirection: Axis.horizontal, itemBuilder: (cxt, index) { + return AspectRatio( aspectRatio: 105 / 105, child: data.isServicesMenusLoading @@ -118,9 +119,8 @@ class ServicesWidget extends StatelessWidget { Navigator.of(context).pushNamed(AppRoutes.profile); return; } - 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" || element.menuEntryType == "MENU")).toList() ?? []; menuEntry.icon = ""; - print(menuEntry.toJson()); if (menuList.isEmpty) { if (menuEntry.requestType == "EIT") { Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(menuEntry.prompt!, menuEntry.functionName!)); diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index b4b406b..de25f7a 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -5,6 +5,7 @@ import 'package:easy_localization/src/public_ext.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:mohem_flutter_app/api/login_api_client.dart'; @@ -50,7 +51,7 @@ class _LoginScreenState extends State { @override void initState() { super.initState(); - // checkFirebaseToken(); + // checkFirebaseToken(); } @override @@ -129,14 +130,14 @@ class _LoginScreenState extends State { Widget build(BuildContext context) { if (isAppOpenBySystem == null) { isAppOpenBySystem = (ModalRoute.of(context)!.settings.arguments ?? true) as bool; - - // username.text = "15153"; - // password.text = "Abcd@12345"; + if (kDebugMode) { + // username.text = "15444"; // Maha User + username.text = "15153"; // Tamer User + password.text = "Abcd@12345"; + } if (isAppOpenBySystem!) checkFirebaseToken(); } - // username.text = "15444"; - return Scaffold( body: Column( children: [ diff --git a/lib/ui/my_attendance/services_menu_list_screen.dart b/lib/ui/my_attendance/services_menu_list_screen.dart index 4e0c584..c05e035 100644 --- a/lib/ui/my_attendance/services_menu_list_screen.dart +++ b/lib/ui/my_attendance/services_menu_list_screen.dart @@ -8,8 +8,10 @@ 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/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/app_bar_widget.dart'; +import 'package:provider/provider.dart'; class ServicesMenuListScreenParams { final String title; @@ -29,10 +31,7 @@ class ServicesMenuListScreen extends StatelessWidget { return Scaffold( backgroundColor: Colors.white, - appBar: AppBarWidget( - context, - title: servicesMenuData.title, - ), + appBar: AppBarWidget(context, title: servicesMenuData.title), body: SizedBox( width: double.infinity, height: double.infinity, @@ -60,8 +59,12 @@ class ServicesMenuListScreen extends StatelessWidget { Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!)); } else { if (servicesMenuData.list[index].requestType == "TERMINATION") { - Navigator.pushNamed(context, AppRoutes.endEmploymentScreen, arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!)); - + Navigator.pushNamed(context, AppRoutes.endEmploymentScreen, + arguments: DynamicListViewParams(servicesMenuData.list[index].prompt!, servicesMenuData.list[index].functionName!)); + } else { + var provider = Provider.of(context, listen: false); + List menuList = provider.getMenuEntriesList?.where((element) => element.parentMenuName == servicesMenuData.list[index].menuName).toList() ?? []; + Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(servicesMenuData.list[index].prompt!, menuList)); } } }), diff --git a/lib/ui/work_list/itg_detail_screen.dart b/lib/ui/work_list/itg_detail_screen.dart index b1deae8..491672f 100644 --- a/lib/ui/work_list/itg_detail_screen.dart +++ b/lib/ui/work_list/itg_detail_screen.dart @@ -259,7 +259,8 @@ class _ItgDetailScreenState extends State { void handleFabAction(AllowedActions action) { switch (action.action) { case "DELEGATE": - // do something + // showMyBottomSheet(context, child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: action.action!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + break; case "REQUEST_INFO": // do something else diff --git a/lib/ui/work_list/sheets/delegate_sheet.dart b/lib/ui/work_list/sheets/delegate_sheet.dart index 1dbc30c..75b33c9 100644 --- a/lib/ui/work_list/sheets/delegate_sheet.dart +++ b/lib/ui/work_list/sheets/delegate_sheet.dart @@ -12,6 +12,7 @@ import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; +import 'package:mohem_flutter_app/models/itg_forms_models/wf_history_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'; @@ -25,8 +26,9 @@ class DelegateSheet extends StatefulWidget { int? notificationID; String title, apiMode; List? actionHistoryList; + List? wFHistory; - DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList}); + DelegateSheet({required this.title, required this.apiMode, this.notificationID, this.actionHistoryList,this.wFHistory}); @override State createState() => _DelegateSheetState(); @@ -204,7 +206,7 @@ class _DelegateSheetState extends State { onPressed: () { fetchUserByInput(); }, - child: Text( + child: const Text( "Search", style: TextStyle( color: Colors.blue, diff --git a/lib/ui/work_list/sheets/selected_item_sheet.dart b/lib/ui/work_list/sheets/selected_item_sheet.dart index fa43181..d406ef3 100644 --- a/lib/ui/work_list/sheets/selected_item_sheet.dart +++ b/lib/ui/work_list/sheets/selected_item_sheet.dart @@ -83,22 +83,26 @@ class SelectedItemSheet extends StatelessWidget { 16.width, Expanded( child: DefaultButton( - LocaleKeys.submit.tr(), + LocaleKeys.submit.tr(), () { - String? email = "", userId = ""; - if (actionHistoryList != null) { - email = actionHistoryList!.eMAILADDRESS; - userId = actionHistoryList!.uSERNAME; - } else if (favoriteReplacements != null) { - email = favoriteReplacements!.emailAddress; - userId = favoriteReplacements!.userName; + if (comment.trim() != "") { + String? email = "", userId = ""; + if (actionHistoryList != null) { + email = actionHistoryList!.eMAILADDRESS; + userId = actionHistoryList!.uSERNAME; + } else if (favoriteReplacements != null) { + email = favoriteReplacements!.emailAddress; + userId = favoriteReplacements!.userName; + } else { + email = replacementList!.emailAddress; + userId = replacementList!.userName; + } + performNetworkCall(context, email: email ?? "", userId: userId ?? ""); } else { - email = replacementList!.emailAddress; - userId = replacementList!.userName; + Utils.showToast("Please enter comments"); } - performNetworkCall(context, email: email ?? "", userId: userId ?? ""); }, - colors: [ + colors: const [ Color(0xff32D892), Color(0xff1AB170), ], diff --git a/lib/ui/work_list/work_list_screen.dart b/lib/ui/work_list/work_list_screen.dart index a19d6a5..35c3c17 100644 --- a/lib/ui/work_list/work_list_screen.dart +++ b/lib/ui/work_list/work_list_screen.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -22,8 +20,7 @@ import 'package:mohem_flutter_app/models/worklist_response_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; -import 'package:mohem_flutter_app/widgets/button/default_button.dart'; -import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; +import 'package:mohem_flutter_app/widgets/bottom_sheets/worklist_advance_search_bottom_sheet.dart'; import 'package:provider/provider.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; @@ -93,36 +90,16 @@ class _WorkListScreenState extends State { final RefreshController _refreshController = RefreshController(initialRefresh: false); - final Map advancedSearchViews = {}; - final Map advancedSearchSearchBy = {}; - final Map advancedSearchItemType = {}; - - int selectedViewID = 1; - String? selectedViewName; - - int selectedSearchByID = 0; - String? selectedSearchByName; - - String selectedItemTypeID = ""; - String? selectedItemTypeName; - - String searchByInput = ""; - String searchByDate = ""; - - DateTime selectedDate = DateTime.now(); final ScrollController _controller = ScrollController(); + int pNotificationType = 1; + @override void initState() { super.initState(); providerData = Provider.of(context, listen: false); calculateCounter(); getWorkList(); - setupAdvancedSearchParams(); - } - - void setupAdvancedSearchParams() { - advancedSearchViews.addAll({1: LocaleKeys.openNot.tr(), 2: LocaleKeys.fyi.tr(), 3: LocaleKeys.toDo.tr(), 4: LocaleKeys.all.tr(), 5: LocaleKeys.meNot.tr()}); } void calculateCounter() { @@ -162,7 +139,7 @@ class _WorkListScreenState extends State { } } else { itgRequestTypeIndex = null; - workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key, selectedViewID.toString()); + workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key, pNotificationType.toString()); AppState().setWorkList = workList; } if (showLoading) Utils.hideLoading(context); @@ -223,6 +200,9 @@ class _WorkListScreenState extends State { child: ("${workListItemTypes[index].name} ${workListItemTypes[index].value > 0 ? "(${workListItemTypes[index].value})" : ""}") .toText12(color: workListItemIndex == index ? MyColors.white : MyColors.black), ).onPress(() { + if (pNotificationType != 1) { + pNotificationType = 1; + } if (workListItemIndex != index && !workListItemTypes[index].disable) { workListItemIndex = index; if (workListItemTypes[index].value == 0) { @@ -249,7 +229,7 @@ class _WorkListScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21), - LocaleKeys.advancedSearch.tr().toText14(isUnderLine: true).onPress(() { + LocaleKeys.advancedSearch.tr().toText14(isUnderLine: true, color: MyColors.textMixColor).onPress(() { openBottomSheet(context); }).paddingOnly(left: 21, right: 21) ], @@ -407,141 +387,32 @@ class _WorkListScreenState extends State { void openBottomSheet(BuildContext context) { showMyBottomSheet( context, - child: Padding( - padding: const EdgeInsets.all(21.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - LocaleKeys.advancedSearch.tr().toText18(), - IconButton( - icon: const Icon(Icons.close, color: MyColors.darkIconColor), - onPressed: () => Navigator.pop(context), - ), - ], - ), - 12.height, - PopupMenuButton( - child: DynamicTextFieldWidget( - LocaleKeys.view.tr(), - selectedViewName != null ? selectedViewName! : LocaleKeys.view.tr(), - isEnable: false, - isPopup: true, - isInputTypeNum: true, - isReadOnly: false, - ), - itemBuilder: (_) => >[ - PopupMenuItem(value: 1, child: Text(LocaleKeys.openNot.tr())), - PopupMenuItem(value: 2, child: Text(LocaleKeys.fyi.tr())), - PopupMenuItem(value: 3, child: Text(LocaleKeys.toDo.tr())), - PopupMenuItem(value: 4, child: Text(LocaleKeys.all.tr())), - PopupMenuItem(value: 5, child: Text(LocaleKeys.meNot.tr())), - ], - onSelected: (int popupIndex) { - selectedViewID = popupIndex; - selectedViewName = getSelectedViewName(popupIndex); - setState(() {}); - }, - ), - 12.height, - PopupMenuButton( - child: DynamicTextFieldWidget( - LocaleKeys.searchBy.tr(), - selectedSearchByName != null ? selectedSearchByName! : LocaleKeys.searchBy.tr(), - isEnable: false, - isPopup: true, - isInputTypeNum: true, - isReadOnly: false, - ), - itemBuilder: (_) => >[ - PopupMenuItem(value: 1, child: Text(LocaleKeys.fromUserName.tr())), - PopupMenuItem(value: 2, child: Text(LocaleKeys.subject.tr())), - PopupMenuItem(value: 3, child: Text(LocaleKeys.sentDate.tr())), - PopupMenuItem(value: 4, child: Text(LocaleKeys.itemTypeDisplayName.tr())), - PopupMenuItem(value: 5, child: Text(LocaleKeys.none.tr())), - ], - onSelected: (int popupIndex) { - selectedSearchByID = popupIndex; - selectedSearchByName = getSelectedSearchByName(popupIndex); - setState(() {}); - }, - ), - 12.height, - if (selectedSearchByID == 1 || selectedSearchByID == 2 || selectedSearchByID == 4) - DynamicTextFieldWidget( - LocaleKeys.searchBy.tr(), - LocaleKeys.searchBy.tr(), - isEnable: true, - isPopup: false, - lines: 1, - isInputTypeNum: false, - isReadOnly: false, - onChange: (String value) { - debugPrint(value); - searchByInput = value; - }, - ), - if (selectedSearchByID == 3) - DynamicTextFieldWidget( - LocaleKeys.searchBy.tr(), - LocaleKeys.sentDate.tr(), - suffixIconData: Icons.calendar_today, - isEnable: false, - onTap: () async { - selectedDate = await _selectDate(context, DateTime.now()); - searchByDate = selectedDate.day.toString() + "-" + getMonth(selectedDate.month) + "-" + selectedDate.year.toString(); - setState(() {}); - }, - ), - 12.height, - PopupMenuButton( - child: DynamicTextFieldWidget( - LocaleKeys.itemType.tr(), - selectedItemTypeName != null ? selectedItemTypeName! : LocaleKeys.itemType.tr(), - isEnable: false, - isPopup: true, - isInputTypeNum: true, - isReadOnly: false, - ), - itemBuilder: (_) => >[ - const PopupMenuItem(value: "HRSSA", child: Text("HR")), - const PopupMenuItem(value: "POAPPRV", child: Text("PO")), - const PopupMenuItem(value: "REQAPPRV", child: Text("PR")), - const PopupMenuItem(value: "INVMOA", child: Text("MR")), - const PopupMenuItem(value: "INVITEM", child: Text("IC")), - const PopupMenuItem(value: "STAMP", child: Text("STAMP")), - ], - onSelected: (String popupIndex) { - selectedItemTypeID = popupIndex; - selectedItemTypeName = getSelectedItemType(popupIndex); - setState(() {}); - }, - ), - 20.height, - DefaultButton(LocaleKeys.search.tr(), () async { - Navigator.pop(context); - itgRequestTypeIndex = null; - int index = -1; - for (int i = 0; i < workListItemTypes.length; i++) { - if (workListItemTypes[i].key == selectedItemTypeID) { - index = i; - break; - } - } - Utils.showLoading(context); - workList = await WorkListApiClient().getWorkList(pageNumber, selectedItemTypeID, selectedViewID.toString(), - pSearchUser: searchByInput, pSearchSubject: searchByInput, pSentDate: searchByDate, pSearchItemType: searchByInput); - workListItemIndex = index; - AppState().setWorkList = workList; - _animateToIndex(index, 50.0); - Utils.hideLoading(context); - setState(() {}); - }) - ], - ), - ), + child: WorkListAdvanceSearch((selectedViewID, selectedItemTypeID, searchByInput, searchByDate) async { + itgRequestTypeIndex = null; + pNotificationType = selectedViewID; + int index = -1; + for (int i = 0; i < workListItemTypes.length; i++) { + if (workListItemTypes[i].key == selectedItemTypeID) { + index = i; + break; + } + } + Utils.showLoading(context); + workList = await WorkListApiClient().getWorkList( + pageNumber, + selectedItemTypeID, + selectedViewID.toString(), + pSearchUser: searchByInput, + pSearchSubject: searchByInput, + pSentDate: searchByDate, + pSearchItemType: searchByInput, + ); + workListItemIndex = index; + AppState().setWorkList = workList; + Utils.hideLoading(context); + _animateToIndex(index, 50.0); + setState(() {}); + }), ); } @@ -631,133 +502,4 @@ class _WorkListScreenState extends State { curve: Curves.fastOutSlowIn, ); } - - String getSelectedViewName(int index) { - String returnVal = ""; - switch (index) { - case 1: - returnVal = LocaleKeys.openNot.tr(); - break; - case 2: - returnVal = LocaleKeys.fyi.tr(); - break; - case 3: - returnVal = LocaleKeys.toDo.tr(); - break; - case 4: - returnVal = LocaleKeys.all.tr(); - break; - case 5: - returnVal = LocaleKeys.meNot.tr(); - break; - } - return returnVal; - } - - String getSelectedSearchByName(int index) { - String returnVal = ""; - switch (index) { - case 1: - returnVal = LocaleKeys.fromUserName.tr(); - break; - case 2: - returnVal = LocaleKeys.subject.tr(); - break; - case 3: - returnVal = LocaleKeys.sentDate.tr(); - break; - case 4: - returnVal = LocaleKeys.itemType.tr(); - break; - case 5: - returnVal = LocaleKeys.none.tr(); - break; - } - return returnVal; - } - - String getSelectedItemType(String index) { - String returnVal = ""; - switch (index) { - case "HRSSA": - returnVal = "HR"; - break; - case "POAPPRV": - returnVal = "PO"; - break; - case "REQAPPRV": - returnVal = "PR"; - break; - case "INVMOA": - returnVal = "MR"; - break; - case "INVITEM": - returnVal = "IC"; - break; - case "STAMP": - returnVal = "STAMP"; - break; - } - return returnVal; - } - - 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 { - 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; - } - - String getMonth(int month) { - switch (month) { - case 1: - return "Jan"; - case 2: - return "Feb"; - case 3: - return "Mar"; - case 4: - return "Apr"; - case 5: - return "May"; - case 6: - return "June"; - case 7: - return "July"; - case 8: - return "Aug"; - case 9: - return "Sep"; - case 10: - return "Oct"; - case 11: - return "Nov"; - case 12: - return "Dec"; - default: - return ""; - } - } } diff --git a/lib/ui/work_list/worklist_detail_screen.dart b/lib/ui/work_list/worklist_detail_screen.dart index 8dd57a2..508ce04 100644 --- a/lib/ui/work_list/worklist_detail_screen.dart +++ b/lib/ui/work_list/worklist_detail_screen.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; @@ -19,6 +17,7 @@ import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.d import 'package:mohem_flutter_app/models/get_mo_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_notification_buttons_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_pr_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/member_information_list_model.dart'; @@ -76,6 +75,7 @@ class _WorkListDetailScreenState extends State { GenericResponseModel? getICBody; GenericResponseModel? subordinatesLeavesModel; GetPoNotificationBodyList? getPoNotificationBody; + GetPrNotificationBodyList? getPrNotificationBody; GetItemCreationNtfBodyList? getItemCreationNtfBody; bool isCloseAvailable = false; @@ -131,6 +131,9 @@ class _WorkListDetailScreenState extends State { if (workListData!.iTEMTYPE == "POAPPRV") { getPoNotificationBody = await WorkListApiClient().getPoNotificationBody(workListData!.nOTIFICATIONID!, -999); } + if (workListData!.iTEMTYPE == "REQAPPRV") { + getPrNotificationBody = await WorkListApiClient().getPRNotificationBody(workListData!.nOTIFICATIONID!, -999); + } getNotificationRespondAttributes = await WorkListApiClient().notificationGetRespondAttributes(workListData!.nOTIFICATIONID!); if (getNotificationRespondAttributes.isNotEmpty) { notificationNoteInput = getNotificationRespondAttributes.first; @@ -168,9 +171,7 @@ class _WorkListDetailScreenState extends State { } catch (ex) { Utils.hideLoading(context); Utils.handleException(ex, context, null); - setState(() { - - }); + setState(() {}); } } @@ -246,6 +247,7 @@ class _WorkListDetailScreenState extends State { getBasicDetNtfBodyList: getBasicDetNtfBodyList, getAbsenceCollectionNotificationBodyList: getAbsenceCollectionNotificationBodyList, getContactNotificationBodyList: getContactNotificationBodyList, + getPrNotificationBodyList: getPrNotificationBody, ), (workListData!.iTEMTYPE == "HRSSA" || workListData!.iTEMTYPE == "STAMP") ? DetailFragment(workListData, memberInformationListModel) @@ -253,6 +255,7 @@ class _WorkListDetailScreenState extends State { moNotificationBodyList: getMoNotificationBodyList, poLinesList: getPoNotificationBody?.pOLines ?? [], itemCreationLines: getItemCreationNtfBody?.itemCreationLines ?? [], + prLinesList: getPrNotificationBody?.pRLines ?? [], ), actionHistoryList.isEmpty ? Utils.getNoDataWidget(context) : ActionsFragment(workListData!.nOTIFICATIONID, actionHistoryList), getAttachmentList.isEmpty ? Utils.getNoDataWidget(context) : AttachmentsFragment(getAttachmentList), @@ -379,33 +382,34 @@ class _WorkListDetailScreenState extends State { void handleFabAction(GetNotificationButtonsList notificationButton) { switch (notificationButton.bUTTONACTION) { case "DELEGATE": - // do something - showMyBottomSheet(context, child: DelegateSheet(title: "Delegate", apiMode: "DELEGATE", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + showMyBottomSheet(context, + child: DelegateSheet(title: LocaleKeys.delegate.tr(), apiMode: notificationButton.bUTTONACTION!, notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + break; case "REQUEST_INFO": // do something else - showMyBottomSheet(context, child: DelegateSheet(title: "Request Info", apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); + showMyBottomSheet(context, + child: DelegateSheet(title: LocaleKeys.request_info.tr(), apiMode: "REQUEST_INFO", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); break; case "RFC": // do something else break; + case "APPROVE": + performAction(notificationButton.bUTTONACTION!); + break; case "UPDATE_ACTION": // do something else case "APPROVE_AND_FORWARD": - // do something else showMyBottomSheet(context, child: DelegateSheet(title: "Approve and Forward", apiMode: "APPROVE_AND_FORWARD", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); break; case "FORWARD": - // do something else showMyBottomSheet(context, child: DelegateSheet(title: "Forward", apiMode: "FORWARD", notificationID: workListData!.nOTIFICATIONID, actionHistoryList: actionHistoryList)); break; case "REJECT": - // do something else performNetworkCall(context, email: "", userId: ""); break; case "RETURNED": - // do something else Navigator.pop(context); break; } @@ -485,7 +489,9 @@ class _WorkListDetailScreenState extends State { child: isIconAsset ? SvgPicture.asset(icon) : Image.memory( - base64Decode(icon), + Utils.dataFromBase64String( + icon, + ), fit: BoxFit.cover, ), ) @@ -494,27 +500,33 @@ class _WorkListDetailScreenState extends State { } void performAction(String actionMode) { + TextEditingController textEditingController = TextEditingController(); showDialog( context: context, builder: (cxt) => AcceptRejectInputDialog( message: LocaleKeys.requestedItems.tr(), notificationGetRespond: notificationNoteInput, + textEditingController: textEditingController, onTap: (note) { - Map payload = { - "P_ACTION_MODE": actionMode, - "P_APPROVER_INDEX": null, - "P_COMMENTS": "", - "P_FORWARD_TO_USER_NAME": "", - "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID, - "RespondAttributeList": [ - if (notificationNoteInput != null) - { - "ATTRIBUTE_NAME": notificationNoteInput!.attributeName, - if (notificationNoteInput!.attributeType == "number") "ATTRIBUTE_NUMBER_VALUE": note else if (notificationNoteInput!.attributeType == "VARCHAR2") "ATTRIBUTE_TEXT_VALUE": note - } - ], - }; - performNotificationAction(payload); + if(note.isNotEmpty && (actionMode == "APPROVED" || actionMode == "APPROVE")) { + Map payload = { + "P_ACTION_MODE": actionMode, + "P_APPROVER_INDEX": null, + "P_COMMENTS": note, + "P_FORWARD_TO_USER_NAME": "", + "P_NOTIFICATION_ID": workListData!.nOTIFICATIONID, + "RespondAttributeList": [ + if (notificationNoteInput != null) + { + "ATTRIBUTE_NAME": notificationNoteInput!.attributeName, + if (notificationNoteInput!.attributeType == "number") "ATTRIBUTE_NUMBER_VALUE": note else if (notificationNoteInput!.attributeType == "VARCHAR2") "ATTRIBUTE_TEXT_VALUE": note + } + ], + }; + performNotificationAction(payload); + } else { + Utils.showToast("Please enter comments"); + } }, ), ); diff --git a/lib/ui/work_list/worklist_fragments/actions_fragment.dart b/lib/ui/work_list/worklist_fragments/actions_fragment.dart index 3663cc5..1df9bd3 100644 --- a/lib/ui/work_list/worklist_fragments/actions_fragment.dart +++ b/lib/ui/work_list/worklist_fragments/actions_fragment.dart @@ -71,7 +71,9 @@ class ActionsFragment extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - CircularAvatar(url: actionHistory.eMPLOYEEIMAGE ?? "", isImageBase64: true, height: 34, width: 34), + actionHistory.eMPLOYEEIMAGE != null + ? CircularAvatar(url: actionHistory.eMPLOYEEIMAGE ?? "", isImageBase64: true, height: 34, width: 34) + : CircularAvatar(url: "https://cdn4.iconfinder.com/data/icons/professions-2-2/151/89-512.png", isImageBase64: false, height: 34, width: 34), 9.width, Expanded( child: Column( @@ -129,10 +131,10 @@ class ActionsFragment extends StatelessWidget { return MyColors.redColor; } else if (code == "PENDING") { return MyColors.orange; - } else if (code == "APPROVED") { + } else if (code == "APPROVED" || code == "APPROVE") { return const Color(0xff1FA269); } else if (code != "SUBMIT" && code != "REJECT" && code != "PENDING") { - return const Color(0xff1FA269); + return MyColors.orange; } else if (code == "REQUEST_INFO") { return const Color(0xff2E303A); } else { diff --git a/lib/ui/work_list/worklist_fragments/info_fragments.dart b/lib/ui/work_list/worklist_fragments/info_fragments.dart index 18d5f68..16a60e0 100644 --- a/lib/ui/work_list/worklist_fragments/info_fragments.dart +++ b/lib/ui/work_list/worklist_fragments/info_fragments.dart @@ -1,5 +1,6 @@ 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'; @@ -8,6 +9,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_absence_collection_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_pr_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'; @@ -28,19 +30,20 @@ class InfoFragment extends StatelessWidget { List? getBasicDetNtfBodyList; List? getAbsenceCollectionNotificationBodyList; GetContactNotificationBodyList? getContactNotificationBodyList; + GetPrNotificationBodyList? getPrNotificationBodyList; - InfoFragment({ - this.workListData, - this.poHeaderList = const [], - this.itemCreationHeader = const [], - this.getStampMsNotifications, - this.getStampNsNotifications, - this.getEitCollectionNotificationBodyList, - this.getPhonesNotificationBodyList, - this.getBasicDetNtfBodyList, - this.getAbsenceCollectionNotificationBodyList, - this.getContactNotificationBodyList, - }); + InfoFragment( + {this.workListData, + this.poHeaderList = const [], + this.itemCreationHeader = const [], + this.getStampMsNotifications, + this.getStampNsNotifications, + this.getEitCollectionNotificationBodyList, + this.getPhonesNotificationBodyList, + this.getBasicDetNtfBodyList, + this.getAbsenceCollectionNotificationBodyList, + this.getContactNotificationBodyList, + this.getPrNotificationBodyList}); double itemHeight = 0; double itemWidth = 0; @@ -76,8 +79,9 @@ class InfoFragment extends StatelessWidget { ), ], ).objectContainerView(), - if (getStampMsNotifications?.isNotEmpty ?? false) getStampMsNotificationsListView(getStampMsNotifications ?? []).objectContainerView(title: "Stamp Notifications"), - if (getStampNsNotifications?.isNotEmpty ?? false) getStampNsNotificationsListView(getStampNsNotifications ?? []).objectContainerView(title: "Stamp Notifications"), + if (getPrNotificationBodyList != null) getPRNotificationBodyListWidget(getPrNotificationBodyList!), + if (getStampMsNotifications?.isNotEmpty ?? false) getStampMsNotificationsListView(getStampMsNotifications ?? []), + if (getStampNsNotifications?.isNotEmpty ?? false) getStampNsNotificationsListView(getStampNsNotifications ?? []), if (poHeaderList.isNotEmpty) getPoNotificationsListView(), if (itemCreationHeader.isNotEmpty) getItemCreationHeaderView(), if (getEitCollectionNotificationBodyList?.isNotEmpty ?? false) getEitNotificationsListView(getEitCollectionNotificationBodyList ?? []), @@ -218,8 +222,8 @@ class InfoFragment extends StatelessWidget { isItLast: true, ), ], - ), - separatorBuilder: (cxt, index) => 1.divider.paddingOnly(top: 8, bottom: 8), + ).objectContainerView(), + separatorBuilder: (cxt, index) => 1.height.paddingOnly(top: 8, bottom: 8), itemCount: list.length); } @@ -240,8 +244,8 @@ class InfoFragment extends StatelessWidget { isItLast: true, ), ], - ), - separatorBuilder: (cxt, index) => 1.divider.paddingOnly(top: 8, bottom: 8), + ).objectContainerView(), + separatorBuilder: (cxt, index) => 1.height.paddingOnly(top: 8, bottom: 8), itemCount: list.length); } @@ -433,6 +437,40 @@ class InfoFragment extends StatelessWidget { ); } + Widget getPRNotificationBodyListWidget(GetPrNotificationBodyList getPrNotificationBodyList) { + return Column( + children: [ + getPrNotificationBodyList.pINFORMATION.toString().toText14(color: MyColors.textMixColor).objectContainerView(), + 12.height, + Column( + children: [ + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.from.tr(), workListData!.fROMUSER ?? ""), + ItemDetailViewCol(LocaleKeys.to.tr(), workListData!.tOUSER ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.sent.tr(), workListData!.bEGINDATE ?? ""), + ItemDetailViewCol(LocaleKeys.closed.tr(), workListData!.eNDDATE ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.id.tr(), workListData!.nOTIFICATIONID?.toString() ?? ""), + ItemDetailViewCol(LocaleKeys.responder.tr(), workListData!.rESPONDER ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(getPrNotificationBodyList.pRHeader![2].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![2].hDRATTRIBUTEVALUE ?? ""), + ItemDetailViewCol(getPrNotificationBodyList.pRHeader![0].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![0].hDRATTRIBUTEVALUE ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTEVALUE ?? ""), + Container(), + isItLast: true, + ), + ], + ).objectContainerView(), + ], + ); + } + Widget getContactNotificationBodyListWidget(GetContactNotificationBodyList data) { bool isOdd = false; try { diff --git a/lib/ui/work_list/worklist_fragments/request_fragment.dart b/lib/ui/work_list/worklist_fragments/request_fragment.dart index 27b1c29..b900578 100644 --- a/lib/ui/work_list/worklist_fragments/request_fragment.dart +++ b/lib/ui/work_list/worklist_fragments/request_fragment.dart @@ -1,12 +1,16 @@ import 'package:easy_localization/src/public_ext.dart'; +import 'package:expandable/expandable.dart'; import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/models/get_item_creation_ntf_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_mo_notification_body_list_model.dart'; import 'package:mohem_flutter_app/models/get_po_notification_body_list_model.dart'; +import 'package:mohem_flutter_app/models/get_pr_notification_body_list_model.dart'; import 'package:mohem_flutter_app/ui/work_list/item_history_screen.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/item_detail_view_widget.dart'; @@ -15,12 +19,14 @@ class RequestFragment extends StatelessWidget { final List moNotificationBodyList; final List itemCreationLines; final List poLinesList; + final List prLinesList; RequestFragment({ Key? key, this.moNotificationBodyList = const [], this.itemCreationLines = const [], this.poLinesList = const [], + this.prLinesList = const [], }) : super(key: key); @override @@ -33,72 +39,114 @@ class RequestFragment extends StatelessWidget { if (moNotificationBodyList.isNotEmpty) moNotificationDataView(), if (poLinesList.isNotEmpty) poLinesDataView(), if (itemCreationLines.isNotEmpty) itemCreationLinesView(), + if (prLinesList.isNotEmpty) prLinesDataView(), ], ), ); } Widget poLinesDataView() { - return ListView.separated( - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (cxt, index) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.code.tr(), poLinesList[index].iTEMCODE ?? ""), - ItemDetailViewCol(LocaleKeys.mfg.tr(), poLinesList[index].uOM ?? ""), - ), - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.lineType.tr(), poLinesList[index].qUANTITY?.toString() ?? ""), - ItemDetailViewCol(LocaleKeys.unit.tr(), poLinesList[index].uOM ?? ""), - ), - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.price.tr(), poLinesList[index].uNITPRICE?.toString() ?? ""), - ItemDetailViewCol(LocaleKeys.lineAmount.tr(), poLinesList[index].lINEAMOUNT?.toString() ?? ""), - ), - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.quantity.tr(), poLinesList[index].qUANTITY?.toString() ?? ""), - ItemDetailViewCol(LocaleKeys.lineDiscount.tr(), poLinesList[index].lINEDISCPERCENTAGE?.toString() ?? ""), - ), - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.needByDate.tr(), poLinesList[index].nEEDBYDATE ?? ""), - ItemDetailViewCol(LocaleKeys.promisedDate.tr(), poLinesList[index].pROMISEDDATE ?? ""), - ), - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.deliverToLocation.tr(), poLinesList[index].dELIVERTOLOCATION ?? ""), - ItemDetailViewCol(LocaleKeys.requisitionNumber.tr(), poLinesList[index].rEQUESTOR ?? ""), - ), - ItemDetailGrid( - ItemDetailViewCol(LocaleKeys.requester.tr(), poLinesList[index].pRNUM ?? ""), - Container(), - ), - 12.height, - Row( + return ExpandableNotifier( + child: ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) => ExpandablePanel( + header: poLinesList[index].iTEMDESCRIPTION!.toText14(), + collapsed: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ - DefaultButton(LocaleKeys.itemHistory.tr(), () { - Navigator.pushNamed( - cxt, - AppRoutes.itemHistory, - arguments: ItemHistoryScreenParams(title: LocaleKeys.itemHistory.tr(), isMO: false, pItemId: poLinesList[index].iTEMID), - ); - }).expanded, - 12.width, - DefaultButton(LocaleKeys.quotationAnalysis.tr(), () { - Navigator.pushNamed( - cxt, - AppRoutes.itemHistory, - arguments: ItemHistoryScreenParams( - isItemHistory: false, isMO: false, title: LocaleKeys.quotationAnalysis.tr(), pItemId: poLinesList[index].iTEMID, pPoHeaderId: poLinesList[index].pOHEADERID), - ); - }).expanded, + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.code.tr(), poLinesList[index].iTEMCODE ?? ""), + ItemDetailViewCol(LocaleKeys.mfg.tr(), poLinesList[index].uOM ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.lineType.tr(), poLinesList[index].qUANTITY?.toString() ?? ""), + ItemDetailViewCol(LocaleKeys.unit.tr(), poLinesList[index].uOM ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.price.tr(), poLinesList[index].uNITPRICE?.toString() ?? ""), + ItemDetailViewCol(LocaleKeys.lineAmount.tr(), poLinesList[index].lINEAMOUNT?.toString() ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.quantity.tr(), poLinesList[index].qUANTITY?.toString() ?? ""), + ItemDetailViewCol(LocaleKeys.lineDiscount.tr(), poLinesList[index].lINEDISCPERCENTAGE?.toString() ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.needByDate.tr(), poLinesList[index].nEEDBYDATE ?? ""), + ItemDetailViewCol(LocaleKeys.promisedDate.tr(), poLinesList[index].pROMISEDDATE ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.deliverToLocation.tr(), poLinesList[index].dELIVERTOLOCATION ?? ""), + ItemDetailViewCol(LocaleKeys.requisitionNumber.tr(), poLinesList[index].rEQUESTOR ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol(LocaleKeys.requester.tr(), poLinesList[index].pRNUM ?? ""), + Container(), + ), + 12.height, + Row( + children: [ + DefaultButton(LocaleKeys.itemHistory.tr(), () { + Navigator.pushNamed( + cxt, + AppRoutes.itemHistory, + arguments: ItemHistoryScreenParams(title: LocaleKeys.itemHistory.tr(), isMO: false, pItemId: poLinesList[index].iTEMID), + ); + }).expanded, + 12.width, + DefaultButton(LocaleKeys.quotationAnalysis.tr(), () { + Navigator.pushNamed( + cxt, + AppRoutes.itemHistory, + arguments: ItemHistoryScreenParams( + isItemHistory: false, isMO: false, title: LocaleKeys.quotationAnalysis.tr(), pItemId: poLinesList[index].iTEMID, pPoHeaderId: poLinesList[index].pOHEADERID), + ); + }).expanded, + ], + ) ], - ) - ], - ).objectContainerView(title: poLinesList[index].iTEMDESCRIPTION!), - separatorBuilder: (cxt, index) => 12.height, - itemCount: poLinesList.length); + ), + expanded: const SizedBox(), + ).objectContainerView(), + separatorBuilder: (cxt, index) => 12.height, + itemCount: poLinesList.length), + ); + } + + Widget prLinesDataView() { + return Column( + children: [ + prLinesList[0].dESCRIPTION.toString().toText14(color: MyColors.textMixColor).objectContainerView(), + 12.height, + Column( + children: [ + ItemDetailGrid( + ItemDetailViewCol("Cost Center", prLinesList[0].cOSTCENTER ?? ""), + ItemDetailViewCol("Code", prLinesList[0].iTEMCODE ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol("Unit", prLinesList[0].uOM ?? ""), + ItemDetailViewCol("Price (SAR)", prLinesList[0].uNITPRICE.toString() ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol("Amount (SAR)", prLinesList[0].lINEAMOUNT.toString() ?? ""), + ItemDetailViewCol("Quantity", prLinesList[0].qUANTITY.toString() ?? ""), + ), + ItemDetailGrid( + ItemDetailViewCol("AMU (Last 3 months)", prLinesList[0].iTEMAMU.toString() ?? ""), + Container(), + isItLast: true, + ), + // ItemDetailGrid( + // ItemDetailViewCol(getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTENAME!, getPrNotificationBodyList.pRHeader![1].hDRATTRIBUTEVALUE ?? ""), + // Container(), + // isItLast: true, + // ), + ], + ).objectContainerView(), + ], + ); } Widget moNotificationDataView() { diff --git a/lib/widgets/bottom_sheets/worklist_advance_search_bottom_sheet.dart b/lib/widgets/bottom_sheets/worklist_advance_search_bottom_sheet.dart new file mode 100644 index 0000000..b669218 --- /dev/null +++ b/lib/widgets/bottom_sheets/worklist_advance_search_bottom_sheet.dart @@ -0,0 +1,242 @@ +import 'package:easy_localization/easy_localization.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/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/widgets/button/default_button.dart'; +import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart'; + +class WorkListAdvanceSearch extends StatefulWidget { + Function(int, String, String, String) onSearch; + + WorkListAdvanceSearch(this.onSearch, {Key? key}) : super(key: key); + + @override + _WorkListAdvanceSearchState createState() { + return _WorkListAdvanceSearchState(); + } +} + +class _WorkListAdvanceSearchState extends State { + final Map advancedSearchViews = {}; + final Map advancedSearchSearchBy = {}; + final Map advancedSearchItemType = {}; + + int selectedViewID = 1; + String? selectedViewName; + + int selectedSearchByID = 0; + String? selectedSearchByName; + + String selectedItemTypeID = ""; + String? selectedItemTypeName; + + String searchByInput = ""; + String searchByDate = ""; + + DateTime selectedDate = DateTime.now(); + + @override + void initState() { + super.initState(); + advancedSearchViews.addAll({1: LocaleKeys.openNot.tr(), 2: LocaleKeys.fyi.tr(), 3: LocaleKeys.toDo.tr(), 4: LocaleKeys.all.tr(), 5: LocaleKeys.meNot.tr()}); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.advancedSearch.tr().toText18(), + IconButton( + icon: const Icon(Icons.close, color: MyColors.darkIconColor), + onPressed: () => Navigator.pop(context), + ), + ], + ), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + LocaleKeys.view.tr(), + selectedViewName != null ? selectedViewName! : LocaleKeys.selectTypeT.tr(), + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ), + itemBuilder: (_) => >[ + PopupMenuItem(value: 1, child: Text(LocaleKeys.openNot.tr())), + PopupMenuItem(value: 2, child: Text(LocaleKeys.fyi.tr())), + PopupMenuItem(value: 3, child: Text(LocaleKeys.toDo.tr())), + PopupMenuItem(value: 4, child: Text(LocaleKeys.all.tr())), + PopupMenuItem(value: 5, child: Text(LocaleKeys.meNot.tr())), + ], + onSelected: (int popupIndex) { + selectedViewID = popupIndex; + selectedViewName = getSelectedViewName(popupIndex); + setState(() {}); + }, + ), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + LocaleKeys.searchBy.tr(), + selectedSearchByName != null ? selectedSearchByName! : LocaleKeys.selectTypeT.tr(), + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ), + itemBuilder: (_) => >[ + PopupMenuItem(value: 1, child: Text(LocaleKeys.fromUserName.tr())), + PopupMenuItem(value: 2, child: Text(LocaleKeys.subject.tr())), + PopupMenuItem(value: 3, child: Text(LocaleKeys.sentDate.tr())), + PopupMenuItem(value: 4, child: Text(LocaleKeys.itemTypeDisplayName.tr())), + PopupMenuItem(value: 5, child: Text(LocaleKeys.none.tr())), + ], + onSelected: (int popupIndex) { + selectedSearchByID = popupIndex; + selectedSearchByName = getSelectedSearchByName(popupIndex); + setState(() {}); + }, + ), + 12.height, + if (selectedSearchByID == 1 || selectedSearchByID == 2 || selectedSearchByID == 4) + DynamicTextFieldWidget( + LocaleKeys.searchBy.tr(), + LocaleKeys.searchBy.tr(), + isEnable: true, + isPopup: false, + lines: 1, + isInputTypeNum: false, + isReadOnly: false, + onChange: (String value) { + searchByInput = value; + }, + ), + if (selectedSearchByID == 3) + DynamicTextFieldWidget( + LocaleKeys.searchBy.tr(), + searchByDate.isEmpty ? LocaleKeys.sentDate.tr() : searchByDate, + suffixIconData: Icons.calendar_today, + isEnable: false, + onTap: () async { + selectedDate = await Utils.selectDate(context, DateTime.now()); + searchByDate = selectedDate.day.toString() + "-" + DateUtil.getMonth(selectedDate.month) + "-" + selectedDate.year.toString(); + setState(() {}); + }, + ), + 12.height, + PopupMenuButton( + child: DynamicTextFieldWidget( + LocaleKeys.itemType.tr(), + selectedItemTypeName != null ? selectedItemTypeName! : LocaleKeys.selectTypeT.tr(), + isEnable: false, + isPopup: true, + isInputTypeNum: true, + isReadOnly: false, + ), + itemBuilder: (_) => >[ + const PopupMenuItem(value: "HRSSA", child: Text("HR")), + const PopupMenuItem(value: "POAPPRV", child: Text("PO")), + const PopupMenuItem(value: "REQAPPRV", child: Text("PR")), + const PopupMenuItem(value: "INVMOA", child: Text("MR")), + const PopupMenuItem(value: "INVITEM", child: Text("IC")), + const PopupMenuItem(value: "STAMP", child: Text("STAMP")), + ], + onSelected: (String popupIndex) { + selectedItemTypeID = popupIndex; + selectedItemTypeName = getSelectedItemType(popupIndex); + setState(() {}); + }, + ), + 20.height, + DefaultButton(LocaleKeys.search.tr(), () async { + Navigator.pop(context); + widget.onSearch(selectedViewID, selectedItemTypeID, searchByInput, searchByDate); + }) + ], + ).paddingOnly(left: 21, right: 21, bottom: 21); + } + + String getSelectedViewName(int index) { + String returnVal = ""; + switch (index) { + case 1: + returnVal = LocaleKeys.openNot.tr(); + break; + case 2: + returnVal = LocaleKeys.fyi.tr(); + break; + case 3: + returnVal = LocaleKeys.toDo.tr(); + break; + case 4: + returnVal = LocaleKeys.all.tr(); + break; + case 5: + returnVal = LocaleKeys.meNot.tr(); + break; + } + return returnVal; + } + + String getSelectedSearchByName(int index) { + String returnVal = ""; + switch (index) { + case 1: + returnVal = LocaleKeys.fromUserName.tr(); + break; + case 2: + returnVal = LocaleKeys.subject.tr(); + break; + case 3: + returnVal = LocaleKeys.sentDate.tr(); + break; + case 4: + returnVal = LocaleKeys.itemType.tr(); + break; + case 5: + returnVal = LocaleKeys.none.tr(); + break; + } + return returnVal; + } + + String getSelectedItemType(String index) { + String returnVal = ""; + switch (index) { + case "HRSSA": + returnVal = "HR"; + break; + case "POAPPRV": + returnVal = "PO"; + break; + case "REQAPPRV": + returnVal = "PR"; + break; + case "INVMOA": + returnVal = "MR"; + break; + case "INVITEM": + returnVal = "IC"; + break; + case "STAMP": + returnVal = "STAMP"; + break; + } + return returnVal; + } +} diff --git a/lib/widgets/dialogs/accept_reject_input_dialog.dart b/lib/widgets/dialogs/accept_reject_input_dialog.dart index 3b644b9..ea84484 100644 --- a/lib/widgets/dialogs/accept_reject_input_dialog.dart +++ b/lib/widgets/dialogs/accept_reject_input_dialog.dart @@ -15,8 +15,9 @@ class AcceptRejectInputDialog extends StatelessWidget { final String? okTitle; final NotificationGetRespondAttributesList? notificationGetRespond; final Function(String) onTap; + final TextEditingController textEditingController; - AcceptRejectInputDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap, this.notificationGetRespond}) : super(key: key); + AcceptRejectInputDialog({Key? key, this.title, @required this.message, this.okTitle, required this.onTap, this.notificationGetRespond, required this.textEditingController}) : super(key: key); String note = ""; diff --git a/pubspec.yaml b/pubspec.yaml index 8fd19ab..28497ea 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -77,6 +77,7 @@ dependencies: flutter_rating_bar: ^4.0.1 auto_size_text: ^3.0.0 pull_to_refresh: ^2.0.0 + expandable: ^5.0.1 #Chat signalr_netcore: ^1.3.3