Merge branch 'master' into haroon_dev

pull/67/head
haroon amjad 1 month ago
commit 6565ba719d

@ -6,7 +6,7 @@ class DataPoint {
final double value; final double value;
///label shown on the bottom of the graph ///label shown on the bottom of the graph
String label; String label;
String refernceValue; String referenceValue;
String actualValue; String actualValue;
DateTime time; DateTime time;
String displayTime; String displayTime;
@ -14,7 +14,7 @@ class DataPoint {
DataPoint( DataPoint(
{required this.value, {required this.value,
required this.label, required this.label,
required this.refernceValue, required this.referenceValue,
required this.actualValue, required this.actualValue,
required this.time, required this.time,
required this.displayTime, required this.displayTime,

@ -1,4 +1,5 @@
import 'dart:core'; import 'dart:core';
import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart';
@ -52,7 +53,8 @@ class LabViewModel extends ChangeNotifier {
Set<TestDetails> uniqueTests = {}; Set<TestDetails> uniqueTests = {};
double maxYForThreeDots = 0.0; double maxY = 0.0;
double maxX = double.infinity;
LabViewModel( LabViewModel(
{required this.labRepo, {required this.labRepo,
@ -141,6 +143,7 @@ class LabViewModel extends ChangeNotifier {
LoaderBottomSheet.showLoader(); LoaderBottomSheet.showLoader();
mainLabResults.clear(); mainLabResults.clear();
filteredGraphValues.clear(); filteredGraphValues.clear();
maxY = double.negativeInfinity;
final result = await labRepo.getPatientLabResults( final result = await labRepo.getPatientLabResults(
laborder, laborder,
@ -165,16 +168,20 @@ class LabViewModel extends ChangeNotifier {
try { try {
var dateTime = var dateTime =
DateUtil.convertStringToDate(element.verifiedOnDateTime!); DateUtil.convertStringToDate(element.verifiedOnDateTime!);
if (double.parse(element.resultValue!) > maxYForThreeDots) { var resultValue = double.parse(element.resultValue!);
maxYForThreeDots = double.parse(element.resultValue!); var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??"");
if (resultValue>maxY) {
maxY = resultValue;
maxX = maxY;
} }
filteredGraphValues.add(DataPoint( filteredGraphValues.add(DataPoint(
value: transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??""), value: transformedValue,
actualValue:element.resultValue!, actualValue:element.resultValue!,
label: formatDateAsMMYY(dateTime), label: formatDateAsMMYY(dateTime),
displayTime: resultDate(dateTime), displayTime: resultDate(dateTime),
time: DateUtil.convertStringToDate(element.verifiedOnDateTime), time: DateUtil.convertStringToDate(element.verifiedOnDateTime),
refernceValue: element.calculatedResultFlag ?? "", referenceValue: element.calculatedResultFlag ?? "",
)); ));
counter++; counter++;
@ -182,6 +189,7 @@ class LabViewModel extends ChangeNotifier {
}); });
LabResult recentResult = recentThree.first; LabResult recentResult = recentThree.first;
recentResult.verifiedOn = resultDate(DateUtil.convertStringToDate(recentResult.verifiedOnDateTime!)); recentResult.verifiedOn = resultDate(DateUtil.convertStringToDate(recentResult.verifiedOnDateTime!));
// filteredGraphValues = [filteredGraphValues.first];
navigationService.push(MaterialPageRoute( navigationService.push(MaterialPageRoute(
builder: (_) => builder: (_) =>
LabResultDetails(recentLabResult: recentResult))); LabResultDetails(recentLabResult: recentResult)));
@ -233,24 +241,32 @@ class LabViewModel extends ChangeNotifier {
final normalizedValue = clampedValue / 100.0; // Normalize input to 0-1 final normalizedValue = clampedValue / 100.0; // Normalize input to 0-1
// Map the normalized value to the target range bounds // Map the normalized value to the target range bounds
final transformedValue = rangeStart + (normalizedValue * (rangeEnd - rangeStart)); 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; return transformedValue;
} }
void getSelectedDateRange(DateTime? start, DateTime? end) { void getSelectedDateRange(DateTime? start, DateTime? end) {
maxY = double.negativeInfinity;
if(start == null && end == null) { if(start == null && end == null) {
print("the dates are null");
mainLabResults.forEach((element) { mainLabResults.forEach((element) {
final time = DateUtil.convertStringToDate(element.verifiedOnDateTime!); final time = DateUtil.convertStringToDate(element.verifiedOnDateTime!);
try{ try{
var resultValue = double.parse(element.resultValue!);
var transformedValue = transformValueInRange(double.parse(element.resultValue!), element.calculatedResultFlag??"");
if (resultValue > maxY) {
maxY = resultValue;
}
filteredGraphValues.add(DataPoint( filteredGraphValues.add(DataPoint(
value: transformValueInRange(double.parse(element.resultValue!), value: transformedValue,
element.calculatedResultFlag ?? ""),
actualValue: element.resultValue!, actualValue: element.resultValue!,
label: formatDateAsMMYY(time), label: formatDateAsMMYY(time),
displayTime: resultDate(time), displayTime: resultDate(time),
time: DateUtil.convertStringToDate(element.verifiedOnDateTime), time: DateUtil.convertStringToDate(element.verifiedOnDateTime),
refernceValue: element.calculatedResultFlag ?? "", referenceValue: element.calculatedResultFlag ?? "",
)); ));
}catch(e){ }catch(e){
@ -264,33 +280,34 @@ class LabViewModel extends ChangeNotifier {
try { try {
var dateTime = var dateTime =
DateUtil.convertStringToDate(element.verifiedOnDateTime!); 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 (start != null && end == null) {
if (dateTime.isAtSameMomentAs(start)) { if (dateTime.isAtSameMomentAs(start)) {
filteredGraphValues.add(DataPoint( filteredGraphValues.add(DataPoint(
value: transformValueInRange( value: transformedValue,
double.parse(element.resultValue!),
element.calculatedResultFlag ?? ""),
actualValue: element.resultValue!, actualValue: element.resultValue!,
label: formatDateAsMMYY(dateTime), label: formatDateAsMMYY(dateTime),
displayTime: resultDate(dateTime), displayTime: resultDate(dateTime),
time: time:
DateUtil.convertStringToDate(element.verifiedOnDateTime), DateUtil.convertStringToDate(element.verifiedOnDateTime),
refernceValue: element.calculatedResultFlag ?? "")); referenceValue: element.calculatedResultFlag ?? ""));
} }
} else if (start != null && end != null) { } else if (start != null && end != null) {
if ((dateTime.isAfter(start)) && (dateTime.isBefore(end))) { if ((dateTime.isAfter(start)) && (dateTime.isBefore(end))) {
filteredGraphValues.add(DataPoint( filteredGraphValues.add(DataPoint(
value: transformValueInRange( value: transformedValue,
double.parse(element.resultValue!),
element.calculatedResultFlag ?? ""),
actualValue: element.resultValue!, actualValue: element.resultValue!,
label: formatDateAsMMYY(dateTime), label: formatDateAsMMYY(dateTime),
displayTime: resultDate(dateTime), displayTime: resultDate(dateTime),
time: time:
DateUtil.convertStringToDate(element.verifiedOnDateTime), DateUtil.convertStringToDate(element.verifiedOnDateTime),
refernceValue: element.calculatedResultFlag ?? "")); referenceValue: element.calculatedResultFlag ?? ""));
} }
} }
} catch (e) {} } catch (e) {}
@ -304,8 +321,7 @@ class LabViewModel extends ChangeNotifier {
String formatDateAsMMYY(DateTime date) { String formatDateAsMMYY(DateTime date) {
String year = date.year.toString().substring(2); return '${months[date.month-1]}, ${date.year}';
return '${months[date.month-1]},$year';
} }

@ -1,20 +1,29 @@
import 'dart:math';
import 'package:dartz/dartz.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hmg_patient_app_new/core/app_assets.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/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/lab/history/lab_history_viewmodel.dart';
import 'package:hmg_patient_app_new/features/lab/lab_range_view_model.dart' show LabRangeViewModel; import 'package:hmg_patient_app_new/features/lab/lab_range_view_model.dart' show LabRangeViewModel;
import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.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/lab_result.dart';
import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_calender.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_calender.dart';
import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_list_item.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_results/lab_result_list_item.dart';
import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors; import 'package:hmg_patient_app_new/theme/colors.dart' show AppColors;
import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart';
import 'package:hmg_patient_app_new/widgets/graph/custom_graph.dart'; import 'package:hmg_patient_app_new/widgets/graph/custom_graph.dart';
import 'package:provider/provider.dart' show Consumer, Provider; import 'package:provider/provider.dart' show Consumer, Provider;
import '../../../widgets/common_bottom_sheet.dart' show showCommonBottomSheetWithoutHeight; import '../../../widgets/common_bottom_sheet.dart'
show showCommonBottomSheetWithoutHeight;
import '../../book_appointment/widgets/appointment_calendar.dart'
show AppointmentCalendar;
class LabResultDetails extends StatelessWidget { class LabResultDetails extends StatelessWidget {
final LabResult recentLabResult; final LabResult recentLabResult;
@ -54,12 +63,18 @@ class LabResultDetails extends StatelessWidget {
children: [ children: [
Text( Text(
recentLabResult.testCode ?? "", recentLabResult.testCode ?? "",
style: TextStyle(fontSize: 32, fontWeight: FontWeight.w600, color: AppColors.textColor, letterSpacing: -2), style: TextStyle(
fontSize: 32,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
color: AppColors.textColor,
letterSpacing: -2),
), ),
Text( Text(
"Result of ${recentLabResult.verifiedOn ?? ""}".needTranslation, "Result of ${recentLabResult.verifiedOn ?? ""}".needTranslation,
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
fontFamily: 'Poppins',
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
color: AppColors.greyTextColor, color: AppColors.greyTextColor,
), ),
@ -73,6 +88,7 @@ class LabResultDetails extends StatelessWidget {
Expanded( Expanded(
child: Row( child: Row(
spacing: 4.h, spacing: 4.h,
children: [ children: [
Flexible( Flexible(
child: Text( child: Text(
@ -80,6 +96,7 @@ class LabResultDetails extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontSize: 24.fSize, fontSize: 24.fSize,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
fontFamily: 'Poppins',
color: model.getColor( color: model.getColor(
recentLabResult.calculatedResultFlag ?? "", recentLabResult.calculatedResultFlag ?? "",
), ),
@ -97,6 +114,7 @@ class LabResultDetails extends StatelessWidget {
style: TextStyle( style: TextStyle(
fontSize: 12.fSize, fontSize: 12.fSize,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
fontFamily: 'Poppins',
color: AppColors.greyTextColor, color: AppColors.greyTextColor,
), ),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
@ -117,6 +135,7 @@ class LabResultDetails extends StatelessWidget {
), ),
], ],
) )
], ],
)); ));
@ -138,9 +157,11 @@ class LabResultDetails extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
model.isGraphVisible ? "History FlowChart".needTranslation : "History".needTranslation, model.isGraphVisible?"History FlowChart".needTranslation: "History".needTranslation,
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: AppColors.textColor, color: AppColors.textColor,
), ),
@ -149,15 +170,24 @@ class LabResultDetails extends StatelessWidget {
spacing: 16.h, spacing: 16.h,
children: [ children: [
//todo handle when the graph icon is being displayed //todo handle when the graph icon is being displayed
Utils.buildSvgWithAssets(icon: model.isGraphVisible ? AppAssets.ic_list : AppAssets.ic_graph, width: 24, height: 24).onPress(() { Utils.buildSvgWithAssets(
icon: model.isGraphVisible?AppAssets.ic_list:AppAssets.ic_graph,
width: 24,
height: 24)
.onPress(() {
model.alterGraphVisibility(); model.alterGraphVisibility();
}), }),
Utils.buildSvgWithAssets(icon: AppAssets.ic_date_filter, width: 24, height: 24).onPress(() { Utils.buildSvgWithAssets(
icon: AppAssets.ic_date_filter,
width: 24,
height: 24)
.onPress(() {
showCommonBottomSheetWithoutHeight( showCommonBottomSheetWithoutHeight(
title: "Set The Date Range".needTranslation, title: "Set The Date Range".needTranslation,
context, context,
child: LabResultCalender( child: LabResultCalender(
onRangeSelected: (start, end) { onRangeSelected: (start, end) {
// if (start != null) { // if (start != null) {
labmodel.getSelectedDateRange(start, end); labmodel.getSelectedDateRange(start, end);
// } // }
@ -171,7 +201,7 @@ class LabResultDetails extends StatelessWidget {
], ],
) )
], ],
).paddingOnly(bottom: model.isGraphVisible ? 16.h : 24.h), ).paddingOnly(bottom: model.isGraphVisible? 16.h :24.h),
historyBody(model, labmodel) historyBody(model, labmodel)
], ],
)), )),
@ -181,7 +211,7 @@ class LabResultDetails extends StatelessWidget {
return Text( return Text(
value, value,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.w300, fontWeight: FontWeight.w600,
fontFamily: 'Poppins', fontFamily: 'Poppins',
fontSize: 8.fSize, fontSize: 8.fSize,
color: AppColors.textColor, color: AppColors.textColor,
@ -191,37 +221,52 @@ class LabResultDetails extends StatelessWidget {
Widget buildBottomLabel(String label) { Widget buildBottomLabel(String label) {
return Padding( return Padding(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top:8.0),
child: Text( child: Text(
label, label,
style: TextStyle(fontSize: 8.fSize, fontFamily: 'Poppins', fontWeight: FontWeight.w600, color: AppColors.labelTextColor), style: TextStyle(
fontSize: 8.fSize,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
color: AppColors.labelTextColor),
), ),
); );
} }
Widget historyBody(LabRangeViewModel model, LabViewModel labmodel) { Widget historyBody(LabRangeViewModel model, LabViewModel labmodel) {
if (model.isGraphVisible) { if(model.isGraphVisible){
var graphColor = labmodel.getColor(recentLabResult.calculatedResultFlag??"N");
return CustomGraph( return CustomGraph(
dataPoints: labmodel.filteredGraphValues, dataPoints: labmodel.filteredGraphValues,
maxY: 100, // maxY: 100,
makeGraphBasedOnActualValue: true,
leftLabelReservedSize: 40,
leftLabelInterval: getInterval(labmodel),
maxY: (labmodel.maxY)+(getInterval(labmodel)??0)/2,
leftLabelFormatter: (value) { leftLabelFormatter: (value) {
switch (value.toInt()) { return leftLabels(value.toStringAsFixed(2).tr());
case 20: // switch (value.toInt()) {
return leftLabels("Critical Low".needTranslation); // case 10:
case 40: // return leftLabels("Critical Low".needTranslation);
return leftLabels("Low".needTranslation); // case 30:
case 60: // return leftLabels("Low".needTranslation);
return leftLabels("Normal".needTranslation); // case 50:
case 80: // return leftLabels("Normal".needTranslation);
return leftLabels("High".needTranslation); // case 70:
case 100: // return leftLabels("High".needTranslation);
return leftLabels("Critical High".needTranslation); // case 90:
default: // return leftLabels(
return SizedBox.shrink(); // "Critical High".needTranslation);
} // default:
// return SizedBox.shrink();
// }
}, },
graphColor:graphColor ,
graphShadowColor: graphColor.withOpacity(.4),
graphGridColor: graphColor.withOpacity(.4),
bottomLabelFormatter: (value, data) { bottomLabelFormatter: (value, data) {
if (data.isEmpty) return SizedBox.shrink(); if(data.isEmpty) return SizedBox.shrink();
if (value == 0) { if (value == 0) {
return buildBottomLabel(data[value.toInt()].label); return buildBottomLabel(data[value.toInt()].label);
} }
@ -233,9 +278,10 @@ class LabResultDetails extends StatelessWidget {
} }
return SizedBox.shrink(); return SizedBox.shrink();
}, },
minX:(labmodel.filteredGraphValues.length == 1)?null : -.2,
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
height: 180.h); height: 180.h);
} else { }else {
return labHistoryList(model, labmodel); return labHistoryList(model, labmodel);
} }
} }
@ -245,14 +291,13 @@ class LabResultDetails extends StatelessWidget {
height: 180.h, height: 180.h,
child: ListView.separated( child: ListView.separated(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
itemCount: labmodel.filteredGraphValues.length, itemCount: labmodel.filteredGraphValues.length,itemBuilder: (context, index){
itemBuilder: (context, index) {
var data = labmodel.filteredGraphValues.reversed.toList()[index]; var data = labmodel.filteredGraphValues.reversed.toList()[index];
return LabHistoryItem( return LabHistoryItem(
dayNameAndDate: labmodel.getFormattedDate(data.time), dayNameAndDate: labmodel.getFormattedDate(data.time),
result: data.actualValue, result: data.actualValue,
assetUrl: labmodel.getAssetUrlWRTResult(data.refernceValue), assetUrl: labmodel.getAssetUrlWRTResult(data.referenceValue),
shouldRotateIcon: labmodel.getRotationWRTResult(data.refernceValue), shouldRotateIcon: labmodel.getRotationWRTResult(data.referenceValue),
); );
}, },
separatorBuilder: (_, __) => Divider( separatorBuilder: (_, __) => Divider(
@ -262,4 +307,14 @@ class LabResultDetails extends StatelessWidget {
), ),
); );
} }
double? getInterval(LabViewModel labmodel) {
var maxX = labmodel.maxY;
if(maxX >1 && maxX < 5) return 1;
if(maxX >5 && maxX < 10) return 5;
if(maxX >10 && maxX < 50) return 10;
if(maxX >50 && maxX < 100) return 20;
if(maxX >100 && maxX < 200) return 30;
return 50;
}
} }

@ -3,40 +3,43 @@ import 'package:fl_chart/fl_chart.dart';
import 'package:hmg_patient_app_new/core/common_models/data_points.dart'; import 'package:hmg_patient_app_new/core/common_models/data_points.dart';
import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart';
import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/theme/colors.dart';
/// A customizable line graph widget using `fl_chart`.
/// ///
/// CustomGraph(dataPoints: sampleData, scrollDirection: Axis.horizontal,height: 200,maxY: 100, maxX:2.5, /// Displays a line chart with configurable axis labels, colors, and data points.
/// leftLabelFormatter: (value){ /// Useful for visualizing time series or other sequential data.
/// Widget buildLabel(String label) {
/// return Padding(
/// padding: const EdgeInsets.only(right: 8),
/// child: Text(
/// label,
/// style: TextStyle(
/// fontSize: 8.fSize, color: AppColors.textColor,
/// fontFamily:
/// FontUtils.getFontFamilyForLanguage(false)
/// ),
/// textAlign: TextAlign.right,
/// ),
/// );
/// }
/// switch (value.toInt()) {
/// ///
/// case 20: /// **Parameters:**
/// return buildLabel("Critical Low"); /// - [dataPoints]: List of `DataPoint` objects to plot.
/// case 40: /// - [leftLabelFormatter]: Function to build left axis labels.
/// return buildLabel("Low"); /// - [bottomLabelFormatter]: Function to build bottom axis labels.
/// case 60: /// - [width]: Optional width of the chart.
/// return buildLabel("Normal"); /// - [height]: Required height of the chart.
/// case 80: /// - [maxY], [maxX], [minX]: Axis bounds.
/// return buildLabel("High"); /// - [spotColor]: Color of the touched spot marker.
/// case 100: /// - [graphColor]: Color of the line.
/// return buildLabel("Critical High"); /// - [graphShadowColor]: Color of the area below the line.
/// } /// - [graphGridColor]: Color of the grid lines.
/// return const SizedBox.shrink(); /// - [bottomLabelColor]: Color of bottom axis labels.
/// }, /// - [bottomLabelSize]: Font size for bottom axis labels.
/// - [bottomLabelFontWeight]: Font weight for bottom axis labels.
/// - [leftLabelInterval]: Interval between left axis labels.
/// - [leftLabelReservedSize]: Reserved space for left axis labels.
/// - [scrollDirection]: Axis direction for scrolling.
/// - [showBottomTitleDates]: Whether to show bottom axis labels.
/// - [isFullScreeGraph]: Whether the graph is fullscreen.
/// - [makeGraphBasedOnActualValue]: Use `actualValue` for plotting.
/// ///
/// ), /// Example usage:
/// ```dart
/// CustomGraph(
/// dataPoints: sampleData,
/// leftLabelFormatter: (value) => ...,
/// bottomLabelFormatter: (value, dataPoints) => ...,
/// height: 200,
/// scrollDirection: Axis.horizontal,
/// maxY: 100,
/// maxX: 2.5,
/// )
class CustomGraph extends StatelessWidget { class CustomGraph extends StatelessWidget {
final List<DataPoint> dataPoints; final List<DataPoint> dataPoints;
final double? width; final double? width;
@ -51,6 +54,8 @@ class CustomGraph extends StatelessWidget {
final Color bottomLabelColor; final Color bottomLabelColor;
final double? bottomLabelSize; final double? bottomLabelSize;
final FontWeight? bottomLabelFontWeight; final FontWeight? bottomLabelFontWeight;
final double? leftLabelInterval;
final double? leftLabelReservedSize;
///creates the left label and provide it to the chart as it will be used by other part of the application so the label will be different for every chart ///creates the left label and provide it to the chart as it will be used by other part of the application so the label will be different for every chart
final Widget Function(double) leftLabelFormatter; final Widget Function(double) leftLabelFormatter;
@ -60,6 +65,7 @@ class CustomGraph extends StatelessWidget {
final Axis scrollDirection; final Axis scrollDirection;
final bool showBottomTitleDates; final bool showBottomTitleDates;
final bool isFullScreeGraph; final bool isFullScreeGraph;
final bool makeGraphBasedOnActualValue;
const CustomGraph({ const CustomGraph({
super.key, super.key,
@ -79,6 +85,9 @@ class CustomGraph extends StatelessWidget {
this.bottomLabelColor = AppColors.textColor, this.bottomLabelColor = AppColors.textColor,
this.bottomLabelFontWeight = FontWeight.w500, this.bottomLabelFontWeight = FontWeight.w500,
this.bottomLabelSize, this.bottomLabelSize,
this.leftLabelInterval,
this.leftLabelReservedSize,
this.makeGraphBasedOnActualValue = false,
required this.bottomLabelFormatter, required this.bottomLabelFormatter,
this.minX, this.minX,
}); });
@ -87,13 +96,7 @@ class CustomGraph extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
// var maxY = 0.0; // var maxY = 0.0;
double interval = 20; double interval = 20;
if ((maxY ?? 0) > 10 && (maxY ?? 0) <= 20) {
interval = 2;
} else if ((maxY ?? 0) > 5 && (maxY ?? 0) <= 10) {
interval = 1;
} else if ((maxY ?? 0) >= 0 && (maxY ?? 0) <= 5) {
interval = .4;
}
return Material( return Material(
color: Colors.white, color: Colors.white,
child: SizedBox( child: SizedBox(
@ -102,11 +105,11 @@ class CustomGraph extends StatelessWidget {
child: LineChart( child: LineChart(
LineChartData( LineChartData(
minY: 0, minY: 0,
maxY: // maxY: ((maxY?.ceilToDouble() ?? 0.0) + interval).floorToDouble(),
((maxY?.ceilToDouble() ?? 0.0) + interval).floorToDouble(), maxY: maxY,
// minX: dataPoints.first.labelValue - 1, // minX: dataPoints.first.labelValue - 1,
maxX: maxX, maxX: maxX,
minX: minX ??-0.2, minX: minX ,
lineTouchData: LineTouchData( lineTouchData: LineTouchData(
getTouchLineEnd: (_, __) => 0, getTouchLineEnd: (_, __) => 0,
getTouchedSpotIndicator: (barData, indicators) { getTouchedSpotIndicator: (barData, indicators) {
@ -140,7 +143,7 @@ class CustomGraph extends StatelessWidget {
return LineTooltipItem( return LineTooltipItem(
// '${dataPoint.label} ${spot.y.toStringAsFixed(2)}', // '${dataPoint.label} ${spot.y.toStringAsFixed(2)}',
'${dataPoint.actualValue} ${dataPoint.displayTime}', '${dataPoint.value} - ${dataPoint.actualValue} - ${dataPoint.displayTime}',
TextStyle( TextStyle(
color: Colors.black, color: Colors.black,
fontSize: 12.fSize, fontSize: 12.fSize,
@ -156,8 +159,8 @@ class CustomGraph extends StatelessWidget {
leftTitles: AxisTitles( leftTitles: AxisTitles(
sideTitles: SideTitles( sideTitles: SideTitles(
showTitles: true, showTitles: true,
reservedSize: 77, reservedSize: leftLabelReservedSize??80,
interval: .1, // Let fl_chart handle it interval: leftLabelInterval ?? .1, // Let fl_chart handle it
getTitlesWidget: (value, _) { getTitlesWidget: (value, _) {
return leftLabelFormatter(value); return leftLabelFormatter(value);
}, },
@ -190,12 +193,12 @@ class CustomGraph extends StatelessWidget {
gridData: FlGridData( gridData: FlGridData(
show: true, show: true,
drawVerticalLine: false, drawVerticalLine: false,
horizontalInterval: 20, // horizontalInterval: 40,
checkToShowHorizontalLine: (value) => checkToShowHorizontalLine: (value) =>
value >= 0 && value <= 100, value >= 0 && value <= 100,
getDrawingHorizontalLine: (value) { getDrawingHorizontalLine: (value) {
return FlLine( return FlLine(
color: AppColors.graphGridColor, color: graphGridColor,
strokeWidth: 1, strokeWidth: 1,
dashArray: [5, 5], dashArray: [5, 5],
); );
@ -208,7 +211,9 @@ class CustomGraph extends StatelessWidget {
List<LineChartBarData> _buildColoredLineSegments(List<DataPoint> dataPoints) { List<LineChartBarData> _buildColoredLineSegments(List<DataPoint> dataPoints) {
final List<FlSpot> allSpots = dataPoints.asMap().entries.map((entry) { final List<FlSpot> allSpots = dataPoints.asMap().entries.map((entry) {
return FlSpot(entry.key.toDouble(), entry.value.value); double value = (makeGraphBasedOnActualValue)?double.tryParse(entry.value.actualValue)??0.0:entry.value.value;
debugPrint("the value is $value");
return FlSpot(entry.key.toDouble(), value);
}).toList(); }).toList();
var data = [ var data = [

Loading…
Cancel
Save