Advanced Search implemented

merge-requests/18/head
haroon amjad 3 years ago
parent 8923b49546
commit 5b5cc16b90

@ -454,5 +454,16 @@
"reset_locale": "Reset Language",
"chat": "دردشة",
"mychats": "دردشاتي",
"createNewChat": "Create New Chat"
"createNewChat": "Create New Chat",
"advancedSearch": "بحث متقدم",
"openNot": "التبليغات المفتوحة",
"fyi": "تبليغات للعلم",
"toDo": "تبليغات الأعمال",
"all": "كل التبليغات",
"meNot": "تبليغات صادرة مني",
"view": "عرض",
"fromUserName": "من",
"sentDate": "تاريخ الإرسال",
"itemTypeDisplayName": "اسم العرض",
"none": "بدون"
}

@ -454,5 +454,16 @@
"reset_locale": "Reset Language",
"chat": "Chat",
"mychats": "My Chats",
"createNewChat": "Create New Chat"
"createNewChat": "Create New Chat",
"advancedSearch": "Advanced Search",
"openNot": "Open Notifications",
"fyi": "FYI Notifications",
"toDo": "To Do Notifications",
"all": "All Notifications",
"meNot": "Notifications from Me",
"view": "View",
"fromUserName": "From User Name",
"sentDate": "Sent Date",
"itemTypeDisplayName": "Item Type Display Name",
"none": "None"
}

@ -57,9 +57,11 @@ class OffersAndDiscountsApiClient {
var bodyData = json.decode(body['result']['data']);
bodyData.forEach((v) {
if(bodyData != null) {
bodyData.forEach((v) {
getSaleCategoriesList.add(OffersListModel.fromJson(v));
});
}
return getSaleCategoriesList;
},
url,

@ -28,7 +28,6 @@ import 'package:mohem_flutter_app/models/worklist/hr/get_basic_det_ntf_body_list
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/update_user_type_list.dart';
import 'package:mohem_flutter_app/models/worklist_response_model.dart';
class WorkListApiClient {
@ -38,13 +37,18 @@ class WorkListApiClient {
factory WorkListApiClient() => _instance;
Future<List<WorkListResponseModel>?> getWorkList(int pPageNum, String pItemType) async {
Future<List<WorkListResponseModel>?> getWorkList(int pPageNum, String pItemType, String pNotificationType,
{String pSearchUser = "", String pSearchItemType = "", String pSentDate = "", String pSearchSubject = ""}) async {
String url = "${ApiConsts.erpRest}GET_WORKLIST";
Map<String, dynamic> postParams = {
"P_NOTIFICATION_TYPE": "1",
"P_NOTIFICATION_TYPE": pNotificationType,
"P_PAGE_NUM": pPageNum,
"P_PAGE_LIMIT": 50,
"P_PAGE_LIMIT": 25,
"P_ITEM_TYPE": pItemType,
"P_SEARCH_FROM_USER": pSearchUser,
"P_SEARCH_ITEM_TYPE_DSP_NAME": pSearchItemType,
"P_SEARCH_SENT_DATE": pSentDate,
"P_SEARCH_SUBJECT": pSearchSubject
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
@ -481,12 +485,9 @@ class WorkListApiClient {
}, url, postParams);
}
Future<List<GetUserItemTypesList>> getUserItemTypes() async {
String url = "${ApiConsts.erpRest}GET_USER_ITEM_TYPES";
Map<String, dynamic> postParams = {
};
Map<String, dynamic> postParams = {};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
@ -496,15 +497,11 @@ class WorkListApiClient {
Future<UpdateUserItemTypesList?> updateUserItemTypes(List<Map<String, dynamic>> itemList) async {
String url = "${ApiConsts.erpRest}UPDATE_USER_ITEM_TYPES";
Map<String, dynamic> postParams = {
"UpdateItemTypeList": itemList
};
Map<String, dynamic> postParams = {"UpdateItemTypeList": itemList};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.updateUserItemTypesList;
}, url, postParams);
}
}

@ -65,10 +65,10 @@ extension EmailValidator on String {
style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText14({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(
Widget toText14({Color? color, bool isUnderLine = false, bool isBold = false, FontWeight? weight, int? maxlines}) => Text(
this,
maxLines: maxlines,
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600)),
style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.w600), decoration: isUnderLine ? TextDecoration.underline : null),
);
Widget toText16({Color? color, bool isUnderLine = false, bool isBold = false, int? maxlines}) => Text(

@ -470,7 +470,18 @@ class CodegenLoader extends AssetLoader{
"reset_locale": "Reset Language",
"chat": "دردشة",
"mychats": "دردشاتي",
"createNewChat": "Create New Chat"
"createNewChat": "Create New Chat",
"advancedSearch": "بحث متقدم",
"openNot": "التبليغات المفتوحة",
"fyi": "تبليغات للعلم",
"toDo": "تبليغات الأعمال",
"all": "كل التبليغات",
"meNot": "تبليغات صادرة مني",
"view": "عرض",
"fromUserName": "من",
"sentDate": "تاريخ الإرسال",
"itemTypeDisplayName": "اسم العرض",
"none": "بدون"
};
static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm",
@ -928,7 +939,18 @@ static const Map<String,dynamic> en_US = {
"reset_locale": "Reset Language",
"chat": "Chat",
"mychats": "My Chats",
"createNewChat": "Create New Chat"
"createNewChat": "Create New Chat",
"advancedSearch": "Advanced Search",
"openNot": "Open Notifications",
"fyi": "FYI Notifications",
"toDo": "To Do Notifications",
"all": "All Notifications",
"meNot": "Notifications from Me",
"view": "View",
"fromUserName": "From User Name",
"sentDate": "Sent Date",
"itemTypeDisplayName": "Item Type Display Name",
"none": "None"
};
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
}

@ -441,5 +441,16 @@ abstract class LocaleKeys {
static const chat = 'chat';
static const mychats = 'mychats';
static const createNewChat = 'createNewChat';
static const advancedSearch = 'advancedSearch';
static const openNot = 'openNot';
static const fyi = 'fyi';
static const toDo = 'toDo';
static const all = 'all';
static const meNot = 'meNot';
static const view = 'view';
static const fromUserName = 'fromUserName';
static const sentDate = 'sentDate';
static const itemTypeDisplayName = 'itemTypeDisplayName';
static const none = 'none';
}

@ -414,7 +414,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
"assets/icons/item_for_sale.svg",
color: currentIndex == 3 ? MyColors.grey3AColor : MyColors.grey98Color,
).paddingAll(4),
label: LocaleKeys.chat.tr(),
label: LocaleKeys.itemsForSale.tr(),
),
BottomNavigationBarItem(
icon: SvgPicture.asset(

@ -1,4 +1,7 @@
import 'dart:io';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/api/worklist/worklist_api_client.dart';
@ -18,6 +21,9 @@ import 'package:mohem_flutter_app/models/worklist_item_type_model.dart';
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:provider/provider.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
@ -87,12 +93,36 @@ class _WorkListScreenState extends State<WorkListScreen> {
final RefreshController _refreshController = RefreshController(initialRefresh: false);
final Map<int, String> advancedSearchViews = {};
final Map<int, String> advancedSearchSearchBy = {};
final Map<String, String> 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();
@override
void initState() {
super.initState();
providerData = Provider.of<DashboardProviderModel>(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() {
@ -132,7 +162,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
}
} else {
itgRequestTypeIndex = null;
workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key);
workList = await WorkListApiClient().getWorkList(pageNumber, workListItemTypes[workListItemIndex].key, selectedViewID.toString());
AppState().setWorkList = workList;
}
if (showLoading) Utils.hideLoading(context);
@ -183,6 +213,7 @@ class _WorkListScreenState extends State<WorkListScreen> {
SizedBox(
height: 40,
child: ListView.separated(
controller: _controller,
itemBuilder: (context, index) {
return Container(
padding: const EdgeInsets.only(left: 21, right: 21, top: 8, bottom: 8),
@ -213,7 +244,15 @@ class _WorkListScreenState extends State<WorkListScreen> {
padding: const EdgeInsets.only(left: 21, right: 21),
),
).paddingOnly(top: 21, bottom: 21),
workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
workListItemTypes[workListItemIndex].fullName.toSectionHeading().paddingOnly(left: 21, right: 21),
LocaleKeys.advancedSearch.tr().toText14(isUnderLine: true).onPress(() {
openBottomSheet(context);
}).paddingOnly(left: 21, right: 21)
],
),
SmartRefresher(
enablePullDown: true,
enablePullUp: false,
@ -364,6 +403,147 @@ class _WorkListScreenState extends State<WorkListScreen> {
);
}
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<int>>[
PopupMenuItem<int>(value: 1, child: Text(LocaleKeys.openNot.tr())),
PopupMenuItem<int>(value: 2, child: Text(LocaleKeys.fyi.tr())),
PopupMenuItem<int>(value: 3, child: Text(LocaleKeys.toDo.tr())),
PopupMenuItem<int>(value: 4, child: Text(LocaleKeys.all.tr())),
PopupMenuItem<int>(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<int>>[
PopupMenuItem<int>(value: 1, child: Text(LocaleKeys.fromUserName.tr())),
PopupMenuItem<int>(value: 2, child: Text(LocaleKeys.subject.tr())),
PopupMenuItem<int>(value: 3, child: Text(LocaleKeys.sentDate.tr())),
PopupMenuItem<int>(value: 4, child: Text(LocaleKeys.itemTypeDisplayName.tr())),
PopupMenuItem<int>(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: (_) => <PopupMenuItem<String>>[
const PopupMenuItem<String>(value: "HRSSA", child: Text("HR")),
const PopupMenuItem<String>(value: "POAPPRV", child: Text("PO")),
const PopupMenuItem<String>(value: "REQAPPRV", child: Text("PR")),
const PopupMenuItem<String>(value: "INVMOA", child: Text("MR")),
const PopupMenuItem<String>(value: "INVITEM", child: Text("IC")),
const PopupMenuItem<String>(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(() {});
})
],
),
),
);
}
Widget rowItem(WorkListItemTypeModelData data, WorkListResponseModel workData, int index) {
return InkWell(
onTap: () async {
@ -442,4 +622,141 @@ class _WorkListScreenState extends State<WorkListScreen> {
),
);
}
void _animateToIndex(int index, double width) {
_controller.animateTo(
index * width,
duration: const Duration(seconds: 1),
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<DateTime> _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 "";
}
}
}

Loading…
Cancel
Save