From e29946e280a656b337ddfaf254e9311226b85a65 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 13 Nov 2023 11:03:26 +0300 Subject: [PATCH] Search All Requests Done --- .../providers/api/all_requests_provider.dart | 12 +- lib/l10n/app_en.arb | 2 +- lib/models/search_all_requests_model.dart | 46 ++++++++ lib/new_views/pages/land_page/land_page.dart | 42 +++---- .../my_request/all_requests_filter_page.dart | 110 ++++++++++++++++++ .../my_request/all_requests_search_page.dart | 101 ++++++++++++++++ .../my_request/my_requests_page.dart | 35 +++--- .../widgets/requests_search_button.dart | 67 +++++++++++ .../equipment/single_device_picker.dart | 2 +- 9 files changed, 372 insertions(+), 45 deletions(-) create mode 100644 lib/models/search_all_requests_model.dart create mode 100644 lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart create mode 100644 lib/new_views/pages/land_page/my_request/all_requests_search_page.dart create mode 100644 lib/new_views/pages/land_page/widgets/requests_search_button.dart diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 2519da64..a774c529 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -6,6 +6,8 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; +import '../../../models/search_all_requests_model.dart'; + class AllRequestsProvider extends ChangeNotifier { bool isAllLoading = false; bool isOpenLoading = false; @@ -33,7 +35,7 @@ class AllRequestsProvider extends ChangeNotifier { getCloseRequests(); } - Future getAllRequests({int typeTransaction}) async { + Future getAllRequests({int typeTransaction, SearchAllRequestsModel search}) async { if (isAllLoading == true) return -2; isAllLoading = true; if (allRequestsAndCount == null) notifyListeners(); @@ -43,7 +45,13 @@ class AllRequestsProvider extends ChangeNotifier { "typeTransaction": typeTransaction == null ? [1, 2, 3, 4] : [typeTransaction], "statusTransaction": [1, 2, 3], "priority": [0, 1], - "displayData": [] + "displayData": [], + 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, }; response = await ApiManager.instance.post(URLs.getAllRequestsAndCount, body: body); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 0ad23442..01732e16 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -217,7 +217,7 @@ "requiredField" : "Required Field", "passwordLengthMessage" : "Password must has at least 6 characters", "overview" : "Overview", - "myRequests" : "My Request", + "myRequests" : "My Requests", "myAssets" : "My Assets", "contactUs": "Contact Us", "welcome" : "Welcome,", diff --git a/lib/models/search_all_requests_model.dart b/lib/models/search_all_requests_model.dart new file mode 100644 index 00000000..72c84237 --- /dev/null +++ b/lib/models/search_all_requests_model.dart @@ -0,0 +1,46 @@ +import 'package:flutter/cupertino.dart'; +import 'package:test_sa/extensions/context_extension.dart'; + +class SearchAllRequestsModel { + SearchByRequestNumberModel requestNumber; + SearchByAssetNameModel assetName; + SearchByAssetNoModel assetNo; + SearchByManufactureModel manufacture; + SearchBySNModel sn; + SearchByRequestModel model; + SearchAllRequestsBaseModel selectedValue; + + SearchAllRequestsModel({this.requestNumber, this.assetName, this.assetNo, this.manufacture, this.sn, this.model}); +} + +abstract class SearchAllRequestsBaseModel { + String label; + String value; + BuildContext context; + TextInputType inputType; + SearchAllRequestsBaseModel(BuildContext context, {this.label, this.value, this.inputType = TextInputType.text}); +} + +class SearchByRequestNumberModel extends SearchAllRequestsBaseModel { + SearchByRequestNumberModel(BuildContext context, {String value = "0"}) : super(context, label: "${context.translation.requestNo}.", value: value?.toString()); +} + +class SearchByAssetNameModel extends SearchAllRequestsBaseModel { + SearchByAssetNameModel(BuildContext context, {String value = "0"}) : 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); +} + +class SearchByManufactureModel extends SearchAllRequestsBaseModel { + SearchByManufactureModel(BuildContext context, {String value = "0"}) : 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); +} + +class SearchByRequestModel extends SearchAllRequestsBaseModel { + SearchByRequestModel(BuildContext context, {String value = "0"}) : super(context, label: context.translation.model, value: value); +} diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index 632a6aa7..9508f7f3 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -1,22 +1,16 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/new_views/pages/land_page/calendar_page.dart'; -import 'package:test_sa/new_views/pages/land_page/home_app_bar.dart'; -import 'package:test_sa/new_views/pages/land_page/my_assets_page.dart'; import 'package:test_sa/new_views/pages/land_page/my_request/my_requests_page.dart'; -import 'package:test_sa/views/pages/device_transfer/asset_search_screen.dart'; -import 'package:test_sa/views/pages/user/land_page.dart' as old_page; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; +import '../../../controllers/providers/settings/setting_provider.dart'; +import '../../../views/widgets/dialogs/dialog.dart'; import '../../common_widgets/app_bottom_nav_bar.dart'; import '../../common_widgets/app_drawer.dart'; -import '../../common_widgets/app_floating_action_button.dart'; import 'contact_us_bottom_sheet.dart'; import 'dashboard_page.dart'; @@ -50,30 +44,24 @@ class _LandPageState extends State { DashboardPage(onDrawerPress: (() { _scaffoldKey.currentState.isDrawerOpen ? _scaffoldKey.currentState.closeDrawer() : _scaffoldKey.currentState.openDrawer(); })), - // old_page.LandPage(), - MyRequestsPage(), - SingleDevicePicker(), - if (_userProvider.user.type == UsersTypes.engineer) CalendarPage(), + // const old_page.LandPage(), MyRequestsPage(), + const SingleDevicePicker(), + if (_userProvider.user.type == UsersTypes.engineer) const CalendarPage(), ]; } return WillPopScope( onWillPop: () async { - /// TODO [zaid] : show dialog before exit - // bool result = await showDialog( - // context: context, - // builder: (_) => const AAlertDialog( - // title: "_subtitle.exit", - // content: "_subtitle.exitAlert", - // ), - // ); - if (true) { - if (Platform.isAndroid) { - SystemChannels.platform.invokeMethod('SystemNavigator.pop'); - } else { - exit(0); - } + bool result = await showDialog( + context: context, + builder: (_) => AAlertDialog(title: context.translation.signOut, content: context.translation.logoutAlert), + ); + if (result) { + Provider.of(context, listen: false).resetSettings(); + Provider.of(context, listen: false).reset(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); } return false; }, 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 new file mode 100644 index 00000000..d921ade1 --- /dev/null +++ b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart @@ -0,0 +1,110 @@ +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/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/views/widgets/date_and_time/date_picker.dart'; + +import '../../../../views/widgets/equipment/equipment_status_buttons.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); + + @override + State createState() => _AllRequestsFilterPageState(); +} + +class _AllRequestsFilterPageState extends State { + // AssetSearch filter; + Site _site; + Department _department; + @override + void initState() { + // filter = widget.data ?? AssetSearch(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: DefaultAppBar(title: context.translation.filter), + body: Column( + children: [ + SingleChildScrollView( + 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, + onSelect: (value) { + _department = value; + }, + ).paddingOnly(start: 16, end: 16), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.bySite, + initialValue: _site, + onSelect: (value) { + _site = value; + }, + ).paddingOnly(start: 16, end: 16), + 16.height, + context.translation.pmDateRange.heading5(context).paddingOnly(start: 16, end: 16), + 8.height, + + /// todo : TBD + Row( + children: [ + ADatePicker( + label: context.translation.from, + onDatePicker: (date) {}, + ).expanded, + 8.width, + ADatePicker( + label: context.translation.to, + onDatePicker: (date) {}, + ).expanded, + ], + ).paddingOnly(start: 16, end: 16), + ], + ), + ).expanded, + AppFilledButton(onPressed: _search, label: context.translation.applyFilter).paddingOnly(start: 16, end: 16), + ], + ).paddingOnly(top: 16, bottom: 16), + ); + } + + void _search() async { + // filter.site = _site?.name; + // filter.department = _department?.departmentName; + final deviceProvider = Provider.of(context, listen: false); + deviceProvider.reset(); + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + // await deviceProvider.getAssets(search: filter); + Navigator.pop(context); + // Navigator.of(context).pop(filter); + } +} 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 new file mode 100644 index 00000000..dc535c25 --- /dev/null +++ b/lib/new_views/pages/land_page/my_request/all_requests_search_page.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/all_requests_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/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'; + +class AllRequestsSearchPage extends StatefulWidget { + static const String id = "all_requests_search_page"; + final SearchAllRequestsModel data; + const AllRequestsSearchPage({Key key, this.data}) : super(key: key); + + @override + State createState() => _AllRequestsSearchPageState(); +} + +class _AllRequestsSearchPageState extends State { + SearchAllRequestsModel search; + final GlobalKey _formKey = GlobalKey(); + + @override + void initState() { + search = widget.data; + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (search == null) { + search = SearchAllRequestsModel( + requestNumber: SearchByRequestNumberModel(context), + assetName: SearchByAssetNameModel(context), + assetNo: SearchByAssetNoModel(context), + manufacture: SearchByManufactureModel(context), + sn: SearchBySNModel(context), + model: SearchByRequestModel(context), + ); + search.selectedValue = search.requestNumber; + } + + return Scaffold( + appBar: DefaultAppBar(title: context.translation.search), + body: Form( + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + context.translation.searchBy.heading5(context), + 8.height, + RequestsSearchButtons( + items: [search.requestNumber, search.assetName, search.assetNo, search.manufacture, search.sn, search.model], + initialValue: search.selectedValue, + onSelect: (value) { + if (search.selectedValue != value) { + search.selectedValue = value; + setState(() {}); + } + }, + ), + 16.height, + AppTextFormField( + controller: TextEditingController(text: search.selectedValue.value), + labelText: search.selectedValue.label, + textInputType: search.selectedValue.inputType, + onSaved: (value) { + search.selectedValue.value = value; + }, + ), + ], + ), + ).expanded, + AppFilledButton(onPressed: _search, label: context.translation.search), + ], + ).paddingAll(16), + ), + ); + } + + void _search() async { + 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); + 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 50538d33..04c5d95d 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 @@ -5,12 +5,21 @@ 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/search_all_requests_model.dart'; +import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_filter_page.dart'; +import 'package:test_sa/new_views/pages/land_page/my_request/all_requests_search_page.dart'; import 'package:test_sa/new_views/pages/land_page/widgets/request_item_view_list.dart'; -class MyRequestsPage extends StatelessWidget { - MyRequestsPage({Key key}) : super(key: key); +class MyRequestsPage extends StatefulWidget { + const MyRequestsPage({Key key}) : super(key: key); + @override + State createState() => _MyRequestsPageState(); +} + +class _MyRequestsPageState extends State { AllRequestsProvider _provider; + SearchAllRequestsModel _search; @override Widget build(BuildContext context) { @@ -31,10 +40,8 @@ class MyRequestsPage extends StatelessWidget { padding: const EdgeInsets.only(left: 16, right: 8), alignment: Alignment.center, decoration: ShapeDecoration( - color: Color(0xFFEAF1F4), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), + color: const Color(0xFFEAF1F4), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), ), child: Row( children: [ @@ -49,10 +56,10 @@ class MyRequestsPage extends StatelessWidget { ], ), ).onPress(() async { - // final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetSearchScreen(data: _searchAsset))); - // if (result != null) { - // _searchAsset = result; - // } + final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AllRequestsSearchPage(data: _search))); + if (result != null) { + _search = result; + } // _searchableList.clear(); // _searchableList.addAll(_devicesProvider.devices); }).expanded, @@ -61,10 +68,10 @@ class MyRequestsPage extends StatelessWidget { context.translation.filter, style: AppTextStyles.bodyText2.copyWith(color: const Color(0xFF4A8DB7)), ).onPress(() async { - // final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => AssetFilterScreen(data: _searchAsset))); - // if (result != null) { - // _searchAsset = result; - // } + final result = await Navigator.push(context, MaterialPageRoute(builder: (context) => const AllRequestsFilterPage())); + if (result != null) { + // _searchAsset = result; + } // _searchableList.clear(); // _searchableList.addAll(_devicesProvider.devices); }), diff --git a/lib/new_views/pages/land_page/widgets/requests_search_button.dart b/lib/new_views/pages/land_page/widgets/requests_search_button.dart new file mode 100644 index 00000000..518e09bc --- /dev/null +++ b/lib/new_views/pages/land_page/widgets/requests_search_button.dart @@ -0,0 +1,67 @@ +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 '../../../../models/search_all_requests_model.dart'; +import '../../../app_style/app_color.dart'; + +class RequestsSearchButtons extends StatefulWidget { + final Function(SearchAllRequestsBaseModel) onSelect; + final List items; + final SearchAllRequestsBaseModel initialValue; + + const RequestsSearchButtons({Key key, @required this.items, this.initialValue, this.onSelect}) : super(key: key); + + @override + State createState() => _RequestsSearchButtonsState(); +} + +class _RequestsSearchButtonsState extends State { + SearchAllRequestsBaseModel _data; + + @override + void initState() { + _data = widget.initialValue; + super.initState(); + } + + @override + void didUpdateWidget(covariant RequestsSearchButtons oldWidget) { + if (widget.initialValue != oldWidget.initialValue) { + setState(() { + _data = widget.initialValue; + }); + } + super.didUpdateWidget(oldWidget); + } + + @override + Widget build(BuildContext context) { + return Wrap( + spacing: 8.toScreenWidth, + runSpacing: 8.toScreenHeight, + children: widget.items + .map( + (data) => Container( + padding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: (_data == data ? 12 : 8).toScreenWidth), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(7), + color: _data == data ? AppColor.neutral30 : Colors.white, + border: _data == data ? Border.all(width: 1, color: AppColor.primary50) : null, + boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.03), blurRadius: 14)], + ), + child: data.label.tinyFont(context).custom(color: AppColor.neutral50), + ).onPress( + () { + setState(() { + _data = data; + }); + widget.onSelect(data); + }, + ), + ) + .toList(), + ); + } +} diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 489b12cc..c6a3069d 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -172,7 +172,7 @@ class _SingleDevicePickerState extends State { return AssetItemListView( device: _searchableList[itemIndex], onPressed: (device) { - Navigator.of(context).pop(device); + Navigator.of(context).pushNamed(AssetDetailPage.id, arguments: device.id); }, ); },