From 4a4cd03f636109d911ed0b54f8b3afc56fb71e7d Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Thu, 21 Jan 2021 20:39:09 +0200 Subject: [PATCH] Prescription date --- lib/core/service/prescription_service.dart | 4 +- lib/core/viewModel/medicine_view_model.dart | 1 - .../viewModel/prescription_view_model.dart | 6 +- lib/core/viewModel/procedure_View_model.dart | 2 +- .../prescription/add_prescription_form.dart | 161 +++++++++++++++++- .../prescription/prescription_screen.dart | 21 ++- lib/screens/procedures/procedure_screen.dart | 37 +++- .../shared/dialogs/dailog-list-select.dart | 8 +- .../dialogs/search-drugs-dailog-list.dart | 92 ++++++++++ 9 files changed, 316 insertions(+), 16 deletions(-) diff --git a/lib/core/service/prescription_service.dart b/lib/core/service/prescription_service.dart index 6558ad6e..44e34627 100644 --- a/lib/core/service/prescription_service.dart +++ b/lib/core/service/prescription_service.dart @@ -46,7 +46,9 @@ class PrescriptionService extends BaseService { }, body: _prescriptionReqModel.toJson()); } - Future getDrugs() async { + Future getDrugs({String drugName}) async { + _drugRequestModel = SearchDrugRequestModel(search: [drugName]); + hasError = false; await baseAppClient.post(SEARCH_DRUG, diff --git a/lib/core/viewModel/medicine_view_model.dart b/lib/core/viewModel/medicine_view_model.dart index a86f6dfb..2d87c548 100644 --- a/lib/core/viewModel/medicine_view_model.dart +++ b/lib/core/viewModel/medicine_view_model.dart @@ -9,7 +9,6 @@ class MedicineViewModel extends BaseViewModel { get pharmacyItemsList => _medicineService.pharmacyItemsList; get pharmaciesList => _medicineService.pharmaciesList; - Future getMedicineItem(String itemName) async { setState(ViewState.Busy); await _medicineService.getMedicineItem(itemName); diff --git a/lib/core/viewModel/prescription_view_model.dart b/lib/core/viewModel/prescription_view_model.dart index 3e39a7fa..f8f58e4f 100644 --- a/lib/core/viewModel/prescription_view_model.dart +++ b/lib/core/viewModel/prescription_view_model.dart @@ -60,11 +60,11 @@ class PrescriptionViewModel extends BaseViewModel { } } - Future getDrugs() async { + Future getDrugs({String drugName}) async { hasError = false; //_insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); - await _prescriptionService.getDrugs(); + setState(ViewState.BusyLocal); + await _prescriptionService.getDrugs(drugName: drugName); if (_prescriptionService.hasError) { error = _prescriptionService.error; setState(ViewState.ErrorLocal); diff --git a/lib/core/viewModel/procedure_View_model.dart b/lib/core/viewModel/procedure_View_model.dart index 5e1d8d0c..fb84f505 100644 --- a/lib/core/viewModel/procedure_View_model.dart +++ b/lib/core/viewModel/procedure_View_model.dart @@ -68,7 +68,7 @@ class ProcedureViewModel extends BaseViewModel { } Future updateProcedure( - PostProcedureReqModel postProcedureReqModel, int mrn) async { + {PostProcedureReqModel postProcedureReqModel, int mrn}) async { hasError = false; //_insuranceCardService.clearInsuranceCard(); setState(ViewState.Busy); diff --git a/lib/screens/prescription/add_prescription_form.dart b/lib/screens/prescription/add_prescription_form.dart index 44c219fb..2f8b47cb 100644 --- a/lib/screens/prescription/add_prescription_form.dart +++ b/lib/screens/prescription/add_prescription_form.dart @@ -21,6 +21,7 @@ import 'package:doctor_app_flutter/widgets/shared/app_buttons_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/dialogs/dailog-list-select.dart'; +import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; @@ -107,6 +108,12 @@ class _PrescriptionFormWidgetState extends State { TextEditingController drugIdController = TextEditingController(); TextEditingController doseController = TextEditingController(); + final searchController = TextEditingController(); + + var notesList; + var filteredNotesList; + String textSeartch = "Amoxicillin"; + final GlobalKey formKey = GlobalKey(); final double spaceBetweenTextFileds = 12; List referToList; @@ -331,12 +338,13 @@ class _PrescriptionFormWidgetState extends State { @override Widget build(BuildContext context) { + ListSelectDialog drugDialog; final screenSize = MediaQuery.of(context).size; // final routeArgs = ModalRoute.of(context).settings.arguments as Map; // patient = routeArgs['patient']; return BaseView( - onModelReady: (model) => model.getDrugs(), + onModelReady: (model) => model.getDrugs(drugName: textSeartch), builder: (BuildContext context, PrescriptionViewModel model, Widget child) => NetworkBaseView( @@ -375,7 +383,7 @@ class _PrescriptionFormWidgetState extends State { onTap: model.drugsList != null && model.drugsList.length > 0 ? () { - ListSelectDialog dialog = + return drugDialog = ListSelectDialog( list: model.drugsList, attributeName: 'GenericName', @@ -388,17 +396,121 @@ class _PrescriptionFormWidgetState extends State { selectedDrug = selectedValue; }); }, + /* searchWidget: Row( + children: [ + Expanded( + child: TextField( + decoration: Helpers + .textFieldSelectorDecoration( + TranslationBase.of( + context) + .search, + searchController.text != + null && + searchController + .text != + "" + ? searchController + .text + : null, + false, + ), + onChanged: (String str) { + textSeartch = str; + }, + controller: + searchController, + enabled: true, + ), + ), + Container( + child: InkWell( + child: Icon( + Icons.search, + color: Colors.black, + ), + onTap: () async { + Navigator.of(context) + .pop(); + await searchMedicine( + context, + model, + textSeartch); + showDialog( + barrierDismissible: + false, + context: context, + builder: (BuildContext + context) { + return drugDialog; + }, + ); + }, + ), + margin: + EdgeInsets.symmetric( + horizontal: 8), + ) + ], + ),*/ ); showDialog( barrierDismissible: false, context: context, builder: (BuildContext context) { - return dialog; + return drugDialog; }, ); } : null, - child: TextField( + child: Row( + children: [ + Expanded( + child: TextField( + decoration: Helpers + .textFieldSelectorDecoration( + TranslationBase.of(context) + .search, + searchController.text != null && + searchController.text != + "" + ? searchController.text + : null, + false, + ), + onChanged: (String str) { + textSeartch = str; + }, + controller: searchController, + enabled: true, + ), + ), + Container( + child: InkWell( + child: Icon( + Icons.search, + color: Colors.black, + ), + onTap: () async { + // Navigator.of(context) + // .pop(); + await searchMedicine( + context, model, textSeartch); + showDialog( + barrierDismissible: false, + context: context, + builder: + (BuildContext context) { + return drugDialog; + }, + ); + }, + ), + margin: EdgeInsets.symmetric( + horizontal: 8), + ) + ], + ), /*TextField( decoration: textFieldSelectorDecoration( TranslationBase.of(context) .searchMedicine, @@ -410,8 +522,8 @@ class _PrescriptionFormWidgetState extends State { Icons.search, color: Colors.black, )), - enabled: false, - ), + enabled: true, + ),*/ ), ), SizedBox( @@ -981,4 +1093,41 @@ class _PrescriptionFormWidgetState extends State { ); }); } + + // searchData(String str, PrescriptionViewModel model) { + // var strExist = str.length > 0 ? true : false; + // + // if (strExist) { + // filteredNotesList = null; + // filteredNotesList = model.drugsList + // .where((note) => + // note["GenericName"].toString().contains(str.toUpperCase())) + // .toList(); + // setState(() { + // notesList = filteredNotesList; + // }); + // } else { + // setState(() { + // notesList = model.drugsList; + // }); + // } + // } + + searchMedicine(context, PrescriptionViewModel model, String str) async { + FocusScope.of(context).unfocus(); + // if (searchController.text.isEmpty()) { + // helpers.showErrorToast(TranslationBase.of(context).typeMedicineName); + // //"Type Medicine Name") + // return; + // } + if (searchController.text.length < 0) { + helpers.showErrorToast(TranslationBase.of(context).moreThan3Letter); + return; + } + + GifLoaderDialogUtils.showMyDialog(context); + + await model.getDrugs(drugName: searchController.text); + GifLoaderDialogUtils.hideDialog(context); + } } diff --git a/lib/screens/prescription/prescription_screen.dart b/lib/screens/prescription/prescription_screen.dart index c1f00092..4d000838 100644 --- a/lib/screens/prescription/prescription_screen.dart +++ b/lib/screens/prescription/prescription_screen.dart @@ -9,6 +9,7 @@ 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/screens/prescription/add_prescription_form.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_profile_widget.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/profile_medical_info_widget.dart'; @@ -337,7 +338,25 @@ class _NewPrescriptionScreenState extends State { child: Column( children: [ AppText( - '8\nDEC', + DateTime.parse(model + .prescriptionList[ + 0] + .entityList[ + index] + .startDate) + .day + .toString(), + color: Colors + .green, + ), + AppText( + Helpers.getMonth(model.prescriptionList[0].entityList[index].startDate != + null + ? (DateTime.parse(model.prescriptionList[0].entityList[index].startDate) + .month) + : DateTime.now() + .month) + .toUpperCase(), color: Colors .green, ) diff --git a/lib/screens/procedures/procedure_screen.dart b/lib/screens/procedures/procedure_screen.dart index 667bcc6d..5483ffd9 100644 --- a/lib/screens/procedures/procedure_screen.dart +++ b/lib/screens/procedures/procedure_screen.dart @@ -11,6 +11,7 @@ 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/screens/procedures/entity_list_checkbox_search_widget.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_profile_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/Text.dart'; @@ -271,7 +272,36 @@ class _ProcedureScreenState extends State { child: Column( children: [ AppText( - '8\nDEC', + DateTime.parse(model + .procedureList[ + 0] + .entityList[ + index] + .orderDate) + .day + .toString(), + color: + Colors.green, + ), + AppText( + Helpers.getMonth(model + .procedureList[ + 0] + .entityList[ + index] + .orderDate != + null + ? (DateTime.parse(model + .procedureList[ + 0] + .entityList[ + index] + .orderDate) + .month) + : DateTime + .now() + .month) + .toUpperCase(), color: Colors.green, ) @@ -421,6 +451,8 @@ class _ProcedureScreenState extends State { child: Icon( Icons.edit), onTap: () { + // model + // .updateProcedure(); updateProcedureForm( context, remarks: model @@ -691,7 +723,8 @@ updateProcedure( category: categorieId, procedure: procedureId, controls: controls)); updateProcedureReqModel.procedures = controlsProcedure; - await model.updateProcedure(updateProcedureReqModel, patient.patientMRN); + await model.updateProcedure( + postProcedureReqModel: updateProcedureReqModel, mrn: patient.patientMRN); if (model.state == ViewState.ErrorLocal) { helpers.showErrorToast(model.error); diff --git a/lib/widgets/shared/dialogs/dailog-list-select.dart b/lib/widgets/shared/dialogs/dailog-list-select.dart index 68dce5a4..fa33a72d 100644 --- a/lib/widgets/shared/dialogs/dailog-list-select.dart +++ b/lib/widgets/shared/dialogs/dailog-list-select.dart @@ -1,3 +1,6 @@ +import 'package:doctor_app_flutter/client/base_app_client.dart'; +import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; +import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:flutter/material.dart'; @@ -8,13 +11,15 @@ class ListSelectDialog extends StatefulWidget { final okText; final Function(dynamic) okFunction; dynamic selectedValue; + final Widget searchWidget; ListSelectDialog( {@required this.list, @required this.attributeName, @required this.attributeValueId, @required this.okText, - @required this.okFunction}); + @required this.okFunction, + this.searchWidget}); @override _ListSelectDialogState createState() => _ListSelectDialogState(); @@ -63,6 +68,7 @@ class _ListSelectDialogState extends State { child: SingleChildScrollView( child: Column( children: [ + if (widget.searchWidget != null) widget.searchWidget, ...widget.list .map((item) => RadioListTile( title: Text("${item[widget.attributeName].toString()}"), diff --git a/lib/widgets/shared/dialogs/search-drugs-dailog-list.dart b/lib/widgets/shared/dialogs/search-drugs-dailog-list.dart index e69de29b..68dce5a4 100644 --- a/lib/widgets/shared/dialogs/search-drugs-dailog-list.dart +++ b/lib/widgets/shared/dialogs/search-drugs-dailog-list.dart @@ -0,0 +1,92 @@ +import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:flutter/material.dart'; + +class ListSelectDialog extends StatefulWidget { + final List list; + final String attributeName; + final String attributeValueId; + final okText; + final Function(dynamic) okFunction; + dynamic selectedValue; + + ListSelectDialog( + {@required this.list, + @required this.attributeName, + @required this.attributeValueId, + @required this.okText, + @required this.okFunction}); + + @override + _ListSelectDialogState createState() => _ListSelectDialogState(); +} + +class _ListSelectDialogState extends State { + @override + void initState() { + super.initState(); + widget.selectedValue = widget.selectedValue ?? widget.list[0]; + } + + @override + Widget build(BuildContext context) { + return showAlertDialog(context); + } + + showAlertDialog(BuildContext context) { + // set up the buttons + Widget cancelButton = FlatButton( + child: Text(TranslationBase.of(context).cancel), + onPressed: () { + Navigator.of(context).pop(); + }); + Widget continueButton = FlatButton( + child: Text(this.widget.okText), + onPressed: () { + this.widget.okFunction(widget.selectedValue); + Navigator.of(context).pop(); + }); +// set up the AlertDialog + AlertDialog alert = AlertDialog( + // title: Text(widget.title), + content: createDialogList(), + actions: [ + cancelButton, + continueButton, + ], + ); + return alert; + } + + Widget createDialogList() { + return Container( + height: MediaQuery.of(context).size.height * 0.5, + child: SingleChildScrollView( + child: Column( + children: [ + ...widget.list + .map((item) => RadioListTile( + title: Text("${item[widget.attributeName].toString()}"), + groupValue: widget.selectedValue[widget.attributeValueId] + .toString(), + value: item[widget.attributeValueId].toString(), + activeColor: Colors.blue.shade700, + selected: item[widget.attributeValueId].toString() == + widget.selectedValue[widget.attributeValueId] + .toString(), + onChanged: (val) { + setState(() { + widget.selectedValue = item; + }); + }, + )) + .toList() + ], + ), + ), + ); + } + + static closeAlertDialog(BuildContext context) { + Navigator.of(context).pop(); + } +}