Filter Requests DONE

main_design2.0
zaid_daoud 2 years ago
parent cc089d917f
commit dbb26d8cd4

@ -35,23 +35,31 @@ class AllRequestsProvider extends ChangeNotifier {
getCloseRequests();
}
Future<int> getAllRequests({int typeTransaction, SearchAllRequestsModel search}) async {
Future<int> getAllRequests(BuildContext context, {int typeTransaction, SearchAllRequestsModel search}) async {
if (isAllLoading == true) return -2;
isAllLoading = true;
if (allRequestsAndCount == null) notifyListeners();
Response response;
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 = {
"typeTransaction": typeTransaction == null ? [1, 2, 3, 4] : [typeTransaction],
"statusTransaction": [1, 2, 3],
"typeTransaction": type,
"statusTransaction": status,
"priority": [0, 1],
"displayData": [],
"displayData": status,
if (search?.requestNumber?.value?.isNotEmpty ?? false) "requestNumber": search.requestNumber.value,
if (search?.assetName?.value?.isNotEmpty ?? false) "assetName": search.assetName.value,
if (search?.assetNo?.value?.isNotEmpty ?? false) "assetNumber": search.assetNo.value,
if (search?.sn?.value?.isNotEmpty ?? false) "assetSerialNo": search.sn.value,
if (search?.model?.value?.isNotEmpty ?? false) "model": search.model.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);

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

@ -360,5 +360,7 @@
"requestGasRefill" : "Request Gas Refill",
"trackGasRefill" : "Track Gas Refill",
"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/loan_availability_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/type_of_request_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: (_) => PPMDeviceStatusProvider()),
ChangeNotifierProvider(create: (_) => CommentsProvider()),
ChangeNotifierProvider(create: (_) => RequestStatusProvider()),
],
child: GestureDetector(
onTap: () {

@ -8,9 +8,23 @@ class SearchAllRequestsModel {
SearchByManufactureModel manufacture;
SearchBySNModel sn;
SearchByRequestModel model;
SearchAllRequestsBaseModel selectedValue;
SearchAllRequestsModel({this.requestNumber, this.assetName, this.assetNo, this.manufacture, this.sn, this.model});
SearchAllRequestsBaseModel searchBySelectedValue;
List<int> statuses;
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 {
@ -22,25 +36,25 @@ abstract class 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 {
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 {
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 {
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 {
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 {
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: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/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/new_models/department.dart';
import 'package:test_sa/models/new_models/site.dart';
import 'package:test_sa/models/search_all_requests_model.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/providers/department_provider.dart';
import 'package:test_sa/providers/gas_request_providers/site_provider.dart';
import 'package:test_sa/new_views/pages/land_page/widgets/static_filter_buttons.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/default_app_bar.dart';
class AllRequestsFilterPage extends StatefulWidget {
static const String id = "all_requests_filter_page";
// final AssetSearch data;
const AllRequestsFilterPage({Key key}) : super(key: key);
final SearchAllRequestsModel data;
const AllRequestsFilterPage({Key key, this.data}) : super(key: key);
@override
State<AllRequestsFilterPage> createState() => _AllRequestsFilterPageState();
}
class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
// AssetSearch filter;
Site _site;
Department _department;
SearchAllRequestsModel search;
@override
void initState() {
// filter = widget.data ?? AssetSearch();
search = widget.data;
super.initState();
}
@override
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(
appBar: DefaultAppBar(title: context.translation.filter),
body: Column(
@ -46,50 +63,65 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
/// todo : TBD
EquipmentStatusButtons(onSelect: (value) {
if (value == null) {
/// the selected value is [All Assets]
}
}),
16.height,
SingleItemDropDownMenu<Department, DepartmentProvider>(
context: context,
title: context.translation.byDepartment,
initialValue: _department,
context.translation.requestStatus.heading5(context),
8.height,
RequestsTypeFilter(
initialValues: search.statuses,
items: statuses,
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,
SingleItemDropDownMenu<Site, SiteProvider>(
context: context,
title: context.translation.bySite,
initialValue: _site,
RequestsTypeFilter(
initialValues: search.typeTransaction,
items: types,
onSelect: (value) {
_site = value;
search.typeTransaction = value;
},
).paddingOnly(start: 16, end: 16),
),
16.height,
context.translation.pmDateRange.heading5(context).paddingOnly(start: 16, end: 16),
context.translation.pickDate.heading5(context),
8.height,
/// todo : TBD
Row(
children: [
ADatePicker(
label: context.translation.from,
onDatePicker: (date) {},
from: DateTime(2000),
date: search.startDate,
onDatePicker: (date) {
setState(() {
search.startDate = date;
});
},
).expanded,
8.width,
ADatePicker(
label: context.translation.to,
onDatePicker: (date) {},
from: DateTime(2000),
date: search.endDate,
onDatePicker: (date) {
setState(() {
search.endDate = date;
});
},
).expanded,
],
).paddingOnly(start: 16, end: 16),
),
],
),
).paddingOnly(start: 16, end: 16),
).expanded,
AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16),
],
@ -98,13 +130,11 @@ class _AllRequestsFilterPageState extends State<AllRequestsFilterPage> {
}
void _search() async {
// filter.site = _site?.name;
// filter.department = _department?.departmentName;
final deviceProvider = Provider.of<AssetProvider>(context, listen: false);
deviceProvider.reset();
final requestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
search.endDate ??= DateTime.now();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
// await deviceProvider.getAssets(search: filter);
await requestsProvider.getAllRequests(context, search: search);
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/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/pages/land_page/widgets/requests_search_button.dart';
import '../../../../models/search_all_requests_model.dart';
import '../../../common_widgets/app_lazy_loading.dart';
import '../../../common_widgets/default_app_bar.dart';
import '../widgets/request_search_buttons.dart';
class AllRequestsSearchPage extends StatefulWidget {
static const String id = "all_requests_search_page";
@ -43,7 +43,7 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
sn: SearchBySNModel(context),
model: SearchByRequestModel(context),
);
search.selectedValue = search.requestNumber;
search.searchBySelectedValue = search.requestNumber;
}
return Scaffold(
@ -60,21 +60,21 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
8.height,
RequestsSearchButtons(
items: [search.requestNumber, search.assetName, search.assetNo, search.manufacture, search.sn, search.model],
initialValue: search.selectedValue,
initialValue: search.searchBySelectedValue,
onSelect: (value) {
if (search.selectedValue != value) {
search.selectedValue = value;
if (search.searchBySelectedValue != value) {
search.searchBySelectedValue = value;
setState(() {});
}
},
),
16.height,
AppTextFormField(
controller: TextEditingController(text: search.selectedValue.value),
labelText: search.selectedValue.label,
textInputType: search.selectedValue.inputType,
controller: TextEditingController(text: search.searchBySelectedValue.value),
labelText: search.searchBySelectedValue.label,
textInputType: search.searchBySelectedValue.inputType,
onSaved: (value) {
search.selectedValue.value = value;
search.searchBySelectedValue.value = value;
},
),
],
@ -91,9 +91,8 @@ class _AllRequestsSearchPageState extends State<AllRequestsSearchPage> {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
final requestsProvider = Provider.of<AllRequestsProvider>(context, listen: false);
// requestsProvider.reset();
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
await requestsProvider.getAllRequests(search: search);
await requestsProvider.getAllRequests(context, search: search);
Navigator.pop(context);
Navigator.of(context).pop(search);
}

@ -25,7 +25,7 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
Widget build(BuildContext context) {
if (_provider == null) {
_provider = Provider.of<AllRequestsProvider>(context, listen: false);
_provider.getAllRequests();
_provider.getAllRequests(context);
}
return Scaffold(
@ -60,20 +60,16 @@ class _MyRequestsPageState extends State<MyRequestsPage> {
if (result != null) {
_search = result;
}
// _searchableList.clear();
// _searchableList.addAll(_devicesProvider.devices);
}).expanded,
16.width,
Text(
context.translation.filter,
style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)),
).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) {
// _searchAsset = result;
_search = result;
}
// _searchableList.clear();
// _searchableList.addAll(_devicesProvider.devices);
}),
],
).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