diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ca5234ce..453954be 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -60,9 +60,11 @@ class DeviceTransferProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, + bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; + notifyListeners(); Response response; try { Map body = {}; @@ -81,6 +83,7 @@ class DeviceTransferProvider extends ChangeNotifier { List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); + sortMostRecent(items, mostRecent); print(listJson); if (itemsPage.length == pageItemNumber) { nextPage = true; @@ -99,6 +102,13 @@ class DeviceTransferProvider extends ChangeNotifier { } } + void sortMostRecent(List transfer, bool mostRecent) { + if (mostRecent != null) { + transfer.sort((prev, next) => + (mostRecent ?? false) ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn))); + } + } + Future createRequest({ @required String host, @required User user, diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 2d55a2a7..f3959586 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -70,7 +70,7 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); nextPage = true; } else { nextPage = false; @@ -111,8 +111,8 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); - _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + page = equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList(); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); notifyListeners(); } return page; diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index faf84d66..cadcf8eb 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -47,9 +47,11 @@ class GasRefillProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, + bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; + notifyListeners(); Response response; Map body = {}; @@ -68,6 +70,7 @@ class GasRefillProvider extends ChangeNotifier { List itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); + sortMostRecent(items, mostRecent); if (itemsPage.length == pageItemNumber) { nextPage = true; } else { @@ -86,6 +89,12 @@ class GasRefillProvider extends ChangeNotifier { } } + void sortMostRecent(List models, bool mostRecent) { + if (mostRecent != null) { + models.sort((prev, next) => (mostRecent ?? false) ? next.title.compareTo(prev.title) : prev.title.compareTo(next.title)); + } + } + Future createModel({ @required String host, @required User user, diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 42fb1dd9..25e330f7 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -79,6 +79,7 @@ class RegularVisitsProvider extends ChangeNotifier { List requestsListJson = json.decode(response.body)["data"]; List _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); visits ??= []; + sortMostRecent(_visits); visits.addAll(_visits); if (_visits.length == pageItemNumber) { nextPage = true; @@ -98,6 +99,12 @@ class RegularVisitsProvider extends ChangeNotifier { return response.statusCode; } + void sortMostRecent(List visits) { + visits.sort((prev, next) => (visitsSearch.mostRecent ?? false) + ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) + : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn))); + } + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 8b014f83..d255f7bc 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -76,6 +76,7 @@ class ServiceRequestsProvider extends ChangeNotifier { List requestsListJson = json.decode(response.body)["data"]; List serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); serviceRequests ??= []; + sortMostRecent(serviceRequestsPage); serviceRequests.addAll(serviceRequestsPage); if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; @@ -94,6 +95,12 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + void sortMostRecent(List requests) { + requests.sort( + (prev, next) => (search.mostRecent ?? false) ? DateTime.tryParse(next.date).compareTo(DateTime.tryParse(prev.date)) : DateTime.tryParse(prev.date).compareTo(DateTime.tryParse(next.date)), + ); + } + Future getSingleServiceRequest({ @required String requestId, @required String host, diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 6c1f5cfe..f877f778 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -34,7 +34,7 @@ class Device { this.modelDefinition, }); - factory Device.fromJson(Map parsedJson) { + factory Device.fromJson(Map parsedJson, {bool startKeyWithDest = true}) { print("parsedJson:$parsedJson"); return Device( id: parsedJson["id"], @@ -43,10 +43,10 @@ class Device { assetName: parsedJson["assetName"], modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), - destBuildingName: parsedJson["destBuildingName"] ?? parsedJson['building']['name'], - destDepartmentName: parsedJson["destDepartmentName"] ?? parsedJson['department']['departmentName'], - destRoom: parsedJson["destRoom"] ?? parsedJson['room'], - destFloor: parsedJson["destFloor"] ?? parsedJson['floor']['name'], + destBuildingName: startKeyWithDest ? parsedJson["destBuildingName"] : parsedJson['building']['name'], + destDepartmentName: startKeyWithDest ? parsedJson["destDepartmentName"] : parsedJson['department']['departmentName'], + destRoom: startKeyWithDest ? parsedJson["destRoom"] : parsedJson['room'], + destFloor: startKeyWithDest ? parsedJson["destFloor"] : parsedJson['floor']['name'], destSiteName: parsedJson['destSiteName'] // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 84ab75c2..50b3c593 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -14,6 +14,7 @@ class DeviceTransfer { Device device; DeviceTransferInfo sender; DeviceTransferInfo receiver; + String createdOn; DeviceTransfer({ this.id, @@ -22,6 +23,7 @@ class DeviceTransfer { this.userId, this.sender, this.receiver, + this.createdOn, }); bool validate() { @@ -40,6 +42,7 @@ class DeviceTransfer { final receiver = DeviceTransferInfo(); receiver.fromDetails(old.receiver); this.receiver = receiver; + createdOn = old.createdOn; } factory DeviceTransfer.fromJson(Map parsedJson) { @@ -47,6 +50,7 @@ class DeviceTransfer { id: parsedJson["id"], title: parsedJson["transferCode"], userId: parsedJson["uid"], + createdOn: parsedJson['createdOn'], device: Device( id: parsedJson["assetId"], number: parsedJson["assetNumber"], diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index 53fca4ab..3366f043 100644 --- a/lib/models/service_request/service_request_search.dart +++ b/lib/models/service_request/service_request_search.dart @@ -8,6 +8,7 @@ class ServiceRequestSearch { Hospital hospital; String model; Lookup statusValue; + bool mostRecent; ServiceRequestSearch({ this.deviceSerialNumber, @@ -16,6 +17,7 @@ class ServiceRequestSearch { this.deviceName, this.model, this.hospital, + this.mostRecent, }); fromSearch(ServiceRequestSearch newSearch) { @@ -24,6 +26,7 @@ class ServiceRequestSearch { statusValue = newSearch.statusValue; hospital = newSearch.hospital; model = newSearch.model; + mostRecent = newSearch.mostRecent; } Map toMap() { diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index 2ad5a3d6..9d8ad663 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -6,6 +6,7 @@ class Visit { String serialNumber; String expectDate; String actualDate; + String createdOn; int hospitalId; String hospitalName; int deviceId; @@ -42,6 +43,7 @@ class Visit { this.images, this.assignTo, this.deviceNumber, + this.createdOn, }); factory Visit.fromJson(Map parsedJson) { @@ -51,28 +53,30 @@ class Visit { images = list.map((e) => e["attachmentURL"].toString()).toList(); } return Visit( - id: parsedJson["id"], - serialNumber: parsedJson["visitCode"], - ppmScheduleId: parsedJson["ppmScheduleId"], - hospitalId: parsedJson["siteId"], - deviceNumber: parsedJson["assetNumber"], - hospitalName: parsedJson["siteName"], - deviceId: parsedJson["assetId"], - deviceSerialNumber: parsedJson["assetSerialNo"], - deviceEnglishName: parsedJson["assetName"], - deviceArabicName: parsedJson["assetName"], - employId: parsedJson["assignedEmployeeId"].toString(), - employName: parsedJson["assignedEmployeeName"], - expectDate: parsedJson["expectedDate"].toString().split("T").first, - actualDate: parsedJson["actualDate"].toString().split("T").first, - modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", - // contactStatus: parsedJson["contactStatus"], - images: images, - status: Lookup( - id: parsedJson["visitStatusId"], // actual value (0,1,2) - name: parsedJson["visitStatusName"] // text value - ), - assignTo: parsedJson["assignedToName"], - pentry: Pentry.fromMap(parsedJson)); + id: parsedJson["id"], + serialNumber: parsedJson["visitCode"], + ppmScheduleId: parsedJson["ppmScheduleId"], + hospitalId: parsedJson["siteId"], + deviceNumber: parsedJson["assetNumber"], + hospitalName: parsedJson["siteName"], + deviceId: parsedJson["assetId"], + deviceSerialNumber: parsedJson["assetSerialNo"], + deviceEnglishName: parsedJson["assetName"], + deviceArabicName: parsedJson["assetName"], + employId: parsedJson["assignedEmployeeId"].toString(), + employName: parsedJson["assignedEmployeeName"], + expectDate: parsedJson["expectedDate"].toString().split("T").first, + actualDate: parsedJson["actualDate"].toString().split("T").first, + modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", + // contactStatus: parsedJson["contactStatus"], + images: images, + status: Lookup( + id: parsedJson["visitStatusId"], // actual value (0,1,2) + name: parsedJson["visitStatusName"] // text value + ), + assignTo: parsedJson["assignedToName"], + pentry: Pentry.fromMap(parsedJson), + createdOn: parsedJson['createdOn'], + ); } } diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index 5c3692bd..ee5045b0 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -12,6 +12,7 @@ class VisitsSearch { DateTime actualDateFrom; DateTime actualDateTo; Lookup statusValue; + bool mostRecent; VisitsSearch({ this.deviceSerialNumber, @@ -24,6 +25,7 @@ class VisitsSearch { this.contactStatus, this.expectedDateFrom, this.expectedDateTo, + this.mostRecent, }); fromSearch(VisitsSearch newSearch) { @@ -37,6 +39,7 @@ class VisitsSearch { expectedDateFrom = newSearch.expectedDateFrom; expectedDateTo = newSearch.expectedDateTo; statusValue = newSearch.statusValue; + mostRecent = newSearch.mostRecent; } Map toMap() { diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index d62943ef..87e4aaa7 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -9,6 +9,7 @@ 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'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -23,6 +24,7 @@ class _TrackDeviceTransferPageState extends State with DeviceTransferProvider _deviceTransferProvider; UserProvider _userProvider; SettingProvider _settingProvider; + bool mostRecent = false; @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context); @@ -71,6 +73,21 @@ class _TrackDeviceTransferPageState extends State with ], ), ), + 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/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 38f97f40..331618d4 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -368,7 +368,7 @@ class _RequestGasRefillState extends State { const SizedBox(height: 8), Divider(color: Theme.of(context).colorScheme.primary), const SizedBox(height: 4), - const ASubTitle("Type"), + const ASubTitle("Gas Type"), if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), const SizedBox(height: 4), GasTypeMenu( @@ -396,9 +396,6 @@ class _RequestGasRefillState extends State { const SizedBox( height: 8, ), - const SizedBox( - height: 8, - ), const ASubTitle("Cylinder Type"), if (_validate && _currentDetails.cylinderSize == null) ASubTitle( diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 6dd1ca6d..c909d16b 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -10,6 +10,8 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import '../../../widgets/switch_button.dart'; + class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; @@ -23,6 +25,7 @@ class _TrackGasRefillPageState extends State with TickerProv GasRefillProvider _gasRefillProvider; UserProvider _userProvider; SettingProvider _settingProvider; + bool mostRecent = false; @override Widget build(BuildContext context) { @@ -76,6 +79,21 @@ class _TrackGasRefillPageState extends State with TickerProv ], ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ASwitchButton( + title: "Most Recent", + value: mostRecent, + onChange: (value) async { + mostRecent = value; + await _gasRefillProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + mostRecent: mostRecent, + ); + }, + ), + ), Expanded( child: GasRefillList( nextPage: _gasRefillProvider.nextPage, diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index c5b31e29..9502d645 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; @@ -9,6 +8,7 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart'; +import 'package:test_sa/views/widgets/switch_button.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; @@ -90,6 +90,17 @@ class _ServiceRequestsSearchDialogState extends State with TickerProv ) ], ), + ASwitchButton( + title: "Most Recent", + value: _search.mostRecent ?? false, + onChange: (value) { + _search.mostRecent = value; + setState(() {}); + }, + ), ATextFormField( initialValue: _search.deviceSerialNumber, hintText: _subtitle.serialNumber, diff --git a/lib/views/widgets/switch_button.dart b/lib/views/widgets/switch_button.dart new file mode 100644 index 00000000..ccab66a4 --- /dev/null +++ b/lib/views/widgets/switch_button.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../app_style/colors.dart'; +import '../app_style/sizing.dart'; + +class ASwitchButton extends StatelessWidget { + final String title; + final bool value; + final void Function(bool) onChange; + + const ASwitchButton({ + @required this.title, + @required this.value, + @required this.onChange, + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + margin: const EdgeInsets.symmetric(vertical: 8), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle(title), + Switch.adaptive( + value: value, + activeColor: AColors.primaryColor, + onChanged: onChange, + ), + ], + ), + ); + } +}