medical report implementation contd.
							parent
							
								
									de717edfe8
								
							
						
					
					
						commit
						14725616c6
					
				| @ -0,0 +1,192 @@ | ||||
| class PatientMedicalReportResponseModel { | ||||
|   int? status; | ||||
|   String? encounterDate; | ||||
|   int? projectID; | ||||
|   int? invoiceNo; | ||||
|   int? encounterNo; | ||||
|   String? procedureId; | ||||
|   int? requestType; | ||||
|   String? setupId; | ||||
|   int? patientID; | ||||
|   int? doctorID; | ||||
|   int? clinicID; | ||||
|   String? requestDate; | ||||
|   bool? isRead; | ||||
|   dynamic isReadOn; | ||||
|   num? actualDoctorRate; | ||||
|   String? admissionDate; | ||||
|   int? admissionNumber; | ||||
|   String? appointmentDate; | ||||
|   int? appointmentNO; | ||||
|   String? appointmentTime; | ||||
|   String? clinicDescription; | ||||
|   dynamic clinicDescriptionN; | ||||
|   num? decimalDoctorRate; | ||||
|   String? docName; | ||||
|   dynamic docNameN; | ||||
|   String? doctorImageURL; | ||||
|   String? doctorName; | ||||
|   dynamic doctorNameN; | ||||
|   num? doctorRate; | ||||
|   num? doctorStarsRate; | ||||
|   int? invoiceNoVP; | ||||
|   dynamic invoiceType; | ||||
|   bool? isDoctorAllowVedioCall; | ||||
|   bool? isExecludeDoctor; | ||||
|   bool? isInOutPatient; | ||||
|   String? isInOutPatientDescription; | ||||
|   String? isInOutPatientDescriptionN; | ||||
|   int? noOfPatientsRate; | ||||
|   String? projectName; | ||||
|   dynamic projectNameN; | ||||
|   int? sourceID; | ||||
|   dynamic sourceName; | ||||
|   dynamic sourceNameN; | ||||
|   String? statusDesc; | ||||
|   dynamic strAppointmentDate; | ||||
| 
 | ||||
|   PatientMedicalReportResponseModel( | ||||
|       {this.status, | ||||
|       this.encounterDate, | ||||
|       this.projectID, | ||||
|       this.invoiceNo, | ||||
|       this.encounterNo, | ||||
|       this.procedureId, | ||||
|       this.requestType, | ||||
|       this.setupId, | ||||
|       this.patientID, | ||||
|       this.doctorID, | ||||
|       this.clinicID, | ||||
|       this.requestDate, | ||||
|       this.isRead, | ||||
|       this.isReadOn, | ||||
|       this.actualDoctorRate, | ||||
|       this.admissionDate, | ||||
|       this.admissionNumber, | ||||
|       this.appointmentDate, | ||||
|       this.appointmentNO, | ||||
|       this.appointmentTime, | ||||
|       this.clinicDescription, | ||||
|       this.clinicDescriptionN, | ||||
|       this.decimalDoctorRate, | ||||
|       this.docName, | ||||
|       this.docNameN, | ||||
|       this.doctorImageURL, | ||||
|       this.doctorName, | ||||
|       this.doctorNameN, | ||||
|       this.doctorRate, | ||||
|       this.doctorStarsRate, | ||||
|       this.invoiceNoVP, | ||||
|       this.invoiceType, | ||||
|       this.isDoctorAllowVedioCall, | ||||
|       this.isExecludeDoctor, | ||||
|       this.isInOutPatient, | ||||
|       this.isInOutPatientDescription, | ||||
|       this.isInOutPatientDescriptionN, | ||||
|       this.noOfPatientsRate, | ||||
|       this.projectName, | ||||
|       this.projectNameN, | ||||
|       this.sourceID, | ||||
|       this.sourceName, | ||||
|       this.sourceNameN, | ||||
|       this.statusDesc, | ||||
|       this.strAppointmentDate}); | ||||
| 
 | ||||
|   PatientMedicalReportResponseModel.fromJson(Map<String, dynamic> json) { | ||||
|     status = json['Status']; | ||||
|     encounterDate = json['EncounterDate']; | ||||
|     projectID = json['ProjectID']; | ||||
|     invoiceNo = json['InvoiceNo']; | ||||
|     encounterNo = json['EncounterNo']; | ||||
|     procedureId = json['ProcedureId']; | ||||
|     requestType = json['RequestType']; | ||||
|     setupId = json['SetupId']; | ||||
|     patientID = json['PatientID']; | ||||
|     doctorID = json['DoctorID']; | ||||
|     clinicID = json['ClinicID']; | ||||
|     requestDate = json['RequestDate']; | ||||
|     isRead = json['IsRead']; | ||||
|     isReadOn = json['IsReadOn']; | ||||
|     actualDoctorRate = json['ActualDoctorRate']; | ||||
|     admissionDate = json['AdmissionDate']; | ||||
|     admissionNumber = json['AdmissionNumber']; | ||||
|     appointmentDate = json['AppointmentDate']; | ||||
|     appointmentNO = json['AppointmentNO']; | ||||
|     appointmentTime = json['AppointmentTime']; | ||||
|     clinicDescription = json['ClinicDescription']; | ||||
|     clinicDescriptionN = json['ClinicDescriptionN']; | ||||
|     decimalDoctorRate = json['DecimalDoctorRate']; | ||||
|     docName = json['DocName']; | ||||
|     docNameN = json['DocNameN']; | ||||
|     doctorImageURL = json['DoctorImageURL']; | ||||
|     doctorName = json['DoctorName']; | ||||
|     doctorNameN = json['DoctorNameN']; | ||||
|     doctorRate = json['DoctorRate']; | ||||
|     doctorStarsRate = json['DoctorStarsRate']; | ||||
|     invoiceNoVP = json['InvoiceNo_VP']; | ||||
|     invoiceType = json['InvoiceType']; | ||||
|     isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall']; | ||||
|     isExecludeDoctor = json['IsExecludeDoctor']; | ||||
|     isInOutPatient = json['IsInOutPatient']; | ||||
|     isInOutPatientDescription = json['IsInOutPatientDescription']; | ||||
|     isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN']; | ||||
|     noOfPatientsRate = json['NoOfPatientsRate']; | ||||
|     projectName = json['ProjectName']; | ||||
|     projectNameN = json['ProjectNameN']; | ||||
|     sourceID = json['SourceID']; | ||||
|     sourceName = json['SourceName']; | ||||
|     sourceNameN = json['SourceNameN']; | ||||
|     statusDesc = json['StatusDesc']; | ||||
|     strAppointmentDate = json['StrAppointmentDate']; | ||||
|   } | ||||
| 
 | ||||
|   Map<String, dynamic> toJson() { | ||||
|     final Map<String, dynamic> data = new Map<String, dynamic>(); | ||||
|     data['Status'] = this.status; | ||||
|     data['EncounterDate'] = this.encounterDate; | ||||
|     data['ProjectID'] = this.projectID; | ||||
|     data['InvoiceNo'] = this.invoiceNo; | ||||
|     data['EncounterNo'] = this.encounterNo; | ||||
|     data['ProcedureId'] = this.procedureId; | ||||
|     data['RequestType'] = this.requestType; | ||||
|     data['SetupId'] = this.setupId; | ||||
|     data['PatientID'] = this.patientID; | ||||
|     data['DoctorID'] = this.doctorID; | ||||
|     data['ClinicID'] = this.clinicID; | ||||
|     data['RequestDate'] = this.requestDate; | ||||
|     data['IsRead'] = this.isRead; | ||||
|     data['IsReadOn'] = this.isReadOn; | ||||
|     data['ActualDoctorRate'] = this.actualDoctorRate; | ||||
|     data['AdmissionDate'] = this.admissionDate; | ||||
|     data['AdmissionNumber'] = this.admissionNumber; | ||||
|     data['AppointmentDate'] = this.appointmentDate; | ||||
|     data['AppointmentNO'] = this.appointmentNO; | ||||
|     data['AppointmentTime'] = this.appointmentTime; | ||||
|     data['ClinicDescription'] = this.clinicDescription; | ||||
|     data['ClinicDescriptionN'] = this.clinicDescriptionN; | ||||
|     data['DecimalDoctorRate'] = this.decimalDoctorRate; | ||||
|     data['DocName'] = this.docName; | ||||
|     data['DocNameN'] = this.docNameN; | ||||
|     data['DoctorImageURL'] = this.doctorImageURL; | ||||
|     data['DoctorName'] = this.doctorName; | ||||
|     data['DoctorNameN'] = this.doctorNameN; | ||||
|     data['DoctorRate'] = this.doctorRate; | ||||
|     data['DoctorStarsRate'] = this.doctorStarsRate; | ||||
|     data['InvoiceNo_VP'] = this.invoiceNoVP; | ||||
|     data['InvoiceType'] = this.invoiceType; | ||||
|     data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall; | ||||
|     data['IsExecludeDoctor'] = this.isExecludeDoctor; | ||||
|     data['IsInOutPatient'] = this.isInOutPatient; | ||||
|     data['IsInOutPatientDescription'] = this.isInOutPatientDescription; | ||||
|     data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN; | ||||
|     data['NoOfPatientsRate'] = this.noOfPatientsRate; | ||||
|     data['ProjectName'] = this.projectName; | ||||
|     data['ProjectNameN'] = this.projectNameN; | ||||
|     data['SourceID'] = this.sourceID; | ||||
|     data['SourceName'] = this.sourceName; | ||||
|     data['SourceNameN'] = this.sourceNameN; | ||||
|     data['StatusDesc'] = this.statusDesc; | ||||
|     data['StrAppointmentDate'] = this.strAppointmentDate; | ||||
|     return data; | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,91 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; | ||||
| import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; | ||||
| import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||||
| import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; | ||||
| import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/lab/collapsing_list_view.dart'; | ||||
| import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_medical_report_card.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| 
 | ||||
| class MedicalReportsPage extends StatefulWidget { | ||||
|   const MedicalReportsPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   State<MedicalReportsPage> createState() => _MedicalReportsPageState(); | ||||
| } | ||||
| 
 | ||||
| class _MedicalReportsPageState extends State<MedicalReportsPage> { | ||||
|   late MedicalFileViewModel medicalFileViewModel; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     medicalFileViewModel = Provider.of<MedicalFileViewModel>(context, listen: false); | ||||
|     return Scaffold( | ||||
|       backgroundColor: AppColors.bgScaffoldColor, | ||||
|       body: CollapsingListView( | ||||
|         title: "Medical Reports".needTranslation, | ||||
|         child: SingleChildScrollView( | ||||
|           child: Column( | ||||
|             children: [ | ||||
|               SizedBox(height: 16.h), | ||||
|               CustomTabBar( | ||||
|                 activeTextColor: Color(0xffED1C2B), | ||||
|                 activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), | ||||
|                 tabs: [ | ||||
|                   CustomTabBarModel(null, "Requested".needTranslation), | ||||
|                   CustomTabBarModel(null, "Ready".needTranslation), | ||||
|                   CustomTabBarModel(null, "Cancelled".needTranslation), | ||||
|                 ], | ||||
|                 onTabChange: (index) { | ||||
|                   medicalFileViewModel.onMedicalReportTabChange(index); | ||||
|                 }, | ||||
|               ).paddingSymmetrical(24.h, 0.h), | ||||
|               Consumer<MedicalFileViewModel>(builder: (context, medicalFileVM, child) { | ||||
|                 return ListView.separated( | ||||
|                   padding: EdgeInsets.only(top: 24.h), | ||||
|                   shrinkWrap: true, | ||||
|                   physics: NeverScrollableScrollPhysics(), | ||||
|                   itemCount: medicalFileViewModel.isPatientMedicalReportsListLoading ? 3 : medicalFileViewModel.patientMedicalReportList.length, | ||||
|                   // medicalFileViewModel.patientMedicalReportList.isNotEmpty | ||||
|                   //         ? medicalFileViewModel.patientMedicalReportList.length | ||||
|                   //         : 1, | ||||
|                   itemBuilder: (context, index) { | ||||
|                     return medicalFileViewModel.isPatientMedicalReportsListLoading | ||||
|                         ? PatientMedicalReportCard( | ||||
|                             patientMedicalReportResponseModel: PatientMedicalReportResponseModel(), | ||||
|                             isLoading: true, | ||||
|                           ).paddingSymmetrical(24.h, 0.h) | ||||
|                         : AnimationConfiguration.staggeredList( | ||||
|                             position: index, | ||||
|                             duration: const Duration(milliseconds: 500), | ||||
|                             child: SlideAnimation( | ||||
|                               verticalOffset: 100.0, | ||||
|                               child: FadeInAnimation( | ||||
|                                 child: AnimatedContainer( | ||||
|                                   duration: Duration(milliseconds: 300), | ||||
|                                   curve: Curves.easeInOut, | ||||
|                                   decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), | ||||
|                                   child: PatientMedicalReportCard( | ||||
|                                     patientMedicalReportResponseModel: medicalFileVM.patientMedicalReportList[index], | ||||
|                                     isLoading: false, | ||||
|                                   ), | ||||
|                                 ).paddingSymmetrical(24.h, 0.h), | ||||
|                               ), | ||||
|                             ), | ||||
|                           ); | ||||
|                   }, | ||||
|                   separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), | ||||
|                 ); | ||||
|               }), | ||||
|               SizedBox(height: 24.h), | ||||
|             ], | ||||
|           ), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,120 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/cupertino.dart'; | ||||
| import 'package:hmg_patient_app_new/core/app_assets.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/date_util.dart'; | ||||
| import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; | ||||
| import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; | ||||
| import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; | ||||
| import 'package:hmg_patient_app_new/features/medical_file/models/patient_medical_response_model.dart'; | ||||
| import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; | ||||
| import 'package:hmg_patient_app_new/theme/colors.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; | ||||
| import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; | ||||
| 
 | ||||
| class PatientMedicalReportCard extends StatelessWidget { | ||||
|   PatientMedicalReportCard({super.key, required this.patientMedicalReportResponseModel, this.isLoading = false}); | ||||
| 
 | ||||
|   PatientMedicalReportResponseModel patientMedicalReportResponseModel; | ||||
| 
 | ||||
|   bool isLoading = true; | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Container( | ||||
|       decoration: RoundedRectangleBorder().toSmoothCornerDecoration( | ||||
|         color: AppColors.whiteColor, | ||||
|         borderRadius: 20.h, | ||||
|         hasShadow: true, | ||||
|       ), | ||||
|       child: Padding( | ||||
|         padding: EdgeInsets.all(16.h), | ||||
|         child: Column( | ||||
|           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|           children: [ | ||||
|             Row( | ||||
|               crossAxisAlignment: CrossAxisAlignment.start, | ||||
|               children: [ | ||||
|                 Image.network( | ||||
|                   isLoading ? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png" : patientMedicalReportResponseModel.doctorImageURL!, | ||||
|                   width: 63.h, | ||||
|                   height: 63.h, | ||||
|                   fit: BoxFit.fill, | ||||
|                 ).circle(100).toShimmer2(isShow: isLoading), | ||||
|                 SizedBox(width: 16.h), | ||||
|                 Expanded( | ||||
|                   child: Column( | ||||
|                     crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                     children: [ | ||||
|                       (isLoading ? "" : patientMedicalReportResponseModel.doctorName!).toText16(isBold: true).toShimmer2(isShow: isLoading), | ||||
|                       SizedBox(height: 4.h), | ||||
|                       Wrap( | ||||
|                         direction: Axis.horizontal, | ||||
|                         spacing: 3.h, | ||||
|                         runSpacing: 4.h, | ||||
|                         children: [ | ||||
|                           AppCustomChipWidget(labelText: isLoading ? "" : patientMedicalReportResponseModel.clinicDescription!).toShimmer2(isShow: isLoading), | ||||
|                           AppCustomChipWidget(labelText: isLoading ? "" : patientMedicalReportResponseModel.projectName!).toShimmer2(isShow: isLoading), | ||||
|                           AppCustomChipWidget( | ||||
|                                   icon: AppAssets.doctor_calendar_icon, | ||||
|                                   labelText: isLoading | ||||
|                                       ? "" | ||||
|                                       : "${DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientMedicalReportResponseModel.requestDate), false)}, ${DateUtil.formatDateToTimeLang(DateUtil.convertStringToDate(patientMedicalReportResponseModel.requestDate), false)}") | ||||
|                               .toShimmer2(isShow: isLoading), | ||||
|                           AppCustomChipWidget( | ||||
|                                   icon: AppAssets.rating_icon, iconColor: AppColors.ratingColorYellow, labelText: isLoading ? "" : "Rating: ${patientMedicalReportResponseModel.decimalDoctorRate}") | ||||
|                               .toShimmer2(isShow: isLoading), | ||||
|                         ], | ||||
|                       ), | ||||
|                     ], | ||||
|                   ), | ||||
|                 ), | ||||
|               ], | ||||
|             ), | ||||
|             patientMedicalReportResponseModel.status == 2 | ||||
|                 ? Padding( | ||||
|                     padding: EdgeInsets.only(top: 16.h), | ||||
|                     child: Row( | ||||
|                       children: [ | ||||
|                         Expanded( | ||||
|                           child: CustomButton( | ||||
|                             text: "Share", | ||||
|                             onPressed: () {}, | ||||
|                             backgroundColor: AppColors.secondaryLightRedColor, | ||||
|                             borderColor: AppColors.secondaryLightRedColor, | ||||
|                             textColor: AppColors.primaryRedColor, | ||||
|                             fontSize: 14, | ||||
|                             fontWeight: FontWeight.w500, | ||||
|                             borderRadius: 12.h, | ||||
|                             height: 40.h, | ||||
|                             icon: AppAssets.download_1, | ||||
|                             iconColor: AppColors.primaryRedColor, | ||||
|                             iconSize: 16.h, | ||||
|                           ).toShimmer2(isShow: isLoading), | ||||
|                         ), | ||||
|                         SizedBox(width: 16.h), | ||||
|                         Expanded( | ||||
|                           child: CustomButton( | ||||
|                             text: "Download", | ||||
|                             onPressed: () {}, | ||||
|                             backgroundColor: AppColors.secondaryLightRedColor, | ||||
|                             borderColor: AppColors.secondaryLightRedColor, | ||||
|                             textColor: AppColors.primaryRedColor, | ||||
|                             fontSize: 14, | ||||
|                             fontWeight: FontWeight.w500, | ||||
|                             borderRadius: 12.h, | ||||
|                             height: 40.h, | ||||
|                             icon: AppAssets.download_1, | ||||
|                             iconColor: AppColors.primaryRedColor, | ||||
|                             iconSize: 16.h, | ||||
|                           ).toShimmer2(isShow: isLoading), | ||||
|                         ), | ||||
|                       ], | ||||
|                     ), | ||||
|                   ) | ||||
|                 : SizedBox.shrink() | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Haroon Amjad
						Haroon Amjad