diff --git a/lib/config/config.dart b/lib/config/config.dart index 3e7d9ea7..fc7edf42 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -157,6 +157,8 @@ const UPDATE_PROCEDURE = 'Services/DoctorApplication.svc/REST/PatchProcedure'; const UPDATE_PRESCRIPTION = 'Services/DoctorApplication.svc/REST/PatchPrescription'; +const GET_MEDICAL_FILE = 'Services/DoctorApplication.svc/REST/GetMedicalFile'; + var selectedPatientType = 1; //*********change value to decode json from Dropdown ************ diff --git a/lib/core/model/medical_file_model.dart b/lib/core/model/medical_file_model.dart index 201c88f3..eb88f0d4 100644 --- a/lib/core/model/medical_file_model.dart +++ b/lib/core/model/medical_file_model.dart @@ -1,7 +1,7 @@ class MedicalFileModel { List entityList; int rowcount; - Null statusMessage; + dynamic statusMessage; MedicalFileModel({this.entityList, this.rowcount, this.statusMessage}); diff --git a/lib/core/model/medical_file_request_model.dart b/lib/core/model/medical_file_request_model.dart new file mode 100644 index 00000000..c5a40bb7 --- /dev/null +++ b/lib/core/model/medical_file_request_model.dart @@ -0,0 +1,18 @@ +class MedicalFileRequestModel { + int patientMRN; + String vidaAuthTokenID; + + MedicalFileRequestModel({this.patientMRN, this.vidaAuthTokenID}); + + MedicalFileRequestModel.fromJson(Map json) { + patientMRN = json['PatientMRN']; + vidaAuthTokenID = json['VidaAuthTokenID']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientMRN'] = this.patientMRN; + data['VidaAuthTokenID'] = this.vidaAuthTokenID; + return data; + } +} diff --git a/lib/core/service/medical_file_service.dart b/lib/core/service/medical_file_service.dart new file mode 100644 index 00000000..0f6af46a --- /dev/null +++ b/lib/core/service/medical_file_service.dart @@ -0,0 +1,29 @@ +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/core/model/medical_file_model.dart'; +import 'package:doctor_app_flutter/core/model/medical_file_request_model.dart'; +import 'package:doctor_app_flutter/core/model/prescription_req_model.dart'; +import 'package:doctor_app_flutter/core/service/base/base_service.dart'; + +class MedicalFileService extends BaseService { + List _medicalFileList = List(); + List get medicalFileList => _medicalFileList; + + MedicalFileRequestModel _fileRequestModel = MedicalFileRequestModel( + patientMRN: 1231755, + vidaAuthTokenID: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMDAyIiwianRpIjoiNDM1MGNjZTYtYzc3MS00YjBiLThiNDItMGZhY2IzYzgxMjQ4IiwiZW1haWwiOiIiLCJpZCI6IjEwMDIiLCJOYW1lIjoiVEVNUCAtIERPQ1RPUiIsIkVtcGxveWVlSWQiOiI0NzA5IiwiRmFjaWxpdHlHcm91cElkIjoiMDEwMjY2IiwiRmFjaWxpdHlJZCI6IjE1IiwiUGhhcmFtY3lGYWNpbGl0eUlkIjoiNTUiLCJJU19QSEFSTUFDWV9DT05ORUNURUQiOiJUcnVlIiwiRG9jdG9ySWQiOiI0NzA5IiwiU0VTU0lPTklEIjoiMjE1OTYwNTQiLCJDbGluaWNJZCI6IjEiLCJyb2xlIjpbIkRPQ1RPUlMiLCJIRUFEIERPQ1RPUlMiLCJBRE1JTklTVFJBVE9SUyIsIlJFQ0VQVElPTklTVCIsIkVSIE5VUlNFIiwiRVIgUkVDRVBUSU9OSVNUIiwiUEhBUk1BQ1kgQUNDT1VOVCBTVEFGRiIsIlBIQVJNQUNZIE5VUlNFIiwiSU5QQVRJRU5UIFBIQVJNQUNJU1QiLCJBRE1JU1NJT04gU1RBRkYiLCJBUFBST1ZBTCBTVEFGRiIsIkNPTlNFTlQgIiwiTUVESUNBTCBSRVBPUlQgLSBTSUNLIExFQVZFIE1BTkFHRVIiXSwibmJmIjoxNjA5MjI1MjMwLCJleHAiOjE2MTAwODkyMzAsImlhdCI6MTYwOTIyNTIzMH0.rs7lTBQ1ON4PbR11PBkOyjf818DdeMKuqz2IrCJMYQU", + ); + + Future getMedicalFile() async { + hasError = false; + _medicalFileList.clear(); + await baseAppClient.post(GET_MEDICAL_FILE, + onSuccess: (dynamic response, int statusCode) { + _medicalFileList + .add(MedicalFileModel.fromJson(response['PatientFileList'])); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _fileRequestModel.toJson()); + } +} diff --git a/lib/core/service/procedure_service.dart b/lib/core/service/procedure_service.dart index c7319eed..0152de24 100644 --- a/lib/core/service/procedure_service.dart +++ b/lib/core/service/procedure_service.dart @@ -73,18 +73,15 @@ class ProcedureService extends BaseService { }, body: postProcedureReqModel.toJson()); } - Future updateProcedure() async { + Future updateProcedure(PostProcedureReqModel postProcedureReqModel) async { hasError = false; _procedureList.clear(); - await baseAppClient.post( - GET_CATEGORISE_PROCEDURE, - onSuccess: (dynamic response, int statusCode) { - print("ACCEPTED"); - }, - onFailure: (String error, int statusCode) { - hasError = true; - super.error = error; - }, - ); + await baseAppClient.post(UPDATE_PROCEDURE, + onSuccess: (dynamic response, int statusCode) { + print("ACCEPTED"); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: postProcedureReqModel.toJson()); } } diff --git a/lib/core/viewModel/medical_file_view_model.dart b/lib/core/viewModel/medical_file_view_model.dart new file mode 100644 index 00000000..0ef21095 --- /dev/null +++ b/lib/core/viewModel/medical_file_view_model.dart @@ -0,0 +1,26 @@ +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; +import 'package:doctor_app_flutter/core/model/medical_file_model.dart'; +import 'package:doctor_app_flutter/core/service/medical_file_service.dart'; + +import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart'; +import 'package:doctor_app_flutter/locator.dart'; + +class MedicalFileViewModel extends BaseViewModel { + bool hasError = false; + MedicalFileService _medicalFileService = locator(); + + List get medicalFileList => + _medicalFileService.medicalFileList; + + Future getMedicalFile() async { + hasError = false; + //_insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _medicalFileService.getMedicalFile(); + if (_medicalFileService.hasError) { + error = _medicalFileService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/core/viewModel/procedure_View_model.dart b/lib/core/viewModel/procedure_View_model.dart index ab4deee1..da258e23 100644 --- a/lib/core/viewModel/procedure_View_model.dart +++ b/lib/core/viewModel/procedure_View_model.dart @@ -51,11 +51,11 @@ class ProcedureViewModel extends BaseViewModel { } } - Future updateProcedure() async { + Future updateProcedure(PostProcedureReqModel postProcedureReqModel) async { hasError = false; //_insuranceCardService.clearInsuranceCard(); setState(ViewState.Busy); - await _procedureService.updateProcedure(); + await _procedureService.updateProcedure(postProcedureReqModel); if (_procedureService.hasError) { error = _procedureService.error; setState(ViewState.ErrorLocal); diff --git a/lib/locator.dart b/lib/locator.dart index 8bbf00b0..e6882ab3 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -1,9 +1,11 @@ import 'package:doctor_app_flutter/core/service/dasboard_service.dart'; +import 'package:doctor_app_flutter/core/service/medical_file_service.dart'; import 'package:doctor_app_flutter/core/service/patient_service.dart'; import 'package:doctor_app_flutter/core/service/prescription_service.dart'; import 'package:doctor_app_flutter/core/service/procedure_service.dart'; import 'package:doctor_app_flutter/core/service/sickleave_service.dart'; import 'package:doctor_app_flutter/core/viewModel/dashboard_view_model.dart'; +import 'package:doctor_app_flutter/core/viewModel/medical_file_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/prescription_view_model.dart'; import 'package:doctor_app_flutter/core/viewModel/procedure_View_model.dart'; @@ -45,6 +47,7 @@ void setupLocator() { locator.registerLazySingleton(() => PrescriptionService()); locator.registerLazySingleton(() => ProcedureService()); locator.registerLazySingleton(() => VitalSignsService()); + locator.registerLazySingleton(() => MedicalFileService()); /// View Model locator.registerFactory(() => DoctorReplayViewModel()); @@ -60,4 +63,5 @@ void setupLocator() { locator.registerFactory(() => PrescriptionViewModel()); locator.registerFactory(() => ProcedureViewModel()); locator.registerFactory(() => VitalSignsViewModel()); + locator.registerFactory(() => MedicalFileViewModel()); } diff --git a/lib/routes.dart b/lib/routes.dart index 1915a89d..c2264b66 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/medical-file/medical_file_page.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'; @@ -71,7 +72,7 @@ const String SETTINGS = 'settings'; const String VITAL_SIGN = 'patients/vital-sign'; const String LAB_ORDERS = 'patients/lab_orders'; const String PRESCRIPTIONS = 'patients/prescription'; -const String RADIOLOGY = 'patients/radiology'; +const String MEDICAL_FILE = 'patients/radiology'; const String PROGRESS_NOTE = 'patients/progress-note'; const String REFER_PATIENT = 'patients/refer-patient'; const String MY_REFERRAL_DETAIL = 'my_referral_detail'; @@ -119,7 +120,7 @@ var routes = { SERVICES: (_) => ServicesScreen(), LAB_ORDERS: (_) => LabOrdersScreen(), PRESCRIPTIONS: (_) => PrescriptionScreen(), - RADIOLOGY: (_) => RadiologyScreen(), + MEDICAL_FILE: (_) => MedicalFilePage(), PROGRESS_NOTE: (_) => ProgressNoteScreen(), REFER_PATIENT: (_) => ReferPatientScreen(), REFER_PATIENT_TO_DOCTOR: (_) => PatientMakeReferralScreen(), @@ -128,7 +129,9 @@ var routes = { VITAL_SIGN_DETAILS: (_) => VitalSignDetailsScreen(), PATIENT_VITAL_SIGN: (_) => PatientVitalSignScreen(), CREATE_EPISODE: (_) => AddSOAPIndex(), - UPDATE_EPISODE: (_) => UpdateSoapIndex(isUpdate: true,), + UPDATE_EPISODE: (_) => UpdateSoapIndex( + isUpdate: true, + ), BODY_MEASUREMENTS: (_) => VitalSignItemDetailsScreen(), IN_PATIENT_PRESCRIPTIONS_DETAILS: (_) => InpatientPrescriptionDetailsScreen(), // VIDEO_CALL: (_) => VideoCallPage(patientData: null), diff --git a/lib/screens/medical-file/medical_file_details.dart b/lib/screens/medical-file/medical_file_details.dart new file mode 100644 index 00000000..4f966781 --- /dev/null +++ b/lib/screens/medical-file/medical_file_details.dart @@ -0,0 +1,428 @@ +import 'package:doctor_app_flutter/core/viewModel/medical_file_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/screens/base/base_view.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'; +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/expandable-widget-header-body.dart'; +import 'package:eva_icons_flutter/eva_icons_flutter.dart'; +import 'package:flutter/material.dart'; + +class MedicalFileDetails extends StatefulWidget { + String age; + String firstName; + String lastName; + String gender; + MedicalFileDetails({this.age, this.firstName, this.lastName, this.gender}); + + @override + _MedicalFileDetailsState createState() => _MedicalFileDetailsState( + firstName: firstName, age: age, lastName: lastName, gender: gender); +} + +class _MedicalFileDetailsState extends State { + String age; + String firstName; + String lastName; + String gender; + + _MedicalFileDetailsState( + {this.age, this.firstName, this.lastName, this.gender}); + bool isPhysicalExam = false; + bool isProcedureExpand = false; + bool isHistoryExpand = false; + bool isAssessmentExpand = false; + + @override + Widget build(BuildContext context) { + return BaseView( + //onModelReady: (model) => model.getMedicalFile(), + builder: + (BuildContext context, MedicalFileViewModel model, Widget child) => + AppScaffold( + isShowAppBar: true, + appBarTitle: 'medical file'.toUpperCase(), + body: SingleChildScrollView( + child: Container( + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + AvatarWidget( + Icon( + gender == "Male" + ? DoctorApp.male + : DoctorApp.female_icon, + size: 70, + color: Colors.white, + ), + ), + SizedBox( + width: 20, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + firstName + ' ' + lastName, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + Row( + children: [ + AppText( + TranslationBase.of(context).age2, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + SizedBox( + width: 5.0, + ), + AppText( + age, + color: Colors.black, + fontWeight: FontWeight.normal, + ), + ], + ), + ], + ) + ], + ), + ), + Divider( + height: 1.0, + thickness: 1.0, + color: Colors.grey, + ), + Padding( + padding: EdgeInsets.all(10.0), + child: Container( + child: Column( + children: [ + Row( + children: [ + AppText( + 'Visit Date : ', + fontWeight: FontWeight.w700, + ), + AppText( + '23/12/2020', + ), + SizedBox(width: 35.0), + AppText( + 'Appt Date : ', + fontWeight: FontWeight.w700, + ), + AppText( + '23/12/2020', + ), + ], + ), + Row( + children: [ + AppText( + 'Doctor : '.toUpperCase(), + fontWeight: FontWeight.w700, + ), + AppText( + 'Muhammad assad'.toUpperCase(), + fontWeight: FontWeight.w700, + ), + ], + ), + Row( + children: [ + AppText( + 'Clinic : ', + fontWeight: FontWeight.w700, + ), + AppText( + 'Gastroenterology', + ), + ], + ), + Row( + children: [ + AppText( + 'Episode Number : ', + fontWeight: FontWeight.w700, + ), + AppText( + '200012334', + ), + ], + ), + SizedBox(height: 15.0), + Divider( + height: 1.0, + thickness: 1.0, + color: Colors.grey.shade400, + ), + SizedBox(height: 25.0), + HeaderBodyExpandableNotifier( + headerWidget: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Texts( + 'History of present illness' + .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: [ + Texts( + 'Ms J. K. is an 83 year old retired nurse with a long history of hypertension that was previously well controlled on diuretic therapy. She was first admitted to CPMC in 1995 when she presented with a complaint of intermittent midsternal chest pain.') + ], + ), + 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('assessment'.toUpperCase(), + variant: + isAssessmentExpand ? "bodyText" : '', + bold: isAssessmentExpand ? true : false, + color: Colors.black), + ], + ), + InkWell( + onTap: () { + setState(() { + isAssessmentExpand = !isAssessmentExpand; + }); + }, + child: Icon(isAssessmentExpand + ? EvaIcons.minus + : EvaIcons.plus)) + ], + ), + bodyWidget: Column( + children: [ + Texts('ssss'), + ], + ), + isExpand: isAssessmentExpand, + ), + 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('Test / procedures'.toUpperCase(), + variant: + isProcedureExpand ? "bodyText" : '', + bold: isProcedureExpand ? true : false, + color: Colors.black), + ], + ), + InkWell( + onTap: () { + setState(() { + isProcedureExpand = !isProcedureExpand; + }); + }, + child: Icon(isProcedureExpand + ? EvaIcons.minus + : EvaIcons.plus)) + ], + ), + bodyWidget: Column( + children: [ + SizedBox( + height: 20.0, + ), + Row( + children: [ + AppText( + 'Exam Type : ', + fontWeight: FontWeight.w700, + ), + AppText( + '59', + ), + ], + ), + Row( + children: [ + AppText( + 'ABDOMEN', + fontWeight: FontWeight.w700, + ), + ], + ), + Row( + children: [ + AppText( + 'Abnormal: ', + fontWeight: FontWeight.w700, + ), + AppText( + 'no', + ), + ], + ), + SizedBox(height: 15.0), + Row( + children: [ + AppText( + 'Some short remark about the allergy', + fontWeight: FontWeight.w300, + ), + ], + ), + ], + ), + isExpand: isProcedureExpand, + ), + 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('physical exam'.toUpperCase(), + variant: isPhysicalExam ? "bodyText" : '', + bold: isPhysicalExam ? true : false, + color: Colors.black), + ], + ), + InkWell( + onTap: () { + setState(() { + isPhysicalExam = !isPhysicalExam; + }); + }, + child: Icon(isPhysicalExam + ? EvaIcons.minus + : EvaIcons.plus)) + ], + ), + bodyWidget: Column( + children: [ + SizedBox( + height: 20.0, + ), + Row( + children: [ + AppText( + 'Exam Type : ', + fontWeight: FontWeight.w700, + ), + AppText( + '59', + ), + ], + ), + Row( + children: [ + AppText( + 'ABDOMEN', + fontWeight: FontWeight.w700, + ), + ], + ), + Row( + children: [ + AppText( + 'Abnormal: ', + fontWeight: FontWeight.w700, + ), + AppText( + 'no', + ), + ], + ), + SizedBox(height: 15.0), + Row( + children: [ + AppText( + 'Some short remark about the allergy', + fontWeight: FontWeight.w300, + ), + ], + ), + ], + ), + isExpand: isPhysicalExam, + ), + SizedBox( + height: 30, + ), + Container( + width: double.infinity, + height: 1, + color: Color(0xffCCCCCC), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/medical-file/medical_file_page.dart b/lib/screens/medical-file/medical_file_page.dart new file mode 100644 index 00000000..44fee1be --- /dev/null +++ b/lib/screens/medical-file/medical_file_page.dart @@ -0,0 +1,173 @@ +import 'package:doctor_app_flutter/core/viewModel/medical_file_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/screens/base/base_view.dart'; +import 'package:doctor_app_flutter/screens/medical-file/medical_file_details.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/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart'; +import 'package:flutter/material.dart'; + +class MedicalFilePage extends StatefulWidget { + @override + _MedicalFilePageState createState() => _MedicalFilePageState(); +} + +class _MedicalFilePageState extends State { + PatiantInformtion patient; + @override + Widget build(BuildContext context) { + final routeArgs = ModalRoute.of(context).settings.arguments as Map; + patient = routeArgs['patient']; + return BaseView( + onModelReady: (model) => model.getMedicalFile(), + builder: + (BuildContext context, MedicalFileViewModel model, Widget child) => + AppScaffold( + isShowAppBar: true, + appBarTitle: 'medical Report'.toUpperCase(), + body: NetworkBaseView( + baseViewModel: model, + child: Container( + child: Column( + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: Row( + children: [ + AvatarWidget( + Icon( + patient.genderDescription == "Male" + ? DoctorApp.male + : DoctorApp.female_icon, + size: 70, + color: Colors.white, + ), + ), + SizedBox( + width: 20, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + patient.firstName + ' ' + patient.lastName, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + Row( + children: [ + AppText( + TranslationBase.of(context).fileNo, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + SizedBox( + width: 5.0, + ), + AppText( + patient.age.toString(), + color: Colors.black, + fontWeight: FontWeight.normal, + ), + ], + ), + AppText( + "ALLERGIC TO: FOOD, ASPIRIN", + color: Color(0xFFB9382C), + fontWeight: FontWeight.bold, + ), + ], + ) + ], + ), + ), + Divider( + height: 1.0, + thickness: 1.0, + color: Colors.grey, + ), + ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: 2, + itemBuilder: (BuildContext ctxt, int index) { + return Padding( + padding: EdgeInsets.symmetric( + horizontal: 12.0, vertical: 8.0), + child: InkWell( + child: Container( + child: Column( + children: [ + Row( + children: [ + AppText( + 'Branch : ', + fontWeight: FontWeight.w700, + ), + AppText( + model.medicalFileList[0].entityList[0] + .admissions[index].projectName, + ), + ], + ), + Row( + children: [ + AppText( + 'Doctor : '.toUpperCase(), + fontWeight: FontWeight.w700, + ), + AppText( + model.medicalFileList[0].entityList[0] + .admissions[index].doctor + .toUpperCase(), + fontWeight: FontWeight.w700, + ), + ], + ), + Row( + children: [ + AppText( + 'Clinic : ', + fontWeight: FontWeight.w700, + ), + AppText( + model.medicalFileList[0].entityList[0] + .admissions[index].clinic, + ), + ], + ), + SizedBox(height: 10.0), + Divider( + height: 1.0, + thickness: 1.0, + color: Colors.grey.shade400, + ) + ], + ), + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MedicalFileDetails( + age: patient.age, + firstName: patient.firstName, + lastName: patient.lastName, + gender: patient.genderDescription, + )), + ); + }, + ), + ); + }) + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/screens/prescription/prescription_screen.dart b/lib/screens/prescription/prescription_screen.dart index 2b1e5454..06a6a218 100644 --- a/lib/screens/prescription/prescription_screen.dart +++ b/lib/screens/prescription/prescription_screen.dart @@ -76,7 +76,7 @@ class _NewPrescriptionScreenState extends State { Row( children: [ AppText( - TranslationBase.of(context).fileNo, + TranslationBase.of(context).age2, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -84,12 +84,17 @@ class _NewPrescriptionScreenState extends State { width: 5.0, ), AppText( - patient.patientId.toString(), + patient.age.toString(), color: Colors.black, fontWeight: FontWeight.normal, ), ], ), + AppText( + "ALLERGIC TO: FOOD, ASPIRIN", + color: Color(0xFFB9382C), + fontWeight: FontWeight.bold, + ), ], ) ], diff --git a/lib/screens/procedures/entity_list_checkbox_search_widget.dart b/lib/screens/procedures/entity_list_checkbox_search_widget.dart index b9962d27..78f584f6 100644 --- a/lib/screens/procedures/entity_list_checkbox_search_widget.dart +++ b/lib/screens/procedures/entity_list_checkbox_search_widget.dart @@ -20,19 +20,21 @@ class EntityListCheckboxSearchWidget extends StatefulWidget { EntityListCheckboxSearchWidget( {Key key, - this.model, - this.addSelectedHistories, - this.removeHistory, - this.masterList, - this.addHistory, - this.isEntityListSelected}) + this.model, + this.addSelectedHistories, + this.removeHistory, + this.masterList, + this.addHistory, + this.isEntityListSelected}) : super(key: key); @override - _EntityListCheckboxSearchWidgetState createState() => _EntityListCheckboxSearchWidgetState(); + _EntityListCheckboxSearchWidgetState createState() => + _EntityListCheckboxSearchWidgetState(); } -class _EntityListCheckboxSearchWidgetState extends State { +class _EntityListCheckboxSearchWidgetState + extends State { List items = List(); @override @@ -49,75 +51,70 @@ class _EntityListCheckboxSearchWidgetState extends State dummyListData = List(); dummySearchList.forEach((item) { - if (item.procedureName.toLowerCase().contains(query.toLowerCase()) ) { + if (item.procedureName.toLowerCase().contains(query.toLowerCase())) { dummyListData.add(item); } }); @@ -145,4 +142,4 @@ class _EntityListCheckboxSearchWidgetState extends State { Row( children: [ AppText( - TranslationBase.of(context).fileNo, + TranslationBase.of(context).age2, color: Colors.black, fontWeight: FontWeight.bold, ), @@ -86,12 +86,17 @@ class _ProcedureScreenState extends State { width: 5.0, ), AppText( - patient.patientId.toString(), + patient.age.toString(), color: Colors.black, fontWeight: FontWeight.normal, ), ], ), + AppText( + "ALLERGIC TO: FOOD, ASPIRIN", + color: Color(0xFFB9382C), + fontWeight: FontWeight.bold, + ), ], ) ], @@ -268,7 +273,8 @@ class _ProcedureScreenState extends State { fontWeight: FontWeight .w700, - fontSize: 15.0, + fontSize: + 15.0, ), AppText( model @@ -278,7 +284,8 @@ class _ProcedureScreenState extends State { index] .procedureId .toString(), - fontSize: 13.0, + fontSize: + 13.0, ), SizedBox( width: 12.0, @@ -288,20 +295,23 @@ class _ProcedureScreenState extends State { fontWeight: FontWeight .w700, - fontSize: 15.0, + fontSize: + 15.0, ), AppText( 'Urgent', - fontSize: 13.0, - color: - Colors.red, + fontSize: + 13.0, + color: Colors + .red, ), ], ), Row( children: [ Container( - child: Expanded( + child: + Expanded( child: AppText( model @@ -349,7 +359,8 @@ class _ProcedureScreenState extends State { children: [ AppText( 'Some short remark about the procedure', - fontSize: 13.5, + fontSize: + 13.5, ), ], ), @@ -360,7 +371,8 @@ class _ProcedureScreenState extends State { Divider( height: 5.0, thickness: 1.0, - color: Colors.grey, + color: + Colors.grey, ) // SizedBox( // height: 40, @@ -372,7 +384,20 @@ class _ProcedureScreenState extends State { Container( child: Column( children: [ - Icon(Icons.edit) + InkWell( + child: Icon( + Icons.edit), + onTap: () { + updateProcedureForm( + context, + procedureName: model + .procedureList[ + 0] + .entityList[ + index] + .procedureName); + }, + ) ], ), ) @@ -423,6 +448,37 @@ postProcedure({ProcedureViewModel model}) async { } } +updateProcedure({ProcedureViewModel model, String remarks}) async { + PostProcedureReqModel updateProcedureReqModel = new PostProcedureReqModel(); + List controls = List(); + List controlsProcedure = List(); + + updateProcedureReqModel.appointmentNo = 2016054575; + + updateProcedureReqModel.episodeID = 200012166; + updateProcedureReqModel.patientMRN = 3120725; + updateProcedureReqModel.vidaAuthTokenID = + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxNDg1IiwianRpIjoiZjQ4YTk0OTQtYTczZS00MDI3LWI2MjgtNzc4MjAwMzUyYWEzIiwiZW1haWwiOiJNb2hhbWVkLlJlc3dhbkBjbG91ZHNvbHV0aW9uLXNhLmNvbSIsImlkIjoiMTQ4NSIsIk5hbWUiOiJTSEFLRVJBIFBBUlZFRU4gKFVTRUQgQlkgRVNFUlZJQ0VTKSIsIkVtcGxveWVlSWQiOiIxNDg1IiwiRmFjaWxpdHlHcm91cElkIjoiMDEwMjY2IiwiRmFjaWxpdHlJZCI6IjE1IiwiUGhhcmFtY3lGYWNpbGl0eUlkIjoiNTUiLCJJU19QSEFSTUFDWV9DT05ORUNURUQiOiJUcnVlIiwiRG9jdG9ySWQiOiIxNDg1IiwiU0VTU0lPTklEIjoiMjE1ODUyMTAiLCJDbGluaWNJZCI6IjMiLCJyb2xlIjoiRE9DVE9SUyIsIm5iZiI6MTYwODM2NDU2OCwiZXhwIjoxNjA5MjI4NTY4LCJpYXQiOjE2MDgzNjQ1Njh9.YLbvq5nxPn8o9ZYkcbc5YAX7Jy23Mm0s33oRmE8GHDI'; + + controls.add( + Controls( + code: remarks.isEmpty ? '' : remarks, + controlValue: 'Testing', + ), + ); + controlsProcedure.add( + Procedures(category: "02", procedure: "02011002", controls: controls)); + updateProcedureReqModel.procedures = controlsProcedure; + + await model.updateProcedure(updateProcedureReqModel); + + if (model.state == ViewState.ErrorLocal) { + helpers.showErrorToast(model.error); + } else if (model.state == ViewState.Idle) { + DrAppToastMsg.showSuccesToast('procedure has been updated'); + } +} + void addSelectedProcedure(context, ProcedureViewModel model) { showModalBottomSheet( context: context, @@ -444,14 +500,14 @@ class AddSelectedProcedure extends StatefulWidget { class _AddSelectedProcedureState extends State { TextEditingController procedureController = TextEditingController(); - List entityList= List(); + List entityList = List(); @override Widget build(BuildContext context) { return NetworkBaseView( baseViewModel: widget.model, child: SingleChildScrollView( child: Container( - //height: 490, + height: 790, child: Padding( padding: EdgeInsets.all(12.0), child: Column( @@ -462,28 +518,28 @@ class _AddSelectedProcedureState extends State { fontWeight: FontWeight.w900, ), if (widget.model.categoriesList.length != 0) - EntityListCheckboxSearchWidget( - 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), - ), - + EntityListCheckboxSearchWidget( + 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), + ), SizedBox( - height: 0.0, + height: 15.0, ), Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -493,14 +549,19 @@ class _AddSelectedProcedureState extends State { borderRadius: BorderRadius.all(Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), - child: AppTextFormField( - labelText: 'Add Delected Procedures'.toUpperCase(), - borderColor: Colors.white, - textInputType: TextInputType.text, - inputFormatter: ONLY_LETTERS, + child: TextFields( + hintText: 'Order Type'.toUpperCase(), controller: procedureController, ), ), + SizedBox( + height: 15.0, + ), + TextFields( + hintText: 'Remarks', + minLines: 3, + maxLines: 5, + ), SizedBox( height: 80.0, ), @@ -510,7 +571,7 @@ class _AddSelectedProcedureState extends State { alignment: WrapAlignment.center, children: [ AppButton( - title: TranslationBase.of(context).addMedication, + title: 'add Selected Procedures'.toUpperCase(), onPressed: () { Navigator.pop(context); postProcedure(model: widget.model); @@ -528,9 +589,10 @@ class _AddSelectedProcedureState extends State { ), ); } + bool isEntityListSelected(EntityList masterKey) { - Iterable history = - entityList.where((element) => masterKey.procedureId == element.procedureId); + Iterable history = entityList + .where((element) => masterKey.procedureId == element.procedureId); if (history.length > 0) { return true; } @@ -538,15 +600,16 @@ class _AddSelectedProcedureState extends State { } } - - -void updateProcedureForm(context) { +void updateProcedureForm(context, {String procedureName}) { + ProcedureViewModel procedureViewModel = ProcedureViewModel(); + TextEditingController remarksController = TextEditingController(); + TextEditingController orderController = TextEditingController(); showModalBottomSheet( context: context, isScrollControlled: true, builder: (BuildContext bc) { return Container( - height: 500, + height: 400, child: Form( child: Padding( padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), @@ -554,8 +617,8 @@ void updateProcedureForm(context) { crossAxisAlignment: CrossAxisAlignment.start, children: [ AppText( - 'Procedure Name'.toUpperCase(), - fontWeight: FontWeight.w900, + procedureName.toUpperCase(), + fontWeight: FontWeight.w700, ), SizedBox( height: 30.0, @@ -565,11 +628,9 @@ void updateProcedureForm(context) { borderRadius: BorderRadius.all(Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), - child: AppTextFormField( - labelText: 'Order ', - borderColor: Colors.white, - textInputType: TextInputType.number, - inputFormatter: ONLY_NUMBERS, + child: TextFields( + hintText: 'Order ', + controller: orderController, ), ), SizedBox( @@ -580,16 +641,15 @@ void updateProcedureForm(context) { borderRadius: BorderRadius.all(Radius.circular(6.0)), border: Border.all( width: 1.0, color: HexColor("#CCCCCC"))), - child: AppTextFormField( - labelText: 'Password', - borderColor: Colors.white, - textInputType: TextInputType.text, - inputFormatter: ONLY_LETTERS, - obscureText: true, + child: TextFields( + hintText: 'Remarks', + controller: remarksController, + maxLines: 5, + minLines: 3, ), ), SizedBox( - height: 190.0, + height: 100.0, ), Container( margin: EdgeInsets.all(SizeConfig.widthMultiplier * 2), @@ -597,9 +657,12 @@ void updateProcedureForm(context) { alignment: WrapAlignment.center, children: [ AppButton( - title: 'CONTINUE', + title: 'Update procedure'.toUpperCase(), onPressed: () { Navigator.pop(context); + updateProcedure( + model: procedureViewModel, + remarks: remarksController.text); // authorizationForm(context); }, ), diff --git a/lib/widgets/patients/profile/profile_medical_info_widget.dart b/lib/widgets/patients/profile/profile_medical_info_widget.dart index 96d7fa35..468a1b9d 100644 --- a/lib/widgets/patients/profile/profile_medical_info_widget.dart +++ b/lib/widgets/patients/profile/profile_medical_info_widget.dart @@ -18,7 +18,6 @@ import 'PatientProfileButton.dart'; *@desc: Profile Medical Info Widget */ class ProfileMedicalInfoWidget extends StatelessWidget { - ProfileMedicalInfoWidget({Key key, this.patient}) : super(key: key); PatiantInformtion patient; @override @@ -57,17 +56,17 @@ class ProfileMedicalInfoWidget extends StatelessWidget { nameLine1: TranslationBase.of(context).lab, nameLine2: TranslationBase.of(context).result, icon: 'lab.png'), + // PatientProfileButton( + // key: key, + // patient: patient, + // route: PRESCRIPTIONS, + // nameLine1: TranslationBase.of(context).medicines, + // nameLine2: TranslationBase.of(context).prescription, + // icon: 'note.png'), PatientProfileButton( key: key, patient: patient, - route: PRESCRIPTIONS, - nameLine1: TranslationBase.of(context).medicines, - nameLine2: TranslationBase.of(context).prescription, - icon: 'note.png'), - PatientProfileButton( - key: key, - patient: patient, - route: RADIOLOGY, + route: MEDICAL_FILE, nameLine1: TranslationBase.of(context).previewHealth, nameLine2: TranslationBase.of(context).summaryReport, icon: 'radiology-1.png'),