Filter Requests DONE

main_design2.0
zaid_daoud 2 years ago
parent cc089d917f
commit dbb26d8cd4

@ -35,23 +35,31 @@ class AllRequestsProvider extends ChangeNotifier {
getCloseRequests(); getCloseRequests();
} }
Future<int> getAllRequests({int typeTransaction, SearchAllRequestsModel search}) async { Future<int> getAllRequests(BuildContext context, {int typeTransaction, SearchAllRequestsModel search}) async {
if (isAllLoading == true) return -2; if (isAllLoading == true) return -2;
isAllLoading = true; isAllLoading = true;
if (allRequestsAndCount == null) notifyListeners(); if (allRequestsAndCount == null) notifyListeners();
Response response; Response response;
try { try {
final type = typeTransaction == null
? search?.typeTransaction == null || search.typeTransaction.isEmpty
? [1, 2, 3, 4]
: search.typeTransaction
: [typeTransaction];
List<int> status = (search?.statuses == null || search.statuses.isEmpty) ? [1, 2, 3, 4] : search.statuses;
Map<String, dynamic> body = { Map<String, dynamic> body = {
"typeTransaction": typeTransaction == null ? [1, 2, 3, 4] : [typeTransaction], "typeTransaction": type,
"statusTransaction": [1, 2, 3], "statusTransaction": status,
"priority": [0, 1], "priority": [0, 1],
"displayData": [], "displayData": status,
if (search?.requestNumber?.value?.isNotEmpty ?? false) "requestNumber": search.requestNumber.value, if (search?.requestNumber?.value?.isNotEmpty ?? false) "requestNumber": search.requestNumber.value,
if (search?.assetName?.value?.isNotEmpty ?? false) "assetName": search.assetName.value, if (search?.assetName?.value?.isNotEmpty ?? false) "assetName": search.assetName.value,
if (search?.assetNo?.value?.isNotEmpty ?? false) "assetNumber": search.assetNo.value, if (search?.assetNo?.value?.isNotEmpty ?? false) "assetNumber": search.assetNo.value,
if (search?.sn?.value?.isNotEmpty ?? false) "assetSerialNo": search.sn.value, if (search?.sn?.value?.isNotEmpty ?? false) "assetSerialNo": search.sn.value,
if (search?.model?.value?.isNotEmpty ?? false) "model": search.model.value, if (search?.model?.value?.isNotEmpty ?? false) "model": search.model.value,
if (search?.manufacture?.value?.isNotEmpty ?? false) "manufacturer": search.manufacture.value, if (search?.manufacture?.value?.isNotEmpty ?? false) "manufacturer": search.manufacture.value,
if (search?.startDate != null) "from": search.startDate.toIso8601String(),
if (search?.endDate != null) "to": search.endDate.toIso8601String(),
}; };
response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body); response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body);

@ -360,6 +360,7 @@
"requestGasRefill" : "طلب اعادة تعبئة غاز", "requestGasRefill" : "طلب اعادة تعبئة غاز",
"trackGasRefill" : "تتبع طلبات اعادة تعبئة غاز", "trackGasRefill" : "تتبع طلبات اعادة تعبئة غاز",
"trackAssetTransfer" : "تتبع نقل اجهزة", "trackAssetTransfer" : "تتبع نقل اجهزة",
"total" : "مجموع" "total" : "مجموع",
"allRequests" : "كل الطلبات",
"requestStatus" : "حالة الطلب"
} }

@ -360,5 +360,7 @@
"requestGasRefill" : "Request Gas Refill", "requestGasRefill" : "Request Gas Refill",
"trackGasRefill" : "Track Gas Refill", "trackGasRefill" : "Track Gas Refill",
"trackAssetTransfer" : "Track Asset Transfer", "trackAssetTransfer" : "Track Asset Transfer",
"total" : "Total" "total" : "Total",
"allRequests" : "All Requests",
"requestStatus" : "Request Status"
} }

@ -64,6 +64,7 @@ import 'package:test_sa/providers/service_request_providers/equipment_status_pro
import 'package:test_sa/providers/service_request_providers/first_action_provider.dart'; import 'package:test_sa/providers/service_request_providers/first_action_provider.dart';
import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart'; import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart';
import 'package:test_sa/providers/service_request_providers/priority_provider.dart'; import 'package:test_sa/providers/service_request_providers/priority_provider.dart';
import 'package:test_sa/providers/service_request_providers/request_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart';
import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart'; import 'package:test_sa/providers/service_request_providers/type_of_request_provider.dart';
import 'package:test_sa/providers/work_order/reason_provider.dart'; import 'package:test_sa/providers/work_order/reason_provider.dart';
@ -189,6 +190,7 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()),
ChangeNotifierProvider(create: (_) => PPMDeviceStatusProvider()), ChangeNotifierProvider(create: (_) => PPMDeviceStatusProvider()),
ChangeNotifierProvider(create: (_) => CommentsProvider()), ChangeNotifierProvider(create: (_) => CommentsProvider()),
ChangeNotifierProvider(create: (_) => RequestStatusProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {

@ -8,9 +8,23 @@ class SearchAllRequestsModel {
SearchByManufactureModel manufacture; SearchByManufactureModel manufacture;
SearchBySNModel sn; SearchBySNModel sn;
SearchByRequestModel model; SearchByRequestModel model;
SearchAllRequestsBaseModel selectedValue; SearchAllRequestsBaseModel searchBySelectedValue;
List<int> statuses;
SearchAllRequestsModel({this.requestNumber, this.assetName, this.assetNo, this.manufacture, this.sn, this.model}); List<int> typeTransaction;
DateTime startDate, endDate;
SearchAllRequestsModel({
this.requestNumber,
this.assetName,
this.assetNo,
this.manufacture,
this.sn,
this.model,
this.statuses,
this.typeTransaction,
this.startDate,
this.endDate,
});
} }
abstract class SearchAllRequestsBaseModel { abstract class SearchAllRequestsBaseModel {
@ -22,25 +36,25 @@ abstract class SearchAllRequestsBaseModel {
} }
class SearchByRequestNumberModel extends SearchAllRequestsBaseModel { class SearchByRequestNumberModel extends SearchAllRequestsBaseModel {
SearchByRequestNumberModel(BuildContext context, {String value = "0"}) : super(context, label: "${context.translation.requestNo}.", value: value?.toString()); SearchByRequestNumberModel(BuildContext context, {String value}) : super(context, label: "${context.translation.requestNo}.", value: value);
} }
class SearchByAssetNameModel extends SearchAllRequestsBaseModel { class SearchByAssetNameModel extends SearchAllRequestsBaseModel {
SearchByAssetNameModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.assetName, value: value); SearchByAssetNameModel(BuildContext context, {String value}) : super(context, label: context.translation.assetName, value: value);
} }
class SearchByAssetNoModel extends SearchAllRequestsBaseModel { class SearchByAssetNoModel extends SearchAllRequestsBaseModel {
SearchByAssetNoModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.assetNo, value: value, inputType: TextInputType.number); SearchByAssetNoModel(BuildContext context, {String value}) : super(context, label: context.translation.assetNo, value: value);
} }
class SearchByManufactureModel extends SearchAllRequestsBaseModel { class SearchByManufactureModel extends SearchAllRequestsBaseModel {
SearchByManufactureModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.manufacture, value: value); SearchByManufactureModel(BuildContext context, {String value}) : super(context, label: context.translation.manufacture, value: value);
} }
class SearchBySNModel extends SearchAllRequestsBaseModel { class SearchBySNModel extends SearchAllRequestsBaseModel {
SearchBySNModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.sn, value: value); SearchBySNModel(BuildContext context, {String value}) : super(context, label: context.translation.sn, value: value);
} }
class SearchByRequestModel extends SearchAllRequestsBaseModel { class SearchByRequestModel extends SearchAllRequestsBaseModel {
SearchByRequestModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.model, value: value); SearchByRequestModel(BuildContext context, {String value}) : super(context, label: context.translation.model, value: value);
} }

@ -1,43 +1,60 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/search_all_requests_model.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/new_views/pages/land_page/widgets/static_filter_buttons.dart';
import 'package:test_sa/providers/department_provider.dart';
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart';
import '../../../../views/widgets/equipment/equipment_status_buttons.dart'; import '../../../../controllers/providers/api/all_requests_provider.dart';
import '../../../common_widgets/app_lazy_loading.dart'; import '../../../common_widgets/app_lazy_loading.dart';
import '../../../common_widgets/default_app_bar.dart'; import '../../../common_widgets/default_app_bar.dart';
class AllRequestsFilterPage extends StatefulWidget { class AllRequestsFilterPage extends StatefulWidget {
static const String id = "all_requests_filter_page"; static const String id = "all_requests_filter_page";
// final AssetSearch data; final SearchAllRequestsModel data;
const AllRequestsFilterPage({Key key}) : super(key: key); const AllRequestsFilterPage({Key key, this.data}) : super(key: key);
@override @override
State<AllRequestsFilterPage> createState() => _AllRequestsFilterPageState(); State<AllRequestsFilterPage> createState() => _AllRequestsFilterPageState();
} }
class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> { class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
// AssetSearch filter; SearchAllRequestsModel search;
Site _site;
Department _department;
@override @override
void initState() { void initState() {
// filter = widget.data ?? AssetSearch(); search = widget.data;
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final types = {
context.translation.serviceRequest: 1,
context.translation.preventiveMaintenance: 4,
context.translation.gasRefill: 2,
};
final statuses = {
context.translation.allRequests: 0,
context.translation.open: 1,
context.translation.inProgress: 2,
context.translation.completed: 4,
context.translation.closed: 3,
};
if (search == null) {
search = SearchAllRequestsModel(
requestNumber: SearchByRequestNumberModel(context),
assetName: SearchByAssetNameModel(context),
assetNo: SearchByAssetNoModel(context),
manufacture: SearchByManufactureModel(context),
sn: SearchBySNModel(context),
model: SearchByRequestModel(context),
);
search.searchBySelectedValue = search.requestNumber;
}
return Scaffold( return Scaffold(
appBar: DefaultAppBar(title: context.translation.filter), appBar: DefaultAppBar(title: context.translation.filter),
body: Column( body: Column(
@ -46,50 +63,65 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
children: [ children: [
/// todo : TBD context.translation.requestStatus.heading5(context),
EquipmentStatusButtons(onSelect: (value) { 8.height,
if (value == null) { RequestsTypeFilter(
/// the selected value is [All Assets] initialValues: search.statuses,
} items: statuses,
}),
16.height,
SingleItemDropDownMenu<Department, DepartmentProvider>(
context: context,
title: context.translation.byDepartment,
initialValue: _department,
onSelect: (value) { onSelect: (value) {
_department = value; if (value.isNotEmpty && value.last == 0) {
setState(() {
search.statuses = [0];
});
} else if (value.contains(0)) {
setState(() {
search.statuses.remove(0);
});
} else {
search.statuses = value;
}
}, },
).paddingOnly(start: 16, end: 16), ),
16.height,
context.translation.typeOfRequest.heading5(context),
8.height, 8.height,
SingleItemDropDownMenu<Site, SiteProvider>( RequestsTypeFilter(
context: context, initialValues: search.typeTransaction,
title: context.translation.bySite, items: types,
initialValue: _site,
onSelect: (value) { onSelect: (value) {
_site = value; search.typeTransaction = value;
}, },
).paddingOnly(start: 16, end: 16), ),
16.height, 16.height,
context.translation.pmDateRange.heading5(context).paddingOnly(start: 16, end: 16), context.translation.pickDate.heading5(context),
8.height, 8.height,
/// todo : TBD
Row( Row(
children: [ children: [
ADatePicker( ADatePicker(
label: context.translation.from, label: context.translation.from,
onDatePicker: (date) {}, from: DateTime(2000),
date: search.startDate,
onDatePicker: (date) {
setState(() {
search.startDate = date;
});
},
).expanded, ).expanded,
8.width, 8.width,
ADatePicker( ADatePicker(
label: context.translation.to, label: context.translation.to,
onDatePicker: (date) {}, from: DateTime(2000),
date: search.endDate,
onDatePicker: (date) {
setState(() {
search.endDate = date;
});
},
).expanded, ).expanded,
], ],
).paddingOnly(start: 16, end: 16), ),
], ],
), ).paddingOnly(start: 16, end: 16),
).expanded, ).expanded,
AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16), AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16),
], ],
@ -98,13 +130,11 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
} }
void _search() async { void _search() async {
// filter.site = _site?.name; final requestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
// filter.department = _department?.departmentName; search.endDate ??= DateTime.now();
final deviceProvider = Provider.of<AssetProvider>(context, listen: false);
deviceProvider.reset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
// await deviceProvider.getAssets(search: filter); await requestsProvider.getAllRequests(context, search: search);
Navigator.pop(context); Navigator.pop(context);
// Navigator.of(context).pop(filter); Navigator.of(context).pop(search);
} }
} }

@ -7,11 +7,11 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/requests_search_button.dart';
import '../../../../models/search_all_requests_model.dart'; import '../../../../models/search_all_requests_model.dart';
import '../../../common_widgets/app_lazy_loading.dart'; import '../../../common_widgets/app_lazy_loading.dart';
import '../../../common_widgets/default_app_bar.dart'; import '../../../common_widgets/default_app_bar.dart';
import '../widgets/request_search_buttons.dart';
class AllRequestsSearchPage extends StatefulWidget { class AllRequestsSearchPage extends StatefulWidget {
static const String id = "all_requests_search_page"; static const String id = "all_requests_search_page";
@ -43,7 +43,7 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
sn: SearchBySNModel(context), sn: SearchBySNModel(context),
model: SearchByRequestModel(context), model: SearchByRequestModel(context),
); );
search.selectedValue = search.requestNumber; search.searchBySelectedValue = search.requestNumber;
} }
return Scaffold( return Scaffold(
@ -60,21 +60,21 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
8.height, 8.height,
RequestsSearchButtons( RequestsSearchButtons(
items: [search.requestNumber, search.assetName, search.assetNo, search.manufacture, search.sn, search.model], items: [search.requestNumber, search.assetName, search.assetNo, search.manufacture, search.sn, search.model],
initialValue: search.selectedValue, initialValue: search.searchBySelectedValue,
onSelect: (value) { onSelect: (value) {
if (search.selectedValue != value) { if (search.searchBySelectedValue != value) {
search.selectedValue = value; search.searchBySelectedValue = value;
setState(() {}); setState(() {});
} }
}, },
), ),
16.height, 16.height,
AppTextFormField( AppTextFormField(
controller: TextEditingController(text: search.selectedValue.value), controller: TextEditingController(text: search.searchBySelectedValue.value),
labelText: search.selectedValue.label, labelText: search.searchBySelectedValue.label,
textInputType: search.selectedValue.inputType, textInputType: search.searchBySelectedValue.inputType,
onSaved: (value) { onSaved: (value) {
search.selectedValue.value = value; search.searchBySelectedValue.value = value;
}, },
), ),
], ],
@ -91,9 +91,8 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
if (_formKey.currentState.validate()) { if (_formKey.currentState.validate()) {
_formKey.currentState.save(); _formKey.currentState.save();
final requestsProvider = Provider.of<AllRequestsProvider>(context, listen: false); final requestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
// requestsProvider.reset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await requestsProvider.getAllRequests(search: search); await requestsProvider.getAllRequests(context, search: search);
Navigator.pop(context); Navigator.pop(context);
Navigator.of(context).pop(search); Navigator.of(context).pop(search);
} }

@ -25,7 +25,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_provider == null) { if (_provider == null) {
_provider = Provider.of<AllRequestsProvider>(context, listen: false); _provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider.getAllRequests(); _provider.getAllRequests(context);
} }
return Scaffold( return Scaffold(
@ -60,20 +60,16 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
if (result != null) { if (result != null) {
_search = result; _search = result;
} }
// _searchableList.clear();
// _searchableList.addAll(_devicesProvider.devices);
}).expanded, }).expanded,
16.width, 16.width,
Text( Text(
context.translation.filter, context.translation.filter,
style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)), style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)),
).onPress(() async { ).onPress(() async {
final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => const AllRequestsFilterPage())); final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AllRequestsFilterPage(data: _search)));
if (result != null) { if (result != null) {
// _searchAsset = result; _search = result;
} }
// _searchableList.clear();
// _searchableList.addAll(_devicesProvider.devices);
}), }),
], ],
).paddingOnly(start: 16, end: 16), ).paddingOnly(start: 16, end: 16),

@ -0,0 +1,72 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import '../../../app_style/app_color.dart';
class RequestsTypeFilter extends StatefulWidget {
final Function(List<int>) onSelect;
final Map<String, int> items;
final List<int> initialValues;
const RequestsTypeFilter({Key key, @required this.items, this.initialValues, this.onSelect}) : super(key: key);
@override
State<RequestsTypeFilter> createState() => _RequestsTypeFilterState();
}
class _RequestsTypeFilterState extends State<RequestsTypeFilter> {
List<int> _selected = [];
@override
void initState() {
if (widget.initialValues != null) {
_selected.addAll(widget.initialValues);
}
super.initState();
}
@override
void didUpdateWidget(covariant RequestsTypeFilter oldWidget) {
if (widget.initialValues != oldWidget.initialValues) {
setState(() {
_selected = widget.initialValues ?? [];
});
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return Wrap(
spacing: 8.toScreenWidth,
runSpacing: 8.toScreenHeight,
children: widget.items.keys
.map(
(data) => Container(
padding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: (_selected.contains(widget.items[data]) ? 12 : 8).toScreenWidth),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(7),
color: _selected.contains(widget.items[data]) ? AppColor.neutral30 : Colors.white,
border: _selected.contains(widget.items[data]) ? Border.all(width: 1, color: AppColor.primary50) : null,
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)],
),
child: data.tinyFont(context).custom(color: AppColor.neutral50),
).onPress(
() {
if (_selected.contains(widget.items[data])) {
_selected.remove(widget.items[data]);
} else {
_selected.add(widget.items[data]);
}
setState(() {
widget.onSelect(_selected);
});
},
),
)
.toList(),
);
}
}

@ -0,0 +1,36 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart';
import '../../models/lookup.dart';
class RequestStatusProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() async {
if (loading == true) return -2;
loading = true;
notifyListeners();
loading = true;
notifyListeners();
try {
Response response = await ApiManager.instance.get(URLs.getServiceRequestStatus);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
}
Loading…
Cancel
Save