|
|
|
|
import 'dart:core';
|
|
|
|
|
import 'dart:math';
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/app_assets.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/common_models/data_points.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/utils/date_util.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils;
|
|
|
|
|
import 'package:hmg_patient_app_new/features/lab/lab_repo.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_details.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/services/error_handler_service.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/services/navigation_service.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/theme/colors.dart';
|
|
|
|
|
import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart';
|
|
|
|
|
import 'package:intl/intl.dart' show DateFormat;
|
|
|
|
|
import 'package:logger/logger.dart';
|
|
|
|
|
|
|
|
|
|
class LabViewModel extends ChangeNotifier {
|
|
|
|
|
bool isLabOrdersLoading = false;
|
|
|
|
|
bool isLabResultsLoading = false;
|
|
|
|
|
bool isLabResultByHospitalLoading = false;
|
|
|
|
|
bool isSpecialResultsLoading = false;
|
|
|
|
|
|
|
|
|
|
LabRepo labRepo;
|
|
|
|
|
ErrorHandlerService errorHandlerService;
|
|
|
|
|
NavigationService navigationService;
|
|
|
|
|
|
|
|
|
|
List<PatientLabOrdersResponseModel> patientLabOrders = [];
|
|
|
|
|
List<PatientLabOrdersResponseModel> filteredLabOrders = [];
|
|
|
|
|
List<PatientLabOrdersResponseModel> tempLabOrdersList = [];
|
|
|
|
|
String labSpecialResult = "";
|
|
|
|
|
|
|
|
|
|
PatientLabOrdersResponseModel? currentlySelectedPatientOrder;
|
|
|
|
|
|
|
|
|
|
List<LabResult> mainLabResultsByHospitals = [];
|
|
|
|
|
|
|
|
|
|
List<LabResult> mainLabResults = [];
|
|
|
|
|
List<DataPoint> mainGraphPoints = [];
|
|
|
|
|
List<DataPoint> filteredGraphValues = [];
|
|
|
|
|
List months = [
|
|
|
|
|
'Jan',
|
|
|
|
|
'Feb',
|
|
|
|
|
'Mar',
|
|
|
|
|
'April',
|
|
|
|
|
'May',
|
|
|
|
|
'Jun',
|
|
|
|
|
'July',
|
|
|
|
|
'Aug',
|
|
|
|
|
'Sep',
|
|
|
|
|
'Oct',
|
|
|
|
|
'Nov',
|
|
|
|
|
'Dec'
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
late List<String> _labSuggestionsList = [];
|
|
|
|
|
|
|
|
|
|
List<String> get labSuggestions => _labSuggestionsList;
|
|
|
|
|
|
|
|
|
|
Set<TestDetails> uniqueTests = {};
|
|
|
|
|
|
|
|
|
|
double maxY = 0.0;
|
|
|
|
|
double maxX = double.infinity;
|
|
|
|
|
|
|
|
|
|
LabViewModel(
|
|
|
|
|
{required this.labRepo,
|
|
|
|
|
required this.errorHandlerService,
|
|
|
|
|
required this.navigationService});
|
|
|
|
|
|
|
|
|
|
initLabProvider() {
|
|
|
|
|
patientLabOrders.clear();
|
|
|
|
|
filteredLabOrders.clear();
|
|
|
|
|
isLabOrdersLoading = true;
|
|
|
|
|
isLabResultsLoading = true;
|
|
|
|
|
getPatientLabOrders();
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> getPatientLabOrders({Function(dynamic)? onSuccess, Function(String)? onError}) async {
|
|
|
|
|
final result = await labRepo.getPatientLabOrders();
|
|
|
|
|
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) async {
|
|
|
|
|
isLabOrdersLoading = false;
|
|
|
|
|
isLabResultsLoading = false;
|
|
|
|
|
notifyListeners();
|
|
|
|
|
},
|
|
|
|
|
// => await errorHandlerService.handleError(failure: failure),
|
|
|
|
|
(apiResponse) {
|
|
|
|
|
if (apiResponse.messageStatus == 2) {
|
|
|
|
|
// dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {});
|
|
|
|
|
} else if (apiResponse.messageStatus == 1) {
|
|
|
|
|
patientLabOrders = apiResponse.data!;
|
|
|
|
|
filteredLabOrders = List.from(patientLabOrders);
|
|
|
|
|
tempLabOrdersList = apiResponse.data!;
|
|
|
|
|
isLabOrdersLoading = false;
|
|
|
|
|
isLabResultsLoading = false;
|
|
|
|
|
filterSuggestions();
|
|
|
|
|
getUniqueTestDescription();
|
|
|
|
|
notifyListeners();
|
|
|
|
|
if (onSuccess != null) {
|
|
|
|
|
onSuccess(apiResponse);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
filterSuggestions() {
|
|
|
|
|
final List<String> labels = patientLabOrders
|
|
|
|
|
.expand((order) => order.testDetails!)
|
|
|
|
|
.map((detail) => detail.description)
|
|
|
|
|
.whereType<String>()
|
|
|
|
|
.toList();
|
|
|
|
|
_labSuggestionsList = labels.toSet().toList();
|
|
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
filterLabReports(String query) {
|
|
|
|
|
if (query.isEmpty) {
|
|
|
|
|
filteredLabOrders = List.from(patientLabOrders); // reset
|
|
|
|
|
} else {
|
|
|
|
|
filteredLabOrders = patientLabOrders.where((order) {
|
|
|
|
|
final descriptions = order.testDetails?.map((d) => d.description?.toLowerCase()).toList() ?? [];
|
|
|
|
|
return descriptions.any((desc) => desc != null && desc.contains(query.toLowerCase()));
|
|
|
|
|
}).toList();
|
|
|
|
|
patientLabOrders = filteredLabOrders;
|
|
|
|
|
}
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
getUniqueTestDescription() {
|
|
|
|
|
|
|
|
|
|
uniqueTests = {
|
|
|
|
|
for (var item in patientLabOrders)
|
|
|
|
|
if (item.testDetails != null)
|
|
|
|
|
...?item.testDetails?.map<TestDetails>((test) => TestDetails(
|
|
|
|
|
description: test.description.toString(),
|
|
|
|
|
testCode: test.testCode.toString(),
|
|
|
|
|
testID: test.testID,
|
|
|
|
|
createdOn: item.createdOn,
|
|
|
|
|
model: item))
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> getPatientLabResultByHospital(
|
|
|
|
|
PatientLabOrdersResponseModel laborder) async {
|
|
|
|
|
isLabResultByHospitalLoading = true;
|
|
|
|
|
notifyListeners();
|
|
|
|
|
mainLabResultsByHospitals.clear;
|
|
|
|
|
|
|
|
|
|
final result = await labRepo.getPatientLabResultsByHospitals(laborder,
|
|
|
|
|
Utils.isVidaPlusProject(int.parse(laborder.projectID ?? "0")));
|
|
|
|
|
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) async {
|
|
|
|
|
isLabResultByHospitalLoading = false;
|
|
|
|
|
// await errorHandlerService.handleError(failure: failure);
|
|
|
|
|
},
|
|
|
|
|
(apiResponse) {
|
|
|
|
|
isLabResultByHospitalLoading = false;
|
|
|
|
|
if (apiResponse.messageStatus == 2) {
|
|
|
|
|
} else if (apiResponse.messageStatus == 1) {
|
|
|
|
|
mainLabResultsByHospitals = apiResponse.data ?? [];
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> getPatientLabResult(
|
|
|
|
|
PatientLabOrdersResponseModel laborder, String procedureName) async {
|
|
|
|
|
LoaderBottomSheet.showLoader();
|
|
|
|
|
mainLabResults.clear();
|
|
|
|
|
filteredGraphValues.clear();
|
|
|
|
|
maxY = double.negativeInfinity;
|
|
|
|
|
|
|
|
|
|
final result = await labRepo.getPatientLabResults(
|
|
|
|
|
laborder,
|
|
|
|
|
Utils.isVidaPlusProject(int.parse(laborder.projectID ?? "0")),
|
|
|
|
|
procedureName);
|
|
|
|
|
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) async {
|
|
|
|
|
LoaderBottomSheet.hideLoader();
|
|
|
|
|
await errorHandlerService.handleError(failure: failure);
|
|
|
|
|
},
|
|
|
|
|
(apiResponse) {
|
|
|
|
|
LoaderBottomSheet.hideLoader();
|
|
|
|
|
if (apiResponse.messageStatus == 2) {
|
|
|
|
|
} else if (apiResponse.messageStatus == 1) {
|
|
|
|
|
var sortedResponse = sortByFlagAndValue(apiResponse.data!);
|
|
|
|
|
var recentThree = sort(sortedResponse);
|
|
|
|
|
mainLabResults = recentThree;
|
|
|
|
|
|
|
|
|
|
double counter = 1;
|
|
|
|
|
recentThree.reversed.forEach((element) {
|
|
|
|
|
try {
|
|
|
|
|
var dateTime =
|
|
|
|
|
DateUtil.convertStringToDate(element.verifiedOnDateTime!);
|
|
|
|
|
var resultValue = double.parse(element.resultValue!);
|
|
|
|
|
var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??"");
|
|
|
|
|
if (resultValue>maxY) {
|
|
|
|
|
maxY = resultValue;
|
|
|
|
|
maxX = maxY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
filteredGraphValues.add(DataPoint(
|
|
|
|
|
value: transformedValue,
|
|
|
|
|
actualValue:element.resultValue!,
|
|
|
|
|
label: formatDateAsMMYY(dateTime),
|
|
|
|
|
displayTime: resultDate(dateTime),
|
|
|
|
|
time: DateUtil.convertStringToDate(element.verifiedOnDateTime),
|
|
|
|
|
referenceValue: element.calculatedResultFlag ?? "",
|
|
|
|
|
|
|
|
|
|
));
|
|
|
|
|
counter++;
|
|
|
|
|
} catch (e) {}
|
|
|
|
|
});
|
|
|
|
|
LabResult recentResult = recentThree.first;
|
|
|
|
|
recentResult.verifiedOn = resultDate(DateUtil.convertStringToDate(recentResult.verifiedOnDateTime!));
|
|
|
|
|
// filteredGraphValues = [filteredGraphValues.first];
|
|
|
|
|
navigationService.push(MaterialPageRoute(
|
|
|
|
|
builder: (_) =>
|
|
|
|
|
LabResultDetails(recentLabResult: recentResult)));
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> getPatientSpecialResult(
|
|
|
|
|
PatientLabOrdersResponseModel laborder) async {
|
|
|
|
|
isSpecialResultsLoading = true;
|
|
|
|
|
labSpecialResult = "";
|
|
|
|
|
notifyListeners();
|
|
|
|
|
final result = await labRepo.getSpecialLabResult(
|
|
|
|
|
laborder,
|
|
|
|
|
Utils.isVidaPlusProject(int.parse(laborder.projectID ?? "0")),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
result.fold(
|
|
|
|
|
(failure) async {
|
|
|
|
|
isSpecialResultsLoading = false;
|
|
|
|
|
notifyListeners();
|
|
|
|
|
// await errorHandlerService.handleError(failure: failure);
|
|
|
|
|
},
|
|
|
|
|
(apiResponse) {
|
|
|
|
|
isSpecialResultsLoading = false;
|
|
|
|
|
if (apiResponse.messageStatus == 2) {
|
|
|
|
|
} else if (apiResponse.messageStatus == 1) {
|
|
|
|
|
StringBuffer htmlbuffer = StringBuffer("");
|
|
|
|
|
|
|
|
|
|
apiResponse.data?.forEach((element) {
|
|
|
|
|
if(element.resultDataHTML != null && element.resultDataHTML?.isNotEmpty == true)
|
|
|
|
|
htmlbuffer.write("${element.resultDataHTML} <br/> <br/>");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
labSpecialResult = htmlbuffer.toString();
|
|
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
notifyListeners();
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String resultDate(DateTime date){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return '${date.day} ${months[date.month-1]},${date.year}';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double transformValueInRange(double inputValue, String flag) {
|
|
|
|
|
// Define range boundaries
|
|
|
|
|
double rangeStart, rangeEnd;
|
|
|
|
|
|
|
|
|
|
switch (flag) {
|
|
|
|
|
case'LCL':
|
|
|
|
|
case 'CL':
|
|
|
|
|
rangeStart = 0.0;
|
|
|
|
|
rangeEnd = 19.0;
|
|
|
|
|
break;
|
|
|
|
|
case 'L':
|
|
|
|
|
rangeStart = 20.0;
|
|
|
|
|
rangeEnd = 39.0;
|
|
|
|
|
break;
|
|
|
|
|
case 'N':
|
|
|
|
|
rangeStart = 40.0;
|
|
|
|
|
rangeEnd = 59.0;
|
|
|
|
|
break;
|
|
|
|
|
case 'H':
|
|
|
|
|
rangeStart = 60.0;
|
|
|
|
|
rangeEnd = 79.0;
|
|
|
|
|
break;
|
|
|
|
|
case 'HCH':
|
|
|
|
|
case 'CH':
|
|
|
|
|
rangeStart = 80.0;
|
|
|
|
|
rangeEnd = 100.0;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
throw ArgumentError('Invalid flag: $flag');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Clamp input value to 0-100 and map it to the range bounds
|
|
|
|
|
final clampedValue = inputValue.clamp(0.0, 100.0);
|
|
|
|
|
final normalizedValue = clampedValue / 100.0; // Normalize input to 0-1
|
|
|
|
|
|
|
|
|
|
// Map the normalized value to the target range bounds
|
|
|
|
|
final transformedValue = rangeStart + ((normalizedValue * (rangeEnd - rangeStart)));
|
|
|
|
|
debugPrint("the actual value is $inputValue");
|
|
|
|
|
debugPrint("the flag is $flag");
|
|
|
|
|
debugPrint("the transformed value is $transformedValue");
|
|
|
|
|
return transformedValue;
|
|
|
|
|
}
|
|
|
|
|
void getSelectedDateRange(DateTime? start, DateTime? end) {
|
|
|
|
|
maxY = double.negativeInfinity;
|
|
|
|
|
|
|
|
|
|
if(start == null && end == null) {
|
|
|
|
|
mainLabResults.forEach((element) {
|
|
|
|
|
final time = DateUtil.convertStringToDate(element.verifiedOnDateTime!);
|
|
|
|
|
try{
|
|
|
|
|
var resultValue = double.parse(element.resultValue!);
|
|
|
|
|
|
|
|
|
|
var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??"");
|
|
|
|
|
if (resultValue > maxY) {
|
|
|
|
|
maxY = resultValue;
|
|
|
|
|
}
|
|
|
|
|
filteredGraphValues.add(DataPoint(
|
|
|
|
|
value: transformedValue,
|
|
|
|
|
actualValue: element.resultValue!,
|
|
|
|
|
label: formatDateAsMMYY(time),
|
|
|
|
|
displayTime: resultDate(time),
|
|
|
|
|
time: DateUtil.convertStringToDate(element.verifiedOnDateTime),
|
|
|
|
|
referenceValue: element.calculatedResultFlag ?? "",
|
|
|
|
|
));
|
|
|
|
|
}catch(e){
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}else {
|
|
|
|
|
filteredGraphValues.clear();
|
|
|
|
|
|
|
|
|
|
mainLabResults.forEach((element) {
|
|
|
|
|
try {
|
|
|
|
|
var dateTime =
|
|
|
|
|
DateUtil.convertStringToDate(element.verifiedOnDateTime!);
|
|
|
|
|
var resultValue = double.parse(element.resultValue!);
|
|
|
|
|
var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??"");
|
|
|
|
|
if (resultValue > maxY) {
|
|
|
|
|
maxY = resultValue;
|
|
|
|
|
}
|
|
|
|
|
if (start != null && end == null) {
|
|
|
|
|
if (dateTime.isAtSameMomentAs(start)) {
|
|
|
|
|
|
|
|
|
|
filteredGraphValues.add(DataPoint(
|
|
|
|
|
value: transformedValue,
|
|
|
|
|
actualValue: element.resultValue!,
|
|
|
|
|
label: formatDateAsMMYY(dateTime),
|
|
|
|
|
displayTime: resultDate(dateTime),
|
|
|
|
|
time:
|
|
|
|
|
DateUtil.convertStringToDate(element.verifiedOnDateTime),
|
|
|
|
|
referenceValue: element.calculatedResultFlag ?? ""));
|
|
|
|
|
}
|
|
|
|
|
} else if (start != null && end != null) {
|
|
|
|
|
if ((dateTime.isAfter(start)) && (dateTime.isBefore(end))) {
|
|
|
|
|
|
|
|
|
|
filteredGraphValues.add(DataPoint(
|
|
|
|
|
value: transformedValue,
|
|
|
|
|
actualValue: element.resultValue!,
|
|
|
|
|
label: formatDateAsMMYY(dateTime),
|
|
|
|
|
displayTime: resultDate(dateTime),
|
|
|
|
|
time:
|
|
|
|
|
DateUtil.convertStringToDate(element.verifiedOnDateTime),
|
|
|
|
|
referenceValue: element.calculatedResultFlag ?? ""));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (e) {}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
filteredGraphValues = sortFilteredList(filteredGraphValues).reversed.toList();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String formatDateAsMMYY(DateTime date) {
|
|
|
|
|
|
|
|
|
|
return '${months[date.month-1]}, ${date.year}';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<LabResult> sortByFlagAndValue(List<LabResult> original) {
|
|
|
|
|
const priorityOrder = ['LCL', 'CL', 'L', 'N', 'H', 'CH', 'HCH'];
|
|
|
|
|
|
|
|
|
|
int getFlagPriority(String? flag) {
|
|
|
|
|
if (flag == null) return priorityOrder.length;
|
|
|
|
|
final index = priorityOrder.indexOf(flag);
|
|
|
|
|
return index == -1 ? priorityOrder.length : index;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double parseResultValue(String? value) {
|
|
|
|
|
if (value == null) return double.nan;
|
|
|
|
|
return double.tryParse(value) ?? double.nan;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final copy = List<LabResult>.from(original);
|
|
|
|
|
copy.sort((a, b) {
|
|
|
|
|
final aFlagPriority = getFlagPriority(a.calculatedResultFlag);
|
|
|
|
|
final bFlagPriority = getFlagPriority(b.calculatedResultFlag);
|
|
|
|
|
|
|
|
|
|
if (aFlagPriority != bFlagPriority) {
|
|
|
|
|
return aFlagPriority.compareTo(bFlagPriority);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final aValue = parseResultValue(a.resultValue);
|
|
|
|
|
final bValue = parseResultValue(b.resultValue);
|
|
|
|
|
|
|
|
|
|
return aValue.compareTo(bValue);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return copy;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<LabResult> sort(List<LabResult> original) {
|
|
|
|
|
DateTime? parseVerifiedDate(String? raw) {
|
|
|
|
|
if (raw == null) return null;
|
|
|
|
|
final regex = RegExp(r'\/Date\((\d+)\)\/');
|
|
|
|
|
final match = regex.firstMatch(raw);
|
|
|
|
|
if (match != null) {
|
|
|
|
|
final millis = int.tryParse(match.group(1)!);
|
|
|
|
|
if (millis != null) {
|
|
|
|
|
|
|
|
|
|
return DateTime.fromMillisecondsSinceEpoch(millis);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
final copy = List<LabResult>.from(original);
|
|
|
|
|
copy.sort((a, b) {
|
|
|
|
|
final aDate = DateUtil.convertStringToDate(a.verifiedOnDateTime);
|
|
|
|
|
final bDate = DateUtil.convertStringToDate(b.verifiedOnDateTime);
|
|
|
|
|
final now = DateTime.now();
|
|
|
|
|
if (aDate == now && bDate == now) return 0;
|
|
|
|
|
if (aDate == now) return 1;
|
|
|
|
|
if (bDate == now) return -1;
|
|
|
|
|
return bDate.compareTo(aDate); // descending
|
|
|
|
|
});
|
|
|
|
|
return copy.toList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<DataPoint> sortFilteredList(List<DataPoint> original) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final copy = List<DataPoint>.from(original);
|
|
|
|
|
copy.sort((a, b) {
|
|
|
|
|
final aDate =a.time;
|
|
|
|
|
final bDate = a.time;
|
|
|
|
|
final now = DateTime.now();
|
|
|
|
|
if (aDate == now && bDate == now) return 0;
|
|
|
|
|
if (aDate == now) return 1;
|
|
|
|
|
if (bDate == now) return -1;
|
|
|
|
|
return bDate.compareTo(aDate); // descending
|
|
|
|
|
});
|
|
|
|
|
return copy.toList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Color getColor(String flag) {
|
|
|
|
|
switch (flag) {
|
|
|
|
|
case 'LCL':
|
|
|
|
|
return AppColors.criticalLowAndHigh;
|
|
|
|
|
case 'CL':
|
|
|
|
|
return AppColors.criticalLowAndHigh;
|
|
|
|
|
case 'L':
|
|
|
|
|
return AppColors.highAndLow;
|
|
|
|
|
case 'N':
|
|
|
|
|
return AppColors.bgGreenColor;
|
|
|
|
|
case 'H':
|
|
|
|
|
return AppColors.highAndLow;
|
|
|
|
|
case 'CH':
|
|
|
|
|
return AppColors.criticalLowAndHigh;
|
|
|
|
|
case 'HCH':
|
|
|
|
|
return AppColors.criticalLowAndHigh;
|
|
|
|
|
default:
|
|
|
|
|
return Colors.grey;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getFormattedDate(DateTime date){
|
|
|
|
|
return DateFormat('EEEE, dd MMMM. yyyy').format(date);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getAssetUrlWRTResult(String refernceValue) {
|
|
|
|
|
switch (refernceValue) {
|
|
|
|
|
case 'CL':
|
|
|
|
|
case 'LCL':
|
|
|
|
|
return AppAssets.ic_critical_low_result;
|
|
|
|
|
case 'L':
|
|
|
|
|
return AppAssets.ic_low_result;
|
|
|
|
|
case 'N':
|
|
|
|
|
return AppAssets.ic_normal_result;
|
|
|
|
|
case 'H':
|
|
|
|
|
return AppAssets.ic_low_result;
|
|
|
|
|
case 'CH':
|
|
|
|
|
case 'HCH':
|
|
|
|
|
return AppAssets.ic_critical_low_result;
|
|
|
|
|
default:
|
|
|
|
|
return AppAssets.ic_normal_result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool getRotationWRTResult(String refernceValue) {
|
|
|
|
|
switch (refernceValue) {
|
|
|
|
|
case 'CL':
|
|
|
|
|
case 'LCL':
|
|
|
|
|
case 'L':
|
|
|
|
|
case 'N':
|
|
|
|
|
return false;
|
|
|
|
|
case 'H':
|
|
|
|
|
case 'CH':
|
|
|
|
|
case 'HCH':
|
|
|
|
|
return true;
|
|
|
|
|
default:
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getSeverityText(String refernceValue) {
|
|
|
|
|
switch (refernceValue) {
|
|
|
|
|
case 'N':
|
|
|
|
|
return "normal";
|
|
|
|
|
case 'L':
|
|
|
|
|
case 'H':
|
|
|
|
|
return "monitor";
|
|
|
|
|
case 'CL':
|
|
|
|
|
case 'LCL':
|
|
|
|
|
case 'CH':
|
|
|
|
|
case 'HCH':
|
|
|
|
|
return "attention";
|
|
|
|
|
default:
|
|
|
|
|
return "normal";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|