From ff0d66ccdbb9c6df99504dbd05c1b7cb446ca6e2 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 3 Dec 2020 14:04:11 +0300 Subject: [PATCH 1/8] Covid test translations --- lib/config/localized_values.dart | 8 +++ .../Covid-DriveThru/Covid-TimeSlots.dart | 60 ++++++++++--------- .../covid-drivethru-location.dart | 52 ++++++++-------- lib/pages/landing/home_page.dart | 10 ++-- lib/uitl/translations_delegate_base.dart | 3 +- 5 files changed, 75 insertions(+), 58 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index d51376c3..23e55ea4 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1178,5 +1178,13 @@ const Map localizedValues = { "referralNumber": { "en": "Referral Number", "ar": "رقم الإحالة" + }, + "covidTest": { + "en": "COVID-19 TEST", + "ar": "فحص كورونا" + }, + "driveThru": { + "en": "Drive-Thru", + "ar": "من السيارة" } }; diff --git a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart index 3e58b657..6481a479 100644 --- a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart +++ b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart @@ -9,13 +9,13 @@ import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.da import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:intl/intl.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; import 'package:table_calendar/table_calendar.dart'; class CovidTimeSlots extends StatefulWidget { @@ -469,9 +469,7 @@ class _CovidTimeSlotsState extends State } bookCovidTestAppointment() { -// Navigator.push(context, -// MaterialPageRoute(builder: (context) => CovidPaymentAlert())); - + GifLoaderDialogUtils.showMyDialog(context); DoctorList docObject = new DoctorList(); docObject.doctorID = widget.selectedDoctorID; docObject.clinicID = widget.selectedClinicID; @@ -494,11 +492,12 @@ class _CovidTimeSlotsState extends State print(res); if (res['MessageStatus'] == 1) { AppToast.showSuccessToast(message: "Appointment Booked Successfully"); - Future.delayed(new Duration(milliseconds: 1800), () { - getPatientShare(context, res['AppointmentNo'], docObject.clinicID, - docObject.projectID, docObject); - }); + // Future.delayed(new Duration(milliseconds: 1800), () { + getPatientShare(context, res['AppointmentNo'], docObject.clinicID, + docObject.projectID, docObject); + // }); } else { + GifLoaderDialogUtils.hideDialog(context); appo = new AppoitmentAllHistoryResultList(); appo.appointmentNo = res['SameClinicApptList'][0]['AppointmentNo']; appo.clinicID = res['SameClinicApptList'][0]['DoctorID']; @@ -521,28 +520,32 @@ class _CovidTimeSlotsState extends State dialog.showAlertDialog(context); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } cancelAppointment(DoctorList docObject, AppoitmentAllHistoryResultList appo, BuildContext context) { + GifLoaderDialogUtils.showMyDialog(context); ConfirmDialog.closeAlertDialog(context); DoctorsListService service = new DoctorsListService(); service.cancelAppointment(appo, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { - Future.delayed(new Duration(milliseconds: 1500), () { - insertAppointmentCovidTest(context, docObject); - }); + // Future.delayed(new Duration(milliseconds: 1500), () { + insertAppointmentCovidTest(context, docObject); + // }); } else { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } getPatientShare(context, String appointmentNo, int clinicID, int projectID, @@ -551,17 +554,14 @@ class _CovidTimeSlotsState extends State service .getPatientShare(appointmentNo, clinicID, projectID, context) .then((res) { - print(res); - widget.patientShareResponse = new PatientShareResponse.fromJson(res); - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - navigateToPaymentAlert(); - }); + GifLoaderDialogUtils.hideDialog(context); + widget.patientShareResponse = new PatientShareResponse.fromJson(res); + navigateToPaymentAlert(); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } navigateToPaymentAlert() { @@ -573,8 +573,10 @@ class _CovidTimeSlotsState extends State } getCovidFreeSlots(BuildContext context, int projectID) { + GifLoaderDialogUtils.showMyDialog(context); CovidDriveThruService service = new CovidDriveThruService(); service.getCovidFreeSlots(context, projectID).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res['COVID19_FreeTimeSlots']); if (res['MessageStatus'] == 1) { if (res['COVID19_FreeTimeSlots'].length != 0) { @@ -592,11 +594,13 @@ class _CovidTimeSlotsState extends State }); } else {} } else { + GifLoaderDialogUtils.hideDialog(context); AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } } diff --git a/lib/pages/Covid-DriveThru/covid-drivethru-location.dart b/lib/pages/Covid-DriveThru/covid-drivethru-location.dart index 0563c4bd..b4c02d50 100644 --- a/lib/pages/Covid-DriveThru/covid-drivethru-location.dart +++ b/lib/pages/Covid-DriveThru/covid-drivethru-location.dart @@ -3,11 +3,12 @@ import 'package:diplomaticquarterapp/models/CovidDriveThru/DriveThroughTestingCe import 'package:diplomaticquarterapp/pages/Covid-DriveThru/covid-payment-details.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/covid-drivethru/covid-drivethru.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:maps_launcher/maps_launcher.dart'; -import 'package:smart_progress_bar/smart_progress_bar.dart'; class CovidDrivethruLocation extends StatefulWidget { @override @@ -253,6 +254,8 @@ class _CovidDrivethruLocationState extends State { } getPaymentInfo(BuildContext context, String projectID) { + GifLoaderDialogUtils.showMyDialog(context); + CovidDriveThruService service = new CovidDriveThruService(); CovidPaymentInfoResponse covidPaymentInfoResponse = @@ -261,33 +264,33 @@ class _CovidDrivethruLocationState extends State { service .getCovidPaymentInformation(context, int.parse(projectID)) .then((res) { - if (res['MessageStatus'] == 1) { - setState(() { - covidPaymentInfoResponse = CovidPaymentInfoResponse.fromJson( - res['COVID19_PatientShare']); - print(covidPaymentInfoResponse.procedureNameField); - }); - } else {} - }) - .catchError((err) { - print(err); - }) - .showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)) - .then((value) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => CovidPaymentDetails( - covidPaymentInfoResponse: covidPaymentInfoResponse, - projectID: int.parse(projectID), - ))); + GifLoaderDialogUtils.hideDialog(context); + if (res['MessageStatus'] == 1) { + setState(() { + covidPaymentInfoResponse = + CovidPaymentInfoResponse.fromJson(res['COVID19_PatientShare']); + print(covidPaymentInfoResponse.procedureNameField); }); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => CovidPaymentDetails( + covidPaymentInfoResponse: covidPaymentInfoResponse, + projectID: int.parse(projectID), + ))); + } else {} + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); } getProjectsList(BuildContext context) { + GifLoaderDialogUtils.showMyDialog(context); CovidDriveThruService service = new CovidDriveThruService(); service.getCovidProjectsList(context).then((res) { + GifLoaderDialogUtils.hideDialog(context); print(res); if (res['MessageStatus'] == 1) { print(res); @@ -298,8 +301,9 @@ class _CovidDrivethruLocationState extends State { }); } else {} }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); print(err); - }).showProgressBar( - text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6)); + }); } } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index fb2cc108..eb7cedb7 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -85,10 +85,10 @@ class _HomePageState extends State { borderRadius: BorderRadius.all( Radius.circular(5))), child: Container( - margin: EdgeInsets.only(top: 10.0), + margin: EdgeInsets.only(top: 5.0), child: Column( children: [ - Text("COVID-19 TEST", + Text(TranslationBase.of(context).covidTest, style: TextStyle( color: Colors.white, fontWeight: @@ -107,10 +107,10 @@ class _HomePageState extends State { Container( margin: EdgeInsets.only( left: 10.0, - top: 10.0), + top: 5.0), child: Column( children: [ - Text("Drive-Thru", + Text(TranslationBase.of(context).driveThru, style: TextStyle( color: Colors .white, @@ -147,7 +147,7 @@ class _HomePageState extends State { navigateToCovidDriveThru(); }, child: Text( - "BOOK NOW", + TranslationBase.of(context).bookNow, style: TextStyle( fontSize: 12.0)), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index aa05456c..e970bdb3 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -898,11 +898,12 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get addedChild => localizedValues['added-child'][locale.languageCode]; String get appUpdate => localizedValues['appUpdate'][locale.languageCode]; String get ereferralSaveSuccess => localizedValues['ereferralSaveSuccess'][locale.languageCode]; - String get referralStatus => localizedValues['referralStatus'][locale.languageCode]; String get referralDate => localizedValues['referralDate'][locale.languageCode]; String get patientName => localizedValues['patientName'][locale.languageCode]; String get referralNumber => localizedValues['referralNumber'][locale.languageCode]; + String get covidTest => localizedValues['covidTest'][locale.languageCode]; + String get driveThru => localizedValues['driveThru'][locale.languageCode]; } From e495d3e5ad16c2b68c84c313e1ae60b15b10ca76 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 9 Dec 2020 10:18:56 +0300 Subject: [PATCH 2/8] Health Data integration implementing --- android/app/src/main/AndroidManifest.xml | 1 + lib/config/config.dart | 3 + lib/config/localized_values.dart | 12 ++ .../health_data_list.dart | 70 +++++++-- .../smart_watch_health_data/stepsTracker.dart | 91 +++++++++++ .../appointment_services/GetDoctorsList.dart | 144 +++++++++++++----- lib/uitl/translations_delegate_base.dart | 3 + pubspec.yaml | 2 +- 8 files changed, 270 insertions(+), 56 deletions(-) create mode 100644 lib/pages/medical/smart_watch_health_data/stepsTracker.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 12ced804..0ef45c2b 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + diff --git a/lib/config/config.dart b/lib/config/config.dart index 81c5f2e4..730cb049 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -243,6 +243,9 @@ const GET_USER_TERMS = '/Services/Patients.svc/REST/GetUserTermsAndConditions'; const UPDATE_HEALTH_TERMS = '/services/Patients.svc/REST/UpdatePateintHealthSummaryReport'; +const GET_PATIENT_HEALTH_STATS = 'Services/Patients.svc/REST/Med_GetTransactionsSts'; + + //URL to get medicine and pharmacies list const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 7d067ab7..d81c6693 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1337,4 +1337,16 @@ const Map localizedValues = { "cancelOrderMsg": {"en": "Are you sure!! want to cancel this order", "ar": "هل أنت واثق!! تريد إلغاء هذا الطلب"}, "processDoneSuccessfully": {"en": "Process Done Successfully", "ar": "تمت العملية بنجاح"}, "selectHomeHealthCareServices": {"en": "Select Home Health Care Services", "ar": " حدد خدمات الرعاية الصحية المنزلية"}, + "weekly": { + "en": "Weekly", + "ar": "أسبوعي" + }, + "monthly": { + "en": "Monthly", + "ar": "شهري" + }, + "yearly": { + "en": "Yearly", + "ar": "سنوي" + }, }; diff --git a/lib/pages/medical/smart_watch_health_data/health_data_list.dart b/lib/pages/medical/smart_watch_health_data/health_data_list.dart index f7a7d437..3d6f5295 100644 --- a/lib/pages/medical/smart_watch_health_data/health_data_list.dart +++ b/lib/pages/medical/smart_watch_health_data/health_data_list.dart @@ -1,8 +1,10 @@ import 'package:diplomaticquarterapp/models/SmartWatch/HealthData.dart'; +import 'package:diplomaticquarterapp/pages/medical/smart_watch_health_data/stepsTracker.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:fit_kit/fit_kit.dart'; import 'package:flutter/material.dart'; @@ -85,21 +87,26 @@ class _HealthDataListState extends State { Divider( color: Colors.grey[500], ), - Row( - children: [ - Container( - child: Image.asset( - "assets/images/SmartWatches/heartrate_icon.png", - width: 60.0, - height: 60.0), - ), - Container( - margin: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), - child: Text("Steps", - style: TextStyle( - fontSize: 20.0, fontWeight: FontWeight.bold)), - ), - ], + InkWell( + onTap: () { + navigateToStepsTracker(StepsTracker()); + }, + child: Row( + children: [ + Container( + child: Image.asset( + "assets/images/SmartWatches/heartrate_icon.png", + width: 60.0, + height: 60.0), + ), + Container( + margin: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 0.0), + child: Text("Steps", + style: TextStyle( + fontSize: 20.0, fontWeight: FontWeight.bold)), + ), + ], + ), ), Divider( color: Colors.grey[500], @@ -170,6 +177,10 @@ class _HealthDataListState extends State { )); } + navigateToStepsTracker(Widget page) { + Navigator.push(context, FadePage(page: page)); + } + void readLast() async { final result = await FitKit.readLast(DataType.DISTANCE); print(result); @@ -241,6 +252,35 @@ class _HealthDataListState extends State { } }); GifLoaderDialogUtils.hideDialog(context); + readSleepDataAndroid(); + } + } + + void readSleepDataAndroid() async { + GifLoaderDialogUtils.showMyDialog(context); + sleepListAndroid.clear(); + if (await FitKit.requestPermissions(dataTypes)) { + print("Sleep Data"); + final results = await FitKit.read( + DataType.SLEEP, + dateFrom: DateTime.now().subtract(Duration(days: 10)), + dateTo: DateTime.now(), + limit: 20, + ); + print(results); + sleepListAndroid = results; + sleepListAndroid.forEach((element) { + if (element.value != 0) { + addDataToHealthDataArray( + 6, + 0, + DateUtil.convertDateToString(element.dateFrom), + element.value.toString(), + transactionsListID); + transactionsListID++; + } + }); + GifLoaderDialogUtils.hideDialog(context); readEnergyAndroid(); } } diff --git a/lib/pages/medical/smart_watch_health_data/stepsTracker.dart b/lib/pages/medical/smart_watch_health_data/stepsTracker.dart new file mode 100644 index 00000000..eec41a35 --- /dev/null +++ b/lib/pages/medical/smart_watch_health_data/stepsTracker.dart @@ -0,0 +1,91 @@ +import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class StepsTracker extends StatefulWidget { + @override + _StepsTrackerState createState() => _StepsTrackerState(); +} + +class _StepsTrackerState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + _tabController = new TabController(length: 3, vsync: this); + WidgetsBinding.instance.addPostFrameCallback((_) { + getYearlyStepsData(); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return AppScaffold( + isShowAppBar: true, + appBarTitle: "Steps", + isShowDecPage: false, + body: Container( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + TabBar( + tabs: [ + Tab(text: TranslationBase.of(context).weekly), + Tab(text: TranslationBase.of(context).monthly), + Tab(text: TranslationBase.of(context).yearly), + ], + controller: _tabController, + ), + Expanded( + child: new TabBarView( + physics: NeverScrollableScrollPhysics(), + children: [ + getWeeklyStepsDetails(), + getMonthlyStepsDetails(), + getYearlyStepsDetails() + ], + controller: _tabController, + ), + ), + ], + ), + ), + ); + } + + getYearlyStepsData() { + DoctorsListService service = new DoctorsListService(); + GifLoaderDialogUtils.showMyDialog(context); + service.getPatientHealthDataStats(6, 3, context).then((res) { + GifLoaderDialogUtils.hideDialog(context); + print(res['Med_GetYearStepsTransactionsStsList']); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); + } + + getWeeklyStepsDetails() { + return Container( + child: Text("Weekly"), + ); + } + + getMonthlyStepsDetails() { + return Container( + child: Text("Monthly"), + ); + } + + getYearlyStepsDetails() { + return Container( + child: Text("Yearly"), + ); + } +} diff --git a/lib/services/appointment_services/GetDoctorsList.dart b/lib/services/appointment_services/GetDoctorsList.dart index a320cf6b..702a524e 100644 --- a/lib/services/appointment_services/GetDoctorsList.dart +++ b/lib/services/appointment_services/GetDoctorsList.dart @@ -41,7 +41,8 @@ class DoctorsListService extends BaseService { long = await this.sharedPref.getDouble(USER_LONG); } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "LanguageID": languageID == 'ar' ? 1 : 2, @@ -105,7 +106,8 @@ class DoctorsListService extends BaseService { long = await this.sharedPref.getDouble(USER_LONG); } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "LanguageID": languageID == 'ar' ? 1 : 2, @@ -145,7 +147,8 @@ class DoctorsListService extends BaseService { Future getDoctorsProfile( int docID, int clinicID, int projectID, context) async { Map request; - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "LanguageID": languageID == 'ar' ? 1 : 2, @@ -177,10 +180,10 @@ class DoctorsListService extends BaseService { return Future.value(localRes); } - Future getDoctorsRating( - int docID, context) async { + Future getDoctorsRating(int docID, context) async { Map request; - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "LanguageID": languageID == 'ar' ? 1 : 2, @@ -203,17 +206,17 @@ class DoctorsListService extends BaseService { await baseAppClient.post(GET_DOCTOR_RATING_NOTES, onSuccess: (response, statusCode) async { - localRes = response; - }, onFailure: (String error, int statusCode) { - throw error; - }, body: request); + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); return Future.value(localRes); } - Future getDoctorsRatingDetails( - int docID, context) async { + Future getDoctorsRatingDetails(int docID, context) async { Map request; - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "LanguageID": languageID == 'ar' ? 1 : 2, @@ -236,17 +239,18 @@ class DoctorsListService extends BaseService { await baseAppClient.post(GET_DOCTOR_RATING_DETAILS, onSuccess: (response, statusCode) async { - localRes = response; - }, onFailure: (String error, int statusCode) { - throw error; - }, body: request); + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); return Future.value(localRes); } Future getDoctorFreeSlots( int docID, int clinicID, int projectID, BuildContext context) async { Map request; - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "DoctorID": docID, @@ -281,7 +285,8 @@ class DoctorsListService extends BaseService { Future getDoctorScheduledFreeSlots(int docID, int clinicID, int projectID, int serviceID, BuildContext context) async { Map request; - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "DoctorID": docID, @@ -324,7 +329,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "IsForLiveCare": false, @@ -383,7 +389,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "IsForLiveCare": true, @@ -437,7 +444,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -481,7 +489,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -526,7 +535,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -560,7 +570,8 @@ class DoctorsListService extends BaseService { Future getPatientAppointmentCurfewHistory( bool isActiveAppointment) async { Map request; - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -601,7 +612,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -654,7 +666,8 @@ class DoctorsListService extends BaseService { long = await this.sharedPref.getDouble(USER_LONG); } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -701,7 +714,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -751,7 +765,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -802,7 +817,8 @@ class DoctorsListService extends BaseService { authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -847,7 +863,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "ClientRequestID": transactionID, @@ -886,7 +903,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "AdvanceNumber": advanceNumber, @@ -923,7 +941,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "IsForAskYourDoctor": true, @@ -963,7 +982,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "VersionID": req.VersionID, @@ -999,7 +1019,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -1058,7 +1079,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "AppointmentNo": appoNo, @@ -1095,7 +1117,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "AppointmentNo": appo.appointmentNo, @@ -1136,7 +1159,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "AppointmentDate": appoDate, @@ -1185,7 +1209,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { "ProjectID": projectID, @@ -1244,7 +1269,8 @@ class DoctorsListService extends BaseService { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } - var languageID = await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); Request req = appGlobal.getPublicRequest(); request = { @@ -1282,4 +1308,42 @@ class DoctorsListService extends BaseService { }, body: request); return Future.value(localRes); } + + Future getPatientHealthDataStats( + int medCategoryId, int medCategoryStsId, BuildContext context) async { + Map request; + if (await this.sharedPref.getObject(USER_PROFILE) != null) { + var data = AuthenticatedUser.fromJson( + await this.sharedPref.getObject(USER_PROFILE)); + authUser = data; + } + var languageID = + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + Request req = appGlobal.getPublicRequest(); + request = { + "MedCategoryID": medCategoryId, + "MedGetStsID": medCategoryStsId, + "VersionID": req.VersionID, + "Channel": req.Channel, + "LanguageID": languageID == 'ar' ? 1 : 2, + "IPAdress": req.IPAdress, + "generalid": req.generalid, + "PatientOutSA": authUser.outSA, + "SessionID": "YckwoXhUmWBsnHKEKig", + "isDentalAllowedBackend": false, + "DeviceTypeID": req.DeviceTypeID, + "PatientID": authUser.patientID, + "TokenID": "@dm!n", + "PatientTypeID": authUser.patientType, + "PatientType": authUser.patientType + }; + dynamic localRes; + await baseAppClient.post(GET_PATIENT_HEALTH_STATS, + onSuccess: (response, statusCode) async { + localRes = response; + }, onFailure: (String error, int statusCode) { + throw error; + }, body: request); + return Future.value(localRes); + } } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index b607c9ac..074b7aed 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -996,6 +996,9 @@ String get fileno => localizedValues['fileno'][locale.languageCode]; String get cancelOrderMsg => localizedValues['cancelOrderMsg'][locale.languageCode]; String get processDoneSuccessfully => localizedValues['processDoneSuccessfully'][locale.languageCode]; String get selectHomeHealthCareServices => localizedValues['selectHomeHealthCareServices'][locale.languageCode]; + + String get weekly => localizedValues['weekly'][locale.languageCode]; + String get yearly => localizedValues['yearly'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/pubspec.yaml b/pubspec.yaml index e74a0939..0ecf3333 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -150,7 +150,7 @@ dependencies: # recase: ^3.0.0 wakelock: ^0.1.4 after_layout: ^1.0.7 - twilio_programmable_video: ^0.6.3+1 + twilio_programmable_video: 0.6.3+1 flutter_tts: any vibration: ^1.7.2 speech_to_text: From b55681a05658c0a41190e50251230400ec6ca106 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 9 Dec 2020 17:01:56 +0300 Subject: [PATCH 3/8] Working on steps tracking --- assets/images/new-design/view_more.png | Bin 0 -> 6069 bytes .../SmartWatch/YearlyStepsResModel.dart | 36 ++++ .../smart_watch_health_data/stepsTracker.dart | 171 +++++++++++++++++- 3 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 assets/images/new-design/view_more.png create mode 100644 lib/models/SmartWatch/YearlyStepsResModel.dart diff --git a/assets/images/new-design/view_more.png b/assets/images/new-design/view_more.png new file mode 100644 index 0000000000000000000000000000000000000000..8b52a7e71c8b9693382313dcf4f14489bf57367a GIT binary patch literal 6069 zcmY*dbyyV6+FhkPRtf1vLSmN^X+#>9Zjf&2Ws#6Z>24&H)}^GoS-QJH*aZY6r9nRZ z-TU3|e)Bx<%sXe!oHOtIF@H>ix~e=8{u6uv06?UuAfx$bRQ?;d*nfHSPT! zXY_J%baof<5(oXm5c!k;g&`oue<*MVage@>I-|4;%$o5zSOClelE7zVWE6v0*@$S$ z$o+f!pP4ww4i0w}fj~SxJ;9#*U>BGzgjZNt7{bE`;p5}}!{B!Jc7~gKaXY&+|4Zb5 zb!4pFEn)VqaC;YL#=pAe7A_ueaS-UQ(SO>%&Iz}-`9CLT_kWl5r$ETx6$mew2l5~7 zKU>BAq9STAd+R^WfAuAJ#r|RbKkVN=VvxV)|8t1;61espt{b3l*8X#V7eiGa&Uh&LgEp+Jh19sY2th~EZ(is_EI zFxN@RP0{-UBmOhe9YA-1{p4`G&Bw%ffdaw#7BWj9<)Q`K+g7TZw3 zMw!-5tNYYPhgkvsWxxnyyPMxin7Y~46R+1UHd9?xmj!`}2Eyq9UO&*=b}M6*V=ej~WC0quM@l0~@%Xw`{6DW+D^nY363+m6_8PB<^@c zRw?sR=^*ZogVz$)FyW&h*VB|S!AG>8H~qJR6-m%{Ioncaekbk_CMRkrOV0hROTZEm z#ba+PGC4|RK=?Z^HI+*gX0?(wXGFH=GEfh$2yZ|e2<2G7TrVj=T{!#_Frg00Z59Uu zieMFVBP~8LP|srN%ife3_}%m=EORnrI!>?UYO7fjZ_`XD*g(*ruOJC)jtA@%5B9WM zX=<{oL4gBXSr3{7_PxXDB?%;*c)DC(N=Ki_pLV@~l7|2j$d8DeWxH0WZ;e#(`uE0c zZaQw5Gk&k)?5+8~3p9NK$L_6GWQkgH-ug;^*IML~xVLO{(4>Q5fSImFPqn_9!lv+g z4z9o_Qql9V;UQh)cZp1CJ&$6h#p~962}n{~Zh7q)+D5EKG-E=Mc8E2GYwG8@;H>T_ zLjOczImS1;*>HBuS}L)-0V!_fI;KbWloevmU-TMJrM9Il!JVp$3}UkcmWMbWmisx) zWiP+Fe1Lro9ERc>(4JHD7T@j7K_b&q?+_g1cMqGe)%m5uS&u8m2U@+9W-g8MxgwQHJ^HTyfODqK;gDyU3rv;W=XWYy)Y*V8Iro}__} zlyEA_J|uG+ijKf{riLm^ww%C20>Y8Z8RA&=a`c7Chs_4R3`YlB+cmwpwhPJZB&m7( zgjzhyX`OUYIns{VL>XJ1!ide z3~!s&xPmUbfjX*7s<$sw9Ej<~Vl`XzStS@Uk4|!_iCj9MzMLA=;n($%3h;&aZR_Kv z?RrrrEUQshP%tB!Pv1~_vn#g z7e>$lS%#W`Lqs*Z71wt|^yQH$uld%Q@?Jg??I|9PgiEMpfx34T25WeH%Z$=F8mAdb zUIRs%Ue91)Qvw$pWd(fD?;Pd=C`V9+G&E#qKvAl#1`__y46VOTN{W$r_d)gatf@Au zJzLtIxSsjJ2h7L@yXT`+8jQmPG6HWp(rg}LF!z@NaYbaBnR}X|+(`wVpksjP7QgNyiU&=P6m=%`x2K;a4&?qSi?3 z`_f`ZNEhDAILle<#Fj9!FaFl-UT-!_h_^$1K5oNK({S@JR7FM1HjmnUdrhA#3aq;A z3zv+>$#o`=7G*L}FK^C<)4eS%$z;#yf{TH64AkO;`@6DvM<>o7uot{QWO1=Yq)1x} z)cM%lMeb!3M8M^zIe**rGDh%w9t9Jm>Zn$%{+xe{6^sw&*A!FpR=qZlNzenmHV_Xn z5YOXia^|*PS{iUzQk%_MKox5OdcMgm38OQ~YXxve(Wisj#6!%YXzxS6OSis70%C>( zn@RvBTFbQev4Ng|pprI{)8;izoE)c^NtZs=_QH!;oC0zpE;EB2dv_CA!eCMjl&7yk zO8qL-cEuZK#0SL`X|gQSco7?~W5}vg=sZt6XG3%Sh@}o9GRfnB8j^;MZq)Fj-lgM! zGsGRvpT|dwHbt@$sCAmGEPh;AniuMe5Yjs>1$Iy~*#5$E7paKE^k+=sGkKLCX{@O< zv1o{juR!GO9xkg+6cG$a`Xqm;kwJM|MEjwiQ-0)ARmuFI|ElK$Ph~8PTg8IRBNs;} zoAum z5Js1nC(LeG>1!64SxmLXb<6X}3s)`}jf4D%Eu<-}z0Q*wbH4E*xnbLXH(&#A;_O%s zUZhsMd$^+Fe8-n}pf=9p@!mdD%CC-_Z$?*Nf@7?V(qcHJfmpCt2^>aNGd0p1DG~{a zl0JL(e!oOHZM2HcHfEoQ{~^K5bJE^X;&7q(XSQ7;Qo_Kx-PccA(9HsuzXa2}d}!V` z^4n^j`Q0m=2V>1^OGxQ*v9?gr6iF0M7THI+z)e`l6+ehXlRb7HuQlH8lI*CyuOtq( znCFP(BA&5%?>I8)J}Ntw`AN4z`~zh_TrTACOOR!waDoOpNNc?NZDcD9i)a~6K-79< zk@Kz5{p>r-bm)_U8Edt$R6 zm?y{**!N;w49%n2$Qil1C<+Z5jFU*hzsu_5rVU_lRqgiVv@>|@|3FVn8m2$pM^GT8 zHI!n|=zWTXIvv|t-)Q;3Xhzu;4tgT>lqxKA_yca3xJtDHrPdk|jlI_xy)0E8xC#Dj zs0Qv&z3N{|sj6gJvluW}RbEEO0eXa}TgV>& zo`C&KFK5#UX<{nQ0La85r7gU(eA@j83W@0-!P5IDYaQ5EeQ~bB7LVsY=kroM)NUqJ z-UNoj590e^D_5RJ?WVbmTZ+1xReS?nfT^RaN1 z;g-Kp@QzK`LwRPFI0@p^|9Ip{h!U8Jk-vZmM^>WoW51sxv1Xk2{G zFZNI_$u?Ie8f9}~*i%r2vww!dP|-0UT_zDA-T3AGOPmv5W2sPMYo~fr z2m;+9P3l8pwar(~I=4lK+H%XXd4lfsHx0*lR**{79!zaXcelM*%2zA9e4 zO?J@8yolOx%W&9~r}}xDLcJ&S+v^Emlvn`JhHE%~kex^u=&fKJWyK#Cv3tN;Y%Z*` z@|JT!ADU^oer&3~Ve0?t?VYff_72Z-p-1!WiEVe)iAaQB9Z+uI0udVH5=l++>BX9@ zfvKLJhH+(je_r{4v*6Y*qF?k1R@JTGYY?u+1oEY{8t)p5e)KDMJ`R-1oY_O`gykve z(FNtNyXQ;&owP&yaAJw8r!4gT$ywLc16}El=O+YFCehz=d3h8Ja$oPx3#N*sACdbl zuO0t>uIy1I6+>SDsSMcYh8Mlf;o8#T_r* zw5YGCP(n8;~KHR2t^(;G*)_^Lm#BZvl-@zm0EKJgus3|u>N>wAAl z2yK7_y_R&2Q>C%VI^vm5O+8y%u?Qhp8u$=7qDqgiFL zx)>i%=+lRFhFTN*c)a1nujZd{(63Ja^BkKIc1OZx9RY-nG*HVV?Dm)qY=BljUjh3@ zI+TKwt;-sUTXFNHKCZ|(fUc2XYv@V*MRllWo09a%MZ9r6ri{5`&nXG5E$o#O^%52u zq0yh@~&NHFbE{MK9&=jb>BUH~s zq21`uC?}8KXyRHWQ%gd(pV*Wh`I^gG`|NX);du~b1zlW&=8$(PBNg_o&ZTTFf^SBWq znl$56%2PF@UbuuWx71KX!%ctNIoj&b;ChB}J!6jCS;21y{%beeOBP5z1MY8giy?SP~Hou;% zVa|v@gSYGMU^q%((~_K(>&UvWbUJX?-nmy;*CJ-LZ=`+`J9e-sL}m15u6($z>3L;X zj<1C>D8si3MA20~?(Zgd(WV*kyyKqXa?GGo)V>2Sj5dHB;5Ptu@!CiGFY}i57Q6!kB-Ue` zj51dQ=2J71JxGD5Z)-o0o64z#xh3!?``kxxP`mJsZpxy)ZG-v$eEOdP8q}p%uugKw);R z;uQsNzp}CD8%#-P4!F9E^Lh7FWSATS{p zrXvN{7G#v28(QiJ{M23AyJbDHzTPpi=5xMay4l%ukSpEYbQ9xH%4apewY(h7)=Ds_ z|Na`{k#bc+p)2G6dpFj&B$XRd!Nn=cAT6kt;zgL$|9q6dZMi>uC*gz_rDPSJ)U4sb z5~v~&Vb3{atOi2VU-V|?tX?PW(L7ns@w*A-vAzI*G}HbuE1YrpKy!cObi3~xhE7v$ zes|LuqNIYe0@1{_)g;(kwa$RufR%HBsXs$R01fha9>X-JboG@ME)~m~J&$Fb>7FGB#{zozZ9i2TC64tJ3s;1}Y za~o#d7kfA0%He@Kh3~I?5@g0dl}ok~#_d+{p^5(22SVn#7Y*p9QpB$-Y;T)UX&wXp zVBx#&?q*5f`w+<{Vwn|F(?eAXjfY8)B)8AXBGQ*OEv4qh3(`)_E$yWS-^`Hcv{i~I zWO=W?T>1}YKHuLYxc)DXbQ!`E%>crR+Fw88aeP^Sl#336Q1ZL)suhwC|?_t z+=AZBmlrfS+dpUfxHU4A!|&-_2fzQ_W0X!{0{>_nXP(Y{|2_uwOS6R9-#FZj%UBE8 zeORWHBjPn~6cNC6Ir%uC!R9)eT2C&oGRmpXq=)|v{e4(9^?t9JRC*joEcN>2aS?hx zr0V$Q!ByDEQ$ftBjNu8W$la^42w?l~1^1|N_sr~XwmY1DOeVI%!_s#n9ikUr4FOswT6QSK)t z8M1yy( z6Qay3Ujlz!Pad@j+t2X6q&Yf{OS?3?lDbz9n5*2*x!K{%vz+TbkQL(m7TIx#H@V{E zM5{Imly^) zLyRVi=csI<=9gV8@iV&GLZ_4h>fm>v(}{8Qy1IPkrPwNdmBiysex@OT-h!16?pUK4 zLc$x1$L#{gR+C^A json) { + valueSum = json['ValueSum']; + medCategoryID = json['MedCategoryID']; + month = json['Month']; + monthName = json['MonthName']; + patientID = json['PatientID']; + year = json['Year']; + } + + Map toJson() { + final Map data = new Map(); + data['ValueSum'] = this.valueSum; + data['MedCategoryID'] = this.medCategoryID; + data['Month'] = this.month; + data['MonthName'] = this.monthName; + data['PatientID'] = this.patientID; + data['Year'] = this.year; + return data; + } +} diff --git a/lib/pages/medical/smart_watch_health_data/stepsTracker.dart b/lib/pages/medical/smart_watch_health_data/stepsTracker.dart index eec41a35..467242e8 100644 --- a/lib/pages/medical/smart_watch_health_data/stepsTracker.dart +++ b/lib/pages/medical/smart_watch_health_data/stepsTracker.dart @@ -1,7 +1,9 @@ +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:diplomaticquarterapp/models/SmartWatch/YearlyStepsResModel.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; -import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; @@ -14,6 +16,19 @@ class _StepsTrackerState extends State with SingleTickerProviderStateMixin { TabController _tabController; + int weeklyStatsAvgValue = 0; + int monthlyStatsAvgValue = 0; + int yearlyStatsAvgValue = 0; + + int avgStepsValue = 0; + int dataLength = 0; + + List yearlyStepsList = List(); + + List yearlyTimeSeriesData = []; + + bool isDataLoaded = false; + @override void initState() { _tabController = new TabController(length: 3, vsync: this); @@ -31,7 +46,7 @@ class _StepsTrackerState extends State isShowDecPage: false, body: Container( child: Column( - mainAxisSize: MainAxisSize.max, + mainAxisSize: MainAxisSize.min, children: [ TabBar( tabs: [ @@ -45,9 +60,9 @@ class _StepsTrackerState extends State child: new TabBarView( physics: NeverScrollableScrollPhysics(), children: [ - getWeeklyStepsDetails(), - getMonthlyStepsDetails(), - getYearlyStepsDetails() + isDataLoaded ? getWeeklyStepsDetails() : Container(), + isDataLoaded ? getMonthlyStepsDetails() : Container(), + isDataLoaded ? getYearlyStepsDetails() : Container() ], controller: _tabController, ), @@ -59,18 +74,66 @@ class _StepsTrackerState extends State } getYearlyStepsData() { + avgStepsValue = 0; + dataLength = 0; + DoctorsListService service = new DoctorsListService(); GifLoaderDialogUtils.showMyDialog(context); service.getPatientHealthDataStats(6, 3, context).then((res) { GifLoaderDialogUtils.hideDialog(context); print(res['Med_GetYearStepsTransactionsStsList']); + yearlyStepsList.clear(); + res['Med_GetYearStepsTransactionsStsList'].forEach((element) { + yearlyStepsList.add(new YearlyStepsResModel.fromJson(element)); + if (element['ValueSum'] != null) { + double value = element['ValueSum']; + avgStepsValue += value.toInt(); + dataLength++; + } + }); + + print(avgStepsValue); + print(dataLength); + setState(() { + yearlyStatsAvgValue = avgStepsValue ~/ dataLength; + isDataLoaded = true; + }); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); - AppToast.showErrorToast(message: err); + // AppToast.showErrorToast(message: err); print(err); }); } + generateData() { + if (yearlyStepsList.length > 0) { + yearlyTimeSeriesData.clear(); + yearlyStepsList.forEach( + (element) { + yearlyTimeSeriesData.add( + TimeSeriesSales( + new DateTime(element.year, element.month, 1), + element.valueSum != null ? element.valueSum.toInt() : 0, + ), + ); + }, + ); + yearlyTimeSeriesData.forEach((element) { + print(element.sales); + print(element.time); + }); + } + return [ + new charts.Series( + id: 'Sales', + colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, + domainFn: (TimeSeriesSales sales, _) => sales.time, + measureFn: (TimeSeriesSales sales, _) => sales.sales, + data: yearlyTimeSeriesData, + ) + ]; + } + getWeeklyStepsDetails() { return Container( child: Text("Weekly"), @@ -85,7 +148,101 @@ class _StepsTrackerState extends State getYearlyStepsDetails() { return Container( - child: Text("Yearly"), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + child: AppTimeSeriesChart( + seriesList: generateData(), + chartName: "Steps", + startDate: DateTime( + yearlyStepsList[0].year, yearlyStepsList[0].month, 1), + endDate: DateTime( + yearlyStepsList[yearlyStepsList.length - 1].year, + yearlyStepsList[yearlyStepsList.length - 1].month, + 1), + ), + ), + Container( + margin: EdgeInsets.only(top: 5.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(color: Colors.grey[400], width: 0.6)), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: EdgeInsets.fromLTRB(30.0, 15.0, 30.0, 15.0), + child: + Text("Average Steps", style: TextStyle(fontSize: 18.0)), + ), + Container( + margin: EdgeInsets.only(bottom: 10.0), + child: Text(yearlyStatsAvgValue.toString() + " Steps", + style: TextStyle( + fontSize: 20.0, fontWeight: FontWeight.bold)), + ), + ], + ), + ), + ), + Container( + margin: EdgeInsets.all(10.0), + child: Divider( + color: Colors.grey[500], + ), + ), + Container( + transform: Matrix4.translationValues(0.0, -10.0, 0.0), + margin: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 5.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("History", style: TextStyle(fontSize: 14.0)), + Row( + children: [ + Text("view more", style: TextStyle(fontSize: 14.0)), + Container( + margin: EdgeInsets.only(left: 3.0, right: 3.0), + transform: Matrix4.translationValues(0.0, 1.5, 0.0), + width: 30.0, + height: 30.0, + child: Image.asset( + "assets/images/new-design/view_more.png", + fit: BoxFit.contain), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.fromLTRB(20.0, 0.0, 20.0, 5.0), + child: Card( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide(color: Colors.grey[400], width: 0.6)), + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.fromLTRB(30.0, 15.0, 30.0, 15.0), + child: Text("Date", + style: TextStyle( + fontSize: 18.0, fontWeight: FontWeight.bold)), + ), + Container( + padding: EdgeInsets.fromLTRB(30.0, 0.0, 30.0, 0.0), + child: Text("Steps", style: TextStyle(fontSize: 18.0)), + ), + ], + ), + ), + ), + ], + ), ); } } From db2376f50c73758202cac3254e6a715859d38ea6 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 21 Jan 2021 18:42:07 +0200 Subject: [PATCH 4/8] fix blood and weight on my trackers --- ios/Podfile.lock | 14 +- lib/config/config.dart | 4 + lib/config/localized_values.dart | 4 + .../service/medical/BloodSugarService.dart | 40 +- .../medical/WeightPressureService.dart | 52 ++- .../medical/blood_sugar_view_model.dart | 116 +++--- .../medical/weight_pressure_view_model.dart | 105 +++--- lib/core/viewModels/project_view_model.dart | 2 +- lib/locator.dart | 2 +- .../my_trackers/Weight/AddWeightPage.dart | 351 +++++++++++------- .../my_trackers/Weight/WeightHomePage.dart | 85 +---- .../my_trackers/Weight/WeightMonthlyPage.dart | 69 ++-- .../my_trackers/Weight/WeightWeeklyPage.dart | 118 ++++-- .../my_trackers/Weight/WeightYeaPage.dart | 67 ++-- .../blood_suger/AddBloodSugarPage.dart | 103 +++-- .../my_trackers/blood_suger/BloodMonthly.dart | 23 +- .../my_trackers/blood_suger/BloodYeaPage.dart | 19 +- .../blood_suger/blood_sugar_home_page.dart | 97 ++--- .../blood_suger/blood_sugar_weekly_page.dart | 31 +- .../my_trackers/widget/LineChartCurved.dart | 222 +++++++++++ .../widget/MonthLineChartCurved.dart | 206 ++++++++++ .../my_trackers/widget/TabBarWidget.dart | 73 ++++ .../medical/vital_sign/LineChartCurved.dart | 4 +- lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/charts/app_time_series_chart.dart | 6 + lib/widgets/others/app_scaffold_widget.dart | 6 +- 26 files changed, 1276 insertions(+), 544 deletions(-) create mode 100644 lib/pages/medical/my_trackers/widget/LineChartCurved.dart create mode 100644 lib/pages/medical/my_trackers/widget/MonthLineChartCurved.dart create mode 100644 lib/pages/medical/my_trackers/widget/TabBarWidget.dart diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e16b62e0..fdb971fd 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -20,7 +20,7 @@ PODS: - Firebase/Messaging (6.33.0): - Firebase/CoreOnly - FirebaseMessaging (~> 4.7.0) - - firebase_core (0.5.2): + - firebase_core (0.5.3): - Firebase/CoreOnly (~> 6.33.0) - Flutter - firebase_core_web (0.1.0): @@ -70,7 +70,7 @@ PODS: - Flutter - flutter_tts (0.0.1): - Flutter - - "geolocator (6.0.0+4)": + - geolocator (6.1.9): - Flutter - google_maps_flutter (0.0.1): - Flutter @@ -110,6 +110,8 @@ PODS: - Flutter - local_auth (0.0.1): - Flutter + - location (0.0.1): + - Flutter - manage_calendar_events (0.0.1): - Flutter - map_launcher (0.0.1): @@ -213,6 +215,7 @@ DEPENDENCIES: - image_picker (from `.symlinks/plugins/image_picker/ios`) - just_audio (from `.symlinks/plugins/just_audio/ios`) - local_auth (from `.symlinks/plugins/local_auth/ios`) + - location (from `.symlinks/plugins/location/ios`) - manage_calendar_events (from `.symlinks/plugins/manage_calendar_events/ios`) - map_launcher (from `.symlinks/plugins/map_launcher/ios`) - maps_launcher (from `.symlinks/plugins/maps_launcher/ios`) @@ -315,6 +318,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/just_audio/ios" local_auth: :path: ".symlinks/plugins/local_auth/ios" + location: + :path: ".symlinks/plugins/location/ios" manage_calendar_events: :path: ".symlinks/plugins/manage_calendar_events/ios" map_launcher: @@ -385,7 +390,7 @@ SPEC CHECKSUMS: device_calendar: 23b28a5f1ab3bf77e34542fb1167e1b8b29a98f5 device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5 - firebase_core: 350ba329d1641211bc6183a3236893cafdacfea7 + firebase_core: 5d6a02f3d85acd5f8321c2d6d62877626a670659 firebase_core_web: d501d8b946b60c8af265428ce483b0fff5ad52d1 firebase_messaging: 0aea2cd5885b65e19ede58ee3507f485c992cc75 FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd @@ -400,7 +405,7 @@ SPEC CHECKSUMS: flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35 flutter_tts: 0f492aab6accf87059b72354fcb4ba934304771d - geolocator: 1ae40084cc6c1586ce5ad12cfc3fd38c64d05f2f + geolocator: 057a0c63a43e9c5296d8ad845a3ac8e6df23d899 google_maps_flutter: c7f9c73576de1fbe152a227bfd6e6c4ae8088619 GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833 GoogleMaps: 4b5346bddfe6911bb89155d43c903020170523ac @@ -410,6 +415,7 @@ SPEC CHECKSUMS: image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09 just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa local_auth: 25938960984c3a7f6e3253e3f8d962fdd16852bd + location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740 manage_calendar_events: 0338d505ea26cdfd20cd883279bc28afa11eca34 map_launcher: e325db1261d029ff33e08e03baccffe09593ffea maps_launcher: eae38ee13a9c3f210fa04e04bb4c073fa4c6ed92 diff --git a/lib/config/config.dart b/lib/config/config.dart index 1a34e96d..f25d3272 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -288,6 +288,8 @@ const GET_PATIENT_LAST_RECORD = 'Services/Patients.svc/REST/Med_GetPatientLastRe const GET_DIABETIC_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetDiabeticResultAverage'; const GET_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_GetDiabtecResults'; const ADD_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_AddDiabtecResult'; +const SEND_AVERAGE_BLOOD_SUGAR_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport'; +const DEACTIVATE_DIABETIC_STATUS = 'services/Patients.svc/REST/Patient_DeactivateDiabeticStatus'; const GET_BLOOD_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetBloodPressureResultAverage'; const GET_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetBloodPressureResult'; @@ -298,6 +300,8 @@ const UPDATE_DIABETIC_RESULT = 'Services/Patients.svc/REST/Patient_UpdateDiabeti const GET_WEIGHT_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResultAverage'; const GET_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetWeightMeasurementResult'; const ADD_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_AddWeightMeasurementResult'; +const UPDATE_WEIGHT_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateWeightMeasurementResult'; +const DEACTIVATE_WEIGHT_PRESSURE_RESULT = 'services/Patients.svc/REST/Patient_DeactivateWeightMeasurementStatus'; const ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID = 'Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 09f279ed..a184006c 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1568,4 +1568,8 @@ const Map localizedValues = { "bloodD-enter-desc": {"en" : "Enter the required information, In order to register for Blood Donation Service", "ar": "أدخل المعلومات المطلوبة ، للتسجيل في خدمة التبرع بالدم"}, "viewTermsConditions": {"en" : "To view the terms and conditions", "ar": "لعرض الشروط والأحكام"}, // "visit": {"en" : "Visit", "ar": "الزيارة"}, + "weight-add": { + "en": "Enter Weight Value", + "ar": "أدخل الوزن " + }, }; diff --git a/lib/core/service/medical/BloodSugarService.dart b/lib/core/service/medical/BloodSugarService.dart index e0c5007c..e8e2fabf 100644 --- a/lib/core/service/medical/BloodSugarService.dart +++ b/lib/core/service/medical/BloodSugarService.dart @@ -24,6 +24,11 @@ class BloodSugarService extends BaseService { monthDiabtectResultAverageList.clear(); weekDiabtectResultAverageList.clear(); yearDiabtecResultAverageList.clear(); + + monthDiabtecPatientResult.clear(); + weekDiabtecPatientResult.clear(); + yearDiabtecPatientResult.clear(); + response['List_MonthDiabtectResultAverage'].forEach((item) { monthDiabtectResultAverageList .add(MonthDiabtectResultAverage.fromJson(item)); @@ -76,15 +81,16 @@ class BloodSugarService extends BaseService { body['BloodSugerDateChart'] = bloodSugerDateChart; body['BloodSugerResult'] = bloodSugerResult; body['DiabtecUnit'] = diabtecUnit; - body['MeasuredTime'] = measuredTime; + body['MeasuredTime'] = measuredTime+1; body['isDentalAllowedBackend'] = false; - await baseAppClient.post(ADD_BLOOD_PRESSURE_RESULT, + await baseAppClient.post(ADD_DIABTEC_RESULT, onSuccess: (response, statusCode) async {}, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, body: body); } + updateDiabtecResult({DateTime month,DateTime hour,String bloodSugerResult,String diabtecUnit, int measuredTime,int lineItemNo}) async { hasError = false; super.error = ""; @@ -93,7 +99,7 @@ class BloodSugarService extends BaseService { body['DiabtecUnit'] = diabtecUnit; body['BloodSugerDateChart'] = '${month.year}-${month.month}-${month.day} ${hour.hour}:${hour.minute}:00'; body['isDentalAllowedBackend'] = false; - body['MeasuredTime'] = measuredTime; + body['MeasuredTime'] = measuredTime+1; body['LineItemNo'] = lineItemNo; await baseAppClient.post(UPDATE_DIABETIC_RESULT, onSuccess: (response, statusCode) async {}, @@ -102,4 +108,32 @@ class BloodSugarService extends BaseService { super.error = error; }, body: body); } + + Future sendReportByEmail() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['to'] = user.emailAddress; + await baseAppClient.post(SEND_AVERAGE_BLOOD_SUGAR_REPORT, + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future deactivateDiabeticStatus({int lineItemNo }) async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['LineItemNo'] =lineItemNo; + await baseAppClient.post(DEACTIVATE_DIABETIC_STATUS, + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } } diff --git a/lib/core/service/medical/WeightPressureService.dart b/lib/core/service/medical/WeightPressureService.dart index 27048dc8..3c38e5d2 100644 --- a/lib/core/service/medical/WeightPressureService.dart +++ b/lib/core/service/medical/WeightPressureService.dart @@ -6,11 +6,13 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/weight/YearWeightMeas import 'package:diplomaticquarterapp/core/service/base_service.dart'; class WeightService extends BaseService { - ///Average - List monthWeightMeasurementResultAverage = List(); - List weekWeightMeasurementResultAverage = List(); - List yearWeightMeasurementResultAverage = List(); + List + monthWeightMeasurementResultAverage = List(); + List weekWeightMeasurementResultAverage = + List(); + List yearWeightMeasurementResultAverage = + List(); ///Result List monthWeightMeasurementResult = List(); @@ -59,7 +61,8 @@ class WeightService extends BaseService { }); response['List_MonthWeightMeasurementResult'].forEach((item) { - monthWeightMeasurementResult.add(WeightMeasurementResult.fromJson(item)); + monthWeightMeasurementResult + .add(WeightMeasurementResult.fromJson(item)); }); response['List_YearWeightMeasurementResult'].forEach((item) { @@ -72,9 +75,7 @@ class WeightService extends BaseService { } addWeightResult( - {String weightDate, - String weightMeasured, - int weightUnit}) async { + {String weightDate, String weightMeasured, int weightUnit}) async { hasError = false; super.error = ""; @@ -85,9 +86,40 @@ class WeightService extends BaseService { body['isDentalAllowedBackend'] = false; await baseAppClient.post(ADD_WEIGHT_PRESSURE_RESULT, - onSuccess: (response, statusCode) async { + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + updateWeightResult({int lineItemNo, int weightUnit,String weightMeasured,String weightDate}) async { + hasError = false; + super.error = ""; + Map body = Map(); + body['LineItemNo'] = lineItemNo; + body['weightUnit'] = '$weightUnit'; + body['WeightMeasured'] = weightMeasured; + body['WeightDate'] = weightDate; + body['isDentalAllowedBackend'] = false; + + await baseAppClient.post(UPDATE_WEIGHT_PRESSURE_RESULT, + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + deleteWeightResult({int lineItemNo, }) async { + hasError = false; + super.error = ""; + Map body = Map(); + body['LineItemNo'] = lineItemNo; + body['isDentalAllowedBackend'] = false; - }, + await baseAppClient.post(DEACTIVATE_WEIGHT_PRESSURE_RESULT, + onSuccess: (response, statusCode) async {}, onFailure: (String error, int statusCode) { hasError = true; super.error = error; diff --git a/lib/core/viewModels/medical/blood_sugar_view_model.dart b/lib/core/viewModels/medical/blood_sugar_view_model.dart index 29cc3249..8a513992 100644 --- a/lib/core/viewModels/medical/blood_sugar_view_model.dart +++ b/lib/core/viewModels/medical/blood_sugar_view_model.dart @@ -5,17 +5,13 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/YearMonthly import 'package:diplomaticquarterapp/core/service/medical/BloodSugarService.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:charts_flutter/flutter.dart' as charts; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import '../../../core/viewModels/base_view_model.dart'; class BloodSugarViewMode extends BaseViewModel { BloodSugarService bloodSugarService = locator(); - ///BLOOD - List _bloodWeeklyTimeSeriesSalesList = List(); - List _bloodMonthlyTimeSeriesSalesList = List(); - List _bloodYearTimeSeriesSalesList = List(); - List get monthDiabtecPatientResult => bloodSugarService.monthDiabtecPatientResult; @@ -25,6 +21,10 @@ class BloodSugarViewMode extends BaseViewModel { List get yearDiabtecPatientResult => bloodSugarService.yearDiabtecPatientResult; + List bloodWeekTimeSeriesData = []; + List yearTimeSeriesData = []; + List monthTimeSeriesData = []; + Future getBloodSugar() async { setState(ViewState.Busy); await bloodSugarService.getBloodSugar(); @@ -34,70 +34,43 @@ class BloodSugarViewMode extends BaseViewModel { setState(ViewState.Error); } else { bloodSugarService.weekDiabtectResultAverageList.forEach((element) { - _bloodWeeklyTimeSeriesSalesList.add( - WeekChartDate(x: element.dateChart, y: element.dailyAverageResult)); + bloodWeekTimeSeriesData.add(TimeSeriesSales2( + element.dateChart, + element.dailyAverageResult.toDouble(), + )); }); for (int index = 0; index < bloodSugarService.monthDiabtectResultAverageList.length; index++) { - _bloodMonthlyTimeSeriesSalesList.add(YearMonthlyChartDate( - x: index, - y: bloodSugarService - .monthDiabtectResultAverageList[index].weekAverageResult)); + monthTimeSeriesData.add(TimeSeriesSales3( + index, + bloodSugarService + .monthDiabtectResultAverageList[index].weekAverageResult + .toDouble(), + )); } bloodSugarService.yearDiabtecResultAverageList.forEach((element) { - _bloodYearTimeSeriesSalesList - .add(WeekChartDate(x: element.date, y: element.monthAverageResult)); + yearTimeSeriesData.add(TimeSeriesSales2( + element.date, + element.monthAverageResult.toDouble(), + )); }); setState(ViewState.Idle); } } - List> getBloodWeeklySeries() { - return [ - new charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _bloodWeeklyTimeSeriesSalesList, - ) - ]; - } - - List> - getBloodMonthlyTimeSeriesSales() { - return [ - new charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (YearMonthlyChartDate sales, _) => sales.x, - measureFn: (YearMonthlyChartDate sales, _) => sales.y, - data: _bloodMonthlyTimeSeriesSalesList, - ) - ]; - } - - List> getBloodYearTimeSeriesSales() { - return [ - new charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _bloodYearTimeSeriesSalesList, - ) - ]; - } - - Future addDiabtecResult({String bloodSugerDateChart, String bloodSugerResult, String diabtecUnit, int measuredTime}) async { + Future addDiabtecResult( + {String bloodSugerDateChart, + String bloodSugerResult, + String diabtecUnit, + int measuredTime}) async { setState(ViewState.BusyLocal); await bloodSugarService.addDiabtecResult( bloodSugerDateChart: bloodSugerDateChart, - bloodSugerResult: bloodSugerResult , + bloodSugerResult: bloodSugerResult, diabtecUnit: diabtecUnit, measuredTime: measuredTime); if (bloodSugarService.hasError) { @@ -109,10 +82,17 @@ class BloodSugarViewMode extends BaseViewModel { } } - Future updateDiabtecResult({DateTime month,DateTime hour,String bloodSugerResult,String diabtecUnit, int measuredTime,int lineItemNo}) async { + Future updateDiabtecResult( + {DateTime month, + DateTime hour, + String bloodSugerResult, + String diabtecUnit, + int measuredTime, + int lineItemNo}) async { setState(ViewState.BusyLocal); + await bloodSugarService.updateDiabtecResult( - bloodSugerResult: bloodSugerResult , + bloodSugerResult: bloodSugerResult, diabtecUnit: diabtecUnit, hour: hour, measuredTime: measuredTime, @@ -120,13 +100,35 @@ class BloodSugarViewMode extends BaseViewModel { month: month); if (bloodSugarService.hasError) { error = bloodSugarService.error; - setState(ViewState.Error); + setState(ViewState.ErrorLocal); } else { await getBloodSugar(); setState(ViewState.Idle); } } - - + Future sendReportByEmail() async { + setState(ViewState.BusyLocal); + + await bloodSugarService.sendReportByEmail(); + if (bloodSugarService.hasError) { + error = bloodSugarService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } + + Future deactivateDiabeticStatus({int lineItemNo}) async { + setState(ViewState.BusyLocal); + + await bloodSugarService.deactivateDiabeticStatus(lineItemNo: lineItemNo); + if (bloodSugarService.hasError) { + error = bloodSugarService.error; + setState(ViewState.ErrorLocal); + } else { + await getBloodSugar(); + setState(ViewState.Idle); + } + } } diff --git a/lib/core/viewModels/medical/weight_pressure_view_model.dart b/lib/core/viewModels/medical/weight_pressure_view_model.dart index 29095895..24ddae18 100644 --- a/lib/core/viewModels/medical/weight_pressure_view_model.dart +++ b/lib/core/viewModels/medical/weight_pressure_view_model.dart @@ -9,16 +9,13 @@ import 'package:diplomaticquarterapp/core/service/medical/BloodSugarService.dart import 'package:diplomaticquarterapp/core/service/medical/WeightPressureService.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:charts_flutter/flutter.dart' as charts; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import '../../../core/viewModels/base_view_model.dart'; -class WeightPressureViewMode extends BaseViewModel { +class WeightPressureViewModel extends BaseViewModel { WeightService weightService = locator(); - List _weightWeeklyTimeSeriesSalesList = List(); - List _weightMonthlyTimeSeriesSalesList = List(); - List _weightYearTimeSeriesSalesList = List(); - List get monthWeightMeasurementResult => weightService.monthWeightMeasurementResult; @@ -28,6 +25,10 @@ class WeightPressureViewMode extends BaseViewModel { List get yearWeightMeasurementResult => weightService.yearWeightMeasurementResult; + List weightWeekTimeSeriesData = []; + List weighMonthTimeSeriesData = []; + List weightYearTimeSeriesData = []; + Future getWeight() async { setState(ViewState.Busy); await weightService.getWeightAverage(); @@ -37,71 +38,73 @@ class WeightPressureViewMode extends BaseViewModel { setState(ViewState.Error); } else { weightService.weekWeightMeasurementResultAverage.forEach((element) { - _weightWeeklyTimeSeriesSalesList.add(WeekChartDate( - x: element.weightDate, y: element.dailyAverageResult)); + weightWeekTimeSeriesData.add(TimeSeriesSales2( + element.weightDate, + element.dailyAverageResult.toDouble(), + )); }); for (int index = 0; index < weightService.monthWeightMeasurementResultAverage.length; index++) { - _weightMonthlyTimeSeriesSalesList.add(YearMonthlyChartDate( - x: index, - y: weightService.monthWeightMeasurementResultAverage[index].weekAverageResult)); + weighMonthTimeSeriesData.add(TimeSeriesSales3( + index, + weightService + .monthWeightMeasurementResultAverage[index].weekAverageResult + .toDouble(), + )); } weightService.yearWeightMeasurementResultAverage.forEach((element) { - _weightYearTimeSeriesSalesList - .add(WeekChartDate(x: element.date, y: element.monthAverageResult)); + weightYearTimeSeriesData.add(TimeSeriesSales2( + element.date, + element.monthAverageResult.toDouble(), + )); }); setState(ViewState.Idle); } } - List> getWeightWeeklySeries() { - return [ - charts.Series( - id: 'Diastolic', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _weightWeeklyTimeSeriesSalesList, - ), - ]; - } - - List> - getWeightMonthlyTimeSeriesSales() { - return [ - charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (YearMonthlyChartDate sales, _) => sales.x, - measureFn: (YearMonthlyChartDate sales, _) => sales.y, - data: _weightMonthlyTimeSeriesSalesList, - ), - ]; + addWeightResult( + {String weightDate, String weightMeasured, int weightUnit}) async { + setState(ViewState.BusyLocal); + await weightService.addWeightResult( + weightDate: weightDate, + weightMeasured: weightMeasured, + weightUnit: weightUnit, + ); + if (weightService.hasError) { + error = weightService.error; + setState(ViewState.Error); + } else { + await getWeight(); + setState(ViewState.Idle); + } } - List> getWeightYearTimeSeriesSales() { - return [ - charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _weightYearTimeSeriesSalesList, - ), - ]; + updateWeightResult({int lineItemNo, int weightUnit, String weightMeasured,String weightDate}) async { + setState(ViewState.BusyLocal); + await weightService.updateWeightResult( + lineItemNo: lineItemNo, + weightMeasured: weightMeasured, + weightUnit: weightUnit, + weightDate: weightDate + ); + if (weightService.hasError) { + error = weightService.error; + setState(ViewState.Error); + } else { + await getWeight(); + setState(ViewState.Idle); + } } - addWeightResult( - {String weightDate, String weightMeasured, int weightUnit}) async { + deleteWeightResult({int lineItemNo, }) async { setState(ViewState.BusyLocal); - await weightService.addWeightResult( - weightDate: weightDate, - weightMeasured: weightMeasured, - weightUnit: weightUnit,); + await weightService.deleteWeightResult( + lineItemNo: lineItemNo, + ); if (weightService.hasError) { error = weightService.error; setState(ViewState.Error); diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index baaf6b5b..2bb75305 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -32,7 +32,7 @@ class ProjectViewModel extends BaseViewModel { Locale get appLocal => _appLocale; - LocaleType get localeType => isArabic ? LocaleType.en : LocaleType.ar; + LocaleType get localeType => isArabic ? LocaleType.ar : LocaleType.en; bool get isArabic => _isArabic; diff --git a/lib/locator.dart b/lib/locator.dart index 89cafd68..c5bde524 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -248,7 +248,7 @@ void setupLocator() { locator.registerFactory(() => H2OViewModel()); locator.registerFactory(() => BloodSugarViewMode()); locator.registerFactory(() => BloodPressureViewMode()); - locator.registerFactory(() => WeightPressureViewMode()); + locator.registerFactory(() => WeightPressureViewModel()); locator.registerFactory(() => EyeViewModel()); locator.registerFactory(() => ActiveMedicationsViewModel()); locator.registerFactory(() => AskDoctorViewModel()); diff --git a/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart b/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart index a7b23191..aa087081 100644 --- a/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart +++ b/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart @@ -1,188 +1,283 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; -import 'package:diplomaticquarterapp/core/viewModels/medical/blood_pressure_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/RadioStringDialog.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:feather_icons_flutter/feather_icons_flutter.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:provider/provider.dart'; class AddWeightPage extends StatefulWidget { + final WeightPressureViewModel model; + final bool isUpdate; + final DateTime dayWeightDate; + final int lineItemNo; + final String weightValue; + final String measureTimeSelectedType; + final int weightUnit; + + AddWeightPage( + {Key key, + this.model, + this.isUpdate = false, + this.dayWeightDate, + this.lineItemNo, + this.weightValue, + this.measureTimeSelectedType, + this.weightUnit}) + : super(key: key); + @override _AddWeightPageState createState() => _AddWeightPageState(); } class _AddWeightPageState extends State { TextEditingController _weightValueController = TextEditingController(); - DateTime bloodSugarDate = DateTime.now(); - DateTime timeSugarDate = DateTime.now(); + DateTime dayWeightDate = DateTime.now(); + DateTime timeWeightDate = DateTime.now(); int weightUnit = 1; final List measureUnitEnList = [ 'Kg', 'Pound', ]; - final List measureUnitArList = [ - 'Kg', - 'Pound', - ]; - String measureTimeSelectedType = 'Kg'; + final List measureUnitArList = ["كيلو جرام", "باوند"]; + String measureTimeSelectedType; + @override + void initState() { + super.initState(); + if (widget.isUpdate) { + dayWeightDate = widget.dayWeightDate; + timeWeightDate = widget.dayWeightDate; + measureTimeSelectedType = widget.measureTimeSelectedType; + if (measureUnitEnList.contains(widget.measureTimeSelectedType)) + weightUnit = measureUnitEnList.indexOf(widget.measureTimeSelectedType); + else if (measureUnitArList.contains(widget.measureTimeSelectedType)) + weightUnit = measureUnitArList.indexOf(widget.measureTimeSelectedType); + _weightValueController.text = widget.weightValue; + } + } @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - return BaseView( - builder: (_, model, w) => AppScaffold( - isShowAppBar: true, - appBarTitle: 'Add', - body: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Container( - margin: EdgeInsets.all(15), - child: Column( - children: [ - SizedBox( - height: 15, - ), - NewTextFields( - hintText: 'Enter Weight Value', - controller: _weightValueController, - keyboardType: TextInputType.number, - ), - SizedBox( - height: 8, - ), - InkWell( - onTap: () { - confirmSelectMeasureTimeDialog(projectViewModel.isArabic - ? measureUnitEnList - : measureUnitArList); + return AppScaffold( + isShowAppBar: true, + appBarTitle: widget.isUpdate + ? TranslationBase.of(context).update + : TranslationBase.of(context).add, + appBarIcons: [ + IconButton( + icon: Icon(Icons.delete), + color: Colors.white, + onPressed: () { + ConfirmDialog dialog = new ConfirmDialog( + context: context, + confirmMessage: 'Remove this measure', + okText: TranslationBase.of(context).ok, + cancelText: TranslationBase.of(context).cancel, + okFunction: () async { + ConfirmDialog.closeAlertDialog(context); + + GifLoaderDialogUtils.showMyDialog(context); + widget.model + .deleteWeightResult(lineItemNo: widget.lineItemNo) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (widget.model.state == ViewState.ErrorLocal) + AppToast.showErrorToast( + message: widget.model.error); + else + Navigator.pop(context); + }).catchError((e) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast( + message: widget.model.error); + }); }, - child: Container( - padding: EdgeInsets.all(12), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts(measureTimeSelectedType), - Icon( - Icons.arrow_drop_down, - color: Colors.grey, - ) - ], - ), + cancelFunction: () => {}); + dialog.showAlertDialog(context); + }, + ) + ], + body: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Container( + margin: EdgeInsets.all(15), + child: Column( + children: [ + SizedBox( + height: 15, + ), + NewTextFields( + hintText: TranslationBase.of(context).weightAdd, + controller: _weightValueController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + confirmSelectMeasureTimeDialog(projectViewModel.isArabic + ? measureUnitArList + : measureUnitEnList); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(measureTimeSelectedType ?? + TranslationBase.of(context).other), + Icon( + Icons.arrow_drop_down, + color: Colors.grey, + ) + ], ), ), - SizedBox( - height: 8, - ), - InkWell( - onTap: () { - DatePicker.showDatePicker(context, - showTitleActions: true, - minTime: DateTime(DateTime.now().year - 1, 1, 1), - maxTime: DateTime.now(), onConfirm: (date) { - print('confirm $date'); + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showDatePicker( + context, + showTitleActions: true, + minTime: DateTime(DateTime.now().year - 1, 1, 1), + maxTime: DateTime.now(), + onConfirm: (date) { setState(() { - bloodSugarDate = date; + dayWeightDate = date; }); }, - currentTime: bloodSugarDate, - locale: projectViewModel.localeType); - }, - child: Container( - padding: EdgeInsets.all(12), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts('Date'), - Texts(getDate()), - ], - ), + currentTime: dayWeightDate, + locale: projectViewModel.localeType, + ); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(TranslationBase.of(context).date), + Texts(getDate()), + ], ), ), - SizedBox( - height: 8, - ), - InkWell( - onTap: () { - DatePicker.showTimePicker(context, showTitleActions: true, - onConfirm: (date) { - print('confirm $date'); + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker( + context, + showTitleActions: true, + onConfirm: (date) { setState(() { - timeSugarDate = date; + timeWeightDate = date; }); }, - currentTime: timeSugarDate, - locale: projectViewModel.localeType); - }, - child: Container( - padding: EdgeInsets.all(12), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [Texts('Time'), Texts(getTime())], - ), + currentTime: timeWeightDate, + locale: projectViewModel.localeType, + ); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(TranslationBase.of(context).time), + Texts(getTime()) + ], ), ), - ], - ), + ), + ], ), ), - bottomSheet: Container( - color: Colors.transparent, - width: double.infinity, - height: MediaQuery.of(context).size.width * 0.2, - child: Padding( - padding: const EdgeInsets.all(15.0), - child: SecondaryButton( - loading: model.state == ViewState.BusyLocal, - label: 'SAVE', - textColor: Colors.white, - onTap: () { - if (_weightValueController.text.isNotEmpty ) { - model.addWeightResult( - weightDate: '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00', + ), + bottomSheet: Container( + color: Colors.transparent, + width: double.infinity, + height: MediaQuery.of(context).size.width * 0.2, + child: Padding( + padding: const EdgeInsets.all(15.0), + child: SecondaryButton( + loading: widget.model.state == ViewState.BusyLocal, + label: TranslationBase.of(context).save.toUpperCase(), + textColor: Colors.white, + onTap: () { + if (_weightValueController.text.isNotEmpty) { + if (widget.isUpdate) { + GifLoaderDialogUtils.showMyDialog(context); + widget.model.updateWeightResult( + weightDate: '${dayWeightDate.year}-${dayWeightDate.month}-${dayWeightDate.day} ${timeWeightDate.hour}:${timeWeightDate.minute}:00', weightMeasured: _weightValueController.text.toString(), weightUnit: weightUnit, - ); - } - }), - ), + lineItemNo: widget.lineItemNo + ) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (widget.model.state == ViewState.Error) + AppToast.showErrorToast(message: widget.model.error); + else + Navigator.pop(context); + }); + } else + widget.model.addWeightResult( + weightDate: '${dayWeightDate.year}-${dayWeightDate.month}-${dayWeightDate.day} ${timeWeightDate.hour}:${timeWeightDate.minute}:00', + weightMeasured: _weightValueController.text.toString(), + weightUnit: weightUnit, + ) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (widget.model.state == ViewState.Error) + AppToast.showErrorToast(message: widget.model.error); + else + Navigator.pop(context); + }); + } + }), ), ), ); } String getDate() { - return "${DateUtil.getMonth(bloodSugarDate.month)} ${bloodSugarDate.day}, ${bloodSugarDate.year}"; + return "${DateUtil.getMonth(dayWeightDate.month)} ${dayWeightDate.day}, ${dayWeightDate.year}"; } String getTime() { - return " ${timeSugarDate.hour}:${timeSugarDate.minute}"; + return " ${timeWeightDate.hour}:${timeWeightDate.minute}"; } void confirmSelectMeasureTimeDialog(List list) { @@ -190,7 +285,7 @@ class _AddWeightPageState extends State { context: context, child: RadioStringDialog( radioList: list, - title: 'Measure unit', + title: TranslationBase.of(context).measureUnit, selectedValue: measureTimeSelectedType, onValueSelected: (value) { setState(() { diff --git a/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart b/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart index 9bd89a2c..cbe5de17 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart @@ -1,12 +1,11 @@ -import 'dart:ui'; import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/TabBarWidget.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:hexcolor/hexcolor.dart'; import 'AddWeightPage.dart'; import 'WeightMonthlyPage.dart'; import 'WeightYeaPage.dart'; @@ -35,73 +34,16 @@ class _WeightHomePageState extends State @override Widget build(BuildContext context) { - return BaseView( + return BaseView( onModelReady: (model) => model.getWeight(), builder: (_, model, w) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Weight', + appBarTitle: TranslationBase.of(context).weight, baseViewModel: model, body: Scaffold( extendBodyBehindAppBar: true, - appBar: PreferredSize( - preferredSize: Size.fromHeight(60.0), - child: Stack( - children: [ - Positioned( - bottom: 1, - left: 0, - right: 0, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), - child: Container( - color: Theme.of(context) - .scaffoldBackgroundColor - .withOpacity(0.8), - height: 70.0, - ), - ), - ), - Center( - child: Container( - height: 55.0, - color: Colors.white, - child: Center( - child: TabBar( - isScrollable: true, - controller: _tabController, - indicatorWeight: 5.0, - indicatorSize: TabBarIndicatorSize.tab, - indicatorColor: Colors.red[800], - labelColor: Theme.of(context).primaryColor, - labelPadding: - EdgeInsets.only(top: 4.0, left: 5.0, right: 5.0), - unselectedLabelColor: Colors.grey[800], - tabs: [ - Container( - width: MediaQuery.of(context).size.width * 0.27, - child: Center( - child: Texts('Weekly'), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.27, - child: Center( - child: Texts('Monthly'), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.27, - child: Center( - child: Texts('Yearly'), - ), - ), - ], - ), - ), - ), - ), - ], - ), + appBar: TabBarWidget( + tabController: _tabController, ), body: Column( children: [ @@ -111,16 +53,13 @@ class _WeightHomePageState extends State controller: _tabController, children: [ WeightWeeklyPage( - data: model.getWeightWeeklySeries(), - diabtecPatientResult: model.weekWeightMeasurementResult, + model: model, ), WeightMonthlyPage( - data: model.getWeightMonthlyTimeSeriesSales(), - diabtecPatientResult: model.monthWeightMeasurementResult, + model: model, ), WeightYearPage( - data: model.getWeightYearTimeSeriesSales(), - diabtecPatientResult: model.yearWeightMeasurementResult, + model: model, ) ], ), @@ -129,13 +68,15 @@ class _WeightHomePageState extends State ), floatingActionButton: InkWell( onTap: () { - Navigator.push(context, FadePage(page: AddWeightPage())); + Navigator.push(context, FadePage(page: AddWeightPage(model: model,))); }, child: Container( width: 55, height: 55, decoration: BoxDecoration( - shape: BoxShape.circle, color: HexColor('515B5D')), + shape: BoxShape.circle, + color: Theme.of(context).primaryColor, + ), child: Center( child: Icon( Icons.add, diff --git a/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart b/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart index 9f7063f1..56748ea0 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart @@ -3,41 +3,48 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPa import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/YearMonthlyChartDate.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/MonthLineChartCurved.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class WeightMonthlyPage extends StatelessWidget { - final List> data; - final List diabtecPatientResult; + final WeightPressureViewModel model; - const WeightMonthlyPage({Key key, this.data, this.diabtecPatientResult}) - : super(key: key); + const WeightMonthlyPage({ + Key key, + this.model, + }) : super(key: key); @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( body: ListView( children: [ Container( - width: double.maxFinite, - height: 180, - color: Colors.white, - child: charts.LineChart(data, - //animate: animate, - defaultRenderer: - new charts.LineRendererConfig(includePoints: true)), - ), + width: double.maxFinite, + color: Colors.white, + child: MonthLineChartCurved( + horizontalInterval: 1.0, + title: TranslationBase.of(context).weight, + timeSeries: model.weighMonthTimeSeriesData, + indexes: model.weighMonthTimeSeriesData.length ~/ 5.5, + )), SizedBox( height: 12, ), Padding( padding: const EdgeInsets.all(8.0), - child: Texts('Details'), + child: Texts(TranslationBase.of(context).details), ), Container( padding: EdgeInsets.all(10), @@ -49,7 +56,7 @@ class WeightMonthlyPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(), + children: fullData(context, projectViewModel, model), ), ], ), @@ -59,21 +66,27 @@ class WeightMonthlyPage extends StatelessWidget { ); } - List fullData() { + List fullData(BuildContext context, + ProjectViewModel projectViewModel, WeightPressureViewModel model) { List tableRow = []; tableRow.add( TableRow( children: [ Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + topRight: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), ), ), child: Center( child: Texts( - 'Date', + TranslationBase.of(context).date, color: Colors.white, fontSize: 15, ), @@ -82,11 +95,11 @@ class WeightMonthlyPage extends StatelessWidget { ), Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Time', + TranslationBase.of(context).time, color: Colors.white, fontSize: 15, ), @@ -94,11 +107,19 @@ class WeightMonthlyPage extends StatelessWidget { height: 40), Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.only( + topLeft: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), + topRight: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + ), ), child: Center( child: Texts( - 'Value', + TranslationBase.of(context).value, color: Colors.white, fontSize: 15, ), @@ -107,7 +128,7 @@ class WeightMonthlyPage extends StatelessWidget { ], ), ); - diabtecPatientResult.forEach( + model.monthWeightMeasurementResult.forEach( (diabtec) { tableRow.add( TableRow( @@ -119,7 +140,7 @@ class WeightMonthlyPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.weightDate)} ', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.weightDate) : DateUtil.getMonthDayYearDateFormatted(diabtec.weightDate)} ', textAlign: TextAlign.center, fontSize: 12, ), diff --git a/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart b/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart index 9c3363dd..9c8a50a5 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart @@ -1,32 +1,41 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/LineChartCurved.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +import 'AddWeightPage.dart'; class WeightWeeklyPage extends StatelessWidget { - final List> data; - final List diabtecPatientResult; + final WeightPressureViewModel model; - const WeightWeeklyPage({Key key, this.data, this.diabtecPatientResult}) - : super(key: key); + const WeightWeeklyPage({Key key, this.model}) : super(key: key); @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return AppScaffold( body: ListView( children: [ Container( - width: double.maxFinite, - height: 180, + margin: EdgeInsets.only(top: 12, left: 8, right: 8), color: Colors.white, - child: charts.TimeSeriesChart( - data, - dateTimeFactory: const charts.LocalDateTimeFactory(), + child: LineChartCurved( + horizontalInterval: 1.0, + title: TranslationBase.of(context).weight, + timeSeries: model.weightWeekTimeSeriesData, + indexes: model.weightWeekTimeSeriesData.length ~/ 5.5, ), ), SizedBox( @@ -34,7 +43,7 @@ class WeightWeeklyPage extends StatelessWidget { ), Padding( padding: const EdgeInsets.all(8.0), - child: Texts('Details'), + child: Texts(TranslationBase.of(context).details), ), Container( padding: EdgeInsets.all(10), @@ -46,7 +55,7 @@ class WeightWeeklyPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(), + children: fullData(context, projectViewModel, model), ), ], ), @@ -56,21 +65,27 @@ class WeightWeeklyPage extends StatelessWidget { ); } - List fullData() { + List fullData(BuildContext context, + ProjectViewModel projectViewModel, WeightPressureViewModel model) { List tableRow = []; tableRow.add( TableRow( children: [ Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + topRight: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), ), ), child: Center( child: Texts( - 'Date', + TranslationBase.of(context).date, color: Colors.white, fontSize: 15, ), @@ -79,11 +94,11 @@ class WeightWeeklyPage extends StatelessWidget { ), Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Time', + TranslationBase.of(context).time, color: Colors.white, fontSize: 15, ), @@ -91,37 +106,40 @@ class WeightWeeklyPage extends StatelessWidget { height: 40), Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Value', + TranslationBase.of(context).value, color: Colors.white, fontSize: 15, ), ), height: 40), Container( - child: Container( - decoration: BoxDecoration( - color: HexColor('#515B5D'), - borderRadius: BorderRadius.only( - topRight: Radius.circular(10.0), - ), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.only( + topLeft: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), + topRight: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), ), - child: Center( - child: Texts( - 'Edit', - color: Colors.white, - fontSize: 15, - ), + ), + child: Center( + child: Texts( + TranslationBase.of(context).edit, + color: Colors.white, + fontSize: 15, ), - height: 40), - ), + ), + height: 40), ], ), ); - diabtecPatientResult.forEach( + model.weekWeightMeasurementResult.forEach( (diabtec) { tableRow.add( TableRow( @@ -133,7 +151,7 @@ class WeightWeeklyPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.weightDate)} ', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.weightDate) : DateUtil.getMonthDayYearDateFormatted(diabtec.weightDate)} ', textAlign: TextAlign.center, fontSize: 12, ), @@ -166,12 +184,30 @@ class WeightWeeklyPage extends StatelessWidget { ), ), ), - Container( - height: 70, - padding: EdgeInsets.all(10), - color: Colors.white, - child: Center( - child: Icon(Icons.edit), + InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: AddWeightPage( + isUpdate: true, + dayWeightDate: diabtec.weightDate, + measureTimeSelectedType: 'Kg', + weightValue: diabtec.weightMeasured.toString(), + lineItemNo: diabtec.lineItemNo, + weightUnit: int.parse(diabtec.unit), + model: model, + ), + ), + ); + }, + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Icon(Icons.edit), + ), ), ), ], diff --git a/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart b/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart index 587cc3f6..c5a1a3b3 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart @@ -2,41 +2,48 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPr import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/LineChartCurved.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class WeightYearPage extends StatelessWidget { - final List> data; - final List diabtecPatientResult; + final WeightPressureViewModel model; - const WeightYearPage({Key key, this.data, this.diabtecPatientResult}) + + const WeightYearPage({Key key, this.model, }) : super(key: key); @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( body: ListView( children: [ Container( - width: double.maxFinite, - height: 180, - color: Colors.white, - child: charts.TimeSeriesChart( - data, - dateTimeFactory: const charts.LocalDateTimeFactory(), - ), + width: double.maxFinite, + color: Colors.white, + child: LineChartCurved( + horizontalInterval: 2.0, + title: TranslationBase.of(context).weight, + timeSeries: model.weightYearTimeSeriesData, + indexes: model.weightYearTimeSeriesData.length ~/ 5.5, + ) ), SizedBox( height: 12, ), Padding( padding: const EdgeInsets.all(8.0), - child: Texts('Details'), + child: Texts(TranslationBase.of(context).details), ), Container( padding: EdgeInsets.all(10), @@ -48,7 +55,7 @@ class WeightYearPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(), + children: fullData(context, projectViewModel, model), ), ], ), @@ -58,21 +65,27 @@ class WeightYearPage extends StatelessWidget { ); } - List fullData() { + List fullData(BuildContext context, + ProjectViewModel projectViewModel, WeightPressureViewModel model) { List tableRow = []; tableRow.add( TableRow( children: [ Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + topRight: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), ), ), child: Center( child: Texts( - 'Date', + TranslationBase.of(context).date, color: Colors.white, fontSize: 15, ), @@ -81,11 +94,11 @@ class WeightYearPage extends StatelessWidget { ), Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Time', + TranslationBase.of(context).time, color: Colors.white, fontSize: 15, ), @@ -93,11 +106,19 @@ class WeightYearPage extends StatelessWidget { height: 40), Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.only( + topLeft: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), + topRight: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + ), ), child: Center( child: Texts( - 'Value', + TranslationBase.of(context).value, color: Colors.white, fontSize: 15, ), @@ -106,8 +127,8 @@ class WeightYearPage extends StatelessWidget { ], ), ); - diabtecPatientResult.forEach( - (diabtec) { + model.yearWeightMeasurementResult.forEach( + (diabtec) { tableRow.add( TableRow( children: [ @@ -118,7 +139,7 @@ class WeightYearPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.weightDate)} ', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.weightDate) : DateUtil.getMonthDayYearDateFormatted(diabtec.weightDate)} ', textAlign: TextAlign.center, fontSize: 12, ), diff --git a/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart b/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart index f39479ac..a1fbff8d 100644 --- a/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart +++ b/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart @@ -1,7 +1,6 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -10,6 +9,7 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/RadioStringDialog.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -31,7 +31,9 @@ class AddBloodSugarPage extends StatefulWidget { this.measureUnitSelectedType, this.isUpdate = false, this.measuredTime, - this.bloodSugarValue, this.lineItemNo, this.bloodSugarViewMode}) + this.bloodSugarValue, + this.lineItemNo, + this.bloodSugarViewMode}) : super(key: key); @override @@ -94,6 +96,40 @@ class _AddBloodSugarPageState extends State { appBarTitle: widget.isUpdate ? TranslationBase.of(context).update : TranslationBase.of(context).add, + appBarIcons: [ + IconButton( + icon: Icon(Icons.delete), + color: Colors.white, + onPressed: () { + ConfirmDialog dialog = new ConfirmDialog( + context: context, + confirmMessage: 'Remove this measure', + okText: TranslationBase.of(context).ok, + cancelText: TranslationBase.of(context).cancel, + okFunction: () async { + ConfirmDialog.closeAlertDialog(context); + + GifLoaderDialogUtils.showMyDialog(context); + widget.bloodSugarViewMode + .deactivateDiabeticStatus(lineItemNo: widget.lineItemNo) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (widget.bloodSugarViewMode.state == ViewState.ErrorLocal) + AppToast.showErrorToast( + message: widget.bloodSugarViewMode.error); + else + Navigator.pop(context); + }).catchError((e) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast( + message: widget.bloodSugarViewMode.error); + }); + }, + cancelFunction: () => {}); + dialog.showAlertDialog(context); + }, + ) + ], body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( @@ -143,10 +179,10 @@ class _AddBloodSugarPageState extends State { showTitleActions: true, minTime: DateTime(DateTime.now().year - 1, 1, 1), maxTime: DateTime.now(), onConfirm: (date) { - setState(() { - bloodSugarDate = date; - }); - }, + setState(() { + bloodSugarDate = date; + }); + }, currentTime: bloodSugarDate, locale: projectViewModel.localeType); }, @@ -173,10 +209,10 @@ class _AddBloodSugarPageState extends State { onTap: () { DatePicker.showTimePicker(context, showTitleActions: true, onConfirm: (date) { - setState(() { - timeSugarDate = date; - }); - }, + setState(() { + timeSugarDate = date; + }); + }, currentTime: timeSugarDate, locale: projectViewModel.localeType); }, @@ -236,39 +272,44 @@ class _AddBloodSugarPageState extends State { child: Padding( padding: const EdgeInsets.all(15.0), child: SecondaryButton( - label: TranslationBase.of(context).save, + label: TranslationBase.of(context).save.toUpperCase(), textColor: Colors.white, onTap: () { if (_bloodSugarValueController.text.isNotEmpty) { - GifLoaderDialogUtils.showMyDialog(context); - if (widget.isUpdate) - widget.bloodSugarViewMode.updateDiabtecResult( - month: bloodSugarDate, - hour: timeSugarDate, - diabtecUnit: measureUnitSelectedType, - measuredTime: measuredTime, - lineItemNo: widget.lineItemNo, - bloodSugerResult: - _bloodSugarValueController.text.toString()).then((value) { + if (widget.isUpdate) { + GifLoaderDialogUtils.showMyDialog(context); + widget.bloodSugarViewMode + .updateDiabtecResult( + month: bloodSugarDate, + hour: timeSugarDate, + diabtecUnit: measureUnitSelectedType, + measuredTime: measuredTime, + lineItemNo: widget.lineItemNo, + bloodSugerResult: + _bloodSugarValueController.text.toString()) + .then((value) { GifLoaderDialogUtils.hideDialog(context); - if(widget.bloodSugarViewMode.state == ViewState.Error) - AppToast.showErrorToast(message: widget.bloodSugarViewMode.error); + if (widget.bloodSugarViewMode.state == ViewState.ErrorLocal) + AppToast.showErrorToast( + message: widget.bloodSugarViewMode.error); else Navigator.pop(context); - }); - else - widget.bloodSugarViewMode.addDiabtecResult( + } else + widget.bloodSugarViewMode + .addDiabtecResult( diabtecUnit: measureUnitSelectedType, measuredTime: measuredTime, bloodSugerResult: - _bloodSugarValueController.text.toString(), + _bloodSugarValueController.text.toString(), bloodSugerDateChart: - '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00', - ).then((value) { + '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00', + ) + .then((value) { GifLoaderDialogUtils.hideDialog(context); - if(widget.bloodSugarViewMode.state == ViewState.Error) - AppToast.showErrorToast(message: widget.bloodSugarViewMode.error); + if (widget.bloodSugarViewMode.state == ViewState.Error) + AppToast.showErrorToast( + message: widget.bloodSugarViewMode.error); else Navigator.pop(context); }); diff --git a/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart b/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart index fa49382f..f5ef9aa9 100644 --- a/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart +++ b/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart @@ -2,8 +2,11 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPa import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/YearMonthlyChartDate.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/LineChartCurved.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/MonthLineChartCurved.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -13,10 +16,10 @@ import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; class BloodMonthlyPage extends StatelessWidget { - final List> data; final List diabtecPatientResult; + final List timeSeriesData ; - const BloodMonthlyPage({Key key, this.data, this.diabtecPatientResult}) + const BloodMonthlyPage({Key key, this.diabtecPatientResult, this.timeSeriesData}) : super(key: key); @override Widget build(BuildContext context) { @@ -25,13 +28,13 @@ class BloodMonthlyPage extends StatelessWidget { body: ListView( children: [ Container( - width: double.maxFinite, - height: 180, - color: Colors.white, - child: charts.LineChart(data, - //animate: animate, - defaultRenderer: - new charts.LineRendererConfig(includePoints: true)), + width: double.maxFinite, + color: Colors.white, + child: MonthLineChartCurved( + title: 'Sugar', + timeSeries: timeSeriesData, + indexes: timeSeriesData.length ~/ 5.5, + ) ), SizedBox( height: 12, @@ -146,7 +149,7 @@ class BloodMonthlyPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.dateChart):DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', textAlign: TextAlign.center, fontSize: 12, ), diff --git a/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart b/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart index 69f00e61..d94da7fe 100644 --- a/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart +++ b/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart @@ -1,8 +1,10 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/LineChartCurved.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -12,10 +14,11 @@ import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; class BloodYearPage extends StatelessWidget { - final List> data; + final List diabtecPatientResult; + final List timeSeriesData ; - const BloodYearPage({Key key, this.data, this.diabtecPatientResult}) + const BloodYearPage({Key key, this.diabtecPatientResult, this.timeSeriesData}) : super(key: key); @override @@ -26,12 +29,12 @@ class BloodYearPage extends StatelessWidget { children: [ Container( width: double.maxFinite, - height: 180, color: Colors.white, - child: charts.TimeSeriesChart( - data, - dateTimeFactory: const charts.LocalDateTimeFactory(), - ), + child: LineChartCurved( + title: 'Sugar', + timeSeries: timeSeriesData, + indexes: timeSeriesData.length ~/ 5.5, + ) ), SizedBox( height: 12, @@ -146,7 +149,7 @@ class BloodYearPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.dateChart):DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', textAlign: TextAlign.center, fontSize: 12, ), diff --git a/lib/pages/medical/my_trackers/blood_suger/blood_sugar_home_page.dart b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_home_page.dart index 70cdea0f..7abbcceb 100644 --- a/lib/pages/medical/my_trackers/blood_suger/blood_sugar_home_page.dart +++ b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_home_page.dart @@ -1,9 +1,14 @@ import 'dart:ui'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/TabBarWidget.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; @@ -42,70 +47,38 @@ class _BloodSugarHomePageState extends State return BaseView( onModelReady: (model) => model.getBloodSugar(), builder: (_, model, w) => AppScaffold( + appBarIcons: [IconButton( + icon: Icon(Icons.email), + color: Colors.white, + onPressed: () { + showDialog( + context: context, + child: ConfirmSendEmailDialog( + email: model.user.emailAddress, + onTapSendEmail: () async{ + GifLoaderDialogUtils.showMyDialog(context); + model.sendReportByEmail().then((value) { + GifLoaderDialogUtils.hideDialog(context); + if(model.state == ViewState.ErrorLocal){ + AppToast.showErrorToast(message: model.error); + }else{ + AppToast.showSuccessToast(message:TranslationBase.of(context).emailSentSuccessfully, ); + } + }).catchError((e){ + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: model.error); + }); + }, + ), + ); + }, + ),], isShowAppBar: true, appBarTitle: TranslationBase.of(context).bloodSugar, baseViewModel: model, body: Scaffold( extendBodyBehindAppBar: true, - appBar: PreferredSize( - preferredSize: Size.fromHeight(60.0), - child: Stack( - children: [ - Positioned( - bottom: 1, - left: 0, - right: 0, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), - child: Container( - color: Theme.of(context) - .scaffoldBackgroundColor - .withOpacity(0.8), - height: 70.0, - ), - ), - ), - Center( - child: Container( - height: 55.0, - color: Colors.white, - child: Center( - child: TabBar( - isScrollable: true, - controller: _tabController, - indicatorWeight: 5.0, - indicatorSize: TabBarIndicatorSize.tab, - labelColor: Theme.of(context).primaryColor, - labelPadding: - EdgeInsets.only(top: 4.0, left: 5.0, right: 5.0), - unselectedLabelColor: Colors.grey[800], - tabs: [ - Container( - width: MediaQuery.of(context).size.width * 0.33, - child: Center( - child: Texts(TranslationBase.of(context).weekly), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.33, - child: Center( - child: Texts(TranslationBase.of(context).monthlyT), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.34, - child: Center( - child: Texts(TranslationBase.of(context).yearly), - ), - ), - ], - ), - ), - ), - ), - ], - ), - ), + appBar: TabBarWidget(tabController: _tabController,), body: Column( children: [ Expanded( @@ -114,16 +87,16 @@ class _BloodSugarHomePageState extends State controller: _tabController, children: [ BloodSugarWeeklyPage( - data: model.getBloodWeeklySeries(), + timeSeriesData: model.bloodWeekTimeSeriesData, diabtecPatientResult: model.weekDiabtecPatientResult, bloodSugarViewMode: model, ), BloodMonthlyPage( - data: model.getBloodMonthlyTimeSeriesSales(), + timeSeriesData: model.monthTimeSeriesData, diabtecPatientResult: model.monthDiabtecPatientResult, ), BloodYearPage( - data: model.getBloodYearTimeSeriesSales(), + timeSeriesData: model.yearTimeSeriesData, diabtecPatientResult: model.yearDiabtecPatientResult, ) ], diff --git a/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart index 139548e1..4bda58fa 100644 --- a/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart +++ b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart @@ -2,25 +2,29 @@ import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPa import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/LineChartCurved.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:charts_flutter/flutter.dart' as charts; -import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; - import 'AddBloodSugarPage.dart'; class BloodSugarWeeklyPage extends StatelessWidget { - final List> data; final List diabtecPatientResult; final BloodSugarViewMode bloodSugarViewMode; + final List timeSeriesData; - const BloodSugarWeeklyPage({Key key, this.data, this.diabtecPatientResult, this.bloodSugarViewMode}) + BloodSugarWeeklyPage( + {Key key, + this.diabtecPatientResult, + this.bloodSugarViewMode, + this.timeSeriesData}) : super(key: key); @override @@ -30,12 +34,12 @@ class BloodSugarWeeklyPage extends StatelessWidget { body: ListView( children: [ Container( - width: double.maxFinite, - height: 180, + margin: EdgeInsets.only(top: 12, left: 8, right: 8), color: Colors.white, - child: charts.TimeSeriesChart( - data, - dateTimeFactory: const charts.LocalDateTimeFactory(), + child: LineChartCurved( + title: 'Sugar', + timeSeries: timeSeriesData, + indexes: timeSeriesData.length ~/ 5.5, ), ), SizedBox( @@ -55,7 +59,8 @@ class BloodSugarWeeklyPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(context, projectViewModel,bloodSugarViewMode), + children: + fullData(context, projectViewModel, bloodSugarViewMode), ), ], ), @@ -66,7 +71,9 @@ class BloodSugarWeeklyPage extends StatelessWidget { } List fullData( - BuildContext context, ProjectViewModel projectViewModel, BloodSugarViewMode bloodSugarViewMode) { + BuildContext context, + ProjectViewModel projectViewModel, + BloodSugarViewMode bloodSugarViewMode) { List tableRow = []; tableRow.add( TableRow( @@ -173,7 +180,7 @@ class BloodSugarWeeklyPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)}', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.dateChart):DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', textAlign: TextAlign.center, fontSize: 12, ), diff --git a/lib/pages/medical/my_trackers/widget/LineChartCurved.dart b/lib/pages/medical/my_trackers/widget/LineChartCurved.dart new file mode 100644 index 00000000..eeff06dd --- /dev/null +++ b/lib/pages/medical/my_trackers/widget/LineChartCurved.dart @@ -0,0 +1,222 @@ +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +import '../../../../Constants.dart'; + +class LineChartCurved extends StatelessWidget { + final String title; + final List timeSeries; + final int indexes; + final double horizontalInterval; + + LineChartCurved( + {this.title, + this.timeSeries, + this.indexes, + this.horizontalInterval = 20.0}); + + List xAxixs = List(); + List yAxixs = List(); + + @override + Widget build(BuildContext context) { + getXaxix(); + getYaxix(); + return AspectRatio( + aspectRatio: 1.1, + child: Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(18)), + // color: Colors.white, + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox( + height: 4, + ), + Text( + title, + style: TextStyle( + color: Colors.black, fontSize: 15, letterSpacing: 2), + textAlign: TextAlign.center, + ), + SizedBox( + height: 10, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only( + right: 18.0, left: 16.0, top: 15, bottom: 15), + child: LineChart( + sampleData1(context), + swapAnimationDuration: const Duration(milliseconds: 250), + ), + ), + ), + const SizedBox( + height: 10, + ), + ], + ), + ], + ), + ), + ); + } + + getXaxix() { + for (int index = 0; index < timeSeries.length; index++) { + int mIndex = indexes * index; + if (mIndex < timeSeries.length) { + xAxixs.add(mIndex); + } + } + } + + getYaxix() { + int indexess = (timeSeries.length * 0.30).toInt(); + for (int index = 0; index < timeSeries.length; index++) { + int mIndex = indexess * index; + if (mIndex < timeSeries.length) { + yAxixs.add(timeSeries[mIndex].sales); + } + } + } + + LineChartData sampleData1(context) { + return LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.white, + ), + touchCallback: (LineTouchResponse touchResponse) {}, + handleBuiltInTouches: true, + ), + gridData: FlGridData( + horizontalInterval: horizontalInterval, + show: true, + drawVerticalLine: true, + drawHorizontalLine: true), + titlesData: FlTitlesData( + bottomTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontSize: 10, + ), + // rotateAngle: 90, + //rotateAngle:-65, + margin: 22, + getTitles: (value) { + if (timeSeries.length < 15) { + if (timeSeries.length > value.toInt()) { + return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + } 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 (xAxixs.contains(value.toInt())) { + return '${timeSeries[value.toInt()].time.month}/ ${timeSeries[value.toInt()].time.year}'; + } + } + return ''; + }, + ), + leftTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 10, + ), + getTitles: (value) { + if (value.toInt() == 0) + return '${value.toInt()}'; + else if (value.toInt() % horizontalInterval == 0) + return '${value.toInt()}'; + else + return ''; + }, + margin: 12, + ), + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide( + color: Colors.black, + width: 0.5, + ), + left: BorderSide( + color: Colors.black, + ), + right: BorderSide( + color: Colors.black, + ), + top: BorderSide( + color: Colors.transparent, + ), + ), + ), + minX: 0, + maxX: (timeSeries.length - 1).toDouble(), + maxY: getMaxY() + 0.3, + minY: getMinY(), + lineBarsData: getData(context), + ); + } + + double getMaxY() { + double max = 0; + timeSeries.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + + return max.roundToDouble(); + } + + double getMinY() { + double min = timeSeries[0].sales; + timeSeries.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + int value = min.toInt(); + + return value.toDouble(); + } + + List getData(context) { + List spots = List(); + for (int index = 0; index < timeSeries.length; index++) { + spots.add(FlSpot(index.toDouble(), timeSeries[index].sales)); + } + + final LineChartBarData lineChartBarData1 = LineChartBarData( + spots: spots, + isCurved: true, + colors: [secondaryColor], + barWidth: 5, + isStrokeCapRound: true, + curveSmoothness: 0.12, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + + return [ + lineChartBarData1, + ]; + } +} diff --git a/lib/pages/medical/my_trackers/widget/MonthLineChartCurved.dart b/lib/pages/medical/my_trackers/widget/MonthLineChartCurved.dart new file mode 100644 index 00000000..607f3ab0 --- /dev/null +++ b/lib/pages/medical/my_trackers/widget/MonthLineChartCurved.dart @@ -0,0 +1,206 @@ +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +import '../../../../Constants.dart'; + +class MonthLineChartCurved extends StatelessWidget { + final String title; + final List timeSeries; + final int indexes; + final double horizontalInterval; + + MonthLineChartCurved( + {this.title, + this.timeSeries, + this.indexes, + this.horizontalInterval = 15.0}); + + List xAxixs = List(); + List yAxixs = List(); + + @override + Widget build(BuildContext context) { + getXaxix(); + getYaxix(); + return AspectRatio( + aspectRatio: 1.1, + child: Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(18)), + // color: Colors.white, + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox( + height: 4, + ), + Text( + title, + style: TextStyle( + color: Colors.black, fontSize: 15, letterSpacing: 2), + textAlign: TextAlign.center, + ), + SizedBox( + height: 10, + ), + Expanded( + child: Padding( + padding: const EdgeInsets.only( + right: 18.0, left: 16.0, top: 15, bottom: 15), + child: LineChart( + sampleData1(context), + swapAnimationDuration: const Duration(milliseconds: 250), + ), + ), + ), + const SizedBox( + height: 10, + ), + ], + ), + ], + ), + ), + ); + } + + getXaxix() { + for (int index = 0; index < timeSeries.length; index++) { + int mIndex = indexes * index; + if (mIndex < timeSeries.length) { + xAxixs.add(mIndex); + } + } + } + + getYaxix() { + int indexess = (timeSeries.length * 0.30).toInt(); + for (int index = 0; index < timeSeries.length; index++) { + int mIndex = indexess * index; + if (mIndex < timeSeries.length) { + yAxixs.add(timeSeries[mIndex].sales); + } + } + } + + LineChartData sampleData1(context) { + return LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.white, + ), + touchCallback: (LineTouchResponse touchResponse) {}, + handleBuiltInTouches: true, + ), + gridData: FlGridData( + horizontalInterval: horizontalInterval, + show: true, + drawVerticalLine: true, + drawHorizontalLine: true), + titlesData: FlTitlesData( + bottomTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontSize: 10, + ), + margin: 22, + getTitles: (value) { + return '${value.toInt()}'; + }, + ), + leftTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 10, + ), + getTitles: (value) { + if (value.toInt() == 0) + return '${value.toInt()}'; + else if (value.toInt() % horizontalInterval == 0) + return '${value.toInt()}'; + else + return ''; + }, + margin: 12, + ), + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide( + color: Colors.black, + width: 0.5, + ), + left: BorderSide( + color: Colors.black, + ), + right: BorderSide( + color: Colors.black, + ), + top: BorderSide( + color: Colors.transparent, + ), + ), + ), + minX: 0, + maxX: (timeSeries.length - 1).toDouble(), + maxY: getMaxY() + 0.3, + minY: getMinY(), + lineBarsData: getData(context), + ); + } + + double getMaxY() { + double max = 0; + timeSeries.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + + return max.roundToDouble(); + } + + double getMinY() { + double min = timeSeries[0].sales; + timeSeries.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + int value = min.toInt(); + + return value.toDouble(); + } + + List getData(context) { + List spots = List(); + for (int index = 0; index < timeSeries.length; index++) { + spots.add(FlSpot(index.toDouble(), timeSeries[index].sales)); + } + + final LineChartBarData lineChartBarData1 = LineChartBarData( + spots: spots, + isCurved: true, + colors: [secondaryColor], + barWidth: 5, + isStrokeCapRound: true, + curveSmoothness: 0.0, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + + return [ + lineChartBarData1, + ]; + } +} diff --git a/lib/pages/medical/my_trackers/widget/TabBarWidget.dart b/lib/pages/medical/my_trackers/widget/TabBarWidget.dart new file mode 100644 index 00000000..199dbc54 --- /dev/null +++ b/lib/pages/medical/my_trackers/widget/TabBarWidget.dart @@ -0,0 +1,73 @@ +import 'dart:ui'; + +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class TabBarWidget extends StatelessWidget with PreferredSizeWidget{ + final TabController tabController; + + const TabBarWidget({Key key, this.tabController}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + Positioned( + bottom: 1, + left: 0, + right: 0, + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + color: + Theme.of(context).scaffoldBackgroundColor.withOpacity(0.8), + height: 70.0, + ), + ), + ), + Center( + child: Container( + height: 55.0, + color: Colors.white, + child: Center( + child: TabBar( + isScrollable: true, + controller: tabController, + indicatorWeight: 5.0, + indicatorSize: TabBarIndicatorSize.tab, + labelColor: Theme.of(context).primaryColor, + labelPadding: + EdgeInsets.only(top: 4.0, left: 5.0, right: 5.0), + unselectedLabelColor: Colors.grey[800], + tabs: [ + Container( + width: MediaQuery.of(context).size.width * 0.33, + child: Center( + child: Texts(TranslationBase.of(context).weekly), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.33, + child: Center( + child: Texts(TranslationBase.of(context).monthlyT), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.34, + child: Center( + child: Texts(TranslationBase.of(context).yearly), + ), + ), + ], + ), + ), + ), + ), + ], + ); + } + @override + Size get preferredSize => Size(double.maxFinite, 60); +} diff --git a/lib/pages/medical/vital_sign/LineChartCurved.dart b/lib/pages/medical/vital_sign/LineChartCurved.dart index 7b7449a8..f2bc3d5f 100644 --- a/lib/pages/medical/vital_sign/LineChartCurved.dart +++ b/lib/pages/medical/vital_sign/LineChartCurved.dart @@ -2,6 +2,8 @@ import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import '../../../Constants.dart'; + class LineChartCurved extends StatelessWidget { final String title; final List timeSeries; @@ -199,7 +201,7 @@ class LineChartCurved extends StatelessWidget { final LineChartBarData lineChartBarData1 = LineChartBarData( spots: spots, isCurved: true, - colors: [Theme.of(context).primaryColor], + colors: [secondaryColor], barWidth: 5, isStrokeCapRound: true, dotData: FlDotData( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 8dff17c4..6280bf01 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1282,6 +1282,7 @@ class TranslationBase { String get childAddedSuccessfully => localizedValues["child_added_successfully"][locale.languageCode]; String get bloodDEnterDesc => localizedValues["bloodD-enter-desc"][locale.languageCode]; String get viewTermsConditions => localizedValues["viewTermsConditions"][locale.languageCode]; + String get weightAdd => localizedValues["weight-add"][locale.languageCode]; } diff --git a/lib/widgets/charts/app_time_series_chart.dart b/lib/widgets/charts/app_time_series_chart.dart index d34bc591..24d632bc 100644 --- a/lib/widgets/charts/app_time_series_chart.dart +++ b/lib/widgets/charts/app_time_series_chart.dart @@ -69,3 +69,9 @@ class TimeSeriesSales2 { TimeSeriesSales2(this.time, this.sales); } +class TimeSeriesSales3 { + final int time; + final double sales; + + TimeSeriesSales3(this.time, this.sales); +} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index fca914a0..3fce4b51 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -40,7 +40,6 @@ class AppScaffold extends StatelessWidget { final bool isPharmacy; final String title; final String description; - final String image; final bool isShowDecPage; final List infoList; final Color backgroundColor; @@ -68,7 +67,6 @@ class AppScaffold extends StatelessWidget { this.backgroundColor, this.preferredSize = 0.0, this.appBarIcons, - this.image, this.infoList, this.imagesInfo}); @override @@ -82,7 +80,6 @@ class AppScaffold extends StatelessWidget { appBarIcons:appBarIcons, isPharmacy: isPharmacy, isShowDecPage: isShowDecPage, - image: image, ):null, bottomSheet: bottomSheet, body: (!Provider.of(context, listen: false).isLogin && @@ -116,10 +113,9 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget { final List appBarIcons; final bool isPharmacy; final bool isShowDecPage; - final String image; AppBarWidget({this.appBarTitle, this.appBarIcons, - this.isPharmacy = true, this.isShowDecPage = true, this.image}); + this.isPharmacy = true, this.isShowDecPage = true}); @override Widget build(BuildContext context) { From dde10cd27b6f81fff15376aab8b389379f274e8f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 24 Jan 2021 09:29:57 +0300 Subject: [PATCH 5/8] working in LiveCare Scheduling --- lib/pages/BookAppointment/BookConfirm.dart | 56 +++++++++------- lib/pages/BookAppointment/BookSuccess.dart | 4 +- .../BookAppointment/widgets/DoctorView.dart | 2 +- lib/pages/ToDoList/ToDo.dart | 48 ++++++++----- lib/pages/livecare/livecare_home.dart | 1 + .../schedule_clinic_card.dart | 6 +- .../livecare/widgets/LiveCareHistoryCard.dart | 3 +- lib/widgets/in_app_browser/InAppBrowser.dart | 67 ++++++++++++------- 8 files changed, 114 insertions(+), 73 deletions(-) diff --git a/lib/pages/BookAppointment/BookConfirm.dart b/lib/pages/BookAppointment/BookConfirm.dart index d7e08a66..03a28d90 100644 --- a/lib/pages/BookAppointment/BookConfirm.dart +++ b/lib/pages/BookAppointment/BookConfirm.dart @@ -187,27 +187,29 @@ class _BookConfirmState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Container( - margin: EdgeInsets.fromLTRB(5.0, 0.0, 5.0, 0.0), - child: Image.asset( - "assets/images/new-design/icon_hospital.png"), - ), - Container( - margin: EdgeInsets.fromLTRB(20.0, 5.0, 10.0, 5.0), - child: Text( - TranslationBase.of(context).hospital + - ": " + - widget.doctor.projectName, - style: TextStyle( - fontSize: 14.0, - color: Colors.grey[700], - letterSpacing: 1.0)), - ), - ], - ), + !widget.isLiveCareAppointment ? Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + margin: + EdgeInsets.fromLTRB(5.0, 0.0, 5.0, 0.0), + child: Image.asset( + "assets/images/new-design/icon_hospital.png"), + ), + Container( + margin: + EdgeInsets.fromLTRB(20.0, 5.0, 10.0, 5.0), + child: Text( + TranslationBase.of(context).hospital + + ": " + + widget.doctor.projectName, + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[700], + letterSpacing: 1.0)), + ), + ], + ) : Container(), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -325,7 +327,8 @@ class _BookConfirmState extends State { Container( margin: EdgeInsets.only(top: 5.0), child: Text( - TranslationBase.of(context).gender + ": " + + TranslationBase.of(context).gender + + ": " + widget.authUser.genderDescription, style: TextStyle( fontSize: 12.0, @@ -335,7 +338,9 @@ class _BookConfirmState extends State { Container( margin: EdgeInsets.only(top: 5.0, bottom: 3.0), child: Text( - TranslationBase.of(context).age + ": " + widget.authUser.age.toString(), + TranslationBase.of(context).age + + ": " + + widget.authUser.age.toString(), style: TextStyle( fontSize: 12.0, color: Colors.grey[600], @@ -423,7 +428,8 @@ class _BookConfirmState extends State { context) .then((res) { if (res['MessageStatus'] == 1) { - AppToast.showSuccessToast(message: TranslationBase.of(context).bookedSuccess); + AppToast.showSuccessToast( + message: TranslationBase.of(context).bookedSuccess); print(res['AppointmentNo']); Future.delayed(new Duration(milliseconds: 500), () { @@ -543,13 +549,13 @@ class _BookConfirmState extends State { getLiveCareAppointmentPatientShare(context, String appointmentNo, int clinicID, int projectID, DoctorList docObject) { - GifLoaderDialogUtils.hideDialog(context); widget.service .getLiveCareAppointmentPatientShare( appointmentNo, clinicID, projectID, context) .then((res) { print(res); widget.patientShareResponse = new PatientShareResponse.fromJson(res); + GifLoaderDialogUtils.hideDialog(context); navigateToBookSuccess(context, docObject, widget.patientShareResponse); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); diff --git a/lib/pages/BookAppointment/BookSuccess.dart b/lib/pages/BookAppointment/BookSuccess.dart index f513c434..a478b2f1 100644 --- a/lib/pages/BookAppointment/BookSuccess.dart +++ b/lib/pages/BookAppointment/BookSuccess.dart @@ -255,7 +255,7 @@ class _BookSuccessState extends State { minWidth: MediaQuery.of(context).size.width * 0.7, height: 45.0, child: RaisedButton( - color: new Color(0xFF40ACC9), + color: new Color(0xffc5272d), textColor: Colors.white, disabledTextColor: Colors.white, disabledColor: new Color(0xFFbcc2c4), @@ -318,7 +318,7 @@ class _BookSuccessState extends State { minWidth: MediaQuery.of(context).size.width * 0.7, height: 45.0, child: RaisedButton( - color: new Color(0xFF40ACC9), + color: new Color(0xFFc5272d), textColor: Colors.white, disabledTextColor: Colors.white, disabledColor: new Color(0xFFbcc2c4), diff --git a/lib/pages/BookAppointment/widgets/DoctorView.dart b/lib/pages/BookAppointment/widgets/DoctorView.dart index d419e4af..1562c5f7 100644 --- a/lib/pages/BookAppointment/widgets/DoctorView.dart +++ b/lib/pages/BookAppointment/widgets/DoctorView.dart @@ -61,7 +61,7 @@ class DoctorView extends StatelessWidget { letterSpacing: 1.0)), Container( margin: EdgeInsets.only(top: 3.0), - child: Text(this.doctor.clinicName, + child: Text(this.doctor.clinicName != null ? this.doctor.clinicName : "", style: TextStyle( fontSize: 12.0, color: Colors.grey[600], diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index 1066ca15..d36bb250 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -13,7 +13,6 @@ import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart'; import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; -import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -26,7 +25,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_countdown_timer/countdown_timer_controller.dart'; import 'package:flutter_countdown_timer/current_remaining_time.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:provider/provider.dart'; import 'package:rating_bar/rating_bar.dart'; @@ -130,24 +128,18 @@ class _ToDoState extends State { .substring(0, 5), style: TextStyle(fontSize: 10.0)), ), - widget.appoList[index].isLiveCareAppointment - ? SvgPicture.asset( - "assets/images/new-design/liveCare_logo_icon.svg", - width: 20.0, - height: 20.0) - : Image.asset( + !widget.appoList[index].isLiveCareAppointment + ? Image.asset( "assets/images/new-design/hospital_address_icon.png", width: 20.0, - height: 20.0), + height: 20.0) + : Container(), Container( margin: EdgeInsets.only(left: 5.0, right: 5.0), child: widget .appoList[index].isLiveCareAppointment - ? Text( - TranslationBase.of(context) - .liveCareAppo, - style: TextStyle(fontSize: 12.0)) + ? Container() : Text( widget.appoList[index].projectName != null @@ -249,7 +241,7 @@ class _ToDoState extends State { (_, CurrentRemainingTime time) { return time != null ? Text( - '${time.days}:${time.hours}:${time.min}:${time.sec} ' + + '${time.days != null ? time.days : "0"}:${time.hours.toString().length == 1 ? "0" + time.hours.toString() : time.hours}:${time.min}:${time.sec} ' + TranslationBase.of( context) .upcomingTimeLeft, @@ -567,12 +559,34 @@ class _ToDoState extends State { } getPatientShare(context, AppoitmentAllHistoryResultList appo) { - GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); + if (appo.isLiveCareAppointment) { + getLiveCareAppointmentPatientShare(context, service, appo); + } else { + GifLoaderDialogUtils.showMyDialog(context); + service + .getPatientShare(appo.appointmentNo.toString(), appo.clinicID, + appo.projectID, context) + .then((res) { + GifLoaderDialogUtils.hideDialog(context); + widget.patientShareResponse = new PatientShareResponse.fromJson(res); + openPaymentDialog(appo, widget.patientShareResponse); + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: err); + print(err); + }); + } + } + + getLiveCareAppointmentPatientShare(context, DoctorsListService service, + AppoitmentAllHistoryResultList appo) { + GifLoaderDialogUtils.showMyDialog(context); service - .getPatientShare(appo.appointmentNo.toString(), appo.clinicID, - appo.projectID, context) + .getLiveCareAppointmentPatientShare(appo.appointmentNo.toString(), + appo.clinicID, appo.projectID, context) .then((res) { + print(res); GifLoaderDialogUtils.hideDialog(context); widget.patientShareResponse = new PatientShareResponse.fromJson(res); openPaymentDialog(appo, widget.patientShareResponse); diff --git a/lib/pages/livecare/livecare_home.dart b/lib/pages/livecare/livecare_home.dart index fc5c4eab..1974753f 100644 --- a/lib/pages/livecare/livecare_home.dart +++ b/lib/pages/livecare/livecare_home.dart @@ -49,6 +49,7 @@ class _LiveCareHomeState extends State child: Column(children: [ /// this is will not colored with theme data TabBar( + labelColor: Colors.black, tabs: [ Tab(text: TranslationBase.of(context).consultation), Tab(text: TranslationBase.of(context).logs), diff --git a/lib/pages/livecare/livecare_scheduling/schedule_clinic_card.dart b/lib/pages/livecare/livecare_scheduling/schedule_clinic_card.dart index 4309cc62..19144263 100644 --- a/lib/pages/livecare/livecare_scheduling/schedule_clinic_card.dart +++ b/lib/pages/livecare/livecare_scheduling/schedule_clinic_card.dart @@ -21,7 +21,7 @@ class _ScheduleClinicCardState extends State { return Container( child: Card( margin: EdgeInsets.fromLTRB(15.0, 10.0, 15.0, 8.0), - color: widget.isSelected ? Colors.blue : Colors.white, + color: widget.isSelected ? Color(0xff06b806) : Colors.white, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), @@ -35,8 +35,8 @@ class _ScheduleClinicCardState extends State { Container( child: Text( widget.languageID == 'ar' - ? widget.clinicsHaveScheduleList.clinicDescN - : widget.clinicsHaveScheduleList.clinicDesc, + ? widget.clinicsHaveScheduleList.clinicDescN != null ? widget.clinicsHaveScheduleList.clinicDescN: "" + : widget.clinicsHaveScheduleList.clinicDesc != null ? widget.clinicsHaveScheduleList.clinicDesc: "Dermatology", style: TextStyle( fontSize: 16.0, color: diff --git a/lib/pages/livecare/widgets/LiveCareHistoryCard.dart b/lib/pages/livecare/widgets/LiveCareHistoryCard.dart index 25ec8514..15c14557 100644 --- a/lib/pages/livecare/widgets/LiveCareHistoryCard.dart +++ b/lib/pages/livecare/widgets/LiveCareHistoryCard.dart @@ -42,10 +42,11 @@ class _LiveCareHistoryCardState extends State { ), child: Container( width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height * 0.22, + // height: MediaQuery.of(context).size.height * 0.22, padding: EdgeInsets.all(10.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ Text("Requested date:", style: diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index c46b5616..001bcdfa 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -1,8 +1,6 @@ import 'dart:convert'; -import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; -import 'package:diplomaticquarterapp/core/model/my_balance/AdvanceModel.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; @@ -13,14 +11,14 @@ class MyInAppBrowser extends InAppBrowser { // static String SERVICE_URL = // 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort Payment Gateway URL UAT - static String SERVICE_URL = - 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE + static String SERVICE_URL = + 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort Payment Gateway URL LIVE // static String PREAUTH_SERVICE_URL = // 'https://hmgwebservices.com/PayFortWeb/pages/SendPayFortRequest.aspx'; // Payfort PreAuth Payment Gateway URL UAT - static String PREAUTH_SERVICE_URL = - 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store + static String PREAUTH_SERVICE_URL = + 'https://hmgwebservices.com/PayFortWebLive/pages/SendPayFortRequest.aspx'; //Payfort PreAuth Payment Gateway URL Live Store static List successURLS = [ 'success', @@ -42,6 +40,9 @@ class MyInAppBrowser extends InAppBrowser { String deviceToken; + double lat = 0.0; + double long = 0.0; + static bool isPaymentDone = false; MyInAppBrowser({this.onExitCallback, this.appo, this.onLoadStartCallback}); @@ -98,6 +99,11 @@ class MyInAppBrowser extends InAppBrowser { await this.sharedPref.getObject(USER_PROFILE)); authUser = data; } + if (await this.sharedPref.getDouble(USER_LAT) != null && + await this.sharedPref.getDouble(USER_LONG) != null) { + lat = await this.sharedPref.getDouble(USER_LAT); + long = await this.sharedPref.getDouble(USER_LONG); + } } openPaymentBrowser( @@ -112,11 +118,22 @@ class MyInAppBrowser extends InAppBrowser { dynamic patientID, AuthenticatedUser authenticatedUser, InAppBrowser browser) { - getDeviceToken(); this.browser = browser; - this.browser.openUrl( - url: generateURL(amount, orderDesc, transactionID, projId, emailId, - paymentMethod, patientType, patientName, patientID, authenticatedUser)); + getPatientData(); + generateURL( + amount, + orderDesc, + transactionID, + projId, + emailId, + paymentMethod, + patientType, + patientName, + patientID, + authenticatedUser) + .then((value) { + this.browser.openUrl(url: value); + }); } openBrowser(String url) { @@ -124,7 +141,7 @@ class MyInAppBrowser extends InAppBrowser { this.browser.openUrl(url: url); } - String generateURL( + Future generateURL( double amount, String orderDesc, String transactionID, @@ -137,15 +154,16 @@ class MyInAppBrowser extends InAppBrowser { AuthenticatedUser authUser, [var patientData, var servID, - var LiveServID]) { - getPatientData(); + var LiveServID]) async { + // getPatientData(); + getDeviceToken(); String currentLanguageID = getLanguageID() == 'ar' ? 'AR' : 'EN'; String form = getForm(); // if (authUser != null) { // form = form.replaceFirst("EMAIL_VALUE", authUser.emailAddress); // } else { - form = form.replaceFirst("EMAIL_VALUE", emailId); + form = form.replaceFirst("EMAIL_VALUE", emailId); // } form = form.replaceFirst('AMOUNT_VALUE', amount.toString()); @@ -157,12 +175,13 @@ class MyInAppBrowser extends InAppBrowser { form = form.replaceFirst('LANG_VALUE', currentLanguageID); form = form.replaceFirst('PATIENT_OUT_SA', authUser.outSA == 0 ? false.toString() : true.toString()); - form = form.replaceFirst('PATIENT_TYPE_ID', - patientData == null ? patientType.toString() : "1"); + form = form.replaceFirst( + 'PATIENT_TYPE_ID', patientData == null ? patientType.toString() : "1"); -// form = form.replaceFirst('DEVICE_TOKEN', this.cs.sharedService.getSharedData(AuthenticationService.DEVICE_TOKEN, false) + "," + this.cs.sharedService.getSharedData(AuthenticationService.APNS_TOKEN, false)); -// form = form.replaceFirst('LATITUDE_VALUE', this.cs.sharedService.getSharedData('userLat', false)); -// form = form.replaceFirst('LONGITUDE_VALUE', this.cs.sharedService.getSharedData('userLong', false)); + form = form.replaceFirst( + 'DEVICE_TOKEN', await sharedPref.getString(PUSH_TOKEN)); + form = form.replaceFirst('LATITUDE_VALUE', this.lat.toString()); + form = form.replaceFirst('LONGITUDE_VALUE', this.long.toString()); if (servID == "4") form = form.replaceFirst( @@ -179,16 +198,16 @@ class MyInAppBrowser extends InAppBrowser { } // if (patientData == null) { - form = form.replaceFirst('CUSTNAME_VALUE', patientName); - form = form.replaceFirst('CUSTID_VALUE', patientID.toString()); + form = form.replaceFirst('CUSTNAME_VALUE', patientName); + form = form.replaceFirst('CUSTID_VALUE', patientID.toString()); // } else { // form = form.replaceFirst('CUSTNAME_VALUE', patientData.depositorName); // form = form.replaceFirst('CUSTID_VALUE', patientData.fileNumber); // } - form = form.replaceFirst('LATITUDE_VALUE', "24.708488"); - form = form.replaceFirst('LONGITUDE_VALUE', "46.665925"); - form = form.replaceFirst('DEVICE_TOKEN', DEVICE_TOKEN); + // form = form.replaceFirst('LATITUDE_VALUE', "24.708488"); + // form = form.replaceFirst('LONGITUDE_VALUE', "46.665925"); + // form = form.replaceFirst('DEVICE_TOKEN', DEVICE_TOKEN); var bytes = utf8.encode(form); var base64Str = base64.encode(bytes); From 7c538b350f71db321ebb78ed3ea45c66ed99b13a Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 24 Jan 2021 14:49:55 +0300 Subject: [PATCH 6/8] LiveCare Scheduling finalized, Appointments in ToDo list categorized --- assets/images/new-design/video.png | Bin 0 -> 1445 bytes assets/images/new-design/walkin.png | Bin 0 -> 2204 bytes lib/config/localized_values.dart | 8 + lib/pages/Blood/confirm_payment_page.dart | 11 +- lib/pages/BookAppointment/BookSuccess.dart | 7 +- .../widgets/AppointmentCardView.dart | 2 +- lib/pages/ToDoList/ToDo.dart | 519 ++++++++++-------- lib/pages/ToDoList/widgets/upcomingCard.dart | 2 +- lib/pages/livecare/widgets/clinic_list.dart | 3 +- .../medical/balance/confirm_payment_page.dart | 3 +- lib/uitl/translations_delegate_base.dart | 3 + lib/widgets/in_app_browser/InAppBrowser.dart | 79 ++- 12 files changed, 388 insertions(+), 249 deletions(-) create mode 100644 assets/images/new-design/video.png create mode 100644 assets/images/new-design/walkin.png diff --git a/assets/images/new-design/video.png b/assets/images/new-design/video.png new file mode 100644 index 0000000000000000000000000000000000000000..2962aade25b0cbf40d7f439963947c58f5d4dd19 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^DImc-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk#8koDQqR!L z*u>ION5ROz&_dt9Lf_C>*U-$$#K6kPNC66zfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAX(!G{Q6U zQu51-HNkp(eXTt6ic1pnl2bihY?Xkf=w)W6Secm`yP6p~Iy)J=nHd_oIy#!T8o0W; zIvcwfx*3|AIKuS0gIDEVtyeO#YU;PhZ@9vGv7G%e?Q^Us6jU5qN%d0qw0jGJxv)_22u>%&=pUB1-LjI%I)n>(Xw+xM86^OE+* zOp396^Vj+B{g>arGCpOVV6##qJgR?+n8ITfhR3zv>fd|J{KBwlGRu;EeP@~7P9580 ze<8YYj~COYU1#>C#RaZ&yZ_bT?OOAbdnM(f^|<=K?|Ogs!{Z$&ldc^C>Y0D-5gpUXO@ GgeCweDhUPv literal 0 HcmV?d00001 diff --git a/assets/images/new-design/walkin.png b/assets/images/new-design/walkin.png new file mode 100644 index 0000000000000000000000000000000000000000..248c8788d0802be9a0403ecf04aa0ba3972057b2 GIT binary patch literal 2204 zcmaJ@X;>5I7LFKM6bmSVpu!Loq?(n0Bqjv1Nze#{D4+rj$p8_vkPIX&E>Msv5n{1W zSCmaGLhJIllubZE(W;;iixi|)3qpm+ErONhPE=@rT<$#2obNkl&ikJA#~kwCx@qx3 z+l2@OVll^u$%9Xk{xvp)rTq8r`0!x^v4WvMStO(qC_sd_NEQJC9El(bS+aYqaBL^ogq34?ccC6Y+%0Rj&1fyH@X@vdmRJDG?h69~ZP2L(q{ zh$6{6Ci`?M&*i;DWb4=5{ZPx5wHXT8umad6Qqzpjg~4MXBe2E zQm7EiA+byf=otkOvN(u}f;0V8fbF*tomGmc#D|96#0X1$dV z5Bw+J|4FRmC&)o84^+zH6he4#k&gOMaxy~!3Lu$+FO%(=>7swM43a6MWpaSQ(07dl ztPK)NMKYDr&m4$Fj-dxpQI6$@dv6 znmZTfoLDTJ3|2qfe+_%a1aFZ3I=i~CGQ0es6yA6RyxP0$!@3ZN1*ROPH(&ki&r^%O z;cr{sR4YMmx!+1$$J)tE*B#xloz3<>CO*b@ie9~&<#WjL8{Ytj0!s%}I@@nivSC0p z>x6H}MVrWo3#_Brt@UC35jI`ZFYNk)lc$YM*s5^ZH=x>r_$N$;?#lXuQ z>iNmJv64lUB~y7`1BJ@o23;pOP-W^T$lGSmEk`iiY--Zr4;Chap8wrC)xnP%o=;F=V$+qqtQiwNSi#u69A;SwZ>wb!_ zbEaqKqs(cncI$APxPwVoRn`+>{jsWXPXmsbXpFqcq zuNJ?$>f2gwYG7tSH>%jAaaWmf-{qfuc9Lid3h=aPz&O-_xwKHL(b836dSX>C_%$<)auFMlX#o&5V3 z-Eri%Tm~hjlo&Lc8_;9v%KhW)&^$)Y{>4WX-L%f*z3;;h@3ji1#f~~S-VTp3U0!?W z^qK2LUr%@!CKD^y@29%NH&2Fe_O1WR=Yg7_4b7eAx1Zol0#imyiN(+NFgw#*-~DRk zSfttBbnN-*0`#hwEOzr>x=}=Y$UUNCB+wRm=TYF*_TLT1N)KB2fUm7@2j6rKP4~P1 zc*xy=bAB8C)eFM4&45eM^C&k|#Tk zC2g~o^u-|A { authenticatedUser.firstName, authenticatedUser.patientID, authenticatedUser, - widget.browser); + widget.browser, + widget.patientShareResponse.isLiveCareAppointment, + widget.patientShareResponse.appointmentDate, + widget.patientShareResponse.appointmentNo, + widget.patientShareResponse.clinicID, + widget.patientShareResponse.doctorID); } } diff --git a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart index c4299e33..0d3ac2e5 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart @@ -166,7 +166,7 @@ class _ApointmentCardState extends State { ), Container( transform: - Matrix4.translationValues(15.0, -40.0, 0.0), + Matrix4.translationValues(15.0, -40.0, 0.0), child: projectViewModel.isArabic ? Image.asset( "assets/images/new-design/arrow_menu_black-ar.png", diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index d36bb250..383bedb3 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -93,243 +93,315 @@ class _ToDoState extends State { itemBuilder: (context, index) { return Container( margin: EdgeInsets.all(10.0), - child: Card( - margin: EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 8.0), - color: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), - ), - child: Container( - width: MediaQuery.of(context).size.width, - padding: EdgeInsets.all(10.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Row( - children: [ - Image.asset( - "assets/images/new-design/time_icon.png", - width: 20.0, - height: 20.0), - Container( - margin: - EdgeInsets.only(left: 10.0, right: 10.0), - child: Text( - DateUtil.getWeekDayMonthDayYearDateFormatted( - DateUtil.convertStringToDate( - widget.appoList[index] - .appointmentDate), - projectViewModel.isArabic - ? "ar" - : "en") + - " " + - widget.appoList[index].startTime - .substring(0, 5), - style: TextStyle(fontSize: 10.0)), - ), - !widget.appoList[index].isLiveCareAppointment - ? Image.asset( - "assets/images/new-design/hospital_address_icon.png", - width: 20.0, - height: 20.0) - : Container(), - Container( - margin: - EdgeInsets.only(left: 5.0, right: 5.0), - child: widget - .appoList[index].isLiveCareAppointment - ? Container() - : Text( - widget.appoList[index].projectName != - null - ? widget - .appoList[index].projectName - : "-", - overflow: TextOverflow.clip, - maxLines: 2, - style: TextStyle(fontSize: 10.0)), - ), - ], - ), - Container( - margin: EdgeInsets.only(top: 5.0), - child: Divider( - color: Colors.grey[500], - ), + child: Column( + children: [ + Container( + child: Card( + margin: EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 8.0), + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), ), - Flex( - direction: Axis.horizontal, - children: [ - Expanded( - flex: 1, - child: Container( - height: MediaQuery.of(context).size.height * - 0.1, + child: Container( + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.all(10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Row( + children: [ + Image.asset( + "assets/images/new-design/time_icon.png", + width: 20.0, + height: 20.0), + Container( + margin: EdgeInsets.only( + left: 10.0, right: 10.0), + child: Text( + DateUtil.getWeekDayMonthDayYearDateFormatted( + DateUtil.convertStringToDate( + widget.appoList[index] + .appointmentDate), + projectViewModel.isArabic + ? "ar" + : "en") + + " " + + widget.appoList[index].startTime + .substring(0, 5), + style: TextStyle(fontSize: 10.0)), + ), + !widget.appoList[index] + .isLiveCareAppointment + ? Image.asset( + "assets/images/new-design/hospital_address_icon.png", + width: 20.0, + height: 20.0) + : Container(), + Container( + margin: EdgeInsets.only( + left: 5.0, right: 5.0), + child: widget.appoList[index] + .isLiveCareAppointment + ? Container() + : Text( + widget.appoList[index] + .projectName != + null + ? widget.appoList[index] + .projectName + : "-", + overflow: TextOverflow.clip, + maxLines: 2, + style: + TextStyle(fontSize: 10.0)), + ), + ], + ), + Container( margin: EdgeInsets.only(top: 5.0), - child: ClipRRect( - borderRadius: - BorderRadius.circular(100.0), - child: Image.network( - widget.appoList[index].doctorImageURL, - fit: BoxFit.fill), + child: Divider( + color: Colors.grey[500], ), ), - ), - Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - top: 10.0, left: 20.0, right: 20.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text( - widget.appoList[index].doctorTitle + - " " + + Flex( + direction: Axis.horizontal, + children: [ + Expanded( + flex: 1, + child: Container( + height: MediaQuery.of(context) + .size + .height * + 0.1, + margin: EdgeInsets.only(top: 5.0), + child: ClipRRect( + borderRadius: + BorderRadius.circular(100.0), + child: Image.network( widget.appoList[index] - .doctorNameObj, - style: TextStyle( - fontSize: 14.0, - color: Colors.black, - fontWeight: FontWeight.bold, - letterSpacing: 1.0)), - Container( - margin: EdgeInsets.only( - top: 3.0, bottom: 3.0), - child: Text( - getDoctorSpeciality(widget - .appoList[index] - .doctorSpeciality) - .trim(), - style: TextStyle( - fontSize: 12.0, - color: Colors.grey[600], - letterSpacing: 1.0)), + .doctorImageURL, + fit: BoxFit.fill), + ), ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - RatingBar.readOnly( - initialRating: widget - .appoList[index] - .actualDoctorRate - .toDouble(), - size: 20.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ], + ), + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 10.0, + left: 20.0, + right: 20.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + widget.appoList[index] + .doctorTitle + + " " + + widget.appoList[index] + .doctorNameObj, + style: TextStyle( + fontSize: 14.0, + color: Colors.black, + fontWeight: + FontWeight.bold, + letterSpacing: 1.0)), + Container( + margin: EdgeInsets.only( + top: 3.0, bottom: 3.0), + child: Text( + getDoctorSpeciality(widget + .appoList[index] + .doctorSpeciality) + .trim(), + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar.readOnly( + initialRating: widget + .appoList[index] + .actualDoctorRate + .toDouble(), + size: 20.0, + filledColor: + Colors.yellow[700], + emptyColor: + Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: + Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ], + ), + Container( + child: CountdownTimer( + controller: new CountdownTimerController( + endTime: DateTime.now() + .millisecondsSinceEpoch + + (widget + .appoList[ + index] + .remaniningHoursTocanPay * + 1000) * + 60), + widgetBuilder: (_, + CurrentRemainingTime + time) { + return time != null + ? Text( + '${time.days != null ? time.days : "0"}:${time.hours.toString().length == 1 ? "0" + time.hours.toString() : time.hours}:${time.min}:${time.sec} ' + + TranslationBase.of( + context) + .upcomingTimeLeft, + style: TextStyle( + fontSize: 12.0, + color: Color( + 0xff40ACC9))) + : Container(); + }, + ), + ), + ], + ), ), - Container( - child: CountdownTimer( - controller: new CountdownTimerController( - endTime: DateTime.now() - .millisecondsSinceEpoch + - (widget.appoList[index] - .remaniningHoursTocanPay * - 1000) * - 60), - widgetBuilder: - (_, CurrentRemainingTime time) { - return time != null - ? Text( - '${time.days != null ? time.days : "0"}:${time.hours.toString().length == 1 ? "0" + time.hours.toString() : time.hours}:${time.min}:${time.sec} ' + - TranslationBase.of( - context) - .upcomingTimeLeft, + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () => performNextAction( + widget.appoList[index]), + child: Container( + margin: EdgeInsets.only(top: 20.0), + child: Column( + children: [ + Image.asset( + getNextActionImage(widget + .appoList[index] + .nextAction), + width: 50.0, + height: 50.0), + Container( + margin: + EdgeInsets.only(top: 5.0), + child: Text( + getNextActionText(widget + .appoList[index] + .nextAction), + textAlign: + TextAlign.center, style: TextStyle( - fontSize: 12.0, - color: Color( - 0xff40ACC9))) - : Container(); - }, + fontSize: 12.0)), + ) + ], + ), ), ), - ], - ), + ) + ], + ), + Divider( + color: Colors.grey[500], ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => performNextAction( - widget.appoList[index]), - child: Container( - margin: EdgeInsets.only(top: 20.0), - child: Column( - children: [ - Image.asset( - getNextActionImage(widget + Flex( + direction: Axis.horizontal, + children: [ + Expanded( + flex: 2, + child: Container( + child: Text( + getNextActionDescription(widget .appoList[index].nextAction), - width: 50.0, - height: 50.0), - Container( - margin: EdgeInsets.only(top: 5.0), - child: Text( - getNextActionText(widget - .appoList[index] - .nextAction), - textAlign: TextAlign.center, - style: - TextStyle(fontSize: 12.0)), - ) - ], + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[700])), + ), ), - ), + Expanded( + flex: 1, + child: GestureDetector( + onTap: () { + navigateToAppointmentDetails( + context, + widget.appoList[index]); + }, + child: Container( + child: Text( + TranslationBase.of(context) + .upcomingDetails, + textAlign: TextAlign.end, + style: TextStyle( + fontSize: 12.0, + color: + new Color(0xFF40ACC9), + decoration: TextDecoration + .underline)), + ), + ), + ) + ], ), - ) - ], - ), - Divider( - color: Colors.grey[500], + ], + ), ), - Flex( - direction: Axis.horizontal, - children: [ - Expanded( - flex: 2, - child: Container( - child: Text( - getNextActionDescription( - widget.appoList[index].nextAction), - style: TextStyle( - fontSize: 12.0, - color: Colors.grey[700])), - ), - ), - Expanded( - flex: 1, - child: GestureDetector( - onTap: () { - navigateToAppointmentDetails( - context, widget.appoList[index]); - }, - child: Container( - child: Text( - TranslationBase.of(context) - .upcomingDetails, - textAlign: TextAlign.end, - style: TextStyle( - fontSize: 12.0, - color: new Color(0xFF40ACC9), - decoration: - TextDecoration.underline)), + ), + ), + Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(10.0), + bottomRight: Radius.circular(10.0)), + color: Color(0xff20bc44), + ), + height: 30.0, + margin: projectViewModel.isArabic ? EdgeInsets.fromLTRB(160.0, 0.0, 30.0, 0.0) : EdgeInsets.fromLTRB(30.0, 0.0, 160.0, 0.0), + transform: Matrix4.translationValues(0.0, -8.0, 0.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + widget.appoList[index].isLiveCareAppointment + ? Container( + margin: EdgeInsets.fromLTRB( + 5.0, 0.0, 5.0, 0.0), + child: Image.asset( + "assets/images/new-design/video.png"), + ) + : Container( + margin: EdgeInsets.fromLTRB( + 5.0, 0.0, 5.0, 0.0), + child: Image.asset( + "assets/images/new-design/walkin.png"), ), - ), - ) - ], - ), - ], + widget.appoList[index].isLiveCareAppointment + ? Container( + child: Text(TranslationBase.of(context).videoAppo, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 12.0)), + ) + : Container( + child: Text(TranslationBase.of(context).walkinAppo, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 12.0)), + ) + ], + ), ), - ), + ], ), ); }, @@ -688,7 +760,12 @@ class _ToDoState extends State { authenticatedUser.firstName, authenticatedUser.patientID, authenticatedUser, - widget.browser); + widget.browser, + appo.isLiveCareAppointment, + appo.appointmentDate, + appo.appointmentNo, + appo.clinicID, + appo.doctorID); } onBrowserLoadStart(String url) { diff --git a/lib/pages/ToDoList/widgets/upcomingCard.dart b/lib/pages/ToDoList/widgets/upcomingCard.dart index 04930e59..3fefe616 100644 --- a/lib/pages/ToDoList/widgets/upcomingCard.dart +++ b/lib/pages/ToDoList/widgets/upcomingCard.dart @@ -197,7 +197,7 @@ class _TodoListCardState extends State { ), ) ], - ) + ), ], ), ), diff --git a/lib/pages/livecare/widgets/clinic_list.dart b/lib/pages/livecare/widgets/clinic_list.dart index fc27d92b..195d8879 100644 --- a/lib/pages/livecare/widgets/clinic_list.dart +++ b/lib/pages/livecare/widgets/clinic_list.dart @@ -283,7 +283,8 @@ class _clinic_listState extends State { authenticatedUser.firstName, authenticatedUser.patientID, authenticatedUser, - browser); + browser, + false); } onBrowserLoadStart(String url) { diff --git a/lib/pages/medical/balance/confirm_payment_page.dart b/lib/pages/medical/balance/confirm_payment_page.dart index 8a69bf5d..eecb6abd 100644 --- a/lib/pages/medical/balance/confirm_payment_page.dart +++ b/lib/pages/medical/balance/confirm_payment_page.dart @@ -225,7 +225,8 @@ class ConfirmPaymentPage extends StatelessWidget { advanceModel.patientName, advanceModel.fileNumber, authenticatedUser, - browser); + browser, + false); } onBrowserLoadStart(String url) { diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 8dff17c4..741ba44b 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1283,6 +1283,9 @@ class TranslationBase { String get bloodDEnterDesc => localizedValues["bloodD-enter-desc"][locale.languageCode]; String get viewTermsConditions => localizedValues["viewTermsConditions"][locale.languageCode]; + String get walkinAppo => localizedValues["WalkinAppo"][locale.languageCode]; + String get videoAppo => localizedValues["videoAppo"][locale.languageCode]; + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/in_app_browser/InAppBrowser.dart b/lib/widgets/in_app_browser/InAppBrowser.dart index 001bcdfa..ba7dfd8b 100644 --- a/lib/widgets/in_app_browser/InAppBrowser.dart +++ b/lib/widgets/in_app_browser/InAppBrowser.dart @@ -117,7 +117,12 @@ class MyInAppBrowser extends InAppBrowser { String patientName, dynamic patientID, AuthenticatedUser authenticatedUser, - InAppBrowser browser) { + InAppBrowser browser, + bool isLiveCareAppo, + [var appoDate, + var appoNo, + var clinicID, + var doctorID]) { this.browser = browser; getPatientData(); generateURL( @@ -130,7 +135,12 @@ class MyInAppBrowser extends InAppBrowser { patientType, patientName, patientID, - authenticatedUser) + authenticatedUser, + isLiveCareAppo, + appoDate, + appoNo, + clinicID, + doctorID) .then((value) { this.browser.openUrl(url: value); }); @@ -152,19 +162,19 @@ class MyInAppBrowser extends InAppBrowser { String patientName, dynamic patientID, AuthenticatedUser authUser, - [var patientData, + bool isLiveCareAppo, + [var appoDate, + var appoNo, + var clinicID, + var doctorID, + var patientData, var servID, var LiveServID]) async { - // getPatientData(); getDeviceToken(); String currentLanguageID = getLanguageID() == 'ar' ? 'AR' : 'EN'; - String form = getForm(); + String form = isLiveCareAppo ? getLiveCareForm() : getForm(); - // if (authUser != null) { - // form = form.replaceFirst("EMAIL_VALUE", authUser.emailAddress); - // } else { form = form.replaceFirst("EMAIL_VALUE", emailId); - // } form = form.replaceFirst('AMOUNT_VALUE', amount.toString()); form = form.replaceFirst('ORDER_DESCRIPTION_VALUE', orderDesc); @@ -197,17 +207,16 @@ class MyInAppBrowser extends InAppBrowser { form = form.replaceFirst('LIVE_SERVICE_ID', "2"); } - // if (patientData == null) { form = form.replaceFirst('CUSTNAME_VALUE', patientName); form = form.replaceFirst('CUSTID_VALUE', patientID.toString()); - // } else { - // form = form.replaceFirst('CUSTNAME_VALUE', patientData.depositorName); - // form = form.replaceFirst('CUSTID_VALUE', patientData.fileNumber); - // } - // form = form.replaceFirst('LATITUDE_VALUE', "24.708488"); - // form = form.replaceFirst('LONGITUDE_VALUE', "46.665925"); - // form = form.replaceFirst('DEVICE_TOKEN', DEVICE_TOKEN); + if (isLiveCareAppo) { + form = form.replaceFirst('IS_SCHEDULE_VALUE', "true"); + form = form.replaceFirst('APPOINTMENT_DATE_VALUE', appoDate); + form = form.replaceFirst('APPOINTMENT_NO_VALUE', appoNo.toString()); + form = form.replaceFirst('DOCTOR_ID_VALUE', doctorID.toString()); + form = form.replaceFirst('CLINIC_ID_VALUE', clinicID.toString()); + } var bytes = utf8.encode(form); var base64Str = base64.encode(bytes); @@ -247,6 +256,42 @@ class MyInAppBrowser extends InAppBrowser { '' + ''; } + + String getLiveCareForm() { + return ' ' + + '' + + '' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
' + + '' + + '' + + ''; + } } class MyChromeSafariBrowser extends ChromeSafariBrowser { From 484cca086e00f66f8067ae3dfb610d030637efa2 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 25 Jan 2021 16:12:57 +0200 Subject: [PATCH 7/8] fix my my Trackers --- lib/config/config.dart | 4 + lib/config/localized_values.dart | 8 + .../service/medical/BloodPressureService.dart | 52 +++ .../medical/WeightPressureService.dart | 13 + .../medical/blood_pressure_view_model.dart | 180 ++++----- .../medical/weight_pressure_view_model.dart | 11 + .../my_trackers/Weight/AddWeightPage.dart | 4 +- .../my_trackers/Weight/WeightHomePage.dart | 30 ++ .../my_trackers/Weight/WeightMonthlyPage.dart | 2 +- .../my_trackers/Weight/WeightWeeklyPage.dart | 2 +- .../my_trackers/Weight/WeightYeaPage.dart | 2 +- .../blood_pressure/AddBloodPressurePage.dart | 356 +++++++++++------- .../blood_pressure/BloodPressureHomePage.dart | 113 ++---- .../blood_pressure/BloodPressureMonthly.dart | 109 +++--- .../blood_pressure/BloodPressureYeaPage.dart | 72 ++-- .../bloodPressureWeeklyPage.dart | 97 +++-- .../blood_suger/AddBloodSugarPage.dart | 4 +- .../my_trackers/blood_suger/BloodMonthly.dart | 2 +- .../my_trackers/blood_suger/BloodYeaPage.dart | 93 +++-- .../blood_suger/blood_sugar_weekly_page.dart | 2 +- .../widget/CurvedChartBloodPressure.dart | 273 ++++++++++++++ .../widget/MonthCurvedChartBloodPressure.dart | 252 +++++++++++++ .../LineChartCurvedBloodPressure.dart | 4 +- lib/uitl/translations_delegate_base.dart | 2 + 24 files changed, 1204 insertions(+), 483 deletions(-) create mode 100644 lib/pages/medical/my_trackers/widget/CurvedChartBloodPressure.dart create mode 100644 lib/pages/medical/my_trackers/widget/MonthCurvedChartBloodPressure.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index f25d3272..a6acecd6 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -290,10 +290,14 @@ const GET_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_GetDiabtecResults const ADD_DIABTEC_RESULT = 'Services/Patients.svc/REST/Patient_AddDiabtecResult'; const SEND_AVERAGE_BLOOD_SUGAR_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodSugarReport'; const DEACTIVATE_DIABETIC_STATUS = 'services/Patients.svc/REST/Patient_DeactivateDiabeticStatus'; +const DEACTIVATE_BLOOD_PRESSURES_STATUS = 'services/Patients.svc/REST/Patient_DeactivateBloodPressureStatus'; const GET_BLOOD_PRESSURE_RESULT_AVERAGE = 'Services/Patients.svc/REST/Patient_GetBloodPressureResultAverage'; const GET_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_GetBloodPressureResult'; const ADD_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_AddBloodPressureResult'; +const UPDATE_BLOOD_PRESSURE_RESULT = 'Services/Patients.svc/REST/Patient_UpdateBloodPressureResult'; +const SEND_AVERAGE_BLOOD_WEIGHT_REPORT = 'Services/Notifications.svc/REST/SendAverageBodyWeightReport'; +const SEND_AVERAGE_BLOOD_PRESSURE_REPORT = 'Services/Notifications.svc/REST/SendAverageBloodPressureReport'; const UPDATE_DIABETIC_RESULT = 'Services/Patients.svc/REST/Patient_UpdateDiabeticResult'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index a184006c..533dd7e8 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1572,4 +1572,12 @@ const Map localizedValues = { "en": "Enter Weight Value", "ar": "أدخل الوزن " }, + "systolic-add": { + "en": "Enter Systolic Value", + "ar": "أدخل قيمة الإنقباض " + }, + "diastolic-add": { + "en": "Enter Diastolic Value", + "ar": "أدخل قيمة الإنبساط " + }, }; diff --git a/lib/core/service/medical/BloodPressureService.dart b/lib/core/service/medical/BloodPressureService.dart index f2681191..82130750 100644 --- a/lib/core/service/medical/BloodPressureService.dart +++ b/lib/core/service/medical/BloodPressureService.dart @@ -68,6 +68,19 @@ class BloodPressureService extends BaseService { super.error = error; }, body: Map()); } + Future sendReportByEmail() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['to'] = user.emailAddress; + await baseAppClient.post(SEND_AVERAGE_BLOOD_PRESSURE_REPORT, + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } addDiabtecResult( {String bloodPressureDate, @@ -93,4 +106,43 @@ class BloodPressureService extends BaseService { super.error = error; }, body: body); } + + updateDiabtecResult( + {String bloodPressureDate, + String diastolicPressure, + String systolicePressure, + int measuredArm}) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['BloodPressureDate'] = bloodPressureDate; + body['DiastolicPressure'] = diastolicPressure; + body['SystolicePressure'] = systolicePressure; + body['MeasuredArm'] ='$measuredArm'; + body['isDentalAllowedBackend'] = false; + + await baseAppClient.post(UPDATE_BLOOD_PRESSURE_RESULT, + onSuccess: (response, statusCode) async { + + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future deactivateDiabeticStatus({int lineItemNo }) async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['LineItemNo'] =lineItemNo; + await baseAppClient.post(DEACTIVATE_BLOOD_PRESSURES_STATUS, + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } } diff --git a/lib/core/service/medical/WeightPressureService.dart b/lib/core/service/medical/WeightPressureService.dart index 3c38e5d2..b48c4795 100644 --- a/lib/core/service/medical/WeightPressureService.dart +++ b/lib/core/service/medical/WeightPressureService.dart @@ -110,6 +110,19 @@ class WeightService extends BaseService { super.error = error; }, body: body); } + Future sendReportByEmail() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['to'] = user.emailAddress; + await baseAppClient.post(SEND_AVERAGE_BLOOD_WEIGHT_REPORT, + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } deleteWeightResult({int lineItemNo, }) async { hasError = false; diff --git a/lib/core/viewModels/medical/blood_pressure_view_model.dart b/lib/core/viewModels/medical/blood_pressure_view_model.dart index dfff5b45..ae3abbcb 100644 --- a/lib/core/viewModels/medical/blood_pressure_view_model.dart +++ b/lib/core/viewModels/medical/blood_pressure_view_model.dart @@ -1,33 +1,31 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPressureResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/YearMonthlyChartDate.dart'; import 'package:diplomaticquarterapp/core/service/medical/BloodPressureService.dart'; -import 'package:diplomaticquarterapp/core/service/medical/BloodSugarService.dart'; import 'package:diplomaticquarterapp/locator.dart'; -import 'package:charts_flutter/flutter.dart' as charts; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; import '../../../core/viewModels/base_view_model.dart'; class BloodPressureViewMode extends BaseViewModel { BloodPressureService bloodPressureService = locator(); - ///BLOOD - List _bloodDiastolicPressureWeeklyTimeSeriesSalesList = List(); - List _bloodSystolicePressureWeeklyTimeSeriesSalesList = List(); + List get monthDiabtecPatientResult => + bloodPressureService.monthDiabtecPatientResult; - List _bloodDiastolicMonthlyTimeSeriesSalesList = List(); - List _bloodSystolicMonthlyTimeSeriesSalesList = List(); + List get weekDiabtecPatientResult => + bloodPressureService.weekDiabtecPatientResult; - List _bloodSystoliceYearTimeSeriesSalesList = List(); - List _bloodDiastolicYearTimeSeriesSalesList = List(); + List get yearDiabtecPatientResult => + bloodPressureService.yearDiabtecPatientResult; - List get monthDiabtecPatientResult => bloodPressureService.monthDiabtecPatientResult; + List weightWeekTimeSeriesDataTop = []; + List weightWeekTimeSeriesDataLow = []; - List get weekDiabtecPatientResult => bloodPressureService.weekDiabtecPatientResult; + List weighMonthTimeSeriesDataTop = []; + List weighMonthTimeSeriesDataLow = []; - List get yearDiabtecPatientResult => bloodPressureService.yearDiabtecPatientResult; + List weightYearTimeSeriesDataTop = []; + List weightYearTimeSeriesDataLow = []; Future getBloodPressure() async { setState(ViewState.Busy); @@ -35,114 +33,94 @@ class BloodPressureViewMode extends BaseViewModel { await bloodPressureService.getDiabtecResults(); if (bloodPressureService.hasError) { error = bloodPressureService.error; - setState(ViewState.Error); + setState(ViewState.ErrorLocal); } else { + clearDate(); bloodPressureService.weekDiabtectResultAverageList.forEach((element) { - _bloodDiastolicPressureWeeklyTimeSeriesSalesList.add(WeekChartDate( - x: element.bloodPressureDate, - y: element.dailyDiastolicPressureAverageResult)); - _bloodSystolicePressureWeeklyTimeSeriesSalesList.add(WeekChartDate( - x: element.bloodPressureDate, - y: element.dailySystolicePressureAverageResult)); - }); + weightWeekTimeSeriesDataTop.add(TimeSeriesSales2( + element.bloodPressureDate, + element.dailyDiastolicPressureAverageResult.toDouble())); + weightWeekTimeSeriesDataLow.add(TimeSeriesSales2( + element.bloodPressureDate, + element.dailySystolicePressureAverageResult.toDouble())); - for (int index = 0; - index < bloodPressureService.monthDiabtectResultAverageList.length; - index++) { - _bloodDiastolicMonthlyTimeSeriesSalesList.add(YearMonthlyChartDate( - x: index, - y: bloodPressureService.monthDiabtectResultAverageList[index] - .weekDiastolicPressureAverageResult)); - _bloodSystolicMonthlyTimeSeriesSalesList.add(YearMonthlyChartDate( - x: index, - y: bloodPressureService.monthDiabtectResultAverageList[index] - .weekSystolicePressureAverageResult)); - } - - bloodPressureService.yearDiabtecResultAverageList.forEach((element) { - _bloodSystoliceYearTimeSeriesSalesList - .add(WeekChartDate(x: element.date, y: element.monthSystolicePressureAverageResult)); - - _bloodDiastolicYearTimeSeriesSalesList - .add(WeekChartDate(x: element.date, y: element.monthDiastolicPressureAverageResult)); - }); + for (int index = 0; index < bloodPressureService.monthDiabtectResultAverageList.length; index++) { + + weighMonthTimeSeriesDataTop.add(TimeSeriesSales3(index, bloodPressureService.monthDiabtectResultAverageList[index].weekDiastolicPressureAverageResult.toDouble())); + + weighMonthTimeSeriesDataLow.add(TimeSeriesSales3(index, bloodPressureService.monthDiabtectResultAverageList[index].weekSystolicePressureAverageResult.toDouble())); + } + bloodPressureService.yearDiabtecResultAverageList.forEach((element) { + weightYearTimeSeriesDataTop.add(TimeSeriesSales2(element.date, + element.monthSystolicePressureAverageResult.toDouble())); + + weightYearTimeSeriesDataLow.add(TimeSeriesSales2(element.date, + element.monthDiastolicPressureAverageResult.toDouble())); + }); + + }); setState(ViewState.Idle); } } - List> getBloodWeeklySeries() { - return [ - charts.Series( - id: 'Diastolic', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _bloodDiastolicPressureWeeklyTimeSeriesSalesList, - ), - charts.Series( - id: 'Systolice', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _bloodSystolicePressureWeeklyTimeSeriesSalesList, - ) - ]; - } - List> - getBloodMonthlyTimeSeriesSales() { - return [ - charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (YearMonthlyChartDate sales, _) => sales.x, - measureFn: (YearMonthlyChartDate sales, _) => sales.y, - data: _bloodDiastolicMonthlyTimeSeriesSalesList, - ), - charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (YearMonthlyChartDate sales, _) => sales.x, - measureFn: (YearMonthlyChartDate sales, _) => sales.y, - data: _bloodSystolicMonthlyTimeSeriesSalesList, - ), - ]; + void clearDate(){ + weightWeekTimeSeriesDataTop.clear(); + weightWeekTimeSeriesDataLow.clear(); + weighMonthTimeSeriesDataTop.clear(); + weighMonthTimeSeriesDataLow.clear(); + weightYearTimeSeriesDataTop.clear(); + weightYearTimeSeriesDataLow.clear(); } - List> getBloodYearTimeSeriesSales() { - return [ - charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _bloodSystoliceYearTimeSeriesSalesList, - ), - charts.Series( - id: 'Sales', - colorFn: (_, __) => charts.MaterialPalette.blue.shadeDefault, - domainFn: (WeekChartDate sales, _) => sales.x, - measureFn: (WeekChartDate sales, _) => sales.y, - data: _bloodDiastolicYearTimeSeriesSalesList, - ) - ]; + Future sendReportByEmail() async { + setState(ViewState.BusyLocal); + + await bloodPressureService.sendReportByEmail(); + if (bloodPressureService.hasError) { + error = bloodPressureService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } } - addDiabtecResult( + Future addORUpdateDiabtecResult( {String bloodPressureDate, - String diastolicPressure, - String systolicePressure, - int measuredArm}) async { + String diastolicPressure, + String systolicePressure, + int measuredArm,bool isUpdate = false}) async { setState(ViewState.BusyLocal); + if(!isUpdate) await bloodPressureService.addDiabtecResult( bloodPressureDate: bloodPressureDate, diastolicPressure: diastolicPressure, systolicePressure: systolicePressure, measuredArm: measuredArm); + else + await bloodPressureService.updateDiabtecResult( + bloodPressureDate: bloodPressureDate, + diastolicPressure: diastolicPressure, + systolicePressure: systolicePressure, + measuredArm: measuredArm); + if (bloodPressureService.hasError) { + error = bloodPressureService.error; + setState(ViewState.ErrorLocal); + } else { + await getBloodPressure(); + setState(ViewState.Idle); + } + } + + + Future deactivateDiabeticStatus({int lineItemNo}) async { + setState(ViewState.BusyLocal); + + await bloodPressureService.deactivateDiabeticStatus(lineItemNo: lineItemNo); if (bloodPressureService.hasError) { error = bloodPressureService.error; - setState(ViewState.Error); + setState(ViewState.ErrorLocal); } else { await getBloodPressure(); setState(ViewState.Idle); diff --git a/lib/core/viewModels/medical/weight_pressure_view_model.dart b/lib/core/viewModels/medical/weight_pressure_view_model.dart index 24ddae18..42db0a58 100644 --- a/lib/core/viewModels/medical/weight_pressure_view_model.dart +++ b/lib/core/viewModels/medical/weight_pressure_view_model.dart @@ -82,6 +82,17 @@ class WeightPressureViewModel extends BaseViewModel { setState(ViewState.Idle); } } + Future sendReportByEmail() async { + setState(ViewState.BusyLocal); + + await weightService.sendReportByEmail(); + if (weightService.hasError) { + error = weightService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } updateWeightResult({int lineItemNo, int weightUnit, String weightMeasured,String weightDate}) async { setState(ViewState.BusyLocal); diff --git a/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart b/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart index aa087081..71799084 100644 --- a/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart +++ b/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart @@ -76,7 +76,7 @@ class _AddWeightPageState extends State { appBarTitle: widget.isUpdate ? TranslationBase.of(context).update : TranslationBase.of(context).add, - appBarIcons: [ + appBarIcons:widget.isUpdate? [ IconButton( icon: Icon(Icons.delete), color: Colors.white, @@ -109,7 +109,7 @@ class _AddWeightPageState extends State { dialog.showAlertDialog(context); }, ) - ], + ]:null, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( diff --git a/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart b/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart index cbe5de17..c90b29a7 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart @@ -1,7 +1,11 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/TabBarWidget.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; @@ -39,6 +43,32 @@ class _WeightHomePageState extends State builder: (_, model, w) => AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).weight, + appBarIcons: [IconButton( + icon: Icon(Icons.email), + color: Colors.white, + onPressed: () { + showDialog( + context: context, + child: ConfirmSendEmailDialog( + email: model.user.emailAddress, + onTapSendEmail: () async{ + GifLoaderDialogUtils.showMyDialog(context); + model.sendReportByEmail().then((value) { + GifLoaderDialogUtils.hideDialog(context); + if(model.state == ViewState.ErrorLocal){ + AppToast.showErrorToast(message: model.error); + }else{ + AppToast.showSuccessToast(message:TranslationBase.of(context).emailSentSuccessfully, ); + } + }).catchError((e){ + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: model.error); + }); + }, + ), + ); + }, + ),], baseViewModel: model, body: Scaffold( extendBodyBehindAppBar: true, diff --git a/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart b/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart index 56748ea0..6f64bacb 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart @@ -28,7 +28,7 @@ class WeightMonthlyPage extends StatelessWidget { Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body: model.weighMonthTimeSeriesData.isEmpty?Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),):ListView( children: [ Container( width: double.maxFinite, diff --git a/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart b/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart index 9c8a50a5..866c2b5b 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart @@ -26,7 +26,7 @@ class WeightWeeklyPage extends StatelessWidget { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body: model.weightWeekTimeSeriesData.isEmpty?Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),):ListView( children: [ Container( margin: EdgeInsets.only(top: 12, left: 8, right: 8), diff --git a/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart b/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart index c5a1a3b3..7fa03819 100644 --- a/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart +++ b/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart @@ -26,7 +26,7 @@ class WeightYearPage extends StatelessWidget { Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body: model.weightYearTimeSeriesData.isEmpty ? Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),) : ListView( children: [ Container( width: double.maxFinite, diff --git a/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart b/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart index b8d9a557..678ef7dc 100644 --- a/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart +++ b/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart @@ -1,21 +1,41 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/blood_pressure_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/RadioStringDialog.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; -import 'package:feather_icons_flutter/feather_icons_flutter.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:provider/provider.dart'; class AddBloodPressurePage extends StatefulWidget { + final DateTime bloodSugarDate; + final String measureTimeSelectedType; + final bool isUpdate; + final int lineItemNo; + final String bloodSystolicValue; + final String bloodDiastolicValue; + final BloodPressureViewMode model; + + const AddBloodPressurePage( + {Key key, + this.bloodSugarDate, + this.measureTimeSelectedType, + this.isUpdate=false, + this.lineItemNo, + this.model, + this.bloodSystolicValue, + this.bloodDiastolicValue}) + : super(key: key); + @override _AddBloodPressurePageState createState() => _AddBloodPressurePageState(); } @@ -28,8 +48,8 @@ class _AddBloodPressurePageState extends State { DateTime timeSugarDate = DateTime.now(); int measuredArm = 1; final List measureTimeEnList = [ - 'Left Arm', - 'Right Arm', + 'Left', + 'Right', ]; final List measureTimeArList = [ 'الذراع الأيسر', @@ -37,152 +57,220 @@ class _AddBloodPressurePageState extends State { ]; String measureTimeSelectedType = 'Left Arm'; + @override + void initState() { + super.initState(); + if (widget.isUpdate) { + bloodSugarDate = widget.bloodSugarDate; + bloodSugarDate = widget.bloodSugarDate; + measureTimeSelectedType = widget.measureTimeSelectedType; + if (measureTimeEnList.contains(widget.measureTimeSelectedType)) + measuredArm = measureTimeEnList.indexOf(widget.measureTimeSelectedType); + else if (measureTimeArList.contains(widget.measureTimeSelectedType)) + measuredArm = measureTimeArList.indexOf(widget.measureTimeSelectedType); + _bloodSystolicValueController.text = widget.bloodSystolicValue; + _bloodDiastolicValueController.text = widget.bloodDiastolicValue; + } + } @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - return BaseView( - builder: (_, model, w) => AppScaffold( - isShowAppBar: true, - appBarTitle: 'Add', - body: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Container( - margin: EdgeInsets.all(15), - child: Column( - children: [ - SizedBox( - height: 15, - ), - NewTextFields( - hintText: 'Enter Systolic Value', - controller: _bloodSystolicValueController, - keyboardType: TextInputType.number, - ), - SizedBox( - height: 8, - ), - NewTextFields( - hintText: 'Blood Diastolic Value', - controller: _bloodDiastolicValueController, - keyboardType: TextInputType.number, - ), - SizedBox( - height: 8, - ), - InkWell( - onTap: () { - confirmSelectMeasureTimeDialog(projectViewModel.isArabic - ? measureTimeEnList - : measureTimeArList); - }, - child: Container( - padding: EdgeInsets.all(12), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts(measureTimeSelectedType), - Icon( - Icons.arrow_drop_down, - color: Colors.grey, - ) - ], - ), + return AppScaffold( + isShowAppBar: true, + appBarTitle: widget.isUpdate + ? TranslationBase.of(context).update + : TranslationBase.of(context).add, + appBarIcons: widget.isUpdate?[ + IconButton( + icon: Icon(Icons.delete), + color: Colors.white, + onPressed: () { + ConfirmDialog dialog = new ConfirmDialog( + context: context, + confirmMessage: 'Remove this measure', + okText: TranslationBase.of(context).ok, + cancelText: TranslationBase.of(context).cancel, + okFunction: () async { + ConfirmDialog.closeAlertDialog(context); + + GifLoaderDialogUtils.showMyDialog(context); + widget.model + .deactivateDiabeticStatus(lineItemNo: widget.lineItemNo) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (widget.model.state == ViewState.ErrorLocal) + AppToast.showErrorToast(message: widget.model.error); + else + Navigator.pop(context); + }).catchError((e) { + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: widget.model.error); + }); + }, + cancelFunction: () => {}); + dialog.showAlertDialog(context); + }, + ) + ]:null, + body: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Container( + margin: EdgeInsets.all(15), + child: Column( + children: [ + SizedBox( + height: 15, + ), + NewTextFields( + hintText: TranslationBase.of(context).systolicAdd, + controller: _bloodSystolicValueController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: 8, + ), + NewTextFields( + hintText: TranslationBase.of(context).diastolicAdd, + controller: _bloodDiastolicValueController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + confirmSelectMeasureTimeDialog(projectViewModel.isArabic + ? measureTimeEnList + : measureTimeArList); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(measureTimeSelectedType), + Icon( + Icons.arrow_drop_down, + color: Colors.grey, + ) + ], ), ), - SizedBox( - height: 8, - ), - InkWell( - onTap: () { - DatePicker.showDatePicker(context, - showTitleActions: true, - minTime: DateTime(DateTime.now().year - 1, 1, 1), - maxTime: DateTime.now(), onConfirm: (date) { - print('confirm $date'); - setState(() { + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showDatePicker(context, + showTitleActions: true, + minTime: DateTime(DateTime.now().year - 1, 1, 1), + maxTime: DateTime.now(), onConfirm: (date) { + setState( + () { bloodSugarDate = date; - }); - }, - currentTime: bloodSugarDate, - locale: projectViewModel.localeType); + }, + ); }, - child: Container( - padding: EdgeInsets.all(12), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts('Date'), - Texts(getDate()), - ], - ), + currentTime: bloodSugarDate, + locale: projectViewModel.localeType); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(TranslationBase.of(context).date), + Texts(getDate()), + ], ), ), - SizedBox( - height: 8, - ), - InkWell( - onTap: () { - DatePicker.showTimePicker(context, showTitleActions: true, - onConfirm: (date) { - print('confirm $date'); - setState(() { + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker(context, showTitleActions: true, + onConfirm: (date) { + setState( + () { timeSugarDate = date; - }); - }, - currentTime: timeSugarDate, - locale: projectViewModel.localeType); + }, + ); }, - child: Container( - padding: EdgeInsets.all(12), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), - color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [Texts('Time'), Texts(getTime())], - ), + currentTime: timeSugarDate, + locale: projectViewModel.localeType); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(TranslationBase.of(context).time), + Texts(getTime()) + ], ), ), - ], - ), + ), + ], ), ), - bottomSheet: Container( - color: Colors.transparent, - width: double.infinity, - height: MediaQuery.of(context).size.width * 0.2, - child: Padding( - padding: const EdgeInsets.all(15.0), - child: SecondaryButton( - loading: model.state == ViewState.BusyLocal, - label: 'SAVE', - textColor: Colors.white, - onTap: () { - if (_bloodSystolicValueController.text.isNotEmpty && - _bloodDiastolicValueController.text.isNotEmpty) { - model.addDiabtecResult( - bloodPressureDate: '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00', - diastolicPressure: _bloodDiastolicValueController.text.toString(), - systolicePressure: _bloodSystolicValueController.text.toString(), - measuredArm: measuredArm, - ); - } - }), - ), + ), + bottomSheet: Container( + color: Colors.transparent, + width: double.infinity, + height: MediaQuery.of(context).size.width * 0.2, + child: Padding( + padding: const EdgeInsets.all(15.0), + child: SecondaryButton( + loading: widget.model.state == ViewState.BusyLocal, + label: TranslationBase.of(context).save.toUpperCase(), + textColor: Colors.white, + onTap: () async { + if (_bloodSystolicValueController.text.isNotEmpty && + _bloodDiastolicValueController.text.isNotEmpty) { + GifLoaderDialogUtils.showMyDialog(context); + + widget.model.addORUpdateDiabtecResult( + isUpdate: widget.isUpdate, + bloodPressureDate: + '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00', + diastolicPressure: + _bloodDiastolicValueController.text.toString(), + systolicePressure: + _bloodSystolicValueController.text.toString(), + measuredArm: measuredArm, + ).then((value) { + GifLoaderDialogUtils.hideDialog(context); + if(widget.model.state == ViewState.BusyLocal) + AppToast.showErrorToast(message: widget.model.error); + else + Navigator.pop(context); +; + }).catchError((e){ + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: widget.model.error); + }); + } + }), ), ), ); diff --git a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart index de8bb509..723871cb 100644 --- a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart +++ b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart @@ -1,15 +1,15 @@ -import 'dart:ui'; - +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/blood_pressure_view_model.dart'; -import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; -import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/TabBarWidget.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:hexcolor/hexcolor.dart'; - import 'AddBloodPressurePage.dart'; import 'BloodPressureMonthly.dart'; import 'BloodPressureYeaPage.dart'; @@ -42,69 +42,37 @@ class _BloodPressureHomePageState extends State onModelReady: (model) => model.getBloodPressure(), builder: (_, model, w) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Blood Pressure', + appBarTitle: TranslationBase.of(context).bloodPressure, baseViewModel: model, + appBarIcons: [IconButton( + icon: Icon(Icons.email), + color: Colors.white, + onPressed: () { + showDialog( + context: context, + child: ConfirmSendEmailDialog( + email: model.user.emailAddress, + onTapSendEmail: () async{ + GifLoaderDialogUtils.showMyDialog(context); + model.sendReportByEmail().then((value) { + GifLoaderDialogUtils.hideDialog(context); + if(model.state == ViewState.ErrorLocal){ + AppToast.showErrorToast(message: model.error); + }else{ + AppToast.showSuccessToast(message:TranslationBase.of(context).emailSentSuccessfully, ); + } + }).catchError((e){ + GifLoaderDialogUtils.hideDialog(context); + AppToast.showErrorToast(message: model.error); + }); + }, + ), + ); + }, + ),], body: Scaffold( extendBodyBehindAppBar: true, - appBar: PreferredSize( - preferredSize: Size.fromHeight(60.0), - child: Stack( - children: [ - Positioned( - bottom: 1, - left: 0, - right: 0, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), - child: Container( - color: Theme.of(context) - .scaffoldBackgroundColor - .withOpacity(0.8), - height: 70.0, - ), - ), - ), - Center( - child: Container( - height: 55.0, - color: Colors.white, - child: Center( - child: TabBar( - isScrollable: true, - controller: _tabController, - indicatorWeight: 5.0, - indicatorSize: TabBarIndicatorSize.tab, - labelColor: Theme.of(context).primaryColor, - labelPadding: - EdgeInsets.only(top: 4.0, left: 5.0, right: 5.0), - unselectedLabelColor: Colors.grey[800], - tabs: [ - Container( - width: MediaQuery.of(context).size.width * 0.27, - child: Center( - child: Texts('Weekly'), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.27, - child: Center( - child: Texts('Monthly'), - ), - ), - Container( - width: MediaQuery.of(context).size.width * 0.27, - child: Center( - child: Texts('Yearly'), - ), - ), - ], - ), - ), - ), - ), - ], - ), - ), + appBar: TabBarWidget(tabController: _tabController,), body: Column( children: [ Expanded( @@ -113,16 +81,13 @@ class _BloodPressureHomePageState extends State controller: _tabController, children: [ BloodPressureWeeklyPage( - data: model.getBloodWeeklySeries(), - diabtecPatientResult: model.weekDiabtecPatientResult, + model: model, ), BloodPressureMonthlyPage( - data: model.getBloodMonthlyTimeSeriesSales(), - diabtecPatientResult: model.monthDiabtecPatientResult, + model: model, ), BloodPressureYearPage( - data: model.getBloodYearTimeSeriesSales(), - diabtecPatientResult: model.yearDiabtecPatientResult, + model: model, ) ], ), @@ -131,13 +96,13 @@ class _BloodPressureHomePageState extends State ), floatingActionButton: InkWell( onTap: () { - Navigator.push(context, FadePage(page: AddBloodPressurePage())); + Navigator.push(context, FadePage(page: AddBloodPressurePage(model: model,))); }, child: Container( width: 55, height: 55, decoration: BoxDecoration( - shape: BoxShape.circle, color: HexColor('515B5D')), + shape: BoxShape.circle, color: Theme.of(context).primaryColor), child: Center( child: Icon( Icons.add, diff --git a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart index 8b9e504f..04853689 100644 --- a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart +++ b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart @@ -1,43 +1,45 @@ -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPressureResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/YearMonthlyChartDate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/blood_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/MonthCurvedChartBloodPressure.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:charts_flutter/flutter.dart' as charts; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class BloodPressureMonthlyPage extends StatelessWidget { - final List> data; - final List diabtecPatientResult; + final BloodPressureViewMode model; + + const BloodPressureMonthlyPage({Key key, this.model}) : super(key: key); - const BloodPressureMonthlyPage( - {Key key, this.data, this.diabtecPatientResult}) - : super(key: key); @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return AppScaffold( - body: ListView( + body: model.weighMonthTimeSeriesDataTop.isEmpty? Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),):ListView( children: [ - Container( - width: double.maxFinite, - height: 180, - color: Colors.white, - child: charts.LineChart(data, - //animate: animate, - defaultRenderer: - new charts.LineRendererConfig(includePoints: true)), - ), + Container( + margin: EdgeInsets.only(top: 12, left: 8, right: 8), + color: Colors.white, + child: MonthCurvedChartBloodPressure( + horizontalInterval: 20.0, + title: TranslationBase.of(context).bloodPressure, + timeSeries1: model.weighMonthTimeSeriesDataTop, + timeSeries2: model.weighMonthTimeSeriesDataLow, + indexes: model.weightWeekTimeSeriesDataLow.length ~/ 5.5, + ), + ), SizedBox( height: 12, ), Padding( padding: const EdgeInsets.all(8.0), - child: Texts('Details'), + child: Texts(TranslationBase.of(context).details), ), Container( padding: EdgeInsets.all(10), @@ -49,7 +51,7 @@ class BloodPressureMonthlyPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(), + children: fullData(context,projectViewModel,model), ), ], ), @@ -59,7 +61,8 @@ class BloodPressureMonthlyPage extends StatelessWidget { ); } - List fullData() { + List fullData(BuildContext context, + ProjectViewModel projectViewModel, BloodPressureViewMode model) { List tableRow = []; tableRow.add( TableRow( @@ -67,7 +70,7 @@ class BloodPressureMonthlyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(10.0), ), @@ -85,7 +88,7 @@ class BloodPressureMonthlyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( @@ -99,11 +102,11 @@ class BloodPressureMonthlyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Measured', + 'Arm', color: Colors.white, fontSize: 15, ), @@ -113,14 +116,14 @@ class BloodPressureMonthlyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( topRight: Radius.circular(10.0), ), ), child: Center( child: Texts( - 'Value', + 'SBP/DBP', color: Colors.white, fontSize: 15, ), @@ -130,68 +133,50 @@ class BloodPressureMonthlyPage extends StatelessWidget { ], ), ); - diabtecPatientResult.forEach( + model.monthDiabtecPatientResult.reversed.forEach( (diabtec) { tableRow.add( TableRow( children: [ Container( - child: Container( - height: 70, - padding: EdgeInsets.all(10), - color: Colors.white, - child: Center( - child: Texts( - '${DateUtil.getMonthDayYearDateFormatted(diabtec.bloodPressureDate)} ', - textAlign: TextAlign.center, - fontSize: 12, - ), + color: Colors.white, + child: Center( + child: Texts( + '${projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr(diabtec.bloodPressureDate):DateUtil.getMonthDayYearDateFormatted(diabtec.bloodPressureDate)}', + fontSize: 15, + textAlign: TextAlign.center, ), ), + height: 40, ), Container( - child: Container( - height: 70, - padding: EdgeInsets.all(10), color: Colors.white, child: Center( child: Texts( '${diabtec.bloodPressureDate.hour}:${diabtec.bloodPressureDate.minute}', - textAlign: TextAlign.center, - fontSize: 12, + fontSize: 15, ), ), - ), - ), + height: 40), Container( - child: Container( - height: 70, - padding: EdgeInsets.all(10), color: Colors.white, child: Center( child: Texts( - '${diabtec.measuredArmDesc}', - textAlign: TextAlign.center, - fontSize: 12, + diabtec.measuredArmDesc, + fontSize: 15, ), ), - ), - ), + height: 40), Container( - child: Container( - height: 70, - padding: EdgeInsets.all(10), color: Colors.white, child: Center( child: Texts( '${diabtec.systolicePressure}/${diabtec.diastolicPressure}', - textAlign: TextAlign.center, - fontSize: 12, color: Colors.red, + fontSize: 15, ), ), - ), - ), + height: 40), ], ), ); diff --git a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart index 0c67be7c..b5b01f06 100644 --- a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart +++ b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart @@ -1,33 +1,34 @@ -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPressureResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/blood_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/CurvedChartBloodPressure.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:charts_flutter/flutter.dart' as charts; -import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class BloodPressureYearPage extends StatelessWidget { - final List> data; - final List diabtecPatientResult; + final BloodPressureViewMode model; - const BloodPressureYearPage({Key key, this.data, this.diabtecPatientResult}) - : super(key: key); + const BloodPressureYearPage({Key key, this.model}) : super(key: key); @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body: model.weightYearTimeSeriesDataTop.isEmpty? Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),):ListView( children: [ Container( - width: double.maxFinite, - height: 180, + margin: EdgeInsets.only(top: 12, left: 8, right: 8), color: Colors.white, - child: charts.TimeSeriesChart( - data, - dateTimeFactory: const charts.LocalDateTimeFactory(), + child: CurvedChartBloodPressure( + horizontalInterval: 3.0,// model.weightWeekTimeSeriesDataLow.length==1 ?1 :20.0, + title: TranslationBase.of(context).bloodPressure, + timeSeries1: model.weightYearTimeSeriesDataTop, + timeSeries2: model.weightYearTimeSeriesDataLow, + indexes: model.weightWeekTimeSeriesDataLow.length ~/ 5.5, ), ), SizedBox( @@ -35,7 +36,7 @@ class BloodPressureYearPage extends StatelessWidget { ), Padding( padding: const EdgeInsets.all(8.0), - child: Texts('Details'), + child: Texts(TranslationBase.of(context).details), ), Container( padding: EdgeInsets.all(10), @@ -47,7 +48,7 @@ class BloodPressureYearPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(), + children: fullData(context, projectViewModel, model), ), ], ), @@ -57,7 +58,10 @@ class BloodPressureYearPage extends StatelessWidget { ); } - List fullData() { + List fullData( + BuildContext context, + ProjectViewModel projectViewModel, + BloodPressureViewMode bloodSugarViewMode) { List tableRow = []; tableRow.add( TableRow( @@ -65,14 +69,19 @@ class BloodPressureYearPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + topRight: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), ), ), child: Center( child: Texts( - 'Date', + TranslationBase.of(context).date, color: Colors.white, fontSize: 15, ), @@ -83,11 +92,11 @@ class BloodPressureYearPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Time', + TranslationBase.of(context).time, color: Colors.white, fontSize: 15, ), @@ -97,11 +106,11 @@ class BloodPressureYearPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Measured', + TranslationBase.of(context).measured, color: Colors.white, fontSize: 15, ), @@ -111,14 +120,19 @@ class BloodPressureYearPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topRight: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), + topRight: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), ), ), child: Center( child: Texts( - 'Value', + TranslationBase.of(context).value, color: Colors.white, fontSize: 15, ), @@ -128,7 +142,7 @@ class BloodPressureYearPage extends StatelessWidget { ], ), ); - diabtecPatientResult.forEach( + model.yearDiabtecPatientResult.reversed.forEach( (diabtec) { tableRow.add( TableRow( diff --git a/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart b/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart index 52313483..e4ff7332 100644 --- a/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart +++ b/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart @@ -1,33 +1,37 @@ -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPressureResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; -import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/blood_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/widget/CurvedChartBloodPressure.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:charts_flutter/flutter.dart' as charts; -import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +import 'AddBloodPressurePage.dart'; class BloodPressureWeeklyPage extends StatelessWidget { - final List> data; - final List diabtecPatientResult; + final BloodPressureViewMode model; - const BloodPressureWeeklyPage({Key key, this.data, this.diabtecPatientResult}) - : super(key: key); + const BloodPressureWeeklyPage({Key key, this.model}) : super(key: key); @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body: model.weightWeekTimeSeriesDataTop.isEmpty? Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),): ListView( children: [ Container( - width: double.maxFinite, - height: 180, + margin: EdgeInsets.only(top: 12, left: 8, right: 8), color: Colors.white, - child: charts.TimeSeriesChart( - data, - dateTimeFactory: const charts.LocalDateTimeFactory(), + child: CurvedChartBloodPressure( + horizontalInterval:3.0, + title: TranslationBase.of(context).bloodPressure, + timeSeries1: model.weightWeekTimeSeriesDataTop, + timeSeries2: model.weightWeekTimeSeriesDataLow, + indexes: model.weightWeekTimeSeriesDataLow.length ~/ 5.5, ), ), SizedBox( @@ -35,7 +39,7 @@ class BloodPressureWeeklyPage extends StatelessWidget { ), Padding( padding: const EdgeInsets.all(8.0), - child: Texts('Details'), + child: Texts(TranslationBase.of(context).details), ), Container( padding: EdgeInsets.all(10), @@ -47,7 +51,7 @@ class BloodPressureWeeklyPage extends StatelessWidget { border: TableBorder.symmetric( inside: BorderSide(width: 2.0, color: Colors.grey[300]), ), - children: fullData(), + children: fullData(context, projectViewModel, model), ), ], ), @@ -57,7 +61,10 @@ class BloodPressureWeeklyPage extends StatelessWidget { ); } - List fullData() { + List fullData( + BuildContext context, + ProjectViewModel projectViewModel, + BloodPressureViewMode bloodSugarViewMode) { List tableRow = []; tableRow.add( TableRow( @@ -65,14 +72,19 @@ class BloodPressureWeeklyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + topRight: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), ), ), child: Center( child: Texts( - 'Date', + TranslationBase.of(context).date, color: Colors.white, fontSize: 15, ), @@ -83,11 +95,11 @@ class BloodPressureWeeklyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Time', + TranslationBase.of(context).time, color: Colors.white, fontSize: 15, ), @@ -97,11 +109,11 @@ class BloodPressureWeeklyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Measured', + TranslationBase.of(context).measured, color: Colors.white, fontSize: 15, ), @@ -111,11 +123,11 @@ class BloodPressureWeeklyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, ), child: Center( child: Texts( - 'Value', + TranslationBase.of(context).value, color: Colors.white, fontSize: 15, ), @@ -125,14 +137,19 @@ class BloodPressureWeeklyPage extends StatelessWidget { Container( child: Container( decoration: BoxDecoration( - color: HexColor('#515B5D'), + color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topRight: Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), + topRight: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), ), ), child: Center( child: Texts( - 'Edit', + TranslationBase.of(context).edit, color: Colors.white, fontSize: 15, ), @@ -142,7 +159,7 @@ class BloodPressureWeeklyPage extends StatelessWidget { ], ), ); - diabtecPatientResult.forEach( + model.weekDiabtecPatientResult.reversed.forEach( (diabtec) { tableRow.add( TableRow( @@ -202,7 +219,23 @@ class BloodPressureWeeklyPage extends StatelessWidget { ), ), ), - Container( + InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: AddBloodPressurePage( + model: model, + isUpdate: true, + lineItemNo: diabtec.lineItemNo, + bloodSugarDate: diabtec.bloodPressureDate, + bloodDiastolicValue: diabtec.diastolicPressure.toString(), + bloodSystolicValue: diabtec.systolicePressure.toString(), + measureTimeSelectedType: diabtec.measuredArmDesc, + ), + ), + ); + }, child: Container( height: 70, padding: EdgeInsets.all(10), diff --git a/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart b/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart index a1fbff8d..94e48b92 100644 --- a/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart +++ b/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart @@ -96,7 +96,7 @@ class _AddBloodSugarPageState extends State { appBarTitle: widget.isUpdate ? TranslationBase.of(context).update : TranslationBase.of(context).add, - appBarIcons: [ + appBarIcons: widget.isUpdate?[ IconButton( icon: Icon(Icons.delete), color: Colors.white, @@ -129,7 +129,7 @@ class _AddBloodSugarPageState extends State { dialog.showAlertDialog(context); }, ) - ], + ]:null, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( diff --git a/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart b/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart index f5ef9aa9..1294c5dd 100644 --- a/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart +++ b/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart @@ -25,7 +25,7 @@ class BloodMonthlyPage extends StatelessWidget { Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body: timeSeriesData.isEmpty?Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),): ListView( children: [ Container( width: double.maxFinite, diff --git a/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart b/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart index d94da7fe..842d55f1 100644 --- a/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart +++ b/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart @@ -14,9 +14,8 @@ import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; class BloodYearPage extends StatelessWidget { - final List diabtecPatientResult; - final List timeSeriesData ; + final List timeSeriesData; const BloodYearPage({Key key, this.diabtecPatientResult, this.timeSeriesData}) : super(key: key); @@ -25,45 +24,52 @@ class BloodYearPage extends StatelessWidget { Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( - children: [ - Container( - width: double.maxFinite, - color: Colors.white, - child: LineChartCurved( - title: 'Sugar', - timeSeries: timeSeriesData, - indexes: timeSeriesData.length ~/ 5.5, + body: timeSeriesData.isEmpty + ? Container( + child: Center( + child: Texts(TranslationBase.of(context).noDataAvailable), + ), ) - ), - SizedBox( - height: 12, - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Texts(TranslationBase.of(context).details), - ), - Container( - padding: EdgeInsets.all(10), - color: Colors.transparent, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Table( - border: TableBorder.symmetric( - inside: BorderSide(width: 2.0, color: Colors.grey[300]), - ), - children: fullData(context,projectViewModel), + : ListView( + children: [ + Container( + width: double.maxFinite, + color: Colors.white, + child: LineChartCurved( + title: 'Sugar', + timeSeries: timeSeriesData, + indexes: timeSeriesData.length ~/ 5.5, + )), + SizedBox( + height: 12, ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts(TranslationBase.of(context).details), + ), + Container( + padding: EdgeInsets.all(10), + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Table( + border: TableBorder.symmetric( + inside: + BorderSide(width: 2.0, color: Colors.grey[300]), + ), + children: fullData(context, projectViewModel), + ), + ], + ), + ) ], ), - ) - ], - ), ); } - List fullData(BuildContext context,ProjectViewModel projectViewModel) { + List fullData( + BuildContext context, ProjectViewModel projectViewModel) { List tableRow = []; tableRow.add( TableRow( @@ -73,8 +79,12 @@ class BloodYearPage extends StatelessWidget { decoration: BoxDecoration( color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: projectViewModel.isArabic? Radius.circular(0.0):Radius.circular(10.0), - topRight: projectViewModel.isArabic? Radius.circular(10.0):Radius.circular(0.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), + topRight: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), ), ), child: Center( @@ -120,8 +130,12 @@ class BloodYearPage extends StatelessWidget { decoration: BoxDecoration( color: Theme.of(context).primaryColor, borderRadius: BorderRadius.only( - topLeft: projectViewModel.isArabic? Radius.circular(10.0):Radius.circular(0.0), - topRight: projectViewModel.isArabic? Radius.circular(0.0):Radius.circular(10.0), + topLeft: projectViewModel.isArabic + ? Radius.circular(10.0) + : Radius.circular(0.0), + topRight: projectViewModel.isArabic + ? Radius.circular(0.0) + : Radius.circular(10.0), ), ), child: Center( @@ -133,7 +147,6 @@ class BloodYearPage extends StatelessWidget { ), height: 40), ), - ], ), ); @@ -149,7 +162,7 @@ class BloodYearPage extends StatelessWidget { color: Colors.white, child: Center( child: Texts( - '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.dateChart):DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', + '${projectViewModel.isArabic ? DateUtil.getMonthDayYearDateFormattedAr(diabtec.dateChart) : DateUtil.getMonthDayYearDateFormatted(diabtec.dateChart)} ', textAlign: TextAlign.center, fontSize: 12, ), diff --git a/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart index 4bda58fa..60f3293d 100644 --- a/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart +++ b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart @@ -31,7 +31,7 @@ class BloodSugarWeeklyPage extends StatelessWidget { Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( - body: ListView( + body:timeSeriesData.isEmpty?Container(child: Center(child: Texts(TranslationBase.of(context).noDataAvailable),),): ListView( children: [ Container( margin: EdgeInsets.only(top: 12, left: 8, right: 8), diff --git a/lib/pages/medical/my_trackers/widget/CurvedChartBloodPressure.dart b/lib/pages/medical/my_trackers/widget/CurvedChartBloodPressure.dart new file mode 100644 index 00000000..ac2349bc --- /dev/null +++ b/lib/pages/medical/my_trackers/widget/CurvedChartBloodPressure.dart @@ -0,0 +1,273 @@ +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +import '../../../../Constants.dart'; + +class CurvedChartBloodPressure extends StatelessWidget { + final String title; + final List timeSeries1; + final List timeSeries2; + final int indexes; + final double horizontalInterval; + + CurvedChartBloodPressure( + {this.title, + this.timeSeries1, + this.indexes, + this.timeSeries2, + this.horizontalInterval = 20.0}); + + List xAxixs = List(); + List yAxixs = List(); + + @override + Widget build(BuildContext context) { + getXaxix(); + return AspectRatio( + aspectRatio: 1.1, + child: Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(18)), + // color: Colors.white, + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox( + height: 15, + ), + Text( + title, + style: TextStyle( + color: Colors.black, fontSize: 15, letterSpacing: 2), + textAlign: TextAlign.center, + ), + SizedBox( + height: 10, + ), + Expanded( + child: Padding( + padding: + const EdgeInsets.only(right: 18.0, left: 16.0, top: 15), + child: LineChart( + sampleData1(context), + swapAnimationDuration: const Duration(milliseconds: 250), + ), + ), + ), + SizedBox( + height: 10, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Theme.of(context).primaryColor), + ), + SizedBox( + width: 5, + ), + Texts(TranslationBase.of(context).systolicLng) + ], + ), + SizedBox( + width: 15, + ), + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, color: secondaryColor), + ), + SizedBox( + width: 5, + ), + Texts(TranslationBase.of(context).diastolicLng) + ], + ), + ], + ) + ], + ), + ], + ), + ), + ); + } + + getXaxix() { + for (int index = 0; index < timeSeries1.length; index++) { + int mIndex = indexes * index; + if (mIndex < timeSeries1.length) { + xAxixs.add(mIndex); + } + } + } + + LineChartData sampleData1(context) { + return LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.white, + ), + touchCallback: (LineTouchResponse touchResponse) {}, + handleBuiltInTouches: true, + ), + gridData: FlGridData( + show: true, drawVerticalLine: true, drawHorizontalLine: true), + titlesData: FlTitlesData( + bottomTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontSize: 10, + ), + + margin: 22, + getTitles: (value) { + if (timeSeries1.length < 15) { + if (timeSeries1.length > value.toInt()) { + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + } else + return ''; + } else { + if (value.toInt() == 0) + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + if (value.toInt() == timeSeries1.length - 1) + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + if (xAxixs.contains(value.toInt())) { + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + } + } + return ''; + }, + ), + leftTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 10, + ), + getTitles: (value) { + if (value.toInt() == 0) + return '${value.toInt()}'; + else if (value.toInt() % horizontalInterval == 0) + return '${value.toInt()}'; + else + return ''; + }, + margin: 12, + ), + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide( + color: Colors.black, + width: 0.5, + ), + left: BorderSide( + color: Colors.black, + ), + right: BorderSide( + color: Colors.black, + ), + top: BorderSide( + color: Colors.transparent, + ), + ), + ), + minX: 0, + maxX: (timeSeries1.length - 1).toDouble(), + maxY: getMaxY() + 0.3, + minY: getMinY(), + lineBarsData: getData(context), + ); + } + + double getMaxY() { + double max = 0; + timeSeries1.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + timeSeries2.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + + return max.roundToDouble(); + } + + double getMinY() { + double min = timeSeries1[0].sales; + timeSeries1.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + timeSeries2.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + + int value = min.toInt(); + + return value.toDouble(); + } + + List getData(context) { + List spots = List(); + for (int index = 0; index < timeSeries1.length; index++) { + spots.add(FlSpot(index.toDouble(), timeSeries1[index].sales)); + } + + List spots2 = List(); + for (int index = 0; index < timeSeries2.length; index++) { + spots2.add(FlSpot(index.toDouble(), timeSeries2[index].sales)); + } + + final LineChartBarData lineChartBarData1 = LineChartBarData( + spots: spots, + isCurved: true, + colors: [Colors.red], + barWidth: 5, + isStrokeCapRound: true, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + final LineChartBarData lineChartBarData2 = LineChartBarData( + spots: spots2, + isCurved: true, + colors: [Theme.of(context).primaryColor], + barWidth: 5, + isStrokeCapRound: true, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + + return [lineChartBarData1, lineChartBarData2]; + } +} diff --git a/lib/pages/medical/my_trackers/widget/MonthCurvedChartBloodPressure.dart b/lib/pages/medical/my_trackers/widget/MonthCurvedChartBloodPressure.dart new file mode 100644 index 00000000..135d0a95 --- /dev/null +++ b/lib/pages/medical/my_trackers/widget/MonthCurvedChartBloodPressure.dart @@ -0,0 +1,252 @@ +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +class MonthCurvedChartBloodPressure extends StatelessWidget { + final String title; + final List timeSeries1; + final List timeSeries2; + final int indexes; + final double horizontalInterval; + + MonthCurvedChartBloodPressure( + {this.title, this.timeSeries1, this.indexes, this.timeSeries2, this.horizontalInterval = 20.0}); + + List xAxixs = List(); + List yAxixs = List(); + + @override + Widget build(BuildContext context) { + getXaxix(); + return AspectRatio( + aspectRatio: 1.1, + child: Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(18)), + // color: Colors.white, + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox( + height: 15, + ), + Text( + title, + style: TextStyle( + color: Colors.black, fontSize: 15, letterSpacing: 2), + textAlign: TextAlign.center, + ), + SizedBox( + height: 10, + ), + Expanded( + child: Padding( + padding: + const EdgeInsets.only(right: 18.0, left: 16.0, top: 15), + child: LineChart( + sampleData1(context), + swapAnimationDuration: const Duration(milliseconds: 250), + ), + ), + ), + SizedBox( + height: 10, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Theme.of(context).primaryColor), + ), + SizedBox( + width: 5, + ), + Texts(TranslationBase.of(context).systolicLng) + ], + ), + SizedBox( + width: 15, + ), + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, color: Colors.grey), + ), + SizedBox( + width: 5, + ), + Texts(TranslationBase.of(context).diastolicLng) + ], + ), + ], + ) + ], + ), + ], + ), + ), + ); + } + + getXaxix() { + for (int index = 0; index < timeSeries1.length; index++) { + int mIndex = indexes * index; + if (mIndex < timeSeries1.length) { + xAxixs.add(mIndex); + } + } + } + + LineChartData sampleData1(context) { + return LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.white, + ), + touchCallback: (LineTouchResponse touchResponse) {}, + handleBuiltInTouches: true, + ), + gridData: FlGridData( + show: true, drawVerticalLine: true, drawHorizontalLine: true), + titlesData: FlTitlesData( + bottomTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontSize: 10, + ), + margin: 22, + getTitles: (value) { + return ''; + }, + ), + leftTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 10, + ), + getTitles: (value) { + if (value.toInt() == 0) + return '${value.toInt()}'; + else if (value.toInt() % horizontalInterval == 0) + return '${value.toInt()}'; + else + return ''; + }, + margin: 12, + ), + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide( + color: Colors.black, + width: 0.5, + ), + left: BorderSide( + color: Colors.black, + ), + right: BorderSide( + color: Colors.black, + ), + top: BorderSide( + color: Colors.transparent, + ), + ), + ), + minX: 0, + maxX: (timeSeries1.length - 1).toDouble(), + maxY: getMaxY() + 0.3, + minY: getMinY(), + lineBarsData: getData(context), + ); + } + + double getMaxY() { + double max = 0; + timeSeries1.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + timeSeries2.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + + return max.roundToDouble(); + } + + double getMinY() { + double min = timeSeries1[0].sales; + timeSeries1.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + timeSeries2.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + + int value = min.toInt(); + + return value.toDouble(); + } + + List getData(context) { + List spots = List(); + for (int index = 0; index < timeSeries1.length; index++) { + spots.add(FlSpot(index.toDouble(), timeSeries1[index].sales)); + } + + List spots2 = List(); + for (int index = 0; index < timeSeries2.length; index++) { + spots2.add(FlSpot(index.toDouble(), timeSeries2[index].sales)); + } + + final LineChartBarData lineChartBarData1 = LineChartBarData( + spots: spots, + isCurved: true, + colors: [Colors.red], + barWidth: 5, + isStrokeCapRound: true, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + final LineChartBarData lineChartBarData2 = LineChartBarData( + spots: spots2, + isCurved: true, + colors: [Theme.of(context).primaryColor], + barWidth: 5, + isStrokeCapRound: true, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + + return [lineChartBarData1, lineChartBarData2]; + } +} diff --git a/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart b/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart index e8cb8b24..fa177b1a 100644 --- a/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart +++ b/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart @@ -228,7 +228,7 @@ class LineChartCurvedBloodPressure extends StatelessWidget { final LineChartBarData lineChartBarData1 = LineChartBarData( spots: spots, isCurved: true, - colors: [Theme.of(context).primaryColor], + colors: [Colors.red], barWidth: 5, isStrokeCapRound: true, dotData: FlDotData( @@ -241,7 +241,7 @@ class LineChartCurvedBloodPressure extends StatelessWidget { final LineChartBarData lineChartBarData2 = LineChartBarData( spots: spots2, isCurved: true, - colors: [Colors.grey], + colors: [Theme.of(context).primaryColor], barWidth: 5, isStrokeCapRound: true, dotData: FlDotData( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 6280bf01..14e10607 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1283,6 +1283,8 @@ class TranslationBase { String get bloodDEnterDesc => localizedValues["bloodD-enter-desc"][locale.languageCode]; String get viewTermsConditions => localizedValues["viewTermsConditions"][locale.languageCode]; String get weightAdd => localizedValues["weight-add"][locale.languageCode]; + String get systolicAdd => localizedValues["systolic-add"][locale.languageCode]; + String get diastolicAdd => localizedValues["systolic-add"][locale.languageCode]; } From 3e441c55b22549ee50ef4706c1f232f5c7d428d2 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 26 Jan 2021 12:41:50 +0200 Subject: [PATCH 8/8] fix bottom nav bar --- lib/config/localized_values.dart | 4 ++ lib/pages/landing/home_page.dart | 9 ++-- lib/pages/landing/landing_page.dart | 2 + lib/pages/medical/medical_profile_page.dart | 53 ++++++++++--------- lib/uitl/translations_delegate_base.dart | 7 +-- .../bottom_navigation/bottom_nav_bar.dart | 2 +- .../medical/time_line_widget.dart | 14 +++-- 7 files changed, 46 insertions(+), 45 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 1601471a..5658469e 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1646,4 +1646,8 @@ const Map localizedValues = { "en": "Enter Diastolic Value", "ar": "أدخل قيمة الإنبساط " }, + "cmc-heading": { + "en": "Comprehensive Medical Checkup", + "ar": "فحص طبي شامل" + }, }; diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 87afb17f..3a64fbd5 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart'; +import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page.dart'; import 'package:diplomaticquarterapp/pages/ContactUs/contact_us_page.dart'; import 'package:diplomaticquarterapp/pages/Covid-DriveThru/covid-drivethru-location.dart'; @@ -421,7 +422,7 @@ class _HomePageState extends State { Navigator.push( context, FadePage( - page: HomeHealthCareIndexPage(), + page: HomeHealthCarePage(), ), ); }, @@ -436,10 +437,10 @@ class _HomePageState extends State { height: 50, ), SizedBox( - height: 3, + height: 10, ), Texts( - TranslationBase.of(context).homeHealthCareService, + TranslationBase.of(context).cmcHeading, textAlign: TextAlign.center, color: Colors.white, fontWeight: FontWeight.w700, @@ -505,7 +506,7 @@ class _HomePageState extends State { height: 50, ), SizedBox( - height: 3, + height:10, ), Texts( TranslationBase.of(context).emergencyService, diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 01a50fda..e63df76c 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -607,6 +607,8 @@ class _LandingPageState extends State with WidgetsBindingObserver { return TranslationBase.of(context).medicalProfile; case 2: return TranslationBase.of(context).bookAppo; + case 5: + return TranslationBase.of(context).bookAppo; case 3: return TranslationBase.of(context).services; case 4: diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index ade69f45..431990e8 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -54,15 +54,19 @@ class MedicalProfilePage extends StatefulWidget { class _MedicalProfilePageState extends State { var authProvider = new AuthProvider(); - List medical=List(); + List medical = List(); ProjectViewModel projectViewModel; + @override Widget build(BuildContext context) { - projectViewModel = Provider.of(context); + projectViewModel = Provider.of(context); var appoCountProvider = Provider.of(context); - - List myMedicalList = Utils.myMedicalList(projectViewModel: projectViewModel,context: context,count: appoCountProvider.count,isLogin: projectViewModel.isLogin); - return BaseView( + List myMedicalList = Utils.myMedicalList( + projectViewModel: projectViewModel, + context: context, + count: appoCountProvider.count, + isLogin: projectViewModel.isLogin); + return BaseView( onModelReady: (model) => model.getAppointmentHistory(), builder: (_, model, widget) => AppScaffold( isShowDecPage: false, @@ -97,25 +101,30 @@ class _MedicalProfilePageState extends State { itemCount: model .appoitmentAllHistoryResultList.length, scrollDirection: Axis.horizontal, - reverse: !projectViewModel.isArabic, + reverse: projectViewModel.isArabic, ), ], ), ), - SizedBox(height: 50,), + SizedBox( + height: 50, + ), Padding( padding: EdgeInsets.symmetric(vertical: 5.0), child: GridView.builder( shrinkWrap: true, primary: false, physics: NeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, - childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 2.40), + childAspectRatio: MediaQuery.of(context) + .size + .width / + (MediaQuery.of(context).size.height / 2.40), ), itemCount: myMedicalList.length, itemBuilder: (BuildContext context, int index) { - return myMedicalList[index]; }, ), @@ -123,8 +132,7 @@ class _MedicalProfilePageState extends State { ], ), SizedBox( - height: - MediaQuery.of(context).size.height * 0.12, + height: MediaQuery.of(context).size.height * 0.12, ), if (model.user != null && model.isLogin) Positioned( @@ -135,7 +143,7 @@ class _MedicalProfilePageState extends State { width: double.infinity, height: 80, decoration: BoxDecoration( - color: Theme.of(context).primaryColor, + color: Colors.grey[500], shape: BoxShape.rectangle, border: Border.all( color: Colors.transparent, width: 0.5), @@ -187,20 +195,13 @@ class _MedicalProfilePageState extends State { ), ); } - - fullMedicalData(){ - if(projectViewModel.havePrivilege(5)) - {} - } } -class Medical{ - - final String title; - final String imagePath; - final String subTitle; - final Widget page; - - Medical({this.title, this.imagePath, this.subTitle, this.page}); +class Medical { + final String title; + final String imagePath; + final String subTitle; + final Widget page; + Medical({this.title, this.imagePath, this.subTitle, this.page}); } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 2365359d..82d3d5c4 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1377,15 +1377,10 @@ class TranslationBase { localizedValues["viewTermsConditions"][locale.languageCode]; String get walkinAppo => localizedValues["WalkinAppo"][locale.languageCode]; String get videoAppo => localizedValues["videoAppo"][locale.languageCode]; - String get addNewChild => localizedValues["add-new-child"][locale.languageCode]; - String get sendChildEmailMsg => localizedValues["send-child-email-msg"][locale.languageCode]; - String get vaccinationAddChildMsg => localizedValues["vaccination-add-child-msg"][locale.languageCode]; - String get childAddedSuccessfully => localizedValues["child_added_successfully"][locale.languageCode]; - String get bloodDEnterDesc => localizedValues["bloodD-enter-desc"][locale.languageCode]; - String get viewTermsConditions => localizedValues["viewTermsConditions"][locale.languageCode]; String get weightAdd => localizedValues["weight-add"][locale.languageCode]; String get systolicAdd => localizedValues["systolic-add"][locale.languageCode]; String get diastolicAdd => localizedValues["systolic-add"][locale.languageCode]; + String get cmcHeading => localizedValues["cmc-heading"][locale.languageCode]; } diff --git a/lib/widgets/bottom_navigation/bottom_nav_bar.dart b/lib/widgets/bottom_navigation/bottom_nav_bar.dart index 66a83224..107e730c 100644 --- a/lib/widgets/bottom_navigation/bottom_nav_bar.dart +++ b/lib/widgets/bottom_navigation/bottom_nav_bar.dart @@ -95,7 +95,7 @@ class _BottomNavBarState extends State { icon: EvaIcons.calendar, activeIcon: EvaIcons.calendar, changeIndex: _changeIndex, - index: _index, + index: widget.index, currentIndex: 2, name: TranslationBase.of(context).bookAppo, ), diff --git a/lib/widgets/data_display/medical/time_line_widget.dart b/lib/widgets/data_display/medical/time_line_widget.dart index 6e946aa5..810fc0d8 100644 --- a/lib/widgets/data_display/medical/time_line_widget.dart +++ b/lib/widgets/data_display/medical/time_line_widget.dart @@ -72,9 +72,8 @@ class TimeLineWidget extends StatelessWidget { width: 15, height: 15, decoration: BoxDecoration( - color: Theme.of(context).primaryColor, - border: Border.all( - color: Theme.of(context).primaryColor, width: 2), + color: Colors.yellow[700], + border: Border.all(color: Colors.yellow[700], width: 2), shape: BoxShape.rectangle, borderRadius: BorderRadius.all( Radius.circular(25.0), @@ -111,7 +110,7 @@ class TimeLineWidget extends StatelessWidget { child: Column( children: [ Texts( - appoitmentAllHistoryResul.clinicName, + appoitmentAllHistoryResul.clinicName.trim(), color: Colors.white, fontSize: 12.5, fontWeight: FontWeight.normal, @@ -132,9 +131,8 @@ class TimeLineWidget extends StatelessWidget { width: 15, height: 15, decoration: BoxDecoration( - color: Theme.of(context).primaryColor, - border: Border.all( - color: Theme.of(context).primaryColor, width: 2), + color: Colors.yellow[700], + border: Border.all(color: Colors.yellow[700], width: 2), shape: BoxShape.rectangle, borderRadius: BorderRadius.all( Radius.circular(25.0), @@ -164,7 +162,7 @@ class TimeLineWidget extends StatelessWidget { height: 3, ), Texts( - appoitmentAllHistoryResul.doctorNameObj, + appoitmentAllHistoryResul.doctorNameObj.trim(), color: Colors.white, fontSize: 10.5, fontWeight: FontWeight.normal,