diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1cf7499c..59cdf14c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -328,4 +328,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 649616dc336b3659ac6b2b25159d8e488e042b69 -COCOAPODS: 1.10.0.rc.1 +COCOAPODS: 1.10.1 diff --git a/lib/client/base_app_client.dart b/lib/client/base_app_client.dart index 7336db13..f73d4068 100644 --- a/lib/client/base_app_client.dart +++ b/lib/client/base_app_client.dart @@ -24,7 +24,7 @@ class BaseAppClient { bool isAllowAny = false}) async { String url = BASE_URL + endPoint; - bool callLog= true; + bool callLog = true; try { Map profile = await sharedPref.getObj(DOCTOR_PROFILE); String token = await sharedPref.getString(TOKEN); @@ -48,7 +48,8 @@ class BaseAppClient { if (body['EditedBy'] == '') { body.remove("EditedBy"); } - body['TokenID'] = token ?? ''; + body['TokenID'] = "@dm!n";// token ?? ''; + // body['TokenID'] = "@dm!n" ?? ''; String lang = await sharedPref.getString(APP_Language); if (lang != null && lang == 'ar') body['LanguageID'] = 1; @@ -74,9 +75,9 @@ class BaseAppClient { //int projectID = await sharedPref.getInt(PROJECT_ID); //if (projectID == 2 || projectID == 3) - // body['PatientOutSA'] = true; + // body['PatientOutSA'] = true; //else - body['PatientOutSA'] = false; + body['PatientOutSA'] = false; body['DeviceTypeID'] = Platform.isAndroid ? 1 : 2; print("URL : $url"); @@ -104,7 +105,9 @@ class BaseAppClient { if (body['OTP_SendType'] != null) { onFailure(getError(parsed), statusCode); } else if (!isAllowAny) { - await Provider.of(AppGlobal.CONTEX, listen: false).logout(); + await Provider.of(AppGlobal.CONTEX, + listen: false) + .logout(); Helpers.showErrorToast('Your session expired Please login again'); } if (isAllowAny) { diff --git a/lib/config/config.dart b/lib/config/config.dart index 1760caef..54a2d46e 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 = @@ -283,11 +283,14 @@ const GET_SICK_LEAVE_PATIENT = "Services/Patients.svc/REST/GetPatientSickLeave"; const GET_MY_OUT_PATIENT = "Services/DoctorApplication.svc/REST/GetMyOutPatient"; - -const PATIENT_MEDICAL_REPORT_GET_LIST = "Services/Patients.svc/REST/DAPP_ListMedicalReport"; -const PATIENT_MEDICAL_REPORT_GET_TEMPLATE = "Services/Patients.svc/REST/DAPP_GetTemplateByID"; -const PATIENT_MEDICAL_REPORT_INSERT = "Services/Patients.svc/REST/DAPP_InsertMedicalReport"; -const PATIENT_MEDICAL_REPORT_VERIFIED = "Services/Patients.svc/REST/DAPP_VerifiedMedicalReport"; +const PATIENT_MEDICAL_REPORT_GET_LIST = + "Services/Patients.svc/REST/DAPP_ListMedicalReport"; +const PATIENT_MEDICAL_REPORT_GET_TEMPLATE = + "Services/Patients.svc/REST/DAPP_GetTemplateByID"; +const PATIENT_MEDICAL_REPORT_INSERT = + "Services/Patients.svc/REST/DAPP_InsertMedicalReport"; +const PATIENT_MEDICAL_REPORT_VERIFIED = + "Services/Patients.svc/REST/DAPP_VerifiedMedicalReport"; const GET_PROCEDURE_TEMPLETE = 'Services/Doctors.svc/REST/DAPP_ProcedureTemplateGet'; diff --git a/lib/core/viewModel/procedure_View_model.dart b/lib/core/viewModel/procedure_View_model.dart index 4f9a7cf6..3bdd676f 100644 --- a/lib/core/viewModel/procedure_View_model.dart +++ b/lib/core/viewModel/procedure_View_model.dart @@ -115,7 +115,7 @@ class ProcedureViewModel extends BaseViewModel { tempId = templateId; hasError = false; //_insuranceCardService.clearInsuranceCard(); - setState(ViewState.Busy); + setState(ViewState.BusyLocal); await _procedureService.getProcedureTemplateDetails(templateId: templateId); if (_procedureService.hasError) { error = _procedureService.error; diff --git a/lib/screens/procedures/ExpansionProcedure.dart b/lib/screens/procedures/ExpansionProcedure.dart new file mode 100644 index 00000000..188f6634 --- /dev/null +++ b/lib/screens/procedures/ExpansionProcedure.dart @@ -0,0 +1,189 @@ +import 'package:doctor_app_flutter/client/base_app_client.dart'; +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/model/procedure/procedure_templateModel.dart'; +import 'package:doctor_app_flutter/core/model/procedure/procedure_template_details_model.dart'; +import 'package:doctor_app_flutter/core/model/procedure/procedure_template_details_request_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/procedure_View_model.dart'; +import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ExpansionProcedure extends StatefulWidget { + final ProcedureTempleteModel procedureTempleteModel; + final ProcedureViewModel model; + final Function(ProcedureTempleteDetailsModel) removeFavProcedure; + final Function(ProcedureTempleteDetailsModel) addFavProcedure; + final Function(ProcedureTempleteDetailsModel) addProceduresRemarks; + + final bool Function(ProcedureTempleteModel) isEntityListSelected; + final bool Function(ProcedureTempleteDetailsModel) isEntityFavListSelected; + + const ExpansionProcedure( + {Key key, + this.procedureTempleteModel, + this.model, + this.removeFavProcedure, + this.addFavProcedure, + this.addProceduresRemarks, + this.isEntityListSelected, + this.isEntityFavListSelected}) + : super(key: key); + + @override + _ExpansionProcedureState createState() => _ExpansionProcedureState(); +} + +class _ExpansionProcedureState extends State { + bool _isShowMore = false; + List _templateDetailsList = List(); + BaseAppClient baseAppClient = BaseAppClient(); + @override + Widget build(BuildContext context) { + return Column( + children: [ + InkWell( + onTap: () async { + if (!_isShowMore && _templateDetailsList.isEmpty) { + GifLoaderDialogUtils.showMyDialog(context); + await getProcedureTemplateDetails(widget.procedureTempleteModel.templateID); + GifLoaderDialogUtils.hideDialog(context); + } + setState(() { + _isShowMore = !_isShowMore; + }); + }, + child: Container( + padding: EdgeInsets.all(10.0), + margin: EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(5.0), + )), + child: Row( + children: [ + Expanded( + child: Row( + children: [ + Icon( + Icons.folder, + size: 20, + color: Color(0xff575757), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 0), + child: AppText( + "Procedures for " + + widget.procedureTempleteModel.templateName, + fontSize: 16.0, + variant: "bodyText", + bold: true, + color: Color(0xff575757)), + ), + ), + ], + )), + Container( + width: 25, + height: 25, + child: Icon( + _isShowMore + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + color: Colors.grey[800], + size: 22, + ), + ) + ], + ), + ), + ), + if (_isShowMore) + AnimatedContainer( + padding: EdgeInsets.all(10.0), + margin: EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(5.0), + bottomRight: Radius.circular(5.0), + )), + duration: Duration(milliseconds: 7000), + child: Column( + children: + _templateDetailsList.map((itemProcedure) { + return Container( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 11), + child: Checkbox( + value: widget + .isEntityFavListSelected(itemProcedure), + activeColor: Color(0xffD02127), + onChanged: (bool newValue) { + setState(() { + if (widget.isEntityFavListSelected(itemProcedure)) { + widget.removeFavProcedure(itemProcedure); + } else { + widget.addFavProcedure(itemProcedure); + } + }); + }), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 0), + child: AppText(itemProcedure.procedureName, + fontSize: 14.0, + variant: "bodyText", + bold: true, + color: Color(0xff575757)), + ), + ), + ], + ), + ], + ), + ), + ); + }).toList(), + ), + ), + SizedBox( + height: 10, + ), + ], + ); + } + + getProcedureTemplateDetails(templateId)async { + ProcedureTempleteDetailsRequestModel _procedureTempleteDetailsRequestModel = ProcedureTempleteDetailsRequestModel(templateID: templateId, searchType: 1, patientID: 0); + _templateDetailsList.clear(); + await baseAppClient.post(GET_PROCEDURE_TEMPLETE_DETAILS, + onSuccess: (dynamic response, int statusCode) { + response['HIS_ProcedureTemplateDetailsList'].forEach((template) { + setState(() { + _templateDetailsList.add(ProcedureTempleteDetailsModel.fromJson(template)); + }); + }); + }, onFailure: (String error, int statusCode) { + DrAppToastMsg.showErrorToast(error); + + }, body: _procedureTempleteDetailsRequestModel.toJson()); + } + +} diff --git a/lib/screens/procedures/add-favourite-procedure.dart b/lib/screens/procedures/add-favourite-procedure.dart index 89a382ad..fe95735d 100644 --- a/lib/screens/procedures/add-favourite-procedure.dart +++ b/lib/screens/procedures/add-favourite-procedure.dart @@ -20,15 +20,18 @@ class AddFavouriteProcedure extends StatefulWidget { const AddFavouriteProcedure({Key key, this.model, this.patient}) : super(key: key); + @override _AddFavouriteProcedureState createState() => _AddFavouriteProcedureState(); } class _AddFavouriteProcedureState extends State { _AddFavouriteProcedureState({this.patient, this.model}); + ProcedureViewModel model; PatiantInformtion patient; List entityList = List(); + @override Widget build(BuildContext context) { return BaseView( @@ -49,12 +52,7 @@ class _AddFavouriteProcedureState extends State { Expanded( child: NetworkBaseView( baseViewModel: model, - child: - // selectedCategory != null - // ? selectedCategory['categoryId'] == 02 || - // selectedCategory['categoryId'] == 03 - // ? - EntityListCheckboxSearchFavProceduresWidget( + child: EntityListCheckboxSearchFavProceduresWidget( model: widget.model, masterList: widget.model.procedureTemplate, removeFavProcedure: (item) { @@ -73,30 +71,7 @@ class _AddFavouriteProcedureState extends State { }, isEntityFavListSelected: (master) => isEntityListSelected(master), - ) - // : ProcedureListWidget( - // model: widget.model, - // masterList: widget.model - // .categoriesList[0].entityList, - // removeHistory: (item) { - // setState(() { - // entityList.remove(item); - // }); - // }, - // addHistory: (history) { - // setState(() { - // entityList.add(history); - // }); - // }, - // addSelectedHistories: () { - // //TODO build your fun herr - // // widget.addSelectedHistories(); - // }, - // isEntityListSelected: (master) => - // isEntityListSelected(master), - // ) - // : null, - ), + )), ), Container( margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5), @@ -108,8 +83,6 @@ class _AddFavouriteProcedureState extends State { color: Color(0xff359846), fontWeight: FontWeight.w700, onPressed: () { - //print(entityList.toString()); - onPressed: if (entityList.isEmpty == true) { DrAppToastMsg.showErrorToast( TranslationBase.of(context) @@ -119,12 +92,6 @@ class _AddFavouriteProcedureState extends State { } Navigator.pop(context); - // postProcedure( - // orderType: selectedType.toString(), - // entityList: entityList, - // patient: patient, - // model: widget.model, - // remarks: remarksController.text); }, ), ], @@ -138,7 +105,7 @@ class _AddFavouriteProcedureState extends State { bool isEntityListSelected(ProcedureTempleteDetailsModel masterKey) { Iterable history = entityList - .where((element) => masterKey.templateID == element.templateID); + .where((element) => masterKey.templateID == element.templateID && masterKey.procedureName == element.procedureName); if (history.length > 0) { return true; } diff --git a/lib/screens/procedures/entity_list_fav_procedure.dart b/lib/screens/procedures/entity_list_fav_procedure.dart index 31b2a784..1dac2f24 100644 --- a/lib/screens/procedures/entity_list_fav_procedure.dart +++ b/lib/screens/procedures/entity_list_fav_procedure.dart @@ -11,6 +11,8 @@ import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'ExpansionProcedure.dart'; + class EntityListCheckboxSearchFavProceduresWidget extends StatefulWidget { final ProcedureViewModel model; final Function addSelectedHistories; @@ -70,6 +72,7 @@ class _EntityListCheckboxSearchFavProceduresWidgetState } TextEditingController remarksController = TextEditingController(); + @override Widget build(BuildContext context) { return Container( @@ -102,116 +105,14 @@ class _EntityListCheckboxSearchFavProceduresWidgetState items.length != 0 ? Column( children: items.map((historyInfo) { - return Column( - children: [ - ExpansionTile( - title: InkWell( - onTap: () { - widget.model - .getProcedureTemplateDetails( - templateId: - historyInfo.templateID); - }, - child: Row( - children: [ - Icon( - Icons.folder, - size: 20, - color: Color(0xff575757), - ), - Expanded( - child: Padding( - padding: - const EdgeInsets.symmetric( - horizontal: 10, - vertical: 0), - child: AppText( - "Procedures for " + - historyInfo.templateName, - fontSize: 16.0, - variant: "bodyText", - bold: true, - color: Color(0xff575757)), - ), - ), - ], - ), - ), - children: [ - Column( - children: widget - .model.procedureTemplateDetails - .map((itemProcedure) { - return Container( - child: Padding( - padding: EdgeInsets.symmetric( - horizontal: 12), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - children: [ - Padding( - padding: - const EdgeInsets - .symmetric( - horizontal: 11), - child: Checkbox( - value: widget - .isEntityFavListSelected( - itemProcedure), - activeColor: Color( - 0xffD02127), - onChanged: (bool - newValue) { - setState(() { - if (widget - .isEntityFavListSelected( - itemProcedure)) { - widget.removeFavProcedure( - itemProcedure); - } else { - widget.addFavProcedure( - itemProcedure); - } - }); - }), - ), - Expanded( - child: Padding( - padding: - const EdgeInsets - .symmetric( - horizontal: - 10, - vertical: 0), - child: AppText( - itemProcedure - .procedureName, - fontSize: 14.0, - variant: - "bodyText", - bold: true, - color: Color( - 0xff575757)), - ), - ), - ], - ), - ], - ), - ), - ); - }).toList(), - ), - SizedBox( - height: 2.0, - ), - DividerWithSpacesAround(), - ], - ), - ], + return ExpansionProcedure( + procedureTempleteModel: historyInfo, + model: widget.model, + removeFavProcedure: widget.removeFavProcedure, + addFavProcedure: widget.addFavProcedure, + addProceduresRemarks: widget.addProceduresRemarks, + isEntityListSelected: widget.isEntityListSelected, + isEntityFavListSelected: widget.isEntityFavListSelected, ); }).toList(), ) diff --git a/lib/screens/procedures/procedure_checkout_screen.dart b/lib/screens/procedures/procedure_checkout_screen.dart new file mode 100644 index 00000000..04bbaa3a --- /dev/null +++ b/lib/screens/procedures/procedure_checkout_screen.dart @@ -0,0 +1,227 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/model/procedure/categories_procedure.dart'; +import 'package:doctor_app_flutter/core/viewModel/procedure_View_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/TextFields.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/buttons/app_buttons_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ProcedureCheckOutScreen extends StatefulWidget { + @override + _ProcedureCheckOutScreenState createState() => + _ProcedureCheckOutScreenState(); +} + +class _ProcedureCheckOutScreenState extends State { + List items = List(); + List remarksList = List(); + List typeList = List(); + int selectedType = 0; + setSelectedType(int val) { + setState(() { + selectedType = val; + }); + } + + @override + Widget build(BuildContext context) { + return BaseView( + builder: (BuildContext context, ProcedureViewModel model, Widget child) => + AppScaffold( + backgroundColor: Color(0xffF8F8F8).withOpacity(0.9), + isShowAppBar: false, + body: Column( + children: [ + Container( + height: MediaQuery.of(context).size.height * 0.070, + color: Colors.white, + ), + Container( + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Row( + //mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + child: Icon( + Icons.arrow_back_ios_sharp, + size: 24.0, + ), + onTap: () { + Navigator.pop(context); + }, + ), + SizedBox( + width: 5.0, + ), + AppText( + 'Add Procedure', + fontWeight: FontWeight.w700, + fontSize: 20, + ), + ], + ), + ), + ), + SizedBox( + height: MediaQuery.of(context).size.height * 0.022, + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: ListView.builder( + scrollDirection: Axis.vertical, + physics: AlwaysScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: 1, + itemBuilder: (BuildContext context, int index) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: + BorderRadius.all(Radius.circular(10.0))), + child: ExpansionTile( + initiallyExpanded: true, + title: Row( + children: [ + Icon( + Icons.check_box, + color: Color(0xffD02127), + size: 30.5, + ), + SizedBox( + width: 6.0, + ), + AppText('Procedure Name'), + ], + ), + children: [ + Container( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 11), + child: AppText( + TranslationBase.of(context).orderType, + fontWeight: FontWeight.w700, + color: Color(0xff2B353E), + ), + ), + ], + ), + Row( + children: [ + Radio( + activeColor: Color(0xFFD02127), + value: 0, + groupValue: selectedType, + onChanged: (value) { + // historyInfo.type = + // setSelectedType(value).toString(); + // + // historyInfo.type = value.toString(); + }, + ), + AppText( + 'routine', + color: Color(0xff575757), + fontWeight: FontWeight.w600, + ), + Radio( + activeColor: Color(0xFFD02127), + groupValue: selectedType, + value: 1, + onChanged: (value) { + // historyInfo.type = + // setSelectedType(value).toString(); + // + // historyInfo.type = value.toString(); + }, + ), + AppText( + TranslationBase.of(context).urgent, + color: Color(0xff575757), + fontWeight: FontWeight.w600, + ), + ], + ), + ], + ), + ), + ), + SizedBox( + height: 2.0, + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: 12, vertical: 15.0), + child: TextFields( + hintText: TranslationBase.of(context).remarks, + //controller: remarksController, + onChanged: (value) { + // historyInfo.remarks = value; + }, + minLines: 3, + maxLines: 5, + borderWidth: 0.5, + borderColor: Colors.grey[500], + ), + ), + SizedBox( + height: 19.0, + ), + //DividerWithSpacesAround(), + ], + ), + ); + }), + ), + ], + ), + bottomSheet: Container( + margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5), + child: Wrap( + alignment: WrapAlignment.center, + children: [ + AppButton( + title: TranslationBase.of(context).addSelectedProcedures, + color: Color(0xff359846), + fontWeight: FontWeight.w700, + onPressed: () { + //print(entityList.toString()); + onPressed: + // if (entityList.isEmpty == true) { + // DrAppToastMsg.showErrorToast( + // TranslationBase.of(context) + // .fillTheMandatoryProcedureDetails, + // ); + // return; + // } + + Navigator.pop(context); + // postProcedure( + // orderType: selectedType.toString(), + // entityList: entityList, + // patient: patient, + // model: widget.model, + // remarks: remarksController.text); + }, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/screens/procedures/procedure_screen.dart b/lib/screens/procedures/procedure_screen.dart index b964392e..8d03f86c 100644 --- a/lib/screens/procedures/procedure_screen.dart +++ b/lib/screens/procedures/procedure_screen.dart @@ -7,6 +7,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/add-procedure-form.dart'; import 'package:doctor_app_flutter/screens/procedures/add_procedure_homeScreen.dart'; +import 'package:doctor_app_flutter/screens/procedures/procedure_checkout_screen.dart'; import 'package:doctor_app_flutter/screens/procedures/update-procedure.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; @@ -102,13 +103,18 @@ class ProcedureScreen extends StatelessWidget { patient.patientStatusType == 43) InkWell( onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => AddProcedureHome( + // patient: patient, + // model: model, + // )), + // ); Navigator.push( context, MaterialPageRoute( - builder: (context) => AddProcedureHome( - patient: patient, - model: model, - )), + builder: (context) => ProcedureCheckOutScreen()), ); }, child: Container(