diff --git a/lib/config/config.dart b/lib/config/config.dart index 1205d14c..abd07c03 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -191,6 +191,8 @@ const SEARCH_DRUG = 'Services/DoctorApplication.svc/REST/GetMedicationList'; const DRUG_TO_DRUG = 'Services/DoctorApplication.svc/REST/DrugToDrugInteraction'; const GET_MEDICAL_FILE = 'Services/DoctorApplication.svc/REST/GetMedicalFile'; +const GET_WARDS = 'Services/DoctorApplication.svc/REST/GetWards'; +const GET_DIAGNOSIS_TYPES = 'Services/DoctorApplication.svc/REST/DiagnosisTypes'; var selectedPatientType = 1; diff --git a/lib/core/enum/master_lookup_key.dart b/lib/core/enum/master_lookup_key.dart index f1ba1d46..e0c8ccc3 100644 --- a/lib/core/enum/master_lookup_key.dart +++ b/lib/core/enum/master_lookup_key.dart @@ -12,7 +12,8 @@ enum MasterKeysService { DiagnosisType, ICD10, TemperatureMethods, - Speciality + Speciality, + AdmissionRequestType, } extension SelectedMasterKeysService on MasterKeysService { @@ -57,6 +58,8 @@ extension SelectedMasterKeysService on MasterKeysService { return 2005; case MasterKeysService.Speciality: return 10; + case MasterKeysService.AdmissionRequestType: + return 2019; break; } } diff --git a/lib/core/model/admissionRequest/ward-model.dart b/lib/core/model/admissionRequest/ward-model.dart new file mode 100644 index 00000000..606758d3 --- /dev/null +++ b/lib/core/model/admissionRequest/ward-model.dart @@ -0,0 +1,26 @@ +class WardModel{ + + String description; + String descriptionN; + int floorID; + bool isActive; + + WardModel( + {this.description, this.descriptionN, this.floorID, this.isActive}); + + WardModel.fromJson(Map json) { + description = json['description']; + descriptionN = json['descriptionN']; + floorID = json['floorID']; + isActive = json['isActive']; + } + + Map toJson() { + final Map data = new Map(); + data['description'] = this.description; + data['descriptionN'] = this.descriptionN; + data['floorID'] = this.floorID; + data['isActive'] = this.isActive; + return data; + } +} \ 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 3bc6e61e..48a78ae7 100644 --- a/lib/core/service/base/lookup-service.dart +++ b/lib/core/service/base/lookup-service.dart @@ -37,6 +37,7 @@ class LookupService extends BaseService { List listOfICD10 = []; List listOfTemperatureMethods = []; List listOfSpeciality = []; + List listOfAdmissionType = []; Future getMasterLookup(MasterKeysService masterKeys) async { hasError = false; @@ -145,6 +146,13 @@ class LookupService extends BaseService { .add(MasterKeyModel.fromJson(v)); }); break; + case MasterKeysService.AdmissionRequestType: + listOfAdmissionType.clear(); + entryList.forEach((v) { + // listOfAdmissionType.add(MasterKeyModel.fromJson(v)); + listOfAdmissionType.add(v); + }); + break; } } diff --git a/lib/core/service/patient-admission-request-service.dart b/lib/core/service/patient-admission-request-service.dart index 62932908..dca7b60d 100644 --- a/lib/core/service/patient-admission-request-service.dart +++ b/lib/core/service/patient-admission-request-service.dart @@ -1,9 +1,14 @@ import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/model/admissionRequest/ward-model.dart'; import 'package:doctor_app_flutter/core/service/base/lookup-service.dart'; +import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart'; class AdmissionRequestService extends LookupService { List doctorsList = []; List specialityList = []; + List wardList = []; + List diagnosisTypesList = []; + List allergiesLookupList = []; setSpecialityList() { specialityList.clear(); @@ -12,6 +17,13 @@ class AdmissionRequestService extends LookupService { }); } + setAllergies() { + allergiesLookupList.clear(); + allergiesList.forEach((element) { + allergiesLookupList.add(element.toJson()); + }); + } + Future getDoctorsList() async { hasError = false; @@ -28,4 +40,50 @@ class AdmissionRequestService extends LookupService { body: Map(), ); } + + Future getWardList() async { + hasError = false; + + await baseAppClient.post( + GET_WARDS, + onSuccess: (dynamic response, int statusCode) { + wardList.clear(); + if (response['AdmissionMasterList'] != null && + response['AdmissionMasterList']['entityList'] != null) { + response['AdmissionMasterList']['entityList'].forEach((v) { + // wardList.add(WardModel.fromJson(v)); + wardList.add(v); + }); + } + }, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, + body: Map(), + ); + } + + Future getDiagnosisTypesList() async { + hasError = false; + + await baseAppClient.post( + GET_DIAGNOSIS_TYPES, + onSuccess: (dynamic response, int statusCode) { + diagnosisTypesList.clear(); + if (response['AdmissionDiagnosisList'] != null && + response['AdmissionDiagnosisList']['entityList'] != null) { + response['AdmissionDiagnosisList']['entityList'].forEach((v) { + // diagnosisTypesList.add(MasterKeyModel.fromJson(v)); + diagnosisTypesList.add(v); + }); + } + }, + 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 15f54e5d..d427eb67 100644 --- a/lib/core/viewModel/patient-admission-request-viewmodel.dart +++ b/lib/core/viewModel/patient-admission-request-viewmodel.dart @@ -1,6 +1,7 @@ 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/model/admissionRequest/ward-model.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'; @@ -15,20 +16,24 @@ class AdmissionRequestViewModel extends BaseViewModel{ List get speciality => _admissionRequestService.specialityList; + List get wardList => _admissionRequestService.wardList; + + List get admissionTypeList => _admissionRequestService.listOfAdmissionType; + + List get diagnosisTypesList => _admissionRequestService.diagnosisTypesList; + + List get allergiesList => _admissionRequestService.allergiesLookupList; + String selectedLanguage; Future getLanguage() async { selectedLanguage = await sharedPref.getString(APP_Language); } - Future getMasterLookup() async { - setState(ViewState.Busy); + Future getSpecialityList() async { await getLanguage(); - await _admissionRequestService.getMasterLookup(MasterKeysService.Speciality); - if (_admissionRequestService.hasError) { - error = _admissionRequestService.error; - setState(ViewState.Error); - } else { + await getMasterLookup(MasterKeysService.Speciality); + if (!_admissionRequestService.hasError) { _admissionRequestService.setSpecialityList(); await getClinicDoctors(); } @@ -43,4 +48,42 @@ class AdmissionRequestViewModel extends BaseViewModel{ } else setState(ViewState.Idle); } + + Future getWards() async { + setState(ViewState.Busy); + await _admissionRequestService.getWardList(); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getDiagnosis() async { + setState(ViewState.Busy); + await _admissionRequestService.getDiagnosisTypesList(); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } + + Future getAllergies() async { + await getMasterLookup(MasterKeysService.Allergies); + if (!_admissionRequestService.hasError) { + _admissionRequestService.setAllergies(); + } + } + + Future getMasterLookup(MasterKeysService keysService) async { + setState(ViewState.Busy); + await _admissionRequestService.getMasterLookup(keysService); + if (_admissionRequestService.hasError) { + error = _admissionRequestService.error; + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Idle); + } + } } \ No newline at end of file diff --git a/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart index 0831fffe..71955b0c 100644 --- a/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart +++ b/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart @@ -301,7 +301,7 @@ class DiagnosisWidget extends StatelessWidget { fontSize: SizeConfig.textMultiplier * 2.0, ), AppText( - "${diagnosis.icdCode10ID}}", + "${diagnosis.icdCode10ID}", fontWeight: FontWeight.normal, fontSize: SizeConfig.textMultiplier * 2.0, ), diff --git a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart index 1a9ac4fa..9b9ae5a5 100644 --- a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart +++ b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart @@ -222,19 +222,19 @@ class _UCAFInputScreenState extends State { ), Container( child: TextField( - decoration: Helpers.textFieldSelectorDecoration( - TranslationBase.of(context) - .additionalTextComplaints, - helpers.parseHtmlString(model - .patientChiefComplaintList[0] - .chiefComplaint), - false), - enabled: false, - controller: _additionalComplaintsController, - keyboardType: TextInputType.text, - /*minLines: 4, - maxLines: 6,*/ - )), + decoration: Helpers.textFieldSelectorDecoration( + TranslationBase.of(context) + .additionalTextComplaints, + helpers.parseHtmlString(model + .patientChiefComplaintList[0] + .chiefComplaint), + false), + enabled: false, + controller: _additionalComplaintsController, + keyboardType: TextInputType.multiline, + minLines: 1, + maxLines: 15, + )), SizedBox( height: 16, ), @@ -363,7 +363,9 @@ class _UCAFInputScreenState extends State { false), enabled: true, controller: _signsController, - keyboardType: TextInputType.text, + keyboardType: TextInputType.multiline, + minLines: null, + maxLines: null, )), SizedBox( height: 16, 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 7ccc3ade..76ce6e2b 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 @@ -14,7 +14,6 @@ import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import '../../../../routes.dart'; -import 'admission-request_second-screen.dart'; class AdmissionRequestDetailScreen extends StatefulWidget { @override @@ -35,7 +34,7 @@ class _AdmissionRequestDetailScreenState final screenSize = MediaQuery.of(context).size; return BaseView( - onModelReady: (model) => model.getMasterLookup(), + onModelReady: (model) => model.getSpecialityList(), builder: (_, model, w) => AppScaffold( baseViewModel: model, appBarTitle: TranslationBase.of(context).admissionRequest, @@ -178,6 +177,10 @@ class _AdmissionRequestDetailScreenState list: model.doctorsList, attributeName: 'DoctorName', attributeValueId: 'DoctorID', + usingSearch: true, + hintSearchText: + TranslationBase.of(context) + .doctorSearch, okText: TranslationBase.of(context) .ok, 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 index 3c1e06dc..b65b7f43 100644 --- a/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart +++ b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart @@ -1,18 +1,24 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/config/size_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/patient-admission-request-viewmodel.dart'; +import 'package:doctor_app_flutter/core/viewModel/project_view_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/date-utils.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/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:flutter/services.dart'; import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; import '../../../../routes.dart'; @@ -33,15 +39,17 @@ class _AdmissionRequestSecondScreenState bool _preAnesthesiaReferred = false; dynamic _selectedWard; dynamic _selectedAdmissionType; + dynamic _selectedDiagnosis; + dynamic _selectedAllergies; @override Widget build(BuildContext context) { final routeArgs = ModalRoute.of(context).settings.arguments as Map; PatiantInformtion patient = routeArgs['patient']; final screenSize = MediaQuery.of(context).size; + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( - // onModelReady: (model) => model.getMasterLookup(), builder: (_, model, w) => AppScaffold( baseViewModel: model, appBarTitle: TranslationBase.of(context).admissionRequest, @@ -179,40 +187,44 @@ class _AdmissionRequestSecondScreenState Container( height: screenSize.height * 0.070, child: InkWell( - onTap: - /*model.doctorsList != null && - model.doctorsList.length > 0 + onTap: model.wardList != null && + model.wardList.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, + openListDialogField('description', + 'description', model.wardList, + (selectedValue) { + setState(() { + _selectedWard = selectedValue; + }); + }); + } + : () async { + await model.getWards(); + if (model.state == ViewState.Idle && + model.wardList.length > 0) { + openListDialogField('description', + 'description', model.wardList, + (selectedValue) { + setState(() { + _selectedWard = selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, child: TextField( decoration: Helpers.textFieldSelectorDecoration( TranslationBase.of(context).ward, - /* _selectedWard != null - ? _selectedWard['DoctorName'] - :*/ - null, + _selectedWard != null + ? _selectedWard['description'] + : null, true), enabled: false, ), @@ -238,41 +250,51 @@ class _AdmissionRequestSecondScreenState Container( height: screenSize.height * 0.070, child: InkWell( - onTap: - /*model.doctorsList != null && - model.doctorsList.length > 0 + onTap: model.admissionTypeList != null && + model.admissionTypeList.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, + openListDialogField('nameEn', 'id', + model.admissionTypeList, + (selectedValue) { + setState(() { + _selectedAdmissionType = + selectedValue; + }); + }); + } + : () async { + await model.getMasterLookup( + MasterKeysService + .AdmissionRequestType); + if (model.state == ViewState.Idle && + model.admissionTypeList.length > + 0) { + openListDialogField('nameEn', + 'id', model.admissionTypeList, + (selectedValue) { + setState(() { + _selectedAdmissionType = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, child: TextField( decoration: Helpers.textFieldSelectorDecoration( TranslationBase.of(context) .admissionType, - /* _admissionType != null - ? _admissionType['DoctorName'] - :*/ - null, + _selectedAdmissionType != null + ? _selectedAdmissionType[ + 'nameEn'] + : null, true), enabled: false, ), @@ -284,41 +306,51 @@ class _AdmissionRequestSecondScreenState Container( height: screenSize.height * 0.070, child: InkWell( - onTap: - /*model.doctorsList != null && - model.doctorsList.length > 0 + onTap: model.diagnosisTypesList != null && + model.diagnosisTypesList.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, + openListDialogField('nameEn', 'id', + model.diagnosisTypesList, + (selectedValue) { + setState(() { + _selectedDiagnosis = + selectedValue; + }); + }); + } + : () async { + await model.getDiagnosis(); + if (model.state == ViewState.Idle && + model.diagnosisTypesList + .length > + 0) { + openListDialogField( + 'nameEn', + 'id', + model.diagnosisTypesList, + (selectedValue) { + setState(() { + _selectedDiagnosis = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, child: TextField( decoration: Helpers.textFieldSelectorDecoration( TranslationBase.of(context) .diagnosis, - /* _admissionType != null - ? _admissionType['DoctorName'] - :*/ - null, + _selectedDiagnosis != null + ? _selectedDiagnosis['nameEn'] + : null, true), enabled: false, ), @@ -347,41 +379,48 @@ class _AdmissionRequestSecondScreenState Container( height: screenSize.height * 0.070, child: InkWell( - onTap: - /*model.doctorsList != null && - model.doctorsList.length > 0 + onTap: model.allergiesList != null && + model.allergiesList.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, + openListDialogField('nameEn', 'id', + model.allergiesList, + (selectedValue) { + setState(() { + _selectedAllergies = + selectedValue; + }); + }); + } + : () async { + await model.getAllergies(); + if (model.state == ViewState.Idle && + model.allergiesList.length > + 0) { + openListDialogField('nameEn', + 'id', model.allergiesList, + (selectedValue) { + setState(() { + _selectedAllergies = + selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, child: TextField( decoration: Helpers.textFieldSelectorDecoration( TranslationBase.of(context) .allergies, - /* _admissionType != null - ? _admissionType['DoctorName'] - :*/ - null, + _selectedAllergies != null + ? _selectedAllergies['nameEn'] + : null, true), enabled: false, ), @@ -426,4 +465,59 @@ class _AdmissionRequestSecondScreenState updateDate(picked); } } + + void openListDialogField(String attributeName, String attributeValueId, + List list, Function(dynamic selectedValue) okFunction) { + ListSelectDialog dialog = ListSelectDialog( + list: list, + attributeName: attributeName, + attributeValueId: attributeValueId, + usingSearch: true, + okText: TranslationBase.of(context).ok, + okFunction: (selectedValue) { + okFunction(selectedValue); + }, + ); + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return dialog; + }, + ); + } + +/* + onTap: model.wardList != null && + model.wardList.length > 0 + ? () { + openListDialogField('description', + 'description', model.wardList, + (selectedValue) { + setState(() { + _selectedWard = selectedValue; + }); + }); + } + : () async { + await model.getWards(); + if (model.state == ViewState.Idle && + model.wardList.length > 0) { + openListDialogField('description', + 'description', model.wardList, + (selectedValue) { + setState(() { + _selectedWard = selectedValue; + }); + }); + } else if (model.state == + ViewState.ErrorLocal) { + DrAppToastMsg.showErrorToast( + model.error); + } else { + DrAppToastMsg.showErrorToast( + "Empty List"); + } + }, + */ }