From cbadcd5febbf11311047311d3c94a8a4d169462e Mon Sep 17 00:00:00 2001 From: "Mirza.Shafique" Date: Tue, 17 Aug 2021 15:56:48 +0300 Subject: [PATCH] Vital Sings Detail Page 1.0 --- .../medical/vital_sign/LineChartCurved.dart | 68 +++++----- .../vital_sign/vital_sign_details_screen.dart | 92 +++++++++++-- .../vital_sign_item_details_screen.dart | 3 + .../vital_sing_chart_and_detials.dart | 128 ++++++++++++++---- 4 files changed, 226 insertions(+), 65 deletions(-) diff --git a/lib/pages/medical/vital_sign/LineChartCurved.dart b/lib/pages/medical/vital_sign/LineChartCurved.dart index e62a300a..c70b206e 100644 --- a/lib/pages/medical/vital_sign/LineChartCurved.dart +++ b/lib/pages/medical/vital_sign/LineChartCurved.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; @@ -38,18 +39,20 @@ class LineChartCurved extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const SizedBox( - height: 4, - ), - Text( - title, - style: TextStyle( - color: Colors.black, - fontSize: 15, - letterSpacing: 2), - textAlign: TextAlign.center, + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + title, + style: TextStyle(color: Colors.black, fontSize: 16, letterSpacing: -0.64, fontWeight: FontWeight.w600), + textAlign: TextAlign.center, + ), + ), + ], ), - SizedBox(height: 10,), + mHeight(10), Expanded( child: Padding( padding: const EdgeInsets.only(right: 18.0, left: 16.0), @@ -93,13 +96,11 @@ class LineChartCurved extends StatelessWidget { lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( tooltipBgColor: Colors.white, - ), touchCallback: (LineTouchResponse touchResponse) {}, handleBuiltInTouches: true, ), - gridData: FlGridData( - show: true, drawVerticalLine: true, drawHorizontalLine: true), + gridData: FlGridData(show: true, drawVerticalLine: true, drawHorizontalLine: true,horizontalInterval: 10,verticalInterval: 10), titlesData: FlTitlesData( bottomTitles: SideTitles( showTitles: true, @@ -107,7 +108,7 @@ class LineChartCurved extends StatelessWidget { color: Colors.black, fontSize: 10, ), - rotateAngle:-65, + rotateAngle: -65, margin: 22, getTitles: (value) { if (timeSeries.length < 15) { @@ -116,10 +117,8 @@ class LineChartCurved extends StatelessWidget { } else return ''; } else { - if (value.toInt() == 0) - return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; - if (value.toInt() == timeSeries.length - 1) - return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + if (value.toInt() == 0) return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + if (value.toInt() == timeSeries.length - 1) return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; if (xAxixs.contains(value.toInt())) { return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; } @@ -134,8 +133,15 @@ class LineChartCurved extends StatelessWidget { fontWeight: FontWeight.bold, fontSize: 10, ), - interval:getMaxY() - getMinY() <=500?getMaxY() - getMinY() <=50?10:50:getMaxY() - getMinY() <=1000?100:getMaxY() - getMinY()>=10000?5000:200, - + interval: getMaxY() - getMinY() <= 500 + ? getMaxY() - getMinY() <= 50 + ? 10 + : 50 + : getMaxY() - getMinY() <= 1000 + ? 100 + : getMaxY() - getMinY() >= 10000 + ? 5000 + : 200, margin: 12, ), ), @@ -165,42 +171,42 @@ class LineChartCurved extends StatelessWidget { ); } - calculateMaxAndMin(){ + calculateMaxAndMin() { getMaxY(); getMaxX(); getMin(); getMinY(); - increasingY = ((maxY-minY)/timeSeries.length - 1)*15; + increasingY = ((maxY - minY) / timeSeries.length - 1) * 15; maxY += increasingY.abs(); minY -= increasingY.abs(); } double getMaxY() { - maxY = 0; + maxY = 0; timeSeries.forEach((element) { double resultValueDouble = element.sales; if (resultValueDouble > maxY) maxY = resultValueDouble; }); - return maxY.roundToDouble() ; + return maxY.roundToDouble(); } - getMaxX(){ + getMaxX() { maxX = (timeSeries.length - 1).toDouble(); } - double getMin(){ - minX = 0; + double getMin() { + minX = 0; timeSeries.forEach((element) { double resultValueDouble = element.sales; if (resultValueDouble < minX) minX = resultValueDouble; }); - return minX.roundToDouble() ; + return minX.roundToDouble(); } double getMinY() { - minY = 0; + minY = 0; timeSeries.forEach((element) { double resultValueDouble = element.sales; if (resultValueDouble < minY) minY = resultValueDouble; @@ -220,7 +226,7 @@ class LineChartCurved extends StatelessWidget { spots: spots, isCurved: true, colors: [secondaryColor], - barWidth: 3, + barWidth: 1.5, isStrokeCapRound: true, dotData: FlDotData( show: false, diff --git a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart index a8636051..18519d1b 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -116,17 +116,89 @@ class VitalSignDetailsScreen extends StatelessWidget { itemBuilder: (BuildContext context, int index) { return InkWell( onTap: () { - if (isNotOneAppointment) { - Navigator.push( - context, - FadePage( - page: VitalSignItemDetailsScreen( - pageKey: VitalSignDetails.Height, - pageTitle: TranslationBase.of(context).height, - vitalList: mode.vitalSignResModelList, + if (index == 0) { + if (isNotOneAppointment) { + Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Height, + pageTitle: TranslationBase.of(context).height, + vitalList: mode.vitalSignResModelList, + ), ), - ), - ); + ); + } + } else if (index == 1) { + if (isNotOneAppointment) { + Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Weight, + pageTitle: TranslationBase.of(context).weight, + vitalList: mode.vitalSignResModelList, + ), + ), + ); + } + } else if (index == 2) { + if (isNotOneAppointment) { + Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Temperature, + pageTitle: + TranslationBase.of(context).temperature, + vitalList: mode.vitalSignResModelList, + + ), + ), + ); + } + } else if (index == 3) { + if (isNotOneAppointment) { + Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.heart, + pageTitle: TranslationBase.of(context).heart, + vitalList: mode.vitalSignResModelList, + + ), + ), + ); + } + } else if (index == 4) { + if (isNotOneAppointment) { + Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.Respiration, + pageTitle: + TranslationBase.of(context).respirationRate, + vitalList: mode.vitalSignResModelList, + + ), + ), + ); + } + } else if (index == 5) { + if (isNotOneAppointment) { + Navigator.push( + context, + FadePage( + page: VitalSignItemDetailsScreen( + pageKey: VitalSignDetails.BloodPressure, + pageTitle: TranslationBase.of(context).bloodPressure, + vitalList: mode.vitalSignResModelList, + ), + ), + ); + } } }, child: VitalSignItem( diff --git a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart index 551392e0..c3c85160 100644 --- a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart @@ -159,6 +159,9 @@ class VitalSignItemDetailsScreen extends StatelessWidget { return AppScaffold( appBarTitle: pageTitle, isShowAppBar: true, + showNewAppBarTitle: true, + showNewAppBar: true, + body: ListView( children: VSchart.map((chartInfo) { var vitalListTemp = vitalList.where( diff --git a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart index b09a579d..65d838a1 100644 --- a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart +++ b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart @@ -1,15 +1,20 @@ import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_wideget.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; +import 'package:provider/provider.dart'; import 'LineChartCurved.dart'; -class VitalSingChartAndDetials extends StatelessWidget { +class VitalSingChartAndDetials extends StatefulWidget { VitalSingChartAndDetials({ Key key, @required this.vitalList, @@ -24,38 +29,113 @@ class VitalSingChartAndDetials extends StatelessWidget { final String viewKey; final String title1; final String title2; + + @override + _VitalSingChartAndDetialsState createState() => _VitalSingChartAndDetialsState(); +} + +class _VitalSingChartAndDetialsState extends State { List timeSeriesData = []; + bool isExpended = true; + ProjectViewModel projectViewModel; + + @override + void initState() { + // TODO: implement initState + super.initState(); + generateData(); + } @override Widget build(BuildContext context) { - generateData(); - return Column( - children: [ - AppExpandableNotifier( - isExpand: true, - headerWidget: LineChartCurved(title: name,timeSeries:timeSeriesData,indexes: timeSeriesData.length~/5.5,), - bodyWidget: VitalSignDetailsWidget( - vitalList: vitalList, - title1: title1, - title2: title2, - viewKey: viewKey, + projectViewModel = Provider.of(context); + return SingleChildScrollView( + child: Column( + children: [ + Card( + shape: cardRadius(12), + elevation: 1, + margin: EdgeInsets.only(left: 16, top: 16, right: 16, bottom: 8), + child: LineChartCurved( + title: widget.name, + timeSeries: timeSeriesData, + indexes: timeSeriesData.length ~/ 5.5, + ), ), - ), - ], + Card( + shape: cardRadius(12), + margin: EdgeInsets.only(left: 16, top: 8, right: 16, bottom: 16), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationBase.of(context).graphDetails, + style: TextStyle( + fontSize: 16, + letterSpacing: -0.64, + fontWeight: FontWeight.w600, + ), + ), + Table( + columnWidths: { + 0: FlexColumnWidth(2), + 1: FlexColumnWidth(1), + // 2: FlexColumnWidth(1), + }, + children: fullData(widget.vitalList, context), + ), + ], + ), + ), + ) + ], + ), ); } + List fullData(List labResultList, context) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Utils.tableColumnTitle(widget.title1), + Utils.tableColumnTitle(widget.title2), + // Utils.tableColumnTitle(TranslationBase.of(context).range), + ], + ), + ); + + for (int i = 0; i < labResultList.length; i++) { + var data = labResultList[i].toJson()[widget.viewKey]; + if (data != 0) + tableRow.add( + TableRow( + children: [ + Utils.tableColumnValue( + "${projectViewModel.isArabic ? DateUtil.getWeekDayArabic(labResultList[i].vitalSignDate.weekday) : DateUtil.getWeekDay(labResultList[i].vitalSignDate.weekday)}, ${labResultList[i].vitalSignDate.day} ${projectViewModel.isArabic ? DateUtil.getMonthArabic(labResultList[i].vitalSignDate.month) : DateUtil.getMonth(labResultList[i].vitalSignDate.month)}, ${labResultList[i].vitalSignDate.year}", + isLast: i == (labResultList.length - 1)), + Utils.tableColumnValue('${labResultList[i].toJson()[widget.viewKey]}', isLast: i == (labResultList.length - 1)), + ], + ), + ); + } + + return tableRow; + } + generateData() { - if (vitalList.length > 0) { - vitalList.reversed.toList().forEach( - (element) { - if( element.toJson()[viewKey]!=null && element.toJson()[viewKey]?.toInt()!=0) - timeSeriesData.add( - TimeSeriesSales2( - new DateTime(element.vitalSignDate.year, element.vitalSignDate.month, element.vitalSignDate.day), - element.toJson()[viewKey].toDouble(), - ), - ); + if (widget.vitalList.length > 0) { + widget.vitalList.reversed.toList().forEach( + (element) { + if (element.toJson()[widget.viewKey] != null && element.toJson()[widget.viewKey]?.toInt() != 0) + timeSeriesData.add( + TimeSeriesSales2( + new DateTime(element.vitalSignDate.year, element.vitalSignDate.month, element.vitalSignDate.day), + element.toJson()[widget.viewKey].toDouble(), + ), + ); }, ); }