From 9a2cbf394bf6a30133b4b4a592ee8c5305b98f2e Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 15 Sep 2020 15:19:42 +0300 Subject: [PATCH 1/8] add images for my trackers --- assets/tracker/blood-pressure.png | Bin 0 -> 2894 bytes assets/tracker/blood-suger.png | Bin 0 -> 2646 bytes assets/tracker/devices.png | Bin 0 -> 2751 bytes assets/tracker/weight.png | Bin 0 -> 3084 bytes pubspec.yaml | 1 + 5 files changed, 1 insertion(+) create mode 100644 assets/tracker/blood-pressure.png create mode 100644 assets/tracker/blood-suger.png create mode 100644 assets/tracker/devices.png create mode 100644 assets/tracker/weight.png diff --git a/assets/tracker/blood-pressure.png b/assets/tracker/blood-pressure.png new file mode 100644 index 0000000000000000000000000000000000000000..7aca3763c550a53fce91669be1a4029716b5f5dc GIT binary patch literal 2894 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 Ef^U=P2><{9 literal 0 HcmV?d00001 diff --git a/assets/tracker/devices.png b/assets/tracker/devices.png new file mode 100644 index 0000000000000000000000000000000000000000..f00f9d95d4b07e6f3f6b53d38cf30230822ac7dc GIT binary patch literal 2751 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 a4g3#mdWdMp4E6Z{0000 Date: Mon, 21 Sep 2020 12:02:15 +0300 Subject: [PATCH 2/8] done my trackers --- lib/config/config.dart | 18 +- .../blood_pressur/BloodPressureResult.dart | 90 +++++ .../MonthBloodPressureResultAverage.dart | 76 ++++ .../WeekBloodPressureResultAverage.dart | 30 ++ .../YearBloodPressureResultAverage.dart | 41 +++ .../blood_sugar/DiabtecPatientResult.dart | 98 +++++ .../MonthDiabtectResultAverage.dart | 36 ++ .../WeekDiabtectResultAverage.dart | 20 + .../blood_sugar/YearDiabtecResultAverage.dart | 36 ++ .../my_trakers/chartData/WeekChartDate.dart | 6 + .../chartData/YearMonthlyChartDate.dart | 6 + .../MonthWeightMeasurementResultAverage.dart | 36 ++ .../WeekWeightMeasurementResultAverage.dart | 21 ++ .../weight/WeightMeasurementResult.dart | 74 ++++ .../YearWeightMeasurementResultAverage.dart | 33 ++ .../service/medical/BloodPressureService.dart | 100 +++++ .../service/medical/BloodSugarService.dart | 96 +++++ .../medical/WeightPressureService.dart | 104 ++++++ lib/core/viewModels/base_view_model.dart | 8 + .../medical/blood_pressure_view_model.dart | 151 ++++++++ .../medical/blood_sugar_view_model.dart | 119 ++++++ .../medical/weight_pressure_view_model.dart | 113 ++++++ lib/core/viewModels/project_view_model.dart | 4 + lib/locator.dart | 14 +- lib/pages/base/base_view.dart | 5 +- .../dialogs/SelectPatientFamilyDialog.dart | 2 - lib/pages/medical/medical_profile_page.dart | 9 +- .../my_trackers/Weight/AddWeightPage.dart | 204 +++++++++++ .../my_trackers/Weight/WeightHomePage.dart | 151 ++++++++ .../my_trackers/Weight/WeightMonthlyPage.dart | 155 ++++++++ .../my_trackers/Weight/WeightWeeklyPage.dart | 170 +++++++++ .../my_trackers/Weight/WeightYeaPage.dart | 153 ++++++++ .../blood_pressure/AddBloodPressurePage.dart | 215 +++++++++++ .../blood_pressure/BloodPressureHomePage.dart | 154 ++++++++ .../blood_pressure/BloodPressureMonthly.dart | 200 ++++++++++ .../blood_pressure/BloodPressureYeaPage.dart | 199 ++++++++++ .../bloodPressureWeeklyPage.dart | 204 +++++++++++ .../blood_suger/AddBloodSugarPage.dart | 344 ++++++++++++++++++ .../my_trackers/blood_suger/BloodMonthly.dart | 188 ++++++++++ .../my_trackers/blood_suger/BloodYeaPage.dart | 199 ++++++++++ .../blood_suger/blood_sugar_home_page.dart | 145 ++++++++ .../blood_suger/blood_sugar_weekly_page.dart | 204 +++++++++++ .../medical/my_trackers/my_trackers.dart | 114 ++++++ lib/uitl/date_uitl.dart | 61 +++- lib/widgets/dialogs/RadioStringDialog.dart | 150 ++++++++ pubspec.yaml | 4 +- 46 files changed, 4537 insertions(+), 23 deletions(-) create mode 100644 lib/core/model/my_trakers/blood_pressur/BloodPressureResult.dart create mode 100644 lib/core/model/my_trakers/blood_pressur/MonthBloodPressureResultAverage.dart create mode 100644 lib/core/model/my_trakers/blood_pressur/WeekBloodPressureResultAverage.dart create mode 100644 lib/core/model/my_trakers/blood_pressur/YearBloodPressureResultAverage.dart create mode 100644 lib/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart create mode 100644 lib/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart create mode 100644 lib/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart create mode 100644 lib/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart create mode 100644 lib/core/model/my_trakers/chartData/WeekChartDate.dart create mode 100644 lib/core/model/my_trakers/chartData/YearMonthlyChartDate.dart create mode 100644 lib/core/model/my_trakers/weight/MonthWeightMeasurementResultAverage.dart create mode 100644 lib/core/model/my_trakers/weight/WeekWeightMeasurementResultAverage.dart create mode 100644 lib/core/model/my_trakers/weight/WeightMeasurementResult.dart create mode 100644 lib/core/model/my_trakers/weight/YearWeightMeasurementResultAverage.dart create mode 100644 lib/core/service/medical/BloodPressureService.dart create mode 100644 lib/core/service/medical/BloodSugarService.dart create mode 100644 lib/core/service/medical/WeightPressureService.dart create mode 100644 lib/core/viewModels/medical/blood_pressure_view_model.dart create mode 100644 lib/core/viewModels/medical/blood_sugar_view_model.dart create mode 100644 lib/core/viewModels/medical/weight_pressure_view_model.dart create mode 100644 lib/pages/medical/my_trackers/Weight/AddWeightPage.dart create mode 100644 lib/pages/medical/my_trackers/Weight/WeightHomePage.dart create mode 100644 lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart create mode 100644 lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart create mode 100644 lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart create mode 100644 lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart create mode 100644 lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart create mode 100644 lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart create mode 100644 lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart create mode 100644 lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart create mode 100644 lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart create mode 100644 lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart create mode 100644 lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart create mode 100644 lib/pages/medical/my_trackers/blood_suger/blood_sugar_home_page.dart create mode 100644 lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart create mode 100644 lib/pages/medical/my_trackers/my_trackers.dart create mode 100644 lib/widgets/dialogs/RadioStringDialog.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 9b910e66..ca902b45 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -169,7 +169,7 @@ const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; const VERSION_ID = 5.6; -const SETUP_ID = '91877'; +const SETUP_ID = '91877'; const LANGUAGE = 2; const PATIENT_OUT_SA = 0; const SESSION_ID = 'TMRhVmkGhOsvamErw'; @@ -203,6 +203,22 @@ const GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER = 'Services/Patients.svc/REST/AP_ const SEND_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/SendActivationCodeForAdvancePayment'; const CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT = 'Services/Authentication.svc/REST/CheckActivationCodeForAdvancePayment'; +///My Trackers +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 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 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 TIMER_MIN = 10; class AppGlobal { diff --git a/lib/core/model/my_trakers/blood_pressur/BloodPressureResult.dart b/lib/core/model/my_trakers/blood_pressur/BloodPressureResult.dart new file mode 100644 index 00000000..57f2cd54 --- /dev/null +++ b/lib/core/model/my_trakers/blood_pressur/BloodPressureResult.dart @@ -0,0 +1,90 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class BloodPressureResult { + int patientID; + int lineItemNo; + DateTime bloodPressureDate; + int measuredArm; + int systolicePressure; + int diastolicPressure; + dynamic remark; + bool isActive; + int chartYear; + String chartMonth; + dynamic yearSystolicePressureAverageResult; + dynamic monthSystolicePressureResult; + dynamic weekSystolicePressureResult; + int yearDiastolicPressureAverageResult; + dynamic monthDiastolicPressureResult; + dynamic weekDiastolicPressureResult; + String measuredArmDesc; + dynamic weekDesc; + + BloodPressureResult( + {this.patientID, + this.lineItemNo, + this.bloodPressureDate, + this.measuredArm, + this.systolicePressure, + this.diastolicPressure, + this.remark, + this.isActive, + this.chartYear, + this.chartMonth, + this.yearSystolicePressureAverageResult, + this.monthSystolicePressureResult, + this.weekSystolicePressureResult, + this.yearDiastolicPressureAverageResult, + this.monthDiastolicPressureResult, + this.weekDiastolicPressureResult, + this.measuredArmDesc, + this.weekDesc}); + + BloodPressureResult.fromJson(Map json) { + patientID = json['PatientID']; + lineItemNo = json['LineItemNo']; + bloodPressureDate =DateUtil.convertStringToDate(json['BloodPressureDate']); + measuredArm = json['MeasuredArm']; + systolicePressure = json['SystolicePressure']; + diastolicPressure = json['DiastolicPressure']; + remark = json['Remark']; + isActive = json['IsActive']; + chartYear = json['ChartYear']; + chartMonth = json['ChartMonth']; + yearSystolicePressureAverageResult = + json['YearSystolicePressureAverageResult']; + monthSystolicePressureResult = json['MonthSystolicePressureResult']; + weekSystolicePressureResult = json['WeekSystolicePressureResult']; + yearDiastolicPressureAverageResult = + json['YearDiastolicPressureAverageResult']; + monthDiastolicPressureResult = json['MonthDiastolicPressureResult']; + weekDiastolicPressureResult = json['WeekDiastolicPressureResult']; + measuredArmDesc = json['MeasuredArmDesc']; + weekDesc = json['WeekDesc']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientID'] = this.patientID; + data['LineItemNo'] = this.lineItemNo; + data['BloodPressureDate'] = this.bloodPressureDate; + data['MeasuredArm'] = this.measuredArm; + data['SystolicePressure'] = this.systolicePressure; + data['DiastolicPressure'] = this.diastolicPressure; + data['Remark'] = this.remark; + data['IsActive'] = this.isActive; + data['ChartYear'] = this.chartYear; + data['ChartMonth'] = this.chartMonth; + data['YearSystolicePressureAverageResult'] = + this.yearSystolicePressureAverageResult; + data['MonthSystolicePressureResult'] = this.monthSystolicePressureResult; + data['WeekSystolicePressureResult'] = this.weekSystolicePressureResult; + data['YearDiastolicPressureAverageResult'] = + this.yearDiastolicPressureAverageResult; + data['MonthDiastolicPressureResult'] = this.monthDiastolicPressureResult; + data['WeekDiastolicPressureResult'] = this.weekDiastolicPressureResult; + data['MeasuredArmDesc'] = this.measuredArmDesc; + data['WeekDesc'] = this.weekDesc; + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_pressur/MonthBloodPressureResultAverage.dart b/lib/core/model/my_trakers/blood_pressur/MonthBloodPressureResultAverage.dart new file mode 100644 index 00000000..5343119c --- /dev/null +++ b/lib/core/model/my_trakers/blood_pressur/MonthBloodPressureResultAverage.dart @@ -0,0 +1,76 @@ +class MonthBloodPressureResultAverage { + dynamic weekfourSystolicePressureAverageResult; + dynamic weekfourDiastolicPressureAverageResult; + dynamic weekthreeSystolicePressureAverageResult; + dynamic weekthreeDiastolicPressureAverageResult; + dynamic weektwoSystolicePressureAverageResult; + dynamic weektwoDiastolicPressureAverageResult; + dynamic weekoneSystolicePressureAverageResult; + dynamic weekoneDiastolicPressureAverageResult; + String weekDesc; + int weekDiastolicPressureAverageResult; + int weekSystolicePressureAverageResult; + + MonthBloodPressureResultAverage( + {this.weekfourSystolicePressureAverageResult, + this.weekfourDiastolicPressureAverageResult, + this.weekthreeSystolicePressureAverageResult, + this.weekthreeDiastolicPressureAverageResult, + this.weektwoSystolicePressureAverageResult, + this.weektwoDiastolicPressureAverageResult, + this.weekoneSystolicePressureAverageResult, + this.weekoneDiastolicPressureAverageResult, + this.weekDesc, + this.weekDiastolicPressureAverageResult, + this.weekSystolicePressureAverageResult}); + + MonthBloodPressureResultAverage.fromJson(Map json) { + weekfourSystolicePressureAverageResult = + json['weekfourSystolicePressureAverageResult']; + weekfourDiastolicPressureAverageResult = + json['weekfourDiastolicPressureAverageResult']; + weekthreeSystolicePressureAverageResult = + json['weekthreeSystolicePressureAverageResult']; + weekthreeDiastolicPressureAverageResult = + json['weekthreeDiastolicPressureAverageResult']; + weektwoSystolicePressureAverageResult = + json['weektwoSystolicePressureAverageResult']; + weektwoDiastolicPressureAverageResult = + json['weektwoDiastolicPressureAverageResult']; + weekoneSystolicePressureAverageResult = + json['weekoneSystolicePressureAverageResult']; + weekoneDiastolicPressureAverageResult = + json['weekoneDiastolicPressureAverageResult']; + weekDesc = json['WeekDesc']; + weekDiastolicPressureAverageResult = + json['WeekDiastolicPressureAverageResult']; + weekSystolicePressureAverageResult = + json['WeekSystolicePressureAverageResult']; + } + + Map toJson() { + final Map data = new Map(); + data['weekfourSystolicePressureAverageResult'] = + this.weekfourSystolicePressureAverageResult; + data['weekfourDiastolicPressureAverageResult'] = + this.weekfourDiastolicPressureAverageResult; + data['weekthreeSystolicePressureAverageResult'] = + this.weekthreeSystolicePressureAverageResult; + data['weekthreeDiastolicPressureAverageResult'] = + this.weekthreeDiastolicPressureAverageResult; + data['weektwoSystolicePressureAverageResult'] = + this.weektwoSystolicePressureAverageResult; + data['weektwoDiastolicPressureAverageResult'] = + this.weektwoDiastolicPressureAverageResult; + data['weekoneSystolicePressureAverageResult'] = + this.weekoneSystolicePressureAverageResult; + data['weekoneDiastolicPressureAverageResult'] = + this.weekoneDiastolicPressureAverageResult; + data['WeekDesc'] = this.weekDesc; + data['WeekDiastolicPressureAverageResult'] = + this.weekDiastolicPressureAverageResult; + data['WeekSystolicePressureAverageResult'] = + this.weekSystolicePressureAverageResult; + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_pressur/WeekBloodPressureResultAverage.dart b/lib/core/model/my_trakers/blood_pressur/WeekBloodPressureResultAverage.dart new file mode 100644 index 00000000..b7f3fc80 --- /dev/null +++ b/lib/core/model/my_trakers/blood_pressur/WeekBloodPressureResultAverage.dart @@ -0,0 +1,30 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class WeekBloodPressureResultAverage { + int dailySystolicePressureAverageResult; + int dailyDiastolicPressureAverageResult; + DateTime bloodPressureDate; + + WeekBloodPressureResultAverage( + {this.dailySystolicePressureAverageResult, + this.dailyDiastolicPressureAverageResult, + this.bloodPressureDate}); + + WeekBloodPressureResultAverage.fromJson(Map json) { + dailySystolicePressureAverageResult = + json['DailySystolicePressureAverageResult']; + dailyDiastolicPressureAverageResult = + json['DailyDiastolicPressureAverageResult']; + bloodPressureDate = DateUtil.convertStringToDate(json['BloodPressureDate']); + } + + Map toJson() { + final Map data = new Map(); + data['DailySystolicePressureAverageResult'] = + this.dailySystolicePressureAverageResult; + data['DailyDiastolicPressureAverageResult'] = + this.dailyDiastolicPressureAverageResult; + data['BloodPressureDate'] = this.bloodPressureDate; + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_pressur/YearBloodPressureResultAverage.dart b/lib/core/model/my_trakers/blood_pressur/YearBloodPressureResultAverage.dart new file mode 100644 index 00000000..095738d6 --- /dev/null +++ b/lib/core/model/my_trakers/blood_pressur/YearBloodPressureResultAverage.dart @@ -0,0 +1,41 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class YearBloodPressureResultAverage { + int monthSystolicePressureAverageResult; + int monthDiastolicPressureAverageResult; + dynamic monthNumber; + String monthName; + String yearName; + DateTime date; + + YearBloodPressureResultAverage( + {this.monthSystolicePressureAverageResult, + this.monthDiastolicPressureAverageResult, + this.monthNumber, + this.monthName, + this.yearName}); + + YearBloodPressureResultAverage.fromJson(Map json) { + monthSystolicePressureAverageResult = + json['monthSystolicePressureAverageResult']; + monthDiastolicPressureAverageResult = + json['monthDiastolicPressureAverageResult']; + monthNumber = json['monthNumber']; + monthName = json['monthName']; + yearName = json['yearName']; + date = DateUtil.getMonthDateTime(monthName,yearName); + + } + + Map toJson() { + final Map data = new Map(); + data['monthSystolicePressureAverageResult'] = + this.monthSystolicePressureAverageResult; + data['monthDiastolicPressureAverageResult'] = + this.monthDiastolicPressureAverageResult; + data['monthNumber'] = this.monthNumber; + data['monthName'] = this.monthName; + data['yearName'] = this.yearName; + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart b/lib/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart new file mode 100644 index 00000000..5b95409e --- /dev/null +++ b/lib/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart @@ -0,0 +1,98 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class DiabtecPatientResult { + String chartMonth; + var chartYear; + DateTime dateChart; + var description; + var descriptionN; + int diabtecAvarage; + bool isActive; + int lineItemNo; + var listMonth; + var listWeek; + int measured; + String measuredDesc; + var monthAverageResult; + int patientID; + var remark; + var resultDesc; + int resultValue; + String unit; + var weekAverageResult; + String weekDesc; + var yearAverageResult; + + DiabtecPatientResult( + {this.chartMonth, + this.chartYear, + this.dateChart, + this.description, + this.descriptionN, + this.diabtecAvarage, + this.isActive, + this.lineItemNo, + this.listMonth, + this.listWeek, + this.measured, + this.measuredDesc, + this.monthAverageResult, + this.patientID, + this.remark, + this.resultDesc, + this.resultValue, + this.unit, + this.weekAverageResult, + this.weekDesc, + this.yearAverageResult}); + + DiabtecPatientResult.fromJson(Map json) { + chartMonth = json['ChartMonth']; + chartYear = json['ChartYear']; + dateChart = DateUtil.convertStringToDate(json['DateChart']); + description = json['Description']; + descriptionN = json['DescriptionN']; + diabtecAvarage = json['DiabtecAvarage']; + isActive = json['IsActive']; + lineItemNo = json['LineItemNo']; + listMonth = json['List_Month']; + listWeek = json['List_Week']; + measured = json['Measured']; + measuredDesc = json['MeasuredDesc']; + monthAverageResult = json['MonthAverageResult']; + patientID = json['PatientID']; + remark = json['Remark']; + resultDesc = json['ResultDesc']; + resultValue = json['ResultValue']; + unit = json['Unit']; + weekAverageResult = json['WeekAverageResult']; + weekDesc = json['WeekDesc']; + yearAverageResult = json['YearAverageResult']; + } + + Map toJson() { + final Map data = new Map(); + data['ChartMonth'] = this.chartMonth; + data['ChartYear'] = this.chartYear; + data['DateChart'] = DateUtil.convertDateToString(this.dateChart); + data['Description'] = this.description; + data['DescriptionN'] = this.descriptionN; + data['DiabtecAvarage'] = this.diabtecAvarage; + data['IsActive'] = this.isActive; + data['LineItemNo'] = this.lineItemNo; + data['List_Month'] = this.listMonth; + data['List_Week'] = this.listWeek; + data['Measured'] = this.measured; + data['MeasuredDesc'] = this.measuredDesc; + data['MonthAverageResult'] = this.monthAverageResult; + data['PatientID'] = this.patientID; + data['Remark'] = this.remark; + data['ResultDesc'] = this.resultDesc; + data['ResultValue'] = this.resultValue; + data['Unit'] = this.unit; + data['WeekAverageResult'] = this.weekAverageResult; + data['WeekDesc'] = this.weekDesc; + data['YearAverageResult'] = this.yearAverageResult; + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart b/lib/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart new file mode 100644 index 00000000..65522098 --- /dev/null +++ b/lib/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart @@ -0,0 +1,36 @@ +class MonthDiabtectResultAverage { + var weekfourAverageResult; + var weekthreeAverageResult; + var weektwoAverageResult; + var weekoneAverageResult; + dynamic weekAverageResult; + String weekDesc; + + MonthDiabtectResultAverage( + {this.weekfourAverageResult, + this.weekthreeAverageResult, + this.weektwoAverageResult, + this.weekoneAverageResult, + this.weekAverageResult, + this.weekDesc}); + + MonthDiabtectResultAverage.fromJson(Map json) { + weekfourAverageResult = json['weekfourAverageResult']; + weekthreeAverageResult = json['weekthreeAverageResult']; + weektwoAverageResult = json['weektwoAverageResult']; + weekoneAverageResult = json['weekoneAverageResult']; + weekAverageResult = json['WeekAverageResult']; + weekDesc = json['WeekDesc']; + } + + Map toJson() { + final Map data = new Map(); + data['weekfourAverageResult'] = this.weekfourAverageResult; + data['weekthreeAverageResult'] = this.weekthreeAverageResult; + data['weektwoAverageResult'] = this.weektwoAverageResult; + data['weekoneAverageResult'] = this.weekoneAverageResult; + data['WeekAverageResult'] = this.weekAverageResult; + data['WeekDesc'] = this.weekDesc; + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart b/lib/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart new file mode 100644 index 00000000..c18e5433 --- /dev/null +++ b/lib/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart @@ -0,0 +1,20 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class WeekDiabtectResultAverage { + int dailyAverageResult; + DateTime dateChart; + + WeekDiabtectResultAverage({this.dailyAverageResult, this.dateChart}); + + WeekDiabtectResultAverage.fromJson(Map json) { + dailyAverageResult = json['DailyAverageResult']; + dateChart = DateUtil.convertStringToDate(json['DateChart']); + } + + Map toJson() { + final Map data = new Map(); + data['DailyAverageResult'] = this.dailyAverageResult; + data['DateChart'] = DateUtil.convertDateToString(this.dateChart); + return data; + } +} diff --git a/lib/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart b/lib/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart new file mode 100644 index 00000000..cfdec286 --- /dev/null +++ b/lib/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart @@ -0,0 +1,36 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class YearDiabtecResultAverage { + dynamic monthAverageResult; + var monthNumber; + String monthName; + String yearName; + DateTime date; + + YearDiabtecResultAverage( + {this.monthAverageResult, + this.monthNumber, + this.monthName, + this.yearName}); + + YearDiabtecResultAverage.fromJson(Map json) { + try { + monthAverageResult = json['monthAverageResult']; + monthNumber = json['monthNumber']; + monthName = json['monthName']; + yearName = json['yearName']; + date = DateUtil.getMonthDateTime(monthName,yearName); + } catch (e) { + print(e); + } + } + + Map toJson() { + final Map data = new Map(); + data['monthAverageResult'] = this.monthAverageResult; + data['monthNumber'] = this.monthNumber; + data['monthName'] = this.monthName; + data['yearName'] = this.yearName; + return data; + } +} diff --git a/lib/core/model/my_trakers/chartData/WeekChartDate.dart b/lib/core/model/my_trakers/chartData/WeekChartDate.dart new file mode 100644 index 00000000..d972265d --- /dev/null +++ b/lib/core/model/my_trakers/chartData/WeekChartDate.dart @@ -0,0 +1,6 @@ +class WeekChartDate { + final DateTime x; + final dynamic y; + + WeekChartDate({this.x, this.y}); +} \ No newline at end of file diff --git a/lib/core/model/my_trakers/chartData/YearMonthlyChartDate.dart b/lib/core/model/my_trakers/chartData/YearMonthlyChartDate.dart new file mode 100644 index 00000000..96adca21 --- /dev/null +++ b/lib/core/model/my_trakers/chartData/YearMonthlyChartDate.dart @@ -0,0 +1,6 @@ + class YearMonthlyChartDate { + final dynamic x; + final dynamic y; + + YearMonthlyChartDate({this.x, this.y}); +} diff --git a/lib/core/model/my_trakers/weight/MonthWeightMeasurementResultAverage.dart b/lib/core/model/my_trakers/weight/MonthWeightMeasurementResultAverage.dart new file mode 100644 index 00000000..8165302d --- /dev/null +++ b/lib/core/model/my_trakers/weight/MonthWeightMeasurementResultAverage.dart @@ -0,0 +1,36 @@ +class MonthWeightMeasurementResultAverage { + dynamic weekfourAverageResult; + dynamic weekthreeAverageResult; + dynamic weektwoAverageResult; + dynamic weekoneAverageResult; + dynamic weekAverageResult; + String weekDesc; + + MonthWeightMeasurementResultAverage( + {this.weekfourAverageResult, + this.weekthreeAverageResult, + this.weektwoAverageResult, + this.weekoneAverageResult, + this.weekAverageResult, + this.weekDesc}); + + MonthWeightMeasurementResultAverage.fromJson(Map json) { + weekfourAverageResult = json['weekfourAverageResult']; + weekthreeAverageResult = json['weekthreeAverageResult']; + weektwoAverageResult = json['weektwoAverageResult']; + weekoneAverageResult = json['weekoneAverageResult']; + weekAverageResult = json['WeekAverageResult']; + weekDesc = json['WeekDesc']; + } + + Map toJson() { + final Map data = new Map(); + data['weekfourAverageResult'] = this.weekfourAverageResult; + data['weekthreeAverageResult'] = this.weekthreeAverageResult; + data['weektwoAverageResult'] = this.weektwoAverageResult; + data['weekoneAverageResult'] = this.weekoneAverageResult; + data['WeekAverageResult'] = this.weekAverageResult; + data['WeekDesc'] = this.weekDesc; + return data; + } +} diff --git a/lib/core/model/my_trakers/weight/WeekWeightMeasurementResultAverage.dart b/lib/core/model/my_trakers/weight/WeekWeightMeasurementResultAverage.dart new file mode 100644 index 00000000..b7345ad7 --- /dev/null +++ b/lib/core/model/my_trakers/weight/WeekWeightMeasurementResultAverage.dart @@ -0,0 +1,21 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class WeekWeightMeasurementResultAverage { + dynamic dailyAverageResult; + DateTime weightDate; + + WeekWeightMeasurementResultAverage( + {this.dailyAverageResult, this.weightDate}); + + WeekWeightMeasurementResultAverage.fromJson(Map json) { + dailyAverageResult = json['DailyAverageResult']; + weightDate = DateUtil.convertStringToDate(json['WeightDate']); + } + + Map toJson() { + final Map data = new Map(); + data['DailyAverageResult'] = this.dailyAverageResult; + data['WeightDate'] = this.weightDate; + return data; + } +} diff --git a/lib/core/model/my_trakers/weight/WeightMeasurementResult.dart b/lib/core/model/my_trakers/weight/WeightMeasurementResult.dart new file mode 100644 index 00000000..337e8662 --- /dev/null +++ b/lib/core/model/my_trakers/weight/WeightMeasurementResult.dart @@ -0,0 +1,74 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class WeightMeasurementResult { + int patientID; + int lineItemNo; + int weightMeasured; + DateTime weightDate; + dynamic remark; + bool isActive; + int measured; + dynamic unit; + int chartYear; + dynamic chartMonth; + double yearAverageResult; + dynamic monthAverageResult; + dynamic weekAverageResult; + dynamic weekDesc; + + WeightMeasurementResult( + {this.patientID, + this.lineItemNo, + this.weightMeasured, + this.weightDate, + this.remark, + this.isActive, + this.measured, + this.unit, + this.chartYear, + this.chartMonth, + this.yearAverageResult, + this.monthAverageResult, + this.weekAverageResult, + this.weekDesc}); + + WeightMeasurementResult.fromJson(Map json) { + try { + patientID = json['PatientID']; + lineItemNo = json['LineItemNo']; + weightMeasured = json['WeightMeasured']; + weightDate = DateUtil.convertStringToDate(json['WeightDate']); + remark = json['Remark']; + isActive = json['IsActive']; + measured = json['Measured']; + unit = json['Unit']; + chartYear = json['ChartYear']; + chartMonth = json['ChartMonth']; + yearAverageResult = json['YearAverageResult']; + monthAverageResult = json['MonthAverageResult']; + weekAverageResult = json['WeekAverageResult']; + weekDesc = json['WeekDesc']; + } catch (e) { + print(e); + } + } + + Map toJson() { + final Map data = new Map(); + data['PatientID'] = this.patientID; + data['LineItemNo'] = this.lineItemNo; + data['WeightMeasured'] = this.weightMeasured; + data['WeightDate'] = this.weightDate; + data['Remark'] = this.remark; + data['IsActive'] = this.isActive; + data['Measured'] = this.measured; + data['Unit'] = this.unit; + data['ChartYear'] = this.chartYear; + data['ChartMonth'] = this.chartMonth; + data['YearAverageResult'] = this.yearAverageResult; + data['MonthAverageResult'] = this.monthAverageResult; + data['WeekAverageResult'] = this.weekAverageResult; + data['WeekDesc'] = this.weekDesc; + return data; + } +} diff --git a/lib/core/model/my_trakers/weight/YearWeightMeasurementResultAverage.dart b/lib/core/model/my_trakers/weight/YearWeightMeasurementResultAverage.dart new file mode 100644 index 00000000..c2e20cb9 --- /dev/null +++ b/lib/core/model/my_trakers/weight/YearWeightMeasurementResultAverage.dart @@ -0,0 +1,33 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class YearWeightMeasurementResultAverage { + dynamic monthAverageResult; + int monthNumber; + String monthName; + String yearName; + DateTime date; + + YearWeightMeasurementResultAverage( + {this.monthAverageResult, + this.monthNumber, + this.monthName, + this.yearName}); + + YearWeightMeasurementResultAverage.fromJson(Map json) { + monthAverageResult = json['monthAverageResult']; + monthNumber = json['monthNumber']; + monthName = json['monthName']; + yearName = json['yearName']; + date = DateUtil.getMonthDateTime(monthName,yearName); + + } + + Map toJson() { + final Map data = new Map(); + data['monthAverageResult'] = this.monthAverageResult; + data['monthNumber'] = this.monthNumber; + data['monthName'] = this.monthName; + data['yearName'] = this.yearName; + return data; + } +} diff --git a/lib/core/service/medical/BloodPressureService.dart b/lib/core/service/medical/BloodPressureService.dart new file mode 100644 index 00000000..048c98e9 --- /dev/null +++ b/lib/core/service/medical/BloodPressureService.dart @@ -0,0 +1,100 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPressureResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/MonthBloodPressureResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/WeekBloodPressureResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/YearBloodPressureResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class BloodPressureService extends BaseService { + List monthDiabtectResultAverageList = List(); + List weekDiabtectResultAverageList = List(); + List yearDiabtecResultAverageList = List(); + + ///Result + List monthDiabtecPatientResult = List(); + List weekDiabtecPatientResult = List(); + List yearDiabtecPatientResult = List(); + + Future getBloodSugar() async { + hasError = false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(GET_BLOOD_PRESSURE_RESULT_AVERAGE, + onSuccess: (dynamic response, int statusCode) { + monthDiabtectResultAverageList.clear(); + weekDiabtectResultAverageList.clear(); + yearDiabtecResultAverageList.clear(); + response['List_MonthBloodPressureResultAverage'].forEach((item) { + monthDiabtectResultAverageList + .add(MonthBloodPressureResultAverage.fromJson(item)); + }); + + response['List_WeekBloodPressureResultAverage'].forEach((item) { + weekDiabtectResultAverageList + .add(WeekBloodPressureResultAverage.fromJson(item)); + }); + + response['List_YearBloodPressureResultAverage'].forEach((item) { + yearDiabtecResultAverageList + .add(YearBloodPressureResultAverage.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future getDiabtecResults() async { + hasError = false; + await baseAppClient.post(GET_BLOOD_PRESSURE_RESULT, + onSuccess: (dynamic response, int statusCode) { + monthDiabtecPatientResult.clear(); + weekDiabtecPatientResult.clear(); + yearDiabtecPatientResult.clear(); + + response['List_WeekBloodPressureResult'].forEach((item) { + weekDiabtecPatientResult.add(BloodPressureResult.fromJson(item)); + }); + + response['List_MonthBloodPressureResult'].forEach((item) { + monthDiabtecPatientResult.add(BloodPressureResult.fromJson(item)); + }); + + response['List_YearBloodPressureResult'].forEach((item) { + yearDiabtecPatientResult.add(BloodPressureResult.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map()); + } + + addDiabtecResult( + {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(ADD_BLOOD_PRESSURE_RESULT, + onSuccess: (response, statusCode) async { + + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/service/medical/BloodSugarService.dart b/lib/core/service/medical/BloodSugarService.dart new file mode 100644 index 00000000..09fe9fe9 --- /dev/null +++ b/lib/core/service/medical/BloodSugarService.dart @@ -0,0 +1,96 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class BloodSugarService extends BaseService { + List monthDiabtectResultAverageList = List(); + List weekDiabtectResultAverageList = List(); + List yearDiabtecResultAverageList = List(); + + ///Result + List monthDiabtecPatientResult = List(); + List weekDiabtecPatientResult = List(); + List yearDiabtecPatientResult = List(); + + Future getBloodSugar() async { + hasError = false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(GET_DIABETIC_RESULT_AVERAGE, + onSuccess: (dynamic response, int statusCode) { + monthDiabtectResultAverageList.clear(); + weekDiabtectResultAverageList.clear(); + yearDiabtecResultAverageList.clear(); + response['List_MonthDiabtectResultAverage'].forEach((item) { + monthDiabtectResultAverageList + .add(MonthDiabtectResultAverage.fromJson(item)); + }); + + response['List_WeekDiabtectResultAverage'].forEach((item) { + weekDiabtectResultAverageList + .add(WeekDiabtectResultAverage.fromJson(item)); + }); + + response['List_YearDiabtecResultAverage'].forEach((item) { + yearDiabtecResultAverageList + .add(YearDiabtecResultAverage.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future getDiabtecResults() async { + hasError = false; + await baseAppClient.post(GET_DIABTEC_RESULT, + onSuccess: (dynamic response, int statusCode) { + monthDiabtecPatientResult.clear(); + weekDiabtecPatientResult.clear(); + yearDiabtecPatientResult.clear(); + + response['List_MonthDiabtecPatientResult'].forEach((item) { + monthDiabtecPatientResult.add(DiabtecPatientResult.fromJson(item)); + }); + + response['List_WeekDiabtecPatientResult'].forEach((item) { + weekDiabtecPatientResult.add(DiabtecPatientResult.fromJson(item)); + }); + + response['List_YearDiabtecPatientResult'].forEach((item) { + yearDiabtecPatientResult.add(DiabtecPatientResult.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map()); + } + + addDiabtecResult( + {String bloodSugerDateChart, + String bloodSugerResult, + String diabtecUnit, + int measuredTime}) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['BloodSugerDateChart'] = bloodSugerDateChart; + body['BloodSugerResult'] = bloodSugerResult; + body['DiabtecUnit'] = diabtecUnit; + body['MeasuredTime'] =2;// measuredTime; + body['isDentalAllowedBackend'] = false; + + await baseAppClient.post(ADD_BLOOD_PRESSURE_RESULT, + onSuccess: (response, statusCode) async { + var asd =""; + }, + 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 new file mode 100644 index 00000000..006de821 --- /dev/null +++ b/lib/core/service/medical/WeightPressureService.dart @@ -0,0 +1,104 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/BloodPressureResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/MonthBloodPressureResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/WeekBloodPressureResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_pressur/YearBloodPressureResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/MonthDiabtectResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/WeekDiabtectResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/YearDiabtecResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/weight/MonthWeightMeasurementResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/weight/WeekWeightMeasurementResultAverage.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/weight/YearWeightMeasurementResultAverage.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class WeightService extends BaseService { + + ///Average + List monthWeightMeasurementResultAverage = List(); + List weekWeightMeasurementResultAverage = List(); + List yearWeightMeasurementResultAverage = List(); + + ///Result + List monthWeightMeasurementResult = List(); + List weekWeightMeasurementResult = List(); + List yearWeightMeasurementResult = List(); + + Future getWeightAverage() async { + hasError = false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(GET_WEIGHT_PRESSURE_RESULT_AVERAGE, + onSuccess: (dynamic response, int statusCode) { + monthWeightMeasurementResultAverage.clear(); + weekWeightMeasurementResultAverage.clear(); + yearWeightMeasurementResultAverage.clear(); + response['List_MonthWeightMeasurementResultAverage'].forEach((item) { + monthWeightMeasurementResultAverage + .add(MonthWeightMeasurementResultAverage.fromJson(item)); + }); + + response['List_WeekWeightMeasurementResultAverage'].forEach((item) { + weekWeightMeasurementResultAverage + .add(WeekWeightMeasurementResultAverage.fromJson(item)); + }); + + response['List_YearWeightMeasurementResultAverage'].forEach((item) { + yearWeightMeasurementResultAverage + .add(YearWeightMeasurementResultAverage.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future getWeightMeasurementResult() async { + hasError = false; + await baseAppClient.post(GET_WEIGHT_PRESSURE_RESULT, + onSuccess: (dynamic response, int statusCode) { + monthWeightMeasurementResult.clear(); + weekWeightMeasurementResult.clear(); + yearWeightMeasurementResult.clear(); + + response['List_WeekWeightMeasurementResult'].forEach((item) { + weekWeightMeasurementResult.add(WeightMeasurementResult.fromJson(item)); + }); + + response['List_MonthWeightMeasurementResult'].forEach((item) { + monthWeightMeasurementResult.add(WeightMeasurementResult.fromJson(item)); + }); + + response['List_YearWeightMeasurementResult'].forEach((item) { + yearWeightMeasurementResult.add(WeightMeasurementResult.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map()); + } + + addWeightResult( + {String weightDate, + String weightMeasured, + int weightUnit}) async { + hasError = false; + super.error = ""; + + Map body = Map(); + body['WeightDate'] = weightDate; + body['WeightMeasured'] = weightMeasured; + body['weightUnit'] = weightUnit; + body['isDentalAllowedBackend'] = false; + + await baseAppClient.post(ADD_WEIGHT_PRESSURE_RESULT, + onSuccess: (response, statusCode) async { + + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/base_view_model.dart b/lib/core/viewModels/base_view_model.dart index 74899fae..8e228512 100644 --- a/lib/core/viewModels/base_view_model.dart +++ b/lib/core/viewModels/base_view_model.dart @@ -18,6 +18,8 @@ class BaseViewModel extends ChangeNotifier { void setState(ViewState viewState) { _state = viewState; + // this.removeListener(() { }); + if(hasListeners) notifyListeners(); } @@ -34,4 +36,10 @@ class BaseViewModel extends ChangeNotifier { notifyListeners(); } + + @override + void dispose() { + removeListener(() { }); + super.dispose(); + } } diff --git a/lib/core/viewModels/medical/blood_pressure_view_model.dart b/lib/core/viewModels/medical/blood_pressure_view_model.dart new file mode 100644 index 00000000..dfff5b45 --- /dev/null +++ b/lib/core/viewModels/medical/blood_pressure_view_model.dart @@ -0,0 +1,151 @@ +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 '../../../core/viewModels/base_view_model.dart'; + +class BloodPressureViewMode extends BaseViewModel { + BloodPressureService bloodPressureService = locator(); + + ///BLOOD + List _bloodDiastolicPressureWeeklyTimeSeriesSalesList = List(); + List _bloodSystolicePressureWeeklyTimeSeriesSalesList = List(); + + List _bloodDiastolicMonthlyTimeSeriesSalesList = List(); + List _bloodSystolicMonthlyTimeSeriesSalesList = List(); + + List _bloodSystoliceYearTimeSeriesSalesList = List(); + List _bloodDiastolicYearTimeSeriesSalesList = List(); + + List get monthDiabtecPatientResult => bloodPressureService.monthDiabtecPatientResult; + + List get weekDiabtecPatientResult => bloodPressureService.weekDiabtecPatientResult; + + List get yearDiabtecPatientResult => bloodPressureService.yearDiabtecPatientResult; + + Future getBloodPressure() async { + setState(ViewState.Busy); + await bloodPressureService.getBloodSugar(); + await bloodPressureService.getDiabtecResults(); + if (bloodPressureService.hasError) { + error = bloodPressureService.error; + setState(ViewState.Error); + } else { + bloodPressureService.weekDiabtectResultAverageList.forEach((element) { + _bloodDiastolicPressureWeeklyTimeSeriesSalesList.add(WeekChartDate( + x: element.bloodPressureDate, + y: element.dailyDiastolicPressureAverageResult)); + _bloodSystolicePressureWeeklyTimeSeriesSalesList.add(WeekChartDate( + x: element.bloodPressureDate, + y: element.dailySystolicePressureAverageResult)); + }); + + 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)); + }); + + 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, + ), + ]; + } + + 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, + ) + ]; + } + + addDiabtecResult( + {String bloodPressureDate, + String diastolicPressure, + String systolicePressure, + int measuredArm}) async { + setState(ViewState.BusyLocal); + await bloodPressureService.addDiabtecResult( + bloodPressureDate: bloodPressureDate, + diastolicPressure: diastolicPressure, + systolicePressure: systolicePressure, + measuredArm: measuredArm); + if (bloodPressureService.hasError) { + error = bloodPressureService.error; + setState(ViewState.Error); + } else { + await getBloodPressure(); + setState(ViewState.Idle); + } + } +} diff --git a/lib/core/viewModels/medical/blood_sugar_view_model.dart b/lib/core/viewModels/medical/blood_sugar_view_model.dart new file mode 100644 index 00000000..fb00f80e --- /dev/null +++ b/lib/core/viewModels/medical/blood_sugar_view_model.dart @@ -0,0 +1,119 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.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/BloodSugarService.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:charts_flutter/flutter.dart' as charts; + +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; + + List get weekDiabtecPatientResult => + bloodSugarService.weekDiabtecPatientResult; + + List get yearDiabtecPatientResult => + bloodSugarService.yearDiabtecPatientResult; + + Future getBloodSugar() async { + setState(ViewState.Busy); + await bloodSugarService.getBloodSugar(); + await bloodSugarService.getDiabtecResults(); + if (bloodSugarService.hasError) { + error = bloodSugarService.error; + setState(ViewState.Error); + } else { + bloodSugarService.weekDiabtectResultAverageList.forEach((element) { + _bloodWeeklyTimeSeriesSalesList.add( + WeekChartDate(x: element.dateChart, y: element.dailyAverageResult)); + }); + + for (int index = 0; + index < bloodSugarService.monthDiabtectResultAverageList.length; + index++) { + _bloodMonthlyTimeSeriesSalesList.add(YearMonthlyChartDate( + x: index, + y: bloodSugarService + .monthDiabtectResultAverageList[index].weekAverageResult)); + var asd=""; + } + + bloodSugarService.yearDiabtecResultAverageList.forEach((element) { + _bloodYearTimeSeriesSalesList + .add(WeekChartDate(x: element.date, y: element.monthAverageResult)); + }); + + 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, + ) + ]; + } + + addDiabtecResult( + {String bloodSugerDateChart, + String bloodSugerResult, + String diabtecUnit, + int measuredTime}) async { + setState(ViewState.BusyLocal); + await bloodSugarService.addDiabtecResult( + bloodSugerDateChart: bloodSugerDateChart, + bloodSugerResult: bloodSugerResult , + diabtecUnit: diabtecUnit, + measuredTime: measuredTime); + if (bloodSugarService.hasError) { + error = bloodSugarService.error; + setState(ViewState.Error); + } 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 new file mode 100644 index 00000000..29095895 --- /dev/null +++ b/lib/core/viewModels/medical/weight_pressure_view_model.dart @@ -0,0 +1,113 @@ +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/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/core/service/medical/BloodPressureService.dart'; +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 '../../../core/viewModels/base_view_model.dart'; + +class WeightPressureViewMode extends BaseViewModel { + WeightService weightService = locator(); + + List _weightWeeklyTimeSeriesSalesList = List(); + List _weightMonthlyTimeSeriesSalesList = List(); + List _weightYearTimeSeriesSalesList = List(); + + List get monthWeightMeasurementResult => + weightService.monthWeightMeasurementResult; + + List get weekWeightMeasurementResult => + weightService.weekWeightMeasurementResult; + + List get yearWeightMeasurementResult => + weightService.yearWeightMeasurementResult; + + Future getWeight() async { + setState(ViewState.Busy); + await weightService.getWeightAverage(); + await weightService.getWeightMeasurementResult(); + if (weightService.hasError) { + error = weightService.error; + setState(ViewState.Error); + } else { + weightService.weekWeightMeasurementResultAverage.forEach((element) { + _weightWeeklyTimeSeriesSalesList.add(WeekChartDate( + x: element.weightDate, y: element.dailyAverageResult)); + }); + + for (int index = 0; + index < weightService.monthWeightMeasurementResultAverage.length; + index++) { + _weightMonthlyTimeSeriesSalesList.add(YearMonthlyChartDate( + x: index, + y: weightService.monthWeightMeasurementResultAverage[index].weekAverageResult)); + } + + weightService.yearWeightMeasurementResultAverage.forEach((element) { + _weightYearTimeSeriesSalesList + .add(WeekChartDate(x: element.date, y: element.monthAverageResult)); + }); + + 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, + ), + ]; + } + + List> getWeightYearTimeSeriesSales() { + return [ + charts.Series( + id: 'Sales', + colorFn: (_, __) => charts.MaterialPalette.red.shadeDefault, + domainFn: (WeekChartDate sales, _) => sales.x, + measureFn: (WeekChartDate sales, _) => sales.y, + data: _weightYearTimeSeriesSalesList, + ), + ]; + } + + 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); + } + } +} diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index 5975daf2..ea06c8ad 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -3,8 +3,10 @@ import 'dart:async'; import 'package:connectivity/connectivity.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:flutter/cupertino.dart'; +import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; class ProjectViewModel extends BaseViewModel { AppSharedPreferences sharedPref = AppSharedPreferences(); @@ -19,7 +21,9 @@ class ProjectViewModel extends BaseViewModel { dynamic get searchValue => searchvalue; Locale get appLocal => _appLocale; + LocaleType get localeType => isArabic? LocaleType.en:LocaleType.ar; bool get isArabic => _isArabic; + // BaseViewModel baseViewModel = locator() StreamSubscription subscription; ProjectViewModel() { diff --git a/lib/locator.dart b/lib/locator.dart index 93715c99..6c27dfe0 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -9,7 +9,10 @@ import 'core/service/er/am_service.dart'; import 'core/service/er/er_service.dart'; import 'core/service/feedback/feedback_service.dart'; import 'core/service/hospital_service.dart'; +import 'core/service/medical/BloodPressureService.dart'; +import 'core/service/medical/BloodSugarService.dart'; import 'core/service/medical/PatientSickLeaveService.dart'; +import 'core/service/medical/WeightPressureService.dart'; import 'core/service/medical/labs_service.dart'; import 'core/service/medical/medical_service.dart'; import 'core/service/medical/my_balance_service.dart'; @@ -24,16 +27,19 @@ import 'core/viewModels/er/near_hospital_view_model.dart'; import 'core/viewModels/feedback/feedback_view_model.dart'; import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; +import 'core/viewModels/medical/blood_pressure_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart'; import 'core/viewModels/medical/medical_view_model.dart'; import 'core/viewModels/medical/my_balance_view_model.dart'; import 'core/viewModels/medical/my_doctor_view_model.dart'; +import 'core/viewModels/medical/blood_sugar_view_model.dart'; import 'core/viewModels/medical/patient_sick_leave_view_model.dart'; import 'core/viewModels/medical/prescriptions_view_model.dart'; import 'core/viewModels/medical/radiology_view_model.dart'; import 'core/viewModels/medical/reports_monthly_view_model.dart'; import 'core/viewModels/medical/vital_sign_view_model.dart'; import 'core/viewModels/medical/reports_view_model.dart'; +import 'core/viewModels/medical/weight_pressure_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; @@ -66,10 +72,11 @@ void setupLocator() { locator.registerLazySingleton(() => ReportsMonthlyService()); locator.registerLazySingleton(() => ErService()); locator.registerLazySingleton(() => AmService()); - - locator.registerLazySingleton(() => PatientSickLeaveService()); locator.registerLazySingleton(() => MyBalanceService()); + locator.registerLazySingleton(() => BloodSugarService()); + locator.registerLazySingleton(() => BloodPressureService()); + locator.registerLazySingleton(() => WeightService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -92,5 +99,8 @@ void setupLocator() { locator.registerFactory(() => AmRequestViewModel()); locator.registerFactory(() => PatientSickLeaveViewMode()); locator.registerFactory(() => MyBalanceViewModel()); + locator.registerFactory(() => BloodSugarViewMode()); + locator.registerFactory(() => BloodPressureViewMode()); + locator.registerFactory(() => WeightPressureViewMode()); } diff --git a/lib/pages/base/base_view.dart b/lib/pages/base/base_view.dart index f6853123..6014b6c3 100644 --- a/lib/pages/base/base_view.dart +++ b/lib/pages/base/base_view.dart @@ -38,7 +38,10 @@ class _BaseViewState extends State> { @override void dispose() { - if (model != null) model = null; + if (model != null) { + model = null; + } + super.dispose(); } } diff --git a/lib/pages/medical/balance/dialogs/SelectPatientFamilyDialog.dart b/lib/pages/medical/balance/dialogs/SelectPatientFamilyDialog.dart index 5808aed8..bb9afd6c 100644 --- a/lib/pages/medical/balance/dialogs/SelectPatientFamilyDialog.dart +++ b/lib/pages/medical/balance/dialogs/SelectPatientFamilyDialog.dart @@ -1,5 +1,3 @@ -import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; -import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 678ede88..85bd0e95 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -29,6 +29,7 @@ import 'doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; import 'labs/labs_home_page.dart'; +import 'my_trackers/my_trackers.dart'; class MedicalProfilePage extends StatefulWidget { @override @@ -414,10 +415,10 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( -// onTap: () { -// Navigator.push( -// context, FadePage(page: InsuranceApproval())); -// }, + onTap: () { + Navigator.push(context, + FadePage(page: MyTrackers())); + }, child: MedicalProfileItem( title: TranslationBase.of(context) .myTrackers, diff --git a/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart b/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart new file mode 100644 index 00000000..a7b23191 --- /dev/null +++ b/lib/pages/medical/my_trackers/Weight/AddWeightPage.dart @@ -0,0 +1,204 @@ +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/date_uitl.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/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 { + @override + _AddWeightPageState createState() => _AddWeightPageState(); +} + +class _AddWeightPageState extends State { + TextEditingController _weightValueController = TextEditingController(); + DateTime bloodSugarDate = DateTime.now(); + DateTime timeSugarDate = DateTime.now(); + int weightUnit = 1; + final List measureUnitEnList = [ + 'Kg', + 'Pound', + ]; + final List measureUnitArList = [ + 'Kg', + 'Pound', + ]; + String measureTimeSelectedType = 'Kg'; + + + @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); + }, + 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(() { + 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()), + ], + ), + ), + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker(context, showTitleActions: true, + onConfirm: (date) { + print('confirm $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())], + ), + ), + ), + ], + ), + ), + ), + 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', + weightMeasured: _weightValueController.text.toString(), + weightUnit: weightUnit, + ); + } + }), + ), + ), + ), + ); + } + + String getDate() { + return "${DateUtil.getMonth(bloodSugarDate.month)} ${bloodSugarDate.day}, ${bloodSugarDate.year}"; + } + + String getTime() { + return " ${timeSugarDate.hour}:${timeSugarDate.minute}"; + } + + void confirmSelectMeasureTimeDialog(List list) { + showDialog( + context: context, + child: RadioStringDialog( + radioList: list, + title: 'Measure unit', + selectedValue: measureTimeSelectedType, + onValueSelected: (value) { + setState(() { + measureTimeSelectedType = value; + weightUnit = list.indexOf(value); + }); + }, + ), + ); + } +} diff --git a/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart b/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart new file mode 100644 index 00000000..7d7c5dd5 --- /dev/null +++ b/lib/pages/medical/my_trackers/Weight/WeightHomePage.dart @@ -0,0 +1,151 @@ +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/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'; +import 'WeightWeeklyPage.dart'; + +class WeightHomePage extends StatefulWidget { + @override + _WeightHomePageState createState() => _WeightHomePageState(); +} + +class _WeightHomePageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getWeight(), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: '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.label, + 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'), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + WeightWeeklyPage( + data: model.getWeightWeeklySeries(), + diabtecPatientResult: model.weekWeightMeasurementResult, + ), + WeightMonthlyPage( + data: model.getWeightMonthlyTimeSeriesSales(), + diabtecPatientResult: model.monthWeightMeasurementResult, + ), + WeightYearPage( + data: model.getWeightYearTimeSeriesSales(), + diabtecPatientResult: model.yearWeightMeasurementResult, + ) + ], + ), + ) + ], + ), + floatingActionButton: InkWell( + onTap: () { + Navigator.push(context, FadePage(page: AddWeightPage())); + }, + child: Container( + width: 55, + height: 55, + decoration: BoxDecoration( + shape: BoxShape.circle, color: Hexcolor('515B5D')), + child: Center( + child: Icon( + Icons.add, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart b/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart new file mode 100644 index 00000000..5bdbfeab --- /dev/null +++ b/lib/pages/medical/my_trackers/Weight/WeightMonthlyPage.dart @@ -0,0 +1,155 @@ +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/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.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'; + +class WeightMonthlyPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const WeightMonthlyPage( + {Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext 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)), + ), + SizedBox( + height: 12, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Time', color: Colors.white,fontSize: 15,), + ), + height: 40), + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Value', color: Colors.white,fontSize: 15,), + ), + height: 40), + ], + ), + ); + diabtecPatientResult.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.weightDate)} ', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.weightDate.hour}:${diabtec.weightDate.minute}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.weightMeasured}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart b/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart new file mode 100644 index 00000000..ac1a3214 --- /dev/null +++ b/lib/pages/medical/my_trackers/Weight/WeightWeeklyPage.dart @@ -0,0 +1,170 @@ +import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.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'; + +class WeightWeeklyPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const WeightWeeklyPage({Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + Container( + width: double.maxFinite, + height: 180, + color: Colors.white, + child: charts.TimeSeriesChart( + data, + dateTimeFactory: const charts.LocalDateTimeFactory(), + ), + ), + SizedBox(height: 12,), + + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Time', color: Colors.white,fontSize: 15,), + ), + height: 40), + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Value', color: Colors.white,fontSize: 15,), + ), + height: 40), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts('Edit', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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.weightDate)} ', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.weightDate.hour}:${diabtec.weightDate.minute}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.weightMeasured}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Icon(Icons.edit), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart b/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart new file mode 100644 index 00000000..3ddeaa82 --- /dev/null +++ b/lib/pages/medical/my_trackers/Weight/WeightYeaPage.dart @@ -0,0 +1,153 @@ +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/weight/WeightMeasurementResult.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.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'; + +class WeightYearPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const WeightYearPage({Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + Container( + width: double.maxFinite, + height: 180, + color: Colors.white, + child: charts.TimeSeriesChart( + data, + dateTimeFactory: const charts.LocalDateTimeFactory(), + ), + ), + SizedBox( + height: 12, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Time', color: Colors.white,fontSize: 15,), + ), + height: 40), + Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Value', color: Colors.white,fontSize: 15,), + ), + height: 40), + ], + ), + ); + diabtecPatientResult.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.weightDate)} ', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.weightDate.hour}:${diabtec.weightDate.minute}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.weightMeasured}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart b/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart new file mode 100644 index 00000000..b8d9a557 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_pressure/AddBloodPressurePage.dart @@ -0,0 +1,215 @@ +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/date_uitl.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/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 { + @override + _AddBloodPressurePageState createState() => _AddBloodPressurePageState(); +} + +class _AddBloodPressurePageState extends State { + TextEditingController _bloodSystolicValueController = TextEditingController(); + TextEditingController _bloodDiastolicValueController = + TextEditingController(); + DateTime bloodSugarDate = DateTime.now(); + DateTime timeSugarDate = DateTime.now(); + int measuredArm = 1; + final List measureTimeEnList = [ + 'Left Arm', + 'Right Arm', + ]; + final List measureTimeArList = [ + 'الذراع الأيسر', + 'الذراع الأيمن', + ]; + String measureTimeSelectedType = 'Left Arm'; + + + @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, + ) + ], + ), + ), + ), + 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(() { + 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()), + ], + ), + ), + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker(context, showTitleActions: true, + onConfirm: (date) { + print('confirm $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())], + ), + ), + ), + ], + ), + ), + ), + 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, + ); + } + }), + ), + ), + ), + ); + } + + String getDate() { + return "${DateUtil.getMonth(bloodSugarDate.month)} ${bloodSugarDate.day}, ${bloodSugarDate.year}"; + } + + String getTime() { + return " ${timeSugarDate.hour}:${timeSugarDate.minute}"; + } + + void confirmSelectMeasureTimeDialog(List list) { + showDialog( + context: context, + child: RadioStringDialog( + radioList: list, + title: 'Select the Arm', + selectedValue: measureTimeSelectedType, + onValueSelected: (value) { + setState(() { + measureTimeSelectedType = value; + measuredArm = list.indexOf(value); + }); + }, + ), + ); + } +} diff --git a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart new file mode 100644 index 00000000..c118f2ca --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureHomePage.dart @@ -0,0 +1,154 @@ +import 'dart:ui'; + +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/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'; +import 'bloodPressureWeeklyPage.dart'; + +class BloodPressureHomePage extends StatefulWidget { + @override + _BloodPressureHomePageState createState() => _BloodPressureHomePageState(); +} + +class _BloodPressureHomePageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getBloodPressure(), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Blood Pressure', + 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.label, + 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'), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + BloodPressureWeeklyPage( + data: model.getBloodWeeklySeries(), + diabtecPatientResult: model.weekDiabtecPatientResult, + ), + BloodPressureMonthlyPage( + data: model.getBloodMonthlyTimeSeriesSales(), + diabtecPatientResult: model.monthDiabtecPatientResult, + ), + BloodPressureYearPage( + data: model.getBloodYearTimeSeriesSales(), + diabtecPatientResult: model.yearDiabtecPatientResult, + ) + ], + ), + ) + ], + ), + floatingActionButton: InkWell( + onTap: () { + Navigator.push(context, FadePage(page: AddBloodPressurePage())); + }, + child: Container( + width: 55, + height: 55, + decoration: BoxDecoration( + shape: BoxShape.circle, color: Hexcolor('515B5D')), + child: Center( + child: Icon( + Icons.add, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart new file mode 100644 index 00000000..f38cc3b6 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureMonthly.dart @@ -0,0 +1,200 @@ +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/uitl/date_uitl.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'; + +class BloodPressureMonthlyPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const BloodPressureMonthlyPage( + {Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext 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)), + ), + SizedBox( + height: 12, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts( + 'Time', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts( + 'Measured', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Value', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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, + ), + ), + ), + ), + 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, + ), + ), + ),), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.measuredArmDesc}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + 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, + ), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart new file mode 100644 index 00000000..dfcf42ae --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_pressure/BloodPressureYeaPage.dart @@ -0,0 +1,199 @@ +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/uitl/date_uitl.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'; + +class BloodPressureYearPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const BloodPressureYearPage({Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + Container( + width: double.maxFinite, + height: 180, + color: Colors.white, + child: charts.TimeSeriesChart( + data, + dateTimeFactory: const charts.LocalDateTimeFactory(), + ), + ), + SizedBox( + height: 12, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts( + 'Time', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts( + 'Measured', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Value', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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, + ), + ), + ), + ), + 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, + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.measuredArmDesc}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + 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, + ), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart b/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart new file mode 100644 index 00000000..fbcbf417 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_pressure/bloodPressureWeeklyPage.dart @@ -0,0 +1,204 @@ +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/uitl/date_uitl.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'; + +class BloodPressureWeeklyPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const BloodPressureWeeklyPage({Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + Container( + width: double.maxFinite, + height: 180, + color: Colors.white, + child: charts.TimeSeriesChart( + data, + dateTimeFactory: const charts.LocalDateTimeFactory(), + ), + ), + SizedBox(height: 12,), + + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Time', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Measured', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Value', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts('Edit', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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, + ), + ), + ), + ), + 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, + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.measuredArmDesc}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + 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, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Icon(Icons.edit), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart b/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart new file mode 100644 index 00000000..00f06a25 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_suger/AddBloodSugarPage.dart @@ -0,0 +1,344 @@ +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/date_uitl.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/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 AddBloodSugarPage extends StatefulWidget { + @override + _AddBloodSugarPageState createState() => _AddBloodSugarPageState(); +} + +class _AddBloodSugarPageState extends State { + TextEditingController _bloodSugarValueController = TextEditingController(); + DateTime bloodSugarDate = DateTime.now(); + DateTime timeSugarDate = DateTime.now(); + String measureUnitSelectedType = 'mg/dlt'; + int measuredTime=1; + final List measureUnitList = ['mg/dlt', 'mol/L']; + final List measureTimeEnList = [ + 'Before Breakfast', + 'After Breakfast', + 'Before Lunch', + 'After Lunch', + 'Before Dinner', + 'After Dinner', + 'Before Sleep', + 'After Sleep', + 'Fasting', + 'Other', + ]; + final List measureTimeArList = [ + 'Before Breakfast', + 'After Breakfast', + 'Before Lunch', + 'After Lunch', + 'Before Dinner', + 'After Dinner', + 'Before Sleep', + 'After Sleep', + 'Fasting', + 'Other', + ]; + String measureTimeSelectedType; + + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + showTaskOptions() { + showModalBottomSheet( + backgroundColor: Colors.white, + context: context, + builder: (BuildContext bc) { + return Container( + padding: EdgeInsets.symmetric(vertical: 12.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(16.0))), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(3.0)), + width: 40.0, + height: 6.0, + ), + InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 18.0, vertical: 18.0), + child: Row( + children: [ + Icon( + FeatherIcons.share, + color: Theme + .of(context) + .primaryColor, + size: 18.0, + ), + SizedBox(width: 24.0), + Texts('Share Task', + variant: "body2Link", color: Colors.grey[800]), + ], + ), + ), + ), + InkWell( + onTap: () { + Navigator.pop(context); + // Navigator.of(context).push(SlideUpPageRoute(widget: PostTaskIndex(task: new Task(category: task?.category, description: task?.description, title: task?.title)))); + }, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: 18.0, vertical: 18.0), + child: Row( + children: [ + Icon( + FeatherIcons.copy, + color: Theme + .of(context) + .primaryColor, + size: 18.0, + ), + SizedBox(width: 24.0), + Texts('Post Similar Task', + variant: "body2Link", color: Colors.grey[800]), + ], + ), + ), + ), + ], + ), + ); + }); + } + + 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 Blood Sugar Value', + controller: _bloodSugarValueController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + confirmSelectMeasureUnitDialog(); + }, + 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(measureUnitSelectedType), + 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(() { + 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()), + ], + ), + ), + ), + SizedBox( + height: 8, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker( + context, showTitleActions: true, + onConfirm: (date) { + print('confirm $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())], + ), + ), + ), + 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 ?? 'Others'), + Icon( + Icons.arrow_drop_down, + color: Colors.grey, + ) + ], + ), + ), + ), + ], + ), + ), + ), + 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 (_bloodSugarValueController.text.isNotEmpty) { + model.addDiabtecResult(diabtecUnit: measureUnitSelectedType, + measuredTime: measuredTime, + bloodSugerResult:_bloodSugarValueController.text.toString(), + bloodSugerDateChart: '${bloodSugarDate.year}-${bloodSugarDate.month}-${bloodSugarDate.day} ${timeSugarDate.hour}:${timeSugarDate.minute}:00', + + ); + } + }), + ), + ), + ), + ); + } + + String getDate() { + return "${DateUtil.getMonth(bloodSugarDate.month)} ${bloodSugarDate + .day}, ${bloodSugarDate.year}"; + } + + String getTime() { + return " ${timeSugarDate.hour}:${timeSugarDate.minute}"; + } + + void confirmSelectMeasureUnitDialog() { + showDialog( + context: context, + child: RadioStringDialog( + radioList: measureUnitList, + title: 'Measure unit', + selectedValue: measureUnitSelectedType, + onValueSelected: (value) { + setState(() { + measureUnitSelectedType = value; + }); + }, + ), + ); + } + + void confirmSelectMeasureTimeDialog(List list) { + showDialog( + context: context, + child: RadioStringDialog( + radioList: list, + title: 'Measure time', + selectedValue: measureTimeSelectedType, + onValueSelected: (value) { + setState(() { + measureTimeSelectedType = value; + measuredTime = list.indexOf(value); + }); + }, + ), + ); + } +} diff --git a/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart b/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart new file mode 100644 index 00000000..da31c4ed --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_suger/BloodMonthly.dart @@ -0,0 +1,188 @@ + +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/uitl/date_uitl.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'; + +class BloodMonthlyPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const BloodMonthlyPage({Key key, this.data,this.diabtecPatientResult}) : super(key: key); + @override + Widget build(BuildContext 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) + ), + ), + SizedBox(height: 12,), + + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Time', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Measured', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts('Value', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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.dateChart)} ', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.dateChart.hour}:${diabtec.dateChart.minute}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.measuredDesc}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.resultValue}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart b/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart new file mode 100644 index 00000000..3bddab88 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_suger/BloodYeaPage.dart @@ -0,0 +1,199 @@ +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.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'; + +class BloodYearPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const BloodYearPage({Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + Container( + width: double.maxFinite, + height: 180, + color: Colors.white, + child: charts.TimeSeriesChart( + data, + dateTimeFactory: const charts.LocalDateTimeFactory(), + ), + ), + SizedBox( + height: 12, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts( + 'Time', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts( + 'Measured', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Value', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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.dateChart)} ', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.dateChart.hour}:${diabtec.dateChart.minute}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.measuredDesc}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.resultValue}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} 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 new file mode 100644 index 00000000..1190b6b6 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_home_page.dart @@ -0,0 +1,145 @@ +import 'dart:ui'; + +import 'package:diplomaticquarterapp/core/viewModels/medical/blood_sugar_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.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 'AddBloodSugarPage.dart'; +import 'BloodMonthly.dart'; +import 'BloodYeaPage.dart'; +import 'blood_sugar_weekly_page.dart'; + +class BloodSugarHomePage extends StatefulWidget { + @override + _BloodSugarHomePageState createState() => _BloodSugarHomePageState(); +} + +class _BloodSugarHomePageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getBloodSugar(), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Blood Sugar', + 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.label, + 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'), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + BloodSugarWeeklyPage(data: model.getBloodWeeklySeries(),diabtecPatientResult: model.weekDiabtecPatientResult,), + BloodMonthlyPage(data: model.getBloodMonthlyTimeSeriesSales(),diabtecPatientResult: model.monthDiabtecPatientResult,), + BloodYearPage(data: model.getBloodYearTimeSeriesSales(),diabtecPatientResult: model.yearDiabtecPatientResult,) + ], + ), + ) + ], + ), + floatingActionButton: InkWell( + onTap: (){ + Navigator.push(context, FadePage(page: AddBloodSugarPage())); + }, + child: Container( + width: 55, + height: 55, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Hexcolor('515B5D') + ), + child: Center( + child: Icon(Icons.add,color: Colors.white,), + ), + ), + ), + ), + ), + ); + } +} 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 new file mode 100644 index 00000000..6b892162 --- /dev/null +++ b/lib/pages/medical/my_trackers/blood_suger/blood_sugar_weekly_page.dart @@ -0,0 +1,204 @@ +import 'package:diplomaticquarterapp/core/model/my_trakers/blood_sugar/DiabtecPatientResult.dart'; +import 'package:diplomaticquarterapp/core/model/my_trakers/chartData/WeekChartDate.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.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'; + +class BloodSugarWeeklyPage extends StatelessWidget { + final List> data; + final List diabtecPatientResult; + + const BloodSugarWeeklyPage({Key key, this.data, this.diabtecPatientResult}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: ListView( + children: [ + Container( + width: double.maxFinite, + height: 180, + color: Colors.white, + child: charts.TimeSeriesChart( + data, + dateTimeFactory: const charts.LocalDateTimeFactory(), + ), + ), + SizedBox(height: 12,), + + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts('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(), + ), + ], + ), + ) + ], + ), + ); + } + + List fullData() { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts( + 'Date', + color: Colors.white, + fontSize: 15, + ), + ), + height: 40, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Time', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Measured', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + ), + child: Center( + child: Texts('Value', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topRight: Radius.circular(10.0), + ), + ), + child: Center( + child: Texts('Edit', color: Colors.white,fontSize: 15,), + ), + height: 40), + ), + ], + ), + ); + diabtecPatientResult.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.dateChart)}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.dateChart.hour}:${diabtec.dateChart.minute}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.measuredDesc}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${diabtec.resultValue}', + textAlign: TextAlign.center, + fontSize: 12, + ), + ), + ), + ), + Container( + child: Container( + height: 70, + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Icon(Icons.edit), + ), + ), + ), + ], + ), + ); + }, + ); + return tableRow; + } +} diff --git a/lib/pages/medical/my_trackers/my_trackers.dart b/lib/pages/medical/my_trackers/my_trackers.dart new file mode 100644 index 00000000..ecdf5a53 --- /dev/null +++ b/lib/pages/medical/my_trackers/my_trackers.dart @@ -0,0 +1,114 @@ +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 'Weight/WeightHomePage.dart'; +import 'blood_pressure/BloodPressureHomePage.dart'; +import 'blood_suger/blood_sugar_home_page.dart'; + +class MyTrackers extends StatelessWidget { + @override + Widget build(BuildContext context) { + return AppScaffold( + appBarTitle: 'My Tracker', + isShowAppBar: true, + body: SingleChildScrollView( + child: Container( + padding: EdgeInsets.all(12), + margin: EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: InkWell( + onTap: ()=> Navigator.push(context, FadePage(page: BloodSugarHomePage())), + child: Container( + margin: EdgeInsets.all(5), + width: MediaQuery.of(context).size.width*0.35, + height:MediaQuery.of(context).size.width*0.35 , + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + color: Colors.white + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/tracker/blood-suger.png',width: 60.0,), + SizedBox(height: 15,), + Text('Blood Sugar'), + ], + ), + ), + ), + ), + Expanded( + child: InkWell( + onTap: ()=> Navigator.push(context, FadePage(page: BloodPressureHomePage())), + child: Container( + margin: EdgeInsets.all(5), + width: MediaQuery.of(context).size.width*0.35, + height:MediaQuery.of(context).size.width*0.35 , + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + color: Colors.white + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/tracker/blood-pressure.png',width: 60.0,), + SizedBox(height: 15,), + Text('Blood Pressure'), + ], + ), + ), + ), + ), + ], + ), + Row( + //mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: InkWell( + onTap: ()=> Navigator.push(context, FadePage(page: WeightHomePage())), + child: Container( + margin: EdgeInsets.all(5), + width: MediaQuery.of(context).size.width*0.35, + height:MediaQuery.of(context).size.width*0.35 , + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + color: Colors.white + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/tracker/weight.png',width: 60.0,), + SizedBox(height: 15,), + Text('Weight'), + ], + ), + ), + ), + ), + Expanded( + child: Container(), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 834cb0fe..a150086c 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -67,32 +67,71 @@ class DateUtil { static getMonth(int month) { switch (month) { case 1: - return "Jan"; + return "January"; case 2: - return "Feb"; + return "February"; case 3: - return "Mar"; + return "March"; case 4: - return "Apr"; + return "April"; case 5: return "May"; case 6: - return "Jun"; + return "June"; case 7: - return "Jul"; + return "July"; case 8: - return "Aug"; + return "August"; case 9: - return "Sep"; + return "September"; case 10: - return "Oct"; + return "October"; case 11: - return "Nov"; + return "November"; case 12: - return "Dec"; + return "December"; } } + static getMonthByName(String month) { + switch (month.toLowerCase()) { + case 'january': + return 1; + case 'february': + return 2; + case 'march': + return 3; + case 'april': + return 4; + case 'may': + return 5; + case 'june': + return 6; + case 'july': + return 7; + case 'august': + return 8; + case 'september': + return 9; + case 'october': + return 10; + case 'november': + return 11; + case 'december': + return 12; + } + } + + static getMonthDateTime(String month, yearName) { + DateTime date; + try { + date = DateTime(int.parse(yearName), getMonthByName(month)); + } catch (e) { + print(e); + } + return date ?? DateTime.now(); + } + /// get month by /// [weekDay] convert week day in int to week day name static getWeekDay(int weekDay) { diff --git a/lib/widgets/dialogs/RadioStringDialog.dart b/lib/widgets/dialogs/RadioStringDialog.dart new file mode 100644 index 00000000..912c3a72 --- /dev/null +++ b/lib/widgets/dialogs/RadioStringDialog.dart @@ -0,0 +1,150 @@ +import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; +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 RadioStringDialog extends StatefulWidget { + final List radioList; + final Function(String) onValueSelected; + final String title; + String selectedValue; + + RadioStringDialog( + {Key key, + this.radioList, + this.onValueSelected, + this.selectedValue, + this.title}); + + @override + _RadioStringDialogState createState() => _RadioStringDialogState(); +} + +class _RadioStringDialogState extends State { + @override + void initState() { + super.initState(); + widget.selectedValue = widget.selectedValue ?? widget.radioList[0]; + } + + @override + Widget build(BuildContext context) { + return SimpleDialog( + title: Container( + width: double.infinity, + child: Center( + child: Texts( + widget.title, + textAlign: TextAlign.center, + ))), + children: [ + Container( + height: widget.radioList.length > 3 + ? MediaQuery.of(context).size.height * 0.6 + : null, + child: SingleChildScrollView( + child: Column( + children: [ + Divider(), + ...List.generate( + widget.radioList.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 2, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + setState(() { + widget.selectedValue = + widget.radioList[index]; + }); + }, + child: ListTile( + title: Text(widget.radioList[index]), + leading: Radio( + value: widget.radioList[index], + groupValue: widget.selectedValue, + activeColor: Colors.red[800], + onChanged: (value) { + setState(() { + widget.selectedValue = value; + }); + }, + ), + ), + ), + ) + ], + ), + SizedBox( + height: 5.0, + ), + ], + ), + ), + SizedBox( + height: 5.0, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Center( + child: Texts( + TranslationBase.of(context) + .cancel + .toUpperCase(), + color: Colors.red, + ), + ), + ), + ), + ), + ), + Container( + width: 1, + height: 30, + color: Colors.grey[500], + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () { + widget.onValueSelected(widget.selectedValue); + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts( + TranslationBase.of(context).ok, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + ), + ], + ) + ], + ), + ), + ) + ], + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index c47875e1..4204d4ad 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: connectivity: ^0.4.9 # State Management - provider: ^4.3.1 + provider: ^4.3.2+2 #Dependency Injection get_it: ^4.0.2 @@ -110,7 +110,7 @@ dependencies: #Popup_window popup_box: ^0.1.0 - + flutter_datetime_picker: ^1.4.0 #Handle Geolocation From 9f06ce7d1db9b9bc8d25874abd23677a3c8d0a85 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 21 Sep 2020 18:02:07 +0300 Subject: [PATCH 3/8] done EyeMeasurements service --- lib/config/localized_values.dart | 16 +- .../model/eye/AppoimentAllHistoryResult.dart | 497 ++++++++++++++++++ lib/core/model/eye/AppointmentFilter.dart | 12 + lib/core/service/medical/EyeService.dart | 26 + lib/core/viewModels/medical/EyeViewModel.dart | 46 ++ lib/locator.dart | 4 + .../medical/doctor/doctor_home_page.dart | 28 - lib/pages/medical/eye/ClassesPage.dart | 126 +++++ lib/pages/medical/eye/ContactLensPage.dart | 129 +++++ lib/pages/medical/eye/EyeHomePage.dart | 128 +++++ .../medical/eye/EyeMeasurementsPage.dart | 123 +++++ lib/pages/medical/medical_profile_page.dart | 13 +- .../prescriptions_home_page.dart | 2 +- lib/uitl/translations_delegate_base.dart | 15 + .../data_display/medical/doctor_card.dart | 1 + 15 files changed, 1131 insertions(+), 35 deletions(-) create mode 100644 lib/core/model/eye/AppoimentAllHistoryResult.dart create mode 100644 lib/core/model/eye/AppointmentFilter.dart create mode 100644 lib/core/service/medical/EyeService.dart create mode 100644 lib/core/viewModels/medical/EyeViewModel.dart create mode 100644 lib/pages/medical/eye/ClassesPage.dart create mode 100644 lib/pages/medical/eye/ContactLensPage.dart create mode 100644 lib/pages/medical/eye/EyeHomePage.dart create mode 100644 lib/pages/medical/eye/EyeMeasurementsPage.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index baf3cc69..790da29f 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -488,5 +488,19 @@ const Map> localizedValues = { "Ok":{"en":"Ok","ar":"حسنا"}, "TheVerificationCodeExpiresIn":{"en":"The Verification Code Expires In","ar":"تنتهي صلاحية رمز التحقق في"}, "PleaseEnterTheVerificationCode":{"en":"Please enter the verification code send to","ar":"الرجاء إدخال رمز التحقق المرسل إلى"}, - + "EyeMeasurements":{"en":"Eye Measurements","ar":"قياسات النظر"}, + "Measurements":{"en":"Measurements","ar":"قياسات"}, + "Classes":{"en":"Classes","ar":"نظارات"}, + "ContactLens":{"en":"Contact Lens","ar":"العدسات اللاصقة"}, + "RightEye":{"en":"Right Eye","ar":"العين اليمين"}, + "Sphere":{"en":"Sphere","ar":"القوة"}, + "Cylinder":{"en":"Cylinder","ar":"الدائرية"}, + "Axis":{"en":"Axis","ar":"المحاور"}, + "Prism":{"en":"Prism","ar":"موشور"}, + "VA":{"en":"Prism","VA":"المحاور"}, + "LeftEye":{"en":"Left Eye","VA":"العين اليسرى"}, + "Brand":{"en":"Brand","VA":"النوع"}, + "Power":{"en":"Power","VA":"القوة"}, + "Diameter":{"en":"Diameter","VA":"القطر"}, + "Remarks":{"en":"Remarks","VA":"ملاحضات"}, }; diff --git a/lib/core/model/eye/AppoimentAllHistoryResult.dart b/lib/core/model/eye/AppoimentAllHistoryResult.dart new file mode 100644 index 00000000..ed123023 --- /dev/null +++ b/lib/core/model/eye/AppoimentAllHistoryResult.dart @@ -0,0 +1,497 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class AppoimentAllHistoryResultList { + String setupID; + int projectID; + int appointmentNo; + String appointmentDate; + Null appointmentDateN; + int appointmentType; + DateTime bookDate; + dynamic patientType; + int patientID; + dynamic clinicID; + int doctorID; + String endDate; + String startTime; + String endTime; + dynamic status; + dynamic visitType; + int visitFor; + int patientStatusType; + int companyID; + int bookedBy; + String bookedOn; + int confirmedBy; + String confirmedOn; + int arrivalChangedBy; + String arrivedOn; + Null editedBy; + Null editedOn; + Null doctorName; + Null doctorNameN; + String statusDesc; + Null statusDescN; + bool vitalStatus; + Null vitalSignAppointmentNo; + int episodeID; + int actualDoctorRate; + String clinicName; + bool complainExists; + String doctorImageURL; + String doctorNameObj; + int doctorRate; + List doctorSpeciality; + String doctorTitle; + int gender; + String genderDescription; + bool iSAllowOnlineCheckedIN; + bool isActiveDoctor; + bool isActiveDoctorProfile; + bool isDoctorAllowVedioCall; + bool isExecludeDoctor; + int isFollowup; + bool isLiveCareAppointment; + bool isMedicalReportRequested; + bool isOnlineCheckedIN; + String latitude; + List listHISGetContactLensPerscription; + List listHISGetGlassPerscription; + String longitude; + int nextAction; + int noOfPatientsRate; + int originalClinicID; + int originalProjectID; + String projectName; + String qR; + int remaniningHoursTocanPay; + bool sMSButtonVisable; + + AppoimentAllHistoryResultList( + {this.setupID, + this.projectID, + this.appointmentNo, + this.appointmentDate, + this.appointmentDateN, + this.appointmentType, + this.bookDate, + this.patientID, + this.doctorID, + this.endDate, + this.startTime, + this.endTime, + this.status, + this.visitFor, + this.patientStatusType, + this.companyID, + this.bookedBy, + this.bookedOn, + this.confirmedBy, + this.confirmedOn, + this.arrivalChangedBy, + this.arrivedOn, + this.editedBy, + this.editedOn, + this.doctorName, + this.doctorNameN, + this.statusDesc, + this.statusDescN, + this.vitalStatus, + this.vitalSignAppointmentNo, + this.episodeID, + this.actualDoctorRate, + this.clinicName, + this.complainExists, + this.doctorImageURL, + this.doctorNameObj, + this.doctorRate, + this.doctorSpeciality, + this.doctorTitle, + this.gender, + this.genderDescription, + this.iSAllowOnlineCheckedIN, + this.isActiveDoctor, + this.isActiveDoctorProfile, + this.isDoctorAllowVedioCall, + this.isExecludeDoctor, + this.isFollowup, + this.isLiveCareAppointment, + this.isMedicalReportRequested, + this.isOnlineCheckedIN, + this.latitude, + this.listHISGetContactLensPerscription, + this.listHISGetGlassPerscription, + this.longitude, + this.nextAction, + this.noOfPatientsRate, + this.originalClinicID, + this.originalProjectID, + this.projectName, + this.qR, + this.remaniningHoursTocanPay, + this.sMSButtonVisable, + this.clinicID, + this.patientType, + + this.visitType}); + + AppoimentAllHistoryResultList.fromJson(Map json) { + setupID = json['SetupID']; + projectID = json['ProjectID']; + appointmentNo = json['AppointmentNo']; + appointmentDate = json['AppointmentDate']; + appointmentDateN = json['AppointmentDateN']; + appointmentType = json['AppointmentType']; + bookDate = DateUtil.convertStringToDate(json['BookDate']); + patientType = json['PatientType']; + patientID = json['PatientID']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + endDate = json['EndDate']; + startTime = json['StartTime']; + endTime = json['EndTime']; + status = json['Status']; + visitType = json['VisitType']; + visitFor = json['VisitFor']; + patientStatusType = json['PatientStatusType']; + companyID = json['CompanyID']; + bookedBy = json['BookedBy']; + bookedOn = json['BookedOn']; + confirmedBy = json['ConfirmedBy']; + confirmedOn = json['ConfirmedOn']; + arrivalChangedBy = json['ArrivalChangedBy']; + arrivedOn = json['ArrivedOn']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + doctorName = json['DoctorName']; + doctorNameN = json['DoctorNameN']; + statusDesc = json['StatusDesc']; + statusDescN = json['StatusDescN']; + vitalStatus = json['VitalStatus']; + vitalSignAppointmentNo = json['VitalSignAppointmentNo']; + episodeID = json['EpisodeID']; + actualDoctorRate = json['ActualDoctorRate']; + clinicName = json['ClinicName']; + complainExists = json['ComplainExists']; + doctorImageURL = json['DoctorImageURL']; + doctorNameObj = json['DoctorNameObj']; + doctorRate = json['DoctorRate']; + // doctorSpeciality = json['DoctorSpeciality'].cast(); + doctorTitle = json['DoctorTitle']; + gender = json['Gender']; + genderDescription = json['GenderDescription']; + iSAllowOnlineCheckedIN = json['ISAllowOnlineCheckedIN']; + isActiveDoctor = json['IsActiveDoctor']; + isActiveDoctorProfile = json['IsActiveDoctorProfile']; + isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; + isExecludeDoctor = json['IsExecludeDoctor']; + isFollowup = json['IsFollowup']; + isLiveCareAppointment = json['IsLiveCareAppointment']; + isMedicalReportRequested = json['IsMedicalReportRequested']; + isOnlineCheckedIN = json['IsOnlineCheckedIN']; + latitude = json['Latitude']; + if (json['List_HIS_GetContactLensPerscription'] != null) { + listHISGetContactLensPerscription = + new List(); + json['List_HIS_GetContactLensPerscription'].forEach((v) { + listHISGetContactLensPerscription + .add(new ListHISGetContactLensPerscription.fromJson(v)); + }); + } + if (json['List_HIS_GetGlassPerscription'] != null) { + listHISGetGlassPerscription = new List(); + json['List_HIS_GetGlassPerscription'].forEach((v) { + listHISGetGlassPerscription + .add(new ListHISGetGlassPerscription.fromJson(v)); + }); + } + longitude = json['Longitude']; + nextAction = json['NextAction']; + noOfPatientsRate = json['NoOfPatientsRate']; + originalClinicID = json['OriginalClinicID']; + originalProjectID = json['OriginalProjectID']; + projectName = json['ProjectName']; + qR = json['QR']; + remaniningHoursTocanPay = json['RemaniningHoursTocanPay']; + sMSButtonVisable = json['SMSButtonVisable']; + clinicID = json['clinicID']; + patientType = json['patientType']; + status = json['status']; + visitType = json['visitType']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ProjectID'] = this.projectID; + data['AppointmentNo'] = this.appointmentNo; + data['AppointmentDate'] = this.appointmentDate; + data['AppointmentDateN'] = this.appointmentDateN; + data['AppointmentType'] = this.appointmentType; + data['BookDate'] = this.bookDate; + data['PatientType'] = this.patientType; + data['PatientID'] = this.patientID; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; + data['EndDate'] = this.endDate; + data['StartTime'] = this.startTime; + data['EndTime'] = this.endTime; + data['Status'] = this.status; + data['VisitType'] = this.visitType; + data['VisitFor'] = this.visitFor; + data['PatientStatusType'] = this.patientStatusType; + data['CompanyID'] = this.companyID; + data['BookedBy'] = this.bookedBy; + data['BookedOn'] = this.bookedOn; + data['ConfirmedBy'] = this.confirmedBy; + data['ConfirmedOn'] = this.confirmedOn; + data['ArrivalChangedBy'] = this.arrivalChangedBy; + data['ArrivedOn'] = this.arrivedOn; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['DoctorName'] = this.doctorName; + data['DoctorNameN'] = this.doctorNameN; + data['StatusDesc'] = this.statusDesc; + data['StatusDescN'] = this.statusDescN; + data['VitalStatus'] = this.vitalStatus; + data['VitalSignAppointmentNo'] = this.vitalSignAppointmentNo; + data['EpisodeID'] = this.episodeID; + data['ActualDoctorRate'] = this.actualDoctorRate; + data['ClinicName'] = this.clinicName; + data['ComplainExists'] = this.complainExists; + data['DoctorImageURL'] = this.doctorImageURL; + data['DoctorNameObj'] = this.doctorNameObj; + data['DoctorRate'] = this.doctorRate; + data['DoctorSpeciality'] = this.doctorSpeciality; + data['DoctorTitle'] = this.doctorTitle; + data['Gender'] = this.gender; + data['GenderDescription'] = this.genderDescription; + data['ISAllowOnlineCheckedIN'] = this.iSAllowOnlineCheckedIN; + data['IsActiveDoctor'] = this.isActiveDoctor; + data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile; + data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; + data['IsExecludeDoctor'] = this.isExecludeDoctor; + data['IsFollowup'] = this.isFollowup; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['IsMedicalReportRequested'] = this.isMedicalReportRequested; + data['IsOnlineCheckedIN'] = this.isOnlineCheckedIN; + data['Latitude'] = this.latitude; + if (this.listHISGetContactLensPerscription != null) { + data['List_HIS_GetContactLensPerscription'] = this + .listHISGetContactLensPerscription + .map((v) => v.toJson()) + .toList(); + } + if (this.listHISGetGlassPerscription != null) { + data['List_HIS_GetGlassPerscription'] = + this.listHISGetGlassPerscription.map((v) => v.toJson()).toList(); + } + data['Longitude'] = this.longitude; + data['NextAction'] = this.nextAction; + data['NoOfPatientsRate'] = this.noOfPatientsRate; + data['OriginalClinicID'] = this.originalClinicID; + data['OriginalProjectID'] = this.originalProjectID; + data['ProjectName'] = this.projectName; + data['QR'] = this.qR; + data['RemaniningHoursTocanPay'] = this.remaniningHoursTocanPay; + data['SMSButtonVisable'] = this.sMSButtonVisable; + data['clinicID'] = this.clinicID; + data['patientType'] = this.patientType; + data['status'] = this.status; + data['visitType'] = this.visitType; + return data; + } +} + +class ListHISGetContactLensPerscription { + String setupId; + int projectId; + int patientType; + int patientId; + int encounterType; + int encounterNo; + int oDOS; + dynamic brand; + dynamic baseCurve; + dynamic power; + dynamic diameter; + dynamic oZ; + dynamic cT; + dynamic blend; + String remarks; + int status; + bool isActive; + String createdOn; + + ListHISGetContactLensPerscription( + {this.setupId, + this.projectId, + this.patientType, + this.patientId, + this.encounterType, + this.encounterNo, + this.oDOS, + this.brand, + this.baseCurve, + this.power, + this.diameter, + this.oZ, + this.cT, + this.blend, + this.remarks, + this.status, + this.isActive, + this.createdOn}); + + ListHISGetContactLensPerscription.fromJson(Map json) { + setupId = json['SetupId']; + projectId = json['ProjectId']; + patientType = json['PatientType']; + patientId = json['PatientId']; + encounterType = json['EncounterType']; + encounterNo = json['EncounterNo']; + oDOS = json['OD_OS']; + brand = json['Brand']; + baseCurve = json['BaseCurve']; + power = json['Power']; + diameter = json['Diameter']; + oZ = json['OZ']; + cT = json['CT']; + blend = json['Blend']; + remarks = json['Remarks']; + status = json['Status']; + isActive = json['IsActive']; + createdOn = json['CreatedOn']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupId'] = this.setupId; + data['ProjectId'] = this.projectId; + data['PatientType'] = this.patientType; + data['PatientId'] = this.patientId; + data['EncounterType'] = this.encounterType; + data['EncounterNo'] = this.encounterNo; + data['OD_OS'] = this.oDOS; + data['Brand'] = this.brand; + data['BaseCurve'] = this.baseCurve; + data['Power'] = this.power; + data['Diameter'] = this.diameter; + data['OZ'] = this.oZ; + data['CT'] = this.cT; + data['Blend'] = this.blend; + data['Remarks'] = this.remarks; + data['Status'] = this.status; + data['IsActive'] = this.isActive; + data['CreatedOn'] = this.createdOn; + return data; + } +} + +class ListHISGetGlassPerscription { + dynamic projectID; + String setupID; + dynamic patientId; + dynamic encounterType; + dynamic encounterNo; + String visionType; + double rightEyeSpherical; + dynamic rightEyeCylinder; + dynamic rightEyeAxis; + dynamic rightEyePrism; + dynamic rightEyeVA; + String rightEyeRemarks; + dynamic leftEyeSpherical; + dynamic leftEyeCylinder; + dynamic leftEyeAxis; + dynamic leftEyePrism; + dynamic leftEyeVA; + String leftEyeRemarks; + dynamic pD; + dynamic bVD; + dynamic status; + bool isActive; + String createdOn; + + ListHISGetGlassPerscription( + {this.projectID, + this.setupID, + this.patientId, + this.encounterType, + this.encounterNo, + this.visionType, + this.rightEyeSpherical, + this.rightEyeCylinder, + this.rightEyeAxis, + this.rightEyePrism, + this.rightEyeVA, + this.rightEyeRemarks, + this.leftEyeSpherical, + this.leftEyeCylinder, + this.leftEyeAxis, + this.leftEyePrism, + this.leftEyeVA, + this.leftEyeRemarks, + this.pD, + this.bVD, + this.status, + this.isActive, + this.createdOn}); + + ListHISGetGlassPerscription.fromJson(Map json) { + projectID = json['ProjectID']; + setupID = json['SetupID']; + patientId = json['PatientId']; + encounterType = json['EncounterType']; + encounterNo = json['EncounterNo']; + visionType = json['VisionType']; + rightEyeSpherical = json['RightEyeSpherical']; + rightEyeCylinder = json['RightEyeCylinder']; + rightEyeAxis = json['RightEyeAxis']; + rightEyePrism = json['RightEyePrism']; + rightEyeVA = json['RightEyeVA']; + rightEyeRemarks = json['RightEyeRemarks']; + leftEyeSpherical = json['LeftEyeSpherical']; + leftEyeCylinder = json['LeftEyeCylinder']; + leftEyeAxis = json['LeftEyeAxis']; + leftEyePrism = json['LeftEyePrism']; + leftEyeVA = json['LeftEyeVA']; + leftEyeRemarks = json['LeftEyeRemarks']; + pD = json['PD']; + bVD = json['BVD']; + status = json['Status']; + isActive = json['IsActive']; + createdOn = json['CreatedOn']; + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['SetupID'] = this.setupID; + data['PatientId'] = this.patientId; + data['EncounterType'] = this.encounterType; + data['EncounterNo'] = this.encounterNo; + data['VisionType'] = this.visionType; + data['RightEyeSpherical'] = this.rightEyeSpherical; + data['RightEyeCylinder'] = this.rightEyeCylinder; + data['RightEyeAxis'] = this.rightEyeAxis; + data['RightEyePrism'] = this.rightEyePrism; + data['RightEyeVA'] = this.rightEyeVA; + data['RightEyeRemarks'] = this.rightEyeRemarks; + data['LeftEyeSpherical'] = this.leftEyeSpherical; + data['LeftEyeCylinder'] = this.leftEyeCylinder; + data['LeftEyeAxis'] = this.leftEyeAxis; + data['LeftEyePrism'] = this.leftEyePrism; + data['LeftEyeVA'] = this.leftEyeVA; + data['LeftEyeRemarks'] = this.leftEyeRemarks; + data['PD'] = this.pD; + data['BVD'] = this.bVD; + data['Status'] = this.status; + data['IsActive'] = this.isActive; + data['CreatedOn'] = this.createdOn; + return data; + } +} + + + diff --git a/lib/core/model/eye/AppointmentFilter.dart b/lib/core/model/eye/AppointmentFilter.dart new file mode 100644 index 00000000..1f4b0ae5 --- /dev/null +++ b/lib/core/model/eye/AppointmentFilter.dart @@ -0,0 +1,12 @@ +import 'AppoimentAllHistoryResult.dart'; + +class AppointmentFilter { + List appointmentAllHistoryResultList = List(); + String filterName; + + AppointmentFilter( + AppoimentAllHistoryResultList allHistoryResultList, String filterName) { + appointmentAllHistoryResultList.add(allHistoryResultList); + this.filterName = filterName; + } +} diff --git a/lib/core/service/medical/EyeService.dart b/lib/core/service/medical/EyeService.dart new file mode 100644 index 00000000..879acbbf --- /dev/null +++ b/lib/core/service/medical/EyeService.dart @@ -0,0 +1,26 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class EyeService extends BaseService { + List appoimentAllHistoryResultList = List(); + + getEyeMeasurement() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['IsIrisPrescription'] = true; + await baseAppClient.post(GET_PATIENT_APPOINTMENT_HISTORY, + onSuccess: (response, statusCode) async { + appoimentAllHistoryResultList.clear(); + response['AppoimentAllHistoryResultList'].forEach((appoitment) { + appoimentAllHistoryResultList + .add(AppoimentAllHistoryResultList.fromJson(appoitment)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/medical/EyeViewModel.dart b/lib/core/viewModels/medical/EyeViewModel.dart new file mode 100644 index 00000000..d6c3bf80 --- /dev/null +++ b/lib/core/viewModels/medical/EyeViewModel.dart @@ -0,0 +1,46 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.dart'; +import 'package:diplomaticquarterapp/core/model/eye/AppointmentFilter.dart'; +import 'package:diplomaticquarterapp/core/service/medical/EyeService.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +class EyeViewModel extends BaseViewModel { + EyeService _eyeService = locator(); + + List get appoimentAllHistoryResultList => + _eyeService.appoimentAllHistoryResultList; + + List appointmentFilter = List(); + + getEyeMeasurement() async { + setState(ViewState.Busy); + await _eyeService.getEyeMeasurement(); + if (_eyeService.hasError) { + error = _eyeService.error; + setState(ViewState.Error); + } else { + _eyeService.appoimentAllHistoryResultList.forEach((element) { + List _appointmentFilter = appointmentFilter + .where( + (elementFilter) => + elementFilter.filterName == element.projectName, + ) + .toList(); + + if (_appointmentFilter.length != 0) { + appointmentFilter[appointmentFilter.indexOf(_appointmentFilter[0])] + .appointmentAllHistoryResultList + .add(element); + } else { + appointmentFilter.add(AppointmentFilter( + element, + element.projectName, + )); + } + }); + + setState(ViewState.Idle); + } + } +} diff --git a/lib/locator.dart b/lib/locator.dart index 6c27dfe0..4c5a1df3 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -11,6 +11,7 @@ import 'core/service/feedback/feedback_service.dart'; import 'core/service/hospital_service.dart'; import 'core/service/medical/BloodPressureService.dart'; import 'core/service/medical/BloodSugarService.dart'; +import 'core/service/medical/EyeService.dart'; import 'core/service/medical/PatientSickLeaveService.dart'; import 'core/service/medical/WeightPressureService.dart'; import 'core/service/medical/labs_service.dart'; @@ -27,6 +28,7 @@ import 'core/viewModels/er/near_hospital_view_model.dart'; import 'core/viewModels/feedback/feedback_view_model.dart'; import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; +import 'core/viewModels/medical/EyeViewModel.dart'; import 'core/viewModels/medical/blood_pressure_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart'; import 'core/viewModels/medical/medical_view_model.dart'; @@ -77,6 +79,7 @@ void setupLocator() { locator.registerLazySingleton(() => BloodSugarService()); locator.registerLazySingleton(() => BloodPressureService()); locator.registerLazySingleton(() => WeightService()); + locator.registerLazySingleton(() => EyeService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -102,5 +105,6 @@ void setupLocator() { locator.registerFactory(() => BloodSugarViewMode()); locator.registerFactory(() => BloodPressureViewMode()); locator.registerFactory(() => WeightPressureViewMode()); + locator.registerFactory(() => EyeViewModel()); } diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart index 7a01ef90..d406b889 100644 --- a/lib/pages/medical/doctor/doctor_home_page.dart +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -95,35 +95,7 @@ class DoctorHomePage extends StatelessWidget { return DoctorView( doctor: doctorList, ); - /* InkWell( - onTap: () async { - model - .getDoctorProfileAndRating( - doctorId: doctor.doctorID, - clinicID: doctor.clinicID, - projectID: doctor.projectID) - .then((value) { - var asd=""; - Navigator.push( - context, - FadePage( - page: DoctorView(doctor: model.doctorList,), - ), - ); - }).catchError((e){ - var asd=""; - }); - }, - child: DoctorCard( - name: doctor.doctorName, - profileUrl: doctor.doctorImageURL, - rat: doctor.doctorRate.toDouble(), - subName: DateUtil.getMonthDayYearDateFormatted( - doctor.appointmentDate), - ), - )*/ - ; }).toList(), )), ) diff --git a/lib/pages/medical/eye/ClassesPage.dart b/lib/pages/medical/eye/ClassesPage.dart new file mode 100644 index 00000000..7904178c --- /dev/null +++ b/lib/pages/medical/eye/ClassesPage.dart @@ -0,0 +1,126 @@ +import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/EyeViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.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/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ClassesPage extends StatelessWidget { + final ListHISGetGlassPerscription glassPerscription; + + const ClassesPage({Key key, this.glassPerscription}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + builder: (_, model, w) => AppScaffold( + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.only(top: 70, left: 15, right: 15, bottom: 15), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(8)), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts( + TranslationBase.of(context).rightEye, + fontSize: 23, + bold: true, + ), + ), + getRow(TranslationBase.of(context).sphere, '${glassPerscription.rightEyeSpherical}', '-'), + getRow(TranslationBase.of(context).cylinder, '${glassPerscription.rightEyeCylinder}', '-'), + getRow(TranslationBase.of(context).axis, '${glassPerscription.rightEyeAxis}', '-'), + getRow(TranslationBase.of(context).prism, '${glassPerscription.rightEyePrism}', '-'), + getRow(TranslationBase.of(context).va, '${glassPerscription.rightEyeVA}', '-'), + ], + ), + ), + SizedBox( + height: 17, + ), + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(8)), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts( + TranslationBase.of(context).leftEye, + fontSize: 23, + bold: true, + ), + ), + getRow(TranslationBase.of(context).sphere, '${glassPerscription.leftEyeSpherical}', '-'), + getRow(TranslationBase.of(context).cylinder, '${glassPerscription.leftEyeCylinder}', '-'), + getRow(TranslationBase.of(context).axis, '${glassPerscription.leftEyeAxis}', '-'), + getRow(TranslationBase.of(context).prism, '${glassPerscription.leftEyePrism}', '-'), + getRow(TranslationBase.of(context).va, '${glassPerscription.leftEyeVA}', '-'), + ], + ), + ), + SizedBox( + height: 17, + ), + Container( + width: double.infinity, + child: SecondaryButton( + label: TranslationBase.of(context).sendEmail, + textColor: Colors.white, + color: Colors.red[700], + icon: Icon( + Icons.email, + color: Colors.white, + ), + ), + ) + ], + ), + ), + ), + ), + ); + } + + Widget getRow(String title, String val1, String val2) => Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded(flex: 4, child: Texts(title)), + Expanded( + flex: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Texts(val1 == 'null' ? '-' : val1), + Texts(val2 != 'null' ? '-' :val2), + ], + ), + ) + ], + ), + Divider() + ], + ), + ); +} diff --git a/lib/pages/medical/eye/ContactLensPage.dart b/lib/pages/medical/eye/ContactLensPage.dart new file mode 100644 index 00000000..26503c89 --- /dev/null +++ b/lib/pages/medical/eye/ContactLensPage.dart @@ -0,0 +1,129 @@ +import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.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/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ContactLensPage extends StatelessWidget { + final ListHISGetContactLensPerscription listHISGetContactLensPerscription; + + const ContactLensPage({Key key, this.listHISGetContactLensPerscription}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return AppScaffold( + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.only(top: 70, left: 15, right: 15, bottom: 15), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(8)), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts( + TranslationBase.of(context).rightEye, + fontSize: 23, + bold: true, + ), + ), + getRow(TranslationBase.of(context).brand, '${listHISGetContactLensPerscription.brand}'), + getRow('B.C', '${listHISGetContactLensPerscription.baseCurve}'), + getRow(TranslationBase.of(context).power, '${listHISGetContactLensPerscription.power}'), + getRow(TranslationBase.of(context).diameter, '${listHISGetContactLensPerscription.diameter}'), + getRow('OZ', '${listHISGetContactLensPerscription.oZ}'), + getRow('CT', '${listHISGetContactLensPerscription.cT}'), + getRow('Blend', '${listHISGetContactLensPerscription.blend}'), + getRow(TranslationBase.of(context).reminder, '${listHISGetContactLensPerscription.remarks}'), + + + ], + ), + ), + SizedBox( + height: 17, + ), + Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(8)), + color: Colors.white), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Texts( + TranslationBase.of(context).leftEye, + fontSize: 23, + bold: true, + ), + ), + getRow(TranslationBase.of(context).brand, '${listHISGetContactLensPerscription.brand}'), + getRow('B.C', '${listHISGetContactLensPerscription.baseCurve}'), + getRow(TranslationBase.of(context).power, '${listHISGetContactLensPerscription.power}'), + getRow(TranslationBase.of(context).diameter, '${listHISGetContactLensPerscription.diameter}'), + getRow('OZ', '${listHISGetContactLensPerscription.oZ}'), + getRow('CT', '${listHISGetContactLensPerscription.cT}'), + getRow('Blend', '${listHISGetContactLensPerscription.blend}'), + getRow(TranslationBase.of(context).reminder, '${listHISGetContactLensPerscription.remarks}'), + ], + ), + ), + SizedBox( + height: 17, + ), + Container( + width: double.infinity, + child: SecondaryButton( + label: TranslationBase.of(context).sendEmail, + textColor: Colors.white, + color: Colors.red[700], + icon: Icon( + Icons.email, + color: Colors.white, + ), + ), + ) + ], + ), + ), + ), + ); + } + + Widget getRow(String title, String val1) => Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded(flex: 4, child: Texts(title)), + Expanded( + flex: 2, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts(val1 == 'null' ? '-' : val1), + ], + ), + ) + ], + ), + Divider() + ], + ), + ); +} diff --git a/lib/pages/medical/eye/EyeHomePage.dart b/lib/pages/medical/eye/EyeHomePage.dart new file mode 100644 index 00000000..18cc9b77 --- /dev/null +++ b/lib/pages/medical/eye/EyeHomePage.dart @@ -0,0 +1,128 @@ +import 'dart:ui'; + +import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/EyeViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/weight_pressure_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.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 'ClassesPage.dart'; +import 'ContactLensPage.dart'; + +class EyeHomePage extends StatefulWidget { + final AppoimentAllHistoryResultList appointmentAllHistoryResultList; + + const EyeHomePage({Key key, this.appointmentAllHistoryResultList}) + : super(key: key); + + @override + _EyeHomePageState createState() => _EyeHomePageState(); +} + +class _EyeHomePageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 2, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + @override + Widget build(BuildContext context) { + return AppScaffold( + isShowAppBar: true, + appBarTitle: TranslationBase.of(context).measurements, + 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, + margin: EdgeInsets.only(left: 20,right: 20,top: 15), + color: Colors.white, + child: Center( + child: TabBar( + isScrollable: true, + controller: _tabController, + indicatorWeight: 5.0, + indicatorSize: TabBarIndicatorSize.label, + 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(TranslationBase.of(context).classes), + ), + ), + Container( + width: MediaQuery.of(context).size.width * 0.27, + child: Center( + child: Texts(TranslationBase.of(context).contactLens), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + ClassesPage( + glassPerscription: widget.appointmentAllHistoryResultList + .listHISGetGlassPerscription[0], + ), + ContactLensPage( + listHISGetContactLensPerscription: widget + .appointmentAllHistoryResultList + .listHISGetContactLensPerscription[0], + ) + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/medical/eye/EyeMeasurementsPage.dart b/lib/pages/medical/eye/EyeMeasurementsPage.dart new file mode 100644 index 00000000..8dbe0f16 --- /dev/null +++ b/lib/pages/medical/eye/EyeMeasurementsPage.dart @@ -0,0 +1,123 @@ +import 'package:diplomaticquarterapp/core/viewModels/medical/EyeViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/avatar/large_avatar.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/StarRating.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.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:provider/provider.dart'; + +import 'EyeHomePage.dart'; + +class EyeMeasurementsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getEyeMeasurement(), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + baseViewModel: model, + appBarTitle: TranslationBase.of(context).eyeMeasurements, + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(8), + child: Column( + children: [ + ...List.generate( + model.appointmentFilter.length, + (index) => AppExpandableNotifier( + title: model.appointmentFilter[index].filterName, + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: model.appointmentFilter[index] + .appointmentAllHistoryResultList + .map((appointment) { + return InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: EyeHomePage( + appointmentAllHistoryResultList: appointment, + ), + ), + ); + }, + child: Container( + margin: EdgeInsets.all(8), + padding: EdgeInsets.all(8.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + border: Border.all(color: Colors.grey), + ), + child: Row( + children: [ + Expanded( + flex: 1, + child: LargeAvatar( + name: appointment.doctorNameObj, + url: appointment.doctorImageURL, + ), + ), + Expanded( + flex: 4, + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + appointment.doctorNameObj, + bold: true, + ), + Texts( + appointment.clinicName, + variant: 'caption3', + ), + Texts( + DateUtil.getMonthDayYearDateFormatted( + appointment.bookDate), + variant: 'caption3', + ), + StarRating( + totalAverage: appointment + .actualDoctorRate + .toDouble(), + forceStars: true), + ], + ), + ), + ), + Icon( + projectViewModel.isArabic + ? Icons.arrow_forward_ios + : Icons.arrow_back_ios, + color: Colors.grey, + size: 18, + ) + ], + ), + ), + ); + }).toList(), + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 85bd0e95..2ac090b9 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -28,6 +28,8 @@ import 'balance/my_balance_page.dart'; import 'doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; +import 'eye/EyeHomePage.dart'; +import 'eye/EyeMeasurementsPage.dart'; import 'labs/labs_home_page.dart'; import 'my_trackers/my_trackers.dart'; @@ -222,11 +224,12 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( - //TODO -// onTap: () { -// Navigator.push(context, -// FadePage(page: InsuranceApproval())); -// }, + onTap: () { + Navigator.push( + context, + FadePage( + page: EyeMeasurementsPage())); + }, child: MedicalProfileItem( title: TranslationBase.of(context).eye, imagePath: diff --git a/lib/pages/medical/prescriptions/prescriptions_home_page.dart b/lib/pages/medical/prescriptions/prescriptions_home_page.dart index e6e3e6db..182fca30 100644 --- a/lib/pages/medical/prescriptions/prescriptions_home_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_home_page.dart @@ -37,7 +37,7 @@ class _HomePrescriptionsPageState extends State onModelReady: (model) => model.getPrescriptions(), builder: (_, model, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: TranslationBase.of(context).myDoctor, + appBarTitle: TranslationBase.of(context).prescriptions, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index ba89fc2c..adb1a5fc 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -557,6 +557,21 @@ class TranslationBase { String get ok => localizedValues['Ok'][locale.languageCode]; String get theVerificationCodeExpiresIn => localizedValues['TheVerificationCodeExpiresIn'][locale.languageCode]; String get pleaseEnterTheVerificationCode => localizedValues['PleaseEnterTheVerificationCode'][locale.languageCode]; + String get eyeMeasurements => localizedValues['EyeMeasurements'][locale.languageCode]; + String get measurements => localizedValues['Measurements'][locale.languageCode]; + String get classes => localizedValues['Classes'][locale.languageCode]; + String get contactLens => localizedValues['ContactLens'][locale.languageCode]; + String get rightEye => localizedValues['RightEye'][locale.languageCode]; + String get sphere => localizedValues['Sphere'][locale.languageCode]; + String get cylinder => localizedValues['Cylinder'][locale.languageCode]; + String get axis => localizedValues['Axis'][locale.languageCode]; + String get prism => localizedValues['Prism'][locale.languageCode]; + String get va => localizedValues['VA'][locale.languageCode]; + String get leftEye => localizedValues['LeftEye'][locale.languageCode]; + String get brand => localizedValues['Brand'][locale.languageCode]; + String get power => localizedValues['Power'][locale.languageCode]; + String get diameter => localizedValues['Diameter'][locale.languageCode]; + String get remarks => localizedValues['Remarks'][locale.languageCode]; } diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index b7c4a185..b9143682 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -117,6 +117,7 @@ class DoctorCard extends StatelessWidget { ), ), ), + if(onEmailTap!=null) InkWell( onTap: onEmailTap, child: Icon( From 2952fd56ab8981e217c2d57ddb04cf12f92349ff Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 24 Sep 2020 12:21:50 +0300 Subject: [PATCH 4/8] Done Active Medications Service --- android/app/src/main/AndroidManifest.xml | 12 +- .../diplomaticquarterapp/MainActivity.kt | 41 +- .../app/src/main/res/drawable/app_icon.png | Bin 0 -> 1912 bytes android/app/src/main/res/drawable/food.png | Bin 0 -> 1789 bytes android/app/src/main/res/drawable/me.png | Bin 0 -> 1021 bytes .../main/res/drawable/sample_large_icon.png | Bin 0 -> 180 bytes .../src/main/res/drawable/secondary_icon.png | Bin 0 -> 1073 bytes android/app/src/main/res/raw/keep.xml | 3 + .../src/main/res/raw/slow_spring_board.mp3 | Bin 0 -> 37616 bytes ios/Runner.xcodeproj/project.pbxproj | 618 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 --- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - ios/Runner/AppDelegate.swift | 13 - ios/Runner/Info.plist | 2 + ios/Runner/Runner-Bridging-Header.h | 1 - lib/config/config.dart | 3 + .../ActivePrescriptionReport.dart | 146 +++++ .../medical/ActiveMedicationsService.dart | 27 + .../medical/ActiveMedicationsViewModel.dart | 28 + lib/locator.dart | 4 + lib/pages/landing/landing_page.dart | 70 +- lib/pages/login/login.dart | 3 +- .../ActiveMedicationsPage.dart | 129 ++++ .../active_medications/reminder_page.dart | 263 ++++++++ lib/pages/medical/medical_profile_page.dart | 5 +- lib/uitl/CalendarUtils.dart | 77 +++ lib/uitl/LocalNotification.dart | 97 +++ lib/uitl/utils.dart | 7 + pubspec.yaml | 4 + 34 files changed, 907 insertions(+), 786 deletions(-) create mode 100644 android/app/src/main/res/drawable/app_icon.png create mode 100644 android/app/src/main/res/drawable/food.png create mode 100644 android/app/src/main/res/drawable/me.png create mode 100644 android/app/src/main/res/drawable/sample_large_icon.png create mode 100644 android/app/src/main/res/drawable/secondary_icon.png create mode 100644 android/app/src/main/res/raw/keep.xml create mode 100644 android/app/src/main/res/raw/slow_spring_board.mp3 delete mode 100644 ios/Runner.xcodeproj/project.pbxproj delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner/AppDelegate.swift delete mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lib/core/model/active_medications/ActivePrescriptionReport.dart create mode 100644 lib/core/service/medical/ActiveMedicationsService.dart create mode 100644 lib/core/viewModels/medical/ActiveMedicationsViewModel.dart create mode 100644 lib/pages/medical/active_medications/ActiveMedicationsPage.dart create mode 100644 lib/pages/medical/active_medications/reminder_page.dart create mode 100644 lib/uitl/CalendarUtils.dart create mode 100644 lib/uitl/LocalNotification.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 884c7e09..f1a5a3f8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,7 +15,8 @@ - + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt index b8a87c8c..35ce314d 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt @@ -1,11 +1,36 @@ package com.cloud.diplomaticquarterapp -import androidx.annotation.NonNull; - import io.flutter.embedding.android.FlutterFragmentActivity - import io.flutter.embedding.engine.FlutterEngine - import io.flutter.plugins.GeneratedPluginRegistrant +import android.content.ContentResolver +import android.content.Context +import android.media.RingtoneManager +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugins.GeneratedPluginRegistrant -class MainActivity: FlutterFragmentActivity() { - override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { - GeneratedPluginRegistrant.registerWith(flutterEngine); - } +class MainActivity : FlutterActivity() { + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine) + MethodChannel(flutterEngine.dartExecutor, "crossingthestreams.io/resourceResolver").setMethodCallHandler { call: MethodCall, result: MethodChannel.Result -> + if ("drawableToUri" == call.method) { + val resourceId = this@MainActivity.resources.getIdentifier(call.arguments as String, "drawable", this@MainActivity.packageName) + result.success(resourceToUriString(this@MainActivity.applicationContext, resourceId)) + } + if ("getAlarmUri" == call.method) { + result.success(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM).toString()) + } + } + } + + companion object { + private fun resourceToUriString(context: Context, resId: Int): String { + return (ContentResolver.SCHEME_ANDROID_RESOURCE + + "://" + + context.resources.getResourcePackageName(resId) + + "/" + + context.resources.getResourceTypeName(resId) + + "/" + + context.resources.getResourceEntryName(resId)) + } + } } \ No newline at end of file diff --git a/android/app/src/main/res/drawable/app_icon.png b/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c4cc798d7408b624d2be0ae7a5276c50aa9ee25b GIT binary patch literal 1912 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 ba&_LNsHUcTP+UHw`VMLCzHW8oaPhwYY>_fz literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/food.png b/android/app/src/main/res/drawable/food.png new file mode 100644 index 0000000000000000000000000000000000000000..41b394d380a0ca9d6ebaa45c2ddb64d1ba7be0c2 GIT binary patch literal 1789 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D29ilcK~!i%?O4rk zR8GSuy@0>U9y?N7?7Kn-SOHSs@IrpA>&b{ZJd+)Pa zXrYA`T4>=xAzPeV*+1=V94NW_`faxax&x{TkuO2FccA3Gwfm~yCf$~YHMyC0I)=(V zdHzQEHA6G+l3xhDw!3b?cK5@%SvcoMDLWldQqH#hC3j?C%6&o1EQpRF=R9fc@ZD7+ zLI6YMElmT+mA8^_hT(JmQ~f2c7tYkw*^!^B{`k)||L89@f8u7%KXof0@|00Gaw(k;Y;VWt8UG0}+Z5^_XjDWDz}X&kI>zV9pOH@kXAUWG#W)TcyHfQ}L>yK+2^lFV zXIu8sK(HE9ebY0~iTPBhfAG21vFq=3B6J2~PDlBilO>---?aBCbD9GWU-10nH|mZZ zyQBn-GClSqHPm6_knQ<9rUD`#)iKrBhka>-woD%cvD=<`R)&i~{UafO z>qdw@a3t<@ou`hx!sNW9%_yAJSv-uq)>NRg+s;({&6BhK`^V!%Sr>FYXv4Pb!@g=q zgFrzjZolfUkYPipe@d%|ofjFv_xuxWpgeSE$ty66Jsg0kpm}}ZvdkQ2n2vw&ZKLB! zVwYc1&hRD@9tV zTq=DuF>7qnHpk$8Fah9%7B|vT=$@!7Yh|YJc6(>RCy^Ji0gU`bV|usYsoIDCX^t$1 zXmjvf5WplV9mmAv{V8rV1b{MsM^u*8)>-&a18B?SH;LE)Mm$~%j9~;p!_3(TRzDvXgTt*sx z*eS&GV6iC#=VNDt)!v!!4p#uYhz(%mk!@mLQ#gihVjN~aiW~4z{VVv^8;741aRBUr zU8=+i42swQM)(YTq-9jEDVV%H;zlfhRqMw(L>!!Q=u}G z4|jeP{CdE_VhFLRW(Mn|##suw!*0k&o)wR&$;wZ{2y=o+>{h!^IE{09Esphyx(+Z`T{- zZ;Ln;{PdwgH2bVVIZteLm?tdLgSz=XtMu94%Q8#@;sF#ci8uge-BBfZ5jO?jt2`w+ zFjIlgz_brroL#-!M2V%6)kaef1>$V8&nb#n0Le*)pcYZqL_9CJCopSYVDPdA!UKqV zg4Klg8FiREWz@w!Euz}MMmKGV*`|p3n90wIH~<7W&^;11NbD-H5X`=?-JAvzCEh4W zNqNxL-8)#U#IFSN0BQ3T$TifN|5C&c4*X<}+1$YUi&U#WIKzelzDOOf2M_G?dJ8SI f&_WCUV_4R|jPWVYtkgm#00000NkvXXu0mjfhB8mW literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/me.png b/android/app/src/main/res/drawable/me.png new file mode 100644 index 0000000000000000000000000000000000000000..ba75bc55bf4433d4fc364089c7556b6e119da94d GIT binary patch literal 1021 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1CmKZK~!i%?U-Lk zQ&AkpXF^dv^io7%^ks%)nGl7N;X^{GU_t+< zXp}kA{yjw`6(Q+^z9f;lQReyeJ9odq_4-rX+Rhg23m2y{gcaaf?!!d)u5GFrA-%eALPjTV$(F-0@j1 zv=KuSZ^>4jumSCxA4zB$)Pg;?4GUOr*AT9I)1-v*!GJH ztVhm~bGMxBd+qL@*-bX;V=nov-2w#g{-OmH#(+x*#22vafuRcoO)0 z9$*#4h+cSJ^Z5et$2}NyP>kq>J8_LOR{?&Nu2PKX<@N_(a^{K{q!`f)kI*DztcnSW r5xwvT1sP*S1cDSJrIb=)WitH*z#@M?8?WqE00000NkvXXu0mjfQ^nfk literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/sample_large_icon.png b/android/app/src/main/res/drawable/sample_large_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f354ca234d31b0d663336c154933042eb1513bdb GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ID|0t=hP86DQPxDme>0B8wRq_>O=u<5X=vX`rBur;B5VMQ?I~ z1nc64qys8qix`vx88%lWJG(G-xJ)(>5=#wWpPX?ZaMQ+xv5YQ@PIt5#v8Xnj2sB7y ZWQg9zdAz9V#xviX literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/secondary_icon.png b/android/app/src/main/res/drawable/secondary_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9de9ff41bdae5d1b3a2bfceb45861d035b8ec7fc GIT binary patch literal 1073 zcmV-11kU@3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGw)c^n-)dAs~2Fw5e02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00W^(L_t(oN7dI`$WB=p!12!vGfaa-j-!!s zm_mk>V{(i^j-`plG(|3^apzQW;gCe4kPDHBa)DwbB3y8T$eEF2&So5PX8iy4J@xk5 z-@Es_eQD;YUwysbT5GSp*0T<~B1e3Q`S>@*1bmkG&vobv%)reQV^AD5&;>m!|E{*E zg9a(SLSfW|qjn2_VHBz@9Hk#H35&4~YvELm$9E_mffhK8n9}{V&q{m`qdP9Z|386KmpPw&Gb=dn zg&lbghkOqfVtS=zIE;sQiNcN@gD>WE4~1>cMRBfG87AQrJU}$;-#rwk=_P z?S!3=`Zq8VcFNBAj7(vLX>drRF^9PyzCqTgkBM-^q8+z{z9=iY!MCx2w>W@iC=NUB zs#;ztDM1}ESL8{=v>%15E>pOg4#J8yup3F8G0d?wh_@eyqy+UhH^j?`vRhFLsqs5v zN&k(ms4B8{$nf`Ja7(bPNpC)tjK(+*D>yncQ7X#mP{e9Pc}J;aPMQx-Vc}D#Y9&SF z=}<@9hUKrKEfT{exD?U&Z1})Zk*7m-VP0C^Ss0GQIu_go3qHd@q(z<%`TqrQ^;*ZX z(AD};G=fXhLhcoATxpS~Lx!h*Y?yx{aVDDL8Z6}D*$Qcqw?l5Qk*g<=xMRE5M6!7b zyZxs{-VS-{$0^{dPV7(V}v|(6Fbxp-eD}{Nd1Vk$lIac@B-G^ zj>H`L7CT@echR4a7Czkb%PWeSBQ31sxfiFwJS46%d+BnFf{T#(dQe8V*?L&}43CjP zs4|AY^UK06eecHA9lh}wKI1InCYcyco6FF`T7ks*%^8mPHrTei^m?S8_@nU}R&phb zK$b*J3p?YbKT^WBdm%NfxDhc*XW*B^r-U!$i+K-^c0DpOkA6G2TSsL#N-tP>lDsxd zTyxU4oT`1Ohs@zJ^fGl1(J8+YX2E-M)^N99g?|w3IN}{pb{g2JKDdKu>=pdbn~L~c zcGMht`M1BhI{l#ZCE`?fWc)_+ew{lft>`j!--w2T`LGv$LYoguumOiq__ZQ8+AYX( zU}p-iwv!QGB3U^qo>lJR + \ No newline at end of file diff --git a/android/app/src/main/res/raw/slow_spring_board.mp3 b/android/app/src/main/res/raw/slow_spring_board.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..60dbf9794d2d1270b43308ab84425261ba2f5b19 GIT binary patch literal 37616 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 literal 0 HcmV?d00001 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 5ba52820..00000000 --- a/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,618 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 5A016D0DD1095D385566337C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC606583E610E227F8186476 /* Pods_Runner.framework */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 09DDD2020D673759BD0E86B8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A8949DBAE70E5B302D91F1DB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - AC606583E610E227F8186476 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E2D9C922B5D0172FE487333D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A016D0DD1095D385566337C /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0A1F078D9C068A8B18DE1EDB /* Pods */ = { - isa = PBXGroup; - children = ( - A8949DBAE70E5B302D91F1DB /* Pods-Runner.debug.xcconfig */, - E2D9C922B5D0172FE487333D /* Pods-Runner.release.xcconfig */, - 09DDD2020D673759BD0E86B8 /* Pods-Runner.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - 44EDA189DE1BB86E3A41BD4A /* Frameworks */ = { - isa = PBXGroup; - children = ( - AC606583E610E227F8186476 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 0A1F078D9C068A8B18DE1EDB /* Pods */, - 44EDA189DE1BB86E3A41BD4A /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - B4860726BBF5BF6213BBC91C /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72E9699567A7106FD141B9B3 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 72E9699567A7106FD141B9B3 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../Flutter/Flutter.framework", - "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", - "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", - "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", - "${BUILT_PRODUCTS_DIR}/Protobuf/protobuf.framework", - "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework", - "${BUILT_PRODUCTS_DIR}/TOCropViewController/TOCropViewController.framework", - "${BUILT_PRODUCTS_DIR}/barcode_scan/barcode_scan.framework", - "${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework", - "${BUILT_PRODUCTS_DIR}/device_info/device_info.framework", - "${BUILT_PRODUCTS_DIR}/flutter_flexible_toast/flutter_flexible_toast.framework", - "${BUILT_PRODUCTS_DIR}/flutter_inappwebview/flutter_inappwebview.framework", - "${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework", - "${BUILT_PRODUCTS_DIR}/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework", - "${BUILT_PRODUCTS_DIR}/hexcolor/hexcolor.framework", - "${BUILT_PRODUCTS_DIR}/image_cropper/image_cropper.framework", - "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework", - "${BUILT_PRODUCTS_DIR}/local_auth/local_auth.framework", - "${BUILT_PRODUCTS_DIR}/manage_calendar_events/manage_calendar_events.framework", - "${BUILT_PRODUCTS_DIR}/map_launcher/map_launcher.framework", - "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", - "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework", - "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/protobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TOCropViewController.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/barcode_scan.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_flexible_toast.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_inappwebview.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_plugin_android_lifecycle.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hexcolor.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_cropper.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/manage_calendar_events.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/map_launcher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - B4860726BBF5BF6213BBC91C /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloud.diplomaticquarterapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloud.diplomaticquarterapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloud.diplomaticquarterapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140cf..00000000 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14..00000000 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4a..00000000 --- a/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 8f1009c3..792eb95e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -22,6 +22,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + NSCalendarsUsageDescription + We Need to access the calender to add reminder for you UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a56..00000000 --- a/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/lib/config/config.dart b/lib/config/config.dart index ca902b45..698ff8df 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -218,6 +218,9 @@ const GET_WEIGHT_PRESSURE_RESULT='Services/Patients.svc/REST/Patient_GetWeightMe const ADD_WEIGHT_PRESSURE_RESULT='Services/Patients.svc/REST/Patient_AddWeightMeasurementResult'; +const ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID='Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID'; + + const TIMER_MIN = 10; diff --git a/lib/core/model/active_medications/ActivePrescriptionReport.dart b/lib/core/model/active_medications/ActivePrescriptionReport.dart new file mode 100644 index 00000000..866cb728 --- /dev/null +++ b/lib/core/model/active_medications/ActivePrescriptionReport.dart @@ -0,0 +1,146 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class ActivePrescriptionReport { + dynamic address; + int appointmentNo; + dynamic clinic; + dynamic companyName; + int days; + dynamic doctorName; + int doseDailyQuantity; + String frequency; + int frequencyNumber; + List image; + String imageExtension; + dynamic imageSRCUrl; + String imageString; + dynamic imageThumbUrl; + dynamic isCovered; + String itemDescription; + int itemID; + DateTime orderDate; + int patientID; + dynamic patientName; + dynamic phoneOffice1; + dynamic prescriptionQR; + int prescriptionTimes; + dynamic productImage; + String productImageBase64; + String productImageString; + int projectID; + dynamic projectName; + dynamic remarks; + String route; + String sKU; + int scaleOffset; + DateTime startDate; + + ActivePrescriptionReport( + {this.address, + this.appointmentNo, + this.clinic, + this.companyName, + this.days, + this.doctorName, + this.doseDailyQuantity, + this.frequency, + this.frequencyNumber, + this.image, + this.imageExtension, + this.imageSRCUrl, + this.imageString, + this.imageThumbUrl, + this.isCovered, + this.itemDescription, + this.itemID, + this.orderDate, + this.patientID, + this.patientName, + this.phoneOffice1, + this.prescriptionQR, + this.prescriptionTimes, + this.productImage, + this.productImageBase64, + this.productImageString, + this.projectID, + this.projectName, + this.remarks, + this.route, + this.sKU, + this.scaleOffset, + this.startDate}); + + ActivePrescriptionReport.fromJson(Map json) { + address = json['Address']; + appointmentNo = json['AppointmentNo']; + clinic = json['Clinic']; + companyName = json['CompanyName']; + days = json['Days']; + doctorName = json['DoctorName']; + doseDailyQuantity = json['DoseDailyQuantity']; + frequency = json['Frequency']; + frequencyNumber = json['FrequencyNumber']; + image = json['Image'].cast(); + imageExtension = json['ImageExtension']; + imageSRCUrl = json['ImageSRCUrl']; + imageString = json['ImageString']; + imageThumbUrl = json['ImageThumbUrl']; + isCovered = json['IsCovered']; + itemDescription = json['ItemDescription']; + itemID = json['ItemID']; + orderDate = DateUtil.convertStringToDate(json['OrderDate']); + patientID = json['PatientID']; + patientName = json['PatientName']; + phoneOffice1 = json['PhoneOffice1']; + prescriptionQR = json['PrescriptionQR']; + prescriptionTimes = json['PrescriptionTimes']; + productImage = json['ProductImage']; + productImageBase64 = json['ProductImageBase64']; + productImageString = json['ProductImageString']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + remarks = json['Remarks']; + route = json['Route']; + sKU = json['SKU']; + scaleOffset = json['ScaleOffset']; + startDate = DateUtil.convertStringToDate(json['StartDate']); + } + + Map toJson() { + final Map data = new Map(); + data['Address'] = this.address; + data['AppointmentNo'] = this.appointmentNo; + data['Clinic'] = this.clinic; + data['CompanyName'] = this.companyName; + data['Days'] = this.days; + data['DoctorName'] = this.doctorName; + data['DoseDailyQuantity'] = this.doseDailyQuantity; + data['Frequency'] = this.frequency; + data['FrequencyNumber'] = this.frequencyNumber; + data['Image'] = this.image; + data['ImageExtension'] = this.imageExtension; + data['ImageSRCUrl'] = this.imageSRCUrl; + data['ImageString'] = this.imageString; + data['ImageThumbUrl'] = this.imageThumbUrl; + data['IsCovered'] = this.isCovered; + data['ItemDescription'] = this.itemDescription; + data['ItemID'] = this.itemID; + data['OrderDate'] = this.orderDate; + data['PatientID'] = this.patientID; + data['PatientName'] = this.patientName; + data['PhoneOffice1'] = this.phoneOffice1; + data['PrescriptionQR'] = this.prescriptionQR; + data['PrescriptionTimes'] = this.prescriptionTimes; + data['ProductImage'] = this.productImage; + data['ProductImageBase64'] = this.productImageBase64; + data['ProductImageString'] = this.productImageString; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['Remarks'] = this.remarks; + data['Route'] = this.route; + data['SKU'] = this.sKU; + data['ScaleOffset'] = this.scaleOffset; + data['StartDate'] = this.startDate; + return data; + } +} diff --git a/lib/core/service/medical/ActiveMedicationsService.dart b/lib/core/service/medical/ActiveMedicationsService.dart new file mode 100644 index 00000000..070b7e5f --- /dev/null +++ b/lib/core/service/medical/ActiveMedicationsService.dart @@ -0,0 +1,27 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/active_medications/ActivePrescriptionReport.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class ActiveMedicationsService extends BaseService{ + + List activePrescriptionReport = List(); + + getActiveMedication() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID, + onSuccess: (response, statusCode) async { + activePrescriptionReport.clear(); + response['List_ActiveGetPrescriptionReportByPatientID'].forEach((appoitment) { + activePrescriptionReport + .add(ActivePrescriptionReport.fromJson(appoitment)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + +} \ No newline at end of file diff --git a/lib/core/viewModels/medical/ActiveMedicationsViewModel.dart b/lib/core/viewModels/medical/ActiveMedicationsViewModel.dart new file mode 100644 index 00000000..ee4f37c5 --- /dev/null +++ b/lib/core/viewModels/medical/ActiveMedicationsViewModel.dart @@ -0,0 +1,28 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/active_medications/ActivePrescriptionReport.dart'; +import 'package:diplomaticquarterapp/core/service/medical/ActiveMedicationsService.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +class ActiveMedicationsViewModel extends BaseViewModel { + ActiveMedicationsService _activeMedicationsService = + locator(); + + List get activePrescriptionReport => + _activeMedicationsService.activePrescriptionReport; + + getActiveMedication() async { + setState(ViewState.Busy); + await _activeMedicationsService.getActiveMedication(); + if (_activeMedicationsService.hasError) { + error = _activeMedicationsService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + + + +} diff --git a/lib/locator.dart b/lib/locator.dart index 4c5a1df3..79e92a63 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -9,6 +9,7 @@ import 'core/service/er/am_service.dart'; import 'core/service/er/er_service.dart'; import 'core/service/feedback/feedback_service.dart'; import 'core/service/hospital_service.dart'; +import 'core/service/medical/ActiveMedicationsService.dart'; import 'core/service/medical/BloodPressureService.dart'; import 'core/service/medical/BloodSugarService.dart'; import 'core/service/medical/EyeService.dart'; @@ -28,6 +29,7 @@ import 'core/viewModels/er/near_hospital_view_model.dart'; import 'core/viewModels/feedback/feedback_view_model.dart'; import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; +import 'core/viewModels/medical/ActiveMedicationsViewModel.dart'; import 'core/viewModels/medical/EyeViewModel.dart'; import 'core/viewModels/medical/blood_pressure_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart'; @@ -80,6 +82,7 @@ void setupLocator() { locator.registerLazySingleton(() => BloodPressureService()); locator.registerLazySingleton(() => WeightService()); locator.registerLazySingleton(() => EyeService()); + locator.registerLazySingleton(() => ActiveMedicationsService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -106,5 +109,6 @@ void setupLocator() { locator.registerFactory(() => BloodPressureViewMode()); locator.registerFactory(() => WeightPressureViewMode()); locator.registerFactory(() => EyeViewModel()); + locator.registerFactory(() => ActiveMedicationsViewModel()); } diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index d892be83..9cd88cd9 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:typed_data'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; @@ -13,6 +14,8 @@ import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/CalendarUtils.dart'; +import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; @@ -21,12 +24,17 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; +import 'package:rxdart/rxdart.dart'; import 'home_page.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; + + + class LandingPage extends StatefulWidget { static bool isOpenCallPage = false; @@ -43,6 +51,16 @@ class _LandingPageState extends State with WidgetsBindingObserver { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); final authService = new AuthProvider(); + void _requestIOSPermissions() { + flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + } bool isPageNavigated = false; _changeCurrentTab(int tab) { @@ -106,6 +124,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { setState(() { AppGlobal.context = context; }); + _requestIOSPermissions(); pageController = PageController(keepPage: true); _firebaseMessaging.setAutoInitEnabled(true); @@ -245,7 +264,9 @@ class _LandingPageState extends State with WidgetsBindingObserver { ); } - showDialog(String message) { + + + showDialogs(String message) { ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: message, @@ -263,10 +284,55 @@ class _LandingPageState extends State with WidgetsBindingObserver { Permission.camera, Permission.photos, Permission.notification, - Permission.accessMediaLocation + Permission.accessMediaLocation, + Permission.calendar, ].request(); + + var permissionsGranted = await deviceCalendarPlugin.hasPermissions(); + if (permissionsGranted.isSuccess && !permissionsGranted.data) { + permissionsGranted = await deviceCalendarPlugin.requestPermissions(); + if (!permissionsGranted.isSuccess || !permissionsGranted.data) { + return; + } + } + } + Future _scheduleNotification() async { + var scheduledNotificationDateTime = + DateTime.now().add(Duration(seconds: 5)); + var vibrationPattern = Int64List(4); + vibrationPattern[0] = 0; + vibrationPattern[1] = 1000; + vibrationPattern[2] = 5000; + vibrationPattern[3] = 2000; + + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'your other channel id', + 'your other channel name', + 'your other channel description', + // icon: 'secondary_icon', + sound: RawResourceAndroidNotificationSound('slow_spring_board'), + largeIcon: DrawableResourceAndroidBitmap('sample_large_icon'), + vibrationPattern: vibrationPattern, + enableLights: true, + color: const Color.fromARGB(255, 255, 0, 0), + ledColor: const Color.fromARGB(255, 255, 0, 0), + ledOnMs: 1000, + ledOffMs: 500); + var iOSPlatformChannelSpecifics = + IOSNotificationDetails(sound: 'slow_spring_board.aiff'); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.schedule( + 0, + 'scheduled title', + 'scheduled body', + scheduledNotificationDateTime, + platformChannelSpecifics); + } + + @override Widget build(BuildContext context) { //final searchValue = Provider.of(context); diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 7510987c..c1f04a71 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -131,6 +131,7 @@ class _Login extends State { } void validateForm() { + //TODO fix login if (util.validateIDBox(nationalIDorFile.text, loginType) == true && mobileNo.length >= 9 && util.isSAUDIIDValid(nationalIDorFile.text, loginType) == true) { @@ -139,7 +140,7 @@ class _Login extends State { }); } else { setState(() { - isButtonDisabled = true; + isButtonDisabled = false; }); } } diff --git a/lib/pages/medical/active_medications/ActiveMedicationsPage.dart b/lib/pages/medical/active_medications/ActiveMedicationsPage.dart new file mode 100644 index 00000000..3409c3db --- /dev/null +++ b/lib/pages/medical/active_medications/ActiveMedicationsPage.dart @@ -0,0 +1,129 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/ActiveMedicationsViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/active_medications/reminder_page.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/utils.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'; + +class ActiveMedicationsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getActiveMedication(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: 'Active Medications', + isShowAppBar: true, + body: Container( + child: ListView.builder( + itemCount: model.activePrescriptionReport.length, + itemBuilder: (context, index) => Container( + padding: EdgeInsets.all(10), + margin: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), color: Colors.white), + child: Row( + children: [ + Image.memory( + Utils.dataFromBase64String(model + .activePrescriptionReport[index].productImageBase64), + height: SizeConfig.imageSizeMultiplier * 19, + width: SizeConfig.imageSizeMultiplier * 18, + fit: BoxFit.cover, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + model.activePrescriptionReport[index].itemDescription, + bold: true, + ), + SizedBox( + height: 5, + ), + Texts( + 'Exp Date :' + + DateUtil.getDayMonthYearDateFormatted(model + .activePrescriptionReport[index].orderDate), + ), + SizedBox( + height: 5, + ), + Texts( + 'Route :' + + model.activePrescriptionReport[index].route, + ), + SizedBox( + height: 5, + ), + Texts( + 'Frequency :' + + model.activePrescriptionReport[index].frequency, + ), + SizedBox( + height: 5, + ), + Texts( + 'Daily Quantity :${model.activePrescriptionReport[index].doseDailyQuantity}', + ), + ], + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: ReminderPage( + frequency: model.activePrescriptionReport[index] + .frequencyNumber, + days: model.activePrescriptionReport[index].days, + itemDescription: model + .activePrescriptionReport[index] + .itemDescription, + ), + ), + ); + }, + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon( + Icons.notifications, + color: Colors.red, + size: 28, + ), + Row( + children: [ + Icon( + Icons.notifications_active, + color: Colors.red, + size: 28, + ), + Texts( + 'Reminder', + color: Colors.red, + ) + ], + ) + ], + ), + ), + ) + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/active_medications/reminder_page.dart b/lib/pages/medical/active_medications/reminder_page.dart new file mode 100644 index 00000000..72f6c211 --- /dev/null +++ b/lib/pages/medical/active_medications/reminder_page.dart @@ -0,0 +1,263 @@ +import 'package:diplomaticquarterapp/core/viewModels/medical/ActiveMedicationsViewModel.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/CalendarUtils.dart'; +import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.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:flutter_datetime_picker/flutter_datetime_picker.dart'; +import 'package:provider/provider.dart'; + +// ignore: must_be_immutable +class ReminderPage extends StatefulWidget { + final int frequency; + final int days; + final String itemDescription; + + List _scheduleList = List(); + + DateTime startDay; + DateTime endDay; + + ReminderPage({Key key, this.frequency, this.days, this.itemDescription}) { + startDay = DateTime.now(); + endDay = DateTime.now().add(Duration(days: days)); + int hour = (24 ~/ frequency).round(); + int durations = 24 ~/ hour; + for (int count = 0; count < durations; count++) { + _scheduleList.add(DateTime(DateTime.now().year, DateTime.now().month, + DateTime.now().day, (hour * count))); + } + } + + @override + _ReminderPageState createState() => _ReminderPageState(); +} + +class _ReminderPageState extends State { + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + + return BaseView( + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + isShowAppBar: true, + appBarTitle: 'Reminder', + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.maxFinite, + child: Texts( + 'Please select treatment start day and time to be notified when it\'s time to take the medicine'), + ), + Divider(), + SizedBox( + height: 12, + ), + Texts('Start day'), + InkWell( + onTap: () { + DatePicker.showDatePicker(context, + showTitleActions: true, + minTime: DateTime( + DateTime.now().year, DateTime.now().month - 1, 1), + maxTime: DateTime.now(), onConfirm: (date) { + print('confirm $date'); + setState(() { + widget.startDay = date; + }); + }, + currentTime: widget.startDay, + 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(getStartDay()), + Icon( + Icons.calendar_today, + color: Colors.black, + ) + ], + ), + ), + ), + SizedBox( + height: 12, + ), + Texts('End day'), + InkWell( + onTap: () { + DatePicker.showDatePicker(context, + showTitleActions: true, + minTime: DateTime( + DateTime.now().year, DateTime.now().month - 1, 1), + maxTime: DateTime.now(), onConfirm: (date) { + print('confirm $date'); + setState(() { + widget.endDay = date; + }); + }, + currentTime: widget.endDay, + 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(getEndDay()), + Icon( + Icons.calendar_today, + color: Colors.black, + ) + ], + ), + ), + ), + ...List.generate( + widget._scheduleList.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 7, + ), + Texts('Schedule time'), + SizedBox( + height: 7, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker(context, + showTitleActions: true, onConfirm: (date) { + print('confirm $date'); + setState(() { + widget._scheduleList[index] = date; + }); + }, + currentTime: widget._scheduleList[index], + 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(getDateTime( + widget._scheduleList[index])), + Icon( + Icons.access_time, + color: Colors.black, + ) + ], + ), + ), + ), + ], + )), + Container( + width: double.maxFinite, + height: MediaQuery.of(context).size.height * 0.12, + ), + ], + ), + ), + ), + bottomSheet: Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.1, + padding: EdgeInsets.all(10), + child: SecondaryButton( + label: 'OK', + color: Colors.grey[800], + onTap: () { + schedule(); + }, + ), + ), + ), + ); + } + + schedule() async { + List scheduleDateTime = + calculateDaysInterval(widget.startDay, widget.endDay); + + // scheduleDateTime.forEach((date) { + // LocalNotification.scheduleNotification( + // scheduledNotificationDateTime: date, + // title: 'Remainder', + // description: widget.itemDescription); + // return; + // }); + + CalendarUtils calendarUtils = await CalendarUtils.getInstance(); + + calendarUtils.createOrUpdateEvents( + scheduleList: widget._scheduleList, + description: widget.itemDescription, + title: widget.itemDescription, + scheduleDateTime: scheduleDateTime); + + + + var asd = calendarUtils.writableCalendars; + Navigator.pop(context); + } + + List calculateDaysInterval(DateTime startDate, DateTime endDate) { + List days = []; + for (int i = 0; i <= endDate.difference(startDate).inDays; i++) { + widget._scheduleList.forEach((element) { + days.add(startDate.add( + Duration(days: i, hours: element.hour, minutes: element.minute))); + }); + } + return days; + } + + String getStartDay() { + return "${DateUtil.getMonth(widget.startDay.month)} ${widget.startDay.day}, ${widget.startDay.year}"; + } + + String getEndDay() { + return "${DateUtil.getMonth(widget.endDay.month)} ${widget.endDay.day}, ${widget.endDay.year}"; + } + + String getDateTime(DateTime dateTime) { + return '${dateTime.hour}:${dateTime.minute}'; + } + + String getDays() { + return ''; + } +} diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 2ac090b9..cf9738df 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -24,6 +24,7 @@ import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; import 'package:provider/provider.dart'; import '../../locator.dart'; +import 'active_medications/ActiveMedicationsPage.dart'; import 'balance/my_balance_page.dart'; import 'doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; @@ -186,8 +187,8 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( -// onTap: () => Navigator.push( -// context, FadePage(page: RadiologyHomePage())), + onTap: () => Navigator.push(context, + FadePage(page: ActiveMedicationsPage())), child: MedicalProfileItem( title: TranslationBase.of(context) .myMedical, diff --git a/lib/uitl/CalendarUtils.dart b/lib/uitl/CalendarUtils.dart new file mode 100644 index 00000000..d61a19b6 --- /dev/null +++ b/lib/uitl/CalendarUtils.dart @@ -0,0 +1,77 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:device_calendar/device_calendar.dart'; + +final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); + +class CalendarUtils { + static Completer _completer; + + Calendar get writableCalendars => calendars?.firstWhere((c) => !c.isReadOnly); + List calendars; + + CalendarUtils._(this.calendars); + + static Future getInstance() async { + if (_completer == null) { + _completer = Completer(); + try { + final calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); + _completer.complete(CalendarUtils._(calendarsResult?.data)); + } on Exception catch (e) { + _completer.completeError(e); + final Future sharedPrefsFuture = _completer.future; + _completer = null; + return sharedPrefsFuture; + } + } + return _completer.future; + } + + Future createOrUpdateEvents( + {List scheduleList, + String title, + String description, + List scheduleDateTime}) async { + List events = List(); + scheduleDateTime.forEach((element) { + RecurrenceRule recurrenceRule = RecurrenceRule( + RecurrenceFrequency.Daily, + endDate: element, + ); + Event event = Event(writableCalendars.id, + recurrenceRule: recurrenceRule, + start: element, + end: element.add(Duration(minutes: 30)), + title: title, + description: description); + events.add(event); + }); + + events.forEach((element) { + deviceCalendarPlugin.createOrUpdateEvent(element); + }); + } + + deleteEvent(Calendar _calendar, Event _event) async { + await deviceCalendarPlugin.deleteEvent(_calendar.id, _event.eventId); + } + + Future retrieveEvents( + String calendarId, + RetrieveEventsParams retrieveEventsParams, + ) async { + return await deviceCalendarPlugin.retrieveEvents( + calendarId, retrieveEventsParams); + } + + Future createCalendar( + String calendarName, { + Color calendarColor, + String localAccountName, + }) async { + return await deviceCalendarPlugin.createCalendar(calendarName, + calendarColor: calendarColor, localAccountName: localAccountName); + } +} diff --git a/lib/uitl/LocalNotification.dart b/lib/uitl/LocalNotification.dart new file mode 100644 index 00000000..ac4f5860 --- /dev/null +++ b/lib/uitl/LocalNotification.dart @@ -0,0 +1,97 @@ +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + +class LocalNotification { + + + static Future scheduleNotification( + {@required DateTime scheduledNotificationDateTime, + @required String title, + @required String description}) async { + + ///vibrationPattern + var vibrationPattern = Int64List(4); + vibrationPattern[0] = 0; + vibrationPattern[1] = 1000; + vibrationPattern[2] = 5000; + vibrationPattern[3] = 2000; + + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'active-prescriptions', + 'ActivePrescriptions', + 'ActivePrescriptionsDescription', + // icon: 'secondary_icon', + sound: RawResourceAndroidNotificationSound('slow_spring_board'),///change it to be as ionic + // largeIcon: DrawableResourceAndroidBitmap('sample_large_icon'),///change it to be as ionic + vibrationPattern: vibrationPattern, + enableLights: true, + color: const Color.fromARGB(255, 255, 0, 0), + ledColor: const Color.fromARGB(255, 255, 0, 0), + ledOnMs: 1000, + ledOffMs: 500); + var iOSPlatformChannelSpecifics = + IOSNotificationDetails(sound: 'slow_spring_board.aiff');///change it to be as ionic + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.schedule( + 0, + title, + description, + scheduledNotificationDateTime, + platformChannelSpecifics); + } + + ///Repeat notification every day at approximately 10:00:00 am + static Future showDailyAtTime() async { + var time = Time(10, 0, 0); + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'repeatDailyAtTime channel id', + 'repeatDailyAtTime channel name', + 'repeatDailyAtTime description'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.showDailyAtTime( + 0, + 'show daily title', + 'Daily notification shown at approximately ${_toTwoDigitString(time.hour)}:${_toTwoDigitString(time.minute)}:${_toTwoDigitString(time.second)}', + time, + platformChannelSpecifics); + } + + ///Repeat notification weekly on Monday at approximately 10:00:00 am + static Future showWeeklyAtDayAndTime() async { + var time = Time(10, 0, 0); + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'show weekly channel id', + 'show weekly channel name', + 'show weekly description'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime( + 0, + 'show weekly title', + 'Weekly notification shown on Monday at approximately ${_toTwoDigitString(time.hour)}:${_toTwoDigitString(time.minute)}:${_toTwoDigitString(time.second)}', + Day.Monday, + time, + platformChannelSpecifics); + } + + static String _toTwoDigitString(int value) { + return value.toString().padLeft(2, '0'); + } + + static Future cancelNotification() async { + await flutterLocalNotificationsPlugin.cancel(0); + } + + static Future cancelAllNotifications() async { + await flutterLocalNotificationsPlugin.cancelAll(); + } +} diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 6958e67f..52138759 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -1,3 +1,6 @@ +import 'dart:convert'; +import 'dart:typed_data'; + import 'package:connectivity/connectivity.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -137,4 +140,8 @@ class Utils { // await pr.hide(); // } } + + static Uint8List dataFromBase64String(String base64String) { + return base64Decode(base64String); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 4204d4ad..49710761 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -112,6 +112,10 @@ dependencies: flutter_datetime_picker: ^1.4.0 + flutter_local_notifications: ^1.4.4+4 + rxdart: ^0.24.1 + + device_calendar: ^3.1.0 #Handle Geolocation geolocator: ^6.0.0+1 From 82c2577d3612bce62b3fd7dafc003332e8ffd1e6 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 28 Sep 2020 15:53:14 +0300 Subject: [PATCH 5/8] Done ask doctor service --- lib/config/config.dart | 6 + .../model/ask_doctor/AskDoctorReqTypes.dart | 92 +++++++ lib/core/model/ask_doctor/DoctorResponse.dart | 76 ++++++ lib/core/service/client/base_app_client.dart | 3 +- .../service/medical/ask_doctor_services.dart | 106 ++++++++ .../service/medical/my_doctor_service.dart | 30 +-- lib/core/viewModels/base_view_model.dart | 10 +- .../medical/ask_doctor_view_model.dart | 110 ++++++++ lib/locator.dart | 5 +- .../BookAppointment/widgets/DoctorView.dart | 1 + .../ask_doctor/ViewDoctorResponsesPage.dart | 32 +++ .../ask_doctor/ask_doctor_home_page.dart | 125 +++++++++ .../medical/ask_doctor/ask_doctor_page.dart | 243 ++++++++++++++++++ .../medical/ask_doctor/doctor_response.dart | 178 +++++++++++++ .../medical/ask_doctor/request_type.dart | 132 ++++++++++ lib/pages/medical/medical_profile_page.dart | 17 +- lib/uitl/date_uitl.dart | 10 + .../others/app_expandable_notifier.dart | 5 +- 18 files changed, 1147 insertions(+), 34 deletions(-) create mode 100644 lib/core/model/ask_doctor/AskDoctorReqTypes.dart create mode 100644 lib/core/model/ask_doctor/DoctorResponse.dart create mode 100644 lib/core/service/medical/ask_doctor_services.dart create mode 100644 lib/core/viewModels/medical/ask_doctor_view_model.dart create mode 100644 lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart create mode 100644 lib/pages/medical/ask_doctor/ask_doctor_home_page.dart create mode 100644 lib/pages/medical/ask_doctor/ask_doctor_page.dart create mode 100644 lib/pages/medical/ask_doctor/doctor_response.dart create mode 100644 lib/pages/medical/ask_doctor/request_type.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index 698ff8df..a34848d5 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -220,6 +220,12 @@ const ADD_WEIGHT_PRESSURE_RESULT='Services/Patients.svc/REST/Patient_AddWeightMe const ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID='Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID'; +const GET_CALL_INFO_HOURS_RESULT = 'Services/Doctors.svc/REST/GetCallInfoHoursResult'; +const GET_CALL_REQUEST_TYPE_LOV = 'Services/Doctors.svc/REST/GetCallRequestType_LOV'; +const GET_DOCTOR_RESPONSE = 'Services/Patients.svc/REST/GetDoctorResponse'; +const UPDATE_READ_STATUS = 'Services/Patients.svc/REST/UpdateReadStatus'; +const INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo'; + const TIMER_MIN = 10; diff --git a/lib/core/model/ask_doctor/AskDoctorReqTypes.dart b/lib/core/model/ask_doctor/AskDoctorReqTypes.dart new file mode 100644 index 00000000..b306f97b --- /dev/null +++ b/lib/core/model/ask_doctor/AskDoctorReqTypes.dart @@ -0,0 +1,92 @@ +class AskDoctorReqTypes { + dynamic setupID; + int parameterGroup; + int parameterType; + int parameterCode; + String description; + dynamic descriptionN; + dynamic alias; + dynamic aliasN; + dynamic prefix; + dynamic suffix; + dynamic isColorCodingRequired; + dynamic backColor; + dynamic foreColor; + bool isBuiltIn; + bool isActive; + int createdBy; + String createdOn; + dynamic editedBy; + dynamic editedOn; + dynamic rowVer; + + AskDoctorReqTypes( + {this.setupID, + this.parameterGroup, + this.parameterType, + this.parameterCode, + this.description, + this.descriptionN, + this.alias, + this.aliasN, + this.prefix, + this.suffix, + this.isColorCodingRequired, + this.backColor, + this.foreColor, + this.isBuiltIn, + this.isActive, + this.createdBy, + this.createdOn, + this.editedBy, + this.editedOn, + this.rowVer}); + + AskDoctorReqTypes.fromJson(Map json) { + setupID = json['SetupID']; + parameterGroup = json['ParameterGroup']; + parameterType = json['ParameterType']; + parameterCode = json['ParameterCode']; + description = json['Description']; + descriptionN = json['DescriptionN']; + alias = json['Alias']; + aliasN = json['AliasN']; + prefix = json['Prefix']; + suffix = json['Suffix']; + isColorCodingRequired = json['IsColorCodingRequired']; + backColor = json['BackColor']; + foreColor = json['ForeColor']; + isBuiltIn = json['IsBuiltIn']; + isActive = json['IsActive']; + createdBy = json['CreatedBy']; + createdOn = json['CreatedOn']; + editedBy = json['EditedBy']; + editedOn = json['EditedOn']; + rowVer = json['RowVer']; + } + + Map toJson() { + final Map data = new Map(); + data['SetupID'] = this.setupID; + data['ParameterGroup'] = this.parameterGroup; + data['ParameterType'] = this.parameterType; + data['ParameterCode'] = this.parameterCode; + data['Description'] = this.description; + data['DescriptionN'] = this.descriptionN; + data['Alias'] = this.alias; + data['AliasN'] = this.aliasN; + data['Prefix'] = this.prefix; + data['Suffix'] = this.suffix; + data['IsColorCodingRequired'] = this.isColorCodingRequired; + data['BackColor'] = this.backColor; + data['ForeColor'] = this.foreColor; + data['IsBuiltIn'] = this.isBuiltIn; + data['IsActive'] = this.isActive; + data['CreatedBy'] = this.createdBy; + data['CreatedOn'] = this.createdOn; + data['EditedBy'] = this.editedBy; + data['EditedOn'] = this.editedOn; + data['RowVer'] = this.rowVer; + return data; + } +} diff --git a/lib/core/model/ask_doctor/DoctorResponse.dart b/lib/core/model/ask_doctor/DoctorResponse.dart new file mode 100644 index 00000000..0dcd41b0 --- /dev/null +++ b/lib/core/model/ask_doctor/DoctorResponse.dart @@ -0,0 +1,76 @@ +class DoctorResponse { + int projectID; + int transactionNo; + int patientID; + int doctorID; + int requestType; + String requestTypeDescription; + dynamic requestTypeDescriptionN; + int status; + String remarks; + String createdOn; + dynamic readStatus; + String doctorName; + bool isDoctorRespond; + bool isPatientRead; + List transactions; + + DoctorResponse( + {this.projectID, + this.transactionNo, + this.patientID, + this.doctorID, + this.requestType, + this.requestTypeDescription, + this.requestTypeDescriptionN, + this.status, + this.remarks, + this.createdOn, + this.readStatus, + this.doctorName, + this.isDoctorRespond, + this.isPatientRead, + this.transactions}); + + DoctorResponse.fromJson(Map json) { + projectID = json['ProjectID']; + transactionNo = json['TransactionNo']; + patientID = json['PatientID']; + doctorID = json['DoctorID']; + requestType = json['RequestType']; + requestTypeDescription = json['RequestTypeDescription']; + requestTypeDescriptionN = json['RequestTypeDescriptionN']; + status = json['Status']; + remarks = json['Remarks']; + createdOn = json['CreatedOn']; + readStatus = json['ReadStatus']; + doctorName = json['DoctorName']; + isDoctorRespond = json['IsDoctorRespond']; + isPatientRead = json['IsPatientRead']; + if (json['Transactions'] != null) { + transactions = json['Transactions']; + } + } + + Map toJson() { + final Map data = new Map(); + data['ProjectID'] = this.projectID; + data['TransactionNo'] = this.transactionNo; + data['PatientID'] = this.patientID; + data['DoctorID'] = this.doctorID; + data['RequestType'] = this.requestType; + data['RequestTypeDescription'] = this.requestTypeDescription; + data['RequestTypeDescriptionN'] = this.requestTypeDescriptionN; + data['Status'] = this.status; + data['Remarks'] = this.remarks; + data['CreatedOn'] = this.createdOn; + data['ReadStatus'] = this.readStatus; + data['DoctorName'] = this.doctorName; + data['IsDoctorRespond'] = this.isDoctorRespond; + data['IsPatientRead'] = this.isPatientRead; + if (this.transactions != null) { + data['Transactions'] = this.transactions.map((v) => v.toJson()).toList(); + } + return data; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 8fde2166..289112ee 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -67,8 +67,7 @@ class BaseAppClient { if (user != null) { body['TokenID'] = token; - body['PatientID'] = - body['PatientID'] != null ? body['PatientID'] : user['PatientID']; + body['PatientID'] = user['PatientID']; body['PatientOutSA'] = user['OutSA']; body['SessionID'] = getSessionId(token); } diff --git a/lib/core/service/medical/ask_doctor_services.dart b/lib/core/service/medical/ask_doctor_services.dart new file mode 100644 index 00000000..9a819a6e --- /dev/null +++ b/lib/core/service/medical/ask_doctor_services.dart @@ -0,0 +1,106 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/ask_doctor/AskDoctorReqTypes.dart'; +import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class AskDoctorService extends BaseService { + List askDoctorReqTypes = List(); + List doctorResponseList = List(); + + Future getCallInfoHoursResult({int projectId, int doctorId}) async { + hasError = false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['DoctorID'] = doctorId; + body['ProjectID'] = projectId; + + await baseAppClient.post(GET_CALL_INFO_HOURS_RESULT, + onSuccess: (dynamic response, int statusCode) { + ///OKAY + var asd=""; + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future getCallRequestTypeLOV() async { + hasError =false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(GET_CALL_REQUEST_TYPE_LOV, + onSuccess: (dynamic response, int statusCode) { + askDoctorReqTypes.clear(); + response['ListReqTypes'].forEach((reqType) { + askDoctorReqTypes.add(AskDoctorReqTypes.fromJson(reqType)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future getDoctorResponse() async { + hasError =false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['from'] = + "${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} 00:00:00"; + body['from'] = + "${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}:00"; + await baseAppClient.post(GET_DOCTOR_RESPONSE, + onSuccess: (dynamic response, int statusCode) { + doctorResponseList.clear(); + response['List_DoctorResponse'].forEach((reqType) { + doctorResponseList.add(DoctorResponse.fromJson(reqType)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future updateReadStatus({int transactionNo}) async { + hasError =false; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['TransactionNo'] = transactionNo; + await baseAppClient.post(UPDATE_READ_STATUS, + onSuccess: (dynamic response, int statusCode) { + //TODO fix it + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + + Future sendRequestLOV({DoctorList doctorList,String requestType,String remark}) async { + hasError =false; + Map body = Map(); + body['ProjectID'] = doctorList.projectID; + body['SetupID'] = doctorList.setupID; + body['DoctorID'] = doctorList.doctorID; + body['PatientMobileNumber'] = user.mobileNumber; + body['IsMessageSent'] = false; + body['RequestDate'] = DateUtil.yearMonthDay(DateTime.now()); + body['RequestTime'] = DateUtil.time(DateTime.now()); + body['Remarks'] = remark; + body['Status'] = 2;// 4 for testing only.."cancelled status insert" else should be changed to 1 in live version + body['CreatedBy'] = 102; + body['CreatedOn'] = DateUtil.yearMonthDay(DateTime.now()); + body['EditedBy'] = 102; + body['EditedOn'] = DateUtil.yearMonthDay(DateTime.now()); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(INSERT_CALL_INFO, + onSuccess: (dynamic response, int statusCode) { + + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + +} diff --git a/lib/core/service/medical/my_doctor_service.dart b/lib/core/service/medical/my_doctor_service.dart index 4df3ce8a..f2ba067a 100644 --- a/lib/core/service/medical/my_doctor_service.dart +++ b/lib/core/service/medical/my_doctor_service.dart @@ -15,22 +15,8 @@ class MyDoctorService extends BaseService { RequestPatientDoctorAppointment patientDoctorAppointmentRequest = RequestPatientDoctorAppointment( - top: 0, - versionID: 5.5, - beforeDays: 0, - exludType: 4, - channel: 3, - languageID: 2, - iPAdress: '10.20.10.20', - generalid: 'Cs2020@2016\$2958', - patientOutSA: 0, - sessionID: 'TMRhVmkGhOsvamErw', - isDentalAllowedBackend: false, - deviceTypeID: 1, - patientID: 1231755, - tokenID: '@dm!n', - patientType: 1, - patientTypeID: 1); + isDentalAllowedBackend: false, + ); RequestDoctorRating _requestDoctorRating = RequestDoctorRating( channel: 3, @@ -44,7 +30,12 @@ class MyDoctorService extends BaseService { generalid: 'Cs2020@2016\$2958', isDentalAllowedBackend: false); - Future getPatientDoctorAppointmentList() async { + Future getPatientDoctorAppointmentList({int top = 0, int beforeDays = 0,int exludType=4}) async { + hasError = false; + patientDoctorAppointmentRequest.top = top; + patientDoctorAppointmentRequest.beforeDays = beforeDays; + patientDoctorAppointmentRequest.exludType = exludType; + await baseAppClient.post(GET_MY_DOCTOR, onSuccess: (dynamic response, int statusCode) { patientDoctorAppointmentList.clear(); @@ -75,7 +66,8 @@ class MyDoctorService extends BaseService { deviceTypeID: 2, ); - Future getDoctorProfileAndRating({int doctorId,int clinicID,int projectID }) async { + Future getDoctorProfileAndRating( + {int doctorId, int clinicID, int projectID}) async { ///GET DOCTOR PROFILE _requestDoctorProfile.doctorID = doctorId; _requestDoctorProfile.clinicID = clinicID; @@ -89,8 +81,6 @@ class MyDoctorService extends BaseService { doctorList.doctorTitle = doctorProfile.doctorTitleForProfile; doctorList.name = doctorProfile.doctorName; doctorList.projectName = doctorProfile.projectName; - - }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; diff --git a/lib/core/viewModels/base_view_model.dart b/lib/core/viewModels/base_view_model.dart index 8e228512..3d7122bd 100644 --- a/lib/core/viewModels/base_view_model.dart +++ b/lib/core/viewModels/base_view_model.dart @@ -18,9 +18,11 @@ class BaseViewModel extends ChangeNotifier { void setState(ViewState viewState) { _state = viewState; - // this.removeListener(() { }); - if(hasListeners) - notifyListeners(); + + if (viewState == ViewState.Busy || viewState == ViewState.BusyLocal) + error = ""; + + if (hasListeners) notifyListeners(); } BaseViewModel() { @@ -39,7 +41,7 @@ class BaseViewModel extends ChangeNotifier { @override void dispose() { - removeListener(() { }); + removeListener(() {}); super.dispose(); } } diff --git a/lib/core/viewModels/medical/ask_doctor_view_model.dart b/lib/core/viewModels/medical/ask_doctor_view_model.dart new file mode 100644 index 00000000..629df0a9 --- /dev/null +++ b/lib/core/viewModels/medical/ask_doctor_view_model.dart @@ -0,0 +1,110 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/ask_doctor/AskDoctorReqTypes.dart'; +import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; +import 'package:diplomaticquarterapp/core/service/medical/ask_doctor_services.dart'; +import 'package:diplomaticquarterapp/core/service/medical/my_doctor_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; + +class AskDoctorViewModel extends BaseViewModel { + AskDoctorService _askDoctorService = locator(); + MyDoctorService _myDoctorService = locator(); + + List patientDoctorAppointmentListHospital = + List(); + + List get askDoctorReqTypes => + _askDoctorService.askDoctorReqTypes; + + List get doctorResponseList => + _askDoctorService.doctorResponseList; + + Future getMyDoctor() async { + setState(ViewState.Busy); + await _myDoctorService.getPatientDoctorAppointmentList( + top: 25, beforeDays: 15); + if (_myDoctorService.hasError) { + error = _myDoctorService.error; + setState(ViewState.Error); + } else + var asd = ""; + _myDoctorService.patientDoctorAppointmentList.forEach((element) { + List doctorByClinic = + patientDoctorAppointmentListHospital + .where((elementClinic) => + elementClinic.filterName == element.projectName) + .toList(); + + if (doctorByClinic.length != 0) { + patientDoctorAppointmentListHospital[ + patientDoctorAppointmentListHospital.indexOf(doctorByClinic[0])] + .patientDoctorAppointmentList + .add(element); + } else { + patientDoctorAppointmentListHospital.add(PatientDoctorAppointmentList( + filterName: element.projectName, + patientDoctorAppointment: element)); + } + + setState(ViewState.Idle); + }); + } + + Future getCallRequestTypeLOVs() async { + setState(ViewState.Busy); + await _askDoctorService.getCallRequestTypeLOV(); + if (_askDoctorService.hasError) { + error = _askDoctorService.error; + setState(ViewState.ErrorLocal); + AppToast.showErrorToast(message: error); + } else + setState(ViewState.Idle); + } + + Future getCallInfoHoursResult({int projectId, int doctorId}) async { + setState(ViewState.Busy); + await _askDoctorService.getCallInfoHoursResult( + projectId: projectId, doctorId: doctorId); + if (_askDoctorService.hasError) { + error = _askDoctorService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + getDoctorResponse() async { + setState(ViewState.Busy); + await _askDoctorService.getDoctorResponse(); + if (_askDoctorService.hasError) { + error = _askDoctorService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + + Future updateReadStatus({int transactionNo}) async { + setState(ViewState.Busy); + await _askDoctorService.updateReadStatus(transactionNo: transactionNo); + if (_askDoctorService.hasError) { + error = _askDoctorService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + + Future sendRequestLOV( + {DoctorList doctorList, String requestType, String remark}) async { + setState(ViewState.BusyLocal); + await _askDoctorService.sendRequestLOV( + doctorList: doctorList, requestType: requestType, remark: remark); + if (_askDoctorService.hasError) { + error = _askDoctorService.error; + setState(ViewState.ErrorLocal); + AppToast.showErrorToast(message: error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart index 79e92a63..406dee3e 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -15,6 +15,7 @@ import 'core/service/medical/BloodSugarService.dart'; import 'core/service/medical/EyeService.dart'; import 'core/service/medical/PatientSickLeaveService.dart'; import 'core/service/medical/WeightPressureService.dart'; +import 'core/service/medical/ask_doctor_services.dart'; import 'core/service/medical/labs_service.dart'; import 'core/service/medical/medical_service.dart'; import 'core/service/medical/my_balance_service.dart'; @@ -31,6 +32,7 @@ import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; import 'core/viewModels/medical/ActiveMedicationsViewModel.dart'; import 'core/viewModels/medical/EyeViewModel.dart'; +import 'core/viewModels/medical/ask_doctor_view_model.dart'; import 'core/viewModels/medical/blood_pressure_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart'; import 'core/viewModels/medical/medical_view_model.dart'; @@ -83,6 +85,7 @@ void setupLocator() { locator.registerLazySingleton(() => WeightService()); locator.registerLazySingleton(() => EyeService()); locator.registerLazySingleton(() => ActiveMedicationsService()); + locator.registerLazySingleton(() => AskDoctorService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -110,5 +113,5 @@ void setupLocator() { locator.registerFactory(() => WeightPressureViewMode()); locator.registerFactory(() => EyeViewModel()); locator.registerFactory(() => ActiveMedicationsViewModel()); - + locator.registerFactory(() => AskDoctorViewModel()); } diff --git a/lib/pages/BookAppointment/widgets/DoctorView.dart b/lib/pages/BookAppointment/widgets/DoctorView.dart index d3150459..cad9da25 100644 --- a/lib/pages/BookAppointment/widgets/DoctorView.dart +++ b/lib/pages/BookAppointment/widgets/DoctorView.dart @@ -13,6 +13,7 @@ class DoctorView extends StatelessWidget { final DoctorList doctor; + DoctorView({@required this.doctor}); @override diff --git a/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart b/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart new file mode 100644 index 00000000..2551ebc9 --- /dev/null +++ b/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart @@ -0,0 +1,32 @@ +import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; + +class ViewDoctorResponsesPage extends StatelessWidget { + final DoctorResponse doctorResponse; + + const ViewDoctorResponsesPage({Key key, this.doctorResponse}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.updateReadStatus(transactionNo: doctorResponse.transactionNo), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: ' View Doctor Responses', + baseViewModel: model, + body: SingleChildScrollView( + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart b/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart new file mode 100644 index 00000000..e934c78d --- /dev/null +++ b/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart @@ -0,0 +1,125 @@ +import 'dart:ui'; + +import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_history_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_page.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 'ask_doctor_page.dart'; +import 'doctor_response.dart'; + +class AskDoctorHomPage extends StatefulWidget { + @override + _AskDoctorHomPageState createState() => _AskDoctorHomPageState(); +} + +class _AskDoctorHomPageState extends State + with SingleTickerProviderStateMixin { + TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 2, vsync: this); + } + + @override + void dispose() { + super.dispose(); + _tabController.dispose(); + } + + @override + Widget build(BuildContext context) { + return AppScaffold( + isShowAppBar: true, + appBarTitle: TranslationBase.of(context).prescriptions, + body: Scaffold( + extendBodyBehindAppBar: true, + appBar: PreferredSize( + preferredSize: Size.fromHeight(65.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: 60.0, + margin: EdgeInsets.only(top: 10.0), + width: MediaQuery.of(context).size.width * 0.9, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Theme.of(context).dividerColor, + width: 0.9), + ), + color: Colors.white), + child: Center( + child: TabBar( + isScrollable: true, + controller: _tabController, + indicatorWeight: 5.0, + //indicatorSize: TabBarIndicatorSize.label, + indicatorColor: Colors.red[800], + labelColor: Theme.of(context).primaryColor, + labelPadding: EdgeInsets.only(top: 4.0, left: 18.0, right: 18.0), + unselectedLabelColor: Colors.grey[800], + tabs: [ + Tab( + child: Container( + width: MediaQuery.of(context).size.width * 0.36, + child: Center( + child: Texts('ASK Doctor'), + ), + ), + ), + Tab(child: Container( + width: MediaQuery.of(context).size.width * 0.36, + child: Center( + child: Texts('Doctor Responses',textAlign: TextAlign.start,), + ), + ),) + ], + ), + ), + ), + ), + ], + ), + ), + body: Column( + children: [ + Expanded( + child: TabBarView( + physics: BouncingScrollPhysics(), + controller: _tabController, + children: [ + AskDoctorPage(), + DoctorResponse() + ], + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/pages/medical/ask_doctor/ask_doctor_page.dart b/lib/pages/medical/ask_doctor/ask_doctor_page.dart new file mode 100644 index 00000000..1aa0004b --- /dev/null +++ b/lib/pages/medical/ask_doctor/ask_doctor_page.dart @@ -0,0 +1,243 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/ask_doctor/request_type.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.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:rating_bar/rating_bar.dart'; +import 'package:smart_progress_bar/smart_progress_bar.dart'; + +class AskDoctorPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getMyDoctor(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(10), + child: Column( + children: [ + SizedBox( + height: 70, + ), + ...List.generate( + model.patientDoctorAppointmentListHospital.length, + (index) => AppExpandableNotifier( + title: + model.patientDoctorAppointmentListHospital[index].filterName, + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: + model.patientDoctorAppointmentListHospital[index].patientDoctorAppointmentList.map((doctor) { + return InkWell( + onTap: () { + model + .getCallInfoHoursResult( + doctorId: doctor.doctorID, + projectId: doctor.projectID) + .then((value) { + if (model.state != ViewState.ErrorLocal && + model.state != ViewState.Error) { + // Navigator.pop(context); + Navigator.push( + context, + FadePage( + page: RequestTypePage(doctorList: doctor,), + ), + ); + } else { + AppToast.showErrorToast(message: model.error); + } + }); + + ///.showProgressBar( + // text: "Loading", + // backgroundColor: + // Colors.blue.withOpacity(0.6)) + }, + child: Card( + margin: + EdgeInsets.fromLTRB(10.0, 16.0, 10.0, 8.0), + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: Container( + decoration: BoxDecoration(), + padding: EdgeInsets.all(7.0), + width: MediaQuery.of(context).size.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 1, + child: ClipRRect( + borderRadius: + BorderRadius.circular(100.0), + child: Image.network( + doctor.doctorImageURL, + fit: BoxFit.fill, + height: 60.0, + width: 60.0), + ), + ), + Expanded( + flex: 4, + child: Container( + width: + MediaQuery.of(context).size.width * + 0.55, + margin: EdgeInsets.fromLTRB( + 20.0, 10.0, 10.0, 0.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (doctor.doctorTitle != null) + Text( + doctor.doctorTitle + + " " + + doctor.name, + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[700], + letterSpacing: 1.0)), + Container( + margin: EdgeInsets.only(top: 3.0), + child: Text(doctor.clinicName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 3.0), + child: Text(doctor.projectName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + if (doctor.speciality != null) + Container( + margin: EdgeInsets.only( + top: 3.0, bottom: 3.0), + child: Text( + getDoctorSpeciality( + doctor.speciality) + .trim(), + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + doctor.nearestFreeSlot != null + ? Container( + margin: EdgeInsets.only( + top: 3.0, bottom: 3.0), + child: Text( + getDate(doctor + .nearestFreeSlot), + style: TextStyle( + fontSize: 14.0, + fontWeight: + FontWeight.bold, + color: Colors + .green[600], + letterSpacing: + 1.0)), + ) + : Container(), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar.readOnly( + initialRating: doctor + .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: Image.network( + doctor.nationalityFlagURL, + width: 25.0, + height: 25.0), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ), + ), + ); + }).toList(), + )), + ) + ], + ), + ), + ), + ), + ); + } + + String getDoctorSpeciality(List docSpecial) { + String docSpeciality = ""; + docSpecial.forEach((v) { + docSpeciality = docSpeciality + v + "\n"; + }); + return docSpeciality; + } + + String getDate(String date) { + DateTime dateObj = DateUtil.convertStringToDate(date); + return DateUtil.getWeekDay(dateObj.weekday) + + ", " + + dateObj.day.toString() + + " " + + DateUtil.getMonth(dateObj.month) + + " " + + dateObj.year.toString() + + " " + + dateObj.hour.toString() + + ":" + + getMinute(dateObj); + } + + String getMinute(DateTime dateObj) { + if (dateObj.minute == 0) { + return dateObj.minute.toString() + "0"; + } else { + return dateObj.minute.toString(); + } + } +} + +/** + * + */ diff --git a/lib/pages/medical/ask_doctor/doctor_response.dart b/lib/pages/medical/ask_doctor/doctor_response.dart new file mode 100644 index 00000000..6993eb5b --- /dev/null +++ b/lib/pages/medical/ask_doctor/doctor_response.dart @@ -0,0 +1,178 @@ +import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.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:provider/provider.dart'; + +import 'ViewDoctorResponsesPage.dart'; + +class DoctorResponse extends StatelessWidget { + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return BaseView( + onModelReady: (model) => model.getDoctorResponse(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 65, + ), + AppExpandableNotifier( + header: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts('New'), + Container( + width: 30, + height: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red[800], + ), + child: Center( + child: Texts( + '${model.doctorResponseList.length}', + color: Colors.white, + ), + ), + ) + ], + ), + ), + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: model.doctorResponseList.map( + (doctor) { + return InkWell( + onTap: () { + ///go to page ViewDoctorResponsesPage + Navigator.push( + context, + FadePage( + page: ViewDoctorResponsesPage(doctorResponse: doctor,), + ), + ); + }, + child: Container( + height: 70, + margin: EdgeInsets.only(top: 8,bottom: 8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + border: Border.all(color: Colors.grey[300]), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts('${doctor.doctorName}'), + SizedBox(height: 5,), + Texts('${doctor.requestTypeDescription}'), + ], + ), + ), + ), + Icon(projectViewModel.isArabic + ? Icons.arrow_forward_ios + : Icons.arrow_back_ios) + ], + ), + ), + ); + }, + ).toList(), + ), + ), + AppExpandableNotifier( + header: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts('All'), + Container( + width: 30, + height: 30, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red[800], + ), + child: Center( + child: Texts( + '${model.doctorResponseList.length}', + color: Colors.white, + ), + ), + ) + ], + ), + ), + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: model.doctorResponseList.map( + (doctor) { + return InkWell( + onTap: () {}, + child: Container( + height: 70, + margin: EdgeInsets.only(top: 8,bottom: 8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: Colors.white, + border: Border.all(color: Colors.grey[300]), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts('${doctor.doctorName}'), + SizedBox(height: 5,), + Texts('${doctor.requestTypeDescription}'), + ], + ), + ), + ), + Icon(projectViewModel.isArabic + ? Icons.arrow_forward_ios + : Icons.arrow_back_ios) + ], + ), + ), + ); + }, + ).toList(), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/ask_doctor/request_type.dart b/lib/pages/medical/ask_doctor/request_type.dart new file mode 100644 index 00000000..cbf2e606 --- /dev/null +++ b/lib/pages/medical/ask_doctor/request_type.dart @@ -0,0 +1,132 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.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/widgets/buttons/secondary_button.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class RequestTypePage extends StatefulWidget { + final DoctorList doctorList; + + RequestTypePage({Key key, this.doctorList}); + + @override + _RequestTypePageState createState() => _RequestTypePageState(); +} + +class _RequestTypePageState extends State { + String selected = ""; + int parameterCode = -1; + String question = ""; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getCallRequestTypeLOVs(), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: 'Request Type', + baseViewModel: model, + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ...List.generate( + model.askDoctorReqTypes.length, + (index) => Container( + width: double.maxFinite, + height: 55, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0)), + margin: EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + setState(() { + selected = model.askDoctorReqTypes[index].description; + parameterCode = + model.askDoctorReqTypes[index].parameterCode; + }); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + model.askDoctorReqTypes[index].description), + ), + Radio( + value: model.askDoctorReqTypes[index].description, + groupValue: selected, + activeColor: Colors.red[800], + onChanged: (value) { + setState(() { + selected = value; + parameterCode = model + .askDoctorReqTypes[index].parameterCode; + }); + }, + ), + ], + ), + ), + ), + ), + if (parameterCode == 6) + Container( + margin: EdgeInsets.only(left: 10, right: 10), + child: NewTextFields( + hintText: 'Enter the question here...', + minLines: 2, + maxLines: 15, + onChanged: (value) { + setState(() { + question = value; + }); + }, + ), + ), + Container( + width: double.maxFinite, + height: MediaQuery.of(context).size.height * 0.2, + ), + ], + ), + ), + ), + bottomSheet: Container( + width: double.maxFinite, + height: MediaQuery.of(context).size.height * 0.1, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: SecondaryButton( + label: 'Send', + loading: model.state == ViewState.BusyLocal, + textColor: Colors.white, + onTap: () { + model.sendRequestLOV( + doctorList: widget.doctorList, + requestType: parameterCode.toString(), + remark: question).then((value) { + if(model.state!=ViewState.ErrorLocal|| model.state!=ViewState.Error){ + Navigator.pop(context); + } + AppToast.showErrorToast(message: "The question add fine "); + + }); + }, + color: Colors.grey[800], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index cf9738df..2ac3b4de 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -25,6 +25,7 @@ import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart' import 'package:provider/provider.dart'; import '../../locator.dart'; import 'active_medications/ActiveMedicationsPage.dart'; +import 'ask_doctor/ask_doctor_home_page.dart'; import 'balance/my_balance_page.dart'; import 'doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; @@ -434,11 +435,17 @@ class _MedicalProfilePageState extends State { ), Expanded( flex: 1, - child: MedicalProfileItem( - title: TranslationBase.of(context).askYour, - imagePath: 'medical_history_icon.png', - subTitle: TranslationBase.of(context) - .askYourSubtitle, + child: InkWell( + onTap: (){ + Navigator.push(context, + FadePage(page: AskDoctorHomPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).askYour, + imagePath: 'medical_history_icon.png', + subTitle: TranslationBase.of(context) + .askYourSubtitle, + ), ), ), ]), diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index a150086c..65d018bf 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -26,6 +26,16 @@ class DateUtil { return start + "$milliseconds" + end; } + static String yearMonthDay(DateTime dateTime){ + String dateFormat = '${dateTime.year}-${dateTime.month}-${dateTime.day}'; + return dateFormat; + } + + static String time(DateTime dateTime){ + String dateFormat = '${dateTime.hour}:${dateTime.minute}:00'; + return dateFormat; + } + /// check Date /// [dateString] String we want to convert static String checkDate(DateTime checkedTime) { diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index 353846e1..0f6de09f 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -11,9 +11,10 @@ class AppExpandableNotifier extends StatelessWidget { final Widget bodyWidget; final String title; final Widget collapsed; + final Widget header; AppExpandableNotifier( - {this.headerWidget, this.bodyWidget, this.title, this.collapsed}); + {this.headerWidget, this.bodyWidget, this.title, this.collapsed,this.header}); @override Widget build(BuildContext context) { @@ -35,7 +36,7 @@ class AppExpandableNotifier extends StatelessWidget { headerAlignment: ExpandablePanelHeaderAlignment.center, tapBodyToCollapse: true, ), - header: Padding( + header: header ?? Padding( padding: EdgeInsets.all(10), child: Text( title?? 'Details', From 3ffff9686d23910785cfbebaf47467591e835a54 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 29 Sep 2020 16:28:16 +0300 Subject: [PATCH 6/8] Done allergies service --- assets/images/new-design/allergiesDetails.png | Bin 0 -> 2515 bytes lib/config/config.dart | 2 + lib/config/localized_values.dart | 33 +++- lib/core/model/Allergy/Allergy.dart | 48 ++++++ .../prescriptions/prescriptions_order.dart | 26 +-- .../service/medical/AllergiesService.dart | 25 +++ .../medical/AllergiesViewModel.dart | 22 +++ lib/locator.dart | 4 + .../ActiveMedicationsPage.dart | 72 ++++---- .../active_medications/DayCheckBoxDialog.dart | 161 ++++++++++++++++++ .../active_medications/reminder_page.dart | 129 ++++++++++---- lib/pages/medical/allergies_page.dart | 54 ++++++ .../ask_doctor/ViewDoctorResponsesPage.dart | 3 +- .../ask_doctor/ask_doctor_home_page.dart | 6 +- .../medical/ask_doctor/ask_doctor_page.dart | 3 - .../medical/ask_doctor/doctor_response.dart | 35 ++-- .../medical/ask_doctor/request_type.dart | 26 +-- lib/pages/medical/medical_profile_page.dart | 16 +- lib/uitl/CalendarUtils.dart | 4 +- lib/uitl/date_uitl.dart | 32 +++- lib/uitl/translations_delegate_base.dart | 17 ++ pubspec.yaml | 5 + 22 files changed, 597 insertions(+), 126 deletions(-) create mode 100644 assets/images/new-design/allergiesDetails.png create mode 100644 lib/core/model/Allergy/Allergy.dart create mode 100644 lib/core/service/medical/AllergiesService.dart create mode 100644 lib/core/viewModels/medical/AllergiesViewModel.dart create mode 100644 lib/pages/medical/active_medications/DayCheckBoxDialog.dart create mode 100644 lib/pages/medical/allergies_page.dart diff --git a/assets/images/new-design/allergiesDetails.png b/assets/images/new-design/allergiesDetails.png new file mode 100644 index 0000000000000000000000000000000000000000..fc268c9c7160f4c4b13c5f34953a8b2e0251ebdb GIT binary patch literal 2515 zcmV;^2`u)BP)&%hl`mxm@0wPQGkN zYg&m|8;^3i{FQT9mL%5a`F#G%8tk|Z`;*;n_hk* ze`14)Z_9ca-p;Dn-A-4MWPGkvs#VYJ^}y=^@wNUXGKu}-RuRWl1BZcSS)@N(85%x<%g?@ zNgR$zKInQn)AIc-^^`04qv-|u;z%SVJ(^Fe-FM}*JAL!0C0 zD}dHuI4~NfqAIUzoaSDnx~6GJS}NLQS?+YYSRk-2+g^LVk8)M1RLH`KydCb94rNIp zU(i&|-q^P?7y@849+K6?Vpl6w-}4sB#j7e*HNZHg#mlQ`U`3L7D_D5b@#3Z)PUhZd zJo@?LCxBW}Rd@|HD2jTLE z3tqcFw?WoK z=Ix=q2tS=n#;U62^EogXelAEyc?H%_T&82~bzMJF$xv6EvRB~vcY(?X*LPIgDPSPMNkBB$k%;%6jX6?1*NHkyAYgNw^Twy zE7X#~^MWugRENO_P|D+KhW7z!k3P$YTCki8rn4!SHWe>~Dx5%dqAWen+DwCiel!^< z=|`CzQj2qe>$$UxMl{mi^;}VF2mMsZagkbLnMy$_+(!if{sBn<YNcR9A=#SB5DU$fovOe)Gk0?_rmo2VtA-)ufh z+TZKHJU%@FZzxwF76iLfT6TJ~^e}52Edl4F^mJ+=eo7@BJU7mn`C<;vSgX}*RaC;l zNpAvG!0o9OuEI@z3S1yagKRZ+ksgLKm&*l(5C~vk&-3qR{Jz_rpv&RIrrBh}0fa%E zmLZ^2Rk?|W`2%Z#8Ut^4J3rWH1fD_qV0KUr$pVXb>9l2QYQH6j1|fK-{JF zAucr-GiOU03-Gb%AZTMK6^!t;DGUQHM<4?{}$?aT9|ntWJe7m?2^? zR1w875ww^$#kBFXkd24sKcqld8f0&$-DTO^O?p~)huDCsoECvXZ%I|{EYn83Km$V? zxltgHn6eYH2?Hb|OW|Fd!#kRXU?dR|q(T;BQBsCr@&wq`U^u8&t9mH}3uw>fTZ8HP z2D5nrz*xO)8bMA!wAzA?g7&~f*#}ZeCX011qH(J_%;}*u8jT)zNW#bF{asMn*{GLT+hAm9E@}{XhUY7%OS5we-L)UT0tU_ zMGS#zyCB#_LK;;Rlv}t8UbmEE@O<*{vR z>E_PIOPa7*0WPqI;?!8;{^@ImH}#v`Od zOtYf1x!p5%>UcRknT&y@wOSps0kfY>CP$m8P(1ZIZ{dOYz~n{PIkI=b4%7mSlH)5_ z+w1pYb_L6!u5k-F1k`DFtf_?*!%{*>A}ZN*yK={a8V?WcE7oUBy+7!sZkl3^U^Z}+ z3JuOJSCWSZlTe7YDBA4FjZ+7-?o01?*3|Ke@nrn_<(WDn1-BzXZYUne&Nco7`!%9k zIeUPmPmr|Q$qdAL$6G3xG|~?l3lvBm zXAl`+bw{mzjp4M*ZnYuaG@BIO_>7dUvmm+BY*67<kVKR+UMp+~mIDChYo9X8Vr zcco!%*0EAJEp{(zHK%NNzDHQ9X*5qdM2=@}1qk*`O$bn3X57P;#fjF1})`|uuQ211mBjWGs+3Gok3l6pq!d8C%L zc3XvFIeKR63S3&8A;1ItBQK;=iv>zZWw=hGMr5d+o%4~HjV#8m!#K1*JS&(qoLLx9%N(P}=#r!rtO zB2%O_gH(qqs8#EdENy*1>!8GkGZ?~^I)lb&FZuFr*bm)@x@er%z)r zTd0ETeL3YL8oXk@c*g%e)2BBWundMo@D{2Sf?@V2zV!dDDD61T)AQrqM;hP%kH@#c dUu^s>t$P3f literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index a34848d5..3e58f203 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -226,6 +226,8 @@ const GET_DOCTOR_RESPONSE = 'Services/Patients.svc/REST/GetDoctorResponse'; const UPDATE_READ_STATUS = 'Services/Patients.svc/REST/UpdateReadStatus'; const INSERT_CALL_INFO = 'Services/Doctors.svc/REST/InsertCallInfo'; +const GET_PATIENT_ALLERGIES = 'Services/Patients.svc/REST/GetPatientAllergies'; + const TIMER_MIN = 10; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 790da29f..027d0e74 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -417,7 +417,7 @@ const Map> localizedValues = { "UpdateInsuranceSubtitle": {"en": "Card", "ar": "التأمين"}, "InsuranceApproval": {"en": "Insurance Approval", "ar": "موافقات"}, "InsuranceApprovalSubtitle": {"en": "Approvals", "ar": "موافقات التأمين"}, - "Allergies": {"en": "Approvals", "ar": "الحساسية"}, + "Allergies": {"en": "Allergies", "ar": "الحساسية"}, "AllergiesSubtitle": {"en": "Diagnosed", "ar": "مسجلة"}, "MyVaccines": {"en": "My Vaccines", "ar": "تطعيماتي"}, "MyVaccinesSubtitle": {"en": "List", "ar": "قائمة"}, @@ -497,10 +497,29 @@ const Map> localizedValues = { "Cylinder":{"en":"Cylinder","ar":"الدائرية"}, "Axis":{"en":"Axis","ar":"المحاور"}, "Prism":{"en":"Prism","ar":"موشور"}, - "VA":{"en":"Prism","VA":"المحاور"}, - "LeftEye":{"en":"Left Eye","VA":"العين اليسرى"}, - "Brand":{"en":"Brand","VA":"النوع"}, - "Power":{"en":"Power","VA":"القوة"}, - "Diameter":{"en":"Diameter","VA":"القطر"}, - "Remarks":{"en":"Remarks","VA":"ملاحضات"}, + "VA":{"en":"Prism","ar":"المحاور"}, + "LeftEye":{"en":"Left Eye","ar":"العين اليسرى"}, + "Brand":{"en":"Brand","ar":"النوع"}, + "Power":{"en":"Power","ar":"القوة"}, + "Diameter":{"en":"Diameter","ar":"القطر"}, + "Remarks":{"en":"Remarks","ar":"ملاحضات"}, + "ActiveMedications":{"en":"Active Medications","ar":"ادويتي النشطة"}, + "ExpDate":{"en":"Active Exp Date :","VA":"تاريخ الإنتهاء"}, + "Route":{"en":"Route :","ar":"الطريقة"}, + "Frequency":{"en":"Frequency :","ar":"المعدل"}, + "DailyQuantity":{"en":"Daily Quantity :","ar":"جرعات يومية"}, + "AddReminder":{"en":"Add Reminder","ar":"إضافة تذكير"}, + "reminderDes":{"en":"Please select treatment start day and time to be notified when it\'s time to take the medicine","ar":" يرجى تحديد يوم بدء العلاج والوقت ليتم ارسال تنبيه عندما يحين الوقت لتناول الدواء"}, + "StartDay":{"en":"Start Day","ar":"يوم البداية"}, + "EndDay":{"en":"End Day","ar":"يوم الانتهاء"}, + "Days":{"en":"Days ","ar":"أيام"}, + "ScheduleTime":{"en":"Schedule time","ar":"الجدول الزمني"}, + "AskDoctor":{"en":"Ask Doctor","ar":"اسأل طبيبك"}, + "DoctorResponses":{"en":"Doctor Responses","ar":"ردود الأطباء"}, + "New":{"en":"New","ar":"جديد"}, + "All":{"en":"All","ar":"الكل"}, + "QuestionHere":{"en":"Enter the question here...","ar":"اضف الاستفسار هنا"}, + "ViewDoctorResponses":{"en":"View Doctor Responses","ar":"الاطلاع على ردود الأطباء"}, + + }; diff --git a/lib/core/model/Allergy/Allergy.dart b/lib/core/model/Allergy/Allergy.dart new file mode 100644 index 00000000..be71c7fe --- /dev/null +++ b/lib/core/model/Allergy/Allergy.dart @@ -0,0 +1,48 @@ +class Allergy { + int patientID; + int allergyDiseaseType; + int allergyDiseaseID; + String description; + dynamic descriptionN; + dynamic remarks; + dynamic avgDoctorRatingList; + dynamic doctorRatingDetailsList; + dynamic notesDoctorRatingList; + + Allergy( + {this.patientID, + this.allergyDiseaseType, + this.allergyDiseaseID, + this.description, + this.descriptionN, + this.remarks, + this.avgDoctorRatingList, + this.doctorRatingDetailsList, + this.notesDoctorRatingList}); + + Allergy.fromJson(Map json) { + patientID = json['PatientID']; + allergyDiseaseType = json['AllergyDiseaseType']; + allergyDiseaseID = json['AllergyDiseaseID']; + description = json['Description']; + descriptionN = json['DescriptionN']; + remarks = json['Remarks']; + avgDoctorRatingList = json['AvgDoctorRatingList']; + doctorRatingDetailsList = json['DoctorRatingDetailsList']; + notesDoctorRatingList = json['NotesDoctorRatingList']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientID'] = this.patientID; + data['AllergyDiseaseType'] = this.allergyDiseaseType; + data['AllergyDiseaseID'] = this.allergyDiseaseID; + data['Description'] = this.description; + data['DescriptionN'] = this.descriptionN; + data['Remarks'] = this.remarks; + data['AvgDoctorRatingList'] = this.avgDoctorRatingList; + data['DoctorRatingDetailsList'] = this.doctorRatingDetailsList; + data['NotesDoctorRatingList'] = this.notesDoctorRatingList; + return data; + } +} diff --git a/lib/core/model/prescriptions/prescriptions_order.dart b/lib/core/model/prescriptions/prescriptions_order.dart index db2b1855..fdcbf203 100644 --- a/lib/core/model/prescriptions/prescriptions_order.dart +++ b/lib/core/model/prescriptions/prescriptions_order.dart @@ -2,35 +2,35 @@ import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; class PrescriptionsOrder { int iD; - String patientID; + dynamic patientID; bool patientOutSA; bool isOutPatient; int projectID; int nearestProjectID; double longitude; double latitude; - String appointmentNo; - String dischargeID; + dynamic appointmentNo; + dynamic dischargeID; int lineItemNo; int status; - String description; - String descriptionN; + dynamic description; + dynamic descriptionN; DateTime createdOn; int serviceID; int createdBy; DateTime editedOn; int editedBy; int channel; - String clientRequestID; + dynamic clientRequestID; bool returnedToQueue; - Null pickupDateTime; - Null pickupLocationName; - Null dropoffLocationName; + dynamic pickupDateTime; + dynamic pickupLocationName; + dynamic dropoffLocationName; int realRRTHaveTransactions; - String nearestProjectDescription; - String nearestProjectDescriptionN; - String projectDescription; - String projectDescriptionN; + dynamic nearestProjectDescription; + dynamic nearestProjectDescriptionN; + dynamic projectDescription; + dynamic projectDescriptionN; PrescriptionsOrder( {this.iD, diff --git a/lib/core/service/medical/AllergiesService.dart b/lib/core/service/medical/AllergiesService.dart new file mode 100644 index 00000000..d3deae2b --- /dev/null +++ b/lib/core/service/medical/AllergiesService.dart @@ -0,0 +1,25 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/Allergy/Allergy.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class AllergiesService extends BaseService { + List allergies = List(); + + getAllergies() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + body['OutSA'] = 0; + await baseAppClient.post(GET_PATIENT_ALLERGIES, + onSuccess: (response, statusCode) async { + allergies.clear(); + response['Patient_Allergies'].forEach((allergy) { + allergies.add(Allergy.fromJson(allergy)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/medical/AllergiesViewModel.dart b/lib/core/viewModels/medical/AllergiesViewModel.dart new file mode 100644 index 00000000..bc4666bc --- /dev/null +++ b/lib/core/viewModels/medical/AllergiesViewModel.dart @@ -0,0 +1,22 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/Allergy/Allergy.dart'; +import 'package:diplomaticquarterapp/core/service/medical/AllergiesService.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; + +import '../../../locator.dart'; + +class AllergiesViewModel extends BaseViewModel { + AllergiesService _allergiesService = locator(); + List get allergies => _allergiesService.allergies; + + getAllergies() async { + setState(ViewState.Busy); + await _allergiesService.getAllergies(); + if (_allergiesService.hasError) { + error = _allergiesService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } +} diff --git a/lib/locator.dart b/lib/locator.dart index 406dee3e..cf467ac8 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -10,6 +10,7 @@ import 'core/service/er/er_service.dart'; import 'core/service/feedback/feedback_service.dart'; import 'core/service/hospital_service.dart'; import 'core/service/medical/ActiveMedicationsService.dart'; +import 'core/service/medical/AllergiesService.dart'; import 'core/service/medical/BloodPressureService.dart'; import 'core/service/medical/BloodSugarService.dart'; import 'core/service/medical/EyeService.dart'; @@ -31,6 +32,7 @@ import 'core/viewModels/feedback/feedback_view_model.dart'; import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; import 'core/viewModels/medical/ActiveMedicationsViewModel.dart'; +import 'core/viewModels/medical/AllergiesViewModel.dart'; import 'core/viewModels/medical/EyeViewModel.dart'; import 'core/viewModels/medical/ask_doctor_view_model.dart'; import 'core/viewModels/medical/blood_pressure_view_model.dart'; @@ -86,6 +88,7 @@ void setupLocator() { locator.registerLazySingleton(() => EyeService()); locator.registerLazySingleton(() => ActiveMedicationsService()); locator.registerLazySingleton(() => AskDoctorService()); + locator.registerLazySingleton(() => AllergiesService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -114,4 +117,5 @@ void setupLocator() { locator.registerFactory(() => EyeViewModel()); locator.registerFactory(() => ActiveMedicationsViewModel()); locator.registerFactory(() => AskDoctorViewModel()); + locator.registerFactory(() => AllergiesViewModel()); } diff --git a/lib/pages/medical/active_medications/ActiveMedicationsPage.dart b/lib/pages/medical/active_medications/ActiveMedicationsPage.dart index 3409c3db..5bc9618d 100644 --- a/lib/pages/medical/active_medications/ActiveMedicationsPage.dart +++ b/lib/pages/medical/active_medications/ActiveMedicationsPage.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/ActiveMedicationsVi import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/active_medications/reminder_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -17,7 +18,7 @@ class ActiveMedicationsPage extends StatelessWidget { onModelReady: (model) => model.getActiveMedication(), builder: (_, model, w) => AppScaffold( baseViewModel: model, - appBarTitle: 'Active Medications', + appBarTitle: TranslationBase.of(context).activeMedications, isShowAppBar: true, body: Container( child: ListView.builder( @@ -48,7 +49,7 @@ class ActiveMedicationsPage extends StatelessWidget { height: 5, ), Texts( - 'Exp Date :' + + TranslationBase.of(context).expDate+' :' + DateUtil.getDayMonthYearDateFormatted(model .activePrescriptionReport[index].orderDate), ), @@ -56,52 +57,53 @@ class ActiveMedicationsPage extends StatelessWidget { height: 5, ), Texts( - 'Route :' + + TranslationBase.of(context).route+ ' :' + model.activePrescriptionReport[index].route, ), SizedBox( height: 5, ), Texts( - 'Frequency :' + + TranslationBase.of(context).frequency+ ' :' + model.activePrescriptionReport[index].frequency, ), SizedBox( height: 5, ), Texts( - 'Daily Quantity :${model.activePrescriptionReport[index].doseDailyQuantity}', + TranslationBase.of(context).dailyQuantity + ' :${model.activePrescriptionReport[index].doseDailyQuantity}', ), ], ), ), - InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: ReminderPage( - frequency: model.activePrescriptionReport[index] - .frequencyNumber, - days: model.activePrescriptionReport[index].days, - itemDescription: model - .activePrescriptionReport[index] - .itemDescription, - ), + Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Icon( + Icons.notifications, + color: Colors.red, + size: 28, ), - ); - }, - child: Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Icon( - Icons.notifications, - color: Colors.red, - size: 28, - ), - Row( + SizedBox(height: 25,), + InkWell( + onTap: (){ + Navigator.push( + context, + FadePage( + page: ReminderPage( + frequency: model.activePrescriptionReport[index] + .frequencyNumber, + days: model.activePrescriptionReport[index].days, + itemDescription: model + .activePrescriptionReport[index] + .itemDescription, + ), + ), + ); + }, + child: Row( children: [ Icon( Icons.notifications_active, @@ -109,13 +111,13 @@ class ActiveMedicationsPage extends StatelessWidget { size: 28, ), Texts( - 'Reminder', + TranslationBase.of(context).addReminder, color: Colors.red, ) ], - ) - ], - ), + ), + ) + ], ), ) ], diff --git a/lib/pages/medical/active_medications/DayCheckBoxDialog.dart b/lib/pages/medical/active_medications/DayCheckBoxDialog.dart new file mode 100644 index 00000000..5cb4020c --- /dev/null +++ b/lib/pages/medical/active_medications/DayCheckBoxDialog.dart @@ -0,0 +1,161 @@ +import 'package:device_calendar/device_calendar.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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class DayCheckBoxDialog extends StatefulWidget { + final Function(List) onValueSelected; + final String title; + final List selectedDaysOfWeek; + final List daysOfWeek = [ + DayOfWeek.Monday, + DayOfWeek.Tuesday, + DayOfWeek.Wednesday, + DayOfWeek.Thursday, + DayOfWeek.Friday, + DayOfWeek.Saturday, + DayOfWeek.Sunday, + ]; + + DayCheckBoxDialog( + {Key key, this.onValueSelected, this.selectedDaysOfWeek, this.title}); + + @override + _DayCheckBoxDialogState createState() => _DayCheckBoxDialogState(); +} + +class _DayCheckBoxDialogState extends State { + @override + Widget build(BuildContext context) { + return SimpleDialog( + title: Container( + width: double.infinity, + child: Center( + child: Texts( + widget.title, + textAlign: TextAlign.center, + ))), + children: [ + Container( + height: widget.daysOfWeek.length > 3 + ? MediaQuery.of(context).size.height * 0.6 + : null, + child: SingleChildScrollView( + child: Column( + children: [ + Divider(), + ...List.generate( + widget.daysOfWeek.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 2, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + setState(() { + if (widget.selectedDaysOfWeek + .contains(widget.daysOfWeek[index])) + widget.selectedDaysOfWeek + .remove(widget.daysOfWeek[index]); + else + widget.selectedDaysOfWeek + .add(widget.daysOfWeek[index]); + }); + }, + child: ListTile( + title: Text(DateUtil.getDay(widget.daysOfWeek[index])), + leading: Checkbox( + value: widget.selectedDaysOfWeek + .contains(widget.daysOfWeek[index]), + onChanged: (value) { + setState(() { + if (widget.selectedDaysOfWeek + .contains(widget.daysOfWeek[index])) + widget.selectedDaysOfWeek + .remove(widget.daysOfWeek[index]); + else + widget.selectedDaysOfWeek + .add(widget.daysOfWeek[index]); + }); + }, + ), + ), + ), + ) + ], + ), + SizedBox( + height: 5.0, + ), + ], + ), + ), + SizedBox( + height: 5.0, + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Center( + child: Texts( + TranslationBase.of(context) + .cancel + .toUpperCase(), + color: Colors.red, + ), + ), + ), + ), + ), + ), + Container( + width: 1, + height: 30, + color: Colors.grey[500], + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () { + widget.onValueSelected(widget.selectedDaysOfWeek); + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts( + TranslationBase.of(context).ok, + fontWeight: FontWeight.w400, + ), + ), + ), + ), + ), + ], + ) + ], + ), + ), + ) + ], + ); + } + + +} diff --git a/lib/pages/medical/active_medications/reminder_page.dart b/lib/pages/medical/active_medications/reminder_page.dart index 72f6c211..7980d941 100644 --- a/lib/pages/medical/active_medications/reminder_page.dart +++ b/lib/pages/medical/active_medications/reminder_page.dart @@ -1,10 +1,10 @@ +import 'package:device_calendar/device_calendar.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/ActiveMedicationsViewModel.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/CalendarUtils.dart'; -import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.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/others/app_scaffold_widget.dart'; @@ -13,6 +13,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:provider/provider.dart'; +import 'DayCheckBoxDialog.dart'; + // ignore: must_be_immutable class ReminderPage extends StatefulWidget { final int frequency; @@ -20,6 +22,15 @@ class ReminderPage extends StatefulWidget { final String itemDescription; List _scheduleList = List(); + List daysOfWeek = [ + DayOfWeek.Monday, + DayOfWeek.Tuesday, + DayOfWeek.Wednesday, + DayOfWeek.Thursday, + DayOfWeek.Friday, + DayOfWeek.Saturday, + DayOfWeek.Sunday + ]; DateTime startDay; DateTime endDay; @@ -48,7 +59,7 @@ class _ReminderPageState extends State { builder: (_, model, w) => AppScaffold( baseViewModel: model, isShowAppBar: true, - appBarTitle: 'Reminder', + appBarTitle: TranslationBase.of(context).reminder, body: SingleChildScrollView( child: Container( margin: EdgeInsets.all(8.0), @@ -57,14 +68,16 @@ class _ReminderPageState extends State { children: [ Container( width: double.maxFinite, - child: Texts( - 'Please select treatment start day and time to be notified when it\'s time to take the medicine'), + child: Texts(TranslationBase.of(context).reminderDes), ), Divider(), SizedBox( height: 12, ), - Texts('Start day'), + Texts(TranslationBase.of(context).startDay), + SizedBox( + height: 6, + ), InkWell( onTap: () { DatePicker.showDatePicker(context, @@ -72,7 +85,6 @@ class _ReminderPageState extends State { minTime: DateTime( DateTime.now().year, DateTime.now().month - 1, 1), maxTime: DateTime.now(), onConfirm: (date) { - print('confirm $date'); setState(() { widget.startDay = date; }); @@ -102,7 +114,10 @@ class _ReminderPageState extends State { SizedBox( height: 12, ), - Texts('End day'), + Texts(TranslationBase.of(context).endDay), + SizedBox( + height: 6, + ), InkWell( onTap: () { DatePicker.showDatePicker(context, @@ -110,7 +125,6 @@ class _ReminderPageState extends State { minTime: DateTime( DateTime.now().year, DateTime.now().month - 1, 1), maxTime: DateTime.now(), onConfirm: (date) { - print('confirm $date'); setState(() { widget.endDay = date; }); @@ -137,6 +151,37 @@ class _ReminderPageState extends State { ), ), ), + SizedBox( + height: 12, + ), + Texts(TranslationBase.of(context).days), + SizedBox( + height: 6, + ), + InkWell( + onTap: () => confirmSelectDayDialog(), + 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: [ + Expanded( + child: Texts( + getDays(), + )), + Icon( + Icons.arrow_drop_down, + color: Colors.black, + ) + ], + ), + ), + ), ...List.generate( widget._scheduleList.length, (index) => Column( @@ -145,7 +190,7 @@ class _ReminderPageState extends State { SizedBox( height: 7, ), - Texts('Schedule time'), + Texts(TranslationBase.of(context).scheduleTime), SizedBox( height: 7, ), @@ -153,7 +198,6 @@ class _ReminderPageState extends State { onTap: () { DatePicker.showTimePicker(context, showTitleActions: true, onConfirm: (date) { - print('confirm $date'); setState(() { widget._scheduleList[index] = date; }); @@ -194,14 +238,31 @@ class _ReminderPageState extends State { ), bottomSheet: Container( width: double.infinity, - height: MediaQuery.of(context).size.height * 0.1, + height: MediaQuery.of(context).size.height * 0.2, padding: EdgeInsets.all(10), - child: SecondaryButton( - label: 'OK', - color: Colors.grey[800], - onTap: () { - schedule(); - }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SecondaryButton( + label: TranslationBase.of(context).ok, + color: Colors.grey[800], + textColor: Colors.white, + onTap: () { + schedule(); + }, + ), + SizedBox( + height: 15, + ), + SecondaryButton( + label: TranslationBase.of(context).cancel, + color: Colors.red[800], + textColor: Colors.white, + onTap: () { + Navigator.pop(context); + }, + ), + ], ), ), ), @@ -212,14 +273,6 @@ class _ReminderPageState extends State { List scheduleDateTime = calculateDaysInterval(widget.startDay, widget.endDay); - // scheduleDateTime.forEach((date) { - // LocalNotification.scheduleNotification( - // scheduledNotificationDateTime: date, - // title: 'Remainder', - // description: widget.itemDescription); - // return; - // }); - CalendarUtils calendarUtils = await CalendarUtils.getInstance(); calendarUtils.createOrUpdateEvents( @@ -228,9 +281,6 @@ class _ReminderPageState extends State { title: widget.itemDescription, scheduleDateTime: scheduleDateTime); - - - var asd = calendarUtils.writableCalendars; Navigator.pop(context); } @@ -258,6 +308,25 @@ class _ReminderPageState extends State { } String getDays() { - return ''; + String days = ""; + widget.daysOfWeek.forEach((element) { + days += "${DateUtil.getDay(element)},"; + }); + return days; + } + + void confirmSelectDayDialog() { + showDialog( + context: context, + child: DayCheckBoxDialog( + title: 'Select Day', + selectedDaysOfWeek: widget.daysOfWeek, + onValueSelected: (value) { + setState(() { + widget.daysOfWeek = value; + }); + }, + ), + ); } } diff --git a/lib/pages/medical/allergies_page.dart b/lib/pages/medical/allergies_page.dart new file mode 100644 index 00000000..ea063e19 --- /dev/null +++ b/lib/pages/medical/allergies_page.dart @@ -0,0 +1,54 @@ +import 'package:diplomaticquarterapp/core/viewModels/medical/AllergiesViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.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'; + +class AllergiesPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getAllergies(), + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: TranslationBase.of(context).allergies, + baseViewModel: model, + body: ListView.builder( + itemCount: model.allergies.length, + itemBuilder: (context, index) => Container( + margin: EdgeInsets.all(15), + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Colors.white, + ), + child: Row( + children: [ + Image.asset( + 'assets/images/new-design/allergiesDetails.png', + width: 50, + height: 50, + fit: BoxFit.cover, + ), + SizedBox( + width: 15, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts(TranslationBase.of(context).remarks+" :"), + Texts(TranslationBase.of(context).description + model.allergies[index].description ?? ''), + ], + ), + ) + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart b/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart index 2551ebc9..fc47ed3c 100644 --- a/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart +++ b/lib/pages/medical/ask_doctor/ViewDoctorResponsesPage.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/ask_doctor/DoctorResponse.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -16,7 +17,7 @@ class ViewDoctorResponsesPage extends StatelessWidget { onModelReady: (model) => model.updateReadStatus(transactionNo: doctorResponse.transactionNo), builder: (_, model, w) => AppScaffold( isShowAppBar: true, - appBarTitle: ' View Doctor Responses', + appBarTitle: TranslationBase.of(context).viewDoctorResponses, baseViewModel: model, body: SingleChildScrollView( child: Container( diff --git a/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart b/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart index e934c78d..5f1938fd 100644 --- a/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart +++ b/lib/pages/medical/ask_doctor/ask_doctor_home_page.dart @@ -39,7 +39,7 @@ class _AskDoctorHomPageState extends State Widget build(BuildContext context) { return AppScaffold( isShowAppBar: true, - appBarTitle: TranslationBase.of(context).prescriptions, + appBarTitle: TranslationBase.of(context).askDoctor, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( @@ -87,14 +87,14 @@ class _AskDoctorHomPageState extends State child: Container( width: MediaQuery.of(context).size.width * 0.36, child: Center( - child: Texts('ASK Doctor'), + child: Texts(TranslationBase.of(context).askDoctor), ), ), ), Tab(child: Container( width: MediaQuery.of(context).size.width * 0.36, child: Center( - child: Texts('Doctor Responses',textAlign: TextAlign.start,), + child: Texts(TranslationBase.of(context).doctorResponses,textAlign: TextAlign.start,), ), ),) ], diff --git a/lib/pages/medical/ask_doctor/ask_doctor_page.dart b/lib/pages/medical/ask_doctor/ask_doctor_page.dart index 1aa0004b..6beed0dc 100644 --- a/lib/pages/medical/ask_doctor/ask_doctor_page.dart +++ b/lib/pages/medical/ask_doctor/ask_doctor_page.dart @@ -238,6 +238,3 @@ class AskDoctorPage extends StatelessWidget { } } -/** - * - */ diff --git a/lib/pages/medical/ask_doctor/doctor_response.dart b/lib/pages/medical/ask_doctor/doctor_response.dart index 6993eb5b..b6071a4c 100644 --- a/lib/pages/medical/ask_doctor/doctor_response.dart +++ b/lib/pages/medical/ask_doctor/doctor_response.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/ask_doctor_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -34,7 +35,7 @@ class DoctorResponse extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts('New'), + Texts(TranslationBase.of(context).newDes), Container( width: 30, height: 30, @@ -63,13 +64,15 @@ class DoctorResponse extends StatelessWidget { Navigator.push( context, FadePage( - page: ViewDoctorResponsesPage(doctorResponse: doctor,), + page: ViewDoctorResponsesPage( + doctorResponse: doctor, + ), ), ); }, child: Container( height: 70, - margin: EdgeInsets.only(top: 8,bottom: 8), + margin: EdgeInsets.only(top: 8, bottom: 8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), color: Colors.white, @@ -82,11 +85,15 @@ class DoctorResponse extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(8.0), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Texts('${doctor.doctorName}'), - SizedBox(height: 5,), - Texts('${doctor.requestTypeDescription}'), + SizedBox( + height: 5, + ), + Texts( + '${doctor.requestTypeDescription}'), ], ), ), @@ -108,7 +115,7 @@ class DoctorResponse extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts('All'), + Texts(TranslationBase.of(context).all), Container( width: 30, height: 30, @@ -130,12 +137,12 @@ class DoctorResponse extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: model.doctorResponseList.map( - (doctor) { + (doctor) { return InkWell( onTap: () {}, child: Container( height: 70, - margin: EdgeInsets.only(top: 8,bottom: 8), + margin: EdgeInsets.only(top: 8, bottom: 8), decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), color: Colors.white, @@ -148,11 +155,15 @@ class DoctorResponse extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(8.0), child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, children: [ Texts('${doctor.doctorName}'), - SizedBox(height: 5,), - Texts('${doctor.requestTypeDescription}'), + SizedBox( + height: 5, + ), + Texts( + '${doctor.requestTypeDescription}'), ], ), ), diff --git a/lib/pages/medical/ask_doctor/request_type.dart b/lib/pages/medical/ask_doctor/request_type.dart index cbf2e606..55e04a73 100644 --- a/lib/pages/medical/ask_doctor/request_type.dart +++ b/lib/pages/medical/ask_doctor/request_type.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.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/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -29,7 +30,7 @@ class _RequestTypePageState extends State { onModelReady: (model) => model.getCallRequestTypeLOVs(), builder: (_, model, w) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Request Type', + appBarTitle: TranslationBase.of(context).requestType, baseViewModel: model, body: SingleChildScrollView( child: Container( @@ -83,7 +84,7 @@ class _RequestTypePageState extends State { Container( margin: EdgeInsets.only(left: 10, right: 10), child: NewTextFields( - hintText: 'Enter the question here...', + hintText: TranslationBase.of(context).questionHere, minLines: 2, maxLines: 15, onChanged: (value) { @@ -107,19 +108,20 @@ class _RequestTypePageState extends State { child: Padding( padding: const EdgeInsets.all(12.0), child: SecondaryButton( - label: 'Send', + label: TranslationBase.of(context).submit, loading: model.state == ViewState.BusyLocal, textColor: Colors.white, onTap: () { - model.sendRequestLOV( - doctorList: widget.doctorList, - requestType: parameterCode.toString(), - remark: question).then((value) { - if(model.state!=ViewState.ErrorLocal|| model.state!=ViewState.Error){ - Navigator.pop(context); - } - AppToast.showErrorToast(message: "The question add fine "); - + model + .sendRequestLOV( + doctorList: widget.doctorList, + requestType: parameterCode.toString(), + remark: question) + .then((value) { + if (model.state != ViewState.ErrorLocal || + model.state != ViewState.Error) { + Navigator.pop(context); + } }); }, color: Colors.grey[800], diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 2ac3b4de..cec19e8b 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -25,6 +25,7 @@ import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart' import 'package:provider/provider.dart'; import '../../locator.dart'; import 'active_medications/ActiveMedicationsPage.dart'; +import 'allergies_page.dart'; import 'ask_doctor/ask_doctor_home_page.dart'; import 'balance/my_balance_page.dart'; import 'doctor/doctor_home_page.dart'; @@ -294,12 +295,14 @@ class _MedicalProfilePageState extends State { ), Expanded( flex: 1, - child: MedicalProfileItem( - title: - TranslationBase.of(context).allergies, - imagePath: 'medical_history_icon.png', - subTitle: TranslationBase.of(context) - .allergiesSubtitle, + child: InkWell( + onTap:()=> Navigator.push(context, FadePage(page: AllergiesPage())) , + child: MedicalProfileItem( + title: TranslationBase.of(context).allergies, + imagePath: 'medical_history_icon.png', + subTitle: TranslationBase.of(context) + .allergiesSubtitle, + ), ), ), ]), @@ -357,7 +360,6 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( - //TODO onTap: () { Navigator.push( context, diff --git a/lib/uitl/CalendarUtils.dart b/lib/uitl/CalendarUtils.dart index d61a19b6..546d9b2d 100644 --- a/lib/uitl/CalendarUtils.dart +++ b/lib/uitl/CalendarUtils.dart @@ -33,11 +33,13 @@ class CalendarUtils { {List scheduleList, String title, String description, - List scheduleDateTime}) async { + List scheduleDateTime, + List daysOfWeek}) async { List events = List(); scheduleDateTime.forEach((element) { RecurrenceRule recurrenceRule = RecurrenceRule( RecurrenceFrequency.Daily, + daysOfWeek: daysOfWeek, endDate: element, ); Event event = Event(writableCalendars.id, diff --git a/lib/uitl/date_uitl.dart b/lib/uitl/date_uitl.dart index 65d018bf..0155ff10 100644 --- a/lib/uitl/date_uitl.dart +++ b/lib/uitl/date_uitl.dart @@ -1,3 +1,4 @@ +import 'package:device_calendar/device_calendar.dart'; import 'package:intl/intl.dart'; class DateUtil { @@ -26,12 +27,12 @@ class DateUtil { return start + "$milliseconds" + end; } - static String yearMonthDay(DateTime dateTime){ + static String yearMonthDay(DateTime dateTime) { String dateFormat = '${dateTime.year}-${dateTime.month}-${dateTime.day}'; return dateFormat; } - static String time(DateTime dateTime){ + static String time(DateTime dateTime) { String dateFormat = '${dateTime.hour}:${dateTime.minute}:00'; return dateFormat; } @@ -233,4 +234,31 @@ class DateUtil { .toString() + ")/"; } + + static String getDay(DayOfWeek dayOfWeek) { + switch (dayOfWeek) { + case DayOfWeek.Monday: + return "Monday"; + break; + case DayOfWeek.Tuesday: + return "Tuesday"; + break; + case DayOfWeek.Wednesday: + return "Wednesday"; + break; + case DayOfWeek.Thursday: + return "Thursday"; + break; + case DayOfWeek.Friday: + return "Friday"; + break; + case DayOfWeek.Saturday: + return "Saturday"; + break; + case DayOfWeek.Sunday: + return "Sunday"; + break; + } + return ""; + } } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index adb1a5fc..28b273e5 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -572,6 +572,23 @@ class TranslationBase { String get power => localizedValues['Power'][locale.languageCode]; String get diameter => localizedValues['Diameter'][locale.languageCode]; String get remarks => localizedValues['Remarks'][locale.languageCode]; + String get activeMedications => localizedValues['ActiveMedications'][locale.languageCode]; + String get expDate => localizedValues['ExpDate'][locale.languageCode]; + String get route => localizedValues['Route'][locale.languageCode]; + String get frequency => localizedValues['Frequency'][locale.languageCode]; + String get dailyQuantity => localizedValues['DailyQuantity'][locale.languageCode]; + String get addReminder => localizedValues['AddReminder'][locale.languageCode]; + String get reminderDes => localizedValues['reminderDes'][locale.languageCode]; + String get startDay => localizedValues['StartDay'][locale.languageCode]; + String get endDay => localizedValues['EndDay'][locale.languageCode]; + String get days => localizedValues['Days'][locale.languageCode]; + String get scheduleTime => localizedValues['ScheduleTime'][locale.languageCode]; + String get askDoctor => localizedValues['AskDoctor'][locale.languageCode]; + String get doctorResponses => localizedValues['DoctorResponses'][locale.languageCode]; + String get newDes => localizedValues['New'][locale.languageCode]; + String get all => localizedValues['All'][locale.languageCode]; + String get questionHere => localizedValues['QuestionHere'][locale.languageCode]; + String get viewDoctorResponses => localizedValues['ViewDoctorResponses'][locale.languageCode]; } diff --git a/pubspec.yaml b/pubspec.yaml index 49710761..1c1106f2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -110,11 +110,16 @@ dependencies: #Popup_window popup_box: ^0.1.0 + #datetime_picker flutter_datetime_picker: ^1.4.0 + #local_notifications flutter_local_notifications: ^1.4.4+4 + + #rxdart rxdart: ^0.24.1 + #device_calendar device_calendar: ^3.1.0 #Handle Geolocation From d6a27a8e289e7e834ada7bfafe13232292132467 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 30 Sep 2020 08:54:17 +0300 Subject: [PATCH 7/8] change medical profile icons --- assets/images/medical/active_medications.png | Bin 0 -> 2323 bytes assets/images/medical/ask_doctor_icon.png | Bin 0 -> 3460 bytes assets/images/medical/check-in.png | Bin 0 -> 2050 bytes .../eye_measurement_icon.png | Bin .../images/medical/insurance_update_icon_.png | Bin 0 -> 1362 bytes .../images/medical/medical_reports_icon.png | Bin 0 -> 2968 bytes .../images/medical/monthly_reports_icon.png | Bin 0 -> 3570 bytes assets/images/medical/my_allergies_icon.png | Bin 0 -> 2849 bytes assets/images/medical/my_tracker_icon.png | Bin 0 -> 1864 bytes assets/images/medical/my_vaccines_icon.png | Bin 0 -> 1837 bytes assets/images/medical/sick_leaves_icons.png | Bin 0 -> 3073 bytes assets/images/medical/smartwatch_icon.png | Bin 0 -> 2289 bytes assets/images/medical/vital_signs.png | Bin 0 -> 2103 bytes .../medical/medical_view_model.dart | 5 ++-- lib/pages/medical/medical_profile_page.dart | 27 +++++++++--------- .../medical/medical_profile_item.dart | 3 +- 16 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 assets/images/medical/active_medications.png create mode 100644 assets/images/medical/ask_doctor_icon.png create mode 100644 assets/images/medical/check-in.png rename assets/images/{new-design => medical}/eye_measurement_icon.png (100%) create mode 100644 assets/images/medical/insurance_update_icon_.png create mode 100644 assets/images/medical/medical_reports_icon.png create mode 100644 assets/images/medical/monthly_reports_icon.png create mode 100644 assets/images/medical/my_allergies_icon.png create mode 100644 assets/images/medical/my_tracker_icon.png create mode 100644 assets/images/medical/my_vaccines_icon.png create mode 100644 assets/images/medical/sick_leaves_icons.png create mode 100644 assets/images/medical/smartwatch_icon.png create mode 100644 assets/images/medical/vital_signs.png diff --git a/assets/images/medical/active_medications.png b/assets/images/medical/active_medications.png new file mode 100644 index 0000000000000000000000000000000000000000..67122598b75ec07f71f87ee3e8846249fa1f3cc3 GIT binary patch literal 2323 zcmV+u3GDWXP)002G+1^@s6W1;4l000QuNkl7aX|be#N*b4uPBtmGN;*i=?u^EaB~f5i`FvN>A0(~HSg#)fRyD?NGm}D{ zfeg&9jCC42!X&m->VXx+_)Xf<&bS{tuv#Ix+Iqg^5v<(G|G{cN>VZ{}G@P+cLyVg{ zspoafestoYvIOd z-&y2qo#<4|kmZOiQ2=~e(xsmLaG*6?I`DvYT#Tc6A|FtFRLq8*FKG>mnr+&Up+}qz zcUEOP+Sb3k19GkR7Ylp=gtg*lLAB zVyV^^^m|;=zO7Wo4EhTw^HAPw10MT29L{$1ZJFGSB0KW1%p+tL9@-}K7a4{!ACe-9 znBn}7q`xP;Pd9nw0TgG$(uP<26E?9?StseQq+Z8Mnk?ymsUi_m`kApMlEx&szCaxI zDywrR-pd_>l+@mobnPhE*@e^*jT}5})K8s2iXK2OCS*nJ;SXU|iTrLC=gW-oNo?T} zgd<6cr<;iV>|WzjL!bdEdJMwOQP8>W;f>1qv84ZES4wPATTv&l%91h`gWhDe%w{p}2sj{7@KVZqTZ?RSu<2juq?DVUD7dt;y;X|fKT<#g_!|Y zaIplS(ZM1;IX8N75QO-D~`9RIG}90nNjcJ+LgV{3G$--y(9?SQ6L3 zyVYPR$MXrs*-?@CYILkd%Uhi_JYpI$n#L2$ zOK*{MCjYOH^cd`hF~D=FBTV5qThhytR!aH}rsJ(R12qcPt|oQn4JYht2&fgzBYyk2 zq#G~=Ww?Cfzh+AMf~1pJh0{5{#BOAIf~pr+g%20S{{(*$!j6t;^5Vy&z#td`ROB+MLC;Ht(k(-RrY$=-wo9eBR&q3Z+ByKaX* zuD2!K_2amI#j`sFY+#x3!eY-npK}J%MXW$81)f4YITd?%9u@H)8SNAYEb|(RBpnt3 zREdEWMYL6xQKmw5<_@k28}uR%yf%hibUR>xV?QQJ1ic2p8-y$Cuwm|=ldx4)w%xzb z@mcP1BD?8KCV4)@rrE-}+c1uNlY6{?=kaACvtt1LG~xXfu?@%b21pe~3;zs5QM^NzQscE3B7poab3RE3l;&Yn@EKxGd)V-vHDD z(*~kRKY#7%*-Fs;&?QMCmr0)XKp*6lgh~p&hoauQ@jXW~&;;(J2zCKqxP6Mo}$D;Po zI9u@s_TMb)Oqr*ejPag}4tv;o?&F z9}WRk_0pQ_@c$GX#sc^}18iAZ+i(@0 zs3!u90uPu935W8ty+)S%2#Wja*hZH(4uoo(VOfJy=x2)?*aK;SRVGKviaYNhf$k&po|avyoI$szvA z>Q3|s*-5w8wLI*F0lU3?v_K%bm&YQw6*Q2*Ui!&+dy$)T(Z;jXd#fT(65#rK*y@|S zJn>WTR9mrQR{)p~Ou+AFH26$iURCRTR^w5xg?eF5-)=pdz_LnuGY(HR#Br_1n!18V zC3FmVT|B>yF=hZBgWTtSTUoz^ewhhxGXVhmA}YsON;kpgBEk~$PWKRoJc$?XB_1l1 z+T27QSn?ja3h#an2D^jj4Cl3O+Zvm3uB6N0#>_6>8(<_|WD960vF0PAVOlW>`?LR8)hvG*orv1*MttH`)BU`bwq;`yDg+__%QdEO4& tg0>}URlIGYEr)A{&K8S(@G6d^_W+V7tPfy4Jfr{s002ovPDHLkV1mcAVu}C& literal 0 HcmV?d00001 diff --git a/assets/images/medical/ask_doctor_icon.png b/assets/images/medical/ask_doctor_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb1f27960d4bc33f26847dbb19935618912465b GIT binary patch literal 3460 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 literal 0 HcmV?d00001 diff --git a/assets/images/new-design/eye_measurement_icon.png b/assets/images/medical/eye_measurement_icon.png similarity index 100% rename from assets/images/new-design/eye_measurement_icon.png rename to assets/images/medical/eye_measurement_icon.png diff --git a/assets/images/medical/insurance_update_icon_.png b/assets/images/medical/insurance_update_icon_.png new file mode 100644 index 0000000000000000000000000000000000000000..0001bcd226fc6910dc280494f2b858226a628c68 GIT binary patch literal 1362 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 O0000%P) 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 literal 0 HcmV?d00001 diff --git a/assets/images/medical/my_allergies_icon.png b/assets/images/medical/my_allergies_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..689b5321d8048828d818d8ab9c0bc9509571ed0f GIT binary patch literal 2849 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 literal 0 HcmV?d00001 diff --git a/assets/images/medical/my_tracker_icon.png b/assets/images/medical/my_tracker_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d46b85950eff61eb7696a40b6df2f26bcbe086f GIT binary patch literal 1864 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 P00000NkvXXu0mjfS3urD literal 0 HcmV?d00001 diff --git a/assets/images/medical/smartwatch_icon.png b/assets/images/medical/smartwatch_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c43fe468c64a0128c5378ab91664f1139c5a5f4c GIT binary patch literal 2289 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 LNkvXXu0mjf8XZ#M literal 0 HcmV?d00001 diff --git a/assets/images/medical/vital_signs.png b/assets/images/medical/vital_signs.png new file mode 100644 index 0000000000000000000000000000000000000000..7b642d6e73904974e2923e765ea920985bd0642e GIT binary patch literal 2103 zcmV-72*~$|P) z4~P{-9LK+2YTb4DFDoxFB=ZkRdKIQfnPpU_Wtl{ll15S*MPNb{mIMX{7Ezl0K`RRk zvQqO;1}PMoN>FB2_6MW7B0bHtJ3aM`vG2mXpR;@W-mY(V=FJC|ySF>@c4oitH#>iR zGt&-cIszC6U<`mk0J;OH4hd^J#{g^va3_G@L|)DZumr$>9ObbYz-|Cv0r&vGy8v3^ zM4Skqff=r(W1itz%(o!_4b-fFD(yoD0E_qwtxM&%Wf#92Qv0U`IjEy%i>Tpo^rCo) zLHSkyn*i*LYwi{j6vgumc{~-sgE=dT)oZdBfFZ>kEVq@S2-F!6;IYPq&hM~$Rz zQ-k!^0%#N$Cs+DYvxq4|yGCk?>EeQ^65+`=^Mr;@ia901V8i)bBPs9m6=(zKu$ zUS8=>$YPf3#j&bYb<^_lU8O%Ai_x{~CacTMmHu=rra(I>tj7_&u#VC`#cZkWtV;p( z2)X_ZfFDAxbpZ zE?IVx7mE!OHDCe%meX?EbC~fQPJU`Afc^`)y zHVWM8mse)=Q&3)Rna)?_)3%yD^*O}?O))sNIe8)zKx=ZtDUnt_8%y+Iy z)PPP*?~s#p@6<`+8Z#nAmy)kTyfE6)LS^{0#Z{tyEbh@lU#(K}RG)Ghqe$H~CJl5; zl_a%XCD_ZH@u0?hhlhlbma3cu#?#4eb7oH_0a;t@))@X$DA96FR@lTJQB;@~(K*tY z?^bIpHtovOGQ&C!VWe zQ8($$@682iTI`52WGIg1nygSBO)O%gEVWo}_V3uzY3rRE_P(3|V7+!uS?*vFMp~-1 z*gCosC9d+sHx;c*Sxm0Si8v)HEFZQD6Su$izZ9&=AnrleL`4oqcZwyfLWKw`Y-0D| zIL<&=17Jt~vX%_ng@q<=t0rvV9`EzyC|+1c@xnTa7uHd{u#Vz|brdhGqj+H*C8@A-t%-gW{yb&=k7SgN#63^j znfTy))ByOS?Bc65l#%q*^87D=AG3M}Nrl}@N3o#uU3oX0mqNN+;CT)SW&u;g>@7! ztfQpuK{1lPMi+5fgxVW!1NU9~H6+eJde{%;HY0oJ$o&R@FH=fa6_-7@m5W!Z4TpXK z@DbO$*pt$Iaz&Dv00C!nieZ@7y=u=rBKFc#tA)PQhPVE!DQs`rhrY&P_xRhio1=xy z7WqmnY|-9Z@D336tUX`3MKyNwncP;J=wccmBhf1VccFAoW~IHCxg5fW#b2sfq3 zw7sLnZQ-`ul6GQNUQ3pXMNeXGS?7ZL6* zk)BJ6yiZ;jrI$`gn>(jz|L=|n7j^BQkn_zfrfc}QHbL4NBf`mRNo(O*v4*d(3sn;? zX$OVAs8v1Nt|qRC_>N&A=j%055z!8gleS?IZFc$kFzwZD3u;@KIYAzh6vcA4;l-k@ z3JyLuh?=P$XN$oamDPMI!VN}oJQ*Wz^&Ain!ep}J#>payu(gI=u2j48HcmdCY1l#Q z1%w3?x89~>Ys5tvVwoNOBIWa`t z6mvK^e1Hz zlZAGTdWX+cLyd8v*c;Z9FY2g~)J get appoitmentAllHistoryResultList => _medicalService.appoitmentAllHistoryResultList; - getAppointmentHistory() async{ + getAppointmentHistory() async { setState(ViewState.Busy); - await _medicalService.getAppointmentHistory(); + if (_medicalService.appoitmentAllHistoryResultList.length == 0) + await _medicalService.getAppointmentHistory(); if (_medicalService.hasError) { error = _medicalService.error; setState(ViewState.Error); diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index cec19e8b..e0acb192 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -180,7 +180,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context) .vitalSigns, - imagePath: 'medical_history_icon.png', + imagePath: 'vital_signs.png', subTitle: TranslationBase.of(context) .vitalSignsSubtitle, ), @@ -194,7 +194,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context) .myMedical, - imagePath: 'radiology_icon.png', + imagePath: 'active_medications.png', subTitle: TranslationBase.of(context) .myMedicalSubtitle, ), @@ -235,8 +235,7 @@ class _MedicalProfilePageState extends State { }, child: MedicalProfileItem( title: TranslationBase.of(context).eye, - imagePath: - 'insurance_approvals_icon.png', + imagePath: 'eye_measurement_icon.png', subTitle: TranslationBase.of(context) .eyeSubtitle, ), @@ -271,7 +270,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context) .updateInsurance, - imagePath: 'insurance_card_icon.png', + imagePath: 'insurance_update_icon_.png', subTitle: TranslationBase.of(context) .updateInsuranceSubtitle, ), @@ -299,7 +298,7 @@ class _MedicalProfilePageState extends State { onTap:()=> Navigator.push(context, FadePage(page: AllergiesPage())) , child: MedicalProfileItem( title: TranslationBase.of(context).allergies, - imagePath: 'medical_history_icon.png', + imagePath: 'my_allergies_icon.png', subTitle: TranslationBase.of(context) .allergiesSubtitle, ), @@ -317,7 +316,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context) .myVaccines, - imagePath: 'insurance_card_icon.png', + imagePath: 'my_vaccines_icon.png', subTitle: TranslationBase.of(context) .myVaccinesSubtitle, ), @@ -333,7 +332,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context).medical, - imagePath: 'insurance_approvals_icon.png', + imagePath: 'medical_reports_icon.png', subTitle: TranslationBase.of(context) .medicalSubtitle, ), @@ -349,7 +348,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context).monthly, - imagePath: 'medical_history_icon.png', + imagePath: 'monthly_reports_icon.png', subTitle: TranslationBase.of(context) .monthlySubtitle, ), @@ -368,7 +367,7 @@ class _MedicalProfilePageState extends State { }, child: MedicalProfileItem( title: TranslationBase.of(context).sick, - imagePath: 'insurance_card_icon.png', + imagePath: 'sick_leaves_icons.png', subTitle: TranslationBase.of(context) .sickSubtitle, ), @@ -384,7 +383,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context).myBalance, - imagePath: 'insurance_approvals_icon.png', + imagePath: 'check-in.png', subTitle: TranslationBase.of(context) .myBalanceSubtitle, ), @@ -413,7 +412,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context) .smartWatches, - imagePath: 'insurance_card_icon.png', + imagePath: 'smartwatch_icon.png', subTitle: TranslationBase.of(context) .smartWatchesSubtitle, ), @@ -429,7 +428,7 @@ class _MedicalProfilePageState extends State { child: MedicalProfileItem( title: TranslationBase.of(context) .myTrackers, - imagePath: 'insurance_approvals_icon.png', + imagePath: 'my_tracker_icon.png', subTitle: TranslationBase.of(context) .myTrackersSubtitle, ), @@ -444,7 +443,7 @@ class _MedicalProfilePageState extends State { }, child: MedicalProfileItem( title: TranslationBase.of(context).askYour, - imagePath: 'medical_history_icon.png', + imagePath: 'ask_doctor_icon.png', subTitle: TranslationBase.of(context) .askYourSubtitle, ), diff --git a/lib/widgets/data_display/medical/medical_profile_item.dart b/lib/widgets/data_display/medical/medical_profile_item.dart index e2baa1e4..be6ffba2 100644 --- a/lib/widgets/data_display/medical/medical_profile_item.dart +++ b/lib/widgets/data_display/medical/medical_profile_item.dart @@ -42,7 +42,8 @@ class MedicalProfileItem extends StatelessWidget { alignment: Alignment.bottomRight, child: Image.asset( "assets/images/medical/$imagePath", - height: SizeConfig.heightMultiplier * 7, + height: SizeConfig.heightMultiplier * 5, + width: SizeConfig.heightMultiplier * 5, ), ) ], From bae6fe4ad62dbe735487b35318e3d014bdedb59d Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 30 Sep 2020 09:15:09 +0300 Subject: [PATCH 8/8] fix marge issues --- lib/config/config.dart | 2 +- lib/config/localized_values.dart | 38 ------------------- .../LiveChat/hospitalsLivechat_page.dart | 2 +- 3 files changed, 2 insertions(+), 40 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index e83d4292..961a386d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -5,7 +5,7 @@ import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index eb0ec2e6..40840423 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -534,44 +534,6 @@ const Map> localizedValues = { "en": "Please enter the verification code send to", "ar": "الرجاء إدخال رمز التحقق المرسل إلى" }, - "km":{"en":"KMs:","ar":"كم"}, - "PatientHealthSummaryReport":{"en":"Patient Health Summary Report","ar":" ملخص التقارير الشهرية"}, - "ToViewTheTermsAndConditions":{"en":"To View The Terms And Conditions Report","ar":" عرض الشروط والأحكام "}, - "ClickHere":{"en":"Click here","ar":"أنقر هنا"}, - "IAgreeToTheTermsAndConditions":{"en":"I agree to the terms and conditions ","ar":"أوافق على الشروط والاحكام "}, - "IAgreeToTheTermsAndConditionsSubtitle":{"en":"I agree to the terms and conditions ","ar":"هذا ملخص التقرير الصحي الشهري و الذي يسرد المؤشرات الصحية و نتائج التحاليل لأخر الزيارات. يرجى ملاحظة أن هذا التقرير هو تقرير يتم ارساله بشكل آلي من النظام و لا يعتبر رسمي و لا تؤخذ عليه أي قرارات طبية"}, - "Save":{"en":"Save","ar":"حفظ "}, - "UserAgreement":{"en":"User Agreement","ar":"اتفاقية الخصوصية "}, - "UpdateSuccessfully":{"en":"Update Successfully","ar":"تم التحديث بنجاح"}, - "CHECK_VACCINE_AVAILABILITY":{"en":"CHECK VACCINE AVAILABILITY","ar":"تحقق من توافر اللقاح"}, - "MyVaccinesAvailability":{"en":"MyVaccinesAvailability","ar":"توفر لقاحي"}, - "PaymentService":{"en":"Payment Service","ar":"خدمة المدفوعات"}, - "PaymentOnline":{"en":"Service","ar":"الالكتروني"}, - "OnlineCheckIn":{"en":"Online Check-In","ar":"مدفوعات معلقة"}, - "MyBalances":{"en":"My Balances","ar":"رصيدي"}, - "BalanceAmount":{"en":"Balance Amount","ar":"رصيدالحساب"}, - "TotalBalance":{"en":"Total Balance","ar":"الرصيد الكلي"}, - "CreateAdvancedPayment":{"en":"Create Advanced Payment","ar":"إنشاء دفعة مقدمة"}, - "AdvancePayment":{"en":"Advance Payment","ar":"الدفع مقدما"}, - "AdvancePaymentLabel":{ - "en":"You can create and add an Advanced Payment for you account or other accounts.", - "ar":"يمكنك تحويل مبلغ لحسابك لدى المجموعة أو لحساب احد المراجعين"}, - "FileNumber":{"en":"File Number","ar":"رقم الملف"}, - "Amount":{"en":"Amount *","ar":"المبلغ *"}, - "DepositorEmail":{"en":"Depositor Email *","ar":"البريد الإلكتروني للمودع *"}, - "Notes":{"en":"Notes","ar":"ملاحظات"}, - "SelectPatientName":{"en":"Select Patient Name","ar":"اختر اسم المريض"}, - "SelectFamilyPatientName":{"en":"Family Members","ar":"أفراد الأسرة"}, - "SelectHospital":{"en":"Select Hospital","ar":"اختر المستشفى"}, - "MyAccount":{"en":"My Account","ar":"حسابي"}, - "OtherAccount":{"en":"Other Account","ar":"حساب آخر"}, - "SelectBeneficiary":{"en":"Select Beneficiary","ar":"حدد المستفيد"}, - "ConfirmThePayment":{"en":"Confirm The Payment","ar":"تأكيد عملية الدفع"}, - "DepositorName":{"en":"Depositor Name","ar":"اسم المودع *"}, - "MobileNumber":{"en":"Mobile Number","ar":"رقم الجوال"}, - "Ok":{"en":"Ok","ar":"حسنا"}, - "TheVerificationCodeExpiresIn":{"en":"The Verification Code Expires In","ar":"تنتهي صلاحية رمز التحقق في"}, - "PleaseEnterTheVerificationCode":{"en":"Please enter the verification code send to","ar":"الرجاء إدخال رمز التحقق المرسل إلى"}, "EyeMeasurements":{"en":"Eye Measurements","ar":"قياسات النظر"}, "Measurements":{"en":"Measurements","ar":"قياسات"}, "Classes":{"en":"Classes","ar":"نظارات"}, diff --git a/lib/pages/ContactUs/LiveChat/hospitalsLivechat_page.dart b/lib/pages/ContactUs/LiveChat/hospitalsLivechat_page.dart index 206a95c4..65e2d7b2 100644 --- a/lib/pages/ContactUs/LiveChat/hospitalsLivechat_page.dart +++ b/lib/pages/ContactUs/LiveChat/hospitalsLivechat_page.dart @@ -139,7 +139,7 @@ class _HospitalsLiveChatPageState extends State { IconButton( icon: Icon( Icons - .arrow_forward_rounded, + .arrow_forward, color: tappedIndex == index ? Colors.white