From f35eff1220df812e81567df4baa4c6905176ddb0 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Wed, 30 Dec 2020 15:50:59 +0200 Subject: [PATCH 01/18] working with admission request --- lib/core/service/admission-request-service.dart | 0 lib/core/viewModel/patient-admission-request-viewmodel.dart | 0 .../admission-request/admission-request-detail-screen.dart | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/core/service/admission-request-service.dart create mode 100644 lib/core/viewModel/patient-admission-request-viewmodel.dart create mode 100644 lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart diff --git a/lib/core/service/admission-request-service.dart b/lib/core/service/admission-request-service.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/core/viewModel/patient-admission-request-viewmodel.dart b/lib/core/viewModel/patient-admission-request-viewmodel.dart new file mode 100644 index 00000000..e69de29b diff --git a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart new file mode 100644 index 00000000..e69de29b From 433b2933c48894bdd170b5407e8b446448b849d7 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Wed, 30 Dec 2020 15:51:36 +0200 Subject: [PATCH 02/18] working with admission request and some changes in vital signs --- lib/config/localized_values.dart | 3 + .../service/admission-request-service.dart | 5 + .../patient-admission-request-viewmodel.dart | 9 ++ .../patient-vital-sign-viewmodel.dart | 104 ++++++++++++------ lib/locator.dart | 4 + lib/routes.dart | 3 + .../admission-request-detail-screen.dart | 49 +++++++++ .../vital_sign/vital-signs-screen.dart | 22 +++- lib/util/translations_delegate_base.dart | 3 + .../profile/profile_medical_info_widget.dart | 15 ++- 10 files changed, 175 insertions(+), 42 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index f2880c93..adc3c25e 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -375,4 +375,7 @@ const Map> localizedValues = { 'fio2': {'en': "FIO2(%)", 'ar': 'FIO2(%)'}, 'sao2': {'en': "SAO2(%)", 'ar': 'SAO2(%)'}, 'painManagement': {'en': "Pain Management", 'ar': 'إدارة الألم'}, + 'admission': {'en': "Admission", 'ar': 'قبول'}, + 'request': {'en': "Request", 'ar': 'طلب'}, + 'admissionRequest': {'en': "Admission Request", 'ar': 'طلب قبول'}, }; diff --git a/lib/core/service/admission-request-service.dart b/lib/core/service/admission-request-service.dart index e69de29b..e98ac048 100644 --- a/lib/core/service/admission-request-service.dart +++ b/lib/core/service/admission-request-service.dart @@ -0,0 +1,5 @@ +import 'package:doctor_app_flutter/core/service/base/base_service.dart'; + +class AdmissionRequestService extends BaseService { + +} \ No newline at end of file diff --git a/lib/core/viewModel/patient-admission-request-viewmodel.dart b/lib/core/viewModel/patient-admission-request-viewmodel.dart index e69de29b..28aaae8a 100644 --- a/lib/core/viewModel/patient-admission-request-viewmodel.dart +++ b/lib/core/viewModel/patient-admission-request-viewmodel.dart @@ -0,0 +1,9 @@ +import 'package:doctor_app_flutter/core/service/admission-request-service.dart'; +import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; + +import '../../locator.dart'; + +class AdmissionRequestViewModel extends BaseViewModel{ + + AdmissionRequestService _admissionRequestService = locator(); +} \ No newline at end of file diff --git a/lib/core/viewModel/patient-vital-sign-viewmodel.dart b/lib/core/viewModel/patient-vital-sign-viewmodel.dart index 05c98f0e..e58ad089 100644 --- a/lib/core/viewModel/patient-vital-sign-viewmodel.dart +++ b/lib/core/viewModel/patient-vital-sign-viewmodel.dart @@ -18,14 +18,16 @@ class VitalSignsViewModel extends BaseViewModel { Future getPatientArrivalList(String date, PatiantInformtion patient, {String fromDate}) async { - setState(ViewState.Busy); + // TODO when arrival list work un comment below lines + /* setState(ViewState.Busy); await _vitalSignService.getPatientArrivalList(date, fromDate: fromDate); if (_vitalSignService.hasError) { error = _vitalSignService.error; setState(ViewState.Error); } else { await getPatientVitalSign(patient); - } + }*/ + makeVitalSignDemoData(); } PatientArrivalEntity getPatientAppointmentEntity(PatiantInformtion patient) { @@ -60,41 +62,73 @@ class VitalSignsViewModel extends BaseViewModel { setState(ViewState.Error); } else { if (patientVitalSigns == null) { - _vitalSignService.patientVitalSigns = VitalSignData( - appointmentNo: 2016053265, - bloodPressureCuffLocation: 0, - bloodPressureCuffSize: 0, - bloodPressureHigher: 38, - bloodPressureLower: 32, - bloodPressurePatientPosition: 1, - bodyMassIndex: 31.11, - fio2: 0, - headCircumCm: 0, - heightCm: 150, - idealBodyWeightLbs: -2, - isPainManagementDone: false, - isVitalsRequired: true, - leanBodyWeightLbs: 0, - painCharacter: null, - painDuration: null, - painFrequency: null, - painLocation: null, - painScore: 0, - patientMRN: 3333274, - patientType: 1, - pulseBeatPerMinute: 0, - pulseRhythm: 0, - respirationBeatPerMinute: 0, - respirationPattern: 0, - sao2: 0, - status: 47, - temperatureCelcius: 40, - temperatureCelciusMethod: 1, - waistSizeInch: 39, - weightKg: 70, - ); + makeVitalSignDemoData(); } setState(ViewState.Idle); } } + + makeVitalSignDemoData(){ + _vitalSignService.patientVitalSigns = VitalSignData( + appointmentNo: 2016053265, + bloodPressureCuffLocation: 0, + bloodPressureCuffSize: 0, + bloodPressureHigher: 38, + bloodPressureLower: 32, + bloodPressurePatientPosition: 1, + bodyMassIndex: 31.11, + fio2: 0, + headCircumCm: 0, + heightCm: 150, + idealBodyWeightLbs: -2, + isPainManagementDone: false, + isVitalsRequired: true, + leanBodyWeightLbs: 0, + painCharacter: null, + painDuration: null, + painFrequency: null, + painLocation: null, + painScore: 0, + patientMRN: 3333274, + patientType: 1, + pulseBeatPerMinute: 0, + pulseRhythm: 0, + respirationBeatPerMinute: 0, + respirationPattern: 0, + sao2: 0, + status: 47, + temperatureCelcius: 40, + temperatureCelciusMethod: 1, + waistSizeInch: 39, + weightKg: 70, + ); + } + + String getBMI(double bodyMassIndex) { + if (bodyMassIndex <= 18.5) { + return "Underweight"; + } else if (bodyMassIndex <= 25.0) { + return "Normal"; + } else if (bodyMassIndex <= 30) { + return "Overweight"; + } else { // > 30.0 + return "Obese"; + } + } + + String getTempratureMethod(int temperatureCelciusMethod){ + // temperatureCelciusMethod ( vital sign response field )- master 2005 + if(temperatureCelciusMethod == 1){ + return "Oral"; + } else if(temperatureCelciusMethod == 2){ + return "Axilla"; + } else if(temperatureCelciusMethod == 3){ + return "Rectal"; + } else if(temperatureCelciusMethod == 4){ + return "Tympanic"; + } else if(temperatureCelciusMethod == 5){ + return "Temporal"; + } + } + } diff --git a/lib/locator.dart b/lib/locator.dart index 8bbf00b0..8c67b703 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -11,6 +11,7 @@ import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:get_it/get_it.dart'; import 'core/service/SOAP_service.dart'; +import 'core/service/admission-request-service.dart'; import 'core/service/doctor_reply_service.dart'; import 'core/service/medicine_service.dart'; import 'core/service/patient-vital-signs-service.dart'; @@ -21,6 +22,7 @@ import 'core/service/schedule_service.dart'; import 'core/viewModel/SOAP_view_model.dart'; import 'core/viewModel/doctor_replay_view_model.dart'; import 'core/viewModel/medicine_view_model.dart'; +import 'core/viewModel/patient-admission-request-viewmodel.dart'; import 'core/viewModel/patient-vital-sign-viewmodel.dart'; import 'core/viewModel/patient-referral-viewmodel.dart'; import 'core/viewModel/referral_view_model.dart'; @@ -45,6 +47,7 @@ void setupLocator() { locator.registerLazySingleton(() => PrescriptionService()); locator.registerLazySingleton(() => ProcedureService()); locator.registerLazySingleton(() => VitalSignsService()); + locator.registerLazySingleton(() => AdmissionRequestService()); /// View Model locator.registerFactory(() => DoctorReplayViewModel()); @@ -60,4 +63,5 @@ void setupLocator() { locator.registerFactory(() => PrescriptionViewModel()); locator.registerFactory(() => ProcedureViewModel()); locator.registerFactory(() => VitalSignsViewModel()); + locator.registerFactory(() => AdmissionRequestViewModel()); } diff --git a/lib/routes.dart b/lib/routes.dart index ff0a60e9..8792e206 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -41,6 +41,7 @@ import './screens/settings/settings_screen.dart'; import 'landing_page.dart'; import 'screens/doctor/doctor_reply_screen.dart'; import 'screens/live_care/panding_list.dart'; +import 'screens/patients/profile/admission-request/admission-request-detail-screen.dart'; import 'screens/patients/profile/referral/my-referral-detail-screen.dart'; import 'screens/patients/profile/referral/refer-patient-screen.dart'; import 'screens/prescription/prescription_screen.dart'; @@ -81,6 +82,7 @@ const String PATIENT_INSURANCE_APPROVALS = const String VITAL_SIGN_DETAILS = 'patients/vital-sign-details'; const String CREATE_EPISODE = 'patients/create-episode'; const String PATIENT_VITAL_SIGN = 'patients/vital-sign-data'; +const String PATIENT_ADMISSION_REQUEST = 'patients/admission-request'; const String BODY_MEASUREMENTS = 'patients/body-measurements'; const String IN_PATIENT_PRESCRIPTIONS_DETAILS = 'patients/prescription-details'; @@ -124,6 +126,7 @@ var routes = { PATIENT_INSURANCE_APPROVALS: (_) => InsuranceApprovalsScreen(), VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(), PATIENT_VITAL_SIGN: (_) => PatientVitalSignScreen(), + PATIENT_ADMISSION_REQUEST: (_) => AdmissionRequestDetailScreen(), CREATE_EPISODE: (_) => AddSOAPIndex(), BODY_MEASUREMENTS: (_) => VitalSignItemDetailsScreen(), IN_PATIENT_PRESCRIPTIONS_DETAILS: (_) => InpatientPrescriptionDetailsScreen(), diff --git a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart index e69de29b..dd628abf 100644 --- a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart @@ -0,0 +1,49 @@ +import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; +import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class AdmissionRequestDetailScreen extends StatefulWidget { + @override + _AdmissionRequestDetailScreenState createState() => _AdmissionRequestDetailScreenState(); +} + +class _AdmissionRequestDetailScreenState extends State { + @override + Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + PatiantInformtion patient = routeArgs['patient']; + + return BaseView( + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).admissionRequest, + body: Column( + children: [ + SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + PatientPageHeaderWidget(patient), + ], + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: AppButton( + title: TranslationBase.of(context).refer, + color: HexColor("#B8382B"), + onPressed: null, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart b/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart index c6b183b7..107e2e6b 100644 --- a/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart +++ b/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart @@ -207,6 +207,21 @@ class PatientVitalSignScreen extends StatelessWidget { color: Colors.grey.shade800, fontWeight: FontWeight.normal, ), + SizedBox( + width: 8, + ), + Container( + color: Colors.green, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 2, horizontal: 8), + child: AppText( + "${model.getBMI(model.patientVitalSigns.bodyMassIndex)}", + fontSize: SizeConfig.textMultiplier * 2, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ) ], ), ], @@ -251,7 +266,7 @@ class PatientVitalSignScreen extends StatelessWidget { SizedBox( height: 16, ), - TemperatureWidget(model.patientVitalSigns), + TemperatureWidget(model, model.patientVitalSigns), SizedBox( height: 16, ), @@ -349,9 +364,10 @@ class PatientVitalSignScreen extends StatelessWidget { } class TemperatureWidget extends StatefulWidget { + final VitalSignsViewModel model; final VitalSignData vitalSign; - TemperatureWidget(this.vitalSign); + TemperatureWidget(this.model, this.vitalSign); @override _TemperatureWidgetState createState() => _TemperatureWidgetState(); @@ -450,7 +466,7 @@ class _TemperatureWidgetState extends State { width: 8, ), AppText( - "${widget.vitalSign.temperatureCelciusMethod}", + "${widget.model.getTempratureMethod(widget.vitalSign.temperatureCelciusMethod)}", fontSize: SizeConfig.textMultiplier * 2, color: Colors.grey.shade800, fontWeight: FontWeight.normal, diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 19818a0c..46f8a249 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -412,6 +412,9 @@ class TranslationBase { String get fio2 => localizedValues['fio2'][locale.languageCode]; String get sao2 => localizedValues['sao2'][locale.languageCode]; String get painManagement => localizedValues['painManagement'][locale.languageCode]; + String get admission => localizedValues['admission'][locale.languageCode]; + String get request => localizedValues['request'][locale.languageCode]; + String get admissionRequest => localizedValues['admissionRequest'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/patients/profile/profile_medical_info_widget.dart b/lib/widgets/patients/profile/profile_medical_info_widget.dart index 5833f0d2..e76fe406 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget.dart @@ -75,10 +75,17 @@ class ProfileMedicalInfoWidget extends StatelessWidget { PatientProfileButton( key: key, patient: patient, - route: PATIENT_INSURANCE_APPROVALS, - nameLine1: TranslationBase.of(context).insurance, - nameLine2: TranslationBase.of(context).approvals, - icon: 'lab.png'), + route: PATIENT_ADMISSION_REQUEST, + nameLine1: TranslationBase.of(context).admission, + nameLine2: TranslationBase.of(context).request, + icon: 'heartbeat.png'), + // PatientProfileButton( + // key: key, + // patient: patient, + // route: PATIENT_INSURANCE_APPROVALS, + // nameLine1: TranslationBase.of(context).insurance, + // nameLine2: TranslationBase.of(context).approvals, + // icon: 'lab.png'), PatientProfileButton( key: key, patient: patient, From 49e9ecfa4a0d68da4641086f68d0d9a4c98dc734 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 31 Dec 2020 09:20:37 +0300 Subject: [PATCH 03/18] doctor leave --- lib/config/config.dart | 18 +- lib/config/localized_values.dart | 8 + lib/core/service/sickleave_service.dart | 55 +++ lib/core/viewModel/sick_leave_view_model.dart | 31 ++ lib/screens/dashboard_screen.dart | 40 ++- .../add-rescheduleleave.dart | 193 +++++++++++ .../reschedule-leaves/reschedule_leave.dart | 315 ++++++++++++++++++ lib/util/translations_delegate_base.dart | 4 + 8 files changed, 658 insertions(+), 6 deletions(-) create mode 100644 lib/screens/reschedule-leaves/add-rescheduleleave.dart create mode 100644 lib/screens/reschedule-leaves/reschedule_leave.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index edb34b5e..41601b9f 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -4,8 +4,8 @@ const MAX_SMALL_SCREEN = 660; const ONLY_NUMBERS = "[0-9]"; const ONLY_LETTERS = "[a-zA-Z &'\"]"; const ONLY_DATE = "[0-9/]"; -//const BASE_URL = 'https://hmgwebservices.com/'; -const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://hmgwebservices.com/'; +//const BASE_URL = 'https://uat.hmgwebservices.com/'; const PHARMACY_ITEMS_URL = "Services/Lists.svc/REST/GetPharmcyItems_Region_enh"; const PHARMACY_LIST_URL = "Services/Patients.svc/REST/GetPharmcyList"; const PATIENT_PROGRESS_NOTE_URL = @@ -102,6 +102,11 @@ const ARRIVED_PATIENT_URL = const ADD_SICK_LEAVE = 'Services/DoctorApplication.svc/REST/PostSickLeave'; const GET_SICK_LEAVE = 'Services/DoctorApplication.svc/REST/GetAllSickLeaves'; const EXTEND_SICK_LEAVE = 'Services/DoctorApplication.svc/REST/ExtendSickLeave'; + +const GET_OFFTIME = 'Services/DoctorApplication.svc/REST/GetMasterLookUpList'; + +const GET_RESCHEDULE_LEAVE = + 'Services/DoctorApplication.svc/REST/GetAllSickLeaves'; const GET_PRESCRIPTION_LIST = 'Services/DoctorApplication.svc/REST/GetPrescription'; @@ -120,9 +125,12 @@ const GET_MASTER_LOOKUP_LIST = 'Services/DoctorApplication.svc/REST/GetMasterLookUpList'; const POST_ALLERGY = 'Services/DoctorApplication.svc/REST/PostAllergies'; const POST_HISTORY = 'Services/DoctorApplication.svc/REST/PostHistory'; -const POST_CHIEF_COMPLAINT = 'Services/DoctorApplication.svc/REST/PostChiefcomplaint'; -const POST_PHYSICAL_EXAM = 'Services/DoctorApplication.svc/REST/PostPhysicalExam'; -const POST_PROGRESS_NOTE = '/Services/DoctorApplication.svc/REST/PostProgressNote'; +const POST_CHIEF_COMPLAINT = + 'Services/DoctorApplication.svc/REST/PostChiefcomplaint'; +const POST_PHYSICAL_EXAM = + 'Services/DoctorApplication.svc/REST/PostPhysicalExam'; +const POST_PROGRESS_NOTE = + '/Services/DoctorApplication.svc/REST/PostProgressNote'; var selectedPatientType = 1; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 50d32393..72fa1a26 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -353,4 +353,12 @@ const Map> localizedValues = { 'instruction': {'en': 'Instructions', 'ar': 'إرشادات'}, 'addMedication': {'en': 'ADD MEDICATION', 'ar': 'اضف الدواء'}, 'route': {'en': 'Route', 'ar': 'المسار'}, + 'reschedule-leave': { + 'en': 'Reschedule and leaves', + 'ar': 'إعادة الجدولة والأوراق' + }, + 'no-reschedule-leave': { + 'en': 'No Reschedule and leaves', + 'ar': 'لا إعادة جدولة ويغادر' + } }; diff --git a/lib/core/service/sickleave_service.dart b/lib/core/service/sickleave_service.dart index 70d9a3e4..926187dd 100644 --- a/lib/core/service/sickleave_service.dart +++ b/lib/core/service/sickleave_service.dart @@ -8,7 +8,9 @@ import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.d class SickLeaveService extends BaseService { Map get sickLeavestatisitics => _statistics; Map _statistics = {}; + var offTime = []; + get getOffTimeList => offTime; List get getAllSickLeave => _getAllsickLeave; List _getAllsickLeave = []; Future getStatistics(appoNo, patientMRN) async { @@ -90,4 +92,57 @@ class SickLeaveService extends BaseService { body: {'PatientMRN': 3120772}, ); } + + Future getRescheduleLeave() async { + hasError = false; + await baseAppClient.post( + GET_RESCHEDULE_LEAVE, + onSuccess: (dynamic response, int statusCode) { + Future.value(response); + _getAllsickLeave.clear(); + // response['SickLeavesList']['entityList'].forEach((v) { + // _getAllsickLeave.add(GetAllSickLeaveResponse.fromJson(v)); + // }); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: {'PatientMRN': 3120772}, + ); + } + + Future getOffTime() async { + hasError = false; + + await baseAppClient.post( + GET_OFFTIME, + onSuccess: (dynamic response, int statusCode) { + offTime = []; + offTime = response[' ']; + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: {"MasterInput": 2013}, + ); + } + + Future getReasons(id) async { + hasError = false; + + await baseAppClient.post( + GET_OFFTIME, + onSuccess: (dynamic response, int statusCode) { + offTime = []; + offTime = response[' ']; + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: {"MasterInput": id}, + ); + } } diff --git a/lib/core/viewModel/sick_leave_view_model.dart b/lib/core/viewModel/sick_leave_view_model.dart index a11d43ec..2e07d3b0 100644 --- a/lib/core/viewModel/sick_leave_view_model.dart +++ b/lib/core/viewModel/sick_leave_view_model.dart @@ -12,6 +12,7 @@ class SickLeaveViewModel extends BaseViewModel { SickLeaveService _sickLeaveService = locator(); get sickLeaveStatistics => _sickLeaveService.sickLeavestatisitics; get getAllSIckLeave => _sickLeaveService.getAllSickLeave; + get allOffTime => _sickLeaveService.getOffTimeList; Future addSickLeave(AddSickLeaveRequest addSickLeaveRequest) async { setState(ViewState.Busy); await _sickLeaveService.addSickLeave(addSickLeaveRequest); @@ -51,4 +52,34 @@ class SickLeaveViewModel extends BaseViewModel { } else setState(ViewState.Idle); } + + Future getRescheduleLeave() async { + setState(ViewState.Busy); + await _sickLeaveService.getRescheduleLeave(); + if (_sickLeaveService.hasError) { + error = _sickLeaveService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + + Future getOffTime() async { + setState(ViewState.Busy); + await _sickLeaveService.getOffTime(); + if (_sickLeaveService.hasError) { + error = _sickLeaveService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + + Future getReasons(id) async { + setState(ViewState.Busy); + await _sickLeaveService.getReasons(id); + if (_sickLeaveService.hasError) { + error = _sickLeaveService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index b6bbc6cf..cb36225f 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -11,6 +11,7 @@ import 'package:doctor_app_flutter/core/viewModel/hospital_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/patients/profile/referral/my-referral-patient-screen.dart'; +import 'package:doctor_app_flutter/screens/reschedule-leaves/add-rescheduleleave.dart'; import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; @@ -184,7 +185,9 @@ class _DashboardScreenState extends State { ), Container( color: Colors.white, - height: this.isExpanded ? 150 : 110, + height: this.isExpanded + ? MediaQuery.of(context).size.height * 0.19 + : MediaQuery.of(context).size.height * 0.12, ), ], ), @@ -953,6 +956,41 @@ class _DashboardScreenState extends State { SizedBox( height: 20, ), + Row( + children: [ + DashboardItem( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon( + Icons.rule_folder, + size: 50, + color: Colors.black, + ), + AppText( + TranslationBase.of(context).rescheduleLeaves, + color: Colors.black, + textAlign: TextAlign.center, + ) + ], + ), + hasBorder: true, + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + AddRescheduleLeavScreen(), + // MyReferredPatient(), + ), + ); + }, + ) + ], + ), + SizedBox( + height: 20, + ), ], ), ), diff --git a/lib/screens/reschedule-leaves/add-rescheduleleave.dart b/lib/screens/reschedule-leaves/add-rescheduleleave.dart new file mode 100644 index 00000000..8963f306 --- /dev/null +++ b/lib/screens/reschedule-leaves/add-rescheduleleave.dart @@ -0,0 +1,193 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; +import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; +import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/screens/reschedule-leaves/reschedule_leave.dart'; +import 'package:doctor_app_flutter/screens/sick-leave/sick_leave.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/card_with_bgNew_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class AddRescheduleLeavScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getRescheduleLeave(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).rescheduleLeaves, + body: model.getAllSIckLeave.length > 0 + ? SingleChildScrollView( + child: Column( + children: model.getAllSIckLeave + .map((GetAllSickLeaveResponse item) { + return CardWithBgWidgetNew( + widget: Column( + children: [ + Container( + padding: EdgeInsets.only(left: 10, right: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 4, + child: Wrap( + // mainAxisAlignment: + // MainAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(3), + child: AppText( + item.status == 1 + ? TranslationBase.of( + context) + .approved + : item.status == 2 + ? TranslationBase + .of(context) + .extended + : TranslationBase + .of(context) + .pending, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + color: item.status == 1 + ? Colors.green + : Colors.yellow[800], + ), + Row( + children: [ + AppText( + TranslationBase.of( + context) + .leaveStartDate + + ' ', + fontWeight: + FontWeight.bold, + ), + Flexible( + child: Text( + item.startDate, + overflow: + TextOverflow.ellipsis, + )) + ], + ), + AppText( + item.noOfDays.toString() + + ' ' + + TranslationBase.of( + context) + .daysSickleave, + fontWeight: FontWeight.bold, + ), + Row(children: [ + AppText( + item.remarks, + ) + ]), + ], + ), + SizedBox( + width: 20, + ), + ], + ), + ), + (item.status == 1 || item.status == 2) + ? Expanded( + flex: 1, + child: IconButton( + icon: Icon( + Icons.open_in_full, + size: 40, + ), + // color: Colors.green, //Colors.black, + onPressed: () => { + // openSickLeave(context, true, + // extendedData: item) + }, + )) + : SizedBox(), + ], + )), + SizedBox( + height: 20, + ), + Divider( + height: 1, + ), + ], + )); + }).toList(), + ), + ) + : new Builder(builder: (context) { + return Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.all(40), + decoration: BoxDecoration( + border: Border.all( + color: HexColor('#B8382C'), width: 4), + borderRadius: + BorderRadius.all(Radius.circular(100))), + child: IconButton( + icon: Icon( + Icons.add, + size: 35, + ), + onPressed: () { + openLeave( + context, + false, + ); + }), + ), + Padding( + child: AppText( + TranslationBase.of(context).noReScheduleLeave, + fontWeight: FontWeight.bold, + ), + padding: EdgeInsets.all(10), + ), + AppText( + TranslationBase.of(context).applyNow, + fontWeight: FontWeight.bold, + color: HexColor('#B8382C'), + ) + ], + ), + )); + }), + )); + } + + openLeave(BuildContext context, isExtend, + {GetAllSickLeaveResponse extendedData}) { + showModalBottomSheet( + context: context, + builder: (context) { + return new Container( + child: RescheduleLeaveScreen( + // appointmentNo: extendedData.appointmentNo, + // patientMRN: extendedData.patientMRN, + // isExtended: isExtend, + // extendedData: extendedData, + )); + }); + } +} diff --git a/lib/screens/reschedule-leaves/reschedule_leave.dart b/lib/screens/reschedule-leaves/reschedule_leave.dart new file mode 100644 index 00000000..6de0779e --- /dev/null +++ b/lib/screens/reschedule-leaves/reschedule_leave.dart @@ -0,0 +1,315 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; +import 'package:doctor_app_flutter/models/sickleave/add_sickleave_request.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/util/text_validator.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/shared/Text.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:intl/intl.dart'; +import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; + +Helpers helpers = Helpers(); + +class RescheduleLeaveScreen extends StatefulWidget { + RescheduleLeaveScreen(); + @override + _RescheduleLeaveScreen createState() => _RescheduleLeaveScreen(); +} + +class _RescheduleLeaveScreen extends State { + DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); + TextEditingController _toDateController = new TextEditingController(); + String _selectedClinic; + Map profile = {}; + AddSickLeaveRequest addSickLeave = AddSickLeaveRequest(); + void _presentDatePicker(id) { + showDatePicker( + context: context, + initialDate: DateTime.now(), + firstDate: DateTime(2019), + lastDate: DateTime.now(), + ).then((pickedDate) { + if (pickedDate == null) { + return; + } + setState(() { + // var selectedDate = DateFormat.yMd().format(pickedDate); + final df = new DateFormat('yyyy-MM-dd'); + addSickLeave.startDate = df.format(pickedDate); + + _toDateController.text = addSickLeave.startDate; + //addSickLeave.startDate = selectedDate; + }); + }); + } + + @override + void initState() { + getProfile(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getClinicsList(), + builder: (_, model, w) => BaseView( + onModelReady: (model2) => model2.getOffTime(), + builder: (_, model2, w) => AppScaffold( + baseViewModel: model, + isShowAppBar: false, + body: Center( + child: Container( + margin: EdgeInsets.only(top: 10), + child: FractionallySizedBox( + widthFactor: 0.9, + child: ListView( + children: [ + Container( + margin: EdgeInsets.only( + top: 10, left: 10, right: 10), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + width: double.infinity, + child: Padding( + padding: EdgeInsets.only( + top: SizeConfig.widthMultiplier * 0.9, + bottom: SizeConfig.widthMultiplier * 0.9, + right: SizeConfig.widthMultiplier * 3, + left: SizeConfig.widthMultiplier * 3), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + // AppText( + // TranslationBase.of(context).clinicName, + // fontSize: 10, + // ), + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + // add Expanded to have your dropdown button fill remaining space + child: DropdownButtonHideUnderline( + child: new IgnorePointer( + ignoring: true, + child: DropdownButton( + focusColor: Colors.grey, + isExpanded: true, + value: getClinicName( + model) ?? + "", + iconSize: 40, + elevation: 16, + selectedItemBuilder: + (BuildContext + context) { + return model + .getClinicNameList() + .map((item) { + return Row( + mainAxisSize: + MainAxisSize + .max, + children: [ + AppText( + item, + fontSize: SizeConfig + .textMultiplier * + 2.1, + color: + Colors.grey, + ), + ], + ); + }).toList(); + }, + onChanged: (newValue) => + {}, + items: model + .getClinicNameList() + .map((item) { + return DropdownMenuItem( + value: + item.toString(), + child: Text( + item, + textAlign: + TextAlign.end, + ), + ); + }).toList(), + ))), + ), + ], + ) + ], + ), + )), + SizedBox( + height: 10, + ), + Container( + margin: EdgeInsets.only(left: 10, right: 10), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + new IgnorePointer( + ignoring: true, + child: AppTextFormField( + readOnly: true, + hintText: profile['DoctorName'], + borderColor: Colors.white, + onSaved: (value) {}, + inputFormatter: ONLY_NUMBERS)) + ], + ), + ), + + Container( + margin: EdgeInsets.only( + top: 10, left: 10, right: 10), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + width: double.infinity, + child: Padding( + padding: EdgeInsets.only( + top: SizeConfig.widthMultiplier * 0.9, + bottom: SizeConfig.widthMultiplier * 0.9, + right: SizeConfig.widthMultiplier * 3, + left: SizeConfig.widthMultiplier * 3), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + // add Expanded to have your dropdown button fill remaining space + child: DropdownButtonHideUnderline( + child: new IgnorePointer( + ignoring: true, + child: DropdownButton( + focusColor: Colors.grey, + isExpanded: true, + value: getClinicName( + model) ?? + "", + iconSize: 40, + elevation: 16, + selectedItemBuilder: + (BuildContext + context) { + return model + .getClinicNameList() + .map((item) { + return Row( + mainAxisSize: + MainAxisSize + .max, + children: [ + AppText( + item, + fontSize: SizeConfig + .textMultiplier * + 2.1, + color: + Colors.grey, + ), + ], + ); + }).toList(); + }, + onChanged: (newValue) => + {}, + items: model + .getClinicNameList() + .map((item) { + return DropdownMenuItem( + value: + item.toString(), + child: Text( + item, + textAlign: + TextAlign.end, + ), + ); + }).toList(), + ))), + ), + ], + ) + ], + ), + )), + + Container( + margin: EdgeInsets.all( + SizeConfig.widthMultiplier * 5), + child: Wrap( + alignment: WrapAlignment.center, + children: [ + AppButton( + title: TranslationBase.of(context).add, + onPressed: () {}, + ), + ], + ), + ), + // Column( + // children: [ + // Texts(TranslationBase.of(context) + // .previousSickLeaveIssue + + // ' ') + // ], + // ) + ], + ), + ), + ), + ), + ))); + } + + getProfile() async { + Map p = await sharedPref.getObj(DOCTOR_PROFILE); + setState(() { + this.profile = p; + }); + } + + getClinicName(model) { + var clinicInfo = model.clinicsList + .where((i) => i['ClinicID'] == this.profile['ClinicID']) + .toList(); + return clinicInfo.length > 0 ? clinicInfo[0]['ClinicDescription'] : ""; + } +} diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 59eda9e0..4841f0f5 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -387,9 +387,13 @@ class TranslationBase { String get indication => localizedValues['indication'][locale.languageCode]; String get duration => localizedValues['duration'][locale.languageCode]; String get instruction => localizedValues['instruction'][locale.languageCode]; + String get rescheduleLeaves => + localizedValues['reschedule-leave'][locale.languageCode]; String get addMedication => localizedValues['addMedication'][locale.languageCode]; String get route => localizedValues['route'][locale.languageCode]; + String get noReScheduleLeave => + localizedValues['no-reschedule-leave'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From 5142b5b6c7434efb291bb273ecba570d594bcf77 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 31 Dec 2020 13:38:47 +0200 Subject: [PATCH 04/18] finish admission request design --- lib/config/localized_values.dart | 23 + lib/core/enum/master_lookup_key.dart | 8 +- .../service/admission-request-service.dart | 5 - lib/core/service/base/lookup-service.dart | 20 +- .../patient-admission-request-service.dart | 31 ++ .../patient-admission-request-viewmodel.dart | 39 +- lib/locator.dart | 2 +- lib/routes.dart | 6 + .../admission-request-detail-screen.dart | 278 +++++++++++- .../admission-request-third-screen.dart | 208 +++++++++ .../admission-request_second-screen.dart | 402 ++++++++++++++++++ lib/util/helpers.dart | 45 ++ lib/util/translations_delegate_base.dart | 23 + 13 files changed, 1059 insertions(+), 31 deletions(-) delete mode 100644 lib/core/service/admission-request-service.dart create mode 100644 lib/core/service/patient-admission-request-service.dart create mode 100644 lib/screens/patients/profile/admission-request/admission-request-third-screen.dart create mode 100644 lib/screens/patients/profile/admission-request/admission-request_second-screen.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index adc3c25e..c84307a5 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -278,6 +278,7 @@ const Map> localizedValues = { "sick-leave-days": {"en": "Sick leave days", "ar": "عدد ايام الاجازة."}, 'admissionDetail': {'en': 'ADMISSION DETAIL: ', 'ar': 'تفاصيل القبول: '}, 'dateTime': {'en': 'DATE / TIME:', 'ar': 'التاريخ / الوقت:'}, + 'date': {'en': 'Date', 'ar': 'التاريخ'}, 'admissionNo': {'en': 'ADMISSION #: ', 'ar': 'قبول #:'}, 'losNo': {'en': 'LOS #:', 'ar': 'LOS #:'}, 'area': {'en': 'AREA:', 'ar': 'المنطقة'}, @@ -378,4 +379,26 @@ const Map> localizedValues = { 'admission': {'en': "Admission", 'ar': 'قبول'}, 'request': {'en': "Request", 'ar': 'طلب'}, 'admissionRequest': {'en': "Admission Request", 'ar': 'طلب قبول'}, + 'patientDetails': {'en': "Patient Details", 'ar': 'تفاصيل المريض'}, + 'specialityAndDoctorDetail': {'en': "SPECIALITY AND DOCTOR DETAILS", 'ar': 'تفاصيل التخصص والطبيب'}, + 'referringDate': {'en': "Referring Date", 'ar': 'تاريخ الإحالة'}, + 'referringDoctor': {'en': "Referring Doctor", 'ar': 'دكتور الإحالة'}, + 'otherInformation': {'en': "Other Information", 'ar': 'معلومات أخرى'}, + 'expectedDays': {'en': "Expected Days", 'ar': 'الأيام المتوقعة'}, + 'expectedAdmissionDate': {'en': "Expected Admission Date", 'ar': 'تاريخ القبول المتوقع'}, + 'emergencyAdmission': {'en': "EMERGENCY ADMISSION", 'ar': 'دخول الطوارئ'}, + 'patientPregnant': {'en': "Patient Pregnant", 'ar': 'حمل المريض'}, + 'treatmentLine': {'en': "Main line of treatment", 'ar': 'الخط الرئيسي للعلاج'}, + 'ward': {'en': "Ward", 'ar': 'رعاية'}, + 'preAnesthesiaReferred': {'en': "PRE ANESTHESIA REFERRED", 'ar': 'الاحالة قبل التخدير'}, + 'admissionType': {'en': "Admission Type", 'ar': 'نوع القبول'}, + 'diagnosis': {'en': "Diagnosis", 'ar': 'التشخيص'}, + 'allergies': {'en': "Allergies", 'ar': 'الحساسية'}, + 'preOperativeOrders': {'en': "Pre Operative Orders", 'ar': 'أوامر ما قبل العملية'}, + 'elementForImprovement': {'en': "Element For Improvement", 'ar': 'عنصر للتحسين'}, + 'dischargeDate': {'en': "Discharge Date", 'ar': 'تاريخ التفريغ'}, + 'dietType': {'en': "Diet Type", 'ar': 'نوع النظام الغذائي'}, + 'dietTypeRemarks': {'en': "Remarks on diet type", 'ar': 'ملاحظات على نوع النظام الغذائي'}, + 'save': {'en': "SAVE", 'ar': 'حفظ'}, + 'postPlansEstimatedCost': {'en': "POST PLANS & ESTIMATED COST", 'ar': 'خطط البريد والتكلفة المقدرة'}, }; diff --git a/lib/core/enum/master_lookup_key.dart b/lib/core/enum/master_lookup_key.dart index 8f5d76f8..f1ba1d46 100644 --- a/lib/core/enum/master_lookup_key.dart +++ b/lib/core/enum/master_lookup_key.dart @@ -10,7 +10,9 @@ enum MasterKeysService { physiotherapyGoals, DiagnosisCondition, DiagnosisType, - ICD10 + ICD10, + TemperatureMethods, + Speciality } extension SelectedMasterKeysService on MasterKeysService { @@ -51,6 +53,10 @@ extension SelectedMasterKeysService on MasterKeysService { break; case MasterKeysService.ICD10: return 2500; + case MasterKeysService.TemperatureMethods: + return 2005; + case MasterKeysService.Speciality: + return 10; break; } } diff --git a/lib/core/service/admission-request-service.dart b/lib/core/service/admission-request-service.dart deleted file mode 100644 index e98ac048..00000000 --- a/lib/core/service/admission-request-service.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:doctor_app_flutter/core/service/base/base_service.dart'; - -class AdmissionRequestService extends BaseService { - -} \ No newline at end of file diff --git a/lib/core/service/base/lookup-service.dart b/lib/core/service/base/lookup-service.dart index d677201b..df8ebc38 100644 --- a/lib/core/service/base/lookup-service.dart +++ b/lib/core/service/base/lookup-service.dart @@ -34,6 +34,8 @@ class LookupService extends BaseService { List listOfDiagnosisType = []; List listOfDiagnosisCondition = []; List listOfICD10 = []; + List listOfTemperatureMethods = []; + List listOfSpeciality = []; Future getMasterLookup(MasterKeysService masterKeys) async { hasError = false; @@ -121,13 +123,27 @@ class LookupService extends BaseService { .add(MasterKeyModel.fromJson(v)); }); break; - case MasterKeysService.ICD10: - listOfICD10.clear(); + case MasterKeysService.ICD10: + listOfICD10.clear(); entryList.forEach((v) { listOfICD10 .add(MasterKeyModel.fromJson(v)); }); break; + case MasterKeysService.TemperatureMethods: + listOfTemperatureMethods.clear(); + entryList.forEach((v) { + listOfTemperatureMethods + .add(MasterKeyModel.fromJson(v)); + }); + break; + case MasterKeysService.Speciality: + listOfSpeciality.clear(); + entryList.forEach((v) { + listOfSpeciality + .add(MasterKeyModel.fromJson(v)); + }); + break; } } } diff --git a/lib/core/service/patient-admission-request-service.dart b/lib/core/service/patient-admission-request-service.dart new file mode 100644 index 00000000..62932908 --- /dev/null +++ b/lib/core/service/patient-admission-request-service.dart @@ -0,0 +1,31 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/service/base/lookup-service.dart'; + +class AdmissionRequestService extends LookupService { + List doctorsList = []; + List specialityList = []; + + setSpecialityList() { + specialityList.clear(); + listOfSpeciality.forEach((element) { + specialityList.add(element.toJson()); + }); + } + + Future getDoctorsList() async { + hasError = false; + + await baseAppClient.post( + PATIENT_GET_DOCTOR_BY_CLINIC_URL, + onSuccess: (dynamic response, int statusCode) { + doctorsList = []; + doctorsList = response['List_Doctors_All']; + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: Map(), + ); + } +} diff --git a/lib/core/viewModel/patient-admission-request-viewmodel.dart b/lib/core/viewModel/patient-admission-request-viewmodel.dart index 28aaae8a..15f54e5d 100644 --- a/lib/core/viewModel/patient-admission-request-viewmodel.dart +++ b/lib/core/viewModel/patient-admission-request-viewmodel.dart @@ -1,9 +1,46 @@ -import 'package:doctor_app_flutter/core/service/admission-request-service.dart'; +import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; +import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; +import 'package:doctor_app_flutter/core/service/patient-admission-request-service.dart'; import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; +import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; import '../../locator.dart'; class AdmissionRequestViewModel extends BaseViewModel{ AdmissionRequestService _admissionRequestService = locator(); + + List get doctorsList => _admissionRequestService.doctorsList; + + List get speciality => _admissionRequestService.specialityList; + + String selectedLanguage; + + Future getLanguage() async { + selectedLanguage = await sharedPref.getString(APP_Language); + } + + Future getMasterLookup() async { + setState(ViewState.Busy); + await getLanguage(); + await _admissionRequestService.getMasterLookup(MasterKeysService.Speciality); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.Error); + } else { + _admissionRequestService.setSpecialityList(); + await getClinicDoctors(); + } + } + + Future getClinicDoctors() async { + setState(ViewState.Busy); + await _admissionRequestService.getDoctorsList(); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } \ No newline at end of file diff --git a/lib/locator.dart b/lib/locator.dart index 8c67b703..0b932a62 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -11,7 +11,7 @@ import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:get_it/get_it.dart'; import 'core/service/SOAP_service.dart'; -import 'core/service/admission-request-service.dart'; +import 'core/service/patient-admission-request-service.dart'; import 'core/service/doctor_reply_service.dart'; import 'core/service/medicine_service.dart'; import 'core/service/patient-vital-signs-service.dart'; diff --git a/lib/routes.dart b/lib/routes.dart index 52183a63..ff03096f 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -42,6 +42,8 @@ import 'landing_page.dart'; import 'screens/doctor/doctor_reply_screen.dart'; import 'screens/live_care/panding_list.dart'; import 'screens/patients/profile/admission-request/admission-request-detail-screen.dart'; +import 'screens/patients/profile/admission-request/admission-request-third-screen.dart'; +import 'screens/patients/profile/admission-request/admission-request_second-screen.dart'; import 'screens/patients/profile/referral/my-referral-detail-screen.dart'; import 'screens/patients/profile/referral/refer-patient-screen.dart'; import 'screens/prescription/prescription_screen.dart'; @@ -84,6 +86,8 @@ const String CREATE_EPISODE = 'patients/create-episode'; const String PATIENT_VITAL_SIGN = 'patients/vital-sign-data'; const String UPDATE_EPISODE = 'patients/create-episode'; const String PATIENT_ADMISSION_REQUEST = 'patients/admission-request'; +const String PATIENT_ADMISSION_REQUEST_2 = 'patients/admission-request-second'; +const String PATIENT_ADMISSION_REQUEST_3 = 'patients/admission-request-third'; const String BODY_MEASUREMENTS = 'patients/body-measurements'; const String IN_PATIENT_PRESCRIPTIONS_DETAILS = 'patients/prescription-details'; @@ -129,6 +133,8 @@ var routes = { VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(), PATIENT_VITAL_SIGN: (_) => PatientVitalSignScreen(), PATIENT_ADMISSION_REQUEST: (_) => AdmissionRequestDetailScreen(), + PATIENT_ADMISSION_REQUEST_2: (_) => AdmissionRequestSecondScreen(), + PATIENT_ADMISSION_REQUEST_3: (_) => AdmissionRequestThirdScreen(), CREATE_EPISODE: (_) => AddSOAPIndex(), UPDATE_EPISODE: (_) => AddSOAPIndex(isUpdate: true,), BODY_MEASUREMENTS: (_) => VitalSignItemDetailsScreen(), diff --git a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart index dd628abf..9a474779 100644 --- a/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request-detail-screen.dart @@ -1,49 +1,285 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/date-utils.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/dialogs/dailog-list-select.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; +import '../../../../routes.dart'; +import 'admission-request_second-screen.dart'; + class AdmissionRequestDetailScreen extends StatefulWidget { @override - _AdmissionRequestDetailScreenState createState() => _AdmissionRequestDetailScreenState(); + _AdmissionRequestDetailScreenState createState() => + _AdmissionRequestDetailScreenState(); } -class _AdmissionRequestDetailScreenState extends State { +class _AdmissionRequestDetailScreenState + extends State { + DateTime selectedDate; + dynamic _selectedSpeciality; + dynamic _selectedDoctor; + @override Widget build(BuildContext context) { final routeArgs = ModalRoute.of(context).settings.arguments as Map; PatiantInformtion patient = routeArgs['patient']; + final screenSize = MediaQuery.of(context).size; return BaseView( + onModelReady: (model) => model.getMasterLookup(), builder: (_, model, w) => AppScaffold( baseViewModel: model, appBarTitle: TranslationBase.of(context).admissionRequest, - body: Column( - children: [ - SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, + body: model.doctorsList != null + ? Column( children: [ - PatientPageHeaderWidget(patient), + Expanded( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PatientPageHeaderWidget(patient), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).patientDetails, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), + Container( + decoration: + Helpers.containerBorderDecoration( + Color(0xFFEEEEEE), + Color(0xFFCCCCCC), + borderWidth: 0.0), + height: screenSize.height * 0.070, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + "Pre Admission Number :01", + null, + false), + enabled: false, + // controller: _remarksController, + keyboardType: TextInputType.text, + )), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: () => _selectDate(context, model), + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).date, + selectedDate != null + ? "${DateUtils.convertStringToDateFormat(selectedDate.toString(), "yyyy-MM-dd")}" + : null, + true, + suffixIcon: Icon( + Icons.calendar_today, + color: Colors.black, + )), + enabled: false, + ), + ), + ), + SizedBox( + height: 20, + ), + AppText( + TranslationBase.of(context) + .specialityAndDoctorDetail, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.speciality, + attributeName: model.selectedLanguage == 'ar' ? 'nameAr' :'nameEn' , + attributeValueId: 'id', + okText: + TranslationBase.of(context) + .ok, + okFunction: (selectedValue) { + setState(() { + _selectedSpeciality = + selectedValue; + }); + }); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .speciality, + _selectedSpeciality != null + ? model.selectedLanguage == 'ar' ? _selectedSpeciality['nameAr'] : _selectedSpeciality['nameEn'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.doctorsList, + attributeName: 'DoctorName', + attributeValueId: 'DoctorID', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + : null, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).doctor, + _selectedDoctor != null + ? _selectedDoctor['DoctorName'] + : null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + decoration: + Helpers.containerBorderDecoration( + Color(0xFFEEEEEE), + Color(0xFFCCCCCC), + borderWidth: 0.0), + child: InkWell( + onTap: () => null, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).referringDate, + null, + true, + suffixIcon: Icon( + Icons.calendar_today, + color: Color(0xFFCCCCCC), + )), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + decoration: + Helpers.containerBorderDecoration( + Color(0xFFEEEEEE), + Color(0xFFCCCCCC), + borderWidth: 0.0), + height: screenSize.height * 0.070, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).referringDoctor, + null, + true, dropDownColor: Color(0xFFCCCCCC)), + enabled: false, + // controller: _remarksController, + keyboardType: TextInputType.text, + )), + ], + ), + ), + ], + ), + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: AppButton( + title: TranslationBase.of(context).next, + color: HexColor("#B8382B"), + onPressed: (){ + Navigator.of(context).pushNamed(PATIENT_ADMISSION_REQUEST_2, arguments: {'patient': patient}); + }, + ), + ), ], - ), - ), - Container( - margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), - child: AppButton( - title: TranslationBase.of(context).refer, - color: HexColor("#B8382B"), - onPressed: null, - ), - ), - ], - ), - ), + ) + : Container(), + ), + ); + } + + _selectDate(BuildContext context, AdmissionRequestViewModel model) async { + selectedDate = DateTime.now(); + final DateTime picked = await showDatePicker( + context: context, + initialDate: selectedDate, + firstDate: DateTime.now().add(Duration(hours: 2)), + lastDate: DateTime(2040), + initialEntryMode: DatePickerEntryMode.calendar, ); + if (picked != null && picked != selectedDate) { + setState(() { + selectedDate = picked; + }); + } } } diff --git a/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart new file mode 100644 index 00000000..aacff6dd --- /dev/null +++ b/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart @@ -0,0 +1,208 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; +import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/date-utils.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:hexcolor/hexcolor.dart'; + +class AdmissionRequestThirdScreen extends StatefulWidget { + @override + _AdmissionRequestThirdScreenState createState() => _AdmissionRequestThirdScreenState(); +} + +class _AdmissionRequestThirdScreenState extends State { + + final _postPlansEstimatedCostController = TextEditingController(); + final _dietTypeRemarksController = TextEditingController(); + DateTime _dischargeDate; + dynamic _selectedDietType; + + @override + Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + PatiantInformtion patient = routeArgs['patient']; + final screenSize = MediaQuery.of(context).size; + + return BaseView( + // onModelReady: (model) => model.getMasterLookup(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).admissionRequest, + body: model.doctorsList != null + ? Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PatientPageHeaderWidget(patient), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).postPlansEstimatedCost, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), + Container( + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .postPlansEstimatedCost, + null, + false), + enabled: true, + controller: _postPlansEstimatedCostController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: () { + if (_dischargeDate == null) { + _dischargeDate = DateTime.now(); + } + _selectDate( + context, _dischargeDate, + (picked) { + setState(() { + _dischargeDate = picked; + }); + }); + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .expectedAdmissionDate, + _dischargeDate != null + ? "${DateUtils.convertStringToDateFormat(_dischargeDate.toString(), "yyyy-MM-dd")}" + : null, + true, + suffixIcon: Icon( + Icons.calendar_today, + color: Colors.black, + )), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: /*model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.doctorsList, + attributeName: 'DoctorName', + attributeValueId: 'DoctorID', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + :*/ null, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).dietType, + /* _admissionType != null + ? _admissionType['DoctorName'] + :*/ null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .dietTypeRemarks, + null, + false), + enabled: true, + controller: _dietTypeRemarksController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + ], + ), + ), + ], + ), + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: AppButton( + title: TranslationBase.of(context).save, + color: HexColor("#B8382B"), + onPressed: null, + ), + ), + ], + ) + : Container(), + ), + ); + } + + Future _selectDate(BuildContext context, DateTime dateTime, + Function(DateTime picked) updateDate) async { + final DateTime picked = await showDatePicker( + context: context, + initialDate: dateTime, + firstDate: DateTime.now(), + lastDate: DateTime(2040), + initialEntryMode: DatePickerEntryMode.calendar, + ); + if (picked != null && picked != dateTime) { + updateDate(picked); + } + } +} diff --git a/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart new file mode 100644 index 00000000..52995ab4 --- /dev/null +++ b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart @@ -0,0 +1,402 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/viewModel/patient-admission-request-viewmodel.dart'; +import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/date-utils.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:hexcolor/hexcolor.dart'; + +import '../../../../routes.dart'; + +class AdmissionRequestSecondScreen extends StatefulWidget { + @override + _AdmissionRequestSecondScreenState createState() => + _AdmissionRequestSecondScreenState(); +} + +class _AdmissionRequestSecondScreenState + extends State { + final _expectedDaysController = TextEditingController(); + final _treatmentLineController = TextEditingController(); + final _preOperativeOrdersController = TextEditingController(); + DateTime _expectedAdmissionDate; + bool _emergencyAdmission = false; + bool _patientPregnant = false; + bool _preAnesthesiaReferred = false; + dynamic _selectedWard; + dynamic _selectedAdmissionType; + + @override + Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + PatiantInformtion patient = routeArgs['patient']; + final screenSize = MediaQuery.of(context).size; + + return BaseView( + // onModelReady: (model) => model.getMasterLookup(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).admissionRequest, + body: model.doctorsList != null + ? Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + PatientPageHeaderWidget(patient), + Container( + margin: EdgeInsets.symmetric( + vertical: 16, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).otherInformation, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .expectedDays, + null, + false), + enabled: true, + controller: _expectedDaysController, + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp(ONLY_NUMBERS)) + ], + keyboardType: TextInputType.number, + )), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: () { + if (_expectedAdmissionDate == null) { + _expectedAdmissionDate = DateTime.now(); + } + _selectDate( + context, _expectedAdmissionDate, + (picked) { + setState(() { + _expectedAdmissionDate = picked; + }); + }); + }, + child: TextField( + decoration: + Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .expectedAdmissionDate, + _expectedAdmissionDate != null + ? "${DateUtils.convertStringToDateFormat(_expectedAdmissionDate.toString(), "yyyy-MM-dd")}" + : null, + true, + suffixIcon: Icon( + Icons.calendar_today, + color: Colors.black, + )), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + CheckboxListTile( + title: AppText( + TranslationBase.of(context) + .emergencyAdmission, + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: _emergencyAdmission, + onChanged: (newValue) { + setState(() { + _emergencyAdmission = newValue; + }); + }, + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), + CheckboxListTile( + title: AppText( + TranslationBase.of(context) + .patientPregnant, + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: _patientPregnant, + onChanged: (newValue) { + setState(() { + _patientPregnant = newValue; + }); + }, + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), + Container( + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).treatmentLine, + null, + false), + enabled: true, + controller: _treatmentLineController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: /*model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.doctorsList, + attributeName: 'DoctorName', + attributeValueId: 'DoctorID', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + :*/ null, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).ward, + /* _selectedWard != null + ? _selectedWard['DoctorName'] + :*/ null, + true), + enabled: false, + ), + ), + ), + CheckboxListTile( + title: AppText( + TranslationBase.of(context) + .preAnesthesiaReferred, + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: _preAnesthesiaReferred, + onChanged: (newValue) { + setState(() { + _preAnesthesiaReferred = newValue; + }); + }, + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: /*model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.doctorsList, + attributeName: 'DoctorName', + attributeValueId: 'DoctorID', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + :*/ null, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).admissionType, + /* _admissionType != null + ? _admissionType['DoctorName'] + :*/ null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: /*model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.doctorsList, + attributeName: 'DoctorName', + attributeValueId: 'DoctorID', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + :*/ null, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).diagnosis, + /* _admissionType != null + ? _admissionType['DoctorName'] + :*/ null, + true), + enabled: false, + ), + ), + ), + SizedBox( + height: 10, + ), + Container( + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).preOperativeOrders, + null, + false), + enabled: true, + controller: _preOperativeOrdersController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 10, + ), + Container( + height: screenSize.height * 0.070, + child: InkWell( + onTap: /*model.doctorsList != null && + model.doctorsList.length > 0 + ? () { + ListSelectDialog dialog = + ListSelectDialog( + list: model.doctorsList, + attributeName: 'DoctorName', + attributeValueId: 'DoctorID', + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + setState(() { + _selectedDoctor = selectedValue; + }); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + :*/ null, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).allergies, + /* _admissionType != null + ? _admissionType['DoctorName'] + :*/ null, + true), + enabled: false, + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: AppButton( + title: TranslationBase.of(context).next, + color: HexColor("#B8382B"), + onPressed: (){ + Navigator.of(context).pushNamed(PATIENT_ADMISSION_REQUEST_3, arguments: {'patient': patient}); + }, + ), + ), + ], + ) + : Container(), + ), + ); + } + + Future _selectDate(BuildContext context, DateTime dateTime, + Function(DateTime picked) updateDate) async { + final DateTime picked = await showDatePicker( + context: context, + initialDate: dateTime, + firstDate: DateTime.now(), + lastDate: DateTime(2040), + initialEntryMode: DatePickerEntryMode.calendar, + ); + if (picked != null && picked != dateTime) { + updateDate(picked); + } + } +} diff --git a/lib/util/helpers.dart b/lib/util/helpers.dart index c1d70cef..a2692c74 100644 --- a/lib/util/helpers.dart +++ b/lib/util/helpers.dart @@ -352,4 +352,49 @@ class Helpers { // TODO Fix it // Navigator.of(AppGlobal.CONTEX).popUntil((ModalRoute.withName(LOGIN))); } + + static InputDecoration textFieldSelectorDecoration( + String hintText, String selectedText, bool isDropDown, + {Icon suffixIcon, Color dropDownColor}) { + return InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), + borderRadius: BorderRadius.circular(8), + ), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), + borderRadius: BorderRadius.circular(8), + ), + disabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), + borderRadius: BorderRadius.circular(8), + ), + hintText: selectedText != null ? selectedText : hintText, + suffixIcon: isDropDown + ? suffixIcon != null + ? suffixIcon + : Icon( + Icons.arrow_drop_down, + color: dropDownColor != null ? dropDownColor : Colors.black, + ) + : null, + hintStyle: TextStyle( + fontSize: 14, + color: Colors.grey.shade600, + ), + ); + } + + static BoxDecoration containerBorderDecoration( + Color containerColor, Color borderColor, {double borderWidth = -1}) { + return BoxDecoration( + color: containerColor, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(8)), + border: Border.fromBorderSide(BorderSide( + color: borderColor, + width: borderWidth == -1 ? 2.0 : borderWidth, + )), + ); + } } diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 46f8a249..aeba8212 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -316,6 +316,7 @@ class TranslationBase { String get admissionDetail => localizedValues['admissionDetail'][locale.languageCode]; String get dateTime => localizedValues['dateTime'][locale.languageCode]; + String get date => localizedValues['date'][locale.languageCode]; String get admissionNo => localizedValues['admissionNo'][locale.languageCode]; String get losNo => localizedValues['losNo'][locale.languageCode]; String get area => localizedValues['area'][locale.languageCode]; @@ -415,6 +416,28 @@ class TranslationBase { String get admission => localizedValues['admission'][locale.languageCode]; String get request => localizedValues['request'][locale.languageCode]; String get admissionRequest => localizedValues['admissionRequest'][locale.languageCode]; + String get patientDetails => localizedValues['patientDetails'][locale.languageCode]; + String get specialityAndDoctorDetail => localizedValues['specialityAndDoctorDetail'][locale.languageCode]; + String get referringDate => localizedValues['referringDate'][locale.languageCode]; + String get referringDoctor => localizedValues['referringDoctor'][locale.languageCode]; + String get otherInformation => localizedValues['otherInformation'][locale.languageCode]; + String get expectedDays => localizedValues['expectedDays'][locale.languageCode]; + String get expectedAdmissionDate => localizedValues['expectedAdmissionDate'][locale.languageCode]; + String get emergencyAdmission => localizedValues['emergencyAdmission'][locale.languageCode]; + String get patientPregnant => localizedValues['patientPregnant'][locale.languageCode]; + String get treatmentLine => localizedValues['treatmentLine'][locale.languageCode]; + String get ward => localizedValues['ward'][locale.languageCode]; + String get preAnesthesiaReferred => localizedValues['preAnesthesiaReferred'][locale.languageCode]; + String get admissionType => localizedValues['admissionType'][locale.languageCode]; + String get diagnosis => localizedValues['diagnosis'][locale.languageCode]; + String get allergies => localizedValues['allergies'][locale.languageCode]; + String get preOperativeOrders => localizedValues['preOperativeOrders'][locale.languageCode]; + String get elementForImprovement => localizedValues['elementForImprovement'][locale.languageCode]; + String get dischargeDate => localizedValues['dischargeDate'][locale.languageCode]; + String get dietType => localizedValues['dietType'][locale.languageCode]; + String get dietTypeRemarks => localizedValues['dietTypeRemarks'][locale.languageCode]; + String get save => localizedValues['save'][locale.languageCode]; + String get postPlansEstimatedCost => localizedValues['postPlansEstimatedCost'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From cb4ee05b409c0f8ce21cb4e609faaf99e400c160 Mon Sep 17 00:00:00 2001 From: mosazaid Date: Thu, 31 Dec 2020 17:52:32 +0200 Subject: [PATCH 05/18] working on ucaf --- lib/config/localized_values.dart | 1 + lib/core/service/patient-ucaf-service.dart | 5 ++++ .../viewModel/patient-ucaf-viewmodel.dart | 9 ++++++ lib/locator.dart | 4 +++ lib/routes.dart | 3 ++ .../profile/UCAF/UCAF-input-screen.dart | 28 +++++++++++++++++++ lib/util/translations_delegate_base.dart | 1 + .../profile/profile_medical_info_widget.dart | 9 ++++++ 8 files changed, 60 insertions(+) create mode 100644 lib/core/service/patient-ucaf-service.dart create mode 100644 lib/core/viewModel/patient-ucaf-viewmodel.dart create mode 100644 lib/screens/patients/profile/UCAF/UCAF-input-screen.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c84307a5..453cef8f 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -401,4 +401,5 @@ const Map> localizedValues = { 'dietTypeRemarks': {'en': "Remarks on diet type", 'ar': 'ملاحظات على نوع النظام الغذائي'}, 'save': {'en': "SAVE", 'ar': 'حفظ'}, 'postPlansEstimatedCost': {'en': "POST PLANS & ESTIMATED COST", 'ar': 'خطط البريد والتكلفة المقدرة'}, + 'ucaf': {'en': "UCAF", 'ar': 'UCAF'}, }; diff --git a/lib/core/service/patient-ucaf-service.dart b/lib/core/service/patient-ucaf-service.dart new file mode 100644 index 00000000..e776720c --- /dev/null +++ b/lib/core/service/patient-ucaf-service.dart @@ -0,0 +1,5 @@ +import 'package:doctor_app_flutter/core/service/base/base_service.dart'; + +class UcafService extends BaseService { + +} \ No newline at end of file diff --git a/lib/core/viewModel/patient-ucaf-viewmodel.dart b/lib/core/viewModel/patient-ucaf-viewmodel.dart new file mode 100644 index 00000000..cf11854b --- /dev/null +++ b/lib/core/viewModel/patient-ucaf-viewmodel.dart @@ -0,0 +1,9 @@ +import 'package:doctor_app_flutter/core/service/patient-ucaf-service.dart'; +import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; + +import '../../locator.dart'; + +class UcafViewModel extends BaseViewModel { + + UcafService _ucafService = locator(); +} \ No newline at end of file diff --git a/lib/locator.dart b/lib/locator.dart index 0b932a62..7225f1d9 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -14,6 +14,7 @@ import 'core/service/SOAP_service.dart'; import 'core/service/patient-admission-request-service.dart'; import 'core/service/doctor_reply_service.dart'; import 'core/service/medicine_service.dart'; +import 'core/service/patient-ucaf-service.dart'; import 'core/service/patient-vital-signs-service.dart'; import 'core/service/patient-doctor-referral-service.dart'; import 'core/service/referral_patient_service.dart'; @@ -23,6 +24,7 @@ import 'core/viewModel/SOAP_view_model.dart'; import 'core/viewModel/doctor_replay_view_model.dart'; import 'core/viewModel/medicine_view_model.dart'; import 'core/viewModel/patient-admission-request-viewmodel.dart'; +import 'core/viewModel/patient-ucaf-viewmodel.dart'; import 'core/viewModel/patient-vital-sign-viewmodel.dart'; import 'core/viewModel/patient-referral-viewmodel.dart'; import 'core/viewModel/referral_view_model.dart'; @@ -48,6 +50,7 @@ void setupLocator() { locator.registerLazySingleton(() => ProcedureService()); locator.registerLazySingleton(() => VitalSignsService()); locator.registerLazySingleton(() => AdmissionRequestService()); + locator.registerLazySingleton(() => UcafService()); /// View Model locator.registerFactory(() => DoctorReplayViewModel()); @@ -64,4 +67,5 @@ void setupLocator() { locator.registerFactory(() => ProcedureViewModel()); locator.registerFactory(() => VitalSignsViewModel()); locator.registerFactory(() => AdmissionRequestViewModel()); + locator.registerFactory(() => UcafViewModel()); } diff --git a/lib/routes.dart b/lib/routes.dart index ff03096f..a8def67f 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -1,5 +1,6 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/root_page.dart'; +import 'package:doctor_app_flutter/screens/patients/profile/UCAF/UCAF-input-screen.dart'; import 'package:doctor_app_flutter/screens/patients/profile/insurance_approvals_screen.dart'; import 'package:doctor_app_flutter/screens/patients/profile/patient_orders_screen.dart'; import 'package:doctor_app_flutter/screens/patients/profile/progress_note_screen.dart'; @@ -88,6 +89,7 @@ const String UPDATE_EPISODE = 'patients/create-episode'; const String PATIENT_ADMISSION_REQUEST = 'patients/admission-request'; const String PATIENT_ADMISSION_REQUEST_2 = 'patients/admission-request-second'; const String PATIENT_ADMISSION_REQUEST_3 = 'patients/admission-request-third'; +const String PATIENT_UCAF_REQUEST = 'patients/ucaf'; const String BODY_MEASUREMENTS = 'patients/body-measurements'; const String IN_PATIENT_PRESCRIPTIONS_DETAILS = 'patients/prescription-details'; @@ -149,4 +151,5 @@ var routes = { // LIVECARE_END_DIALOG: (_) => EndCallDialogBox() MY_REFERRAL_DETAIL: (_) => MyReferralDetailScreen(), + PATIENT_UCAF_REQUEST: (_) => UCAFInputScreen(), }; diff --git a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart new file mode 100644 index 00000000..f48fadb0 --- /dev/null +++ b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart @@ -0,0 +1,28 @@ +import 'package:doctor_app_flutter/core/viewModel/patient-ucaf-viewmodel.dart'; +import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; +import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:flutter/material.dart'; + +class UCAFInputScreen extends StatefulWidget { + @override + _UCAFInputScreenState createState() => _UCAFInputScreenState(); +} + +class _UCAFInputScreenState extends State { + @override + Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + PatiantInformtion patient = routeArgs['patient']; + final screenSize = MediaQuery.of(context).size; + + return BaseView( + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).ucaf, + body: Container(), + ), + ); + } +} diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 7e61362b..a67463a0 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -438,6 +438,7 @@ class TranslationBase { String get dietTypeRemarks => localizedValues['dietTypeRemarks'][locale.languageCode]; String get save => localizedValues['save'][locale.languageCode]; String get postPlansEstimatedCost => localizedValues['postPlansEstimatedCost'][locale.languageCode]; + String get ucaf => localizedValues['ucaf'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/patients/profile/profile_medical_info_widget.dart b/lib/widgets/patients/profile/profile_medical_info_widget.dart index 78334e5f..dd12e6cf 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget.dart @@ -137,6 +137,15 @@ class ProfileMedicalInfoWidget extends StatelessWidget { nameLine1: TranslationBase.of(context).patientSick, nameLine2: TranslationBase.of(context).leave, icon: 'sick_leaves_icons.png')), + Visibility( + visible: selectedPatientType != 0 && selectedPatientType != 5, + child: PatientProfileButton( + key: key, + patient: patient, + route: PATIENT_UCAF_REQUEST, + nameLine1: TranslationBase.of(context).patient, + nameLine2: TranslationBase.of(context).ucaf, + icon: 'lab.png')), ]); } } From 3c968f0de11e8428a5a67cc9d8dbfd4731229396 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 1 Jan 2021 09:59:00 +0300 Subject: [PATCH 06/18] doctor leave --- assets/fonts/DoctorApp.ttf | Bin 17812 -> 15928 bytes assets/images/leaves.svg | 7 + lib/config/config.dart | 9 +- lib/config/localized_values.dart | 4 + lib/core/service/sickleave_service.dart | 53 ++- .../viewModel/leave_rechdule_response.dart | 52 +++ lib/core/viewModel/patient_view_model.dart | 2 +- lib/core/viewModel/sick_leave_view_model.dart | 17 +- lib/icons_app/config.json | 41 +- lib/icons_app/doctor_app_icons.dart | 91 ++-- lib/screens/dashboard_screen.dart | 3 +- .../add-rescheduleleave.dart | 259 +++++++----- .../reschedule-leaves/reschedule_leave.dart | 395 +++++++++++++++--- lib/util/translations_delegate_base.dart | 6 + lib/widgets/shared/app_drawer_widget.dart | 39 +- 15 files changed, 730 insertions(+), 248 deletions(-) create mode 100644 assets/images/leaves.svg create mode 100644 lib/core/viewModel/leave_rechdule_response.dart diff --git a/assets/fonts/DoctorApp.ttf b/assets/fonts/DoctorApp.ttf index 21ce4a5dcc4d71ffbba5bd4b4b466b06d1b154c3..22539da0652f12c82f86a0652f0c69f2a8f697c8 100644 GIT binary patch delta 901 zcmYL_K}-`-5Qb-V+ikb)0^KbYTIfOxNCFgXVFLsUQKN}RK@);V*0Kmm3)mKg1j7wf zI3VR3v0o} za|{5k0>H(1Qk@xo`C}M>83bUPuO{ZlV~>~m0jyg9(d`LM9jkqCpM2OMDH8Z<{yTGHmu(8_3e?;bc=od|48EqDG|W6v1jRQ3wRcA)o^ zmU*ux8^CMWmR-X>RI=}IVUbg5l5QB3w31j-E6GAL3Z+p1FNm6#Tgf^~+ydsP3ffe! zm+Mu!PnY$e-l!{PCmnQ&NPtMgA))I33+Y}Mx@h+R+XKDXSImjL!MKo5{4J`@do1nP z7Nk}rpueLx915z*HXaImWR*jKKYPm>wXIkEuI{hi&A+x9;rwiOGn1d~yM&8Q!!Rb< zuj~bIf(vA*gAO2!BA zwPRBmQ|b1YoQ=pBz)E)+wqqD6t3<646+PIcVX=9f3{8ZdImQrtMsnN;! N^c0uS)azOr;14+9%>V!Z delta 2668 zcmZ`)X>1$E6`r@t-4&P1m6qi0iWEulUda+ki`PnFL@`ie_^f3$QWV#|iM-eh!mPHhcCLC> zqm2e3t7O%Qdq3T;J%D;WB!xek3WGi@gd??^%x1w$d?@2zQCM)`sYET{9G&s$UI|!| z@I(NeA`!f))nJQ=8`n^ahzHkji%1u)krojzuF)0|U+pZHwq14K@Z9#^@D+XMR({Sk z5><@Zm}fs>KTi}AB5CpjnIKP-c~T+IkZ+Qg$z}30@@sOPd`LbacL<4wcprpAyi3bN zDmM(77#GfFVlw!kB}xE2_Cp?2msWtL231U_atY`IYVOiFW{_q3{2S2x)Y?ZcNi~((n%rGcopmxLHq$=3roK8o6aw#cZN$66(%;@NSuy*^1M0 z&i-C^vqFJETb z(Zy6%ayX=ul2X6>cGF{1V@l~ns}p#1XQKt2MG<;#&UbE8&u>%B`j2+gJ)Qn#&>fxT zk??G8EianRTMrX+E9{Rk-bJapmTG;2-gjFW)3k42`g8+x`JIzA-6@(W?4F|g6U{L7 zn^QC{z6TyLzuI7O>Ha^dwp+<#Hcch8I6*V(R31U9BIW5Tp*c>7aa*I&1mq4xc$6f` zHZo53k)z}Sd7iw8P$XsovIR(Kx{DY56nA_$7>Xfcawe8nX8aUuY%rTiKu8AF`Tx}s zI906qMs3bWKmoeZh34Y>K;RRQGo!I=1|#|r(il-!*CQ6dl);bR0fLne8LDmy=~im$ z!xa(73o4!`AsaJf5Y#1)-%^|?TDm={!h$H&ZwO-Hb@22hLRN>NcPIV`Vq|#haAfxe zy>+#CF^*$h1AelfV?>#oJ0XaoaAKabi@?KpcR0T#AMWnY0GfSA5FzsoBgdG#%%R#+ zA}FO`T2A}=hKBn5soG14!1!AaSXr6O?x4PQWG5E`G*rC)w?`tw5gh0DaI(m7dqr8C zV8PmMIUY%d^I;sxNati~nwm|gCVvZqyK*%t>26ne%k%)x4@_HlWqW*lWhJwT`J9I3 zJYB{ZtEacG`xze~ItutNfCb^h z58x9;D~zH=DRlUDKqxf(nw~SWW;T;c2UD64%dhFV5#WN^AV8%B#?Fl&KdR=w~SW&dgi!Ptfb)au) zuJDmywF(_)+PWOpptCCm-2IQ(s3kp-3Bgd0UftB*-lz8rK`1kk29|?ZmosQ}bhUMQ zd%XjjpLJ>@Bbw7L-?}B&e`*y51_Ueo-BEHtxa26oOKaDJcU8Z(c29U&U&EVng!1)2 z*w5MZ#KNI%TKCxD%A_F$b(EaS7^BOlpXy8=95(k=O}i?|D!6Sy!{|umddve^#_MHr z`%TvSWi=61EWx;C@F`cwZQHq2?C2;i?X^cptSv$%gda>d5f7Ftr6c7Pc9?-Nxl*2;pP64MA1jxZXXdO&m*X>wv*q}JxLiJ1US2L8 pi4U~3w&huSOKGWee7?MJ+;Z&9!i+e(Tsl==o}XD + + + + + + diff --git a/lib/config/config.dart b/lib/config/config.dart index 7d39df7b..ef5898b3 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -4,8 +4,8 @@ const MAX_SMALL_SCREEN = 660; const ONLY_NUMBERS = "[0-9]"; const ONLY_LETTERS = "[a-zA-Z &'\"]"; const ONLY_DATE = "[0-9/]"; -const BASE_URL = 'https://hmgwebservices.com/'; -//const BASE_URL = 'https://uat.hmgwebservices.com/'; +//const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; const PHARMACY_ITEMS_URL = "Services/Lists.svc/REST/GetPharmcyItems_Region_enh"; const PHARMACY_LIST_URL = "Services/Patients.svc/REST/GetPharmcyList"; const PATIENT_PROGRESS_NOTE_URL = @@ -109,9 +109,10 @@ const GET_SICK_LEAVE = 'Services/DoctorApplication.svc/REST/GetAllSickLeaves'; const EXTEND_SICK_LEAVE = 'Services/DoctorApplication.svc/REST/ExtendSickLeave'; const GET_OFFTIME = 'Services/DoctorApplication.svc/REST/GetMasterLookUpList'; - +const GET_COVERING_DOCTORS = + 'Services/DoctorApplication.svc/REST/GetCoveringDoctor'; const GET_RESCHEDULE_LEAVE = - 'Services/DoctorApplication.svc/REST/GetAllSickLeaves'; + 'Services/DoctorApplication.svc/REST/GetRequisition'; const GET_PRESCRIPTION_LIST = 'Services/DoctorApplication.svc/REST/GetPrescription'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index f9a1fcd5..127ee975 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -386,4 +386,8 @@ const Map> localizedValues = { 'fio2': {'en': "FIO2(%)", 'ar': 'FIO2(%)'}, 'sao2': {'en': "SAO2(%)", 'ar': 'SAO2(%)'}, 'painManagement': {'en': "Pain Management", 'ar': 'إدارة الألم'}, + 'holiday': {'en': "Holiday", 'ar': 'يوم الاجازة'}, + 'to': {'en': "To", 'ar': 'إلى'}, + 'coveringDoctor': {'en': "Covering Doctor", 'ar': 'تغطية دكتور'}, + 'requestLeave': {'en': 'Request Leave', 'ar': 'طلب إجازة'} }; diff --git a/lib/core/service/sickleave_service.dart b/lib/core/service/sickleave_service.dart index 926187dd..cd0dbf50 100644 --- a/lib/core/service/sickleave_service.dart +++ b/lib/core/service/sickleave_service.dart @@ -1,5 +1,6 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/core/service/base/base_service.dart'; +import 'package:doctor_app_flutter/core/viewModel/leave_rechdule_response.dart'; import 'package:doctor_app_flutter/models/sickleave/add_sickleave_request.dart'; import 'package:doctor_app_flutter/models/sickleave/extend_sick_leave_request.dart'; import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; @@ -8,11 +9,18 @@ import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.d class SickLeaveService extends BaseService { Map get sickLeavestatisitics => _statistics; Map _statistics = {}; - var offTime = []; - - get getOffTimeList => offTime; + List get getOffTimeList => offTime; + List offTime = []; + List get getReasons => reasonse; + List reasonse = []; List get getAllSickLeave => _getAllsickLeave; List _getAllsickLeave = []; + List get coveringDoctorsList => _coveringDoctors; + List _coveringDoctors = []; + + List get getAllRescheduleLeave => + _getReScheduleLeave; + List _getReScheduleLeave = []; Future getStatistics(appoNo, patientMRN) async { hasError = false; await baseAppClient.post( @@ -38,7 +46,7 @@ class SickLeaveService extends BaseService { ADD_SICK_LEAVE, onSuccess: (dynamic response, int statusCode) { Future.value(response); - print(response); + //print(response); // _statistics = {}; // _statistics = response['SickLeaveStatistics']; }, @@ -99,16 +107,16 @@ class SickLeaveService extends BaseService { GET_RESCHEDULE_LEAVE, onSuccess: (dynamic response, int statusCode) { Future.value(response); - _getAllsickLeave.clear(); - // response['SickLeavesList']['entityList'].forEach((v) { - // _getAllsickLeave.add(GetAllSickLeaveResponse.fromJson(v)); - // }); + _getReScheduleLeave.clear(); + response['requisitionList']['entityList'].forEach((v) { + _getReScheduleLeave.add(GetRescheduleLeavesResponse.fromJson(v)); + }); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, - body: {'PatientMRN': 3120772}, + body: {'ClinicID': 1}, ); } @@ -119,7 +127,7 @@ class SickLeaveService extends BaseService { GET_OFFTIME, onSuccess: (dynamic response, int statusCode) { offTime = []; - offTime = response[' ']; + offTime = response['MasterLookUpList']['entityList']; }, onFailure: (String error, int statusCode) { hasError = true; @@ -129,20 +137,37 @@ class SickLeaveService extends BaseService { ); } - Future getReasons(id) async { + Future getReasonsByID({id}) async { hasError = false; await baseAppClient.post( GET_OFFTIME, onSuccess: (dynamic response, int statusCode) { - offTime = []; - offTime = response[' ']; + reasonse = []; + reasonse = response['MasterLookUpList']['entityList']; + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: {"MasterInput": id ?? 18}, + ); + } + + Future getCoveringDoctors() async { + hasError = false; + + await baseAppClient.post( + GET_COVERING_DOCTORS, + onSuccess: (dynamic response, int statusCode) { + _coveringDoctors = []; + _coveringDoctors = response['coveringDoctorList']['entityList']; }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, - body: {"MasterInput": id}, + body: {"ClinicID": 1}, ); } } diff --git a/lib/core/viewModel/leave_rechdule_response.dart b/lib/core/viewModel/leave_rechdule_response.dart new file mode 100644 index 00000000..d7cab8bf --- /dev/null +++ b/lib/core/viewModel/leave_rechdule_response.dart @@ -0,0 +1,52 @@ +class GetRescheduleLeavesResponse { + int clinicId; + var coveringDoctorId; + String date; + String dateTimeFrom; + String dateTimeTo; + int doctorId; + int reasonId; + int requisitionNo; + int requisitionType; + int status; + + GetRescheduleLeavesResponse( + {this.clinicId, + this.coveringDoctorId, + this.date, + this.dateTimeFrom, + this.dateTimeTo, + this.doctorId, + this.reasonId, + this.requisitionNo, + this.requisitionType, + this.status}); + + GetRescheduleLeavesResponse.fromJson(Map json) { + clinicId = json['clinicId']; + coveringDoctorId = json['coveringDoctorId']; + date = json['date']; + dateTimeFrom = json['dateTimeFrom']; + dateTimeTo = json['dateTimeTo']; + doctorId = json['doctorId']; + reasonId = json['reasonId']; + requisitionNo = json['requisitionNo']; + requisitionType = json['requisitionType']; + status = json['status']; + } + + Map toJson() { + final Map data = new Map(); + data['clinicId'] = this.clinicId; + data['coveringDoctorId'] = this.coveringDoctorId; + data['date'] = this.date; + data['dateTimeFrom'] = this.dateTimeFrom; + data['dateTimeTo'] = this.dateTimeTo; + data['doctorId'] = this.doctorId; + data['reasonId'] = this.reasonId; + data['requisitionNo'] = this.requisitionNo; + data['requisitionType'] = this.requisitionType; + data['status'] = this.status; + return data; + } +} diff --git a/lib/core/viewModel/patient_view_model.dart b/lib/core/viewModel/patient_view_model.dart index 9672da83..2fcdc779 100644 --- a/lib/core/viewModel/patient_view_model.dart +++ b/lib/core/viewModel/patient_view_model.dart @@ -49,7 +49,7 @@ class PatientViewModel extends BaseViewModel { List get referralFrequencyList => _patientService.referalFrequancyList; - Future getPatientList( patient, patientType, + Future getPatientList(patient, patientType, {bool isBusyLocal = false}) async { if (isBusyLocal) { setState(ViewState.BusyLocal); diff --git a/lib/core/viewModel/sick_leave_view_model.dart b/lib/core/viewModel/sick_leave_view_model.dart index 2e07d3b0..7c162ad1 100644 --- a/lib/core/viewModel/sick_leave_view_model.dart +++ b/lib/core/viewModel/sick_leave_view_model.dart @@ -12,7 +12,10 @@ class SickLeaveViewModel extends BaseViewModel { SickLeaveService _sickLeaveService = locator(); get sickLeaveStatistics => _sickLeaveService.sickLeavestatisitics; get getAllSIckLeave => _sickLeaveService.getAllSickLeave; - get allOffTime => _sickLeaveService.getOffTimeList; + List get allOffTime => _sickLeaveService.getOffTimeList; + List get allReasons => _sickLeaveService.getReasons; + List get coveringDoctors => _sickLeaveService.coveringDoctorsList; + get getReschduleLeave => _sickLeaveService.getAllRescheduleLeave; Future addSickLeave(AddSickLeaveRequest addSickLeaveRequest) async { setState(ViewState.Busy); await _sickLeaveService.addSickLeave(addSickLeaveRequest); @@ -75,7 +78,17 @@ class SickLeaveViewModel extends BaseViewModel { Future getReasons(id) async { setState(ViewState.Busy); - await _sickLeaveService.getReasons(id); + await _sickLeaveService.getReasonsByID(id: id); + if (_sickLeaveService.hasError) { + error = _sickLeaveService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } + + Future getCoveringDoctors() async { + setState(ViewState.Busy); + await _sickLeaveService.getCoveringDoctors(); if (_sickLeaveService.hasError) { error = _sickLeaveService.error; setState(ViewState.Error); diff --git a/lib/icons_app/config.json b/lib/icons_app/config.json index fef927b0..ede09595 100644 --- a/lib/icons_app/config.json +++ b/lib/icons_app/config.json @@ -384,6 +384,34 @@ "sync" ] }, + { + "uid": "a0f7dbb184f90f285a9cba8cf09a9b6a", + "css": "drawer_icon", + "code": 59429, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1564.7 1000H68C30.6 1000 0 958.7 0 908.2H0C0 857.6 30.6 816.3 68 816.3H1564.7C1602 816.3 1632.7 857.6 1632.7 908.2H1632.7C1632.7 958.7 1602 1000 1564.7 1000ZM911.6 591.8H68C30.6 591.8 0 550.5 0 500H0C0 449.5 30.6 408.2 68 408.2H911.6C949 408.2 979.6 449.5 979.6 500H979.6C979.6 550.5 949 591.8 911.6 591.8ZM1238.1 183.7H68C30.6 183.7 0 142.4 0 91.8H0C0 41.3 30.6 0 68 0H1238.1C1275.5 0 1306.1 41.3 1306.1 91.8H1306.1C1306.1 142.4 1275.5 183.7 1238.1 183.7Z", + "width": 1633 + }, + "search": [ + "drawer_icon" + ] + }, + { + "uid": "764baf138776221a3e1e845391b188a4", + "css": "leaves", + "code": 59446, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M968.7 468.7H572.9A31.3 31.3 0 1 1 572.9 406.2H968.7A31.3 31.3 0 1 1 968.7 468.7ZM968.7 468.7M812.5 625A31.3 31.3 0 0 1 790.4 571.6L924.5 437.5 790.4 303.3A31.3 31.3 0 0 1 834.6 259.1L990.9 415.4A31.3 31.3 0 0 1 990.9 459.6L834.6 615.8A31.2 31.2 0 0 1 812.5 625ZM812.5 625M333.3 1000A83.3 83.3 0 0 0 416.7 916.7V166.7A83.9 83.9 0 0 0 360.3 87.5L109.9 4.1A84.2 84.2 0 0 0 0 83.4V833.4A83.9 83.9 0 0 0 56.4 912.4L306.8 995.8A87.2 87.2 0 0 0 333.3 1000ZM83.3 62.5A24.5 24.5 0 0 1 90.8 63.6L340.1 146.7A21.4 21.4 0 0 1 354.2 166.6V916.6A22 22 0 0 1 325.9 936.4L76.6 853.3A21.5 21.5 0 0 1 62.5 833.3V83.3A20.9 20.9 0 0 1 83.3 62.5ZM83.3 62.5M635.4 208.3A31.3 31.3 0 0 0 666.7 177.1V114.6A114.7 114.7 0 0 0 552.1 0H83.3A31.3 31.3 0 0 0 83.3 62.5H552.1A52.1 52.1 0 0 1 604.2 114.6V177.1A31.3 31.3 0 0 0 635.4 208.3ZM635.4 208.3M385.4 875H552.1A114.7 114.7 0 0 0 666.6 760.4V697.9A31.3 31.3 0 0 0 604.1 697.9V760.4A52.1 52.1 0 0 1 552.1 812.5H385.4A31.3 31.3 0 0 0 385.4 875ZM385.4 875", + "width": 1000 + }, + "search": [ + "leaves" + ] + }, { "uid": "740f78c2b53c8cc100a8b0d283bbd34f", "css": "home_icon-1", @@ -481,19 +509,6 @@ "search": [ "scdedule_icon_active" ] - }, { - "uid": "a0f7dbb184f90f285a9cba8cf09a9b6a", - "css": "drawer_icon", - "code": 59429, - "src": "custom_icons", - "selected": true, - "svg": { - "path": "M1564.7 1000H68C30.6 1000 0 958.7 0 908.2H0C0 857.6 30.6 816.3 68 816.3H1564.7C1602 816.3 1632.7 857.6 1632.7 908.2H1632.7C1632.7 958.7 1602 1000 1564.7 1000ZM911.6 591.8H68C30.6 591.8 0 550.5 0 500H0C0 449.5 30.6 408.2 68 408.2H911.6C949 408.2 979.6 449.5 979.6 500H979.6C979.6 550.5 949 591.8 911.6 591.8ZM1238.1 183.7H68C30.6 183.7 0 142.4 0 91.8H0C0 41.3 30.6 0 68 0H1238.1C1275.5 0 1306.1 41.3 1306.1 91.8H1306.1C1306.1 142.4 1275.5 183.7 1238.1 183.7Z", - "width": 1633 - }, - "search": [ - "drawer_icon" - ] } ] } \ No newline at end of file diff --git a/lib/icons_app/doctor_app_icons.dart b/lib/icons_app/doctor_app_icons.dart index 80db55c1..ef01c934 100644 --- a/lib/icons_app/doctor_app_icons.dart +++ b/lib/icons_app/doctor_app_icons.dart @@ -11,7 +11,7 @@ /// fonts: /// - asset: fonts/DoctorApp.ttf /// -/// +/// /// import 'package:flutter/widgets.dart'; @@ -19,35 +19,64 @@ class DoctorApp { DoctorApp._(); static const _kFontFam = 'DoctorApp'; - static const _kFontPkg = null; - - static const IconData female_icon = IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData male = IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData reject_icon = IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData home_icon_active = IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData menu_icon = IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData menu_icon_active = IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData message_icon = IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData message_icon_active = IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData scdedule_icon_active = IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData schedule_icon = IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData discharge_patient = IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData approved_icon = IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData pending_icon = IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData in_patient_white = IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData lab_results = IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData home_icon = IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData operations = IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData out_patient = IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData patient = IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData radiology = IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData mail = IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData medicine_search = IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData qr_code = IconData(0xe820, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData referral = IconData(0xe821, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData referred = IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData search_patient = IconData(0xe823, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData sync_icon = IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg); - static const IconData drawer_icon = IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const String _kFontPkg = null; + static const IconData female_icon = + IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData male = + IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData reject_icon = + IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_icon_active = + IconData(0xe803, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData menu_icon = + IconData(0xe804, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData menu_icon_active = + IconData(0xe805, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData message_icon = + IconData(0xe806, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData message_icon_active = + IconData(0xe807, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData scdedule_icon_active = + IconData(0xe808, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData schedule_icon = + IconData(0xe809, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData discharge_patient = + IconData(0xe80a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData approved_icon = + IconData(0xe80b, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData pending_icon = + IconData(0xe80c, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData in_patient_white = + IconData(0xe80d, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData lab_results = + IconData(0xe80e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData home_icon = + IconData(0xe80f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData operations = + IconData(0xe813, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData out_patient = + IconData(0xe814, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData patient = + IconData(0xe815, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData qr_code = + IconData(0xe816, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData radiology = + IconData(0xe817, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referral = + IconData(0xe818, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData search_patient = + IconData(0xe81a, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData mail = + IconData(0xe81e, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData medicine_search = + IconData(0xe81f, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData referred = + IconData(0xe822, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData sync_icon = + IconData(0xe824, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData drawer_icon = + IconData(0xe825, fontFamily: _kFontFam, fontPackage: _kFontPkg); + static const IconData leaves = + IconData(0xe836, fontFamily: _kFontFam, fontPackage: _kFontPkg); } diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index 948c41f5..292cd585 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -964,9 +964,8 @@ class _DashboardScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Icon( - Icons.rule_folder, + DoctorApp.leaves, size: 50, - color: Colors.black, ), AppText( TranslationBase.of(context).rescheduleLeaves, diff --git a/lib/screens/reschedule-leaves/add-rescheduleleave.dart b/lib/screens/reschedule-leaves/add-rescheduleleave.dart index 8963f306..79b47523 100644 --- a/lib/screens/reschedule-leaves/add-rescheduleleave.dart +++ b/lib/screens/reschedule-leaves/add-rescheduleleave.dart @@ -1,4 +1,6 @@ +import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/viewModel/leave_rechdule_response.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; @@ -8,6 +10,7 @@ import 'package:doctor_app_flutter/screens/reschedule-leaves/reschedule_leave.da import 'package:doctor_app_flutter/screens/sick-leave/sick_leave.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/card_with_bgNew_widget.dart'; import 'package:flutter/material.dart'; @@ -17,119 +20,179 @@ class AddRescheduleLeavScreen extends StatelessWidget { @override Widget build(BuildContext context) { return BaseView( - onModelReady: (model) => model.getRescheduleLeave(), + onModelReady: (model) => + {model.getRescheduleLeave(), model.getCoveringDoctors()}, builder: (_, model, w) => AppScaffold( baseViewModel: model, appBarTitle: TranslationBase.of(context).rescheduleLeaves, - body: model.getAllSIckLeave.length > 0 + body: model.getReschduleLeave.length > 0 ? SingleChildScrollView( child: Column( - children: model.getAllSIckLeave - .map((GetAllSickLeaveResponse item) { - return CardWithBgWidgetNew( - widget: Column( - children: [ - Container( - padding: EdgeInsets.only(left: 10, right: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 4, - child: Wrap( - // mainAxisAlignment: - // MainAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, + children: [ + Container( + margin: + EdgeInsets.only(left: 15, right: 15, top: 20), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppTextFormField( + hintText: + TranslationBase.of(context).requestLeave, + borderColor: Colors.white, + prefix: IconButton( + icon: Icon( + Icons.add_circle, + color: Colors.red, + )), + textInputType: TextInputType.text, + onTap: () { + openLeave( + context, + false, + ); + }, + inputFormatter: ONLY_LETTERS, + ) + ], + ), + ), + Column( + children: model.getReschduleLeave.map( + (GetRescheduleLeavesResponse item) { + return CardWithBgWidgetNew( + widget: Column( + children: [ + Container( + padding: + EdgeInsets.only(left: 10, right: 10), + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, + children: [ + Expanded( + flex: 4, + child: Wrap( children: [ - Container( - padding: EdgeInsets.all(3), - child: AppText( - item.status == 1 - ? TranslationBase.of( - context) - .approved - : item.status == 2 + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + padding: + EdgeInsets.all(3), + child: AppText( + item.status == 1 ? TranslationBase .of(context) - .extended - : TranslationBase - .of(context) - .pending, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - color: item.status == 1 - ? Colors.green - : Colors.yellow[800], - ), - Row( - children: [ - AppText( + .approved + : item.status == 2 + ? TranslationBase.of( + context) + .pending + : TranslationBase.of( + context) + .rejected, + fontWeight: + FontWeight.bold, + color: Colors.white, + ), + color: item.status == 1 + ? Colors.green + : item.status == 2 + ? Colors + .yellow[800] + : Colors.red[800], + ), + SizedBox( + height: 5, + ), + Container( + child: AppText( TranslationBase.of( context) - .leaveStartDate + + .holiday + ' ', fontWeight: FontWeight.bold, + )), + Row( + children: [ + Flexible( + child: Text( + item.dateTimeFrom + + ' ' + + TranslationBase.of( + context) + .to + + ' ' + + item.dateTimeTo, + // overflow: + // TextOverflow.ellipsis, + )) + ], ), - Flexible( - child: Text( - item.startDate, - overflow: - TextOverflow.ellipsis, - )) - ], - ), - AppText( - item.noOfDays.toString() + - ' ' + + SizedBox( + height: 5, + ), + AppText( TranslationBase.of( context) - .daysSickleave, - fontWeight: FontWeight.bold, + .coveringDoctor, + fontWeight: + FontWeight.bold, + ), + model.coveringDoctors + .length > + 0 + ? Row(children: [ + AppText(getDoctor( + model + .coveringDoctors, + item.doctorId)) + ]) + : SizedBox(), + ], + ), + SizedBox( + width: 10, ), - Row(children: [ - AppText( - item.remarks, - ) - ]), ], ), - SizedBox( - width: 20, - ), - ], - ), - ), - (item.status == 1 || item.status == 2) - ? Expanded( - flex: 1, - child: IconButton( - icon: Icon( - Icons.open_in_full, - size: 40, - ), - // color: Colors.green, //Colors.black, - onPressed: () => { - // openSickLeave(context, true, - // extendedData: item) - }, - )) - : SizedBox(), - ], - )), - SizedBox( - height: 20, - ), - Divider( - height: 1, - ), - ], - )); - }).toList(), + ), + (item.status == 1) + ? Expanded( + flex: 1, + child: IconButton( + icon: Icon( + Icons.edit_outlined, + size: 30, + ), + // color: Colors.green, //Colors.black, + onPressed: () => { + // openSickLeave(context, true, + // extendedData: item) + }, + )) + : SizedBox(), + ], + )), + SizedBox( + height: 10, + ), + Divider( + height: 1, + ), + ], + )); + }).toList(), + ) + ], ), ) : new Builder(builder: (context) { @@ -190,4 +253,12 @@ class AddRescheduleLeavScreen extends StatelessWidget { )); }); } + + getDoctor(model, doctorId) { + var obj; + obj = model.where((i) => i['doctorID'] == doctorId).toList(); + print(obj); + + return obj.length > 0 ? obj[0]['doctorName'] : ""; + } } diff --git a/lib/screens/reschedule-leaves/reschedule_leave.dart b/lib/screens/reschedule-leaves/reschedule_leave.dart index 6de0779e..9ed6dae7 100644 --- a/lib/screens/reschedule-leaves/reschedule_leave.dart +++ b/lib/screens/reschedule-leaves/reschedule_leave.dart @@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:doctor_app_flutter/models/sickleave/add_sickleave_request.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; @@ -20,6 +21,7 @@ import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:intl/intl.dart'; import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; +import 'package:provider/provider.dart'; Helpers helpers = Helpers(); @@ -32,6 +34,7 @@ class RescheduleLeaveScreen extends StatefulWidget { class _RescheduleLeaveScreen extends State { DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); TextEditingController _toDateController = new TextEditingController(); + ProjectViewModel projectsProvider; String _selectedClinic; Map profile = {}; AddSickLeaveRequest addSickLeave = AddSickLeaveRequest(); @@ -59,17 +62,23 @@ class _RescheduleLeaveScreen extends State { @override void initState() { getProfile(); + super.initState(); } @override Widget build(BuildContext context) { + projectsProvider = Provider.of(context); return BaseView( onModelReady: (model) => model.getClinicsList(), builder: (_, model, w) => BaseView( - onModelReady: (model2) => model2.getOffTime(), + onModelReady: (model2) => { + model2.getOffTime(), + model2.getReasons(18), + model2.getCoveringDoctors() + }, builder: (_, model2, w) => AppScaffold( - baseViewModel: model, + baseViewModel: model2, isShowAppBar: false, body: Center( child: Container( @@ -79,8 +88,7 @@ class _RescheduleLeaveScreen extends State { child: ListView( children: [ Container( - margin: EdgeInsets.only( - top: 10, left: 10, right: 10), + margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(6.0)), @@ -98,10 +106,6 @@ class _RescheduleLeaveScreen extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ - // AppText( - // TranslationBase.of(context).clinicName, - // fontSize: 10, - // ), Row( mainAxisSize: MainAxisSize.max, children: [ @@ -163,11 +167,9 @@ class _RescheduleLeaveScreen extends State { ], ), )), - SizedBox( - height: 10, - ), + Container( - margin: EdgeInsets.only(left: 10, right: 10), + margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(6.0)), @@ -181,7 +183,9 @@ class _RescheduleLeaveScreen extends State { ignoring: true, child: AppTextFormField( readOnly: true, - hintText: profile['DoctorName'], + hintText: profile != null + ? profile['DoctorName'] + : "", borderColor: Colors.white, onSaved: (value) {}, inputFormatter: ONLY_NUMBERS)) @@ -190,8 +194,7 @@ class _RescheduleLeaveScreen extends State { ), Container( - margin: EdgeInsets.only( - top: 10, left: 10, right: 10), + margin: EdgeInsets.all(8), decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(6.0)), @@ -212,65 +215,319 @@ class _RescheduleLeaveScreen extends State { Row( mainAxisSize: MainAxisSize.max, children: [ - Expanded( - // add Expanded to have your dropdown button fill remaining space - child: DropdownButtonHideUnderline( - child: new IgnorePointer( - ignoring: true, - child: DropdownButton( - focusColor: Colors.grey, - isExpanded: true, - value: getClinicName( - model) ?? - "", - iconSize: 40, - elevation: 16, - selectedItemBuilder: - (BuildContext - context) { - return model - .getClinicNameList() - .map((item) { - return Row( - mainAxisSize: - MainAxisSize - .max, - children: [ - AppText( - item, - fontSize: SizeConfig - .textMultiplier * - 2.1, - color: - Colors.grey, - ), - ], - ); - }).toList(); - }, - onChanged: (newValue) => - {}, - items: model - .getClinicNameList() + model2.allOffTime.length > 0 + ? Expanded( + // add Expanded to have your dropdown button fill remaining space + child: + DropdownButtonHideUnderline( + child: DropdownButton( + focusColor: Colors.grey, + isExpanded: true, + value: model2.allOffTime[0] + ['code'], + iconSize: 40, + elevation: 16, + selectedItemBuilder: + (BuildContext context) { + return model2.allOffTime .map((item) { - return DropdownMenuItem( - value: - item.toString(), - child: Text( - item, - textAlign: - TextAlign.end, - ), + return Row( + mainAxisSize: + MainAxisSize.max, + children: [ + AppText( + item[ + 'description'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + color: + Colors.grey, + ), + ], ); - }).toList(), - ))), - ), + }).toList(); + }, + onChanged: (newValue) => {}, + items: model2.allOffTime + .map((item) { + return DropdownMenuItem< + String>( + value: item['code'] + .toString(), + child: Text( + item['description'], + textAlign: + TextAlign.end, + ), + ); + }).toList(), + )), + ) + : SizedBox(), + ], + ) + ], + ), + )), + Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppTextFormField( + hintText: TranslationBase.of(context) + .fromDate, + borderColor: Colors.white, + prefix: IconButton( + icon: Icon(Icons.calendar_today)), + textInputType: TextInputType.number, + controller: _toDateController, + onTap: () { + _presentDatePicker('_selectedToDate'); + }, + inputFormatter: ONLY_DATE, + onChanged: (value) { + addSickLeave.startDate = value; + }), + ], + )), + + Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + new AppTextFormField( + readOnly: true, + hintText: "", + borderColor: Colors.white, + onSaved: (value) {}, + inputFormatter: ONLY_NUMBERS), + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + new AppTextFormField( + readOnly: true, + hintText: "", + borderColor: Colors.white, + onSaved: (value) {}, + inputFormatter: ONLY_NUMBERS), + ], + ), + ), + ) + ], + ), + Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + width: double.infinity, + child: Padding( + padding: EdgeInsets.only( + top: SizeConfig.widthMultiplier * 0.9, + bottom: SizeConfig.widthMultiplier * 0.9, + right: SizeConfig.widthMultiplier * 3, + left: SizeConfig.widthMultiplier * 3), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + model2.allReasons.length > 0 + ? Expanded( + // add Expanded to have your dropdown button fill remaining space + child: + DropdownButtonHideUnderline( + child: DropdownButton( + focusColor: Colors.grey, + isExpanded: true, + value: model2.allReasons[0] + ['id'] + .toString(), + iconSize: 40, + elevation: 16, + selectedItemBuilder: + (BuildContext context) { + return model2.allReasons + .map((item) { + return Row( + mainAxisSize: + MainAxisSize.max, + children: [ + AppText( + projectsProvider + .isArabic + ? item[ + 'nameAr'] + : item[ + 'nameEn'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + color: + Colors.grey, + ), + ], + ); + }).toList(); + }, + onChanged: (newValue) => {}, + items: model2.allReasons + .map((item) { + return DropdownMenuItem< + String>( + value: item['id'] + .toString(), + child: Text( + projectsProvider + .isArabic + ? item['nameAr'] + : item['nameEn'], + textAlign: + TextAlign.end, + ), + ); + }).toList(), + )), + ) + : SizedBox(), ], ) ], ), )), + Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + width: double.infinity, + child: Padding( + padding: EdgeInsets.only( + top: SizeConfig.widthMultiplier * 0.9, + bottom: SizeConfig.widthMultiplier * 0.9, + right: SizeConfig.widthMultiplier * 3, + left: SizeConfig.widthMultiplier * 3), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + mainAxisSize: MainAxisSize.max, + children: [ + model2.coveringDoctors.length > 0 + ? Expanded( + // add Expanded to have your dropdown button fill remaining space + child: + DropdownButtonHideUnderline( + child: DropdownButton( + focusColor: Colors.grey, + isExpanded: true, + value: model2 + .coveringDoctors[0] + ['doctorID'] + .toString(), + iconSize: 40, + elevation: 16, + selectedItemBuilder: + (BuildContext context) { + return model2 + .coveringDoctors + .map((item) { + return Row( + mainAxisSize: + MainAxisSize.max, + children: [ + AppText( + projectsProvider + .isArabic + ? item[ + 'doctorNameN'] + : item[ + 'doctorName'], + fontSize: SizeConfig + .textMultiplier * + 2.1, + color: + Colors.grey, + ), + ], + ); + }).toList(); + }, + onChanged: (newValue) => {}, + items: model2 + .coveringDoctors + .map((item) { + return DropdownMenuItem< + String>( + value: item['doctorID'] + .toString(), + child: Text( + projectsProvider + .isArabic + ? item[ + 'doctorNameN'] + : item[ + 'doctorName'], + textAlign: + TextAlign.start, + ), + ); + }).toList(), + )), + ) + : SizedBox(), + ], + ) + ], + ), + )), Container( margin: EdgeInsets.all( SizeConfig.widthMultiplier * 5), @@ -307,9 +564,9 @@ class _RescheduleLeaveScreen extends State { } getClinicName(model) { - var clinicInfo = model.clinicsList - .where((i) => i['ClinicID'] == this.profile['ClinicID']) - .toList(); + var clinicID = this.profile != null ? this.profile['ClinicID'] : 1; + var clinicInfo = + model.clinicsList.where((i) => i['ClinicID'] == clinicID).toList(); return clinicInfo.length > 0 ? clinicInfo[0]['ClinicDescription'] : ""; } } diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index ed6b49e8..6126912e 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -424,6 +424,12 @@ class TranslationBase { String get sao2 => localizedValues['sao2'][locale.languageCode]; String get painManagement => localizedValues['painManagement'][locale.languageCode]; + String get holiday => localizedValues['holiday'][locale.languageCode]; + String get to => localizedValues['to'][locale.languageCode]; + String get coveringDoctor => + localizedValues['coveringDoctor'][locale.languageCode]; + String get requestLeave => + localizedValues['requestLeave'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/shared/app_drawer_widget.dart b/lib/widgets/shared/app_drawer_widget.dart index 4ff72904..808e09dc 100644 --- a/lib/widgets/shared/app_drawer_widget.dart +++ b/lib/widgets/shared/app_drawer_widget.dart @@ -35,9 +35,6 @@ class _AppDrawerState extends State { // _isInit = false; // } - - - @override Widget build(BuildContext context) { AuthViewModel authProvider = Provider.of(context); @@ -68,20 +65,24 @@ class _AppDrawerState extends State { ), ), SizedBox(height: 15), - CircleAvatar( - radius: SizeConfig.imageSizeMultiplier * 12, - backgroundImage: - NetworkImage(authProvider.doctorProfile.doctorImageURL), - backgroundColor: Colors.white, - ), - Padding( - padding: EdgeInsets.only(top: 10), - child: AppText( - authProvider.doctorProfile?.doctorName, - fontWeight: FontWeight.bold, - color: Colors.black, - fontSize: SizeConfig.textMultiplier * 2, - )), + authProvider.doctorProfile != null + ? CircleAvatar( + radius: SizeConfig.imageSizeMultiplier * 12, + backgroundImage: NetworkImage( + authProvider.doctorProfile.doctorImageURL), + backgroundColor: Colors.white, + ) + : SizedBox(), + authProvider.doctorProfile != null + ? Padding( + padding: EdgeInsets.only(top: 10), + child: AppText( + authProvider.doctorProfile?.doctorName, + fontWeight: FontWeight.bold, + color: Colors.black, + fontSize: SizeConfig.textMultiplier * 2, + )) + : SizedBox(), AppText( "Director of medical records", //TODO: Make The Dr Title Dynamic and check overflow issue. fontWeight: FontWeight.normal, @@ -121,7 +122,9 @@ class _AppDrawerState extends State { ), InkWell( child: DrawerItem( - TranslationBase.of(context).qr+ TranslationBase.of(context).reader, DoctorApp.qr_code), + TranslationBase.of(context).qr + + TranslationBase.of(context).reader, + DoctorApp.qr_code), onTap: () { Navigator.pop(context); Navigator.of(context).pushNamed(QR_READER); From 3cadd532d8cd61f21126fd9c813ac05634360e3f Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Fri, 1 Jan 2021 16:38:59 +0200 Subject: [PATCH 07/18] finish Updating --- lib/core/service/SOAP_service.dart | 12 +- lib/core/viewModel/SOAP_view_model.dart | 37 +-- lib/models/SOAP/GetAssessmentReqModel.dart | 40 +++ lib/models/SOAP/GetAssessmentResModel.dart | 72 +++++ .../subjective/update_subjective_page.dart | 73 ++--- .../soap_update/update_assessment_page.dart | 296 +++++++++++------- .../soap_update/update_objective_page.dart | 9 +- 7 files changed, 341 insertions(+), 198 deletions(-) create mode 100644 lib/models/SOAP/GetAssessmentReqModel.dart create mode 100644 lib/models/SOAP/GetAssessmentResModel.dart diff --git a/lib/core/service/SOAP_service.dart b/lib/core/service/SOAP_service.dart index 09530d50..426e0811 100644 --- a/lib/core/service/SOAP_service.dart +++ b/lib/core/service/SOAP_service.dart @@ -3,6 +3,8 @@ import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintR import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GeneralGetReqForSOAP.dart'; import 'package:doctor_app_flutter/models/SOAP/GetAllergiesResModel.dart'; +import 'package:doctor_app_flutter/models/SOAP/GetAssessmentReqModel.dart'; +import 'package:doctor_app_flutter/models/SOAP/GetAssessmentResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetGetProgressNoteReqModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetGetProgressNoteResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetHistoryReqModel.dart'; @@ -27,6 +29,7 @@ class SOAPService extends LookupService { List patientHistoryList = []; List patientPhysicalExamList = []; List patientProgressNoteList = []; + List patientAssessmentList = []; Future getAllergies(GetAllergiesRequestModel getAllergiesRequestModel) async { await baseAppClient.post( @@ -266,6 +269,7 @@ class SOAPService extends LookupService { response['ProgressNoteList']['entityList'].forEach((v) { patientProgressNoteList.add(GetGetProgressNoteResModel.fromJson(v)); }); + }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; @@ -273,14 +277,18 @@ class SOAPService extends LookupService { } Future getPatientAssessment( - PostAssessmentRequestModel getPatientAssessmentRequestModel) async { + GetAssessmentReqModel getAssessmentReqModel) async { hasError = false; await baseAppClient.post (GET_ASSESSMENT, onSuccess: (dynamic response, int statusCode) { print("Success"); + patientAssessmentList.clear(); + response['AssessmentList']['entityList'].forEach((v) { + patientAssessmentList.add(GetAssessmentResModel.fromJson(v)); + }); }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; - }, body: getPatientAssessmentRequestModel.toJson()); + }, body: getAssessmentReqModel.toJson()); } } diff --git a/lib/core/viewModel/SOAP_view_model.dart b/lib/core/viewModel/SOAP_view_model.dart index 8d03a04e..697e9934 100644 --- a/lib/core/viewModel/SOAP_view_model.dart +++ b/lib/core/viewModel/SOAP_view_model.dart @@ -5,6 +5,8 @@ import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintR import 'package:doctor_app_flutter/models/SOAP/ChiefComplaint/GetChiefComplaintResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GeneralGetReqForSOAP.dart'; import 'package:doctor_app_flutter/models/SOAP/GetAllergiesResModel.dart'; +import 'package:doctor_app_flutter/models/SOAP/GetAssessmentReqModel.dart'; +import 'package:doctor_app_flutter/models/SOAP/GetAssessmentResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetGetProgressNoteReqModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetGetProgressNoteResModel.dart'; import 'package:doctor_app_flutter/models/SOAP/GetHistoryReqModel.dart'; @@ -64,14 +66,19 @@ class SOAPViewModel extends BaseViewModel { List get patientAllergiesList => _SOAPService.patientAllergiesList; + List get patientHistoryList => _SOAPService.patientHistoryList; - List get patientPhysicalExamList => + + List get patientPhysicalExamList => _SOAPService.patientPhysicalExamList; - List get patientProgressNoteList => + List get patientProgressNoteList => _SOAPService.patientProgressNoteList; + List get patientAssessmentList => + _SOAPService.patientAssessmentList; + Future getAllergies(GetAllergiesRequestModel getAllergiesRequestModel) async { setState(ViewState.Busy); await _SOAPService.getAllergies(getAllergiesRequestModel); @@ -266,9 +273,9 @@ class SOAPViewModel extends BaseViewModel { } Future getPatientAssessment( - PostAssessmentRequestModel getPatientAssessmentRequestModel) async { + GetAssessmentReqModel getAssessmentReqModel) async { setState(ViewState.Busy); - await _SOAPService.getPatientAssessment(getPatientAssessmentRequestModel); + await _SOAPService.getPatientAssessment(getAssessmentReqModel); if (_SOAPService.hasError) { error = _SOAPService.error; setState(ViewState.Busy); @@ -276,14 +283,12 @@ class SOAPViewModel extends BaseViewModel { setState(ViewState.Idle); } - // ignore: missing_return MasterKeyModel getOneMasterKey( - {@required MasterKeysService masterKeys, int id, int typeId}) { + {@required MasterKeysService masterKeys, dynamic id, int typeId}) { switch (masterKeys) { case MasterKeysService.Allergies: List result = allergiesList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -294,7 +299,6 @@ class SOAPViewModel extends BaseViewModel { case MasterKeysService.HistoryFamily: List result = historyFamilyList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -304,7 +308,6 @@ class SOAPViewModel extends BaseViewModel { break; case MasterKeysService.HistoryMedical: List result = historyMedicalList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -314,7 +317,6 @@ class SOAPViewModel extends BaseViewModel { break; case MasterKeysService.HistorySocial: List result = historySocialList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -324,7 +326,6 @@ class SOAPViewModel extends BaseViewModel { break; case MasterKeysService.HistorySports: List result = historySocialList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -334,17 +335,13 @@ class SOAPViewModel extends BaseViewModel { break; case MasterKeysService.HistorySurgical: List result = historySurgicalList.where((element) { - print(element.id == id); - return element.id == id && - element.typeId == masterKeys.getMasterKeyService(); - }).toList(); + return element.id == id;}).toList(); if (result.isNotEmpty) { return result.first; } break; case MasterKeysService.PhysicalExamination: List result = physicalExaminationList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -354,7 +351,6 @@ class SOAPViewModel extends BaseViewModel { break; case MasterKeysService.AllergySeverity: List result = allergySeverityList.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -371,7 +367,6 @@ class SOAPViewModel extends BaseViewModel { case MasterKeysService.DiagnosisType: List result = listOfDiagnosisType.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -381,7 +376,6 @@ class SOAPViewModel extends BaseViewModel { break; case MasterKeysService.DiagnosisCondition: List result = listOfDiagnosisCondition.where((element) { - print(element.id == id); return element.id == id && element.typeId == masterKeys.getMasterKeyService(); }).toList(); @@ -390,11 +384,8 @@ class SOAPViewModel extends BaseViewModel { } break; case MasterKeysService.ICD10: - listOfICD10.clear(); List result = listOfICD10.where((element) { - print(element.id == id); - return element.id == id && - element.typeId == masterKeys.getMasterKeyService(); + return element.code == id ; }).toList(); if (result.isNotEmpty) { return result.first; diff --git a/lib/models/SOAP/GetAssessmentReqModel.dart b/lib/models/SOAP/GetAssessmentReqModel.dart new file mode 100644 index 00000000..1085bf8c --- /dev/null +++ b/lib/models/SOAP/GetAssessmentReqModel.dart @@ -0,0 +1,40 @@ +class GetAssessmentReqModel { + int patientMRN; + int appointmentNo; + String episodeID; + String from; + String to; + int clinicID; + int doctorID; + + GetAssessmentReqModel( + {this.patientMRN, + this.appointmentNo, + this.episodeID, + this.from, + this.to, + this.clinicID, + this.doctorID}); + + GetAssessmentReqModel.fromJson(Map json) { + patientMRN = json['PatientMRN']; + appointmentNo = json['AppointmentNo']; + episodeID = json['EpisodeID']; + from = json['From']; + to = json['To']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientMRN'] = this.patientMRN; + data['AppointmentNo'] = this.appointmentNo; + data['EpisodeID'] = this.episodeID; + data['From'] = this.from; + data['To'] = this.to; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; + return data; + } +} diff --git a/lib/models/SOAP/GetAssessmentResModel.dart b/lib/models/SOAP/GetAssessmentResModel.dart new file mode 100644 index 00000000..4d1b1b68 --- /dev/null +++ b/lib/models/SOAP/GetAssessmentResModel.dart @@ -0,0 +1,72 @@ +class GetAssessmentResModel { + int appointmentNo; + String asciiDesc; + String clinicDescription; + int clinicID; + bool complexDiagnosis; + int conditionID; + int createdBy; + String createdOn; + int diagnosisTypeID; + int doctorID; + String doctorName; + int episodeId; + String icdCode10ID; + int patientMRN; + String remarks; + + GetAssessmentResModel( + {this.appointmentNo, + this.asciiDesc, + this.clinicDescription, + this.clinicID, + this.complexDiagnosis, + this.conditionID, + this.createdBy, + this.createdOn, + this.diagnosisTypeID, + this.doctorID, + this.doctorName, + this.episodeId, + this.icdCode10ID, + this.patientMRN, + this.remarks}); + + GetAssessmentResModel.fromJson(Map json) { + appointmentNo = json['appointmentNo']; + asciiDesc = json['ascii_Desc']; + clinicDescription = json['clinicDescription']; + clinicID = json['clinicID']; + complexDiagnosis = json['complexDiagnosis']; + conditionID = json['conditionID']; + createdBy = json['createdBy']; + createdOn = json['createdOn']; + diagnosisTypeID = json['diagnosisTypeID']; + doctorID = json['doctorID']; + doctorName = json['doctorName']; + episodeId = json['episodeId']; + icdCode10ID = json['icdCode10ID']; + patientMRN = json['patientMRN']; + remarks = json['remarks']; + } + + Map toJson() { + final Map data = new Map(); + data['appointmentNo'] = this.appointmentNo; + data['ascii_Desc'] = this.asciiDesc; + data['clinicDescription'] = this.clinicDescription; + data['clinicID'] = this.clinicID; + data['complexDiagnosis'] = this.complexDiagnosis; + data['conditionID'] = this.conditionID; + data['createdBy'] = this.createdBy; + data['createdOn'] = this.createdOn; + data['diagnosisTypeID'] = this.diagnosisTypeID; + data['doctorID'] = this.doctorID; + data['doctorName'] = this.doctorName; + data['episodeId'] = this.episodeId; + data['icdCode10ID'] = this.icdCode10ID; + data['patientMRN'] = this.patientMRN; + data['remarks'] = this.remarks; + return data; + } +} diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart index 1339c2f2..2236098a 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart @@ -50,28 +50,12 @@ class _UpdateSubjectivePageState extends State { TextEditingController complaintsController = TextEditingController(); final formKey = GlobalKey(); getHistory(SOAPViewModel model) async{ - GetHistoryReqModel getHistoryMedicalReqModel = GetHistoryReqModel( - patientMRN: widget.patientInfo.patientMRN, - historyType: - MasterKeysService.HistoryMedical.getMasterKeyService()); - GetHistoryReqModel getHistorySportsReqModel = GetHistoryReqModel( - patientMRN: widget.patientInfo.patientMRN, - historyType: - MasterKeysService.HistorySports.getMasterKeyService()); - GetHistoryReqModel getHistorySurgicalReqModel = GetHistoryReqModel( - patientMRN: widget.patientInfo.patientMRN, - historyType: - MasterKeysService.HistorySurgical.getMasterKeyService()); - GetHistoryReqModel getHistoryFamilyReqModel = GetHistoryReqModel( - patientMRN: widget.patientInfo.patientMRN, - historyType: - MasterKeysService.HistoryFamily.getMasterKeyService()); - await model.getPatientHistories(getHistoryMedicalReqModel); - await model.getPatientHistories(getHistorySportsReqModel); - await model.getPatientHistories(getHistorySurgicalReqModel); - await model.getPatientHistories(getHistoryFamilyReqModel); + GetHistoryReqModel getHistoryReqModel = GetHistoryReqModel( + patientMRN: widget.patientInfo.patientMRN, + ); + await model.getPatientHistories(getHistoryReqModel); - if(model.patientHistoryList.isNotEmpty) { + if (model.patientHistoryList.isNotEmpty) { if (model.historyFamilyList.isEmpty) { await model.getMasterLookup(MasterKeysService.HistoryFamily); } @@ -390,41 +374,27 @@ class _UpdateSubjectivePageState extends State { await postChiefComplaint(model: model); if (model.state == ViewState.ErrorLocal) { helpers.showErrorToast(model.error); - } else { - if (myHistoryList.length != 0) { - await postHistories(model: model, myHistoryList: myHistoryList); - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } else { - if (myAllergiesList.length != 0) { - await postAllergy(myAllergiesList: myAllergiesList, model: model); - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } else { - widget.changePageViewIndex(1); - } - } else { - widget.changePageViewIndex(1); - } - } - } else { - if (myAllergiesList.length != 0) { - await postAllergy(myAllergiesList: myAllergiesList, model: model); - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } else { - widget.changePageViewIndex(1); - } - } else { - widget.changePageViewIndex(1); - } + } + + if (myHistoryList.length != 0) { + await postHistories(model: model, myHistoryList: myHistoryList); + if (model.state == ViewState.ErrorLocal) { + helpers.showErrorToast(model.error); + } + } + if (myAllergiesList.length != 0) { + await postAllergy(myAllergiesList: myAllergiesList, model: model); + if (model.state == ViewState.ErrorLocal) { + helpers.showErrorToast(model.error); } } + + widget.changePageViewIndex(1); + } else { helpers.showErrorToast('Please add required field correctly'); } - widget.changePageViewIndex(1); } @@ -487,13 +457,12 @@ class _UpdateSubjectivePageState extends State { }); - if (model.patientAllergiesList.isEmpty) { + if (model.patientHistoryList.isEmpty) { await model.postHistories(postHistoriesRequestModel); } else { await model.patchHistories(postHistoriesRequestModel); } - await model.patchHistories(postHistoriesRequestModel); if (model.state == ViewState.ErrorLocal) { helpers.showErrorToast(model.error); diff --git a/lib/widgets/patients/profile/soap_update/update_assessment_page.dart b/lib/widgets/patients/profile/soap_update/update_assessment_page.dart index 61c7f20b..c25b0d5b 100644 --- a/lib/widgets/patients/profile/soap_update/update_assessment_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_assessment_page.dart @@ -4,6 +4,7 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; +import 'package:doctor_app_flutter/models/SOAP/GetAssessmentReqModel.dart'; import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/models/SOAP/my_selected_assement.dart'; import 'package:doctor_app_flutter/models/SOAP/post_assessment_request_model.dart'; @@ -36,19 +37,53 @@ class UpdateAssessmentPage extends StatefulWidget { class _UpdateAssessmentPageState extends State { bool isAssessmentExpand = false; - - List assessmentList; - dynamic _referTo; - - TextEditingController remarksController = TextEditingController(); - @override Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; return BaseView( + onModelReady: (model) async{ + + widget.mySelectedAssessment.appointmentId =widget.patientInfo.appointmentNo; + GetAssessmentReqModel getAssessmentReqModel = GetAssessmentReqModel( + patientMRN: widget.patientInfo.patientMRN, + episodeID: widget.patientInfo.episodeNo.toString(), + appointmentNo: widget.patientInfo.appointmentNo); + await model.getPatientAssessment(getAssessmentReqModel); + if(model.patientAssessmentList.isNotEmpty){ + if (model.listOfDiagnosisCondition.length == 0) { + await model.getMasterLookup(MasterKeysService.DiagnosisCondition); + } + if (model.listOfDiagnosisType.length == 0) { + await model.getMasterLookup(MasterKeysService.DiagnosisType); + } + if (model.listOfICD10.length == 0) { + await model.getMasterLookup(MasterKeysService.ICD10); + } + + MasterKeyModel selectedICD = model.getOneMasterKey( + masterKeys: MasterKeysService.ICD10, + id: model.patientAssessmentList[0].icdCode10ID, + ); + widget.mySelectedAssessment.selectedICD= selectedICD; + MasterKeyModel diagnosisCondition = model.getOneMasterKey( + masterKeys: MasterKeysService.DiagnosisCondition, + id: model.patientAssessmentList[0].conditionID, + ); + + widget.mySelectedAssessment.selectedDiagnosisCondition = diagnosisCondition; + MasterKeyModel diagnosisType = model.getOneMasterKey( + masterKeys: MasterKeysService.DiagnosisType, + id: model.patientAssessmentList[0].diagnosisTypeID, + ); + + widget.mySelectedAssessment.selectedDiagnosisType = diagnosisType; + widget.mySelectedAssessment.remark = model.patientAssessmentList[0].remarks; + } + }, builder: (_, model, w) => AppScaffold( isShowAppBar: false, + baseViewModel: model, body: SingleChildScrollView( physics: ScrollPhysics(), child: Center( @@ -58,66 +93,67 @@ class _UpdateAssessmentPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( + height: 30, + ), + HeaderBodyExpandableNotifier( + headerWidget: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts('ASSESSMENT', - variant: + Row( + children: [ + Texts('ASSESSMENT', + variant: isAssessmentExpand ? "bodyText" : '', - bold: isAssessmentExpand ? true : false, - color: Colors.black), - Icon( - FontAwesomeIcons.asterisk, - color: AppGlobal.appPrimaryColor, - size: 12, - ) + bold: isAssessmentExpand ? true : false, + color: Colors.black), + Icon( + FontAwesomeIcons.asterisk, + color: AppGlobal.appPrimaryColor, + size: 12, + ) + ], + ), + InkWell( + onTap: () { + setState(() { + isAssessmentExpand = !isAssessmentExpand; + }); + }, + child: Icon(isAssessmentExpand + ? EvaIcons.minus + : EvaIcons.plus)) ], ), - InkWell( - onTap: () { - setState(() { - isAssessmentExpand = !isAssessmentExpand; - }); - }, - child: Icon(isAssessmentExpand - ? EvaIcons.minus - : EvaIcons.plus)) - ], - ), - bodyWidget: Column(children: [ - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - margin: + bodyWidget: Column(children: [ + SizedBox( + height: 20, + ), + Column( + children: [ + Container( + margin: EdgeInsets.only(left: 5, right: 5, top: 15), - child: TextFields( - hintText: "Add ASSESSMENT", - fontSize: 13.5, - onTapTextFields: () { - openAssessmentDialog(context); - }, - readOnly: true, - // hintColor: Colors.black, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - // controller: messageController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), + child: TextFields( + hintText: "Add ASSESSMENT", + fontSize: 13.5, + onTapTextFields: () { + openAssessmentDialog(context); + }, + readOnly: true, + // hintColor: Colors.black, + suffixIcon: EvaIcons.plusCircleOutline, + suffixIconColor: AppGlobal + .appPrimaryColor, + fontWeight: FontWeight.w600, + // controller: messageController, + validator: (value) { + if (value == null) + return TranslationBase + .of(context) + .emptyMessage; + else + return null; + }), ), SizedBox( height: 20, @@ -242,7 +278,7 @@ class _UpdateAssessmentPageState extends State { height: 6, ), AppText( - widget.mySelectedAssessment.remark, + widget.mySelectedAssessment.remark??"", fontSize: 10, color: Colors.grey, ), @@ -263,7 +299,7 @@ class _UpdateAssessmentPageState extends State { fontSize: 16, ), AppText( - "R07.1".toUpperCase(), + widget.mySelectedAssessment.selectedICD.code.toUpperCase()??"", fontSize: 10, color: Colors.grey, ), @@ -291,44 +327,68 @@ class _UpdateAssessmentPageState extends State { isExpand: isAssessmentExpand, ), DividerWithSpacesAround( - height: 30, - ), - AppButton( - title: TranslationBase.of(context).next, - loading: model.state == ViewState.BusyLocal, - onPressed: () async { - await submitAssessment(model); - }, - ), - SizedBox( - height: 30, + height: 30, + ), + AppButton( + title: TranslationBase + .of(context) + .next, + loading: model.state == ViewState.BusyLocal, + onPressed: () async { + await submitAssessment(model); + }, + ), + SizedBox( + height: 30, + ), + ], ), - ], + ), ), - ), - ), - ))); + ))); } submitAssessment(SOAPViewModel model) async { if (widget.mySelectedAssessment.selectedDiagnosisCondition != null && - widget.mySelectedAssessment.selectedDiagnosisType != null) { - PatchAssessmentReqModel patchAssessmentReqModel = - new PatchAssessmentReqModel( - patientMRN: widget.patientInfo.patientMRN, - episodeId: widget.patientInfo.episodeNo, - appointmentNo: widget.patientInfo.appointmentNo, - remarks: widget.mySelectedAssessment.remark, - complexDiagnosis: true, - conditionId: - widget.mySelectedAssessment.selectedDiagnosisCondition.id, - diagnosisTypeId: - widget.mySelectedAssessment.selectedDiagnosisType.id, - icdcode10Id: "1", - prevIcdCode10ID: "1" - ); + widget.mySelectedAssessment.selectedDiagnosisType != null && widget.mySelectedAssessment.selectedICD !=null ) { + + if(model.patientAssessmentList.isEmpty){ + PostAssessmentRequestModel postAssessmentRequestModel = + new PostAssessmentRequestModel( + patientMRN: widget.patientInfo.patientMRN, + episodeId: widget.patientInfo.episodeNo, + appointmentNo: widget.patientInfo.appointmentNo, + icdCodeDetails: [ + new IcdCodeDetails( + remarks: widget.mySelectedAssessment.remark, + complexDiagnosis: true, + conditionId: + widget.mySelectedAssessment.selectedDiagnosisCondition.id, + diagnosisTypeId: + widget.mySelectedAssessment.selectedDiagnosisType.id, + icdcode10Id: widget.mySelectedAssessment.selectedICD.code) + ]); + + await model.postAssessment(postAssessmentRequestModel); + } else { + PatchAssessmentReqModel patchAssessmentReqModel = + PatchAssessmentReqModel( + patientMRN: widget.patientInfo.patientMRN, + episodeID: widget.patientInfo.episodeNo, + appointmentNo: widget.patientInfo.appointmentNo, + remarks: widget.mySelectedAssessment.remark, + complexDiagnosis: true, + conditionId: + widget.mySelectedAssessment.selectedDiagnosisCondition.id, + diagnosisTypeId: + widget.mySelectedAssessment.selectedDiagnosisType.id, + icdcode10Id: widget.mySelectedAssessment.selectedICD.code, + prevIcdCode10ID: model.patientAssessmentList[0].icdCode10ID + ); + + await model.patchAssessment(patchAssessmentReqModel); + } - await model.patchAssessment(patchAssessmentReqModel); if (model.state == ViewState.ErrorLocal) { helpers.showErrorToast(model.error); @@ -363,9 +423,9 @@ class _UpdateAssessmentPageState extends State { class AddAssessmentDetails extends StatefulWidget { final MySelectedAssessment mySelectedAssessment; final Function() addSelectedAssessment; - + final PatiantInformtion patientInfo; const AddAssessmentDetails( - {Key key, this.mySelectedAssessment, this.addSelectedAssessment}) + {Key key, this.mySelectedAssessment, this.addSelectedAssessment, this.patientInfo}) : super(key: key); @override @@ -376,13 +436,13 @@ class _AddAssessmentDetailsState extends State { // MasterKeyModel _selectedDiagnosisCondition; // MasterKeyModel _selectedDiagnosisType; TextEditingController remarkController = TextEditingController(); - TextEditingController appointmentIdController = TextEditingController( - text: "234567"); + TextEditingController appointmentIdController = TextEditingController(); GlobalKey key = new GlobalKey>(); @override Widget build(BuildContext context) { remarkController.text = widget.mySelectedAssessment.remark??""; + appointmentIdController.text = widget.mySelectedAssessment.appointmentId.toString(); final screenSize = MediaQuery .of(context) .size; @@ -644,7 +704,7 @@ class _AddAssessmentDetailsState extends State { class PatchAssessmentReqModel { int patientMRN; int appointmentNo; - int episodeId; + int episodeID; String icdcode10Id; String prevIcdCode10ID; int conditionId; @@ -655,7 +715,7 @@ class PatchAssessmentReqModel { PatchAssessmentReqModel( {this.patientMRN, this.appointmentNo, - this.episodeId, + this.episodeID, this.icdcode10Id, this.prevIcdCode10ID, this.conditionId, @@ -664,28 +724,28 @@ class PatchAssessmentReqModel { this.remarks}); PatchAssessmentReqModel.fromJson(Map json) { - patientMRN = json['patientMRN']; - appointmentNo = json['appointmentNo']; - episodeId = json['episodeId']; - icdcode10Id = json['icdcode10Id']; - prevIcdCode10ID = json['prevIcdCode10ID']; - conditionId = json['conditionId']; - diagnosisTypeId = json['diagnosisTypeId']; - complexDiagnosis = json['complexDiagnosis']; - remarks = json['remarks']; + patientMRN = json['PatientMRN']; + appointmentNo = json['AppointmentNo']; + episodeID = json['EpisodeID']; + icdcode10Id = json['Icdcode10Id']; + prevIcdCode10ID = json['PrevIcdCode10ID']; + conditionId = json['ConditionId']; + diagnosisTypeId = json['DiagnosisTypeId']; + complexDiagnosis = json['ComplexDiagnosis']; + remarks = json['Remarks']; } Map toJson() { final Map data = new Map(); - data['patientMRN'] = this.patientMRN; - data['appointmentNo'] = this.appointmentNo; - data['episodeId'] = this.episodeId; - data['icdcode10Id'] = this.icdcode10Id; - data['prevIcdCode10ID'] = this.prevIcdCode10ID; - data['conditionId'] = this.conditionId; - data['diagnosisTypeId'] = this.diagnosisTypeId; - data['complexDiagnosis'] = this.complexDiagnosis; - data['remarks'] = this.remarks; + data['PatientMRN'] = this.patientMRN; + data['AppointmentNo'] = this.appointmentNo; + data['EpisodeID'] = this.episodeID; + data['Icdcode10Id'] = this.icdcode10Id; + data['PrevIcdCode10ID'] = this.prevIcdCode10ID; + data['ConditionId'] = this.conditionId; + data['DiagnosisTypeId'] = this.diagnosisTypeId; + data['ComplexDiagnosis'] = this.complexDiagnosis; + data['Remarks'] = this.remarks; return data; } } diff --git a/lib/widgets/patients/profile/soap_update/update_objective_page.dart b/lib/widgets/patients/profile/soap_update/update_objective_page.dart index 55be0be6..2a342542 100644 --- a/lib/widgets/patients/profile/soap_update/update_objective_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_objective_page.dart @@ -84,8 +84,7 @@ class _UpdateObjectivePageState extends State { }, builder: (_, model, w) => AppScaffold( isShowAppBar: false, - //TODO: retrun it back - // baseViewModel: model, + baseViewModel: model, body: SingleChildScrollView( physics: ScrollPhysics(), child: Center( @@ -379,7 +378,11 @@ class _UpdateObjectivePageState extends State { )); }); - await model.patchPhysicalExam(postPhysicalExamRequestModel); + if(model.patientPhysicalExamList.isEmpty) { + await model.postPhysicalExam(postPhysicalExamRequestModel); + } else { + await model.patchPhysicalExam(postPhysicalExamRequestModel); + } if (model.state == ViewState.ErrorLocal) { helpers.showErrorToast(model.error); From f8b195e368e787a4db77d835439a11d1e49cc38e Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Fri, 1 Jan 2021 17:03:59 +0200 Subject: [PATCH 08/18] parseHtmlString now working :) --- lib/util/helpers.dart | 8 ++++++++ .../subjective/update_subjective_page.dart | 8 +++++--- .../profile/soap_update/update_plan_page.dart | 4 ++-- pubspec.lock | 14 ++++++++++++++ pubspec.yaml | 3 +++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/util/helpers.dart b/lib/util/helpers.dart index c1d70cef..4725ca9f 100644 --- a/lib/util/helpers.dart +++ b/lib/util/helpers.dart @@ -5,6 +5,7 @@ import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:doctor_app_flutter/config/config.dart'; +import 'package:html/parser.dart'; import '../config/size_config.dart'; import '../util/dr_app_toast_msg.dart'; @@ -352,4 +353,11 @@ class Helpers { // TODO Fix it // Navigator.of(AppGlobal.CONTEX).popUntil((ModalRoute.withName(LOGIN))); } + + String parseHtmlString(String htmlString) { + final document = parse(htmlString); + final String parsedString = parse(document.body.text).documentElement.text; + + return parsedString; + } } diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart index 2236098a..84c0734a 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart @@ -24,6 +24,7 @@ import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body. import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:html/parser.dart'; class UpdateSubjectivePage extends StatefulWidget { final Function changePageViewIndex; @@ -96,7 +97,8 @@ class _UpdateSubjectivePageState extends State { } @override Widget build(BuildContext context) { - return BaseView( + + return BaseView( onModelReady: (model) async { GeneralGetReqForSOAP generalGetReqForSOAP = GeneralGetReqForSOAP( patientMRN: widget.patientInfo.patientMRN, @@ -110,8 +112,8 @@ class _UpdateSubjectivePageState extends State { episodeID: widget.patientInfo.episodeNo); await model.getPatientChiefComplaint(getChiefComplaintReqModel); if (model.patientChiefComplaintList.isNotEmpty) { - complaintsController.text = - model.patientChiefComplaintList[0].chiefComplaint; + complaintsController.text = helpers.parseHtmlString(model.patientChiefComplaintList[0].chiefComplaint) + ; illnessController.text = model.patientChiefComplaintList[0].hopi; } await model.getPatientAllergy(generalGetReqForSOAP); diff --git a/lib/widgets/patients/profile/soap_update/update_plan_page.dart b/lib/widgets/patients/profile/soap_update/update_plan_page.dart index 506ff103..d5ad12e9 100644 --- a/lib/widgets/patients/profile/soap_update/update_plan_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_plan_page.dart @@ -63,8 +63,8 @@ class _UpdatePlanPageState extends State { await model.getPatientProgressNote(getGetProgressNoteReqModel); if (model.patientProgressNoteList.isNotEmpty) { - progressNoteController.text = - model.patientProgressNoteList[0].planNote; + progressNoteController.text = helpers + .parseHtmlString(model.patientProgressNoteList[0].planNote); } }, builder: (_, model, w) => AppScaffold( diff --git a/pubspec.lock b/pubspec.lock index c6829dad..61cc667f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -239,6 +239,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.5" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.16.2" cupertino_icons: dependency: "direct main" description: @@ -385,6 +392,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.6" + html: + dependency: "direct main" + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.14.0+4" http: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index e15a7182..91283a89 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,6 +63,9 @@ dependencies: #Autocomplete TextField autocomplete_textfield: ^1.7.3 + # Html + html: ^0.14.0+4 + #speech to text From b60bac6d6e49af0c04d5f9c0b5781a1de99df4fc Mon Sep 17 00:00:00 2001 From: mosazaid Date: Fri, 1 Jan 2021 19:31:16 +0200 Subject: [PATCH 09/18] working on UCAF design --- lib/config/localized_values.dart | 13 + .../profile/UCAF/UCAF-input-screen.dart | 407 +++++++++++++++++- lib/util/translations_delegate_base.dart | 13 + .../profile/profile_medical_info_widget.dart | 40 +- 4 files changed, 454 insertions(+), 19 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 453cef8f..c27e8b70 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -402,4 +402,17 @@ const Map> localizedValues = { 'save': {'en': "SAVE", 'ar': 'حفظ'}, 'postPlansEstimatedCost': {'en': "POST PLANS & ESTIMATED COST", 'ar': 'خطط البريد والتكلفة المقدرة'}, 'ucaf': {'en': "UCAF", 'ar': 'UCAF'}, + 'emergencyCase': {'en': "Emergency Case", 'ar': 'حالة طارئة'}, + 'durationOfIllness': {'en': "duration Of Illness", 'ar': 'مدة المرض'}, + 'chiefComplaintsAndSymptoms': {'en': "CHIEF COMPLAINTS & OTHER SYMPTOMS", 'ar': 'شكاوى الرئيس وأعراض أخرى'}, + 'patientFeelsPainInHisBackAndCough': {'en': "Patient Feels pain in his back and cough", 'ar': 'يشعر المريض بألم في ظهره ويسعل'}, + 'additionalTextComplaints': {'en': "Additional text to add about Complaints", 'ar': 'نص إضافي لإضافته حول الشكاوى'}, + 'otherConditions': {'en': "OTHER CONDITIONS", 'ar': 'شروط أخرى'}, + 'other': {'en': "Other", 'ar': 'أخرى'}, + 'how': {'en': "How", 'ar': 'كيف'}, + 'when': {'en': "When", 'ar': 'متى'}, + 'where': {'en': "Where", 'ar': 'أين'}, + 'specifyPossibleLineManagement': {'en': "Specify possible line of management", 'ar': 'حدد خط الإدارة المحتمل'}, + 'significantSigns': {'en': "SIGNIFICANT SIGNS", 'ar': 'علامات مهمة'}, + 'backAbdomen': {'en': "Back : Abdomen", 'ar': 'الظهر: البطن'}, }; diff --git a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart index f48fadb0..82b01144 100644 --- a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart +++ b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart @@ -1,9 +1,16 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/patient-ucaf-viewmodel.dart'; import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:hexcolor/hexcolor.dart'; class UCAFInputScreen extends StatefulWidget { @override @@ -11,6 +18,33 @@ class UCAFInputScreen extends StatefulWidget { } class _UCAFInputScreenState extends State { + bool _inPatient = false; + bool _emergencyCase = false; + final _durationOfIllnessController = TextEditingController(); + final _additionalComplaintsController = TextEditingController(); + final _otherController = TextEditingController(); + final _howController = TextEditingController(); + final _whenController = TextEditingController(); + final _whereController = TextEditingController(); + final _managementsLineController = TextEditingController(); + final _signsController = TextEditingController(); + List conditionsData = [ + {"name": "CHRONIC", "isChecked": false}, + {"name": "RTA", "isChecked": false}, + {"name": "PSYCHIATRIC", "isChecked": false}, + {"name": "WORK RELATED", "isChecked": false}, + {"name": "VACCINATION", "isChecked": false}, + {"name": "CONGENITAL", "isChecked": false}, + {"name": "INFERTILITY", "isChecked": false}, + {"name": "CHECK-UP", "isChecked": false}, + {"name": "PREGNANCY/INDICATE MP", "isChecked": false}, + {"name": "CLEANING", "isChecked": false}, + {"name": "ORTHO DONTICS", "isChecked": false}, + {"name": "SPORTS RELATED", "isChecked": false}, + {"name": "REGULAR DENTAL TREATMENT", "isChecked": false}, + {"name": "IS TRAUMA TREATMENT SPECIFY ETA", "isChecked": false}, + ]; + @override Widget build(BuildContext context) { final routeArgs = ModalRoute.of(context).settings.arguments as Map; @@ -21,8 +55,379 @@ class _UCAFInputScreenState extends State { builder: (_, model, w) => AppScaffold( baseViewModel: model, appBarTitle: TranslationBase.of(context).ucaf, - body: Container(), + body: SingleChildScrollView( + child: Column( + children: [ + PatientHeaderWidget(patient), + Container( + margin: EdgeInsets.symmetric(vertical: 16, horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CheckboxListTile( + title: AppText( + TranslationBase.of(context).inPatient, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: _inPatient, + onChanged: (newValue) { + setState(() { + _inPatient = newValue; + }); + }, + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), + CheckboxListTile( + title: AppText( + TranslationBase.of(context).emergencyCase, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: _emergencyCase, + onChanged: (newValue) { + setState(() { + _emergencyCase = newValue; + }); + }, + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + ), + Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).durationOfIllness, + null, + false), + enabled: true, + controller: _durationOfIllnessController, + inputFormatters: [ + FilteringTextInputFormatter.allow( + RegExp(ONLY_NUMBERS)) + ], + keyboardType: TextInputType.number, + )), + SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + AppText( + "BP (H/L)", + fontSize: SizeConfig.textMultiplier * 1.8, + color: Colors.black, + fontWeight: FontWeight.w700, + ), + SizedBox( + width: 8, + ), + AppText( + "120/80", + fontSize: SizeConfig.textMultiplier * 2, + color: Colors.grey.shade800, + fontWeight: FontWeight.normal, + ), + ], + ), + Row( + children: [ + AppText( + "${TranslationBase.of(context).temperature}", + fontSize: SizeConfig.textMultiplier * 1.8, + color: Colors.black, + fontWeight: FontWeight.w700, + ), + SizedBox( + width: 8, + ), + AppText( + "37.5(C), 98.6(F)", + fontSize: SizeConfig.textMultiplier * 2, + color: Colors.grey.shade800, + fontWeight: FontWeight.normal, + ), + ], + ), + ], + ), + SizedBox( + height: 4, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + AppText( + "${TranslationBase.of(context).pulseBeats} :", + fontSize: SizeConfig.textMultiplier * 1.8, + color: Colors.black, + fontWeight: FontWeight.w700, + ), + SizedBox( + width: 8, + ), + AppText( + "80", + fontSize: SizeConfig.textMultiplier * 2, + color: Colors.grey.shade800, + fontWeight: FontWeight.normal, + ), + ], + ), + ], + ), + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).chiefComplaintsAndSymptoms, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 8, + ), + AppText( + TranslationBase.of(context) + .patientFeelsPainInHisBackAndCough, + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + SizedBox( + height: 8, + ), + Container( + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).additionalTextComplaints, + null, + false), + enabled: true, + controller: _additionalComplaintsController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context).otherConditions, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + ...List.generate( + conditionsData.length, + (index) => CheckboxListTile( + title: AppText( + conditionsData[index]['name'], + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.1, + ), + value: conditionsData[index]['isChecked'], + onChanged: (newValue) { + setState(() { + conditionsData[index]['isChecked'] = newValue; + }); + }, + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.all(0), + )), + SizedBox( + height: 8, + ), + Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).other, + null, + false), + enabled: true, + controller: _otherController, + keyboardType: TextInputType.text, + )), + SizedBox( + height: 8, + ), + Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).how, + null, + false), + enabled: true, + controller: _howController, + keyboardType: TextInputType.text, + )), + SizedBox( + height: 8, + ), + Row( + children: [ + Expanded( + child: Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).when, + null, + false), + enabled: true, + controller: _whenController, + keyboardType: TextInputType.text, + )), + ), + SizedBox( + width: 4, + ), + Expanded( + child: Container( + height: screenSize.height * 0.070, + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).where, + null, + false), + enabled: true, + controller: _whereController, + keyboardType: TextInputType.text, + )), + ), + ], + ), + SizedBox( + height: 8, + ), + Container( + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).specifyPossibleLineManagement, + null, + false), + enabled: true, + controller: _managementsLineController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 16, + ), + AppText( + TranslationBase.of(context) + .significantSigns, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + SizedBox( + height: 8, + ), + Container( + child: TextField( + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context).backAbdomen, + null, + false), + enabled: true, + controller: _signsController, + keyboardType: TextInputType.text, + minLines: 4, + maxLines: 6, + )), + SizedBox( + height: 16, + ), + AppButton( + title: TranslationBase.of(context).next, + color: HexColor("#B8382B"), + onPressed: (){ + // Navigator.of(context).pushNamed(PATIENT_ADMISSION_REQUEST_3, arguments: {'patient': patient}); + }, + ), + ], + ), + ), + ], + ), + ), ), ); } } + +class PatientHeaderWidget extends StatelessWidget { + final PatiantInformtion patient; + + PatientHeaderWidget(this.patient); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + margin: EdgeInsets.all(16), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + patient.firstName + ' ' + patient.lastName, + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.2, + ), + Row( + children: [ + AppText( + "VIP", + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.2, + ), + SizedBox( + width: 8, + ), + AppText( + " ${patient.age}", + fontWeight: FontWeight.normal, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + ], + ), + AppText( + "NEW VISIT", + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + AppText( + "${patient.companyName}", + fontWeight: FontWeight.bold, + fontSize: SizeConfig.textMultiplier * 2.0, + ), + ], + ), + ), + Icon( + Icons.info_outline, + color: Colors.black, + ), + ], + ), + ), + Container( + width: double.infinity, + height: 1, + color: Color(0xffCCCCCC), + ), + ], + ); + } +} diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index a67463a0..213ad371 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -439,6 +439,19 @@ class TranslationBase { String get save => localizedValues['save'][locale.languageCode]; String get postPlansEstimatedCost => localizedValues['postPlansEstimatedCost'][locale.languageCode]; String get ucaf => localizedValues['ucaf'][locale.languageCode]; + String get emergencyCase => localizedValues['emergencyCase'][locale.languageCode]; + String get durationOfIllness => localizedValues['durationOfIllness'][locale.languageCode]; + String get chiefComplaintsAndSymptoms => localizedValues['chiefComplaintsAndSymptoms'][locale.languageCode]; + String get patientFeelsPainInHisBackAndCough => localizedValues['patientFeelsPainInHisBackAndCough'][locale.languageCode]; + String get additionalTextComplaints => localizedValues['additionalTextComplaints'][locale.languageCode]; + String get otherConditions => localizedValues['otherConditions'][locale.languageCode]; + String get other => localizedValues['other'][locale.languageCode]; + String get how => localizedValues['how'][locale.languageCode]; + String get when => localizedValues['when'][locale.languageCode]; + String get where => localizedValues['where'][locale.languageCode]; + String get specifyPossibleLineManagement => localizedValues['specifyPossibleLineManagement'][locale.languageCode]; + String get significantSigns => localizedValues['significantSigns'][locale.languageCode]; + String get backAbdomen => localizedValues['backAbdomen'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/patients/profile/profile_medical_info_widget.dart b/lib/widgets/patients/profile/profile_medical_info_widget.dart index 3f7baf51..35f1e586 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget.dart @@ -43,13 +43,16 @@ class ProfileMedicalInfoWidget extends StatelessWidget { nameLine2: "Episode", route: UPDATE_EPISODE, icon: 'heartbeat.png'), - PatientProfileButton( - key: key, - patient: patient, - nameLine1: TranslationBase.of(context).vital, - nameLine2: TranslationBase.of(context).signs, - route: PATIENT_VITAL_SIGN, - icon: 'heartbeat.png'), + Visibility( + visible: selectedPatientType == 6 || selectedPatientType == 7, + child: PatientProfileButton( + key: key, + patient: patient, + nameLine1: TranslationBase.of(context).vital, + nameLine2: TranslationBase.of(context).signs, + route: PATIENT_VITAL_SIGN, + icon: 'heartbeat.png'), + ), PatientProfileButton( key: key, patient: patient, @@ -80,13 +83,16 @@ class ProfileMedicalInfoWidget extends StatelessWidget { nameLine1: TranslationBase.of(context).progress, nameLine2: TranslationBase.of(context).note, icon: 'heartbeat.png')), - PatientProfileButton( - key: key, - patient: patient, - route: PATIENT_ADMISSION_REQUEST, - nameLine1: TranslationBase.of(context).admission, - nameLine2: TranslationBase.of(context).request, - icon: 'heartbeat.png'), + Visibility( + visible: selectedPatientType == 6 || selectedPatientType == 7, + child: PatientProfileButton( + key: key, + patient: patient, + route: PATIENT_ADMISSION_REQUEST, + nameLine1: TranslationBase.of(context).admission, + nameLine2: TranslationBase.of(context).request, + icon: 'heartbeat.png'), + ), // PatientProfileButton( // key: key, // patient: patient, @@ -109,9 +115,7 @@ class ProfileMedicalInfoWidget extends StatelessWidget { nameLine2: 'Or Procedures', icon: 'lab.png'), Visibility( - visible: selectedPatientType != 0 && - selectedPatientType != 5 && - selectedPatientType != 2, + visible: selectedPatientType == 6 || selectedPatientType == 7, child: PatientProfileButton( key: key, patient: patient, @@ -138,7 +142,7 @@ class ProfileMedicalInfoWidget extends StatelessWidget { nameLine2: TranslationBase.of(context).leave, icon: 'sick_leaves_icons.png')), Visibility( - visible: selectedPatientType != 0 && selectedPatientType != 5, + visible: selectedPatientType == 6 || selectedPatientType == 7, child: PatientProfileButton( key: key, patient: patient, From 856777c648ccd9acff30c1bbfcff6c9887dba5c6 Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Fri, 1 Jan 2021 22:04:30 +0200 Subject: [PATCH 10/18] finish updating functions --- lib/models/SOAP/GetHistoryReqModel.dart | 29 ++++++++++++++++++- lib/routes.dart | 2 +- .../patients/profile/SOAP/add_SOAP_index.dart | 2 +- .../profile/patient-page-header-widget.dart | 2 +- .../{SOAP => soap_update}/steps_widget.dart | 0 .../subjective/update_subjective_page.dart | 2 ++ .../soap_update/update_soap_index.dart | 2 +- 7 files changed, 34 insertions(+), 5 deletions(-) rename lib/widgets/patients/profile/{SOAP => soap_update}/steps_widget.dart (100%) diff --git a/lib/models/SOAP/GetHistoryReqModel.dart b/lib/models/SOAP/GetHistoryReqModel.dart index 9b852e9b..1df26690 100644 --- a/lib/models/SOAP/GetHistoryReqModel.dart +++ b/lib/models/SOAP/GetHistoryReqModel.dart @@ -1,18 +1,45 @@ class GetHistoryReqModel { int patientMRN; int historyType; + String episodeID; + String from; + String to; + int clinicID; + int doctorID; + int appointmentNo; - GetHistoryReqModel({this.patientMRN, this.historyType}); + GetHistoryReqModel( + {this.patientMRN, + this.historyType, + this.episodeID, + this.from, + this.to, + this.clinicID, + this.doctorID, + this.appointmentNo}); GetHistoryReqModel.fromJson(Map json) { patientMRN = json['PatientMRN']; historyType = json['HistoryType']; + episodeID = json['EpisodeID']; + from = json['From']; + to = json['To']; + clinicID = json['ClinicID']; + doctorID = json['DoctorID']; + appointmentNo = json['AppointmentNo']; + } Map toJson() { final Map data = new Map(); data['PatientMRN'] = this.patientMRN; data['HistoryType'] = this.historyType; + data['AppointmentNo'] = this.appointmentNo; + data['EpisodeID'] = this.episodeID; + data['From'] = this.from; + data['To'] = this.to; + data['ClinicID'] = this.clinicID; + data['DoctorID'] = this.doctorID; return data; } } diff --git a/lib/routes.dart b/lib/routes.dart index 1915a89d..b0dd4a7b 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -127,7 +127,7 @@ var routes = { PATIENT_INSURANCE_APPROVALS: (_) => InsuranceApprovalsScreen(), VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(), PATIENT_VITAL_SIGN: (_) => PatientVitalSignScreen(), - CREATE_EPISODE: (_) => AddSOAPIndex(), + CREATE_EPISODE: (_) => UpdateSoapIndex(isUpdate: true,), UPDATE_EPISODE: (_) => UpdateSoapIndex(isUpdate: true,), BODY_MEASUREMENTS: (_) => VitalSignItemDetailsScreen(), IN_PATIENT_PRESCRIPTIONS_DETAILS: (_) => InpatientPrescriptionDetailsScreen(), diff --git a/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart b/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart index 5a698af9..9b4d092d 100644 --- a/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart +++ b/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart @@ -15,7 +15,7 @@ import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'steps_widget.dart'; +import '../soap_update/steps_widget.dart'; class AddSOAPIndex extends StatefulWidget { final bool isUpdate; diff --git a/lib/widgets/patients/profile/patient-page-header-widget.dart b/lib/widgets/patients/profile/patient-page-header-widget.dart index 1567487d..3e870be5 100644 --- a/lib/widgets/patients/profile/patient-page-header-widget.dart +++ b/lib/widgets/patients/profile/patient-page-header-widget.dart @@ -44,7 +44,7 @@ class PatientPageHeaderWidget extends StatelessWidget { height: 5, ), AppText( - patient.firstName + ' ' + patient.lastName, + patient.firstName + ' ' + patient.lastName, color: Colors.black, fontWeight: FontWeight.bold, ), diff --git a/lib/widgets/patients/profile/SOAP/steps_widget.dart b/lib/widgets/patients/profile/soap_update/steps_widget.dart similarity index 100% rename from lib/widgets/patients/profile/SOAP/steps_widget.dart rename to lib/widgets/patients/profile/soap_update/steps_widget.dart diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart index 84c0734a..d9828795 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart @@ -53,6 +53,8 @@ class _UpdateSubjectivePageState extends State { getHistory(SOAPViewModel model) async{ GetHistoryReqModel getHistoryReqModel = GetHistoryReqModel( patientMRN: widget.patientInfo.patientMRN, + episodeID: widget.patientInfo.episodeNo.toString(), + appointmentNo: widget.patientInfo.appointmentNo ); await model.getPatientHistories(getHistoryReqModel); diff --git a/lib/widgets/patients/profile/soap_update/update_soap_index.dart b/lib/widgets/patients/profile/soap_update/update_soap_index.dart index 744f5244..9e5dd82b 100644 --- a/lib/widgets/patients/profile/soap_update/update_soap_index.dart +++ b/lib/widgets/patients/profile/soap_update/update_soap_index.dart @@ -9,7 +9,7 @@ import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/assessment_page.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/objective_page.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/plan_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/steps_widget.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/steps_widget.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/subjective_page.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart'; From e23bb7ce94e7f05941d9894250cde97c56b2b85b Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sat, 2 Jan 2021 14:59:43 +0300 Subject: [PATCH 11/18] reschedule leave --- lib/config/config.dart | 1 + lib/core/service/sickleave_service.dart | 16 + lib/core/viewModel/sick_leave_view_model.dart | 10 + .../reschedule-leaves/reschedule_leave.dart | 400 +++++++++++++----- pubspec.yaml | 2 +- 5 files changed, 330 insertions(+), 99 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 14ac4a0a..6b717ace 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -111,6 +111,7 @@ const EXTEND_SICK_LEAVE = 'Services/DoctorApplication.svc/REST/ExtendSickLeave'; const GET_OFFTIME = 'Services/DoctorApplication.svc/REST/GetMasterLookUpList'; const GET_COVERING_DOCTORS = 'Services/DoctorApplication.svc/REST/GetCoveringDoctor'; +const ADD_RESCHDEULE = 'Services/DoctorApplication.svc/REST/PostRequisition'; const GET_RESCHEDULE_LEAVE = 'Services/DoctorApplication.svc/REST/GetRequisition'; const GET_PRESCRIPTION_LIST = diff --git a/lib/core/service/sickleave_service.dart b/lib/core/service/sickleave_service.dart index cd0dbf50..1b9e12ac 100644 --- a/lib/core/service/sickleave_service.dart +++ b/lib/core/service/sickleave_service.dart @@ -170,4 +170,20 @@ class SickLeaveService extends BaseService { body: {"ClinicID": 1}, ); } + + addReschedule(request) async { + hasError = false; + + await baseAppClient.post( + ADD_RESCHDEULE, + onSuccess: (dynamic response, int statusCode) { + Future.value(response); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: request, + ); + } } diff --git a/lib/core/viewModel/sick_leave_view_model.dart b/lib/core/viewModel/sick_leave_view_model.dart index 7c162ad1..bbcd55a6 100644 --- a/lib/core/viewModel/sick_leave_view_model.dart +++ b/lib/core/viewModel/sick_leave_view_model.dart @@ -95,4 +95,14 @@ class SickLeaveViewModel extends BaseViewModel { } else setState(ViewState.Idle); } + + Future addReschedule(request) async { + setState(ViewState.Busy); + await _sickLeaveService.addReschedule(request); + if (_sickLeaveService.hasError) { + error = _sickLeaveService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } diff --git a/lib/screens/reschedule-leaves/reschedule_leave.dart b/lib/screens/reschedule-leaves/reschedule_leave.dart index 9ed6dae7..9ac2cf77 100644 --- a/lib/screens/reschedule-leaves/reschedule_leave.dart +++ b/lib/screens/reschedule-leaves/reschedule_leave.dart @@ -1,3 +1,4 @@ +import 'package:date_time_picker/date_time_picker.dart'; import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; @@ -34,16 +35,24 @@ class RescheduleLeaveScreen extends StatefulWidget { class _RescheduleLeaveScreen extends State { DrAppSharedPreferances sharedPref = new DrAppSharedPreferances(); TextEditingController _toDateController = new TextEditingController(); + TextEditingController _toDateController2 = new TextEditingController(); ProjectViewModel projectsProvider; String _selectedClinic; Map profile = {}; - AddSickLeaveRequest addSickLeave = AddSickLeaveRequest(); + var offTime = '2'; + var date; + var doctorID; + var reason; + var fromDate; + var toDate; + TextEditingController _controller4; + // AddSickLeaveRequest addSickLeave = AddSickLeaveRequest(); void _presentDatePicker(id) { showDatePicker( context: context, initialDate: DateTime.now(), - firstDate: DateTime(2019), - lastDate: DateTime.now(), + firstDate: DateTime.now(), + lastDate: DateTime(2050), ).then((pickedDate) { if (pickedDate == null) { return; @@ -51,9 +60,16 @@ class _RescheduleLeaveScreen extends State { setState(() { // var selectedDate = DateFormat.yMd().format(pickedDate); final df = new DateFormat('yyyy-MM-dd'); - addSickLeave.startDate = df.format(pickedDate); - _toDateController.text = addSickLeave.startDate; + //addSickLeave.startDate; + + if (id == 'fromDate') { + fromDate = pickedDate; //df.format(); + _toDateController.text = df.format(pickedDate); + } else { + toDate = pickedDate; // + _toDateController2.text = df.format(pickedDate); + } //addSickLeave.startDate = selectedDate; }); }); @@ -223,8 +239,10 @@ class _RescheduleLeaveScreen extends State { child: DropdownButton( focusColor: Colors.grey, isExpanded: true, - value: model2.allOffTime[0] - ['code'], + value: offTime == null + ? model2.allOffTime[0] + ['code'] + : offTime, iconSize: 40, elevation: 16, selectedItemBuilder: @@ -248,7 +266,18 @@ class _RescheduleLeaveScreen extends State { ); }).toList(); }, - onChanged: (newValue) => {}, + onChanged: (newValue) => { + setState(() { + offTime = newValue; + }), + if (offTime == '1') + {model2.getReasons(18)} + else if (offTime == '2') + {model2.getReasons(19)} + else if (offTime == '3' || + offTime == '5') + {model2.getReasons(102)} + }, items: model2.allOffTime .map((item) { return DropdownMenuItem< @@ -270,88 +299,215 @@ class _RescheduleLeaveScreen extends State { ], ), )), - Container( - margin: EdgeInsets.all(8), - decoration: BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(6.0)), - border: Border.all( - width: 1.0, - color: HexColor("#CCCCCC"))), - padding: EdgeInsets.all(5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppTextFormField( - hintText: TranslationBase.of(context) - .fromDate, - borderColor: Colors.white, - prefix: IconButton( - icon: Icon(Icons.calendar_today)), - textInputType: TextInputType.number, - controller: _toDateController, - onTap: () { - _presentDatePicker('_selectedToDate'); - }, - inputFormatter: ONLY_DATE, - onChanged: (value) { - addSickLeave.startDate = value; - }), - ], - )), + offTime == '1' + ? Column( + children: [ + Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + AppTextFormField( + hintText: TranslationBase.of( + context) + .fromDate, + borderColor: Colors.white, + prefix: IconButton( + icon: Icon(Icons + .calendar_today)), + textInputType: + TextInputType.number, + controller: _toDateController, + onTap: () { + _presentDatePicker( + 'fromDate'); + }, + inputFormatter: ONLY_DATE, + onChanged: (value) { + fromDate = value; + }), + ], + )), + Row( + children: [ + Expanded( + child: Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: + HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + // new AppTextFormField( + // readOnly: true, + // hintText: "", + // borderColor: Colors.white, + // onSaved: (value) {}, + // inputFormatter: ONLY_NUMBERS), - Row( - children: [ - Expanded( - child: Container( - margin: EdgeInsets.all(8), - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(6.0)), - border: Border.all( - width: 1.0, - color: HexColor("#CCCCCC"))), - padding: EdgeInsets.all(5), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - new AppTextFormField( - readOnly: true, - hintText: "", - borderColor: Colors.white, - onSaved: (value) {}, - inputFormatter: ONLY_NUMBERS), - ], - ), - ), - ), - Expanded( - child: Container( - margin: EdgeInsets.all(8), - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(6.0)), - border: Border.all( - width: 1.0, - color: HexColor("#CCCCCC"))), - padding: EdgeInsets.all(5), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - new AppTextFormField( - readOnly: true, - hintText: "", - borderColor: Colors.white, - onSaved: (value) {}, - inputFormatter: ONLY_NUMBERS), - ], - ), + DateTimePicker( + type: + DateTimePickerType.time, + controller: _controller4, + //initialValue: _initialValue, + // icon: Icon(Icons.access_time), + + //use24HourFormat: false, + //locale: Locale('en', 'US'), + onChanged: (val) => () { + print(val); + }, + validator: (val) { + print(val); + // setState( + // () => _valueToValidate4 = val); + return null; + }, + onSaved: (val) => {}, + ) + ], + ), + ), + ), + Expanded( + child: Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: + BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: + HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + DateTimePicker( + type: + DateTimePickerType.time, + controller: _controller4, + //initialValue: _initialValue, + // icon: Icon(Icons.access_time), + + //use24HourFormat: false, + //locale: Locale('en', 'US'), + onChanged: (val) => () { + print(val); + }, + validator: (val) { + print(val); + // setState( + // () => _valueToValidate4 = val); + return null; + }, + onSaved: (val) => + {print(val)}, + ) + ], + ), + ), + ) + ], + ) + ], + ) + : Column( + children: [ + Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + AppTextFormField( + hintText: TranslationBase.of( + context) + .fromDate, + borderColor: Colors.white, + prefix: IconButton( + icon: Icon(Icons + .calendar_today)), + textInputType: + TextInputType.number, + controller: _toDateController, + onTap: () { + _presentDatePicker( + 'fromDate'); + }, + inputFormatter: ONLY_DATE, + onChanged: (value) { + setState(() { + toDate = value; + }); + }), + ], + )), + Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular(6.0)), + border: Border.all( + width: 1.0, + color: HexColor("#CCCCCC"))), + padding: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + AppTextFormField( + hintText: TranslationBase + .of(context) + .fromDate, + borderColor: Colors.white, + prefix: IconButton( + icon: Icon( + Icons + .calendar_today)), + textInputType: + TextInputType.number, + controller: + _toDateController2, + onTap: () { + _presentDatePicker( + 'toDate'); + }, + inputFormatter: ONLY_DATE, + onChanged: (value) { + setState(() { + toDate = value; + }); + }), + ], + )) + ], ), - ) - ], - ), Container( margin: EdgeInsets.all(8), decoration: BoxDecoration( @@ -382,9 +538,11 @@ class _RescheduleLeaveScreen extends State { child: DropdownButton( focusColor: Colors.grey, isExpanded: true, - value: model2.allReasons[0] - ['id'] - .toString(), + value: reason == null + ? model2.allReasons[0] + ['id'] + .toString() + : reason, iconSize: 40, elevation: 16, selectedItemBuilder: @@ -412,7 +570,11 @@ class _RescheduleLeaveScreen extends State { ); }).toList(); }, - onChanged: (newValue) => {}, + onChanged: (newValue) => { + setState(() { + reason = newValue; + }) + }, items: model2.allReasons .map((item) { return DropdownMenuItem< @@ -468,10 +630,12 @@ class _RescheduleLeaveScreen extends State { child: DropdownButton( focusColor: Colors.grey, isExpanded: true, - value: model2 - .coveringDoctors[0] - ['doctorID'] - .toString(), + value: doctorID == null + ? model2 + .coveringDoctors[0] + ['doctorID'] + .toString() + : doctorID, iconSize: 40, elevation: 16, selectedItemBuilder: @@ -500,7 +664,11 @@ class _RescheduleLeaveScreen extends State { ); }).toList(); }, - onChanged: (newValue) => {}, + onChanged: (newValue) => { + setState(() { + doctorID = newValue; + }) + }, items: model2 .coveringDoctors .map((item) { @@ -536,7 +704,9 @@ class _RescheduleLeaveScreen extends State { children: [ AppButton( title: TranslationBase.of(context).add, - onPressed: () {}, + onPressed: () { + addRecheduleLeave(model2); + }, ), ], ), @@ -569,4 +739,38 @@ class _RescheduleLeaveScreen extends State { model.clinicsList.where((i) => i['ClinicID'] == clinicID).toList(); return clinicInfo.length > 0 ? clinicInfo[0]['ClinicDescription'] : ""; } + + addRecheduleLeave(model) { + final df = new DateFormat('yyyy-MM-ddThh:mm:ss'); + Map request = { + "Requisition": { + "requisitionNo": 0, + "requisitionType": offTime, + "clinicId": this.profile['ClinicID'], + "doctorId": this.profile['ClinicID'], + "dateTimeFrom": df.format(fromDate), + "dateTimeTo": df.format(toDate), + "date": df.format(DateTime.now()), + "reasonId": reason == null ? model.allOffTime[0]['code'] : reason, + "coveringDoctorId": + doctorID == null ? model.coveringDoctors[0]['doctorID'] : doctorID, + "status": 2, + "schedule": [ + { + "weekDayId": 1, + "shiftId": 1, + "isOpen": true, + "timeFrom": null, + "timeTo": null, + "timeFromstr": "", + "timeTostr": "" + } + ] + } + }; + + model.addReschedule(request).then((response) { + print(response); + }); + } } diff --git a/pubspec.yaml b/pubspec.yaml index e15a7182..3f66989b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -62,7 +62,7 @@ dependencies: #Autocomplete TextField autocomplete_textfield: ^1.7.3 - + date_time_picker: ^1.1.1 #speech to text From 9bf07d71175af6d5df9151494ece331411c00793 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sat, 2 Jan 2021 20:22:02 +0300 Subject: [PATCH 12/18] reschedule leave --- lib/config/config.dart | 2 + lib/config/localized_values.dart | 15 +- lib/core/service/sickleave_service.dart | 20 +- lib/core/viewModel/sick_leave_view_model.dart | 14 +- .../add-rescheduleleave.dart | 15 +- .../reschedule-leaves/reschedule_leave.dart | 59 +++- lib/screens/sick-leave/add-sickleave.dart | 309 +++++++++--------- lib/screens/sick-leave/sick_leave.dart | 30 +- lib/util/translations_delegate_base.dart | 7 + 9 files changed, 293 insertions(+), 178 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 7f5e878e..359d458d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -112,6 +112,8 @@ const GET_OFFTIME = 'Services/DoctorApplication.svc/REST/GetMasterLookUpList'; const GET_COVERING_DOCTORS = 'Services/DoctorApplication.svc/REST/GetCoveringDoctor'; const ADD_RESCHDEULE = 'Services/DoctorApplication.svc/REST/PostRequisition'; +const UPDATE_RESCHDEULE = + 'Services/DoctorApplication.svc/REST/PatchRequisition'; const GET_RESCHEDULE_LEAVE = 'Services/DoctorApplication.svc/REST/GetRequisition'; const GET_PRESCRIPTION_LIST = diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 127ee975..a78f77fa 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -389,5 +389,18 @@ const Map> localizedValues = { 'holiday': {'en': "Holiday", 'ar': 'يوم الاجازة'}, 'to': {'en': "To", 'ar': 'إلى'}, 'coveringDoctor': {'en': "Covering Doctor", 'ar': 'تغطية دكتور'}, - 'requestLeave': {'en': 'Request Leave', 'ar': 'طلب إجازة'} + 'requestLeave': {'en': 'Request Leave', 'ar': 'طلب إجازة'}, + 'pleaseEnterDate': { + 'en': 'Please enter leave start date', + 'ar': 'الرجاء إدخال تاريخ بدء الإجازة' + }, + 'pleaseEnterNoOfDays': { + 'en': 'Please enter sick leave days', + 'ar': 'الرجاء إدخال أيام الإجازة المرضية' + }, + 'pleaseEnterRemarks': { + 'en': 'Please enter remarks', + 'ar': 'الرجاء إدخال الملاحظات' + }, + 'update': {'en': 'Update', 'ar': 'تحديث'} }; diff --git a/lib/core/service/sickleave_service.dart b/lib/core/service/sickleave_service.dart index 1b9e12ac..13e36d3b 100644 --- a/lib/core/service/sickleave_service.dart +++ b/lib/core/service/sickleave_service.dart @@ -82,7 +82,7 @@ class SickLeaveService extends BaseService { ); } - Future getSickLeave() async { + Future getSickLeave(patientMRN) async { hasError = false; await baseAppClient.post( GET_SICK_LEAVE, @@ -97,7 +97,7 @@ class SickLeaveService extends BaseService { hasError = true; super.error = error; }, - body: {'PatientMRN': 3120772}, + body: {'PatientMRN': patientMRN}, ); } @@ -186,4 +186,20 @@ class SickLeaveService extends BaseService { body: request, ); } + + updateReschedule(request) async { + hasError = false; + + await baseAppClient.post( + UPDATE_RESCHDEULE, + onSuccess: (dynamic response, int statusCode) { + Future.value(response); + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: request, + ); + } } diff --git a/lib/core/viewModel/sick_leave_view_model.dart b/lib/core/viewModel/sick_leave_view_model.dart index bbcd55a6..d5aba154 100644 --- a/lib/core/viewModel/sick_leave_view_model.dart +++ b/lib/core/viewModel/sick_leave_view_model.dart @@ -46,9 +46,9 @@ class SickLeaveViewModel extends BaseViewModel { setState(ViewState.Idle); } - Future getSickLeave() async { + Future getSickLeave(patientMRN) async { setState(ViewState.Busy); - await _sickLeaveService.getSickLeave(); + await _sickLeaveService.getSickLeave(patientMRN); if (_sickLeaveService.hasError) { error = _sickLeaveService.error; setState(ViewState.Error); @@ -105,4 +105,14 @@ class SickLeaveViewModel extends BaseViewModel { } else setState(ViewState.Idle); } + + Future updateReschedule(request) async { + setState(ViewState.Busy); + await _sickLeaveService.updateReschedule(request); + if (_sickLeaveService.hasError) { + error = _sickLeaveService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } diff --git a/lib/screens/reschedule-leaves/add-rescheduleleave.dart b/lib/screens/reschedule-leaves/add-rescheduleleave.dart index 79b47523..c48eee79 100644 --- a/lib/screens/reschedule-leaves/add-rescheduleleave.dart +++ b/lib/screens/reschedule-leaves/add-rescheduleleave.dart @@ -175,8 +175,8 @@ class AddRescheduleLeavScreen extends StatelessWidget { ), // color: Colors.green, //Colors.black, onPressed: () => { - // openSickLeave(context, true, - // extendedData: item) + openLeave(context, true, + extendedData: item) }, )) : SizedBox(), @@ -239,18 +239,15 @@ class AddRescheduleLeavScreen extends StatelessWidget { )); } - openLeave(BuildContext context, isExtend, - {GetAllSickLeaveResponse extendedData}) { + openLeave(BuildContext context, isExtend, {extendedData}) { showModalBottomSheet( context: context, builder: (context) { return new Container( child: RescheduleLeaveScreen( - // appointmentNo: extendedData.appointmentNo, - // patientMRN: extendedData.patientMRN, - // isExtended: isExtend, - // extendedData: extendedData, - )); + isExtend, + extendedData, + )); }); } diff --git a/lib/screens/reschedule-leaves/reschedule_leave.dart b/lib/screens/reschedule-leaves/reschedule_leave.dart index 9ac2cf77..1a807392 100644 --- a/lib/screens/reschedule-leaves/reschedule_leave.dart +++ b/lib/screens/reschedule-leaves/reschedule_leave.dart @@ -27,7 +27,9 @@ import 'package:provider/provider.dart'; Helpers helpers = Helpers(); class RescheduleLeaveScreen extends StatefulWidget { - RescheduleLeaveScreen(); + final isUpdate; + final updateData; + RescheduleLeaveScreen(this.isUpdate, this.updateData); @override _RescheduleLeaveScreen createState() => _RescheduleLeaveScreen(); } @@ -45,8 +47,8 @@ class _RescheduleLeaveScreen extends State { var reason; var fromDate; var toDate; + var clinicID; TextEditingController _controller4; - // AddSickLeaveRequest addSickLeave = AddSickLeaveRequest(); void _presentDatePicker(id) { showDatePicker( context: context, @@ -58,11 +60,7 @@ class _RescheduleLeaveScreen extends State { return; } setState(() { - // var selectedDate = DateFormat.yMd().format(pickedDate); final df = new DateFormat('yyyy-MM-dd'); - - //addSickLeave.startDate; - if (id == 'fromDate') { fromDate = pickedDate; //df.format(); _toDateController.text = df.format(pickedDate); @@ -70,7 +68,6 @@ class _RescheduleLeaveScreen extends State { toDate = pickedDate; // _toDateController2.text = df.format(pickedDate); } - //addSickLeave.startDate = selectedDate; }); }); } @@ -703,9 +700,15 @@ class _RescheduleLeaveScreen extends State { alignment: WrapAlignment.center, children: [ AppButton( - title: TranslationBase.of(context).add, + title: widget.isUpdate == true + ? TranslationBase.of(context).update + : TranslationBase.of(context).add, onPressed: () { - addRecheduleLeave(model2); + if (widget.isUpdate == true) { + updateRecheduleLeave(model2); + } else { + addRecheduleLeave(model2); + } }, ), ], @@ -730,6 +733,10 @@ class _RescheduleLeaveScreen extends State { Map p = await sharedPref.getObj(DOCTOR_PROFILE); setState(() { this.profile = p; + this.clinicID = widget.updateData.clinicId; + + _toDateController.text = widget.updateData.dateTimeFrom; + _toDateController2.text = widget.updateData.dateTimeTo; }); } @@ -773,4 +780,38 @@ class _RescheduleLeaveScreen extends State { print(response); }); } + + updateRecheduleLeave(model) { + final df = new DateFormat('yyyy-MM-ddThh:mm:ss'); + Map request = { + "Requisition": { + "requisitionNo": 0, + "requisitionType": offTime, + "clinicId": this.profile['ClinicID'], + "doctorId": this.profile['ClinicID'], + "dateTimeFrom": df.format(fromDate), + "dateTimeTo": df.format(toDate), + "date": df.format(DateTime.now()), + "reasonId": reason == null ? model.allOffTime[0]['code'] : reason, + "coveringDoctorId": + doctorID == null ? model.coveringDoctors[0]['doctorID'] : doctorID, + "status": 2, + "schedule": [ + { + "weekDayId": 1, + "shiftId": 1, + "isOpen": true, + "timeFrom": null, + "timeTo": null, + "timeFromstr": "", + "timeTostr": "" + } + ] + } + }; + + model.updateReschedule(request).then((response) { + print(response); + }); + } } diff --git a/lib/screens/sick-leave/add-sickleave.dart b/lib/screens/sick-leave/add-sickleave.dart index 37bf9454..d456f2a6 100644 --- a/lib/screens/sick-leave/add-sickleave.dart +++ b/lib/screens/sick-leave/add-sickleave.dart @@ -2,10 +2,12 @@ import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; +import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/sick-leave/sick_leave.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/card_with_bgNew_widget.dart'; @@ -13,166 +15,167 @@ import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; class AddSickLeavScreen extends StatelessWidget { + PatiantInformtion patient; @override Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + patient = routeArgs['patient']; return BaseView( - onModelReady: (model) => model.getSickLeave(), + onModelReady: (model) => model.getSickLeave(patient.patientMRN), builder: (_, model, w) => AppScaffold( - baseViewModel: model, - appBarTitle: TranslationBase.of(context).sickleave, - body: model.getAllSIckLeave.length > 0 - ? SingleChildScrollView( - child: Column( - children: model.getAllSIckLeave - .map((GetAllSickLeaveResponse item) { - return CardWithBgWidgetNew( - widget: Column( - children: [ - Container( - padding: EdgeInsets.only(left: 10, right: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 4, - child: Wrap( - // mainAxisAlignment: - // MainAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Container( - padding: EdgeInsets.all(3), - child: AppText( - item.status == 1 - ? TranslationBase.of( - context) - .approved - : item.status == 2 - ? TranslationBase - .of(context) - .extended - : TranslationBase - .of(context) - .pending, - fontWeight: FontWeight.bold, - color: Colors.white, - ), - color: item.status == 1 - ? Colors.green - : Colors.yellow[800], - ), - Row( - children: [ - AppText( - TranslationBase.of( - context) - .leaveStartDate + - ' ', - fontWeight: - FontWeight.bold, - ), - Flexible( - child: Text( - item.startDate, - overflow: - TextOverflow.ellipsis, - )) - ], - ), - AppText( - item.noOfDays.toString() + - ' ' + - TranslationBase.of( + baseViewModel: model, + appBarTitle: TranslationBase.of(context).sickleave, + body: SingleChildScrollView( + child: Column(children: [ + PatientPageHeaderWidget(patient), + model.getAllSIckLeave.length > 0 + ? Column( + children: model.getAllSIckLeave + .map((GetAllSickLeaveResponse item) { + return CardWithBgWidgetNew( + widget: Column( + children: [ + Container( + padding: EdgeInsets.only(left: 10, right: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 4, + child: Wrap( + // mainAxisAlignment: + // MainAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(3), + child: AppText( + item.status == 1 + ? TranslationBase.of( context) - .daysSickleave, + .approved + : item.status == 2 + ? TranslationBase.of( + context) + .extended + : TranslationBase.of( + context) + .pending, fontWeight: FontWeight.bold, + color: Colors.white, ), - Row(children: [ + color: item.status == 1 + ? Colors.green + : Colors.yellow[800], + ), + Row( + children: [ AppText( - item.remarks, - ) - ]), - ], - ), - SizedBox( - width: 20, - ), - ], - ), + TranslationBase.of(context) + .leaveStartDate + + ' ', + fontWeight: FontWeight.bold, + ), + Flexible( + child: Text( + item.startDate, + overflow: + TextOverflow.ellipsis, + )) + ], + ), + AppText( + item.noOfDays.toString() + + ' ' + + TranslationBase.of(context) + .daysSickleave, + fontWeight: FontWeight.bold, + ), + Row(children: [ + AppText( + item.remarks, + ) + ]), + ], + ), + SizedBox( + width: 20, + ), + ], ), - (item.status == 1 || item.status == 2) - ? Expanded( - flex: 1, - child: IconButton( - icon: Icon( - Icons.open_in_full, - size: 40, - ), - // color: Colors.green, //Colors.black, - onPressed: () => { - openSickLeave(context, true, - extendedData: item) - }, - )) - : SizedBox(), - ], - )), - SizedBox( - height: 20, + ), + (item.status == 1 || item.status == 2) + ? Expanded( + flex: 1, + child: IconButton( + icon: Icon( + Icons.open_in_full, + size: 25, + ), + // color: Colors.green, //Colors.black, + onPressed: () => { + openSickLeave(context, true, + extendedData: item) + }, + )) + : SizedBox(), + ], + )), + SizedBox( + height: 20, + ), + Divider( + height: 1, + ), + ], + )); + }).toList(), + ) + : new Builder(builder: (context) { + return Container( + height: MediaQuery.of(context).size.height * .7, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.all(40), + decoration: BoxDecoration( + border: Border.all( + color: HexColor('#B8382C'), width: 4), + borderRadius: + BorderRadius.all(Radius.circular(100))), + child: IconButton( + icon: Icon( + Icons.add, + size: 35, + ), + onPressed: () { + openSickLeave( + context, + false, + ); + }), ), - Divider( - height: 1, + Padding( + child: AppText( + TranslationBase.of(context) + .noSickLeaveApplied, + fontWeight: FontWeight.bold, + ), + padding: EdgeInsets.all(10), ), + AppText( + TranslationBase.of(context).applyNow, + fontWeight: FontWeight.bold, + color: HexColor('#B8382C'), + ) ], )); - }).toList(), - ), - ) - : new Builder(builder: (context) { - return Center( - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: EdgeInsets.all(40), - decoration: BoxDecoration( - border: Border.all( - color: HexColor('#B8382C'), width: 4), - borderRadius: - BorderRadius.all(Radius.circular(100))), - child: IconButton( - icon: Icon( - Icons.add, - size: 35, - ), - onPressed: () { - openSickLeave( - context, - false, - ); - }), - ), - Padding( - child: AppText( - TranslationBase.of(context).noSickLeaveApplied, - fontWeight: FontWeight.bold, - ), - padding: EdgeInsets.all(10), - ), - AppText( - TranslationBase.of(context).applyNow, - fontWeight: FontWeight.bold, - color: HexColor('#B8382C'), - ) - ], - ), - )); }), - )); + ])))); } openSickLeave(BuildContext context, isExtend, @@ -182,11 +185,15 @@ class AddSickLeavScreen extends StatelessWidget { builder: (context) { return new Container( child: SickLeaveScreen( - appointmentNo: extendedData.appointmentNo, - patientMRN: extendedData.patientMRN, - isExtended: isExtend, - extendedData: extendedData, - )); + appointmentNo: isExtend == true + ? extendedData.appointmentNo + : patient.appointmentNo, //extendedData.appointmentNo, + patientMRN: isExtend == true + ? extendedData.patientMRN + : patient.patientMRN, + isExtended: isExtend, + extendedData: extendedData, + patient: patient)); }); } } diff --git a/lib/screens/sick-leave/sick_leave.dart b/lib/screens/sick-leave/sick_leave.dart index 026b7c19..caef49ee 100644 --- a/lib/screens/sick-leave/sick_leave.dart +++ b/lib/screens/sick-leave/sick_leave.dart @@ -6,9 +6,11 @@ import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:doctor_app_flutter/models/sickleave/add_sickleave_request.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart'; +import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/text_validator.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; import 'package:doctor_app_flutter/widgets/shared/Text.dart'; import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; @@ -28,11 +30,13 @@ class SickLeaveScreen extends StatefulWidget { final GetAllSickLeaveResponse extendedData; final appointmentNo; final patientMRN; + final patient; SickLeaveScreen( {this.appointmentNo, this.patientMRN, this.isExtended = false, - this.extendedData}); + this.extendedData, + this.patient}); @override _SickLeaveScreenState createState() => _SickLeaveScreenState(); } @@ -252,6 +256,7 @@ class _SickLeaveScreenState extends State { model2.sickLeaveStatistics[ 'recommendedSickLeaveDays'], fontWeight: FontWeight.bold, + textAlign: TextAlign.start, ), padding: EdgeInsets.all(10), ) @@ -339,9 +344,7 @@ class _SickLeaveScreenState extends State { print(value); }); } else { - model2 - .addSickLeave(addSickLeave) - .then((value) => print(value)); + _validateInputs(model2); } }, ), @@ -363,6 +366,25 @@ class _SickLeaveScreenState extends State { ))); } + void _validateInputs(model2) async { + try { + if (addSickLeave.noOfDays == null) { + DrAppToastMsg.showErrorToast( + TranslationBase.of(context).pleaseEnterNoOfDays); + } else if (addSickLeave.remarks == null) { + DrAppToastMsg.showErrorToast( + TranslationBase.of(context).pleaseEnterRemarks); + } else if (addSickLeave.startDate == null) { + DrAppToastMsg.showErrorToast( + TranslationBase.of(context).pleaseEnterDate); + } else { + model2.addSickLeave(addSickLeave).then((value) => print(value)); + } + } catch (err) { + print(err); + } + } + getProfile() async { Map p = await sharedPref.getObj(DOCTOR_PROFILE); setState(() { diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 6126912e..4e94b746 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -430,6 +430,13 @@ class TranslationBase { localizedValues['coveringDoctor'][locale.languageCode]; String get requestLeave => localizedValues['requestLeave'][locale.languageCode]; + String get pleaseEnterDate => + localizedValues['pleaseEnterDate'][locale.languageCode]; + String get pleaseEnterNoOfDays => + localizedValues['pleaseEnterNoOfDays'][locale.languageCode]; + String get pleaseEnterRemarks => + localizedValues['pleaseEnterRemarks'][locale.languageCode]; + String get update => localizedValues['update'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { From e65740761ae71dd50ff9032f4980777eed7b615e Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sat, 2 Jan 2021 19:45:48 +0200 Subject: [PATCH 13/18] add improvement on create episode --- assets/images/create-episod.png | Bin 0 -> 651 bytes assets/images/modilfy-episode.png | Bin 0 -> 987 bytes lib/client/base_app_client.dart | 11 ++-- lib/screens/patients/patients_screen.dart | 52 +++++++++--------- .../profile/patient_profile_widget.dart | 3 +- .../profile/profile_medical_info_widget.dart | 9 ++- .../subjective/update_allergies_widget.dart | 12 +++- .../subjective/update_history_widget.dart | 9 ++- .../subjective/update_subjective_page.dart | 2 +- .../soap_update/update_assessment_page.dart | 21 ++++--- .../soap_update/update_objective_page.dart | 4 +- 11 files changed, 73 insertions(+), 50 deletions(-) create mode 100644 assets/images/create-episod.png create mode 100644 assets/images/modilfy-episode.png diff --git a/assets/images/create-episod.png b/assets/images/create-episod.png new file mode 100644 index 0000000000000000000000000000000000000000..02386fd1503c7628aa933022bf219d2fe5c4e6e4 GIT binary patch literal 651 zcmeAS@N?(olHy`uVBq!ia0vp^sz7YO!3HF!wQkl1QjEnx?oJHr&dIz4ax79KJkxxA z8MJ_G4hF{dOa>N^5+IfWVg?4L1x#=e)dkFOwgE^|n!)-wPzj@_i(^Ox=i7+afrlIf z+>ZZW!t6bP&x2D_QS}C6$pYC1*$a&6>=BG*32PYkw??O#?>s9jA!nbLKCRaN)6+>a z4WweHX>Iw>_?~IcjyD;*e`{^%i7|-yDe{HyxsJC>~f+<#Fb%3bi#TEJ=R_2i^JmL$)T z#^je7FLS?`cL>X`Y*SlbP}w6R!hZ1Mrw3jCtWpYi)!S=iZhPAWo9Z}qycB8Kk!Ikz zeLd6ZR;e4&A9!?LMoOi>$d3O!DM*|DD<7+-jb~=hoX{onZ>pto&fIKhUCJyP!y9qU zdv7%3`DXnE55#{=ox*W3$mB&#k;a@~Nwe-N{`6YlxNdSGGrN7QxkPUN8Sk4nUU;~9 zJx+|4)RdN%J?W8YlcTMin!H$9QnR-`H+4x)PKk>0(vKU~_Dt#R?Mqo=BDZbo#7!G7 zPTcL{Ro8RrzsH}atHR~4z52aB%ignY8^5*H+UO6P=jPqdkNW!{@>$HTTGbs=H7R=* cZVvj#u<`f>>$%*!Zh;bor>mdKI;Vst09o1y#sB~S literal 0 HcmV?d00001 diff --git a/assets/images/modilfy-episode.png b/assets/images/modilfy-episode.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdd224f02e9bdca5090677c626d31f99b80e428 GIT binary patch literal 987 zcmV<110?*3P)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91D4+uX z1ONa40RR91D*ylh03MD$MgRZ@l!i!j`v?s z^G(8Ui0!L<@MoL54dNZR1pj~zUV~iv0Dc2$LNFv(Iv}nyL#dqV6Qy#yST$62k0xk} zXhGHEleAD*-%+cAE~F~;>oQkEI3eU3{s~{sOs|``L zsm*bP=lP6PkeLLvfjZA&4&y&=kpJq>ZSE+8r!aT4!MR>5jR}r~4})=3*cUBmYkq;=T?WP?h37Ds#*F<}{l9I~Db)!?Co%v4002ov JPDHLkV1grMxn=+W literal 0 HcmV?d00001 diff --git a/lib/client/base_app_client.dart b/lib/client/base_app_client.dart index ff9d957d..75894465 100644 --- a/lib/client/base_app_client.dart +++ b/lib/client/base_app_client.dart @@ -82,12 +82,11 @@ class BaseAppClient { onFailure('Error While Fetching data', statusCode); } else { var parsed = json.decode(response.body.toString()); - // if (!parsed['IsAuthenticated']) { - // // TODO: return it back when IsAuthenticated work fine in all service - // // await helpers.logout(); - // - // helpers.showErrorToast('Your session expired Please login agian'); - // } else + if (!parsed['IsAuthenticated']) { + // TODO: return it back when IsAuthenticated work fine in all service + await helpers.logout(); + helpers.showErrorToast('Your session expired Please login agian'); + } else if (parsed['MessageStatus'] == 1) { if (!parsed['IsAuthenticated']) onFailure(getError(parsed), statusCode); diff --git a/lib/screens/patients/patients_screen.dart b/lib/screens/patients/patients_screen.dart index 74c9234c..33b2606c 100644 --- a/lib/screens/patients/patients_screen.dart +++ b/lib/screens/patients/patients_screen.dart @@ -274,34 +274,35 @@ class _PatientsScreenState extends State { .then((res) { setState(() { _isLoading = false; - // if (res['MessageStatus'] == 1) { - if (val2 == 7) { - print("Assad"); - if (res[SERVICES_PATIANT2[val2]] == null) { - _isError = true; - _isLoading = false; - this.error = error.toString(); + if (res['MessageStatus'] == 1) { + if (val2 == 7) { + if (res[SERVICES_PATIANT2[val2]] == null) { + _isError = true; + _isLoading = false; + this.error = error.toString(); + } else { + var localList = []; + res["patientArrivalList"]["entityList"].forEach((v) { + Map mergedPatient = { + ...v, + ...v["patientDetails"] + }; + localList.add(mergedPatient); + }); + print(localList.toString()); + lItems = localList; + } } else { - - var localList=[]; - res["patientArrivalList"]["entityList"].forEach((v) { - Map mergedPatient= {...v,...v["patientDetails"]}; - localList.add(mergedPatient); - }); - print(localList.toString()); - lItems = localList;//res[SERVICES_PATIANT2[val2]]["entityList"]; + lItems = res[SERVICES_PATIANT2[val2]]; } + parsed = lItems; + responseModelList = new ModelResponse.fromJson(parsed).list; + responseModelList2 = responseModelList; + _isError = false; } else { - lItems = res[SERVICES_PATIANT2[val2]]; + _isError = true; + error = res['ErrorEndUserMessage'] ?? res['ErrorMessage']; } - parsed = lItems; - responseModelList = new ModelResponse.fromJson(parsed).list; - responseModelList2 = responseModelList; - _isError = false; - // } else { - // _isError = true; - // error = res['ErrorEndUserMessage'] ?? res['ErrorMessage']; - // } }); }).catchError((error) { setState(() { @@ -679,7 +680,8 @@ class _PatientsScreenState extends State { .pushNamed( PATIENTS_PROFILE, arguments: { - "patient": item + "patient": item, + "patientType":patientType }); }, ), diff --git a/lib/widgets/patients/profile/patient_profile_widget.dart b/lib/widgets/patients/profile/patient_profile_widget.dart index 792eb49e..f50c7669 100644 --- a/lib/widgets/patients/profile/patient_profile_widget.dart +++ b/lib/widgets/patients/profile/patient_profile_widget.dart @@ -22,6 +22,7 @@ class PatientProfileWidget extends StatelessWidget { Widget build(BuildContext context) { final routeArgs = ModalRoute.of(context).settings.arguments as Map; patient = routeArgs['patient']; + String patientType = routeArgs['patientType']; return Container( color: Color(0XFFF2F2F2), @@ -437,7 +438,7 @@ class PatientProfileWidget extends StatelessWidget { SliverPadding( padding: const EdgeInsets.all(16.0), sliver: ProfileMedicalInfoWidget( - patient: patient, + patient: patient, patientType:patientType )) ]), ); diff --git a/lib/widgets/patients/profile/profile_medical_info_widget.dart b/lib/widgets/patients/profile/profile_medical_info_widget.dart index 468a1b9d..886b2c9d 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget.dart @@ -18,8 +18,9 @@ import 'PatientProfileButton.dart'; *@desc: Profile Medical Info Widget */ class ProfileMedicalInfoWidget extends StatelessWidget { - ProfileMedicalInfoWidget({Key key, this.patient}) : super(key: key); + ProfileMedicalInfoWidget({Key key, this.patient, this.patientType}); PatiantInformtion patient; + String patientType; @override Widget build(BuildContext context) { return SliverGrid.count( @@ -28,20 +29,22 @@ class ProfileMedicalInfoWidget extends StatelessWidget { crossAxisCount: 2, childAspectRatio: 1.5, children: [ + if(int.parse(patientType) ==7) PatientProfileButton( key: key, patient: patient, nameLine1: "Create New", nameLine2: "Episode", route: CREATE_EPISODE, - icon: 'heartbeat.png'), + icon: 'create-episod.png'), + if(int.parse(patientType) ==7) PatientProfileButton( key: key, patient: patient, nameLine1: "Update", nameLine2: "Episode", route: UPDATE_EPISODE, - icon: 'heartbeat.png'), + icon: 'modilfy-episode.png'), PatientProfileButton( key: key, patient: patient, diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart b/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart index fa6b8acb..f03025ae 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart @@ -70,13 +70,21 @@ class _UpdateAllergiesWidgetState extends State { children: widget.myAllergiesList.map((selectedAllergy) { return Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts(selectedAllergy.selectedAllergy.nameEn.toUpperCase(), - variant: "bodyText", bold: true, color: Colors.black), + Container( + + child: Expanded( + child: Texts(selectedAllergy.selectedAllergy.nameEn.toUpperCase(), + variant: "bodyText", bold: true, color: Colors.black), + ), + width: MediaQuery.of(context).size.width * 0.5, + ), Texts( selectedAllergy.selectedAllergySeverity.nameEn .toUpperCase(), diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart b/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart index 5e033127..f720fdfd 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart @@ -81,8 +81,13 @@ class _UpdateHistoryWidgetState extends State Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts(myHistory.nameEn, - variant: "bodyText", bold: true, color: Colors.black), + Container( + child: Expanded( + child: Texts(myHistory.nameEn, + variant: "bodyText", bold: true, color: Colors.black), + ), + width: MediaQuery.of(context).size.width * 0.7, + ), InkWell( child: Icon( FontAwesomeIcons.trash, diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart index d9828795..53007123 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart @@ -414,7 +414,7 @@ class _UpdateSubjectivePageState extends State { postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM .add(ListHisProgNotePatientAllergyDiseaseVM( allergyDiseaseId: allergy.selectedAllergy.id, - allergyDiseaseType: allergy.selectedAllergy.id, + allergyDiseaseType: allergy.selectedAllergy.typeId, patientMRN: widget.patientInfo.patientMRN, episodeId: widget.patientInfo.episodeNo, appointmentNo: widget.patientInfo.appointmentNo, diff --git a/lib/widgets/patients/profile/soap_update/update_assessment_page.dart b/lib/widgets/patients/profile/soap_update/update_assessment_page.dart index c25b0d5b..86e98e4b 100644 --- a/lib/widgets/patients/profile/soap_update/update_assessment_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_assessment_page.dart @@ -277,10 +277,13 @@ class _UpdateAssessmentPageState extends State { SizedBox( height: 6, ), - AppText( - widget.mySelectedAssessment.remark??"", - fontSize: 10, - color: Colors.grey, + Container( + width: MediaQuery.of(context).size.width * 0.5, + child: AppText( + widget.mySelectedAssessment.remark??"", + fontSize: 10, + color: Colors.grey, + ), ), ], ), @@ -298,10 +301,12 @@ class _UpdateAssessmentPageState extends State { fontWeight: FontWeight.bold, fontSize: 16, ), - AppText( - widget.mySelectedAssessment.selectedICD.code.toUpperCase()??"", - fontSize: 10, - color: Colors.grey, + Container( + child: AppText( + widget.mySelectedAssessment.selectedICD.code.trim().toUpperCase()??"", + fontSize: 10, + color: Colors.grey, + ), ), ], ) diff --git a/lib/widgets/patients/profile/soap_update/update_objective_page.dart b/lib/widgets/patients/profile/soap_update/update_objective_page.dart index 2a342542..2abdfbae 100644 --- a/lib/widgets/patients/profile/soap_update/update_objective_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_objective_page.dart @@ -304,14 +304,14 @@ class _UpdateObjectivePageState extends State { ), Container( margin: EdgeInsets.only( - left: 10, right: 10, top: 15), + left: 0, right: 0, top: 15), child: TextFields( hintText: "Remarks", fontSize: 13.5, // hintColor: Colors.black, fontWeight: FontWeight.w600, maxLines: 25, - minLines: 13, + minLines: 4, controller: remarksController, validator: (value) { if (value == null) From 6c894c3d3ba9e670c0a768c6e418a7ed5db582a4 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sat, 2 Jan 2021 20:51:07 +0300 Subject: [PATCH 14/18] sick leave --- lib/core/service/sickleave_service.dart | 4 ++-- lib/screens/sick-leave/sick_leave.dart | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/core/service/sickleave_service.dart b/lib/core/service/sickleave_service.dart index 13e36d3b..c4aa8abf 100644 --- a/lib/core/service/sickleave_service.dart +++ b/lib/core/service/sickleave_service.dart @@ -39,8 +39,8 @@ class SickLeaveService extends BaseService { } Future addSickLeave(AddSickLeaveRequest addSickLeaveRequest) async { - addSickLeaveRequest.appointmentNo = '2016054661'; - addSickLeaveRequest.patientMRN = '3120746'; + // addSickLeaveRequest.appointmentNo = '2016054661'; + // addSickLeaveRequest.patientMRN = '3120746'; hasError = false; await baseAppClient.post( ADD_SICK_LEAVE, diff --git a/lib/screens/sick-leave/sick_leave.dart b/lib/screens/sick-leave/sick_leave.dart index caef49ee..2aea6f43 100644 --- a/lib/screens/sick-leave/sick_leave.dart +++ b/lib/screens/sick-leave/sick_leave.dart @@ -52,7 +52,7 @@ class _SickLeaveScreenState extends State { context: context, initialDate: DateTime.now(), firstDate: DateTime(2019), - lastDate: DateTime.now(), + lastDate: DateTime(2050), ).then((pickedDate) { if (pickedDate == null) { return; @@ -378,6 +378,8 @@ class _SickLeaveScreenState extends State { DrAppToastMsg.showErrorToast( TranslationBase.of(context).pleaseEnterDate); } else { + addSickLeave.patientMRN = widget.patient.patientMRN.toString(); + addSickLeave.appointmentNo = widget.patient.appointmentNo.toString(); model2.addSickLeave(addSickLeave).then((value) => print(value)); } } catch (err) { From 71b50c84040a63756fdfbba38286a0959b6390db Mon Sep 17 00:00:00 2001 From: Elham Rababah Date: Sun, 3 Jan 2021 00:09:58 +0200 Subject: [PATCH 15/18] First step translations --- lib/config/localized_values.dart | 16 + lib/core/service/SOAP_service.dart | 19 +- lib/core/viewModel/SOAP_view_model.dart | 12 +- lib/routes.dart | 1 - lib/util/translations_delegate_base.dart | 18 + .../patients/profile/SOAP/add_SOAP_index.dart | 133 ---- .../profile/SOAP/assessment_page.dart | 647 ------------------ .../patients/profile/SOAP/objective_page.dart | 518 -------------- .../patients/profile/SOAP/plan_page.dart | 349 ---------- .../SOAP/subjective/add_allergies_widget.dart | 339 --------- .../SOAP/subjective/add_history_widget.dart | 360 ---------- .../subjective/add_medication_widget.dart | 107 --- .../SOAP/subjective/subjective_page.dart | 402 ----------- .../profile/profile_medical_info_widget.dart | 8 +- .../profile/soap_update/steps_widget.dart | 8 +- .../subjective/update_allergies_widget.dart | 78 ++- .../subjective/update_history_widget.dart | 20 +- .../subjective/update_subjective_page.dart | 91 ++- .../soap_update/update_assessment_page.dart | 4 +- .../soap_update/update_objective_page.dart | 4 +- .../soap_update/update_soap_index.dart | 4 - .../shared/dialogs/master_key_dailog.dart | 13 +- .../master_key_checkbox_search_widget.dart | 108 +-- 23 files changed, 263 insertions(+), 2996 deletions(-) delete mode 100644 lib/widgets/patients/profile/SOAP/add_SOAP_index.dart delete mode 100644 lib/widgets/patients/profile/SOAP/assessment_page.dart delete mode 100644 lib/widgets/patients/profile/SOAP/objective_page.dart delete mode 100644 lib/widgets/patients/profile/SOAP/plan_page.dart delete mode 100644 lib/widgets/patients/profile/SOAP/subjective/add_allergies_widget.dart delete mode 100644 lib/widgets/patients/profile/SOAP/subjective/add_history_widget.dart delete mode 100644 lib/widgets/patients/profile/SOAP/subjective/add_medication_widget.dart delete mode 100644 lib/widgets/patients/profile/SOAP/subjective/subjective_page.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index c27e8b70..85954bb0 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -415,4 +415,20 @@ const Map> localizedValues = { 'specifyPossibleLineManagement': {'en': "Specify possible line of management", 'ar': 'حدد خط الإدارة المحتمل'}, 'significantSigns': {'en': "SIGNIFICANT SIGNS", 'ar': 'علامات مهمة'}, 'backAbdomen': {'en': "Back : Abdomen", 'ar': 'الظهر: البطن'}, + 'createNew': {'en': "Create New", 'ar': 'انشاء '}, + 'episode': {'en': "Episode", 'ar': 'Episode'}, + 'update': {'en': "Update", 'ar': 'تعديل'}, + 'chiefComplaints': {'en': "Chief Complaints", 'ar': 'الشكاوى'}, + 'addChiefComplaints': {'en': "Add Chief Complaints", 'ar': ' اضافه الشكاوى'}, + 'histories': {'en': "Histories", 'ar': 'التاريخ المرضي'}, + 'allergiesSoap': {'en': "Allergies", 'ar': 'الحساسية'}, + 'historyOfPresentIllness': {'en': "History of Present Illness", 'ar': 'تاريخ المرض الحالي'}, + 'requiredMsg': {'en': "Please add required field correctly", 'ar':"الرجاء إضافة الحقل المطلوب بشكل صحيح" }, + 'addHistory': {'en': "Add History", 'ar':"اضافه تاريخ مرضي" }, + 'searchHistory': {'en': "Search History", 'ar':" البحث" }, + 'addSelectedHistories': {'en': "add selected histories", 'ar':" اضافه تاريخ مرضي" }, + 'addAllergies': {'en': "Add Allergies", 'ar':"أضف الحساسية" }, + 'itemExist': {'en': "This item already exist", 'ar':"هذا العنصر موجود" }, + 'selectAllergy': {'en': "Select Allergy", 'ar':"أختر الحساسية" }, + 'selectSeverity': {'en': "Select Severity", 'ar':"أختر الدرجه" }, }; diff --git a/lib/core/service/SOAP_service.dart b/lib/core/service/SOAP_service.dart index 426e0811..d1fff03b 100644 --- a/lib/core/service/SOAP_service.dart +++ b/lib/core/service/SOAP_service.dart @@ -212,17 +212,18 @@ class SOAPService extends LookupService { } Future getPatientHistories( - GetHistoryReqModel getHistoryReqModel) async { + GetHistoryReqModel getHistoryReqModel, {bool isFirst = false}) async { hasError = false; - await baseAppClient.post (GET_HISTORY, + await baseAppClient.post(GET_HISTORY, onSuccess: (dynamic response, int statusCode) { - print("Success"); - patientHistoryList.clear(); - response['List_History']['entityList'].forEach((v) { - patientHistoryList.add(GetHistoryResModel.fromJson(v)); - }); - }, onFailure: (String error, int statusCode) { - hasError = true; + print("Success"); + if (isFirst) + patientHistoryList.clear(); + response['List_History']['entityList'].forEach((v) { + patientHistoryList.add(GetHistoryResModel.fromJson(v)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; super.error = error; }, body: getHistoryReqModel.toJson()); } diff --git a/lib/core/viewModel/SOAP_view_model.dart b/lib/core/viewModel/SOAP_view_model.dart index 697e9934..fff7a239 100644 --- a/lib/core/viewModel/SOAP_view_model.dart +++ b/lib/core/viewModel/SOAP_view_model.dart @@ -226,17 +226,17 @@ class SOAPViewModel extends BaseViewModel { await _SOAPService.getPatientAllergy(generalGetReqForSOAP); if (_SOAPService.hasError) { error = _SOAPService.error; - setState(ViewState.Busy); + setState(ViewState.Error); } else setState(ViewState.Idle); } - Future getPatientHistories(GetHistoryReqModel getHistoryReqModel) async { + Future getPatientHistories(GetHistoryReqModel getHistoryReqModel, {bool isFirst = false}) async { setState(ViewState.Busy); - await _SOAPService.getPatientHistories(getHistoryReqModel); + await _SOAPService.getPatientHistories(getHistoryReqModel, isFirst: isFirst); if (_SOAPService.hasError) { error = _SOAPService.error; - setState(ViewState.Busy); + setState(ViewState.Error); } else setState(ViewState.Idle); } @@ -247,7 +247,7 @@ class SOAPViewModel extends BaseViewModel { await _SOAPService.getPatientChiefComplaint(getChiefComplaintReqModel); if (_SOAPService.hasError) { error = _SOAPService.error; - setState(ViewState.Busy); + setState(ViewState.Error); } else setState(ViewState.Idle); } @@ -278,7 +278,7 @@ class SOAPViewModel extends BaseViewModel { await _SOAPService.getPatientAssessment(getAssessmentReqModel); if (_SOAPService.hasError) { error = _SOAPService.error; - setState(ViewState.Busy); + setState(ViewState.Error); } else setState(ViewState.Idle); } diff --git a/lib/routes.dart b/lib/routes.dart index 728b5f06..962df032 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -11,7 +11,6 @@ import 'package:doctor_app_flutter/screens/patients/profile/prescriptions/in_pat import 'package:doctor_app_flutter/screens/live_care/video_call.dart'; import 'package:doctor_app_flutter/screens/sick-leave/add-sickleave.dart'; import 'package:doctor_app_flutter/screens/sick-leave/sick_leave.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/add_SOAP_index.dart'; import 'package:doctor_app_flutter/screens/procedures/procedure_screen.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/update_soap_index.dart'; diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index 213ad371..e928f521 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -452,6 +452,24 @@ class TranslationBase { String get specifyPossibleLineManagement => localizedValues['specifyPossibleLineManagement'][locale.languageCode]; String get significantSigns => localizedValues['significantSigns'][locale.languageCode]; String get backAbdomen => localizedValues['backAbdomen'][locale.languageCode]; + String get createNew => localizedValues['createNew'][locale.languageCode]; + String get update => localizedValues['update'][locale.languageCode]; + String get episode => localizedValues['episode'][locale.languageCode]; + + + String get chiefComplaints=> localizedValues['chiefComplaints'][locale.languageCode]; + String get histories => localizedValues['histories'][locale.languageCode]; + String get allergiesSoap => localizedValues['allergiesSoap'][locale.languageCode]; + String get addChiefComplaints => localizedValues['addChiefComplaints'][locale.languageCode]; + String get historyOfPresentIllness => localizedValues['historyOfPresentIllness'][locale.languageCode]; + String get requiredMsg => localizedValues['requiredMsg'][locale.languageCode]; + String get addHistory => localizedValues['addHistory'][locale.languageCode]; + String get searchHistory => localizedValues['searchHistory'][locale.languageCode]; + String get addSelectedHistories => localizedValues['addSelectedHistories'][locale.languageCode]; + String get addAllergies => localizedValues['addAllergies'][locale.languageCode]; + String get itemExist => localizedValues['itemExist'][locale.languageCode]; + String get selectAllergy => localizedValues['selectAllergy'][locale.languageCode]; + String get selectSeverity => localizedValues['selectSeverity'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart b/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart deleted file mode 100644 index 9b4d092d..00000000 --- a/lib/widgets/patients/profile/SOAP/add_SOAP_index.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:doctor_app_flutter/core/viewModel/doctor_replay_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_assement.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart'; -import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/assessment_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/objective_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/plan_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/subjective_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -import '../soap_update/steps_widget.dart'; - -class AddSOAPIndex extends StatefulWidget { - final bool isUpdate; - - const AddSOAPIndex({Key key, this.isUpdate}) : super(key: key); - @override - _AddSOAPIndexState createState() => _AddSOAPIndexState(); -} - -class _AddSOAPIndexState extends State - with TickerProviderStateMixin { - PageController _controller; - int _currentIndex = 0; - List myAllergiesList= List(); - List myHistoryList = List(); - List mySelectedExamination = List(); - MySelectedAssessment mySelectedAssessment = new MySelectedAssessment(); - changePageViewIndex(pageIndex) { - _controller.jumpToPage(pageIndex); - } - - @override - void initState() { - // TODO: implement initState - _controller = new PageController(); - - super.initState(); - } - @override - Widget build(BuildContext context) { - final routeArgs = ModalRoute.of(context).settings.arguments as Map; - PatiantInformtion patient = routeArgs['patient']; - return BaseView( - builder: (_, model, w) => AppScaffold( - baseViewModel: model, - appBarTitle: TranslationBase.of(context).healthRecordInformation, - body: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - decoration: - BoxDecoration(boxShadow: [], color: Colors.white), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - PatientPageHeaderWidget(patient), - FractionallySizedBox( - child: SingleChildScrollView( - child: Container( - height: MediaQuery.of(context).size.height * 0.75, - child: Column( - children: [ - Container( - margin: EdgeInsets.only( - left: - MediaQuery.of(context).size.width * 0.05, - right: - MediaQuery.of(context).size.width * 0.05), - child: StepsWidget( - index: _currentIndex, - changeCurrentTab: changePageViewIndex, - ), - ), - Expanded( - child: PageView( - physics: NeverScrollableScrollPhysics(), - controller: _controller, - onPageChanged: (index) { - setState(() { - _currentIndex = index; - }); - }, - scrollDirection: Axis.horizontal, - children: [ - SubjectivePage( - changePageViewIndex: changePageViewIndex, - myAllergiesList: myAllergiesList, - myHistoryList: myHistoryList, - patientInfo: patient, - ), - ObjectivePage( - changePageViewIndex: changePageViewIndex, - mySelectedExamination: - mySelectedExamination, - patientInfo: patient, - ), - AssessmentPage( - changePageViewIndex: changePageViewIndex, - mySelectedAssessment: - mySelectedAssessment, - patientInfo: patient, - ), - PlanPage( - changePageViewIndex: changePageViewIndex, - patientInfo: patient, - ) - ], - ), - ), - ], - ), - ), - ), - ) - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/widgets/patients/profile/SOAP/assessment_page.dart b/lib/widgets/patients/profile/SOAP/assessment_page.dart deleted file mode 100644 index 0f7a8e31..00000000 --- a/lib/widgets/patients/profile/SOAP/assessment_page.dart +++ /dev/null @@ -1,647 +0,0 @@ -import 'package:autocomplete_textfield/autocomplete_textfield.dart'; -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; -import 'package:doctor_app_flutter/core/enum/viewstate.dart'; -import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; -import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_assement.dart'; -import 'package:doctor_app_flutter/models/SOAP/post_assessment_request_model.dart'; -import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/helpers.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/dialogs/master_key_dailog.dart'; -import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart'; -import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; - -class AssessmentPage extends StatefulWidget { - final Function changePageViewIndex; - final MySelectedAssessment mySelectedAssessment; - final PatiantInformtion patientInfo; - - AssessmentPage( - {Key key, this.changePageViewIndex, this.mySelectedAssessment, this.patientInfo}); - - @override - _AssessmentPageState createState() => _AssessmentPageState(); -} - -class _AssessmentPageState extends State { - bool isAssessmentExpand = false; - - List assessmentList; - dynamic _referTo; - - TextEditingController remarksController = TextEditingController(); - Helpers helpers = Helpers(); - @override - Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - - return BaseView( - builder: (_, model, w) => AppScaffold( - isShowAppBar: false, - body: SingleChildScrollView( - physics: ScrollPhysics(), - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Texts('ASSESSMENT', - variant: - isAssessmentExpand ? "bodyText" : '', - bold: isAssessmentExpand ? true : false, - color: Colors.black), - Icon( - FontAwesomeIcons.asterisk, - color: AppGlobal.appPrimaryColor, - size: 12, - ) - ], - ), - InkWell( - onTap: () { - setState(() { - isAssessmentExpand = !isAssessmentExpand; - }); - }, - child: Icon(isAssessmentExpand - ? EvaIcons.minus - : EvaIcons.plus)) - ], - ), - bodyWidget: Column(children: [ - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - margin: - EdgeInsets.only(left: 5, right: 5, top: 15), - child: TextFields( - hintText: "Add ASSESSMENT", - fontSize: 13.5, - onTapTextFields: () { - openAssessmentDialog(context); - }, - readOnly: true, - // hintColor: Colors.black, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - // controller: messageController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - if(widget.mySelectedAssessment != null && - widget.mySelectedAssessment - .appointmentId != - null && widget.mySelectedAssessment - .selectedDiagnosisType != null && - widget.mySelectedAssessment - .selectedDiagnosisCondition != null) - Container( - margin: EdgeInsets.only( - left: 5, right: 5, top: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment - .spaceBetween, - crossAxisAlignment: CrossAxisAlignment - .start, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment - .start, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - AppText( - "12".toUpperCase(), - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - "DEC".toUpperCase(), - fontSize: 10, - color: Colors.grey, - ), - ], - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment - .start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - AppText( - "Appointment #: ", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - widget.mySelectedAssessment - .appointmentId - .toString(), - fontSize: 10, - color: Colors.grey, - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - AppText( - widget.mySelectedAssessment - .selectedDiagnosisCondition - .nameEn, - fontWeight: FontWeight.bold, - fontSize: 16, - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - AppText( - "Type : ", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - widget.mySelectedAssessment - .selectedDiagnosisType - .nameEn, - fontSize: 10, - color: Colors.grey, - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - AppText( - "Doc : ", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - "Anas Abdullah", - fontSize: 10, - color: Colors.grey, - ), - ], - ), - SizedBox( - height: 6, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - SizedBox( - height: 6, - ), - AppText( - widget.mySelectedAssessment.remark, - fontSize: 10, - color: Colors.grey, - ), - ], - ), - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment - .start, - children: [ - Row( - - children: [ - AppText( - "ICD: ".toUpperCase(), - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - "R07.1".toUpperCase(), - fontSize: 10, - color: Colors.grey, - ), - ], - ) - ], - ), - Column( - children: [ - InkWell( - onTap: () { - openAssessmentDialog(context); - }, - child: Icon(EvaIcons - .edit2Outline), - ) - ], - ), - ], - ), - ) - ], - ) - ]), - isExpand: isAssessmentExpand, - ), - DividerWithSpacesAround( - height: 30, - ), - AppButton( - title: TranslationBase.of(context).next, - loading: model.state == ViewState.BusyLocal, - onPressed: () async { - await submitAssessment(model); - }, - ), - SizedBox( - height: 30, - ), - ], - ), - ), - ), - ))); - } - - submitAssessment(SOAPViewModel model) async { - if (widget.mySelectedAssessment.selectedDiagnosisCondition != null && - widget.mySelectedAssessment.selectedDiagnosisType != null) { - PostAssessmentRequestModel postAssessmentRequestModel = - new PostAssessmentRequestModel( - patientMRN: widget.patientInfo.patientMRN, - episodeId: widget.patientInfo.episodeNo, - appointmentNo: widget.patientInfo.appointmentNo, - icdCodeDetails: [ - new IcdCodeDetails( - remarks: widget.mySelectedAssessment.remark, - complexDiagnosis: true, - conditionId: - widget.mySelectedAssessment.selectedDiagnosisCondition.id, - diagnosisTypeId: - widget.mySelectedAssessment.selectedDiagnosisType.id, - icdcode10Id: "1") - ]); - - await model.postAssessment(postAssessmentRequestModel); - - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } else { - widget.changePageViewIndex(3); - } - } else { - helpers.showErrorToast('Please add required field correctly'); - } - - widget.changePageViewIndex(3); - } - - openAssessmentDialog(BuildContext context) { - showModalBottomSheet( - backgroundColor: Colors.white, - isScrollControlled: true, - context: context, - builder: (context) { - return AddAssessmentDetails( - mySelectedAssessment: widget.mySelectedAssessment, - addSelectedAssessment: () { - setState(() { - Navigator.of(context).pop(); - }); - }); - }); - } - -} - -class AddAssessmentDetails extends StatefulWidget { - final MySelectedAssessment mySelectedAssessment; - final Function() addSelectedAssessment; - - const AddAssessmentDetails( - {Key key, this.mySelectedAssessment, this.addSelectedAssessment}) - : super(key: key); - - @override - _AddAssessmentDetailsState createState() => _AddAssessmentDetailsState(); -} - -class _AddAssessmentDetailsState extends State { - // MasterKeyModel _selectedDiagnosisCondition; - // MasterKeyModel _selectedDiagnosisType; - TextEditingController remarkController = TextEditingController(); - TextEditingController appointmentIdController = TextEditingController( - text: "234567"); - GlobalKey key = new GlobalKey>(); - - @override - Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); - remarkController.text = widget.mySelectedAssessment.remark??""; - final screenSize = MediaQuery - .of(context) - .size; - InputDecoration textFieldSelectorDecoration(String hintText, - String selectedText, bool isDropDown,{IconData icon}) { - //TODO: make one Input InputDecoration for all - return InputDecoration( - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - disabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - hintText: selectedText != null ? selectedText : hintText, - suffixIcon: isDropDown ? Icon(icon??Icons.arrow_drop_down) : null, - hintStyle: TextStyle( - fontSize: 14, - color: Colors.grey.shade600, - ), - ); - } - return FractionallySizedBox( - heightFactor: 0.75, - child: BaseView( - onModelReady: (model) async { - if (model.listOfDiagnosisCondition.length == 0) { - await model.getMasterLookup(MasterKeysService.DiagnosisCondition); - } - if (model.listOfDiagnosisType.length == 0) { - await model.getMasterLookup(MasterKeysService.DiagnosisType); - } - // if (model.listOfICD10.length == 0) { - // await model.getMasterLookup(MasterKeysService.ICD10); - // } - }, - builder: (_, model, w) => - AppScaffold( - baseViewModel: model, - isShowAppBar: false, - body: SingleChildScrollView( - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Container( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 16, - ), - AppText( - "Add Assessment Details".toUpperCase(), - fontWeight: FontWeight.bold, - fontSize: 16, - ), - SizedBox( - height: 16, - ), - Container( - margin: EdgeInsets.only( - left: 0, right: 0, top: 15), - child: TextFields( - hintText: "Appointment Number", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - readOnly: true, - controller: appointmentIdController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.listOfICD10 != null - ? () { - setState(() { - widget.mySelectedAssessment.selectedICD = null; - }); - } - : null, - child:widget.mySelectedAssessment.selectedICD == null ? AutoCompleteTextField( - decoration: textFieldSelectorDecoration("Name or ICD", widget.mySelectedAssessment.selectedICD != null ? widget.mySelectedAssessment.selectedICD.nameEn : null, true,icon: EvaIcons.search), - itemSubmitted: (item) => setState(() => widget.mySelectedAssessment.selectedICD = item), - key: key, - suggestions: model.listOfICD10, - itemBuilder: (context, suggestion) => new Padding( - child:Texts( suggestion.description +" / "+ suggestion.code.toString()), - padding: EdgeInsets.all(8.0)), - itemSorter: (a, b) => 1, - itemFilter: (suggestion, input) => - suggestion.description.toLowerCase().startsWith(input.toLowerCase()) ||suggestion.description.toLowerCase().startsWith(input.toLowerCase()) - ||suggestion.code.toLowerCase().startsWith(input.toLowerCase()) - , - ): TextField( - decoration: textFieldSelectorDecoration( - widget.mySelectedAssessment.selectedICD != null ? widget.mySelectedAssessment.selectedICD.code :"Name or ICD", - widget.mySelectedAssessment.selectedICD != null ? widget.mySelectedAssessment.selectedICD.nameEn : null, true,icon: EvaIcons.search), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.listOfDiagnosisCondition != - null - ? () { - MasterKeyDailog dialog = MasterKeyDailog( - list: model.listOfDiagnosisCondition, - okText: TranslationBase - .of(context) - .ok, - okFunction: ( - MasterKeyModel selectedValue) { - setState(() { - widget.mySelectedAssessment - .selectedDiagnosisCondition = - selectedValue; - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } - : null, - child: TextField( - decoration: textFieldSelectorDecoration( - "Condition", - widget.mySelectedAssessment - .selectedDiagnosisCondition != null - ? widget.mySelectedAssessment - .selectedDiagnosisCondition - .nameEn - : null, - true), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.listOfDiagnosisType != null - ? () { - MasterKeyDailog dialog = MasterKeyDailog( - list: model.listOfDiagnosisType, - okText: TranslationBase - .of(context) - .ok, - okFunction: ( - MasterKeyModel selectedValue) { - setState(() { - // _selectedDiagnosisType = - // selectedValue; - widget.mySelectedAssessment - .selectedDiagnosisType = - selectedValue; - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } - : null, - child: TextField( - decoration: textFieldSelectorDecoration( - "Type", - widget.mySelectedAssessment - .selectedDiagnosisType != null - ? widget.mySelectedAssessment - .selectedDiagnosisType.nameEn - : null, - true), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - margin: EdgeInsets.only( - left: 0, right: 0, top: 15), - child: TextFields( - hintText: "Remarks", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - maxLines: 18, - minLines: 5, - controller: remarkController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 10, - ), - AppButton( - title: "Add".toUpperCase(), - onPressed: () { - setState(() { - widget.mySelectedAssessment.remark = - remarkController.text; - widget.mySelectedAssessment - .appointmentId = int.parse( - appointmentIdController.text); - - widget.addSelectedAssessment(); - }); - }, - ), - ])), - ), - ), - ))), - ); - } -} - diff --git a/lib/widgets/patients/profile/SOAP/objective_page.dart b/lib/widgets/patients/profile/SOAP/objective_page.dart deleted file mode 100644 index e5ce583b..00000000 --- a/lib/widgets/patients/profile/SOAP/objective_page.dart +++ /dev/null @@ -1,518 +0,0 @@ -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; -import 'package:doctor_app_flutter/core/enum/viewstate.dart'; -import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart'; -import 'package:doctor_app_flutter/models/SOAP/post_physical_exam_request_model.dart'; -import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/master_key_checkbox_search_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart'; -import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart'; -import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class ObjectivePage extends StatefulWidget { - final Function changePageViewIndex; - final List mySelectedExamination; - final PatiantInformtion patientInfo; - ObjectivePage( - {Key key, this.changePageViewIndex, this.mySelectedExamination, this.patientInfo}); - - @override - _ObjectivePageState createState() => _ObjectivePageState(); -} - -class _ObjectivePageState extends State { - bool isSysExaminationExpand = false; - TextEditingController remarksController = TextEditingController(); - - BoxDecoration containerBorderDecoration( - Color containerColor, Color borderColor) { - return BoxDecoration( - color: containerColor, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(6)), - border: Border.fromBorderSide(BorderSide( - color: borderColor, - width: 0.5, - )), - ); - } - @override - Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - - return BaseView( - // onModelReady: (model) => model.getMasterLookup(MasterKeysService.Allergies), - builder: (_, model, w) => AppScaffold( - isShowAppBar: false, - body: SingleChildScrollView( - physics: ScrollPhysics(), - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Texts('Physical/System Examination', - variant: - isSysExaminationExpand ? "bodyText" : '', - bold: isSysExaminationExpand ? true : false, - color: Colors.black), - Icon( - FontAwesomeIcons.asterisk, - color: AppGlobal.appPrimaryColor, - size: 12, - ) - ], - ), - InkWell( - onTap: () { - setState(() { - isSysExaminationExpand = - !isSysExaminationExpand; - }); - }, - child: Icon(isSysExaminationExpand - ? EvaIcons.minus - : EvaIcons.plus)) - ], - ), - bodyWidget: Column(children: [ - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - margin: - EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Add Examination", - fontSize: 13.5, - onTapTextFields: () { - openExaminationList(context); - }, - readOnly: true, - // hintColor: Colors.black, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - // controller: messageController, - validator: (value) { - if (value == null) - return TranslationBase.of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - Column( - children: - widget.mySelectedExamination.map((examination) { - return Container( - margin: EdgeInsets.only( - left: 15, right: 15, top: 15), - child: Column(children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts( - examination - .selectedExamination.nameEn - .toUpperCase(), - variant: "bodyText", - bold: true, - color: Colors.black) - ], - ), - SizedBox( - height: 8, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - InkWell( - child: Center( - child: Container( - height: - screenSize.height * - 0.070, - decoration: - containerBorderDecoration( - examination - .isNormal - ? Color( - 0xFF515A5D) - : Colors - .white, - Colors.grey), - child: Center( - child: Padding( - padding: - const EdgeInsets - .all(8.0), - child: Text( - "Normal", - style: TextStyle( - fontSize: 12, - color: - examination - .isNormal - ? Colors.white - : Colors - .black, - //Colors.black, - fontWeight: - FontWeight - .bold, - ), - ), - ), - )), - ), - onTap: () { - setState(() { - examination.isAbnormal = - !examination.isAbnormal; - examination.isNormal = - !examination.isNormal; - }); - }), - SizedBox( - width: 12, - ), - InkWell( - child: Center( - child: Container( - height: - screenSize.height * - 0.070, - decoration: - containerBorderDecoration( - examination - .isAbnormal - ? Color( - 0xFF515A5D) - : Colors - .white, - Colors.black), - child: Center( - child: Padding( - padding: - const EdgeInsets - .all(8.0), - child: Text( - "Abnormal", - style: TextStyle( - fontSize: 12, - color: - examination - .isAbnormal - ? Colors.white - : Colors - .black, - //Colors.black, - fontWeight: - FontWeight - .bold, - ), - ), - ), - )), - ), - onTap: () { - setState(() { - examination.isAbnormal = - !examination.isAbnormal; - examination.isNormal = - !examination.isNormal; - }); - }), - ], - ), - InkWell( - - child: Icon( - FontAwesomeIcons.trash, - color: Colors.grey, - size: 20, - ), - onTap: () => removeExamination( - examination.selectedExamination), - ) - ], - ), - SizedBox( - height: 20, - ), - Container( - margin: EdgeInsets.only( - left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Remarks", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - maxLines: 25, - minLines: 13, - controller: remarksController, - validator: (value) { - if (value == null) - return TranslationBase.of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - ])); - }).toList(), - ) - ], - ) - ]), - isExpand: isSysExaminationExpand, - ), - DividerWithSpacesAround(height: 30,), - AppButton( - title: TranslationBase.of(context).next, - loading: model.state == ViewState.BusyLocal, - onPressed: () async { - await submitObjectivePage(model); - }, - ), - SizedBox( - height: 30, - ), - ], - ), - ), - ), - ))); - } - - submitObjectivePage(SOAPViewModel model) async { - // if(widget.mySelectedExamination.isNotEmpty){ - // PostPhysicalExamRequestModel postPhysicalExamRequestModel = new PostPhysicalExamRequestModel(); - // widget.mySelectedExamination.forEach((exam) { - // if (postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM == - // null) - // postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM = []; - // // TODO : change createdBy editedBy - // postPhysicalExamRequestModel.listHisProgNotePhysicalExaminationVM.add( - // ListHisProgNotePhysicalExaminationVM( - // patientMRN: widget.patientInfo.patientMRN, - // episodeId: widget.patientInfo.episodeNo, - // appointmentNo: widget.patientInfo.appointmentNo, - // remarks: exam.remark ?? '', - // createdBy: 4709, - // createdOn: DateTime.now().toIso8601String(), - // editedBy: 4709, - // editedOn: DateTime.now().toIso8601String(), - // examId: exam.selectedExamination.id, - // examType: exam.selectedExamination.typeId, - // isAbnormal: exam.isAbnormal, - // isNormal: exam.isNormal, - // masterDescription: exam.selectedExamination, - // notExamined: false - // - // )); - // }); - // - // await model.postPhysicalExam(postPhysicalExamRequestModel); - // - // if (model.state == ViewState.ErrorLocal) { - // helpers.showErrorToast(model.error); - // } else { - // widget.changePageViewIndex(2); - // } - // } else { - // helpers.showErrorToast('Please add required field correctly'); - // } - - widget.changePageViewIndex(2); - } - - removeExamination(MasterKeyModel masterKey) { - Iterable history = widget.mySelectedExamination - .where( - (element) => - masterKey.id == element.selectedExamination.id && - masterKey.typeId == element.selectedExamination.typeId); - - if (history.length > 0) - setState(() { - widget.mySelectedExamination.remove(history.first); - }); - } - - openExaminationList(BuildContext context) { - final screenSize = MediaQuery - .of(context) - .size; - InputDecoration textFieldSelectorDecoration(String hintText, - String selectedText, bool isDropDown) { - return InputDecoration( - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - disabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - hintText: selectedText != null ? selectedText : hintText, - suffixIcon: isDropDown ? Icon(Icons.arrow_drop_down) : null, - hintStyle: TextStyle( - fontSize: 14, - color: Colors.grey.shade600, - ), - ); - } - - showModalBottomSheet( - backgroundColor: Colors.white, - isScrollControlled: true, - context: context, - builder: (context) { - return AddExaminationDailog( - mySelectedExamination: widget.mySelectedExamination, - addSelectedExamination: () { - setState(() { - Navigator.of(context).pop(); - }); - }, - removeExamination: (masterKey) => removeExamination(masterKey),); - }); - } -} - -class AddExaminationDailog extends StatefulWidget { - final List mySelectedExamination; - final Function addSelectedExamination; - final Function (MasterKeyModel) removeExamination; - - const AddExaminationDailog( - {Key key, this.mySelectedExamination, this.addSelectedExamination, this.removeExamination}) - : super(key: key); - - @override - _AddExaminationDailogState createState() => _AddExaminationDailogState(); -} - -class _AddExaminationDailogState extends State { - @override - Widget build(BuildContext context) { - return FractionallySizedBox( - heightFactor: 0.7, - child: BaseView( - onModelReady: (model) async { - if (model.physicalExaminationList.length == 0) { - await model.getMasterLookup( - MasterKeysService.PhysicalExamination); - } - }, - builder: (_, model, w) => - AppScaffold( - // baseViewModel: model, - isShowAppBar: false, - body: Center( - child: Container( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 16, - ), - AppText( - "Examinations", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - SizedBox( - height: 16, - ), - - NetworkBaseView( - baseViewModel: model, - child: MasterKeyCheckboxSearchWidget( - model: model, - masterList: model.physicalExaminationList, - removeHistory: (history){ - setState(() { - widget.removeExamination(history); - }); - }, - addHistory: (history){ - setState(() { - MySelectedExamination mySelectedExamination = new MySelectedExamination( - selectedExamination: history - ); - widget - .mySelectedExamination - .add( - mySelectedExamination); - }); - }, - addSelectedHistories: (){ - widget.addSelectedExamination(); - }, - isServiceSelected: (master) =>isServiceSelected(master), - ), - ), - - ]), - ))), - )), - ); - } - - isServiceSelected(MasterKeyModel masterKey) { - Iterable exam = - widget - .mySelectedExamination - .where((element) => - masterKey.id == element.selectedExamination.id && - masterKey.typeId == element.selectedExamination.typeId); - if (exam.length > 0) { - return true; - } - return false; - } -} diff --git a/lib/widgets/patients/profile/SOAP/plan_page.dart b/lib/widgets/patients/profile/SOAP/plan_page.dart deleted file mode 100644 index 1bde4b6c..00000000 --- a/lib/widgets/patients/profile/SOAP/plan_page.dart +++ /dev/null @@ -1,349 +0,0 @@ -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/enum/viewstate.dart'; -import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/post_progress_note_request_model.dart'; -import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart'; -import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class PlanPage extends StatefulWidget { - final Function changePageViewIndex; - final PatiantInformtion patientInfo; - - PlanPage({Key key, this.changePageViewIndex, this.patientInfo}); - - @override - _PlanPageState createState() => _PlanPageState(); -} - -class _PlanPageState extends State { - bool isProgressNoteExpand = false; - - List progressNoteList; - - TextEditingController progressNoteController = - TextEditingController(text: null); - - BoxDecoration containerBorderDecoration( - Color containerColor, Color borderColor) { - return BoxDecoration( - color: containerColor, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(6)), - border: Border.fromBorderSide(BorderSide( - color: borderColor, - width: 0.5, - )), - ); - } - - @override - Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - - return BaseView( - // onModelReady: (model) => model.getMasterLookup(MasterKeysService.Allergies), - builder: (_, model, w) => AppScaffold( - isShowAppBar: false, - body: SingleChildScrollView( - physics: ScrollPhysics(), - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Texts('Progress Note', - variant: - isProgressNoteExpand ? "bodyText" : '', - bold: isProgressNoteExpand ? true : false, - color: Colors.black), - Icon( - FontAwesomeIcons.asterisk, - color: AppGlobal.appPrimaryColor, - size: 12, - ) - ], - ), - InkWell( - onTap: () { - setState(() { - isProgressNoteExpand = - !isProgressNoteExpand; - }); - }, - child: Icon(isProgressNoteExpand - ? EvaIcons.minus - : EvaIcons.plus)) - ], - ), - bodyWidget: Column(children: [ - SizedBox( - height: 20, - ), - Column( - children: [ - Container( - margin: - EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Add Progress Note", - fontSize: 13.5, - onTapTextFields: () { - openProgressNote(context); - }, - readOnly: true, - // hintColor: Colors.black, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - // controller: messageController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - if (progressNoteController.text.isNotEmpty) - Container( - margin: - EdgeInsets.only(left: 5, right: 5, top: 15), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Column( - mainAxisAlignment: - MainAxisAlignment.start, - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - AppText( - "12".toUpperCase(), - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - "DEC".toUpperCase(), - fontSize: 10, - color: Colors.grey, - ), - ], - ) - ], - ), - Column( - crossAxisAlignment: CrossAxisAlignment - .start, - children: [ - - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - SizedBox( - height: 6, - ), - Padding( - padding: const EdgeInsets.all(0.0), - child: Container( - width: MediaQuery - .of(context) - .size - .width * 0.6, - child: AppText( - progressNoteController.text, - fontSize: 10, - - color: Colors.grey, - ), - ), - ), - ], - ), SizedBox( - height: 8, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - AppText( - "Created By : ", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - "Anas Abdullah on 12 De", - fontSize: 10, - color: Colors.grey, - ), - ], - ), - Row( - mainAxisAlignment: - MainAxisAlignment.start, - children: [ - AppText( - "Edited By : ", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - AppText( - "Rahim on 13 Dec", - fontSize: 10, - color: Colors.grey, - ), - ], - ), - - ], - ), - Column( - children: [ - InkWell( - onTap: () { - openProgressNote(context); - }, - child: Icon(EvaIcons.edit2Outline), - ) - ], - ), - ], - ), - ) - ], - ) - ]), - isExpand: isProgressNoteExpand, - ), - DividerWithSpacesAround(height: 30,), - AppButton( - title: TranslationBase - .of(context) - .next, - loading: model.state == ViewState.BusyLocal, - onPressed: () { - - submitPlan(model); - // widget.changePageViewIndex(2); - }, - ), - SizedBox( - height: 30, - ), - ], - ), - ), - ), - ),),); - } - - submitPlan(SOAPViewModel model) async { - if (progressNoteController.text.isNotEmpty) { - PostProgressNoteRequestModel postProgressNoteRequestModel = new PostProgressNoteRequestModel( - patientMRN: widget.patientInfo.patientMRN, - episodeId: widget.patientInfo.episodeNo, - appointmentNo: widget.patientInfo.appointmentNo, - planNote: progressNoteController.text); - - - await model.postProgressNote(postProgressNoteRequestModel); - - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } else { - Navigator.of(context).pop(); - } - } - - // Navigator.of(context).pop(); - } - - openProgressNote(BuildContext context) { - showModalBottomSheet( - backgroundColor: Colors.white, - isScrollControlled: true, - context: context, - builder: (context) { - return FractionallySizedBox( - heightFactor: 0.5, - child: Container( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 16, - ), - AppText( - "Add Progress Note", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - SizedBox( - height: 10, - ), - Container( - margin: EdgeInsets.only(left: 0, right: 0, top: 15), - child: TextFields( - hintText: "Add progress note here", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - maxLines: 16, - minLines: 8, - controller: progressNoteController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ),SizedBox( - height: 10, - ), - AppButton( - title: "Add".toUpperCase(), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ]), - )), - ); - }); - } -} diff --git a/lib/widgets/patients/profile/SOAP/subjective/add_allergies_widget.dart b/lib/widgets/patients/profile/SOAP/subjective/add_allergies_widget.dart deleted file mode 100644 index 43748f3d..00000000 --- a/lib/widgets/patients/profile/SOAP/subjective/add_allergies_widget.dart +++ /dev/null @@ -1,339 +0,0 @@ -import 'package:autocomplete_textfield/autocomplete_textfield.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; -import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; -import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/dialogs/master_key_dailog.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; - -class AddAllergiesWidget extends StatefulWidget { - final List myAllergiesList; - - AddAllergiesWidget({Key key, this.myAllergiesList}); - - @override - _AddAllergiesWidgetState createState() => _AddAllergiesWidgetState(); -} - -class _AddAllergiesWidgetState extends State { - - TextEditingController remarkController = TextEditingController(); - - @override - Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - - return Column( - children: [ - Container( - margin: EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Add Allergies", - fontSize: 13.5, - onTapTextFields: () { - openAllergiesList(context); - }, - readOnly: true, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - Container( - margin: - EdgeInsets.only(left: 15, right: 15, top: 15), - child: Column( - children: widget.myAllergiesList.map((selectedAllergy) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts(selectedAllergy.selectedAllergy.nameEn.toUpperCase(), - variant: "bodyText", bold: true, color: Colors.black), - Texts( - selectedAllergy.selectedAllergySeverity.nameEn - .toUpperCase(), - variant: "bodyText", - bold: true, - color: AppGlobal.appPrimaryColor), - InkWell( - child: Icon( - FontAwesomeIcons.trash, - color: Colors.grey, - size: 20, - ), - onTap: () => removeAllergy(selectedAllergy), - ) - ], - ), - SizedBox( - height: 10, - ), - ], - ); - }).toList()), - ) - ], - ); - } - - removeAllergy(MySelectedAllergy mySelectedAllergy) { - Iterable allergy = - widget.myAllergiesList.where((element) => mySelectedAllergy == element); - - if (allergy.length > 0) - setState(() { - widget.myAllergiesList.remove(allergy.first); - }); - } - - openAllergiesList(BuildContext context) { - showModalBottomSheet( - backgroundColor: Colors.white, - isScrollControlled: true, - context: context, - builder: (context) { - return AddAllergies( - addAllergiesFun: (MySelectedAllergy mySelectedAllergy) { - setState(() { - widget.myAllergiesList.add(mySelectedAllergy); - Navigator.of(context).pop(); - }); - },); - }); - } - -} - -class AddAllergies extends StatefulWidget { - final Function addAllergiesFun; - - const AddAllergies({Key key, this.addAllergiesFun}) : super(key: key); - - @override - _AddAllergiesState createState() => _AddAllergiesState(); -} - -class _AddAllergiesState extends State { - List allergiesList; - List allergySeverityList; - MasterKeyModel _selectedAllergySeverity; - MasterKeyModel _selectedAllergy; - TextEditingController remarkController = TextEditingController(); - - - InputDecoration textFieldSelectorDecoration(String hintText, - String selectedText, bool isDropDown,{IconData icon}) { - return InputDecoration( - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - disabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0), - borderRadius: BorderRadius.circular(8), - ), - hintText: selectedText != null ? selectedText : hintText, - suffixIcon: isDropDown ? Icon(icon?? Icons.arrow_drop_down) : null, - hintStyle: TextStyle( - fontSize: 14, - color: Colors.grey.shade600, - ), - ); - } - bool _isShowSearch = false; - GlobalKey key = new GlobalKey>(); - - @override - Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); - final screenSize = MediaQuery - .of(context) - .size; - return FractionallySizedBox( - heightFactor: 0.7, - child: BaseView( - onModelReady: (model) async { - if (model.allergiesList.length == 0) { - await model.getMasterLookup(MasterKeysService.Allergies); - } - if (model.allergySeverityList.length == 0) { - await model.getMasterLookup(MasterKeysService.AllergySeverity); - } - }, - builder: (_, model, w) => - AppScaffold( - baseViewModel: model, - isShowAppBar: false, - body: SingleChildScrollView( - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - - SizedBox( - height: 16, - ), - AppText( - "Add Allergy", - fontWeight: FontWeight.bold, - fontSize: 16, - ), - SizedBox( - height: 16, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.allergiesList != null - ? () { - setState(() { - _selectedAllergy = null; - }); - } - : null, - child: _selectedAllergy==null? AutoCompleteTextField( - decoration: textFieldSelectorDecoration("Select Allergy", _selectedAllergy != null ? _selectedAllergy.nameEn : null, true,icon: EvaIcons.search), - itemSubmitted: (item) => setState(() => _selectedAllergy = item), - key: key, - suggestions: model.allergiesList, - itemBuilder: (context, suggestion) => new Padding( - child:Texts( projectViewModel.isArabic? suggestion.nameAr: suggestion.nameEn), - padding: EdgeInsets.all(8.0)), - itemSorter: (a, b) => 1, - itemFilter: (suggestion, input) => - suggestion.nameAr.toLowerCase().startsWith(input.toLowerCase()) ||suggestion.nameEn.toLowerCase().startsWith(input.toLowerCase()), - ):TextField( - decoration: textFieldSelectorDecoration("Select Allergy", _selectedAllergy != null ? _selectedAllergy.nameEn : null, true,icon: EvaIcons.search), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - height: screenSize.height * 0.070, - child: InkWell( - onTap: model.allergySeverityList != null - ? () { - MasterKeyDailog dialog = MasterKeyDailog( - list: model.allergySeverityList, - okText: TranslationBase - .of(context) - .ok, - okFunction: (selectedValue) { - setState(() { - _selectedAllergySeverity = - selectedValue; - // model.getDoctorBranch().then((value) { - // _selectedBranch = value; - // if (_referTo['id'] == 1) { - // model.getClinics( - // _selectedBranch['ID']); - // } - // }); - }); - }, - ); - showDialog( - barrierDismissible: false, - context: context, - builder: (BuildContext context) { - return dialog; - }, - ); - } - : null, - child: TextField( - decoration: textFieldSelectorDecoration( - "Select Severity", - _selectedAllergySeverity != null - ? _selectedAllergySeverity.nameEn - : null, - true), - enabled: false, - ), - ), - ), - SizedBox( - height: 10, - ), - Container( - margin: EdgeInsets.only( - left: 0, right: 0, top: 15), - child: TextFields( - hintText: "Remarks", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - maxLines: 25, - minLines: 13, - controller: remarkController, - validator: (value) { - if (value == null) - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), SizedBox( - height: 10, - ), - AppButton( - title: "Add".toUpperCase(), - onPressed: () { - MySelectedAllergy mySelectedAllergy = new MySelectedAllergy( - remark: remarkController.text, - selectedAllergy: _selectedAllergy, - selectedAllergySeverity: _selectedAllergySeverity); - widget.addAllergiesFun(mySelectedAllergy); - }, - ), - ] - - ), - ), - ), - )), - ), - ); - } -} - - - - - diff --git a/lib/widgets/patients/profile/SOAP/subjective/add_history_widget.dart b/lib/widgets/patients/profile/SOAP/subjective/add_history_widget.dart deleted file mode 100644 index 6e7bbe00..00000000 --- a/lib/widgets/patients/profile/SOAP/subjective/add_history_widget.dart +++ /dev/null @@ -1,360 +0,0 @@ -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; -import 'package:doctor_app_flutter/core/enum/viewstate.dart'; -import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart'; -import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:hexcolor/hexcolor.dart'; - -import '../../../../shared/master_key_checkbox_search_widget.dart'; - -class AddHistoryWidget extends StatefulWidget { - final List myHistoryList; - - const AddHistoryWidget({Key key, this.myHistoryList}) : super(key: key); - - @override - _AddHistoryWidgetState createState() => _AddHistoryWidgetState(); -} - -class _AddHistoryWidgetState extends State - with TickerProviderStateMixin { - PageController _controller; - int _currentIndex = 0; - - changePageViewIndex(pageIndex) { - _controller.jumpToPage(pageIndex); - } - - @override - void initState() { - _controller = new PageController(); - - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - margin: EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Add History", - fontSize: 13.5, - onTapTextFields: () { - openHistoryList(context); - }, - readOnly: true, - // hintColor: Colors.black, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - // controller: messageController, - validator: (value) { - if (value == null) - return TranslationBase.of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - Container( - margin: - EdgeInsets.only(left: 15, right: 15, top: 15), - child: Column( - children: widget.myHistoryList.map((myHistory) { - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts(myHistory.nameEn, - variant: "bodyText", bold: true, color: Colors.black), - InkWell( - child: Icon( - FontAwesomeIcons.trash, - color: Colors.grey, - size: 20, - ), - onTap: () => removeHistory(myHistory), - ) - ], - ), - SizedBox( - height: 20, - ), - ], - ); - }).toList(), - ), - ) - ], - ); - } - - removeHistory(MasterKeyModel masterKey) { - Iterable history = widget.myHistoryList.where((element) => - masterKey.id == element.id && masterKey.typeId == element.typeId); - - if (history.length > 0) - setState(() { - widget.myHistoryList.remove(history.first); - }); - } - - openHistoryList(BuildContext context) { - showModalBottomSheet( - backgroundColor: Colors.white, - isScrollControlled: true, - context: context, - builder: (context) { - return AddHistoryDialog( - changePageViewIndex: changePageViewIndex, - controller: _controller, - myHistoryList: widget.myHistoryList, - addSelectedHistories: () { - setState(() { - Navigator.of(context).pop(); - }); - }, - removeHistory: (masterKey) => removeHistory(masterKey), - ); - }); - } -} - -class PriorityBar extends StatefulWidget { - final Function onTap; - - const PriorityBar({Key key, this.onTap}) : super(key: key); - - @override - _PriorityBarState createState() => _PriorityBarState(); -} - -class _PriorityBarState extends State { - int _activePriority = 0; - - List _priorities = [ - "Family", - "Surgical/Sports", - "Medical", - ]; - - BoxDecoration containerBorderDecoration( - Color containerColor, Color borderColor) { - return BoxDecoration( - color: containerColor, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(6)), - border: Border.fromBorderSide(BorderSide( - color: borderColor, - width: 2.0, - )), - ); - } - - @override - Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; - - return Container( - height: screenSize.height * 0.070, - decoration: - containerBorderDecoration(Color(0Xffffffff), Color(0xFFCCCCCC)), - child: Row( - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: _priorities.map((item) { - bool _isActive = _priorities[_activePriority] == item ? true : false; - return Expanded( - child: InkWell( - child: Center( - child: Container( - height: screenSize.height * 0.070, - decoration: containerBorderDecoration( - _isActive ? HexColor("#B8382B") : Colors.white, - _isActive ? HexColor("#B8382B") : Colors.white), - child: Center( - child: Text( - item, - style: TextStyle( - fontSize: 12, - color: _isActive - ? Colors.white - : Colors.black, //Colors.black, - fontWeight: FontWeight.bold, - ), - ), - )), - ), - onTap: () { - widget.onTap(_priorities.indexOf(item)); - - setState(() { - _activePriority = _priorities.indexOf(item); - }); - }), - ); - }).toList(), - ), - ); - } -} - -class AddHistoryDialog extends StatefulWidget { - final Function changePageViewIndex; - final PageController controller; - final List myHistoryList; - final Function addSelectedHistories; - final Function (MasterKeyModel) removeHistory; - - const AddHistoryDialog( - {Key key, this.changePageViewIndex, this.controller, this.myHistoryList, this.addSelectedHistories, this.removeHistory}) - : super(key: key); - - @override - _AddHistoryDialogState createState() => _AddHistoryDialogState(); -} - -class _AddHistoryDialogState extends State { - @override - Widget build(BuildContext context) { - return FractionallySizedBox( - heightFactor: 0.7, - child: BaseView( - onModelReady: (model) async { - if (model.historyFamilyList.length == 0) { - await model.getMasterLookup(MasterKeysService.HistoryFamily); - } - }, - builder: (_, model, w) => AppScaffold( - // baseViewModel: model, - isShowAppBar: false, - body: Center( - child: Container( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - children: [ - SizedBox( - height: 10, - ), - PriorityBar(onTap: (activePriority) async { - widget.changePageViewIndex(activePriority); - if(activePriority ==1) { - if (model.historySurgicalList.length == 0) { - await model.getMasterLookup(MasterKeysService.HistorySurgical); - await model.getMasterLookup(MasterKeysService.HistorySports); - } - } - if(activePriority ==2) { - if (model.historyMedicalList.length == 0) { - await model.getMasterLookup(MasterKeysService.HistoryMedical); - } - } - }), - SizedBox( - height: 20, - ), - Expanded( - child: PageView( - physics: NeverScrollableScrollPhysics(), - controller: widget.controller, - onPageChanged: (index) { - setState(() { - // currentIndex = index; - }); - }, - scrollDirection: Axis.horizontal, - children: [ - MasterKeyCheckboxSearchWidget( - model: model, - masterList: model.historyFamilyList, - removeHistory: (history){ - setState(() { - widget.removeHistory(history); - }); - }, - addHistory: (history){ - setState(() { - widget.myHistoryList.add(history); - }); - }, - addSelectedHistories: (){ - widget.addSelectedHistories(); - }, - isServiceSelected: (master) =>isServiceSelected(master), - ), - MasterKeyCheckboxSearchWidget( - model: model, - masterList: model.mergeHistorySurgicalWithHistorySportList, - removeHistory: (history){ - setState(() { - widget.removeHistory(history); - }); - }, - addHistory: (history){ - setState(() { - widget.myHistoryList.add(history); - }); - }, - addSelectedHistories: (){ - widget.addSelectedHistories(); - }, - isServiceSelected: (master) =>isServiceSelected(master), - ), - MasterKeyCheckboxSearchWidget( - model: model, - masterList: model.historyMedicalList, - removeHistory: (history){ - setState(() { - widget.removeHistory(history); - }); - }, - addHistory: (history){ - setState(() { - widget.myHistoryList.add(history); - }); - }, - addSelectedHistories: (){ - widget.addSelectedHistories(); - }, - isServiceSelected: (master) =>isServiceSelected(master), - ), - ], - ), - ), - ], - ), - )), - ), - ), - )); - } - - bool isServiceSelected(MasterKeyModel masterKey) { - Iterable history = - widget.myHistoryList.where((element) => masterKey.id == element.id && masterKey.typeId == element.typeId); - - if (history.length > 0) { - return true; - } - return false; - } - -} diff --git a/lib/widgets/patients/profile/SOAP/subjective/add_medication_widget.dart b/lib/widgets/patients/profile/SOAP/subjective/add_medication_widget.dart deleted file mode 100644 index 1db7c2e0..00000000 --- a/lib/widgets/patients/profile/SOAP/subjective/add_medication_widget.dart +++ /dev/null @@ -1,107 +0,0 @@ - -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class AddMedication extends StatefulWidget { - @override - _AddMedicationState createState() => _AddMedicationState(); -} - -class _AddMedicationState extends State { - @override - Widget build(BuildContext context) { - return Column( - children: [ - Container( - margin: - EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Current Medications", - fontSize: 13.5, - onTapTextFields: () { - openMedicationsList(context); - }, - readOnly: true, - // hintColor: Colors.black, - suffixIcon: EvaIcons.plusCircleOutline, - suffixIconColor: AppGlobal.appPrimaryColor, - fontWeight: FontWeight.w600, - // controller: messageController, - validator: (value) { - if (value == null) - return TranslationBase.of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - Container( - margin: - EdgeInsets.only(left: 15, right: 15, top: 15), - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts('Abdomen Pain', - variant: "bodyText", - bold: true, - color: Colors.black), - Icon( - FontAwesomeIcons.trash, - color: Colors.grey, - size: 20, - ) - ], - ), - SizedBox( - height: 20, - ), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Texts('Back Pain', - variant: "bodyText", - bold: true, - color: Colors.black), - Icon( - FontAwesomeIcons.trash, - color: Colors.grey, - size: 20, - ) - ], - ), - ], - ), - ) - ], - ); - } - openMedicationsList(BuildContext context) { - showModalBottomSheet( - backgroundColor: Colors.white, - isScrollControlled: true, - context: context, - builder: (context) { - return FractionallySizedBox( - heightFactor: 0.7, - child: Container( - child: Center( - child: Texts("dfdfd"), - )), - ); - }); - } - -} - diff --git a/lib/widgets/patients/profile/SOAP/subjective/subjective_page.dart b/lib/widgets/patients/profile/SOAP/subjective/subjective_page.dart deleted file mode 100644 index 2514c463..00000000 --- a/lib/widgets/patients/profile/SOAP/subjective/subjective_page.dart +++ /dev/null @@ -1,402 +0,0 @@ -import 'package:doctor_app_flutter/client/base_app_client.dart'; -import 'package:doctor_app_flutter/config/config.dart'; -import 'package:doctor_app_flutter/core/enum/viewstate.dart'; -import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart'; -import 'package:doctor_app_flutter/models/SOAP/post_allergy_request_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/post_chief_complaint_request_model.dart'; -import 'package:doctor_app_flutter/models/SOAP/post_histories_request_model.dart'; -import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; -import 'package:doctor_app_flutter/screens/base/base_view.dart'; -import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/add_allergies_widget.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/add_history_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/Text.dart'; -import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; -import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart'; -import 'package:eva_icons_flutter/eva_icons_flutter.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - -class SubjectivePage extends StatefulWidget { - final Function changePageViewIndex; - final List myAllergiesList; - final List myHistoryList; - final PatiantInformtion patientInfo; - - SubjectivePage( - {Key key, - this.changePageViewIndex, - this.myAllergiesList, - this.myHistoryList, - this.patientInfo}); - - @override - _SubjectivePageState createState() => _SubjectivePageState(); -} - -class _SubjectivePageState extends State { - bool isChiefExpand = false; - bool isHistoryExpand = false; - bool isAllergiesExpand = false; - TextEditingController illnessController = TextEditingController(); - TextEditingController complaintsController = TextEditingController(); - final formKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return BaseView( - // onModelReady: (model) => model.getMasterLookup(MasterKeysService.Allergies), - builder: (_, model, w) => AppScaffold( - isShowAppBar: false, - baseViewModel: model, - body: SingleChildScrollView( - physics: ScrollPhysics(), - child: Center( - child: FractionallySizedBox( - widthFactor: 0.9, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Texts('CHIEF COMPLAINTS', - variant: isChiefExpand ? "bodyText" : '', - bold: isChiefExpand ? true : false, - color: Colors.black), - Icon( - FontAwesomeIcons.asterisk, - color: AppGlobal.appPrimaryColor, - size: 12, - ) - ], - ), - InkWell( - onTap: () { - setState(() { - isChiefExpand = !isChiefExpand; - }); - }, - child: Icon( - isChiefExpand ? EvaIcons.minus : EvaIcons.plus)) - ], - ), - bodyWidget: Form( - key: formKey, - child: Column(children: [ - SizedBox( - height: 20, - ), - Container( - margin: EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "Add Chief Complaints", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - maxLines: 25, - minLines: 13, - controller: complaintsController, - validator: (value) { - if (value == null || value == "") - return TranslationBase.of(context) - .emptyMessage; - else if (value.length < 25) - return TranslationBase.of(context) - .chiefComplaintLength; - //""; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - Container( - margin: EdgeInsets.only(left: 10, right: 10, top: 15), - child: TextFields( - hintText: "History of Present Illness", - fontSize: 13.5, - // hintColor: Colors.black, - fontWeight: FontWeight.w600, - maxLines: 25, - minLines: 13, - controller: illnessController, - validator: (value) { - if (value == null || value =="") - return TranslationBase - .of(context) - .emptyMessage; - else - return null; - }), - ), - SizedBox( - height: 20, - ), - // TODO return it back when we need it. - // AddMedication(), - ]), - ), - isExpand: isChiefExpand, - ), - - SizedBox( - height: 30, - ), - Container( - width: double.infinity, - height: 1, - color: Color(0xffCCCCCC), - ), - SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Texts('History'.toUpperCase(), - variant: isHistoryExpand ? "bodyText" : '', - bold: isHistoryExpand ? true : false, - color: Colors.black), - ], - ), - InkWell( - onTap: () { - setState(() { - isHistoryExpand = !isHistoryExpand; - }); - }, - child: Icon(isHistoryExpand - ? EvaIcons.minus - : EvaIcons.plus)) - ], - ), - bodyWidget: Column( - children: [ - AddHistoryWidget(myHistoryList: widget.myHistoryList) - ], - ), - isExpand: isHistoryExpand, - ), - SizedBox( - height: 30, - ), - Container( - width: double.infinity, - height: 1, - color: Color(0xffCCCCCC), - ), - SizedBox( - height: 30, - ), - HeaderBodyExpandableNotifier( - headerWidget: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - Texts('Allergies'.toUpperCase(), - variant: isAllergiesExpand ? "bodyText" : '', - bold: isAllergiesExpand ? true : false, - color: Colors.black), - ], - ), - InkWell( - onTap: () { - setState(() { - isAllergiesExpand = !isAllergiesExpand; - }); - }, - child: Icon(isAllergiesExpand - ? EvaIcons.minus - : EvaIcons.plus)) - ], - ), - bodyWidget: Column( - children: [ - AddAllergiesWidget( - myAllergiesList: widget.myAllergiesList, - ), - SizedBox( - height: 30, - ), - ], - ), - isExpand: isAllergiesExpand, - ), - SizedBox( - height: 30, - ), - Container( - width: double.infinity, - height: 1, - color: Color(0xffCCCCCC), - ), - SizedBox( - height: 30, - ), - AppButton( - title: TranslationBase.of(context).next, - loading: model.state == ViewState.BusyLocal, - onPressed: () async { - addSubjectiveInfo( - model: model, - myAllergiesList: widget.myAllergiesList, - myHistoryList: widget.myHistoryList); - }, - ), - ], - ), - ), - ), - ), - ), - ); - } - - addSubjectiveInfo( - {SOAPViewModel model, - List myAllergiesList, - List myHistoryList}) async { - formKey.currentState.save(); - formKey.currentState.validate(); - - - // if(complaintsController.text.isNotEmpty && illnessController.text.isNotEmpty && complaintsController.text.length>25) { - // await postChiefComplaint(model: model); - // if (model.state == ViewState.ErrorLocal) { - // helpers.showErrorToast(model.error); - // } else { - // if (myHistoryList.length != 0) { - // await postHistories(model: model, myHistoryList: myHistoryList); - // if (model.state == ViewState.ErrorLocal) { - // helpers.showErrorToast(model.error); - // } else { - // if (myAllergiesList.length != 0) { - // await postAllergy(myAllergiesList: myAllergiesList, model: model); - // if (model.state == ViewState.ErrorLocal) { - // helpers.showErrorToast(model.error); - // } else { - // widget.changePageViewIndex(1); - // } - // } else { - // widget.changePageViewIndex(1); - // - // } - // - // } - // } else { - // if (myAllergiesList.length != 0) { - // await postAllergy(myAllergiesList: myAllergiesList, model: model); - // if (model.state == ViewState.ErrorLocal) { - // helpers.showErrorToast(model.error); - // } else { - // widget.changePageViewIndex(1); - // } - // } else { - // widget.changePageViewIndex(1); - // } - // } - // } - // } else { - // helpers.showErrorToast('Please add required field correctly'); - // } - - widget.changePageViewIndex(1); - - } - - postAllergy( - {List myAllergiesList, SOAPViewModel model}) async { - PostAllergyRequestModel postAllergyRequestModel = - new PostAllergyRequestModel(); - widget.myAllergiesList.forEach((allergy) { - if (postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM == - null) - postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM = []; - //TODO: make static value dynamic - postAllergyRequestModel.listHisProgNotePatientAllergyDiseaseVM - .add(ListHisProgNotePatientAllergyDiseaseVM( - allergyDiseaseId: allergy.selectedAllergy.id, - allergyDiseaseType: allergy.selectedAllergy.typeId, - patientMRN: widget.patientInfo.patientMRN, - episodeId: widget.patientInfo.episodeNo, - appointmentNo: widget.patientInfo.appointmentNo, - severity: allergy.selectedAllergySeverity.id, - remarks: allergy.remark, - createdBy: 4709, - // - createdOn: DateTime.now() - .toIso8601String(), //"2020-08-14T20:37:22.780Z", - editedBy: 4709, - editedOn: DateTime.now() - .toIso8601String(), //"2020-08-14T20:37:22.780Z", - isChecked: false, - isUpdatedByNurse: false)); - }); - await model.postAllergy(postAllergyRequestModel); - - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } - } - - postHistories( - {List myHistoryList, SOAPViewModel model}) async { - PostHistoriesRequestModel postHistoriesRequestModel = - new PostHistoriesRequestModel(); - widget.myHistoryList.forEach((history) { - if (postHistoriesRequestModel.listMedicalHistoryVM == null) - postHistoriesRequestModel.listMedicalHistoryVM = []; - //TODO: make static value dynamic - postHistoriesRequestModel.listMedicalHistoryVM.add(ListMedicalHistoryVM( - patientMRN: widget.patientInfo.patientMRN, - episodeId: widget.patientInfo.episodeNo, - appointmentNo: widget.patientInfo.appointmentNo, - remarks: "", - historyId: history.id, - historyType: history.typeId, - isChecked: false, - )); - }); - await model.postHistories(postHistoriesRequestModel); - - if (model.state == ViewState.ErrorLocal) { - helpers.showErrorToast(model.error); - } - } - - postChiefComplaint({SOAPViewModel model}) async { - formKey.currentState.save(); - if (formKey.currentState.validate()) { - PostChiefComplaintRequestModel postChiefComplaintRequestModel = - //TODO: make static value dynamic - new PostChiefComplaintRequestModel( - patientMRN: widget.patientInfo.patientMRN, - episodeID: widget.patientInfo.episodeNo, - appointmentNo: widget.patientInfo.appointmentNo, - chiefComplaint: complaintsController.text, - currentMedication: " currentMedication ", - hopi: illnessController.text, - isLactation: false, - ispregnant: false, - numberOfWeeks: 22); - - await model.postChiefComplaint(postChiefComplaintRequestModel); - } - } -} diff --git a/lib/widgets/patients/profile/profile_medical_info_widget.dart b/lib/widgets/patients/profile/profile_medical_info_widget.dart index 86789475..016b5972 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget.dart @@ -33,16 +33,16 @@ class ProfileMedicalInfoWidget extends StatelessWidget { PatientProfileButton( key: key, patient: patient, - nameLine1: "Create New", - nameLine2: "Episode", + nameLine1: TranslationBase.of(context).createNew, + nameLine2: TranslationBase.of(context).episode, route: CREATE_EPISODE, icon: 'create-episod.png'), if(int.parse(patientType) ==7) PatientProfileButton( key: key, patient: patient, - nameLine1: "Update", - nameLine2: "Episode", + nameLine1: TranslationBase.of(context).update, + nameLine2: TranslationBase.of(context).episode, route: UPDATE_EPISODE, icon: 'modilfy-episode.png'), Visibility( diff --git a/lib/widgets/patients/profile/soap_update/steps_widget.dart b/lib/widgets/patients/profile/soap_update/steps_widget.dart index d67d94e3..56f3435e 100644 --- a/lib/widgets/patients/profile/soap_update/steps_widget.dart +++ b/lib/widgets/patients/profile/soap_update/steps_widget.dart @@ -295,7 +295,7 @@ class StepsWidget extends StatelessWidget { height: index == 0 ? 5 : 10, ), AppText( - "SUBJECTIVE", + "شخصي", fontWeight: FontWeight.bold, fontSize: 16, ), @@ -345,7 +345,7 @@ class StepsWidget extends StatelessWidget { height: index == 1 ? 5 : 10, ), AppText( - "OBJECTIVE", + "هدف", fontWeight: FontWeight.bold, fontSize: 14, ), @@ -398,7 +398,7 @@ class StepsWidget extends StatelessWidget { padding: const EdgeInsets.only(right: 2), child: AppText( - "ASSESSMENT", + "تقدير", fontWeight: FontWeight.bold, fontSize: 14, ), @@ -451,7 +451,7 @@ class StepsWidget extends StatelessWidget { Container( margin: EdgeInsets.only(right:index == 3? 15:0), child: AppText( - "PLAN", + "خطة", fontWeight: FontWeight.bold, fontSize: 14, ), diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart b/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart index f03025ae..5d54dfa5 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_allergies_widget.dart @@ -33,14 +33,14 @@ class _UpdateAllergiesWidgetState extends State { @override Widget build(BuildContext context) { - final screenSize = MediaQuery.of(context).size; + ProjectViewModel projectViewModel = Provider.of(context); return Column( children: [ Container( margin: EdgeInsets.only(left: 10, right: 10, top: 15), child: TextFields( - hintText: "Add Allergies", + hintText: TranslationBase.of(context).addAllergies, fontSize: 13.5, onTapTextFields: () { openAllergiesList(context); @@ -80,13 +80,19 @@ class _UpdateAllergiesWidgetState extends State { Container( child: Expanded( - child: Texts(selectedAllergy.selectedAllergy.nameEn.toUpperCase(), - variant: "bodyText", bold: true, color: Colors.black), + child: Texts(projectViewModel.isArabic ? selectedAllergy + .selectedAllergy.nameAr : selectedAllergy + .selectedAllergy.nameEn.toUpperCase(), + variant: "bodyText", + bold: true, + color: Colors.black), ), width: MediaQuery.of(context).size.width * 0.5, ), Texts( - selectedAllergy.selectedAllergySeverity.nameEn + projectViewModel.isArabic ? selectedAllergy + .selectedAllergySeverity.nameAr : selectedAllergy + .selectedAllergySeverity.nameEn .toUpperCase(), variant: "bodyText", bold: true, @@ -131,8 +137,14 @@ class _UpdateAllergiesWidgetState extends State { return AddAllergies( addAllergiesFun: (MySelectedAllergy mySelectedAllergy) { setState(() { - widget.myAllergiesList.add(mySelectedAllergy); - Navigator.of(context).pop(); + if (!widget.myAllergiesList.contains(mySelectedAllergy)) { + widget.myAllergiesList.add(mySelectedAllergy); + Navigator.of(context).pop(); + } else { + helpers.showErrorToast(TranslationBase + .of(context) + .itemExist); + } }); },); }); @@ -215,7 +227,9 @@ class _AddAllergiesState extends State { height: 16, ), AppText( - "Add Allergy", + TranslationBase + .of(context) + .addAllergies, fontWeight: FontWeight.bold, fontSize: 16, ), @@ -233,18 +247,37 @@ class _AddAllergiesState extends State { } : null, child: _selectedAllergy==null? AutoCompleteTextField( - decoration: textFieldSelectorDecoration("Select Allergy", _selectedAllergy != null ? _selectedAllergy.nameEn : null, true,icon: EvaIcons.search), - itemSubmitted: (item) => setState(() => _selectedAllergy = item), + decoration: textFieldSelectorDecoration( + TranslationBase + .of(context) + .selectAllergy, + _selectedAllergy != null + ? _selectedAllergy.nameEn + : null, true, icon: EvaIcons.search), + itemSubmitted: (item) => + setState(() => _selectedAllergy = item), key: key, suggestions: model.allergiesList, - itemBuilder: (context, suggestion) => new Padding( - child:Texts( projectViewModel.isArabic? suggestion.nameAr: suggestion.nameEn), + itemBuilder: (context, suggestion) => + new Padding( + child: Texts( + projectViewModel.isArabic ? suggestion + .nameAr : suggestion.nameEn), padding: EdgeInsets.all(8.0)), itemSorter: (a, b) => 1, itemFilter: (suggestion, input) => - suggestion.nameAr.toLowerCase().startsWith(input.toLowerCase()) ||suggestion.nameEn.toLowerCase().startsWith(input.toLowerCase()), + suggestion.nameAr.toLowerCase().startsWith( + input.toLowerCase()) || + suggestion.nameEn.toLowerCase() + .startsWith(input.toLowerCase()), ):TextField( - decoration: textFieldSelectorDecoration("Select Allergy", _selectedAllergy != null ? _selectedAllergy.nameEn : null, true,icon: EvaIcons.search), + decoration: textFieldSelectorDecoration( + TranslationBase + .of(context) + .selectAllergy, + _selectedAllergy != null + ? projectViewModel.isArabic?_selectedAllergy.nameAr: _selectedAllergy.nameEn + : null, true, icon: EvaIcons.search), enabled: false, ), ), @@ -266,13 +299,6 @@ class _AddAllergiesState extends State { setState(() { _selectedAllergySeverity = selectedValue; - // model.getDoctorBranch().then((value) { - // _selectedBranch = value; - // if (_referTo['id'] == 1) { - // model.getClinics( - // _selectedBranch['ID']); - // } - // }); }); }, ); @@ -287,9 +313,11 @@ class _AddAllergiesState extends State { : null, child: TextField( decoration: textFieldSelectorDecoration( - "Select Severity", + TranslationBase + .of(context) + .selectSeverity, _selectedAllergySeverity != null - ? _selectedAllergySeverity.nameEn + ? projectViewModel.isArabic?_selectedAllergySeverity.nameAr:_selectedAllergySeverity.nameEn : null, true), enabled: false, @@ -303,12 +331,12 @@ class _AddAllergiesState extends State { margin: EdgeInsets.only( left: 0, right: 0, top: 15), child: TextFields( - hintText: "Remarks", + hintText: TranslationBase.of(context).remarks, fontSize: 13.5, // hintColor: Colors.black, fontWeight: FontWeight.w600, maxLines: 25, - minLines: 13, + minLines: 10, controller: remarkController, validator: (value) { if (value == null) diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart b/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart index f720fdfd..ebed11ca 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_history_widget.dart @@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart'; import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; @@ -16,6 +17,7 @@ import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class UpdateHistoryWidget extends StatefulWidget { final List myHistoryList; @@ -44,12 +46,13 @@ class _UpdateHistoryWidgetState extends State @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return Column( children: [ Container( margin: EdgeInsets.only(left: 10, right: 10, top: 15), child: TextFields( - hintText: "Add History", + hintText: TranslationBase.of(context).addHistory, fontSize: 13.5, onTapTextFields: () { openHistoryList(context); @@ -83,7 +86,7 @@ class _UpdateHistoryWidgetState extends State children: [ Container( child: Expanded( - child: Texts(myHistory.nameEn, + child: Texts(projectViewModel.isArabic?myHistory.nameAr:myHistory.nameEn, variant: "bodyText", bold: true, color: Colors.black), ), width: MediaQuery.of(context).size.width * 0.7, @@ -152,12 +155,17 @@ class PriorityBar extends StatefulWidget { class _PriorityBarState extends State { int _activePriority = 0; - + int index =-1; List _priorities = [ "Family", "Surgical/Sports", "Medical", ]; + List _prioritiesAr = [ + "أسرة", + "جراحي / رياضي" , + "طبي", + ]; BoxDecoration containerBorderDecoration( Color containerColor, Color borderColor) { @@ -175,6 +183,7 @@ class _PriorityBarState extends State { @override Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; + ProjectViewModel projectViewModel = Provider.of(context); return Container( height: screenSize.height * 0.070, @@ -183,8 +192,9 @@ class _PriorityBarState extends State { child: Row( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, - children: _priorities.map((item) { + children: _priorities.map((item,) { bool _isActive = _priorities[_activePriority] == item ? true : false; + index++; return Expanded( child: InkWell( child: Center( @@ -195,7 +205,7 @@ class _PriorityBarState extends State { _isActive ? HexColor("#B8382B") : Colors.white), child: Center( child: Text( - item, + (projectViewModel.isArabic)?_prioritiesAr[index]: item, style: TextStyle( fontSize: 12, color: _isActive diff --git a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart index 53007123..b9315a28 100644 --- a/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart +++ b/lib/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart @@ -24,7 +24,6 @@ import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body. import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:html/parser.dart'; class UpdateSubjectivePage extends StatefulWidget { final Function changePageViewIndex; @@ -52,10 +51,21 @@ class _UpdateSubjectivePageState extends State { final formKey = GlobalKey(); getHistory(SOAPViewModel model) async{ GetHistoryReqModel getHistoryReqModel = GetHistoryReqModel( - patientMRN: widget.patientInfo.patientMRN, - episodeID: widget.patientInfo.episodeNo.toString(), - appointmentNo: widget.patientInfo.appointmentNo - ); + patientMRN: widget.patientInfo.patientMRN, + episodeID: widget.patientInfo.episodeNo.toString(), + appointmentNo: widget.patientInfo.appointmentNo); + + getHistoryReqModel.historyType = + MasterKeysService.HistoryFamily.getMasterKeyService(); + await model.getPatientHistories(getHistoryReqModel, isFirst: true); + getHistoryReqModel.historyType = + MasterKeysService.HistoryMedical.getMasterKeyService(); + await model.getPatientHistories(getHistoryReqModel); + getHistoryReqModel.historyType = + MasterKeysService.HistorySurgical.getMasterKeyService(); + await model.getPatientHistories(getHistoryReqModel); + getHistoryReqModel.historyType = + MasterKeysService.HistorySports.getMasterKeyService(); await model.getPatientHistories(getHistoryReqModel); if (model.patientHistoryList.isNotEmpty) { @@ -67,32 +77,51 @@ class _UpdateSubjectivePageState extends State { } if (model.historySurgicalList.length == 0) { await model.getMasterLookup(MasterKeysService.HistorySurgical); + } + if (model.historySportList.length == 0) { await model.getMasterLookup(MasterKeysService.HistorySports); } model.patientHistoryList.forEach((element) { - if (element.historyType == MasterKeysService.HistoryFamily.getMasterKeyService()) { - widget.myHistoryList.add( model.getOneMasterKey( + if (element.historyType == + MasterKeysService.HistoryFamily.getMasterKeyService()) { + MasterKeyModel history = model.getOneMasterKey( masterKeys: MasterKeysService.HistoryFamily, id: element.historyId, - )); - }if (element.historyType == MasterKeysService.HistoryMedical.getMasterKeyService()) { - widget.myHistoryList.add( model.getOneMasterKey( + ); + if (history != null) { + widget.myHistoryList.add(history); + } + } + if (element.historyType == + MasterKeysService.HistoryMedical.getMasterKeyService()) { + MasterKeyModel history = model.getOneMasterKey( masterKeys: MasterKeysService.HistoryMedical, id: element.historyId, - )); - }if (element.historyType == MasterKeysService.HistorySports.getMasterKeyService()) { - widget.myHistoryList.add( model.getOneMasterKey( + ); + if (history != null) { + widget.myHistoryList.add(history); + } + } + if (element.historyType == + MasterKeysService.HistorySports.getMasterKeyService()) { + MasterKeyModel history = model.getOneMasterKey( masterKeys: MasterKeysService.HistorySports, id: element.historyId, - )); + ); + if (history != null) { + widget.myHistoryList.add(history); + } } if (element.historyType == MasterKeysService.HistorySurgical.getMasterKeyService()) { - widget.myHistoryList.add(model.getOneMasterKey( + MasterKeyModel history = model.getOneMasterKey( masterKeys: MasterKeysService.HistorySurgical, id: element.historyId, - )); + ); + if (history != null) { + widget.myHistoryList.add(history); + } } }); } @@ -165,7 +194,7 @@ class _UpdateSubjectivePageState extends State { children: [ Row( children: [ - Texts('CHIEF COMPLAINTS', + Texts(TranslationBase.of(context).chiefComplaints.toUpperCase(), variant: isChiefExpand ? "bodyText" : '', bold: isChiefExpand ? true : false, color: Colors.black), @@ -195,7 +224,9 @@ class _UpdateSubjectivePageState extends State { Container( margin: EdgeInsets.only(left: 10, right: 10, top: 15), child: TextFields( - hintText: "Add Chief Complaints", + hintText: TranslationBase + .of(context) + .addChiefComplaints, fontSize: 13.5, // hintColor: Colors.black, fontWeight: FontWeight.w600, @@ -203,7 +234,7 @@ class _UpdateSubjectivePageState extends State { minLines: 13, controller: complaintsController, validator: (value) { - if (value == null || value =="") + if (value == null || value == "") return TranslationBase .of(context) .emptyMessage; @@ -211,7 +242,7 @@ class _UpdateSubjectivePageState extends State { return TranslationBase .of(context) .chiefComplaintLength; - //""; + //""; else return null; }), @@ -222,7 +253,9 @@ class _UpdateSubjectivePageState extends State { Container( margin: EdgeInsets.only(left: 10, right: 10, top: 15), child: TextFields( - hintText: "History of Present Illness", + hintText: TranslationBase + .of(context) + .historyOfPresentIllness, fontSize: 13.5, // hintColor: Colors.black, fontWeight: FontWeight.w600, @@ -230,7 +263,7 @@ class _UpdateSubjectivePageState extends State { minLines: 13, controller: illnessController, validator: (value) { - if (value == null || value =="") + if (value == null || value == "") return TranslationBase .of(context) .emptyMessage; @@ -265,7 +298,10 @@ class _UpdateSubjectivePageState extends State { children: [ Row( children: [ - Texts('History'.toUpperCase(), + Texts(TranslationBase + .of(context) + .histories + .toUpperCase(), variant: isHistoryExpand ? "bodyText" : '', bold: isHistoryExpand ? true : false, color: Colors.black), @@ -306,7 +342,10 @@ class _UpdateSubjectivePageState extends State { children: [ Row( children: [ - Texts('Allergies'.toUpperCase(), + Texts(TranslationBase + .of(context) + .allergiesSoap + .toUpperCase(), variant: isAllergiesExpand ? "bodyText" : '', bold: isAllergiesExpand ? true : false, color: Colors.black), @@ -396,7 +435,9 @@ class _UpdateSubjectivePageState extends State { widget.changePageViewIndex(1); } else { - helpers.showErrorToast('Please add required field correctly'); + helpers.showErrorToast(TranslationBase + .of(context) + .requiredMsg); } diff --git a/lib/widgets/patients/profile/soap_update/update_assessment_page.dart b/lib/widgets/patients/profile/soap_update/update_assessment_page.dart index 86e98e4b..20684e19 100644 --- a/lib/widgets/patients/profile/soap_update/update_assessment_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_assessment_page.dart @@ -401,7 +401,7 @@ class _UpdateAssessmentPageState extends State { widget.changePageViewIndex(3); } } else { - helpers.showErrorToast('Please add required field correctly'); + helpers.showErrorToast(TranslationBase.of(context).requiredMsg); } widget.changePageViewIndex(3); @@ -664,7 +664,7 @@ class _AddAssessmentDetailsState extends State { margin: EdgeInsets.only( left: 0, right: 0, top: 15), child: TextFields( - hintText: "Remarks", + hintText: TranslationBase.of(context).remarks, fontSize: 13.5, // hintColor: Colors.black, fontWeight: FontWeight.w600, diff --git a/lib/widgets/patients/profile/soap_update/update_objective_page.dart b/lib/widgets/patients/profile/soap_update/update_objective_page.dart index 2abdfbae..e3aef3f4 100644 --- a/lib/widgets/patients/profile/soap_update/update_objective_page.dart +++ b/lib/widgets/patients/profile/soap_update/update_objective_page.dart @@ -306,7 +306,7 @@ class _UpdateObjectivePageState extends State { margin: EdgeInsets.only( left: 0, right: 0, top: 15), child: TextFields( - hintText: "Remarks", + hintText: TranslationBase.of(context).remarks, fontSize: 13.5, // hintColor: Colors.black, fontWeight: FontWeight.w600, @@ -390,7 +390,7 @@ class _UpdateObjectivePageState extends State { widget.changePageViewIndex(2); } } else { - helpers.showErrorToast('Please add required field correctly'); + helpers.showErrorToast(TranslationBase.of(context).requiredMsg); } widget.changePageViewIndex(2); diff --git a/lib/widgets/patients/profile/soap_update/update_soap_index.dart b/lib/widgets/patients/profile/soap_update/update_soap_index.dart index 9e5dd82b..fee067f4 100644 --- a/lib/widgets/patients/profile/soap_update/update_soap_index.dart +++ b/lib/widgets/patients/profile/soap_update/update_soap_index.dart @@ -6,11 +6,7 @@ import 'package:doctor_app_flutter/models/SOAP/my_selected_examination.dart'; import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/assessment_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/objective_page.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/plan_page.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/steps_widget.dart'; -import 'package:doctor_app_flutter/widgets/patients/profile/SOAP/subjective/subjective_page.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/subjective/update_subjective_page.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/soap_update/update_assessment_page.dart'; diff --git a/lib/widgets/shared/dialogs/master_key_dailog.dart b/lib/widgets/shared/dialogs/master_key_dailog.dart index a3be364b..55046c3c 100644 --- a/lib/widgets/shared/dialogs/master_key_dailog.dart +++ b/lib/widgets/shared/dialogs/master_key_dailog.dart @@ -1,6 +1,8 @@ +import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; // ignore: must_be_immutable class MasterKeyDailog extends StatefulWidget { @@ -30,10 +32,11 @@ class _MasterKeyDailogState extends State { @override Widget build(BuildContext context) { - return showAlertDialog(context); + ProjectViewModel projectViewModel = Provider.of(context); + return showAlertDialog(context, projectViewModel); } - showAlertDialog(BuildContext context) { + showAlertDialog(BuildContext context, ProjectViewModel projectViewModel) { // set up the buttons Widget cancelButton = FlatButton( child: Text(TranslationBase.of(context).cancel), @@ -49,7 +52,7 @@ class _MasterKeyDailogState extends State { // set up the AlertDialog AlertDialog alert = AlertDialog( // title: Text(widget.title), - content: createDialogList(), + content: createDialogList(projectViewModel), actions: [ cancelButton, continueButton, @@ -58,7 +61,7 @@ class _MasterKeyDailogState extends State { return alert; } - Widget createDialogList() { + Widget createDialogList(ProjectViewModel projectViewModel) { return Container( height: MediaQuery.of(context).size.height * 0.5, child: SingleChildScrollView( @@ -67,7 +70,7 @@ class _MasterKeyDailogState extends State { ...widget.list .map((item) => RadioListTile( title: Text( - '${item.nameEn}' + (widget.isICD ? '/${item.code}' : '')), + '${projectViewModel.isArabic?item.nameAr:item.nameEn}' + (widget.isICD ? '/${item.code}' : '')), groupValue: widget.isICD ? widget.selectedValue.code.toString() : widget.selectedValue.id.toString(), diff --git a/lib/widgets/shared/master_key_checkbox_search_widget.dart b/lib/widgets/shared/master_key_checkbox_search_widget.dart index f164be4b..7cc8eaad 100644 --- a/lib/widgets/shared/master_key_checkbox_search_widget.dart +++ b/lib/widgets/shared/master_key_checkbox_search_widget.dart @@ -1,6 +1,8 @@ import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/widgets/shared/Text.dart'; import 'package:doctor_app_flutter/widgets/shared/TextFields.dart'; import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart'; @@ -9,6 +11,7 @@ import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart'; import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class MasterKeyCheckboxSearchWidget extends StatefulWidget { final SOAPViewModel model; @@ -45,6 +48,8 @@ class _MasterKeyCheckboxSearchWidgetState extends State Date: Sun, 3 Jan 2021 00:14:09 +0200 Subject: [PATCH 16/18] small fix --- lib/widgets/shared/master_key_checkbox_search_widget.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/widgets/shared/master_key_checkbox_search_widget.dart b/lib/widgets/shared/master_key_checkbox_search_widget.dart index 7cc8eaad..aafb8adc 100644 --- a/lib/widgets/shared/master_key_checkbox_search_widget.dart +++ b/lib/widgets/shared/master_key_checkbox_search_widget.dart @@ -100,7 +100,7 @@ class _MasterKeyCheckboxSearchWidgetState extends State Date: Sun, 3 Jan 2021 00:17:01 +0200 Subject: [PATCH 17/18] small fix remove todo --- lib/client/base_app_client.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/client/base_app_client.dart b/lib/client/base_app_client.dart index 75894465..83923ea7 100644 --- a/lib/client/base_app_client.dart +++ b/lib/client/base_app_client.dart @@ -83,7 +83,6 @@ class BaseAppClient { } else { var parsed = json.decode(response.body.toString()); if (!parsed['IsAuthenticated']) { - // TODO: return it back when IsAuthenticated work fine in all service await helpers.logout(); helpers.showErrorToast('Your session expired Please login agian'); } else From 6a8c37e0d759d180caa32e48ded9db31a707f8e6 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sun, 3 Jan 2021 09:14:59 +0300 Subject: [PATCH 18/18] doctor leave --- lib/config/localized_values.dart | 1 + .../add-rescheduleleave.dart | 31 +++++++++++++++++++ .../reschedule-leaves/reschedule_leave.dart | 12 ++++--- lib/util/translations_delegate_base.dart | 1 + pubspec.lock | 13 ++++++-- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 05d91477..1490c7bc 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -479,4 +479,5 @@ const Map> localizedValues = { }, 'significantSigns': {'en': "SIGNIFICANT SIGNS", 'ar': 'علامات مهمة'}, 'backAbdomen': {'en': "Back : Abdomen", 'ar': 'الظهر: البطن'}, + 'reasons': {'en': "Reasons", 'ar': 'الأسباب'}, }; diff --git a/lib/screens/reschedule-leaves/add-rescheduleleave.dart b/lib/screens/reschedule-leaves/add-rescheduleleave.dart index c48eee79..a4739247 100644 --- a/lib/screens/reschedule-leaves/add-rescheduleleave.dart +++ b/lib/screens/reschedule-leaves/add-rescheduleleave.dart @@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/core/viewModel/leave_rechdule_response.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart'; import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; import 'package:doctor_app_flutter/models/sickleave/get_all_sickleave_response.dart'; @@ -15,10 +16,13 @@ import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/card_with_bgNew_widget.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; class AddRescheduleLeavScreen extends StatelessWidget { + ProjectViewModel projectsProvider; @override Widget build(BuildContext context) { + projectsProvider = Provider.of(context); return BaseView( onModelReady: (model) => {model.getRescheduleLeave(), model.getCoveringDoctors()}, @@ -157,6 +161,21 @@ class AddRescheduleLeavScreen extends StatelessWidget { item.doctorId)) ]) : SizedBox(), + AppText( + TranslationBase.of( + context) + .reasons, + fontWeight: + FontWeight.bold, + ), + model.allReasons.length > 0 + ? Row(children: [ + AppText(getReasons( + model + .allReasons, + item.reasonId)) + ]) + : SizedBox(), ], ), SizedBox( @@ -258,4 +277,16 @@ class AddRescheduleLeavScreen extends StatelessWidget { return obj.length > 0 ? obj[0]['doctorName'] : ""; } + + getReasons(model, reasonID) { + var obj; + obj = model.where((i) => i['id'] == reasonID).toList(); + print(obj); + + return obj.length > 0 + ? projectsProvider.isArabic == true + ? obj[0]['nameAr'] + : obj[0]['nameEn'] + : ""; + } } diff --git a/lib/screens/reschedule-leaves/reschedule_leave.dart b/lib/screens/reschedule-leaves/reschedule_leave.dart index 1a807392..c74395a3 100644 --- a/lib/screens/reschedule-leaves/reschedule_leave.dart +++ b/lib/screens/reschedule-leaves/reschedule_leave.dart @@ -732,16 +732,18 @@ class _RescheduleLeaveScreen extends State { getProfile() async { Map p = await sharedPref.getObj(DOCTOR_PROFILE); setState(() { - this.profile = p; - this.clinicID = widget.updateData.clinicId; + if (widget.updateData != null) { + this.profile = p; + this.clinicID = widget.updateData.clinicId; - _toDateController.text = widget.updateData.dateTimeFrom; - _toDateController2.text = widget.updateData.dateTimeTo; + _toDateController.text = widget.updateData.dateTimeFrom; + _toDateController2.text = widget.updateData.dateTimeTo; + } }); } getClinicName(model) { - var clinicID = this.profile != null ? this.profile['ClinicID'] : 1; + var clinicID = this.profile['ClinicID'] ?? 1; var clinicInfo = model.clinicsList.where((i) => i['ClinicID'] == clinicID).toList(); return clinicInfo.length > 0 ? clinicInfo[0]['ClinicDescription'] : ""; diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index f54e641d..b9aac20a 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -503,6 +503,7 @@ class TranslationBase { String get significantSigns => localizedValues['significantSigns'][locale.languageCode]; String get backAbdomen => localizedValues['backAbdomen'][locale.languageCode]; + String get reasons => localizedValues['reasons'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/pubspec.lock b/pubspec.lock index 9cbacb6d..7f1d8c1d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -260,6 +260,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.10" + date_time_picker: + dependency: "direct main" + description: + name: date_time_picker + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" device_info: dependency: "direct main" description: @@ -496,7 +503,7 @@ packages: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.4" + version: "1.3.0-nullsafety.3" mime: dependency: transitive description: @@ -753,7 +760,7 @@ packages: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.2" + version: "1.10.0-nullsafety.1" stream_channel: dependency: transitive description: @@ -888,5 +895,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0 <=2.11.0-213.1.beta" + dart: ">=2.10.0 <2.11.0" flutter: ">=1.22.0 <2.0.0"