diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index c5677c75..cdd685bd 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; +import 'package:test_sa/models/device/device_transfer_search.dart'; import 'package:test_sa/models/user.dart'; import '../../../models/hospital.dart'; @@ -14,6 +15,8 @@ class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 12; + DeviceTransferSearch deviceTransferSearch = DeviceTransferSearch(); + //reset provider data void reset() { items = null; @@ -60,7 +63,6 @@ class DeviceTransferProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, - bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; @@ -70,6 +72,7 @@ class DeviceTransferProvider extends ChangeNotifier { Map body = {}; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; + body.addAll(deviceTransferSearch.toMap()); response = await ApiManager.instance.post( URLs.getDeviceTransfer, @@ -83,7 +86,7 @@ class DeviceTransferProvider extends ChangeNotifier { List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage.toSet().toList()); - sortMostRecent(items, mostRecent); + sortMostRecent(items, deviceTransferSearch.mostRecent); print(listJson); if (itemsPage.length == pageItemNumber) { diff --git a/lib/models/device/device_transfer_search.dart b/lib/models/device/device_transfer_search.dart new file mode 100644 index 00000000..14cf6956 --- /dev/null +++ b/lib/models/device/device_transfer_search.dart @@ -0,0 +1,49 @@ +import '../lookup.dart'; + +class DeviceTransferSearch { + String assetName, assetNumber, site; + bool mostRecent; + Lookup dateOperator; + String from, to; + + DeviceTransferSearch({ + this.assetName, + this.assetNumber, + this.site, + this.mostRecent, + this.dateOperator, + this.from, + this.to, + }); + + Map toMap() { + Map search = {}; + if (assetName != null && assetName.isNotEmpty) { + search["assetName"] = assetName; + } + if (assetNumber != null && assetNumber.isNotEmpty) { + search["assetNumber"] = assetNumber; + } + if (site != null && site.isNotEmpty) { + search["site"] = site; + } + if (dateOperator != null && from != null) { + search["requestedDateSymbol"] = dateOperator.toMap(); + search["requestedDateFrom"] = from; + } + if (dateOperator != null && to != null) { + search["requestedDateTo"] = to; + } + return search; + } + + void fromSearch(DeviceTransferSearch newSearch) { + assetName = newSearch.assetName; + assetNumber = newSearch.assetNumber; + site = newSearch.site; + mostRecent = newSearch.mostRecent; + from = newSearch.from; + to = newSearch.to; + dateOperator = newSearch.dateOperator; + } +} diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 1ce0e2fa..1610640c 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/models/device/device_transfer_search.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/switch_button.dart'; +import 'package:test_sa/views/widgets/search/asset_transfer_search_dialog.dart'; + +import '../../widgets/buttons/app_icon_button.dart'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -24,13 +25,12 @@ class _TrackDeviceTransferPageState extends State with DeviceTransferProvider _deviceTransferProvider; UserProvider _userProvider; SettingProvider _settingProvider; - bool mostRecent = false; + @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; return Scaffold( body: SafeArea( @@ -56,7 +56,7 @@ class _TrackDeviceTransferPageState extends State with children: [ Row( children: [ - ABackButton(), + const ABackButton(), Expanded( child: Center( child: Text( @@ -65,29 +65,35 @@ class _TrackDeviceTransferPageState extends State with ), ), ), - const SizedBox( - width: 48, - ) + AIconButton( + iconData: Icons.search, + color: AColors.secondaryColor, + buttonSize: 42, + backgroundColor: AColors.white, + onPressed: () async { + DeviceTransferSearch temp = await showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) { + return AssetTransferSearchDialog(initialSearchValue: _deviceTransferProvider.deviceTransferSearch); + }); + if (temp != null) { + _deviceTransferProvider.deviceTransferSearch = temp; + _deviceTransferProvider.reset(); + setState(() {}); + await _deviceTransferProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + ); + } + }, + ), + const SizedBox(width: 16), ], ), ], ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: ASwitchButton( - title: "Most Recent", - value: mostRecent, - onChange: (value) async { - mostRecent = value; - await _deviceTransferProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - mostRecent: mostRecent, - ); - }, - ), - ), Expanded( child: DeviceTransferList( nextPage: _deviceTransferProvider.nextPage, diff --git a/lib/views/widgets/search/asset_transfer_search_dialog.dart b/lib/views/widgets/search/asset_transfer_search_dialog.dart new file mode 100644 index 00000000..59539238 --- /dev/null +++ b/lib/views/widgets/search/asset_transfer_search_dialog.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/device/device_transfer_search.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; + +import '../app_text_form_field.dart'; +import '../date_and_time/date_picker.dart'; +import '../status/report/service_report_visit_date_operator.dart'; +import '../switch_button.dart'; +import '../titles/app_sub_title.dart'; + +class AssetTransferSearchDialog extends StatefulWidget { + final DeviceTransferSearch initialSearchValue; + final bool expandedSearch; + final Function(DeviceTransferSearch) onSearch; + + const AssetTransferSearchDialog({Key key, this.initialSearchValue, this.expandedSearch, this.onSearch}) : super(key: key); + @override + AssetTransferSearchDialogState createState() => AssetTransferSearchDialogState(); +} + +class AssetTransferSearchDialogState extends State with TickerProviderStateMixin { + DeviceTransferSearch _search; + final GlobalKey _formKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _search = DeviceTransferSearch(); + _search.fromSearch(widget.initialSearchValue); + } + + @override + Widget build(BuildContext context) { + Subtitle subtitle = AppLocalization.of(context).subtitle; + return SizedBox( + height: MediaQuery.of(context).size.height / 1.3, + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASmallButton( + text: subtitle.cancel, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ASmallButton( + text: subtitle.search, + onPressed: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + ) + ], + ), + ASwitchButton( + title: "Most Recent", + value: _search.mostRecent ?? false, + onChange: (value) { + _search.mostRecent = value; + setState(() {}); + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.assetNumber, + hintText: subtitle.assetNumber, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.assetNumber = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.assetName, + hintText: subtitle.assetName, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.site = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.site, + hintText: subtitle.site, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.assetName = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + const ASubTitle("Request Date"), + const SizedBox(height: 4), + ServiceReportVisitDateOperator( + initialValue: _search.dateOperator, + onSelect: (status) { + _search.dateOperator = status; + setState(() {}); + }, + ), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const ASubTitle("From"), + ADatePicker( + date: DateTime.tryParse(_search.from ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _search.from = date?.toIso8601String(); + setState(() {}); + }, + ), + ], + ), + ), + if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const SizedBox(width: 16), + if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("To"), + ADatePicker( + date: DateTime.tryParse(_search.to ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _search.to = date?.toIso8601String(); + setState(() {}); + }, + ), + ], + ), + ), + ], + ), + const SizedBox(width: 16), + Visibility( + visible: _search.toMap().isNotEmpty, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: AButton( + padding: EdgeInsets.zero, + text: subtitle.clearSearch, + onPressed: () { + _search = DeviceTransferSearch(); + Navigator.of(context).pop(_search); + }, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index adabc6d8..682b4177 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -244,7 +244,7 @@ class _ServiceRequestsSearchDialogState extends State