diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index a774c529..e394c80a 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -35,23 +35,31 @@ class AllRequestsProvider extends ChangeNotifier { getCloseRequests(); } - Future getAllRequests({int typeTransaction, SearchAllRequestsModel search}) async { + Future 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 status = (search?.statuses == null || search.statuses.isEmpty) ? [1, 2, 3, 4] : search.statuses; Map 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); diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index f4f5c82e..46e6951d 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -360,6 +360,7 @@ "requestGasRefill" : "طلب اعادة تعبئة غاز", "trackGasRefill" : "تتبع طلبات اعادة تعبئة غاز", "trackAssetTransfer" : "تتبع نقل اجهزة", - "total" : "مجموع" - + "total" : "مجموع", + "allRequests" : "كل الطلبات", + "requestStatus" : "حالة الطلب" } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 01732e16..45d0c4a0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -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" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 060cdb56..afc346a1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -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: () { diff --git a/lib/models/search_all_requests_model.dart b/lib/models/search_all_requests_model.dart index 9254fc7d..0b524a79 100644 --- a/lib/models/search_all_requests_model.dart +++ b/lib/models/search_all_requests_model.dart @@ -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 statuses; + List 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); } diff --git a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart index d921ade1..274fb202 100644 --- a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart +++ b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart @@ -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 createState() => _AllRequestsFilterPageState(); } class _AllRequestsFilterPageState extends State { - // 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 { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - /// todo : TBD - EquipmentStatusButtons(onSelect: (value) { - if (value == null) { - /// the selected value is [All Assets] - } - }), - 16.height, - SingleItemDropDownMenu( - 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( - 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 { } void _search() async { - // filter.site = _site?.name; - // filter.department = _department?.departmentName; - final deviceProvider = Provider.of(context, listen: false); - deviceProvider.reset(); + final requestsProvider = Provider.of(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); } } diff --git a/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart b/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart index dc535c25..2bfedc68 100644 --- a/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart +++ b/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart @@ -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 { sn: SearchBySNModel(context), model: SearchByRequestModel(context), ); - search.selectedValue = search.requestNumber; + search.searchBySelectedValue = search.requestNumber; } return Scaffold( @@ -60,21 +60,21 @@ class _AllRequestsSearchPageState extends State { 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 { if (_formKey.currentState.validate()) { _formKey.currentState.save(); final requestsProvider = Provider.of(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); } diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index 04c5d95d..71e39ad2 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -25,7 +25,7 @@ class _MyRequestsPageState extends State { Widget build(BuildContext context) { if (_provider == null) { _provider = Provider.of(context, listen: false); - _provider.getAllRequests(); + _provider.getAllRequests(context); } return Scaffold( @@ -60,20 +60,16 @@ class _MyRequestsPageState extends State { 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), diff --git a/lib/new_views/pages/land_page/widgets/requests_search_button.dart b/lib/new_views/pages/land_page/widgets/request_search_buttons.dart similarity index 100% rename from lib/new_views/pages/land_page/widgets/requests_search_button.dart rename to lib/new_views/pages/land_page/widgets/request_search_buttons.dart diff --git a/lib/new_views/pages/land_page/widgets/static_filter_buttons.dart b/lib/new_views/pages/land_page/widgets/static_filter_buttons.dart new file mode 100644 index 00000000..9bc0aaf3 --- /dev/null +++ b/lib/new_views/pages/land_page/widgets/static_filter_buttons.dart @@ -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) onSelect; + final Map items; + final List initialValues; + + const RequestsTypeFilter({Key key, @required this.items, this.initialValues, this.onSelect}) : super(key: key); + + @override + State createState() => _RequestsTypeFilterState(); +} + +class _RequestsTypeFilterState extends State { + List _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(), + ); + } +} diff --git a/lib/providers/service_request_providers/request_status_provider.dart b/lib/providers/service_request_providers/request_status_provider.dart new file mode 100644 index 00000000..bc6061ab --- /dev/null +++ b/lib/providers/service_request_providers/request_status_provider.dart @@ -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 { + @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; + } + } +}