Search in service request, preventive maintenance, gas refill, and transfer to arrange the requests from most recent to earliestt

main_design2.0
zaid_daoud 2 years ago
parent 4d548e1048
commit 11f95b9578

@ -60,9 +60,11 @@ class DeviceTransferProvider extends ChangeNotifier {
Future<int> getRequests({
@required String host,
@required User user,
bool mostRecent,
}) async {
if (isLoading == true) return -2;
isLoading = true;
notifyListeners();
Response response;
try {
Map<String, dynamic> body = {};
@ -81,6 +83,7 @@ class DeviceTransferProvider extends ChangeNotifier {
List<DeviceTransfer> 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<DeviceTransfer> 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<int> createRequest({
@required String host,
@required User user,

@ -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) => Device.fromJson(device)).toList());
_devices.addAll(equipmentListJson.map<Device>((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) => Device.fromJson(device)).toList());
page = equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList();
_devices.addAll(equipmentListJson.map<Device>((device) => Device.fromJson(device, startKeyWithDest: false)).toList());
notifyListeners();
}
return page;

@ -47,9 +47,11 @@ class GasRefillProvider extends ChangeNotifier {
Future<int> getRequests({
@required String host,
@required User user,
bool mostRecent,
}) async {
if (isLoading == true) return -2;
isLoading = true;
notifyListeners();
Response response;
Map<String, dynamic> body = {};
@ -68,6 +70,7 @@ class GasRefillProvider extends ChangeNotifier {
List<GasRefillModel> 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<GasRefillModel> models, bool mostRecent) {
if (mostRecent != null) {
models.sort((prev, next) => (mostRecent ?? false) ? next.title.compareTo(prev.title) : prev.title.compareTo(next.title));
}
}
Future<int> createModel({
@required String host,
@required User user,

@ -79,6 +79,7 @@ class RegularVisitsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"];
List<Visit> _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<Visit> 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

@ -76,6 +76,7 @@ class ServiceRequestsProvider extends ChangeNotifier {
List requestsListJson = json.decode(response.body)["data"];
List<ServiceRequest> 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<ServiceRequest> 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<ServiceRequest> getSingleServiceRequest({
@required String requestId,
@required String host,

@ -34,7 +34,7 @@ class Device {
this.modelDefinition,
});
factory Device.fromJson(Map<String, dynamic> parsedJson) {
factory Device.fromJson(Map<String, dynamic> 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"],

@ -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<String, dynamic> 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"],

@ -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<String, dynamic> toMap() {

@ -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<String, dynamic> 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'],
);
}
}

@ -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<String, dynamic> toMap() {

@ -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<TrackDeviceTransferPage> with
DeviceTransferProvider _deviceTransferProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
bool mostRecent = false;
@override
Widget build(BuildContext context) {
_deviceTransferProvider = Provider.of<DeviceTransferProvider>(context);
@ -71,6 +73,21 @@ class _TrackDeviceTransferPageState extends State<TrackDeviceTransferPage> 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,

@ -368,7 +368,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
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<RequestGasRefill> {
const SizedBox(
height: 8,
),
const SizedBox(
height: 8,
),
const ASubTitle("Cylinder Type"),
if (_validate && _currentDetails.cylinderSize == null)
ASubTitle(

@ -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<TrackGasRefillPage> with TickerProv
GasRefillProvider _gasRefillProvider;
UserProvider _userProvider;
SettingProvider _settingProvider;
bool mostRecent = false;
@override
Widget build(BuildContext context) {
@ -76,6 +79,21 @@ class _TrackGasRefillPageState extends State<TrackGasRefillPage> 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,

@ -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<ServiceRequestsSearchDialo
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ASwitchButton(
title: "Most Recent",
value: _search.mostRecent ?? false,
onChange: (value) {
_search.mostRecent = value;
setState(() {});
},
),
SizedBox(
height: 8.0 * AppStyle.getScaleFactor(context),
),
ATextFormField(
initialValue: _search.deviceSerialNumber,
hintText: _subtitle.serialNumber,

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:test_sa/controllers/localization/localization.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/subtitle.dart';
@ -12,10 +11,10 @@ import 'package:test_sa/views/widgets/equipment/auto_complete_models_field.dart'
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart';
import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart';
import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart';
import 'package:test_sa/views/widgets/titles/app_sub_title.dart';
import '../app_text_form_field.dart';
import '../switch_button.dart';
class VisitsSearchDialog extends StatefulWidget {
final VisitsSearch initialSearchValue;
@ -90,6 +89,14 @@ class _VisitsSearchDialogState extends State<VisitsSearchDialog> with TickerProv
)
],
),
ASwitchButton(
title: "Most Recent",
value: _search.mostRecent ?? false,
onChange: (value) {
_search.mostRecent = value;
setState(() {});
},
),
ATextFormField(
initialValue: _search.deviceSerialNumber,
hintText: _subtitle.serialNumber,

@ -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,
),
],
),
);
}
}
Loading…
Cancel
Save