diff --git a/lib/config/config.dart b/lib/config/config.dart index d5086b5b..42d9f7c8 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -125,6 +125,7 @@ const GET_Patient_LAB_SPECIAL_RESULT = 'Services/Patients.svc/REST/GetPatientLab const SEND_LAB_RESULT_EMAIL = 'Services/Notifications.svc/REST/SendLabReportEmail'; const GET_Patient_LAB_RESULT = 'Services/Patients.svc/REST/GetPatientLabResults'; const GET_Patient_LAB_ORDERS_RESULT = 'Services/Patients.svc/REST/GetPatientLabOrdersResults'; +const GET_PATIENT_LAB_ORDERS_RESULT_HISTORY_BY_DESCRIPTION = 'Services/Patients.svc/REST/GetPatientLabOrdersResultsHistoryByDescription'; // SOAP diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 56b3fde8..80614124 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -709,5 +709,7 @@ const Map> localizedValues = { "Completed": {"en": "Completed", "ar": "مكتمل"}, "Locked": {"en": "Locked", "ar": "مقفل"}, "textCopiedSuccessfully": {"en": "Text copied successfully", "ar": "تم نسخ النص بنجاح"}, + "seeMore": {"en": "See More ...", "ar": "شاهد المزيد..."}, + "roomNo": {"en": "Room No", "ar": "رقم الغرفة"}, }; diff --git a/lib/core/model/labs/LabResultHistory.dart b/lib/core/model/labs/LabResultHistory.dart new file mode 100644 index 00000000..7c4221ca --- /dev/null +++ b/lib/core/model/labs/LabResultHistory.dart @@ -0,0 +1,108 @@ +class LabResultHistory { + String description; + String femaleInterpretativeData; + int gender; + bool isCertificateAllowed; + int lineItemNo; + String maleInterpretativeData; + String notes; + int orderLineItemNo; + int orderNo; + String packageID; + int patientID; + String projectID; + String referanceRange; + String resultValue; + int resultValueBasedLineItemNo; + String resultValueFlag; + String sampleCollectedOn; + String sampleReceivedOn; + String setupID; + String superVerifiedOn; + String testCode; + String uOM; + String verifiedOn; + String verifiedOnDateTime; + + LabResultHistory( + {this.description, + this.femaleInterpretativeData, + this.gender, + this.isCertificateAllowed, + this.lineItemNo, + this.maleInterpretativeData, + this.notes, + this.orderLineItemNo, + this.orderNo, + this.packageID, + this.patientID, + this.projectID, + this.referanceRange, + this.resultValue, + this.resultValueBasedLineItemNo, + this.resultValueFlag, + this.sampleCollectedOn, + this.sampleReceivedOn, + this.setupID, + this.superVerifiedOn, + this.testCode, + this.uOM, + this.verifiedOn, + this.verifiedOnDateTime}); + + LabResultHistory.fromJson(Map json) { + description = json['Description']; + femaleInterpretativeData = json['FemaleInterpretativeData']; + gender = json['Gender']; + isCertificateAllowed = json['IsCertificateAllowed']; + lineItemNo = json['LineItemNo']; + maleInterpretativeData = json['MaleInterpretativeData']; + notes = json['Notes']; + orderLineItemNo = json['OrderLineItemNo']; + orderNo = json['OrderNo']; + packageID = json['PackageID']; + patientID = json['PatientID']; + projectID = json['ProjectID']; + referanceRange = json['ReferanceRange']; + resultValue = json['ResultValue']; + resultValueBasedLineItemNo = json['ResultValueBasedLineItemNo']; + resultValueFlag = json['ResultValueFlag']; + sampleCollectedOn = json['SampleCollectedOn']; + sampleReceivedOn = json['SampleReceivedOn']; + setupID = json['SetupID']; + superVerifiedOn = json['SuperVerifiedOn']; + testCode = json['TestCode']; + uOM = json['UOM']; + verifiedOn = json['VerifiedOn']; + verifiedOnDateTime = json['VerifiedOnDateTime']; + } + + Map toJson() { + final Map data = new Map(); + data['Description'] = this.description; + data['FemaleInterpretativeData'] = this.femaleInterpretativeData; + data['Gender'] = this.gender; + data['IsCertificateAllowed'] = this.isCertificateAllowed; + data['LineItemNo'] = this.lineItemNo; + data['MaleInterpretativeData'] = this.maleInterpretativeData; + data['Notes'] = this.notes; + data['OrderLineItemNo'] = this.orderLineItemNo; + data['OrderNo'] = this.orderNo; + data['PackageID'] = this.packageID; + data['PatientID'] = this.patientID; + data['ProjectID'] = this.projectID; + data['ReferanceRange'] = this.referanceRange; + data['ResultValue'] = this.resultValue; + data['ResultValueBasedLineItemNo'] = this.resultValueBasedLineItemNo; + data['ResultValueFlag'] = this.resultValueFlag; + data['SampleCollectedOn'] = this.sampleCollectedOn; + data['SampleReceivedOn'] = this.sampleReceivedOn; + data['SetupID'] = this.setupID; + data['SuperVerifiedOn'] = this.superVerifiedOn; + data['TestCode'] = this.testCode; + data['UOM'] = this.uOM; + data['VerifiedOn'] = this.verifiedOn; + data['VerifiedOnDateTime'] = this.verifiedOnDateTime; + return data; + } +} \ No newline at end of file diff --git a/lib/core/service/home/doctor_reply_service.dart b/lib/core/service/home/doctor_reply_service.dart index f8008e0e..cdb45f1b 100644 --- a/lib/core/service/home/doctor_reply_service.dart +++ b/lib/core/service/home/doctor_reply_service.dart @@ -13,15 +13,15 @@ class DoctorReplyService extends BaseService { List _listDoctorWorkingHoursTable = []; - RequestDoctorReply _requestDoctorReply = RequestDoctorReply(); List _listMyReferralPatientModel = []; List get listMyReferralPatientModel => _listMyReferralPatientModel; int notRepliedCount = 0; - Future getDoctorReply() async { + Future getDoctorReply(RequestDoctorReply _requestDoctorReply,{bool clearData = false}) async { hasError = false; await baseAppClient.post(GT_MY_PATIENT_QUESTION, onSuccess: (dynamic response, int statusCode) { + if(clearData) _listDoctorWorkingHoursTable.clear(); response['List_GtMyPatientsQuestions'].forEach((v) { _listDoctorWorkingHoursTable diff --git a/lib/core/service/patient_medical_file/lab_order/labs_service.dart b/lib/core/service/patient_medical_file/lab_order/labs_service.dart index c7bb9a78..87d72328 100644 --- a/lib/core/service/patient_medical_file/lab_order/labs_service.dart +++ b/lib/core/service/patient_medical_file/lab_order/labs_service.dart @@ -1,5 +1,6 @@ import 'package:doctor_app_flutter/config/config.dart'; import 'package:doctor_app_flutter/core/model/labs/LabOrderResult.dart'; +import 'package:doctor_app_flutter/core/model/labs/LabResultHistory.dart'; import 'package:doctor_app_flutter/core/model/labs/lab_result.dart'; import 'package:doctor_app_flutter/core/model/labs/patient_lab_orders.dart'; import 'package:doctor_app_flutter/core/model/labs/patient_lab_special_result.dart'; @@ -52,6 +53,7 @@ class LabsService extends BaseService { List patientLabSpecialResult = List(); List labResultList = List(); List labOrdersResultsList = List(); + List labOrdersResultHistoryList = List(); Future getLaboratoryResult( {String projectID, @@ -113,7 +115,8 @@ class LabsService extends BaseService { labResultList.add(LabResult.fromJson(hospital)); }); response['List_GetLabSpecial'].forEach((hospital) { - patientLabSpecialResult.add(PatientLabSpecialResult.fromJson(hospital)); + patientLabSpecialResult + .add(PatientLabSpecialResult.fromJson(hospital)); }); } else { response['ListPLR'].forEach((lab) { @@ -179,4 +182,30 @@ class LabsService extends BaseService { // super.error = error; // }, body: _requestSendLabReportEmail.toJson()); } + + Future getPatientLabOrdersResultHistoryByDescription( + {PatientLabOrders patientLabOrder, + String procedureDescription, + PatiantInformtion patient}) async { + hasError = false; + Map body = Map(); + if (patientLabOrder != null) { + body['SetupID'] = patientLabOrder.setupID; + body['ProjectID'] = 0; + body['ClinicID'] = 0; + } + body['isDentalAllowedBackend'] = false; + body['ProcedureDescription'] = procedureDescription; + await baseAppClient.postPatient( + GET_PATIENT_LAB_ORDERS_RESULT_HISTORY_BY_DESCRIPTION, + patient: patient, onSuccess: (dynamic response, int statusCode) { + labOrdersResultHistoryList.clear(); + response['ListGeneralResultHistory'].forEach((lab) { + labOrdersResultHistoryList.add(LabResultHistory.fromJson(lab)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } } diff --git a/lib/core/viewModel/doctor_replay_view_model.dart b/lib/core/viewModel/doctor_replay_view_model.dart index 7ed0acc4..17607d80 100644 --- a/lib/core/viewModel/doctor_replay_view_model.dart +++ b/lib/core/viewModel/doctor_replay_view_model.dart @@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/service/home/doctor_reply_service.dart'; import 'package:doctor_app_flutter/models/doctor/list_gt_my_patients_question_model.dart'; import 'package:doctor_app_flutter/models/doctor/replay/request_create_doctor_response.dart'; +import 'package:doctor_app_flutter/models/doctor/replay/request_doctor_reply.dart'; import '../../locator.dart'; import 'base_view_model.dart'; @@ -12,13 +13,25 @@ class DoctorReplayViewModel extends BaseViewModel { List get listDoctorWorkingHoursTable => _doctorReplyService.listDoctorWorkingHoursTable; - Future getDoctorReply() async { - setState(ViewState.Busy); + Future getDoctorReply( + {int pageSize = 10, int pageIndex = 1, bool isLocalBusy = true}) async { + if (isLocalBusy) { + setState(ViewState.BusyLocal); + } else { + setState(ViewState.Busy); + } await getDoctorProfile(); - await _doctorReplyService.getDoctorReply(); + RequestDoctorReply _requestDoctorReply = + RequestDoctorReply(pageIndex: pageIndex, pageSize: pageSize); + + await _doctorReplyService.getDoctorReply(_requestDoctorReply, clearData:!isLocalBusy ); if (_doctorReplyService.hasError) { error = _doctorReplyService.error; - setState(ViewState.Error); + if (isLocalBusy) { + setState(ViewState.ErrorLocal); + } else { + setState(ViewState.Error); + } } else setState(ViewState.Idle); } @@ -28,13 +41,12 @@ class DoctorReplayViewModel extends BaseViewModel { await getDoctorProfile(); CreateDoctorResponseModel createDoctorResponseModel = CreateDoctorResponseModel( - transactionNo: model.transactionNo.toString(), - doctorResponse: response, - infoStatus: 6, - createdBy:this.doctorProfile.doctorID, - infoEnteredBy: this.doctorProfile.doctorID, - setupID:"010266" - ); + transactionNo: model.transactionNo.toString(), + doctorResponse: response, + infoStatus: 6, + createdBy: this.doctorProfile.doctorID, + infoEnteredBy: this.doctorProfile.doctorID, + setupID: "010266"); setState(ViewState.BusyLocal); await _doctorReplyService.createDoctorResponse(createDoctorResponseModel); if (_doctorReplyService.hasError) { @@ -43,7 +55,6 @@ class DoctorReplayViewModel extends BaseViewModel { } else { setState(ViewState.Idle); _doctorReplyService.getNotRepliedCount(); - } } } diff --git a/lib/core/viewModel/labs_view_model.dart b/lib/core/viewModel/labs_view_model.dart index 5b4b7e4c..3fb74e0d 100644 --- a/lib/core/viewModel/labs_view_model.dart +++ b/lib/core/viewModel/labs_view_model.dart @@ -1,6 +1,7 @@ import 'package:doctor_app_flutter/core/enum/filter_type.dart'; import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/model/labs/LabOrderResult.dart'; +import 'package:doctor_app_flutter/core/model/labs/LabResultHistory.dart'; import 'package:doctor_app_flutter/core/model/labs/lab_result.dart'; import 'package:doctor_app_flutter/core/model/labs/patient_lab_orders.dart'; import 'package:doctor_app_flutter/core/model/labs/patient_lab_special_result.dart'; @@ -26,6 +27,8 @@ class LabsViewModel extends BaseViewModel { ? _patientLabOrdersListClinic : _patientLabOrdersListHospital; + List get labOrdersResultHistoryList => _labsService.labOrdersResultHistoryList; + void getLabs(PatiantInformtion patient) async { setState(ViewState.Busy); await _labsService.getPatientLabOrdersList(patient, true); @@ -132,7 +135,7 @@ class LabsViewModel extends BaseViewModel { } } - void setLabResultDependOnFilterName(){ + void setLabResultDependOnFilterName() { _labsService.labResultList.forEach((element) { List patientLabOrdersClinic = labResultLists .where( @@ -176,6 +179,23 @@ class LabsViewModel extends BaseViewModel { } } + getPatientLabResultHistoryByDescription( + {PatientLabOrders patientLabOrder, + String procedureDescription, + PatiantInformtion patient}) async { + setState(ViewState.Busy); + await _labsService.getPatientLabOrdersResultHistoryByDescription( + patientLabOrder: patientLabOrder, + procedureDescription: procedureDescription, + patient: patient); + if (_labsService.hasError) { + error = _labsService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + sendLabReportEmail({PatientLabOrders patientLabOrder, String mes}) async { await _labsService.sendLabReportEmail(patientLabOrder: patientLabOrder); if (_labsService.hasError) { diff --git a/lib/models/doctor/replay/request_doctor_reply.dart b/lib/models/doctor/replay/request_doctor_reply.dart index 707336d6..1c3948cb 100644 --- a/lib/models/doctor/replay/request_doctor_reply.dart +++ b/lib/models/doctor/replay/request_doctor_reply.dart @@ -13,20 +13,24 @@ class RequestDoctorReply { String sessionID; bool isLoginForDoctorApp; bool patientOutSA; + int pageIndex; + int pageSize; RequestDoctorReply( - {this.projectID , - this.doctorID , - this.transactionNo = TRANSACTION_NO , - this.languageID , - this.stamp , + {this.projectID, + this.doctorID, + this.transactionNo = TRANSACTION_NO, + this.languageID, + this.stamp, this.iPAdress, - this.versionID , + this.versionID, this.channel, - this.tokenID , + this.tokenID, this.sessionID, - this.isLoginForDoctorApp , - this.patientOutSA }); + this.isLoginForDoctorApp, + this.patientOutSA, + this.pageIndex, + this.pageSize}); RequestDoctorReply.fromJson(Map json) { projectID = json['ProjectID']; @@ -41,6 +45,8 @@ class RequestDoctorReply { sessionID = json['SessionID']; isLoginForDoctorApp = json['IsLoginForDoctorApp']; patientOutSA = json['PatientOutSA']; + pageIndex = json['PageIndex']; + pageSize = json['PageSize']; } Map toJson() { @@ -57,6 +63,8 @@ class RequestDoctorReply { data['SessionID'] = this.sessionID; data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp; data['PatientOutSA'] = this.patientOutSA; + data['PageIndex'] = this.pageIndex; + data['PageSize'] = this.pageSize; return data; } } diff --git a/lib/screens/doctor/doctor_repaly_chat.dart b/lib/screens/doctor/doctor_repaly_chat.dart index c3b58806..935dbf7c 100644 --- a/lib/screens/doctor/doctor_repaly_chat.dart +++ b/lib/screens/doctor/doctor_repaly_chat.dart @@ -370,7 +370,7 @@ class DoctorReplayChat extends StatelessWidget { Helpers.showErrorToast(previousModel.error); } else { DrAppToastMsg.showSuccesToast("Thank you for your replay "); - await previousModel.getDoctorReply(); + await previousModel.getDoctorReply(isLocalBusy: false); Navigator.pop(context); } GifLoaderDialogUtils.hideDialog(context); diff --git a/lib/screens/doctor/doctor_reply_screen.dart b/lib/screens/doctor/doctor_reply_screen.dart index b318f6a4..e56360e7 100644 --- a/lib/screens/doctor/doctor_reply_screen.dart +++ b/lib/screens/doctor/doctor_reply_screen.dart @@ -1,10 +1,16 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/enum/viewstate.dart'; import 'package:doctor_app_flutter/core/viewModel/doctor_replay_view_model.dart'; import 'package:doctor_app_flutter/screens/base/base_view.dart'; import 'package:doctor_app_flutter/screens/doctor/doctor_repaly_chat.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/doctor/doctor_reply_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/dr_app_circular_progress_Indeicator.dart'; import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart'; +import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -15,21 +21,27 @@ import 'package:flutter/material.dart'; *@return: *@desc: Doctor Reply Screen display data from GtMyPatientsQuestions service */ -class DoctorReplyScreen extends StatelessWidget { - +class DoctorReplyScreen extends StatefulWidget { final Function changeCurrentTab; const DoctorReplyScreen({Key key, this.changeCurrentTab}) : super(key: key); + @override + _DoctorReplyScreenState createState() => _DoctorReplyScreenState(); +} + +class _DoctorReplyScreenState extends State { + int pageIndex = 1; + @override Widget build(BuildContext context) { return BaseView( onModelReady: (model) { - model.getDoctorReply(); + model.getDoctorReply(isLocalBusy: false); }, builder: (_, model, w) => WillPopScope( - onWillPop: ()async{ - changeCurrentTab(); + onWillPop: () async { + widget.changeCurrentTab(); return false; }, child: AppScaffold( @@ -38,36 +50,62 @@ class DoctorReplyScreen extends StatelessWidget { isShowAppBar: false, body: model.listDoctorWorkingHoursTable.isEmpty ? DrAppEmbeddedError(error: TranslationBase.of(context).noItem) - : Container( - padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0), - child: ListView( - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: - model.listDoctorWorkingHoursTable.map((reply) { - return InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - DoctorReplayChat( - reply: reply, - previousModel: model, - ), settings: RouteSettings(name: 'DoctorReplayChat'),)); - }, - child: DoctorReplyWidget(reply: reply), - ); - }).toList(), - ) - ], + : Column( + children: [ + Expanded( + child: Container( + padding: EdgeInsetsDirectional.fromSTEB(30, 0, 30, 0), + child: NotificationListener( + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: model.listDoctorWorkingHoursTable.length, + shrinkWrap: true, + itemBuilder: (BuildContext ctxt, int index) { + return Column( + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + DoctorReplayChat( + reply: + model.listDoctorWorkingHoursTable[ + index], + previousModel: model, + ), + settings: RouteSettings( + name: 'DoctorReplayChat'), + )); + }, + child: DoctorReplyWidget( + reply: model + .listDoctorWorkingHoursTable[index]), + ), + if(model.state == ViewState.BusyLocal && index == model.listDoctorWorkingHoursTable.length-1) + DrAppCircularProgressIndeicator() + + ], + ); + }), + onNotification: (t) { + if (t is ScrollEndNotification && + model.state != ViewState.BusyLocal) { + setState(() { + pageIndex++; + }); + model.getDoctorReply(pageIndex: pageIndex); + } + return; + }, + ), + ), ), - ), + ], + ), ), ), ); - } } diff --git a/lib/screens/patients/profile/lab_result/LabResultHistoryPage.dart b/lib/screens/patients/profile/lab_result/LabResultHistoryPage.dart new file mode 100644 index 00000000..1142a4ec --- /dev/null +++ b/lib/screens/patients/profile/lab_result/LabResultHistoryPage.dart @@ -0,0 +1,132 @@ +import 'package:doctor_app_flutter/config/size_config.dart'; +import 'package:doctor_app_flutter/core/model/labs/patient_lab_orders.dart'; +import 'package:doctor_app_flutter/core/viewModel/labs_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/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; +import 'package:doctor_app_flutter/widgets/shared/errors/error_message.dart'; +import 'package:flutter/material.dart'; + +class LabResultHistoryPage extends StatelessWidget { + final PatientLabOrders patientLabOrder; + final String filterName; + final PatiantInformtion patient; + + LabResultHistoryPage({this.patientLabOrder, this.filterName, this.patient}); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getPatientLabResultHistoryByDescription( + patientLabOrder: patientLabOrder, + procedureDescription: filterName, + patient: patient), + builder: (context, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: filterName, + baseViewModel: model, + body: model.labOrdersResultHistoryList.length > 0 + ? SingleChildScrollView( + child: Column( + children: [ + ...List.generate(model.labOrdersResultHistoryList.length, + (index) { + return Container( + child: Column( + children: [ + Row( + children: [ + AppText( + TranslationBase.of(context).description, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + color: Color(0xFF575757), + fontWeight: FontWeight.w600, + ), + SizedBox( + width: 1, + ), + AppText( + model.labOrdersResultHistoryList[index].description, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + isCopyable: true, + ), + ], + ), + Row( + children: [ + AppText( + "Reference Range", + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + color: Color(0xFF575757), + fontWeight: FontWeight.w600, + ), + SizedBox( + width: 1, + ), + AppText( + model.labOrdersResultHistoryList[index].referanceRange, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + isCopyable: true, + ), + ], + ), + Row( + children: [ + AppText( + "Result Value", + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + color: Color(0xFF575757), + fontWeight: FontWeight.w600, + ), + SizedBox( + width: 1, + ), + AppText( + model.labOrdersResultHistoryList[index].resultValue, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + isCopyable: true, + ), + ], + ), + Row( + children: [ + AppText( + "Verified On", + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + color: Color(0xFF575757), + fontWeight: FontWeight.w600, + ), + SizedBox( + width: 1, + ), + AppText( + model.labOrdersResultHistoryList[index].verifiedOn, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + isCopyable: true, + ), + ], + ), + ], + ), + ); + }), + ], + ), + ) + : ErrorMessage( + error: "No data", + ), + ), + ); + } +} diff --git a/lib/screens/patients/profile/lab_result/LabResultWidget.dart b/lib/screens/patients/profile/lab_result/LabResultWidget.dart index 26d85f62..82894002 100644 --- a/lib/screens/patients/profile/lab_result/LabResultWidget.dart +++ b/lib/screens/patients/profile/lab_result/LabResultWidget.dart @@ -10,6 +10,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'LabResultHistoryPage.dart'; + class LabResultWidget extends StatelessWidget { final String filterName; final List patientLabResultList; @@ -18,7 +20,12 @@ class LabResultWidget extends StatelessWidget { final bool isInpatient; LabResultWidget( - {Key key, this.filterName, this.patientLabResultList, this.patientLabOrder, this.patient, this.isInpatient}) + {Key key, + this.filterName, + this.patientLabResultList, + this.patientLabOrder, + this.patient, + this.isInpatient}) : super(key: key); ProjectViewModel projectViewModel; @@ -35,7 +42,30 @@ class LabResultWidget extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - AppText(filterName), + Row( + children: [ + AppText(filterName), + InkWell( + onTap: (){ + Navigator.push( + context, + FadePage( + page: LabResultHistoryPage( + filterName: filterName, + patientLabOrder: patientLabOrder, + patient: patient, + ), + ), + ); + }, + child: AppText( + " (show details)", + color: Colors.blue, + fontSize: 12, + ), + ), + ], + ), InkWell( onTap: () { Navigator.push( @@ -117,7 +147,8 @@ class LabResultWidget extends StatelessWidget { color: Colors.white, child: Center( child: AppText( - '${patientLabResultList[index].testCode}\n' + patientLabResultList[index].description, + '${patientLabResultList[index].testCode}\n' + + patientLabResultList[index].description, textAlign: TextAlign.center, isCopyable: true, ), @@ -131,7 +162,9 @@ class LabResultWidget extends StatelessWidget { child: Center( child: AppText( patientLabResultList[index].resultValue ?? - "" + " " + "${patientLabResultList[index].uOM ?? ""}", + "" + + " " + + "${patientLabResultList[index].uOM ?? ""}", textAlign: TextAlign.center, isCopyable: true, ), diff --git a/lib/util/translations_delegate_base.dart b/lib/util/translations_delegate_base.dart index e104a01e..ef776eef 100644 --- a/lib/util/translations_delegate_base.dart +++ b/lib/util/translations_delegate_base.dart @@ -1371,6 +1371,8 @@ class TranslationBase { String get summeryReply => localizedValues['summeryReply'][locale.languageCode]; String get severityValidationError => localizedValues['severityValidationError'][locale.languageCode]; String get textCopiedSuccessfully => localizedValues['textCopiedSuccessfully'][locale.languageCode]; + String get roomNo => localizedValues['roomNo'][locale.languageCode]; + String get seeMore => localizedValues['seeMore'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/patients/patient_card/PatientCard.dart b/lib/widgets/patients/patient_card/PatientCard.dart index b90eecd3..745966f2 100644 --- a/lib/widgets/patients/patient_card/PatientCard.dart +++ b/lib/widgets/patients/patient_card/PatientCard.dart @@ -35,7 +35,6 @@ class PatientCard extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( width: SizeConfig.screenWidth * 0.9, margin: EdgeInsets.all(6), @@ -260,9 +259,9 @@ class PatientCard extends StatelessWidget { patientInfo.fullName) : (Helpers.capitalize( patientInfo.firstName) + - " " + - Helpers.capitalize( - patientInfo.lastName)), + " " + + Helpers.capitalize( + patientInfo.lastName)), fontSize: 16, color: Color(0xff2e303a), fontWeight: FontWeight.w700, @@ -270,7 +269,6 @@ class PatientCard extends StatelessWidget { textOverflow: TextOverflow.ellipsis, ), ), - if (patientInfo.gender == 1) Icon( DoctorApp.male_2, @@ -281,9 +279,10 @@ class PatientCard extends StatelessWidget { DoctorApp.female_1, color: Colors.pink, ), - - if(isFromLiveCare) - ShowTimer(patientInfo: patientInfo,), + if (isFromLiveCare) + ShowTimer( + patientInfo: patientInfo, + ), ]), ), Row( @@ -351,79 +350,37 @@ class PatientCard extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 2.0 * SizeConfig.textMultiplier, - color: Colors.black), - children: [ - new TextSpan( - text: TranslationBase.of(context) - .fileNumber, - style: TextStyle( - fontSize: 12, - fontFamily: 'Poppins')), - new TextSpan( - text: patientInfo.patientId.toString(), - style: TextStyle( - fontWeight: FontWeight.w700, - fontFamily: 'Poppins', - fontSize: 13)), - ], - ), - ), + CustomRow( + label: TranslationBase.of(context).fileNumber, + value: patientInfo.patientId.toString(), ), + //if (isInpatient) - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 2.0 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: TranslationBase.of(context).age + - " : ", - style: TextStyle(fontSize: 12)), - new TextSpan( - text: - "${AppDateUtils.getAgeByBirthday(patientInfo.dateofBirth, context, isServerFormat: !isFromLiveCare)}", - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 13)), - ], - ), - ), + + CustomRow( + label: TranslationBase.of(context).age + " : ", + value: + "${AppDateUtils.getAgeByBirthday(patientInfo.dateofBirth, context, isServerFormat: !isFromLiveCare)}", ), + if (isInpatient) - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: - 2.0 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: patientInfo.admissionDate == null - ? "" - : TranslationBase.of(context) - .admissionDate + - " : ", - style: TextStyle(fontSize: 12)), - new TextSpan( - text: patientInfo.admissionDate == null - ? "" - : "${AppDateUtils.convertDateFromServerFormat(patientInfo.admissionDate.toString(), 'yyyy-MM-dd')}", - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 13)), - ]))), + CustomRow( + label: patientInfo.admissionDate == null + ? "" + : TranslationBase.of(context) + .admissionDate + + " : ", + value: patientInfo.admissionDate == null + ? "" + : "${AppDateUtils.convertDateFromServerFormat(patientInfo.admissionDate.toString(), 'yyyy-MM-dd')}", + ), + if (patientInfo.admissionDate != null) + CustomRow( + label: TranslationBase.of(context).numOfDays + + " : ", + value: + "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patientInfo.admissionDate)).inDays + 1}", + ), if (patientInfo.admissionDate != null) Container( child: RichText( @@ -437,12 +394,12 @@ class PatientCard extends StatelessWidget { children: [ new TextSpan( text: TranslationBase.of(context) - .numOfDays + + .roomNo + " : ", style: TextStyle(fontSize: 12)), new TextSpan( text: - "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patientInfo.admissionDate)).inDays + 1}", + "${patientInfo.roomId}", style: TextStyle( fontWeight: FontWeight.w700, fontSize: 13)), @@ -450,30 +407,11 @@ class PatientCard extends StatelessWidget { if (isFromLiveCare) Column( children: [ - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 2.0 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: - TranslationBase.of(context).clinic + - " : ", - style: TextStyle(fontSize: 12)), - new TextSpan( - text: - patientInfo.clinicName, - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: 13)), - ], - ), - ), - ), + + CustomRow(label: TranslationBase.of(context) + .clinic + + " : ", + value: patientInfo.clinicName,), ], ), ])) @@ -522,14 +460,47 @@ class PatientCard extends StatelessWidget { height: 25, width: 35, )), - ]) - : SizedBox() + ]) + : SizedBox() ], ), onTap: onTap, )), )); } +} +class CustomRow extends StatelessWidget { + const CustomRow({ + Key key, + this.label, + this.value, + }) : super(key: key); -} \ No newline at end of file + final String label; + final String value; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + AppText( + label, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 2.8, + color: Color(0xFF575757), + fontWeight: FontWeight.w600, + ), + SizedBox( + width: 1, + ), + AppText( + value, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + isCopyable: true, + ), + ], + ); + } +} diff --git a/lib/widgets/patients/profile/patient-profile-app-bar.dart b/lib/widgets/patients/profile/patient-profile-app-bar.dart index 4d3b56ef..a0b110bc 100644 --- a/lib/widgets/patients/profile/patient-profile-app-bar.dart +++ b/lib/widgets/patients/profile/patient-profile-app-bar.dart @@ -71,14 +71,17 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { right: 5, bottom: 5, ), - decoration: BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: Color(0xFFEFEFEF)))), + decoration: BoxDecoration( + color: Colors.white, + border: Border(bottom: BorderSide(color: Color(0xFFEFEFEF)))), child: Container( padding: EdgeInsets.only(left: 10, right: 10, bottom: 10), margin: EdgeInsets.only(top: SizeConfig.isHeightVeryShort ? 30 : 50), child: Column( children: [ Container( - padding: EdgeInsets.only(left: SizeConfig.isHeightVeryShort ? 0 : 12.0), + padding: EdgeInsets.only( + left: SizeConfig.isHeightVeryShort ? 0 : 12.0), child: Row(children: [ IconButton( icon: Icon(Icons.arrow_back_ios), @@ -91,8 +94,11 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { Expanded( child: AppText( patient.firstName != null - ? (Helpers.capitalize(patient.firstName) + " " + Helpers.capitalize(patient.lastName)) - : Helpers.capitalize(patient.fullName ?? patient.patientDetails.fullName), + ? (Helpers.capitalize(patient.firstName) + + " " + + Helpers.capitalize(patient.lastName)) + : Helpers.capitalize(patient.fullName ?? + patient.patientDetails.fullName), fontSize: SizeConfig.textMultiplier * 1.8, fontWeight: FontWeight.bold, fontFamily: 'Poppins', @@ -125,7 +131,8 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { ), Row(children: [ Padding( - padding: EdgeInsets.only(left: SizeConfig.isHeightVeryShort ? 0 : 12.0), + padding: EdgeInsets.only( + left: SizeConfig.isHeightVeryShort ? 0 : 12.0), child: Container( width: SizeConfig.getTextMultiplierBasedOnWidth() * 20, height: SizeConfig.getTextMultiplierBasedOnWidth() * 20, @@ -153,19 +160,25 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { color: Colors.green, fontWeight: FontWeight.bold, fontFamily: 'Poppins', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + fontSize: SizeConfig + .getTextMultiplierBasedOnWidth() * + 3.5, ) : AppText( TranslationBase.of(context).notArrived, color: Colors.red[800], fontWeight: FontWeight.bold, fontFamily: 'Poppins', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + fontSize: SizeConfig + .getTextMultiplierBasedOnWidth() * + 3.5, ), patient.startTime != null ? AppText(patient.startTime != null ? patient.startTime : '', fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + fontSize: SizeConfig + .getTextMultiplierBasedOnWidth() * + 3.5, color: Color(0xFF2E303A)) : SizedBox() ], @@ -179,7 +192,9 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { children: [ AppText( TranslationBase.of(context).fileNumber, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + fontSize: + SizeConfig.getTextMultiplierBasedOnWidth() * + 3, color: Color(0xFF575757), fontWeight: FontWeight.w600, ), @@ -188,7 +203,9 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { ), AppText( patient.patientId.toString(), - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + fontSize: + SizeConfig.getTextMultiplierBasedOnWidth() * + 3.5, color: Color(0xFF2E303A), fontWeight: FontWeight.w700, isCopyable: true, @@ -198,9 +215,14 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { Row( children: [ AppText( - patient.nationalityName ?? patient.nationality ?? patient.nationalityId ?? '', + patient.nationalityName ?? + patient.nationality ?? + patient.nationalityId ?? + '', fontWeight: FontWeight.bold, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + fontSize: + SizeConfig.getTextMultiplierBasedOnWidth() * + 3.5, ), patient.nationalityFlagURL != null ? ClipRRect( @@ -209,7 +231,9 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { patient.nationalityFlagURL, height: 25, width: 30, - errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) { + errorBuilder: (BuildContext context, + Object exception, + StackTrace stackTrace) { return Text('No Image'); }, )) @@ -218,144 +242,52 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { ) ], ), - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 1.6 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: TranslationBase.of(context).age + " : ", - style: TextStyle( - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), - )), - new TextSpan( - text: - "${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth ?? "" : patient.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}", - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - color: Color(0xFF2E303A), - )), - ], - ), - ), + + HeaderRow( + label: TranslationBase.of(context).age + " : ", + value: + "${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth ?? "" : patient.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}", ), - if (patient.appointmentDate != null && patient.appointmentDate.isNotEmpty && !isFromLabResult) - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - AppText( + if (patient.appointmentDate != null && + patient.appointmentDate.isNotEmpty && + !isFromLabResult) + HeaderRow( + label: TranslationBase.of(context).appointmentDate + " : ", - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - color: Color(0xFF575757), - fontWeight: FontWeight.w600, - fontFamily: 'Poppins', - ), - SizedBox( - width: 3.5, - ), - AppText( - AppDateUtils.getDayMonthYearDateFormatted( - AppDateUtils.convertStringToDate(patient.appointmentDate)), - fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - color: Color(0xFF2E303A), - ), - SizedBox( - height: 0.5, - ) - ], + value: AppDateUtils.getDayMonthYearDateFormatted( + AppDateUtils.convertStringToDate( + patient.appointmentDate)), ), if (isFromLabResult) - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 1.6 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: "Result Date: ", - style: TextStyle( - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - color: Color(0xFF575757), - fontWeight: FontWeight.w600, - fontFamily: 'Poppins', - )), - new TextSpan( - text: - '${AppDateUtils.getDayMonthYearDateFormatted(appointmentDate, isArabic: projectViewModel.isArabic)}', - style: TextStyle(fontWeight: FontWeight.w700, fontSize: 12)), - ], - ), - ), + HeaderRow( + label: "Result Date: ", + value: + '${AppDateUtils.getDayMonthYearDateFormatted(appointmentDate, isArabic: projectViewModel.isArabic)}', ), // if(isInpatient) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (patient.admissionDate != null && patient.admissionDate.isNotEmpty) - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: patient.admissionDate == null - ? "" - : TranslationBase.of(context).admissionDate + " : ", - style: TextStyle(fontSize: 10)), - new TextSpan( - text: patient.admissionDate == null - ? "" - : "${AppDateUtils.getDayMonthYearDateFormatted((AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate.toString())))}", - style: TextStyle( - fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - color: Color(0xFF2E303A), - )), - ]))), - if (patient.admissionDate != null) - Row( - children: [ - AppText( - "${TranslationBase.of(context).numOfDays}: ", - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), - isCopyable: true, - ), - if (isDischargedPatient && patient.dischargeDate != null) - AppText( - "${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}", - fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - color: Color(0xFF2E303A), - ) - else - AppText( - "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}", - fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - color: Color(0xFF2E303A), - isCopyable: true, - ), - ], + if (patient.admissionDate != null && + patient.admissionDate.isNotEmpty) + HeaderRow( + label: patient.admissionDate == null + ? "" + : TranslationBase.of(context).admissionDate + + " : ", + value: patient.admissionDate == null + ? "" + : "${AppDateUtils.getDayMonthYearDateFormatted((AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate.toString())))}", ), + if (patient.admissionDate != null) + HeaderRow( + label: "${TranslationBase.of(context).numOfDays}: ", + value: isDischargedPatient && + patient.dischargeDate != null + ? "${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}" + : "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}", + ) ], ), ], @@ -374,7 +306,8 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { decoration: BoxDecoration( shape: BoxShape.rectangle, border: Border( - bottom: BorderSide(color: Colors.grey[400], width: 2.5), + bottom: + BorderSide(color: Colors.grey[400], width: 2.5), left: BorderSide(color: Colors.grey[400], width: 2.5), )), ), @@ -397,100 +330,56 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { flex: 5, child: Container( margin: EdgeInsets.all(10), - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - AppText( - '${TranslationBase.of(context).dr}$doctorName', - color: Color(0xFF2E303A), - fontWeight: FontWeight.w700, - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - ), - if (orderNo != null && !isPrescriptions) - Row( - children: [ - AppText( - 'Order No: ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + '${TranslationBase.of(context).dr}$doctorName', + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + fontSize: SizeConfig + .getTextMultiplierBasedOnWidth() * + 3.5, + isCopyable: true, + ), + if (orderNo != null && !isPrescriptions) + HeaderRow( + label: 'Order No: ', + value: orderNo ?? '', ), - AppText(orderNo ?? '', fontSize: 12) - ], - ), - if (invoiceNO != null && !isPrescriptions) - Row( - children: [ - AppText( - 'Invoice: ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), + if (invoiceNO != null && !isPrescriptions) + HeaderRow( + label: 'Invoice: ', + value: invoiceNO ?? "", ), - AppText(invoiceNO ?? "", fontSize: 12) - ], - ), - if (branch != null) - Row( - children: [ - AppText( - 'Branch: ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), + if (branch != null) + HeaderRow( + label: 'Branch: ', + value: branch ?? '', ), - AppText(branch ?? '', fontSize: 12) - ], - ), - if (clinic != null) - Row( - children: [ - AppText( - 'Clinic: ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), + if (clinic != null) + HeaderRow( + label: 'Clinic: ', + value: clinic ?? '', ), - AppText(clinic ?? '', fontSize: 12) - ], - ), - if (isMedicalFile && episode != null) - Row( - children: [ - AppText( - 'Episode: ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), + if (isMedicalFile && episode != null) + HeaderRow( + label: 'Episode: ', + value: episode ?? '', ), - AppText(episode ?? '', fontSize: 12) - ], - ), - if (isMedicalFile && visitDate != null) - Row( - children: [ - AppText( - 'Visit Date: ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), + if (isMedicalFile && visitDate != null) + HeaderRow( + label: 'Visit Date: ', + value: visitDate ?? '', ), - AppText(visitDate ?? '', fontSize: 12) - ], + if (!isMedicalFile) + HeaderRow( + label: !isPrescriptions + ? 'Result Date:' + : 'Prescriptions Date ', + value: + '${AppDateUtils.getDayMonthYearDateFormatted(appointmentDate, isArabic: projectViewModel.isArabic)}', ), - if (!isMedicalFile) - Row( - children: [ - AppText( - !isPrescriptions ? 'Result Date:' : 'Prescriptions Date ', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, - fontWeight: FontWeight.w600, - color: Color(0xFF575757), - ), - AppText( - '${AppDateUtils.getDayMonthYearDateFormatted(appointmentDate, isArabic: projectViewModel.isArabic)}', - fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, - ) - ], - ) ]), ), ), @@ -518,6 +407,39 @@ class PatientProfileAppBar extends StatelessWidget with PreferredSizeWidget { ? 137 : SizeConfig.isHeightShort ? 190 - : SizeConfig.heightMultiplier * (SizeConfig.isWidthLarge ? 25 : 20) + : SizeConfig.heightMultiplier * + (SizeConfig.isWidthLarge ? 25 : 20) : height); } + +class HeaderRow extends StatelessWidget { + final String label; + final String value; + + const HeaderRow({Key key, this.label, this.value}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + AppText( + label, + isCopyable: true, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3, + color: Color(0xFF575757), + fontWeight: FontWeight.w600, + ), + SizedBox( + width: 1, + ), + AppText( + value, + fontSize: SizeConfig.getTextMultiplierBasedOnWidth() * 3.5, + color: Color(0xFF2E303A), + fontWeight: FontWeight.w700, + isCopyable: true, + ), + ], + ); + } +} diff --git a/lib/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart b/lib/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart index 08cc26c5..7940fd61 100644 --- a/lib/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart +++ b/lib/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart @@ -7,13 +7,15 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart'; import 'package:doctor_app_flutter/util/date-utils.dart'; import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; +import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart'; import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart'; import 'package:flutter/material.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:intl/intl.dart'; import 'package:url_launcher/url_launcher.dart'; -class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with PreferredSizeWidget { +class PatientProfileHeaderNewDesignAppBar extends StatelessWidget + with PreferredSizeWidget { final PatiantInformtion patient; final String patientType; final String arrivalType; @@ -24,7 +26,8 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred final Stream videoCallDurationStream; - PatientProfileHeaderNewDesignAppBar(this.patient, this.patientType, this.arrivalType, + PatientProfileHeaderNewDesignAppBar( + this.patient, this.patientType, this.arrivalType, {this.height = 0.0, this.isInpatient = false, this.isDischargedPatient = false, @@ -69,8 +72,11 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred Expanded( child: AppText( patient.firstName != null - ? (Helpers.capitalize(patient.firstName) + " " + Helpers.capitalize(patient.lastName)) - : Helpers.capitalize(patient.fullName ?? patient.patientDetails.fullName), + ? (Helpers.capitalize(patient.firstName) + + " " + + Helpers.capitalize(patient.lastName)) + : Helpers.capitalize(patient.fullName ?? + patient.patientDetails.fullName), fontSize: SizeConfig.textMultiplier * 1.8, fontWeight: FontWeight.bold, fontFamily: 'Poppins', @@ -103,13 +109,17 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred ), StreamBuilder( stream: videoCallDurationStream, - builder: (BuildContext context, AsyncSnapshot snapshot) { + builder: + (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData && snapshot.data != null) return InkWell( onTap: () {}, child: Container( - decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(20)), - padding: EdgeInsets.symmetric(vertical: 2, horizontal: 10), + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(20)), + padding: + EdgeInsets.symmetric(vertical: 2, horizontal: 10), child: Text( snapshot.data, style: TextStyle(color: Colors.white), @@ -129,7 +139,9 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred width: 60, height: 60, child: Image.asset( - gender == 1 ? 'assets/images/male_avatar.png' : 'assets/images/female_avatar.png', + gender == 1 + ? 'assets/images/male_avatar.png' + : 'assets/images/female_avatar.png', fit: BoxFit.cover, ), ), @@ -141,7 +153,8 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SERVICES_PATIANT2[int.parse(patientType)] == "patientArrivalList" + SERVICES_PATIANT2[int.parse(patientType)] == + "patientArrivalList" ? Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -163,14 +176,18 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred ), arrivalType == '1' || patient.arrivedOn == null ? AppText( - patient.startTime != null ? patient.startTime : '', + patient.startTime != null + ? patient.startTime + : '', fontFamily: 'Poppins', fontWeight: FontWeight.w600, ) : AppText( patient.arrivedOn != null - ? AppDateUtils.convertStringToDateFormat( - patient.arrivedOn, 'MM-dd-yyyy HH:mm') + ? AppDateUtils + .convertStringToDateFormat( + patient.arrivedOn, + 'MM-dd-yyyy HH:mm') : '', fontFamily: 'Poppins', fontWeight: FontWeight.w600, @@ -178,13 +195,16 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred ], )) : SizedBox(), - if (SERVICES_PATIANT2[int.parse(patientType)] == "List_MyOutPatient" && !isFromLiveCare) + if (SERVICES_PATIANT2[int.parse(patientType)] == + "List_MyOutPatient" && + !isFromLiveCare) Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ AppText( - TranslationBase.of(context).appointmentDate + " : ", + TranslationBase.of(context).appointmentDate + + " : ", fontSize: 14, ), patient.startTime != null @@ -209,7 +229,8 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred ), Container( child: AppText( - convertDateFormat2(patient.appointmentDate ?? ''), + convertDateFormat2( + patient.appointmentDate ?? ''), fontSize: 1.5 * SizeConfig.textMultiplier, fontWeight: FontWeight.bold, ), @@ -226,23 +247,17 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - RichText( - text: TextSpan( - style: TextStyle(fontSize: 1.6 * SizeConfig.textMultiplier, color: Colors.black), - children: [ - new TextSpan( - text: TranslationBase.of(context).fileNumber, - style: TextStyle(fontSize: 12, fontFamily: 'Poppins')), - new TextSpan( - text: patient.patientId.toString(), - style: TextStyle(fontWeight: FontWeight.w700, fontFamily: 'Poppins', fontSize: 14)), - ], - ), + HeaderRow( + label: TranslationBase.of(context).fileNumber, + value: patient.patientId.toString(), ), Row( children: [ AppText( - patient.nationalityName ?? patient.nationality ?? patient.nationalityId ?? '', + patient.nationalityName ?? + patient.nationality ?? + patient.nationalityId ?? + '', fontWeight: FontWeight.bold, fontSize: 12, ), @@ -253,7 +268,9 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred patient.nationalityFlagURL, height: 25, width: 30, - errorBuilder: (BuildContext context, Object exception, StackTrace stackTrace) { + errorBuilder: (BuildContext context, + Object exception, + StackTrace stackTrace) { return Text('No Image'); }, )) @@ -262,67 +279,31 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred ) ], ), - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 1.6 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan(text: TranslationBase.of(context).age + " : ", style: TextStyle(fontSize: 14)), - new TextSpan( - text: - "${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth ?? "" : patient.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}", - style: TextStyle(fontWeight: FontWeight.w700, fontSize: 14)), - ], - ), - ), + HeaderRow( + label: TranslationBase.of(context).age + " : ", + value: + "${AppDateUtils.getAgeByBirthday(patient.patientDetails != null ? patient.patientDetails.dateofBirth ?? "" : patient.dateofBirth ?? "", context, isServerFormat: !isFromLiveCare)}", ), if (isInpatient) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Container( - child: RichText( - text: new TextSpan( - style: new TextStyle( - fontSize: 2.0 * SizeConfig.textMultiplier, - color: Colors.black, - fontFamily: 'Poppins', - ), - children: [ - new TextSpan( - text: patient.admissionDate == null - ? "" - : TranslationBase.of(context).admissionDate + " : ", - style: TextStyle(fontSize: 14)), - new TextSpan( - text: patient.admissionDate == null - ? "" - : "${AppDateUtils.convertDateFromServerFormat(patient.admissionDate.toString(), 'yyyy-MM-dd')}", - style: TextStyle(fontWeight: FontWeight.w700, fontSize: 15)), - ]))), + HeaderRow( + label: patient.admissionDate == null + ? "" + : TranslationBase.of(context).admissionDate + + " : ", + value: patient.admissionDate == null + ? "" + : "${AppDateUtils.convertDateFromServerFormat(patient.admissionDate.toString(), 'yyyy-MM-dd')}"), if (patient.admissionDate != null) - Row( - children: [ - AppText( - "${TranslationBase.of(context).numOfDays}: ", - fontSize: 15, - ), - if (isDischargedPatient && patient.dischargeDate != null) - AppText( - "${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}", - fontSize: 15, - fontWeight: FontWeight.w700) - else - AppText( - "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}", - fontSize: 15, - fontWeight: FontWeight.w700), - ], - ), + HeaderRow( + label: "${TranslationBase.of(context).numOfDays}: ", + value: isDischargedPatient && + patient.dischargeDate != null + ? "${AppDateUtils.getDateTimeFromServerFormat(patient.dischargeDate).difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}" + : "${DateTime.now().difference(AppDateUtils.getDateTimeFromServerFormat(patient.admissionDate)).inDays + 1}", + ) ], ) ], @@ -344,7 +325,8 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred final startIndex = str.indexOf(start); final endIndex = str.indexOf(end, startIndex + start.length); - var date = new DateTime.fromMillisecondsSinceEpoch(int.parse(str.substring(startIndex + start.length, endIndex))); + var date = new DateTime.fromMillisecondsSinceEpoch( + int.parse(str.substring(startIndex + start.length, endIndex))); newDate = date.year.toString() + "/" + date.month.toString().padLeft(2, '0') + @@ -357,7 +339,8 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget with Preferred isToday(date) { DateTime tempDate = new DateFormat("yyyy-MM-dd").parse(date); - return DateFormat("yyyy-MM-dd").format(tempDate) == DateFormat("yyyy-MM-dd").format(DateTime.now()); + return DateFormat("yyyy-MM-dd").format(tempDate) == + DateFormat("yyyy-MM-dd").format(DateTime.now()); } myBoxDecoration() { diff --git a/pubspec.lock b/pubspec.lock index 0229e774..e2215d0c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -664,7 +664,7 @@ packages: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.4" + version: "1.3.0-nullsafety.3" mime: dependency: transitive description: @@ -956,7 +956,7 @@ packages: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.2" + version: "1.10.0-nullsafety.1" sticky_headers: dependency: "direct main" description: @@ -1154,5 +1154,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.0 <=2.11.0-213.1.beta" + dart: ">=2.10.0 <2.11.0" flutter: ">=1.22.0 <2.0.0"