From ef4a57223ca8df6adf1ee1e3c27e48d0d524d7ed Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 2 Sep 2020 14:19:14 +0300 Subject: [PATCH 1/6] fix DoctorView.dart UI issues --- lib/config/localized_values.dart | 6 +- lib/core/service/client/base_app_client.dart | 4 +- .../service/medical/my_doctor_service.dart | 12 +- .../medical/my_doctor_view_model.dart | 6 +- .../Appointments/DoctorListResponse.dart | 91 +++--- .../BookAppointment/widgets/DoctorView.dart | 130 ++++----- lib/pages/MyAppointments/MyAppointments.dart | 8 +- lib/pages/landing/home_page.dart | 4 +- .../medical/doctor/doctor_home_page.dart | 48 +++- .../medical/doctor/doctor_profile_page.dart | 258 +++++++++--------- lib/uitl/translations_delegate_base.dart | 6 + 11 files changed, 320 insertions(+), 253 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 6d2cff69..3291870d 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -373,5 +373,9 @@ const Map> localizedValues = { "building":{"en":"Building:","ar":"المبنى"}, "branch":{"en":"Branch:","ar":"الفرع"}, "emergencyServices":{"en":"Emergency Services:","ar":"خدمات الطوارئ"}, - "textToSpeech": {"en": "How May I Help You?", "ar": "كيف يمكنني مساعدتك؟"} + "textToSpeech": {"en": "How May I Help You?", "ar": "كيف يمكنني مساعدتك؟"}, + "MyAppointments": {"en": "My Appointments", "ar": "مواعيدي"}, + "NoBookedAppointments": {"en": "No Booked Appointments", "ar": "لا توجد مواعيد محجوزة"}, + "NoConfirmedAppointments": {"en": "No Confirmed Appointments", "ar": "لا توجد مواعيد مؤكدة"}, + "noArrivedAppointments": {"en": "No Arrived Appointments", "ar": "لم تصل المواعيد"}, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index f45fe22b..aa48c49d 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -36,9 +36,7 @@ class BaseAppClient { body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] != null ? body['SetupID'] : SETUP_ID : SETUP_ID; - body['VersionID'] = body.containsKey('VersionID') - ? body['VersionID'] != null ? body['VersionID'] : VERSION_ID - : VERSION_ID; + body['VersionID'] = VERSION_ID; body['Channel'] = CHANNEL; body['LanguageID'] = languageID == 'ar' ? 1 : 2; body['IPAdress'] = IP_ADDRESS; diff --git a/lib/core/service/medical/my_doctor_service.dart b/lib/core/service/medical/my_doctor_service.dart index 349d7ace..d688c7e7 100644 --- a/lib/core/service/medical/my_doctor_service.dart +++ b/lib/core/service/medical/my_doctor_service.dart @@ -6,10 +6,12 @@ import 'package:diplomaticquarterapp/core/model/doctor/reques_patient_doctor_app import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_profile.dart'; import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_rating.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; class MyDoctorService extends BaseService { List patientDoctorAppointmentList = List(); DoctorProfile doctorProfile; + DoctorList doctorList; DoctorRating doctorRating = DoctorRating(); RequestPatientDoctorAppointment patientDoctorAppointmentRequest = @@ -58,7 +60,6 @@ class MyDoctorService extends BaseService { } RequestDoctorProfile _requestDoctorProfile = RequestDoctorProfile( - doctorID: 2477, license: true, isRegistered: true, projectID: 12, @@ -79,11 +80,18 @@ class MyDoctorService extends BaseService { ///GET DOCTOR PROFILE _requestDoctorProfile.doctorID = doctorId; _requestDoctorProfile.clinicID = clinicID; - _requestDoctorProfile.patientID = projectID; + _requestDoctorProfile.projectID = projectID; hasError = false; await baseAppClient.post(GET_DOCTOR_PROFILE, onSuccess: (dynamic response, int statusCode) { doctorProfile = DoctorProfile.fromJson(response['DoctorProfileList'][0]); + doctorList = DoctorList.fromJson(response['DoctorProfileList'][0]); + doctorList.clinicName = doctorProfile.clinicDescription; + doctorList.doctorTitle = doctorProfile.doctorTitleForProfile; + doctorList.name = doctorProfile.doctorName; + doctorList.projectName = doctorProfile.projectName; + + }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; diff --git a/lib/core/viewModels/medical/my_doctor_view_model.dart b/lib/core/viewModels/medical/my_doctor_view_model.dart index e04f9bdd..f1db7804 100644 --- a/lib/core/viewModels/medical/my_doctor_view_model.dart +++ b/lib/core/viewModels/medical/my_doctor_view_model.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; import 'package:diplomaticquarterapp/core/service/medical/my_doctor_service.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import '../../../locator.dart'; import '../base_view_model.dart'; @@ -22,6 +23,9 @@ class MyDoctorViewModel extends BaseViewModel { ? _patientDoctorAppointmentListClinic : _patientDoctorAppointmentListHospital; + DoctorList get doctorList=> _myDoctorService.doctorList; + + DoctorProfile get doctorProfile => _myDoctorService.doctorProfile; DoctorRating get doctorRating => _myDoctorService.doctorRating; @@ -83,7 +87,7 @@ class MyDoctorViewModel extends BaseViewModel { notifyListeners(); } - void getDoctorProfileAndRating({int doctorId,int clinicID,int projectID }) async { + Future getDoctorProfileAndRating({int doctorId,int clinicID,int projectID }) async { setState(ViewState.Busy); await _myDoctorService.getDoctorProfileAndRating(doctorId: doctorId,clinicID: clinicID,projectID: projectID); if (_myDoctorService.hasError) { diff --git a/lib/models/Appointments/DoctorListResponse.dart b/lib/models/Appointments/DoctorListResponse.dart index 2f4ee2a0..1ef6ee72 100644 --- a/lib/models/Appointments/DoctorListResponse.dart +++ b/lib/models/Appointments/DoctorListResponse.dart @@ -1,3 +1,5 @@ +import 'package:intl/intl.dart'; + class DoctorList { int clinicID; String clinicName; @@ -41,44 +43,44 @@ class DoctorList { DoctorList( {this.clinicID, - this.clinicName, - this.doctorTitle, - this.iD, - this.name, - this.projectID, - this.projectName, - this.actualDoctorRate, - this.clinicRoomNo, - this.date, - this.dayName, - this.doctorID, - this.doctorImageURL, - this.doctorProfile, - this.doctorProfileInfo, - this.doctorRate, - this.gender, - this.genderDescription, - this.isAppointmentAllowed, - this.isDoctorAllowVedioCall, - this.isDoctorDummy, - this.isLiveCare, - this.latitude, - this.longitude, - this.nationalityFlagURL, - this.nationalityID, - this.nationalityName, - this.nearestFreeSlot, - this.noOfPatientsRate, - this.originalClinicID, - this.personRate, - this.projectDistanceInKiloMeters, - this.qR, - this.qRString, - this.rateNumber, - this.serviceID, - this.setupID, - this.speciality, - this.workingHours}); + this.clinicName, + this.doctorTitle, + this.iD, + this.name, + this.projectID, + this.projectName, + this.actualDoctorRate, + this.clinicRoomNo, + this.date, + this.dayName, + this.doctorID, + this.doctorImageURL, + this.doctorProfile, + this.doctorProfileInfo, + this.doctorRate, + this.gender, + this.genderDescription, + this.isAppointmentAllowed, + this.isDoctorAllowVedioCall, + this.isDoctorDummy, + this.isLiveCare, + this.latitude, + this.longitude, + this.nationalityFlagURL, + this.nationalityID, + this.nationalityName, + this.nearestFreeSlot, + this.noOfPatientsRate, + this.originalClinicID, + this.personRate, + this.projectDistanceInKiloMeters, + this.qR, + this.qRString, + this.rateNumber, + this.serviceID, + this.setupID, + this.speciality, + this.workingHours}); DoctorList.fromJson(Map json) { clinicID = json['ClinicID']; @@ -118,7 +120,8 @@ class DoctorList { rateNumber = json['RateNumber']; serviceID = json['ServiceID']; setupID = json['SetupID']; - speciality = json['Speciality'].cast(); + if (json.containsKey('Speciality')) + speciality = json['Speciality'].cast(); workingHours = json['WorkingHours']; } @@ -166,3 +169,13 @@ class DoctorList { return data; } } + +class DoctorListAppointmentList { + String filterName = ""; + List patientDoctorAppointmentList = List(); + + DoctorListAppointmentList( + {this.filterName, DoctorList patientDoctorAppointment}) { + patientDoctorAppointmentList.add(patientDoctorAppointment); + } +} diff --git a/lib/pages/BookAppointment/widgets/DoctorView.dart b/lib/pages/BookAppointment/widgets/DoctorView.dart index 3d69a93d..4cdc3977 100644 --- a/lib/pages/BookAppointment/widgets/DoctorView.dart +++ b/lib/pages/BookAppointment/widgets/DoctorView.dart @@ -9,7 +9,7 @@ import 'package:smart_progress_bar/smart_progress_bar.dart'; import '../DoctorProfile.dart'; class DoctorView extends StatelessWidget { - DoctorList doctor; + final DoctorList doctor; DoctorView({@required this.doctor}); @@ -33,69 +33,77 @@ class DoctorView extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - ClipRRect( - borderRadius: BorderRadius.circular(100.0), - child: Image.network(this.doctor.doctorImageURL, - fit: BoxFit.fill, height: 60.0, width: 60.0), + Expanded( + flex: 1, + child: ClipRRect( + borderRadius: BorderRadius.circular(100.0), + child: Image.network(this.doctor.doctorImageURL, + fit: BoxFit.fill, height: 60.0, width: 60.0), + ), ), - Container( - width: MediaQuery.of(context).size.width * 0.6, - margin: EdgeInsets.fromLTRB(20.0, 10.0, 10.0, 0.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(this.doctor.doctorTitle + " " + this.doctor.name, - style: TextStyle( - fontSize: 14.0, - color: Colors.grey[700], - letterSpacing: 1.0)), - Container( - margin: EdgeInsets.only(top: 3.0), - child: Text(this.doctor.clinicName, - style: TextStyle( - fontSize: 12.0, - color: Colors.grey[600], - letterSpacing: 1.0)), - ), - Container( - margin: EdgeInsets.only(top: 3.0), - child: Text(this.doctor.projectName, - style: TextStyle( - fontSize: 12.0, - color: Colors.grey[600], - letterSpacing: 1.0)), - ), - Container( - margin: EdgeInsets.only(top: 3.0, bottom: 3.0), - child: Text( - getDoctorSpeciality(this.doctor.speciality).trim(), + Expanded( + flex: 4, + child: Container( + width: MediaQuery.of(context).size.width * 0.6, + margin: EdgeInsets.fromLTRB(20.0, 10.0, 10.0, 0.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if(doctor.doctorTitle!=null) + Text(this.doctor.doctorTitle + " " + this.doctor.name, style: TextStyle( - fontSize: 12.0, - color: Colors.grey[600], + fontSize: 14.0, + color: Colors.grey[700], letterSpacing: 1.0)), - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - RatingBar.readOnly( - initialRating: - this.doctor.actualDoctorRate.toDouble(), - size: 20.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - Container( - child: Image.network(this.doctor.nationalityFlagURL, - width: 25.0, height: 25.0), - ), - ], - ), - ], + Container( + margin: EdgeInsets.only(top: 3.0), + child: Text(this.doctor.clinicName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 3.0), + child: Text(this.doctor.projectName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + if(doctor.speciality!=null) + Container( + margin: EdgeInsets.only(top: 3.0, bottom: 3.0), + child: Text( + getDoctorSpeciality(this.doctor.speciality).trim(), + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar.readOnly( + initialRating: + this.doctor.actualDoctorRate.toDouble(), + size: 20.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + Container( + child: Image.network(this.doctor.nationalityFlagURL, + width: 25.0, height: 25.0), + ), + ], + ), + ], + ), ), ), ], diff --git a/lib/pages/MyAppointments/MyAppointments.dart b/lib/pages/MyAppointments/MyAppointments.dart index 63034373..af4c47c0 100644 --- a/lib/pages/MyAppointments/MyAppointments.dart +++ b/lib/pages/MyAppointments/MyAppointments.dart @@ -36,7 +36,7 @@ class _MyAppointmentsState extends State @override Widget build(BuildContext context) { return AppScaffold( - appBarTitle: "My Appointments", + appBarTitle: TranslationBase.of(context).myAppointments, isShowAppBar: true, body: Container( child: Column(children: [ @@ -158,7 +158,7 @@ class _MyAppointmentsState extends State "assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), - child: Text("No Booked Appointments", + child: Text(TranslationBase.of(context).noBookedAppointments, style: TextStyle( fontSize: 16.0, )), @@ -192,7 +192,7 @@ class _MyAppointmentsState extends State Image.asset("assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), - child: Text("No Confirmed Appointments", + child: Text(TranslationBase.of(context).noConfirmedAppointments , style: TextStyle( fontSize: 16.0, )), @@ -225,7 +225,7 @@ class _MyAppointmentsState extends State Image.asset("assets/images/new-design/noAppointmentIcon.png"), Container( margin: EdgeInsets.only(top: 10.0), - child: Text("No Arrived Appointments", + child: Text(TranslationBase.of(context).noArrivedAppointments, style: TextStyle( fontSize: 16.0, )), diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 06a2f9ca..5e5c5971 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -154,8 +154,8 @@ class _HomePageState extends State { ), Align( alignment: projectViewModel.isArabic - ? Alignment.bottomLeft - : Alignment.bottomRight, + ? Alignment.bottomRight + : Alignment.bottomLeft, child: InkWell( onTap: () { widget.goToMyProfile(); diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart index 4cce1dc8..075565e0 100644 --- a/lib/pages/medical/doctor/doctor_home_page.dart +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -1,5 +1,7 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; @@ -75,16 +77,40 @@ class DoctorHomePage extends StatelessWidget { children: model.patientDoctorAppointmentList[index] .patientDoctorAppointmentList .map((doctor) { - return InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: DoctorProfilePage( - patientDoctorAppointment: doctor, - ), - ), - ); + DoctorList doctorList = DoctorList( + projectID: doctor.projectID, + setupID: doctor.setupID, + clinicID: doctor.clinicID, + projectName: doctor.projectName, + clinicName: doctor.clinicName, + actualDoctorRate: doctor.actualDoctorRate, + doctorID: doctor.doctorID, + doctorRate: doctor.doctorRate, + gender: doctor.gender, + doctorTitle: doctor.doctorTitle, + name: doctor.doctorName, + doctorImageURL: doctor.doctorImageURL, + nationalityFlagURL:doctor.nationalityFlagURL + ); + return DoctorView(doctor: doctorList,);/* InkWell( + onTap: () async { + model + .getDoctorProfileAndRating( + doctorId: doctor.doctorID, + clinicID: doctor.clinicID, + projectID: doctor.projectID) + .then((value) { + var asd=""; + Navigator.push( + context, + FadePage( + page: DoctorView(doctor: model.doctorList,), + ), + ); + }).catchError((e){ + var asd=""; + + }); }, child: DoctorCard( name: doctor.doctorName, @@ -93,7 +119,7 @@ class DoctorHomePage extends StatelessWidget { subName: DateUtil.getMonthDayYearDateFormatted( doctor.appointmentDate), ), - ); + )*/; }).toList(), )), ) diff --git a/lib/pages/medical/doctor/doctor_profile_page.dart b/lib/pages/medical/doctor/doctor_profile_page.dart index 2b19ba3d..7588205c 100644 --- a/lib/pages/medical/doctor/doctor_profile_page.dart +++ b/lib/pages/medical/doctor/doctor_profile_page.dart @@ -1,5 +1,7 @@ import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_doctor_view_model.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/components/DocAvailableAppointments.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -35,149 +37,147 @@ class _DoctorProfilePageState extends State @override Widget build(BuildContext context) { return BaseView( - onModelReady: (model) => model.getDoctorProfileAndRating( - doctorId: widget.patientDoctorAppointment.doctorID, - clinicID: widget.patientDoctorAppointment.clinicID, - projectID: widget.patientDoctorAppointment.projectID), - builder: (context, model, widget) => AppScaffold( - isShowAppBar: true, - appBarTitle: 'Doctor Profile', - baseViewModel: model, - body: SingleChildScrollView( + /* onModelReady: (model) => model.getDoctorProfileAndRating( + doctorId: widget.patientDoctorAppointment.doctorID, + clinicID: widget.patientDoctorAppointment.clinicID, + projectID: widget.patientDoctorAppointment.projectID),*/ + builder: (context, model, widget) => DoctorView(doctor: model.doctorList,)/*AppScaffold( + isShowAppBar: true, + appBarTitle: 'Doctor Profile', + baseViewModel: model, + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - color: Colors.white, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + margin: EdgeInsets.only(top: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( - margin: EdgeInsets.only(top: 20.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - margin: EdgeInsets.all(5), - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.grey), - child: Icon( - Icons.calendar_view_day, - size: 25, - color: Colors.white, - )), - ClipRRect( - borderRadius: BorderRadius.circular(100.0), - child: Image.network( - patientDoctorAppointment.doctorImageURL, - fit: BoxFit.fill, - height: 120.0, - width: 120.0), - ), - Container( - margin: EdgeInsets.all(5), - width: 50, - height: 50, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.grey), - child: Icon( - Icons.format_list_bulleted, - size: 25, - color: Colors.white, - )), - ], - ), + margin: EdgeInsets.all(5), + width: 50, + height: 50, + decoration: BoxDecoration( + shape: BoxShape.circle, color: Colors.grey), + child: Icon( + Icons.calendar_view_day, + size: 25, + color: Colors.white, + )), + ClipRRect( + borderRadius: BorderRadius.circular(100.0), + child: Image.network( + patientDoctorAppointment.doctorImageURL, + fit: BoxFit.fill, + height: 120.0, + width: 120.0), ), Container( - margin: EdgeInsets.only(top: 10.0), - alignment: Alignment.center, - child: Text(patientDoctorAppointment.doctorName, - style: TextStyle( - fontSize: 20.0, - color: Colors.grey[900], - letterSpacing: 1.0)), - ), - Container( - margin: EdgeInsets.only(top: 10.0), - alignment: Alignment.center, - child: Text(patientDoctorAppointment.clinicName, - style: TextStyle( - fontSize: 12.0, - color: Colors.grey[900], - letterSpacing: 1.0)), - ), - Container( - margin: EdgeInsets.only(top: 5.0), - alignment: Alignment.center, - child: RatingBar.readOnly( - initialRating: - model.doctorRating.doctorRate?.toDouble() ?? - 0.0, - size: 35.0, - filledColor: Colors.yellow[700], - emptyColor: Colors.grey[500], - isHalfAllowed: true, - halfFilledIcon: Icons.star_half, - filledIcon: Icons.star, - emptyIcon: Icons.star, - ), - ), - Container( - margin: EdgeInsets.only(top: 5.0), - alignment: Alignment.center, - child: Text( - "(${model.doctorRating.patientNumber ?? 0} Reviews)", - style: TextStyle( - fontSize: 14.0, - color: Colors.blue[800], - letterSpacing: 1.0, - decoration: TextDecoration.underline, - )), - ), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Divider( - color: Colors.grey[500], - ), - ), - TabBar( - indicatorColor: Colors.red[800], - indicatorWeight: 3.0, - tabs: [ - Tab( - child: Text('Doctor Information', - style: TextStyle(color: Colors.black))), - Tab( - child: Text( - TranslationBase.of(context).availableAppo, - style: TextStyle(color: Colors.black)), - ) - ], - controller: _tabController, - ), - Container( - height: MediaQuery.of(context).size.height * 0.8, - child: TabBarView( - physics: BouncingScrollPhysics(), - children: [ - DoctorInformation( - doctorProfile: model.doctorProfile, - ), - Container() - ], - controller: _tabController, - ), + margin: EdgeInsets.all(5), + width: 50, + height: 50, + decoration: BoxDecoration( + shape: BoxShape.circle, color: Colors.grey), + child: Icon( + Icons.format_list_bulleted, + size: 25, + color: Colors.white, + )), + ], + ), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + alignment: Alignment.center, + child: Text(patientDoctorAppointment.doctorName, + style: TextStyle( + fontSize: 20.0, + color: Colors.grey[900], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + alignment: Alignment.center, + child: Text(patientDoctorAppointment.clinicName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[900], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: RatingBar.readOnly( + initialRating: + model.doctorRating.doctorRate?.toDouble() ?? 0.0, + size: 35.0, + filledColor: Colors.yellow[700], + emptyColor: Colors.grey[500], + isHalfAllowed: true, + halfFilledIcon: Icons.star_half, + filledIcon: Icons.star, + emptyIcon: Icons.star, + ), + ), + Container( + margin: EdgeInsets.only(top: 5.0), + alignment: Alignment.center, + child: Text( + "(${model.doctorRating.patientNumber ?? 0} Reviews)", + style: TextStyle( + fontSize: 14.0, + color: Colors.blue[800], + letterSpacing: 1.0, + decoration: TextDecoration.underline, + )), + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Divider( + color: Colors.grey[500], + ), + ), + TabBar( + indicatorColor: Colors.red[800], + indicatorWeight: 3.0, + tabs: [ + Tab( + child: Text('Doctor Information', + style: TextStyle(color: Colors.black))), + Tab( + child: Text(TranslationBase.of(context).availableAppo, + style: TextStyle(color: Colors.black)), + ) + ], + controller: _tabController, + ), + Container( + height: MediaQuery.of(context).size.height * 0.8, + child: TabBarView( + physics: BouncingScrollPhysics(), + children: [ + DoctorInformation( + doctorProfile: model.doctorProfile, ), + Container(), +// DocAvailableAppointments(doctor: model.doctorList,) ], + controller: _tabController, ), ), ], ), ), - )); + ], + ), + ), + )*/, + ); } } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 43056cfb..5b9f0fc7 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -450,6 +450,12 @@ class TranslationBase { String get logs => localizedValues['logs'][locale.languageCode]; String get textToSpeech => localizedValues['textToSpeech'][locale.languageCode]; + + String get myAppointments => localizedValues['MyAppointments'][locale.languageCode]; + String get noBookedAppointments => localizedValues['NoBookedAppointments'][locale.languageCode]; + String get noConfirmedAppointments => localizedValues['NoConfirmedAppointments'][locale.languageCode]; + String get noArrivedAppointments => localizedValues['noArrivedAppointments'][locale.languageCode]; + } class TranslationBaseDelegate extends LocalizationsDelegate { From 3a79ddb4885d4252e507b7030dd12fb69884dc68 Mon Sep 17 00:00:00 2001 From: hussam al-habibeh Date: Thu, 3 Sep 2020 11:24:33 +0300 Subject: [PATCH 2/6] vaccine service --- lib/config/config.dart | 4 +- lib/core/model/vaccine/my_vaccine.dart | 91 +++++ lib/core/service/vaccine_service.dart | 43 +++ lib/core/viewModels/vaccine_view_model.dart | 25 ++ lib/locator.dart | 5 +- lib/pages/medical/medical_profile_page.dart | 29 +- lib/pages/vaccine/my_vaccines_screen.dart | 361 ++++++++++++++++++++ pubspec.yaml | 8 + 8 files changed, 558 insertions(+), 8 deletions(-) create mode 100644 lib/core/model/vaccine/my_vaccine.dart create mode 100644 lib/core/service/vaccine_service.dart create mode 100644 lib/core/viewModels/vaccine_view_model.dart create mode 100644 lib/pages/vaccine/my_vaccines_screen.dart diff --git a/lib/config/config.dart b/lib/config/config.dart index a7cb621b..fd7de7bf 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -52,7 +52,7 @@ const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; const VERSION_ID = 5.5; const SETUP_ID = '91877'; -const LANGUAGE = 1; +const LANGUAGE = 2; const PATIENT_OUT_SA = 0; const SESSION_ID = 'TMRhVmkGhOsvamErw'; const IS_DENTAL_ALLOWED_BACKEND = false; @@ -67,6 +67,8 @@ const GET_PAtIENTS_INSURANCE = "/Patients.svc/REST/Get_PatientInsuranceDetails"; const GET_PAtIENTS_INSURANCE_UPDATED = "/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; const GET_PAtIENTS_INSURANCE_APPROVALS = "/Patients.svc/REST/GetApprovalStatus"; +const GET_VACCINES = "/Patients.svc/REST/GetDoneVaccinesByPatientID"; +const GET_VACCINES_EMAIL = "/Notifications.svc/REST/SendVaccinesEmail"; class AppGlobal { static var context; diff --git a/lib/core/model/vaccine/my_vaccine.dart b/lib/core/model/vaccine/my_vaccine.dart new file mode 100644 index 00000000..ac6e2e19 --- /dev/null +++ b/lib/core/model/vaccine/my_vaccine.dart @@ -0,0 +1,91 @@ +class VaccineModel { + String to; + String from; + double versionID; + int channel; + int languageID; + String iPAdress; + String generalid; + int patientOutSA; + String sessionID; + bool isDentalAllowedBackend; + int deviceTypeID; + int patientID; + String tokenID; + int patientTypeID; + int patientType; + String invoiceDate; + String doctorImageURL; + String doctorName; + String doctorTitle; + String projectName; + String vaccineName; + + VaccineModel({ + this.to, + this.from, + this.versionID, + this.channel, + this.languageID, + this.iPAdress, + this.generalid, + this.patientOutSA, + this.sessionID, + this.isDentalAllowedBackend, + this.deviceTypeID, + this.patientID, + this.tokenID, + this.patientTypeID, + this.patientType, + this.invoiceDate, + this.doctorImageURL, + this.doctorName, + this.doctorTitle, + this.projectName, + this.vaccineName, + }); + + VaccineModel.fromJson(Map json) { + vaccineName = json['VaccineName']; + projectName = json['ProjectName']; + doctorTitle = json['DoctorTitle']; + doctorName = json['DoctorName']; + doctorImageURL = json['DoctorImageURL']; + invoiceDate = json['InvoiceDate']; + to = json['To']; + from = json['From']; + versionID = json['VersionID']; + channel = json['Channel']; + languageID = json['LanguageID']; + iPAdress = json['IPAdress']; + generalid = json['generalid']; + patientOutSA = json['PatientOutSA']; + sessionID = json['SessionID']; + isDentalAllowedBackend = json['isDentalAllowedBackend']; + deviceTypeID = json['DeviceTypeID']; + patientID = json['PatientID']; + tokenID = json['TokenID']; + patientTypeID = json['PatientTypeID']; + patientType = json['PatientType']; + } + + Map toJson() { + final Map data = new Map(); + data['To'] = this.to; + data['From'] = this.from; + data['VersionID'] = this.versionID; + data['Channel'] = this.channel; + data['LanguageID'] = this.languageID; + data['IPAdress'] = this.iPAdress; + data['generalid'] = this.generalid; + data['PatientOutSA'] = this.patientOutSA; + data['SessionID'] = this.sessionID; + data['isDentalAllowedBackend'] = this.isDentalAllowedBackend; + data['DeviceTypeID'] = this.deviceTypeID; + data['PatientID'] = this.patientID; + data['TokenID'] = this.tokenID; + data['PatientTypeID'] = this.patientTypeID; + data['PatientType'] = this.patientType; + return data; + } +} diff --git a/lib/core/service/vaccine_service.dart b/lib/core/service/vaccine_service.dart new file mode 100644 index 00000000..189e26d8 --- /dev/null +++ b/lib/core/service/vaccine_service.dart @@ -0,0 +1,43 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/core/model/vaccine/my_vaccine.dart'; + +class VaccineService extends BaseService { + List _vaccineList = List(); + + List get vaccineList => _vaccineList; + + VaccineModel _vaccineModel = VaccineModel( + to: "0", + from: "0", + channel: 3, + deviceTypeID: 2, + generalid: "Cs2020@2016\$2958", + iPAdress: "10.20.10.20", + isDentalAllowedBackend: false, + languageID: 2, + patientID: 1231755, + patientOutSA: 0, + patientType: 1, + patientTypeID: 1, + sessionID: "uoKFXSLUwEaHYPwKZNA", + tokenID: "@dm!n", + versionID: 5.5, + ); + + Future getMyVaccine() async { + hasError = false; + _vaccineList.clear(); + await baseAppClient.post(GET_VACCINES, + onSuccess: (dynamic response, int statusCode) { + response['List_DoneVaccines'].forEach((item) { + _vaccineList.add(VaccineModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _vaccineModel.toJson()); + } + + Future sendEmail() async {} +} diff --git a/lib/core/viewModels/vaccine_view_model.dart b/lib/core/viewModels/vaccine_view_model.dart new file mode 100644 index 00000000..a3b6c057 --- /dev/null +++ b/lib/core/viewModels/vaccine_view_model.dart @@ -0,0 +1,25 @@ +import 'base_view_model.dart'; +import '../../locator.dart'; +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/vaccine/my_vaccine.dart'; +import 'package:diplomaticquarterapp/core/service/vaccine_service.dart'; + +class VaccineViewModel extends BaseViewModel { + bool hasError = false; + + VaccineService _vaccineService = locator(); + + List get vaccineList => _vaccineService.vaccineList; + + Future getVaccine() async { + hasError = false; + //_insuranceCardService.clearInsuranceCard(); + setState(ViewState.Busy); + await _vaccineService.getMyVaccine(); + if (_vaccineService.hasError) { + error = _vaccineService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/locator.dart b/lib/locator.dart index 5806ca70..c56abbd7 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -17,6 +17,8 @@ import 'core/viewModels/pharmacies_view_model.dart'; import 'core/service/pharmacies_service.dart'; import 'core/service/insurance_service.dart'; import 'core/viewModels/insurance_card_View_model.dart'; +import 'core/viewModels/vaccine_view_model.dart'; +import 'core/service/vaccine_service.dart'; GetIt locator = GetIt.instance; @@ -31,6 +33,7 @@ void setupLocator() { locator.registerLazySingleton(() => RadiologyService()); locator.registerLazySingleton(() => FeedbackService()); locator.registerLazySingleton(() => InsuranceCardService()); + locator.registerFactory(() => VaccineService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -40,6 +43,6 @@ void setupLocator() { locator.registerFactory(() => LabsViewModel()); locator.registerFactory(() => RadiologyViewModel()); locator.registerFactory(() => FeedbackViewModel()); - + locator.registerFactory(() => VaccineViewModel()); locator.registerFactory(() => InsuranceViewModel()); } diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 53c09727..f570750a 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -1,5 +1,5 @@ import 'dart:math'; - +import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_home_page.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; @@ -170,12 +170,11 @@ class _MedicalProfilePageState extends State { subTitle: 'Card', ), ), - ), Expanded( + ), + Expanded( flex: 1, child: InkWell( - onTap: () { - - }, + onTap: () {}, child: MedicalProfileItem( title: 'new', imagePath: 'insurance_card_icon.png', @@ -184,7 +183,25 @@ class _MedicalProfilePageState extends State { ), ) ], - ) + ), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.push( + context, FadePage(page: MyVaccines())); + }, + child: MedicalProfileItem( + title: 'Vaccines', + imagePath: 'insurance_card_icon.png', + subTitle: 'Card', + ), + ), + ), + ], + ), ], ), ), diff --git a/lib/pages/vaccine/my_vaccines_screen.dart b/lib/pages/vaccine/my_vaccines_screen.dart new file mode 100644 index 00000000..cfb0415f --- /dev/null +++ b/lib/pages/vaccine/my_vaccines_screen.dart @@ -0,0 +1,361 @@ +import 'dart:typed_data'; +import 'dart:convert'; +import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; +import 'package:flutter/material.dart'; +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:flutter/cupertino.dart'; +import '../base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/core/viewModels/vaccine_view_model.dart'; +import 'package:diplomaticquarterapp/widgets/others/rounded_container.dart'; +import 'package:flutter_email_sender/flutter_email_sender.dart'; +import 'package:popup_box/popup_box.dart'; + +class MyVaccines extends StatefulWidget { + @override + _MyVaccinesState createState() => _MyVaccinesState(); +} + +class _MyVaccinesState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getVaccine(), + builder: (BuildContext context, VaccineViewModel model, Widget child) => + AppScaffold( + isShowAppBar: true, + appBarTitle: 'My Vaccines', + baseViewModel: model, + body: Container( + margin: EdgeInsets.only( + left: SizeConfig.screenWidth * 0.004, + right: SizeConfig.screenWidth * 0.004, + top: SizeConfig.screenWidth * 0.04, + ), + child: Column( + children: [ + RoundedContainer( + backgroundColor: Colors.white, + child: ExpansionTile( + title: Container( + height: 65.0, + child: Text('2018'), + ), + children: [ + Container( + child: ListView.builder( + scrollDirection: Axis.vertical, + shrinkWrap: true, + itemCount: model.vaccineList == null + ? 0 + : model.vaccineList.length, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + RoundedContainer( + child: Column( + children: [ + Row( + children: [ + Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: 20.0, + vertical: 20.0), + child: Image.network( + model.vaccineList[index] + .doctorImageURL, + height: SizeConfig + .imageSizeMultiplier * + 23, + width: SizeConfig + .imageSizeMultiplier * + 20, + fit: BoxFit.fill, + ), + ), + ], + ), + Container( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + model.vaccineList[index] + .doctorTitle + + model.vaccineList[index] + .doctorName, + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 16.6, + ), + ), + SpaceBetweenTexts(space: 7.0), + Text( + model.vaccineList[index] + .projectName, + style: TextStyle( + fontSize: 17.0, + letterSpacing: 0.5, + ), + ), + SpaceBetweenTexts(space: 7.0), + Text( + model.vaccineList[index] + .vaccineName, + style: TextStyle( + fontSize: 17.0, + ), + ), + SpaceBetweenTexts(space: 7.0), + Text( + 'Date Taken ' + + convertDateFormat(model + .vaccineList[index] + .invoiceDate), + style: + TextStyle(fontSize: 17.0), + ), + ], + ), + ), + ], + ), + ], + ), + ), + ], + ); + }), + ) + ], + ), + ), + SpaceBetweenTexts(space: 165.0), + Flexible( + child: Container( + width: 350.0, + height: 80.0, + child: Button( + label: 'CHECK VACCINE AVAILABILITY', + backgroundColor: Color(0xff9EA3A4), + ), + ), + ), + Flexible( + child: Container( + width: 350.0, + height: 80.0, + child: Button( + label: 'SEND EMAIL', + backgroundColor: Color(0xffF62426), + onTap: () async { + await PopupBox.showPopupBox( + context: context, + button: MaterialButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + color: Colors.white, + child: Text( + 'CANCEL', + style: TextStyle(fontSize: 16.5), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + willDisplayWidget: Column( + children: [ + Text( + 'Conform \nSend a copy of this report to the email' + + model.vaccineList[0].doctorName, + style: TextStyle( + fontSize: 20, + color: Colors.black26, + fontWeight: FontWeight.w900), + ), + SizedBox( + height: 30.0, + ), + ], + )); + }, + ), + ), + ), + ], + ), + +// child: ListView.builder( +// itemCount: model.vaccineList == null ? 0 : model.vaccineList.length, +// itemBuilder: (BuildContext context, int index) { +// return Column( +// children: [ +// RoundedContainer( +// backgroundColor: Colors.white, +// child: Column( +// children: [ +// ExpansionTile( +// title: Container( +// height: 60.0, +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Texts('2018'), +// ], +// ), +// ), +// children: [ +// Column( +// children: [ +// Row( +// children: [ +// Column( +// children: [ +// Padding( +// padding: EdgeInsets.symmetric( +// horizontal: 20.0, vertical: 20.0), +// child: Container( +// child: Image.network( +// model.vaccineList[index] +// .doctorImageURL, +// height: SizeConfig +// .imageSizeMultiplier * +// 23, +// width: SizeConfig +// .imageSizeMultiplier * +// 20, +// fit: BoxFit.fill, +// colorBlendMode: +// BlendMode.hardLight, +// ), +// ), +// ) +// ], +// ), +// Container( +// child: Column( +// mainAxisAlignment: +// MainAxisAlignment.start, +// crossAxisAlignment: +// CrossAxisAlignment.start, +// children: [ +// Text( +// model.vaccineList[index] +// .doctorTitle + +// model.vaccineList[index] +// .doctorName, +// style: TextStyle( +// fontWeight: FontWeight.w900, +// fontSize: 17.5), +// ), +// Text( +// model +// .vaccineList[index].projectName, +// style: TextStyle( +// fontSize: 19.0, +// letterSpacing: 0.3, +// color: Colors.grey, +// fontWeight: FontWeight.bold), +// ), +// Text( +// model +// .vaccineList[index].vaccineName, +// style: TextStyle( +// fontSize: 19.0, +// color: Colors.grey, +// fontWeight: FontWeight.bold), +// ), +// Text( +// 'Date Taken ' + +// convertDateFormat(model +// .vaccineList[index] +// .invoiceDate), +// style: TextStyle( +// fontSize: 19.0, +// color: Colors.grey, +// fontWeight: FontWeight.bold), +// ), +// ], +// ), +// ), +// ], +// ), +// ], +// ), +// ], +// ), +// ], +// ), +// ), +// Container( +// width: 300, +// child: Button( +// label: 'CHECK VACCINE AVAILABILITY', +// backgroundColor: Color(0xff9EA3A4), +// ), +// ), +// Container( +// width: 300, +// child: Button( +// label: 'SEND EMAIL', +// backgroundColor: Color(0xff9EA3A4), +// ), +// ), +// ], +// ); +// }, +// ), + ), + ), + ); + } + + convertDateFormat(String Date) { + const start = "/Date("; + const end = "+0300)"; + + final startIndex = Date.indexOf(start); + final endIndex = Date.indexOf(end, startIndex + start.length); + + var date = new DateTime.fromMillisecondsSinceEpoch( + int.parse(Date.substring(startIndex + start.length, endIndex))); + String newDate = date.year.toString() + + "-" + + date.month.toString().padLeft(2, '0') + + "-" + + date.day.toString().padLeft(2, '0'); + + return newDate.toString(); + } + + emailSender() async { + final Email email = Email( + body: 'Email body', + subject: 'Email subject', + recipients: ['example@example.com'], + cc: ['cc@example.com'], + bcc: ['bcc@example.com'], + attachmentPaths: ['/path/to/attachment.zip'], + isHTML: false, + ); + + await FlutterEmailSender.send(email); + } +} + +class SpaceBetweenTexts extends StatelessWidget { + final double space; + SpaceBetweenTexts({this.space}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: space, + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index e2735c4f..c6bf3b03 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -83,6 +83,14 @@ dependencies: #hijri hijri: ^2.0.3 + #Email Sender + flutter_email_sender: ^3.0.1 + + #Popup_window + popup_box: ^0.1.0 + + + From 1b3a780a29bb0ec5396ecae55e5093ed6792180e Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 3 Sep 2020 11:27:15 +0300 Subject: [PATCH 3/6] add ar lan for medical profile --- ios/Runner.xcodeproj/project.pbxproj | 3 - lib/config/localized_values.dart | 100 ++++++-- lib/core/service/client/base_app_client.dart | 2 +- lib/core/viewModels/project_view_model.dart | 4 +- lib/pages/landing/home_page.dart | 14 +- lib/pages/landing/landing_page.dart | 2 +- .../medical/doctor/doctor_home_page.dart | 38 +-- lib/pages/medical/labs/labs_home_page.dart | 9 +- lib/pages/medical/medical_profile_page.dart | 227 +++++++++++------- .../prescriptions_history_page.dart | 5 +- .../prescriptions_home_page.dart | 7 +- .../prescriptions/prescriptions_page.dart | 5 +- .../radiology/radiology_home_page.dart | 9 +- .../vital_sign/vital_sign_details_screen.dart | 20 +- lib/uitl/translations_delegate_base.dart | 53 ++++ 15 files changed, 340 insertions(+), 158 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index c1c5e34c..5ba52820 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -356,7 +356,6 @@ /* Begin XCBuildConfiguration section */ 249021D3217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -433,7 +432,6 @@ }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -489,7 +487,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 3291870d..903943ef 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -343,7 +343,10 @@ const Map> localizedValues = { "en": "Online Payment Service", 'ar': 'خدمة الدفع عبر الإلكتدوني' }, - "OffersAndPackages": {"en": "Online transfer request", 'ar': 'طلب التحويل الالكتروني'}, + "OffersAndPackages": { + "en": "Online transfer request", + 'ar': 'طلب التحويل الالكتروني' + }, "ComprehensiveMedicalCheckup": { "en": "Comprehensive Medical Check up", 'ar': 'فحص طبي شامل' @@ -362,20 +365,87 @@ const Map> localizedValues = { "medicalProfile": {"en": "Medical Profile", 'ar': 'الملف الطبي'}, "consultation": {"en": "Consultation", "ar": "استشارة"}, "logs": {"en": "Logs", "ar": "السجلات"}, - "parking":{"en":"Parking","ar":"مواقف"}, - "alhabiServices":{"en":"HMG Service","ar":"خدمات الحبيب"}, - "parkingTitle":{"en":"Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.","ar":" خدمة المواقف، تتيح هذه الخدمة للمستخدم معلومات عن موقف السيارة ليسهل عليه العودة لها لاحقاً ، 1- بالضغط على زر(قراءة الكود) تستطيع حفظ البيانات الخاصة بالموقف. 2-بالضغط على زر(عرض موقف سيارتي) يعرض لك موقع السيارة في خرائط قوقل. 3- لإعادة قراءة موقف آخرعن طريق الضغط على زر(مسح بيانات الموقف). "}, - "readBarcode":{"en":"Read Barcode","ar":"قراءة الكود"}, - "showMyPark":{"en":"Show My Park","ar":"عرض بارك"}, - "clearMyData":{"en":"clear My Data","ar":"امسح البيانات"}, - "floor":{"en":"Floor:","ar":"الطابق"}, - "gate":{"en":"Gate:","ar":"بوابة"}, - "building":{"en":"Building:","ar":"المبنى"}, - "branch":{"en":"Branch:","ar":"الفرع"}, - "emergencyServices":{"en":"Emergency Services:","ar":"خدمات الطوارئ"}, + "parking": {"en": "Parking", "ar": "مواقف"}, + "alhabiServices": {"en": "HMG Service", "ar": "خدمات الحبيب"}, + "parkingTitle": { + "en": + "Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.", + "ar": + " خدمة المواقف، تتيح هذه الخدمة للمستخدم معلومات عن موقف السيارة ليسهل عليه العودة لها لاحقاً ، 1- بالضغط على زر(قراءة الكود) تستطيع حفظ البيانات الخاصة بالموقف. 2-بالضغط على زر(عرض موقف سيارتي) يعرض لك موقع السيارة في خرائط قوقل. 3- لإعادة قراءة موقف آخرعن طريق الضغط على زر(مسح بيانات الموقف). " + }, + "readBarcode": {"en": "Read Barcode", "ar": "قراءة الكود"}, + "showMyPark": {"en": "Show My Park", "ar": "عرض بارك"}, + "clearMyData": {"en": "clear My Data", "ar": "امسح البيانات"}, + "floor": {"en": "Floor:", "ar": "الطابق"}, + "gate": {"en": "Gate:", "ar": "بوابة"}, + "building": {"en": "Building:", "ar": "المبنى"}, + "branch": {"en": "Branch:", "ar": "الفرع"}, + "emergencyServices": {"en": "Emergency Services:", "ar": "خدمات الطوارئ"}, "textToSpeech": {"en": "How May I Help You?", "ar": "كيف يمكنني مساعدتك؟"}, "MyAppointments": {"en": "My Appointments", "ar": "مواعيدي"}, - "NoBookedAppointments": {"en": "No Booked Appointments", "ar": "لا توجد مواعيد محجوزة"}, - "NoConfirmedAppointments": {"en": "No Confirmed Appointments", "ar": "لا توجد مواعيد مؤكدة"}, - "noArrivedAppointments": {"en": "No Arrived Appointments", "ar": "لم تصل المواعيد"}, + "NoBookedAppointments": { + "en": "No Booked Appointments", + "ar": "لا توجد مواعيد محجوزة" + }, + "NoConfirmedAppointments": { + "en": "No Confirmed Appointments", + "ar": "لا توجد مواعيد مؤكدة" + }, + "noArrivedAppointments": { + "en": "No Arrived Appointments", + "ar": "لم تصل المواعيد" + }, + "MyAppointmentsList": {"en": "List", "ar": "قائمة بمواعدي"}, + "Radiology": {"en": "Radiology", "ar": "الأشعة"}, + "RadiologySubtitle": {"en": "Result", "ar": "صور وتقارير"}, + "Lab": {"en": "Lab", "ar": "تحليل المختبر"}, + "LabSubtitle": {"en": "Result", "ar": "نتائج"}, + "Medicines": {"en": "Medicines", "ar": "الوصفات"}, + "MedicinesSubtitle": {"en": "Prescriptions", "ar": "الوصفات الطبية"}, + "VitalSigns": {"en": "Vital Signs", "ar": "المؤشرات الحيوية"}, + "VitalSignsSubTitle": {"en": "Reports", "ar": "قراءات"}, + "MyMedical": {"en": "Active", "ar": "قراءات"}, + "MyMedicalSubtitle": {"en": "Medications", "ar": "النشطة"}, + "MyDoctor": {"en": "My Doctor", "ar": "اطبائي"}, + "MyDoctorSubtitle": {"en": "List", "ar": "قمت بزيارتهم"}, + "Eye": {"en": "Eye", "ar": "قياسات"}, + "EyeSubtitle": {"en": "Measurement", "ar": "النظر"}, + "Insurance": {"en": "Insurance", "ar": "بطاقة"}, + "InsuranceSubtitle": {"en": "Card", "ar": "التأمين"}, + "UpdateInsurance": {"en": "Update Insurance", "ar": "تحديث التأمين"}, + "UpdateInsuranceSubtitle": {"en": "Card", "ar": "التأمين"}, + "InsuranceApproval": {"en": "Insurance Approval", "ar": "موافقات"}, + "InsuranceApprovalSubtitle": {"en": "Approvals", "ar": "موافقات التأمين"}, + "Allergies": {"en": "Approvals", "ar": "الحساسية"}, + "AllergiesSubtitle": {"en": "Diagnosed", "ar": "مسجلة"}, + "MyVaccines": {"en": "My Vaccines", "ar": "تطعيماتي"}, + "MyVaccinesSubtitle": {"en": "List", "ar": "قائمة"}, + "Medical": {"en": "Medical", "ar": "التقارير"}, + "MedicalSubtitle": {"Report": "List", "ar": "الطبية"}, + "Monthly": {"en": "Monthly", "ar": "تقارير"}, + "MonthlySubtitle": {"en": "Report", "ar": "الشهرية"}, + "Sick": {"en": "Sick", "ar": "الإجازات"}, + "SickSubtitle": {"en": "Leaves", "ar": "المرضية"}, + "MyBalance": {"en": "My Balance", "ar": "ارصدتي"}, + "MyBalanceSubtitle": {"en": "Credit", "ar": "المبالغ"}, + "PatientCall": {"en": "Patient Call", "ar": "النداء للموعد"}, + "PatientCallSubtitle": {"en": "Service", "ar": "خدمة"}, + "SmartWatches": {"en": "Smart Watches", "ar": "الساعة الذكية"}, + "SmartWatchesSubtitle": {"en": "Pairing", "ar": "ربط البيانات"}, + "MyTrackers": {"en": "My Trackers", "ar": "تتبع قراءاتي"}, + "MyTrackersSubtitle": {"en": "Service", "ar": "الطبية"}, + "AskYour": {"en": "Ask Your", "ar": "إرسل طبيبك"}, + "AskYourSubtitle": {"en": "Doctor", "ar": "خدمة"}, + "Internet": {"en": "Internet", "ar": "الاتصال"}, + "InternetSubtitle": {"en": "Pairing", "ar": "بالإنترنت"}, + "Chatbot": {"en": "Chatbot", "ar": "تاشت بوت"}, + "ChatbotSubtitle": {"en": "", "ar": ""}, + "TimeLine": {"en": "Time Line", "ar": "الجدول الزمني"}, + "LabOrders": {"en": "Lab Orders", "ar": "تحاليل المختبر"}, + "BillNo": {"en": "Bill No :", "ar": "رقم الفاتورة"}, + "Prescriptions": {"en": "Prescriptions", "ar": "الوصفات الطبية"}, + "History": {"en": "History", "ar": "السجل"}, + "OrderNo": {"en": "Order No", "ar": "رقم الطلب"}, + "OrderDetails": {"en": "Order Details", "ar": "تفاصيل الطلب"}, + "VitalSign": {"en": "Vital Sign", "ar": "العلامة حيوية"}, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index aa48c49d..efb168c8 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -31,7 +31,7 @@ class BaseAppClient { //Map profile = await sharedPref.getObj(DOCTOR_PROFILE); String token = await sharedPref.getString(TOKEN); var languageID = - await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); var user = await sharedPref.getObject(USER_PROFILE); body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] != null ? body['SetupID'] : SETUP_ID diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index 5975daf2..40cdd432 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -9,7 +9,7 @@ import 'package:flutter/cupertino.dart'; class ProjectViewModel extends BaseViewModel { AppSharedPreferences sharedPref = AppSharedPreferences(); Locale _appLocale; - String currentLanguage = 'en'; + String currentLanguage = 'ar'; bool _isArabic = false; bool isInternetConnection = true; bool isLoading = false; @@ -45,7 +45,7 @@ class ProjectViewModel extends BaseViewModel { void loadSharedPrefLanguage() async { currentLanguage = await sharedPref.getString(APP_LANGUAGE); - _appLocale = Locale(currentLanguage ?? 'en'); + _appLocale = Locale(currentLanguage ?? 'ar'); _isArabic = currentLanguage != null ? currentLanguage == 'ar' ? true : false : true; diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 5e5c5971..d0c8d382 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -368,13 +368,13 @@ class _HomePageState extends State { textAlign: TextAlign.center, color: Colors.white, bold: true, - fontSize: SizeConfig.textMultiplier * 2.0, + fontSize: SizeConfig.textMultiplier * 1.7, ) ], ), ), ), - height: MediaQuery.of(context).size.width*0.4, + height: MediaQuery.of(context).size.width * 0.4, imageName: 'home_healthcare_service_bg.png', opacity: 0.5, ), @@ -403,7 +403,7 @@ class _HomePageState extends State { ), ), ), - height: MediaQuery.of(context).size.width*0.4, + height: MediaQuery.of(context).size.width * 0.4, imageName: 'al-habib_onlne_pharmacy_bg.png', ), DashboardItem( @@ -431,7 +431,7 @@ class _HomePageState extends State { ), ), ), - height: MediaQuery.of(context).size.width*0.4, + height: MediaQuery.of(context).size.width * 0.4, color: Hexcolor("#747C80"), imageName: 'emergency_service_image.png', ), @@ -472,7 +472,7 @@ class _HomePageState extends State { ), ), ), - height: MediaQuery.of(context).size.width*0.4, + height: MediaQuery.of(context).size.width * 0.4, decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.0), color: Colors.white, @@ -505,7 +505,7 @@ class _HomePageState extends State { ), ), width: MediaQuery.of(context).size.width * 0.29, - height: MediaQuery.of(context).size.width*0.4, + height: MediaQuery.of(context).size.width * 0.4, decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.0), color: Colors.white, @@ -536,7 +536,7 @@ class _HomePageState extends State { ), ), ), - height: MediaQuery.of(context).size.width*0.4, + height: MediaQuery.of(context).size.width * 0.4, decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.0), color: Colors.white, diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 0e25c819..46e5e2fb 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -253,7 +253,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { case 0: return TranslationBase.of(context).home; case 1: - return 'Medical Profile'; + return TranslationBase.of(context).medicalProfile; case 2: return TranslationBase.of(context).mySchedule; case 3: diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart index 075565e0..456b0bcb 100644 --- a/lib/pages/medical/doctor/doctor_home_page.dart +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/DoctorView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -36,7 +37,7 @@ class DoctorHomePage extends StatelessWidget { child: InkWell( onTap: () => model.setFilterType(FilterType.Clinic), child: ListTile( - title: const Text('Clinic'), + title: Text(TranslationBase.of(context).clinic), leading: Radio( value: FilterType.Clinic, groupValue: model.filterType, @@ -53,7 +54,7 @@ class DoctorHomePage extends StatelessWidget { child: InkWell( onTap: () => model.setFilterType(FilterType.Hospital), child: ListTile( - title: const Text('Hospital'), + title: Text(TranslationBase.of(context).hospital), leading: Radio( value: FilterType.Hospital, groupValue: model.filterType, @@ -78,21 +79,23 @@ class DoctorHomePage extends StatelessWidget { .patientDoctorAppointmentList .map((doctor) { DoctorList doctorList = DoctorList( - projectID: doctor.projectID, - setupID: doctor.setupID, - clinicID: doctor.clinicID, - projectName: doctor.projectName, - clinicName: doctor.clinicName, - actualDoctorRate: doctor.actualDoctorRate, - doctorID: doctor.doctorID, - doctorRate: doctor.doctorRate, - gender: doctor.gender, - doctorTitle: doctor.doctorTitle, - name: doctor.doctorName, - doctorImageURL: doctor.doctorImageURL, - nationalityFlagURL:doctor.nationalityFlagURL + projectID: doctor.projectID, + setupID: doctor.setupID, + clinicID: doctor.clinicID, + projectName: doctor.projectName, + clinicName: doctor.clinicName, + actualDoctorRate: doctor.actualDoctorRate, + doctorID: doctor.doctorID, + doctorRate: doctor.doctorRate, + gender: doctor.gender, + doctorTitle: doctor.doctorTitle, + name: doctor.doctorName, + doctorImageURL: doctor.doctorImageURL, + nationalityFlagURL: doctor.nationalityFlagURL); + return DoctorView( + doctor: doctorList, ); - return DoctorView(doctor: doctorList,);/* InkWell( + /* InkWell( onTap: () async { model .getDoctorProfileAndRating( @@ -119,7 +122,8 @@ class DoctorHomePage extends StatelessWidget { subName: DateUtil.getMonthDayYearDateFormatted( doctor.appointmentDate), ), - )*/; + )*/ + ; }).toList(), )), ) diff --git a/lib/pages/medical/labs/labs_home_page.dart b/lib/pages/medical/labs/labs_home_page.dart index 00cd82a1..325d5dcd 100644 --- a/lib/pages/medical/labs/labs_home_page.dart +++ b/lib/pages/medical/labs/labs_home_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/labs_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -19,7 +20,7 @@ class LabsHomePage extends StatelessWidget { builder: (context, LabsViewModel model, widget) => AppScaffold( baseViewModel: model, isShowAppBar: true, - appBarTitle: 'Lab Orders', + appBarTitle: TranslationBase.of(context).labOrders, body: SingleChildScrollView( physics: BouncingScrollPhysics(), child: FractionallySizedBox( @@ -34,7 +35,7 @@ class LabsHomePage extends StatelessWidget { child: InkWell( onTap: () => model.setFilterType(FilterType.Clinic), child: ListTile( - title: const Text('Clinic'), + title: Text(TranslationBase.of(context).clinic), leading: Radio( value: FilterType.Clinic, groupValue: model.filterType, @@ -51,7 +52,7 @@ class LabsHomePage extends StatelessWidget { child: InkWell( onTap: () => model.setFilterType(FilterType.Hospital), child: ListTile( - title: const Text('Hospital'), + title: Text(TranslationBase.of(context).hospital), leading: Radio( value: FilterType.Hospital, groupValue: model.filterType, @@ -85,7 +86,7 @@ class LabsHomePage extends StatelessWidget { ), name: labOrder.doctorName, profileUrl: labOrder.doctorImageURL, - subName: 'Bill No : ${labOrder.invoiceNo}', + subName: TranslationBase.of(context).billNo+' ${labOrder.invoiceNo}', date: DateUtil.getMonthDayYearDateFormatted( labOrder.orderDate), ); diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 87486ce5..d0998ec5 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -2,12 +2,14 @@ import 'dart:math'; import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/medical_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/MyAppointments.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/time_line_widget.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -17,6 +19,7 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; +import 'package:provider/provider.dart'; import '../../locator.dart'; import 'doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; @@ -31,6 +34,7 @@ class MedicalProfilePage extends StatefulWidget { class _MedicalProfilePageState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getAppointmentHistory(), builder: (_, model, widget) => AppScaffold( @@ -48,11 +52,9 @@ class _MedicalProfilePageState extends State { height: 210, decoration: BoxDecoration( image: DecorationImage( - image: ExactAssetImage( - 'assets/images/timeline_bg.png'), - fit: BoxFit.cover - ), - + image: ExactAssetImage( + 'assets/images/timeline_bg.png'), + fit: BoxFit.cover), ), child: Stack( children: [ @@ -76,7 +78,7 @@ class _MedicalProfilePageState extends State { ), ), Padding( - padding: EdgeInsets.symmetric(vertical: 12.0), + padding: EdgeInsets.symmetric(vertical: 5.0), child: Column( children: [ Container( @@ -89,13 +91,19 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.push(context, - FadePage(page: MyAppointments())); + Navigator.push( + context, + FadePage( + page: MyAppointments(), + ), + ); }, child: MedicalProfileItem( - title: 'My Appointments', + title: TranslationBase.of(context) + .myAppointments, imagePath: 'my_appointment_icon.png', - subTitle: 'List', + subTitle: TranslationBase.of(context) + .myAppointmentsList, ), ), ), @@ -103,11 +111,12 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () => Navigator.push(context, - FadePage(page: RadiologyHomePage())), + FadePage(page: LabsHomePage())), child: MedicalProfileItem( - title: 'Radiology', - imagePath: 'radiology_icon.png', - subTitle: 'Service', + title: TranslationBase.of(context).lab, + imagePath: 'lab_result_icon.png', + subTitle: + TranslationBase.of(context).lab, ), ), ), @@ -115,11 +124,13 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () => Navigator.push(context, - FadePage(page: LabsHomePage())), + FadePage(page: RadiologyHomePage())), child: MedicalProfileItem( - title: 'Lab', - imagePath: 'lab_result_icon.png', - subTitle: 'Result', + title: TranslationBase.of(context) + .radiology, + imagePath: 'radiology_icon.png', + subTitle: TranslationBase.of(context) + .radiologySubtitle, ), ), ), @@ -132,14 +143,18 @@ class _MedicalProfilePageState extends State { child: InkWell( onTap: () { Navigator.push( - context, - FadePage( - page: HomePrescriptionsPage())); + context, + FadePage( + page: HomePrescriptionsPage(), + ), + ); }, child: MedicalProfileItem( - title: 'Medicines', + title: TranslationBase.of(context) + .medicines, imagePath: 'prescription_icon.png', - subTitle: 'Prescriptions', + subTitle: TranslationBase.of(context) + .medicinesSubtitle, ), ), ), @@ -147,13 +162,17 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () => Navigator.push( - context, - FadePage( - page: VitalSignDetailsScreen())), + context, + FadePage( + page: VitalSignDetailsScreen(), + ), + ), child: MedicalProfileItem( - title: 'Vital Signs', + title: TranslationBase.of(context) + .vitalSigns, imagePath: 'medical_history_icon.png', - subTitle: 'Reports', + subTitle: TranslationBase.of(context) + .vitalSignsSubtitle, ), ), ), @@ -163,9 +182,11 @@ class _MedicalProfilePageState extends State { // onTap: () => Navigator.push( // context, FadePage(page: RadiologyHomePage())), child: MedicalProfileItem( - title: 'My Medicines ', + title: TranslationBase.of(context) + .myMedical, imagePath: 'radiology_icon.png', - subTitle: 'Service', + subTitle: TranslationBase.of(context) + .myMedicalSubtitle, ), ), ), @@ -177,13 +198,19 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.push(context, - FadePage(page: DoctorHomePage())); + Navigator.push( + context, + FadePage( + page: DoctorHomePage(), + ), + ); }, child: MedicalProfileItem( - title: 'My Doctor', + title: TranslationBase.of(context) + .myDoctor, imagePath: 'doctor_icon.png', - subTitle: 'List', + subTitle: TranslationBase.of(context) + .myDoctorSubtitle, ), ), ), @@ -196,10 +223,11 @@ class _MedicalProfilePageState extends State { // FadePage(page: InsuranceApproval())); // }, child: MedicalProfileItem( - title: 'Eye', + title: TranslationBase.of(context).eye, imagePath: 'insurance_approvals_icon.png', - subTitle: 'Measurement', + subTitle: TranslationBase.of(context) + .eyeSubtitle, ), ), ), @@ -211,9 +239,11 @@ class _MedicalProfilePageState extends State { FadePage(page: InsuranceCard())); }, child: MedicalProfileItem( - title: 'Insurance', + title: TranslationBase.of(context) + .insurance, imagePath: 'insurance_card_icon.png', - subTitle: 'Card', + subTitle: TranslationBase.of(context) + .insuranceSubtitle, ), ), ), @@ -229,32 +259,38 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: DoctorHomePage())); // }, child: MedicalProfileItem( - title: 'Update Insurance', + title: TranslationBase.of(context) + .updateInsurance, imagePath: 'insurance_card_icon.png', - subTitle: 'card', + subTitle: TranslationBase.of(context) + .updateInsuranceSubtitle, ), ), ), Expanded( flex: 1, child: InkWell( -// onTap: () { -// Navigator.push( -// context, FadePage(page: InsuranceApproval())); -// }, + onTap: () { + Navigator.push( + context, FadePage(page: InsuranceApproval())); + }, child: MedicalProfileItem( - title: 'Insurance Approval', + title: TranslationBase.of(context) + .insuranceApproval, imagePath: 'insurance_approvals_icon.png', - subTitle: '', + subTitle: TranslationBase.of(context) + .insuranceApprovalSubtitle, ), ), ), Expanded( flex: 1, child: MedicalProfileItem( - title: 'Allergies', + title: + TranslationBase.of(context).allergies, imagePath: 'medical_history_icon.png', - subTitle: 'Diagnosed', + subTitle: TranslationBase.of(context) + .allergiesSubtitle, ), ), ]), @@ -268,9 +304,11 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: DoctorHomePage())); // }, child: MedicalProfileItem( - title: 'My Vaccines', + title: TranslationBase.of(context) + .myVaccines, imagePath: 'insurance_card_icon.png', - subTitle: 'card', + subTitle: TranslationBase.of(context) + .myVaccinesSubtitle, ), ), ), @@ -282,18 +320,21 @@ class _MedicalProfilePageState extends State { FadePage(page: HomeReportPage())); }, child: MedicalProfileItem( - title: 'Medical', + title: + TranslationBase.of(context).medical, imagePath: 'insurance_approvals_icon.png', - subTitle: 'Reports', + subTitle: TranslationBase.of(context) + .medicalSubtitle, ), ), ), Expanded( flex: 1, child: MedicalProfileItem( - title: 'Monthly', + title: TranslationBase.of(context).monthly, imagePath: 'medical_history_icon.png', - subTitle: 'Report', + subTitle: TranslationBase.of(context) + .monthlySubtitle, ), ), ]), @@ -307,9 +348,10 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: DoctorHomePage())); // }, child: MedicalProfileItem( - title: 'Sick', + title: TranslationBase.of(context).sick, imagePath: 'insurance_card_icon.png', - subTitle: 'Leaves', + subTitle: TranslationBase.of(context) + .sickSubtitle, ), ), ), @@ -321,18 +363,22 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: InsuranceApproval())); // }, child: MedicalProfileItem( - title: 'My Balance', + title: + TranslationBase.of(context).myBalance, imagePath: 'insurance_approvals_icon.png', - subTitle: 'Credit', + subTitle: TranslationBase.of(context) + .myBalanceSubtitle, ), ), ), Expanded( flex: 1, child: MedicalProfileItem( - title: 'Patient Call', + title: + TranslationBase.of(context).patientCall, imagePath: 'medical_history_icon.png', - subTitle: 'Service', + subTitle: TranslationBase.of(context) + .patientCallSubtitle, ), ), ]), @@ -346,9 +392,11 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: DoctorHomePage())); // }, child: MedicalProfileItem( - title: 'Smart Watches', + title: TranslationBase.of(context) + .smartWatches, imagePath: 'insurance_card_icon.png', - subTitle: 'Pairing', + subTitle: TranslationBase.of(context) + .smartWatchesSubtitle, ), ), ), @@ -360,18 +408,21 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: InsuranceApproval())); // }, child: MedicalProfileItem( - title: 'My Trackers', + title: TranslationBase.of(context) + .myTrackers, imagePath: 'insurance_approvals_icon.png', - subTitle: 'Service', + subTitle: TranslationBase.of(context) + .myTrackersSubtitle, ), ), ), Expanded( flex: 1, child: MedicalProfileItem( - title: 'Ask Your', + title: TranslationBase.of(context).askYour, imagePath: 'medical_history_icon.png', - subTitle: 'Doctor', + subTitle: TranslationBase.of(context) + .askYourSubtitle, ), ), ]), @@ -385,9 +436,11 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: DoctorHomePage())); // }, child: MedicalProfileItem( - title: 'Internet', + title: + TranslationBase.of(context).internet, imagePath: 'insurance_card_icon.png', - subTitle: 'Pairing', + subTitle: TranslationBase.of(context) + .internetSubtitle, ), ), ), @@ -399,19 +452,17 @@ class _MedicalProfilePageState extends State { // context, FadePage(page: InsuranceApproval())); // }, child: MedicalProfileItem( - title: 'My Trackers', + title: + TranslationBase.of(context).chatbot, imagePath: 'insurance_approvals_icon.png', - subTitle: 'Service', + subTitle: TranslationBase.of(context) + .chatbotSubtitle, ), ), ), Expanded( flex: 1, - child: MedicalProfileItem( - title: 'Ask Your', - imagePath: 'medical_history_icon.png', - subTitle: 'Doctor', - ), + child: Container(), ), ]), ], @@ -428,17 +479,16 @@ class _MedicalProfilePageState extends State { width: double.infinity, height: 70, decoration: BoxDecoration( - color: Colors.grey[600], - shape: BoxShape.rectangle, - border: Border.all( - color: Colors.transparent, width: 0.5), - borderRadius: BorderRadius.all(Radius.circular(9)), - image: DecorationImage( - image: ExactAssetImage( - 'assets/images/bg_graphic.png'), - fit: BoxFit.cover - ) - ), + color: Colors.grey[600], + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, width: 0.5), + borderRadius: + BorderRadius.all(Radius.circular(9)), + image: DecorationImage( + image: ExactAssetImage( + 'assets/images/bg_graphic.png'), + fit: BoxFit.cover)), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -464,9 +514,10 @@ class _MedicalProfilePageState extends State { ), Positioned( top: 2, - left: 10, + left: projectViewModel.isArabic ? 0 : 10, + right: projectViewModel.isArabic ? 10 : 0, child: Texts( - 'Time Line ', + TranslationBase.of(context).timeLine, color: Colors.white, fontSize: 14, fontWeight: FontWeight.normal, diff --git a/lib/pages/medical/prescriptions/prescriptions_history_page.dart b/lib/pages/medical/prescriptions/prescriptions_history_page.dart index efd9df44..9d63bf7d 100644 --- a/lib/pages/medical/prescriptions/prescriptions_history_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_history_page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_history_details_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; @@ -49,7 +50,7 @@ class PrescriptionsHistoryPage extends StatelessWidget { height: 5, ), Texts( - 'Order No ${prescriptionsViewModel.prescriptionsHistory[index].iD}'), + '${TranslationBase.of(context).orderNo} ${prescriptionsViewModel.prescriptionsHistory[index].iD}'), SizedBox( height: 5, ), @@ -59,7 +60,7 @@ class PrescriptionsHistoryPage extends StatelessWidget { height: 5, ), Texts( - 'Order Details', + '${TranslationBase.of(context).orderNo}', fontWeight: FontWeight.w300, ), SizedBox( diff --git a/lib/pages/medical/prescriptions/prescriptions_home_page.dart b/lib/pages/medical/prescriptions/prescriptions_home_page.dart index fd903b4b..e6e3e6db 100644 --- a/lib/pages/medical/prescriptions/prescriptions_home_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_home_page.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_history_page.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_page.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; @@ -36,7 +37,7 @@ class _HomePrescriptionsPageState extends State onModelReady: (model) => model.getPrescriptions(), builder: (_, model, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: 'My Doctors', + appBarTitle: TranslationBase.of(context).myDoctor, body: Scaffold( extendBodyBehindAppBar: true, appBar: PreferredSize( @@ -84,13 +85,13 @@ class _HomePrescriptionsPageState extends State Container( width: MediaQuery.of(context).size.width * 0.30, child: Center( - child: Texts('Prescriptions'), + child: Texts(TranslationBase.of(context).prescriptions), ), ), Container( width: MediaQuery.of(context).size.width * 0.30, child: Center( - child: Texts('History'), + child: Texts(TranslationBase.of(context).history), ), ), ], diff --git a/lib/pages/medical/prescriptions/prescriptions_page.dart b/lib/pages/medical/prescriptions/prescriptions_page.dart index e335f41c..e6e90d9e 100644 --- a/lib/pages/medical/prescriptions/prescriptions_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_items_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -32,7 +33,7 @@ class PrescriptionsPage extends StatelessWidget { onTap: () => prescriptionsViewModel.setFilterType(FilterType.Clinic), child: ListTile( - title: const Text('Clinic'), + title: Text(TranslationBase.of(context).clinic), leading: Radio( value: FilterType.Clinic, groupValue: prescriptionsViewModel.filterType, @@ -50,7 +51,7 @@ class PrescriptionsPage extends StatelessWidget { onTap: () => prescriptionsViewModel .setFilterType(FilterType.Hospital), child: ListTile( - title: const Text('Hospital'), + title: Text(TranslationBase.of(context).hospital), leading: Radio( value: FilterType.Hospital, groupValue: prescriptionsViewModel.filterType, diff --git a/lib/pages/medical/radiology/radiology_home_page.dart b/lib/pages/medical/radiology/radiology_home_page.dart index 3288dcaf..0f9f4c7b 100644 --- a/lib/pages/medical/radiology/radiology_home_page.dart +++ b/lib/pages/medical/radiology/radiology_home_page.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/viewModels/medical/radiology_view_mode import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_details_page.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/doctor_card.dart'; import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; @@ -17,7 +18,7 @@ class RadiologyHomePage extends StatelessWidget { onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Radiology', + appBarTitle: TranslationBase.of(context).radiology, baseViewModel: model, body: FractionallySizedBox( widthFactor: 1.0, @@ -32,7 +33,7 @@ class RadiologyHomePage extends StatelessWidget { onTap: () => model.setFilterType(FilterType.Clinic), child: ListTile( - title: const Text('Clinic'), + title: Text(TranslationBase.of(context).clinic), leading: Radio( value: FilterType.Clinic, groupValue: model.filterType, @@ -50,7 +51,7 @@ class RadiologyHomePage extends StatelessWidget { onTap: () => model .setFilterType(FilterType.Hospital), child: ListTile( - title: const Text('Hospital'), + title: Text(TranslationBase.of(context).hospital), leading: Radio( value: FilterType.Hospital, groupValue: model.filterType, @@ -85,7 +86,7 @@ class RadiologyHomePage extends StatelessWidget { child: DoctorCard( name: radiology.doctorName, profileUrl: radiology.doctorImageURL, - subName: '${radiology.projectName} \nBill No ${radiology.invoiceNo}', + subName: '${radiology.projectName} \n${TranslationBase.of(context).billNo} ${radiology.invoiceNo}', date: DateUtil.getMonthDayYearDateFormatted( radiology.orderDate), ), diff --git a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart index a0dc78ff..b8c4eda2 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -16,7 +16,6 @@ class VitalSignDetailsScreen extends StatelessWidget { int appointmentNo; int projectID; - VitalSignDetailsScreen({this.appointmentNo, this.projectID}); @override @@ -28,7 +27,7 @@ class VitalSignDetailsScreen extends StatelessWidget { : (model) => model.getPatientRadOrders(), builder: (_, mode, widget) => AppScaffold( isShowAppBar: true, - appBarTitle: 'Vital Sign', + appBarTitle: TranslationBase.of(context).vitalSigns, baseViewModel: mode, body: mode.vitalSignResModelList.length > 0 ? Container( @@ -42,7 +41,7 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.Height, - pageTitle: 'Height', + pageTitle: TranslationBase.of(context).height, vitalList: mode.vitalSignResModelList, ), ), @@ -66,7 +65,7 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.Weight, - pageTitle: 'Weight', + pageTitle: TranslationBase.of(context).weight, vitalList: mode.vitalSignResModelList, ), ), @@ -92,7 +91,8 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.BodyMeasurements, - pageTitle: 'BMI', + pageTitle: TranslationBase.of(context) + .bodyMeasurements, vitalList: mode.vitalSignResModelList, ), ), @@ -112,7 +112,8 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.Temperature, - pageTitle: 'Temperature', + pageTitle: + TranslationBase.of(context).temperature, vitalList: mode.vitalSignResModelList, ), ), @@ -138,7 +139,7 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.heart, - pageTitle: 'Hart ', + pageTitle: TranslationBase.of(context).heart, vitalList: mode.vitalSignResModelList, ), ), @@ -160,7 +161,8 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.Respiration, - pageTitle: 'Respiration Rate', + pageTitle: + TranslationBase.of(context).respirationRate, vitalList: mode.vitalSignResModelList, ), ), @@ -187,7 +189,7 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.BloodPressure, - pageTitle: 'BloodPressure', + pageTitle: TranslationBase.of(context).pulse, vitalList: mode.vitalSignResModelList, ), ), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 5b9f0fc7..114f3a1b 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -455,6 +455,59 @@ class TranslationBase { String get noBookedAppointments => localizedValues['NoBookedAppointments'][locale.languageCode]; String get noConfirmedAppointments => localizedValues['NoConfirmedAppointments'][locale.languageCode]; String get noArrivedAppointments => localizedValues['noArrivedAppointments'][locale.languageCode]; + String get myAppointmentsList => localizedValues['MyAppointmentsList'][locale.languageCode]; + String get radiology => localizedValues['Radiology'][locale.languageCode]; + String get radiologySubtitle => localizedValues['RadiologySubtitle'][locale.languageCode]; + String get lab => localizedValues['Lab'][locale.languageCode]; + String get labSubtitle => localizedValues['LabSubtitle'][locale.languageCode]; + String get medicines => localizedValues['Medicines'][locale.languageCode]; + String get medicinesSubtitle => localizedValues['MedicinesSubtitle'][locale.languageCode]; + String get vitalSigns => localizedValues['VitalSigns'][locale.languageCode]; + String get vitalSignsSubtitle => localizedValues['VitalSignsSubTitle'][locale.languageCode]; + String get myMedical => localizedValues['MyMedical'][locale.languageCode]; + String get myMedicalSubtitle => localizedValues['MyMedicalSubtitle'][locale.languageCode]; + String get myDoctor => localizedValues['MyDoctor'][locale.languageCode]; + String get myDoctorSubtitle => localizedValues['MyDoctorSubtitle'][locale.languageCode]; + String get eye => localizedValues['Eye'][locale.languageCode]; + String get eyeSubtitle => localizedValues['EyeSubtitle'][locale.languageCode]; + String get insurance => localizedValues['Insurance'][locale.languageCode]; + String get insuranceSubtitle => localizedValues['InsuranceSubtitle'][locale.languageCode]; + String get updateInsurance => localizedValues['UpdateInsurance'][locale.languageCode]; + String get updateInsuranceSubtitle => localizedValues['UpdateInsuranceSubtitle'][locale.languageCode]; + String get insuranceApproval => localizedValues['InsuranceApproval'][locale.languageCode]; + String get insuranceApprovalSubtitle => localizedValues['InsuranceApprovalSubtitle'][locale.languageCode]; + String get allergies => localizedValues['Allergies'][locale.languageCode]; + String get allergiesSubtitle => localizedValues['AllergiesSubtitle'][locale.languageCode]; + String get myVaccines => localizedValues['MyVaccines'][locale.languageCode]; + String get myVaccinesSubtitle => localizedValues['MyVaccinesSubtitle'][locale.languageCode]; + String get medical => localizedValues['Medical'][locale.languageCode]; + String get medicalSubtitle => localizedValues['MedicalSubtitle'][locale.languageCode]; + String get monthly => localizedValues['Monthly'][locale.languageCode]; + String get monthlySubtitle => localizedValues['MonthlySubtitle'][locale.languageCode]; + String get sick => localizedValues['Sick'][locale.languageCode]; + String get sickSubtitle => localizedValues['SickSubtitle'][locale.languageCode]; + String get myBalance => localizedValues['MyBalance'][locale.languageCode]; + String get myBalanceSubtitle => localizedValues['MyBalanceSubtitle'][locale.languageCode]; + String get patientCall => localizedValues['PatientCall'][locale.languageCode]; + String get patientCallSubtitle => localizedValues['PatientCallSubtitle'][locale.languageCode]; + String get smartWatches => localizedValues['SmartWatches'][locale.languageCode]; + String get smartWatchesSubtitle => localizedValues['SmartWatchesSubtitle'][locale.languageCode]; + String get myTrackers => localizedValues['MyTrackers'][locale.languageCode]; + String get myTrackersSubtitle => localizedValues['MyTrackersSubtitle'][locale.languageCode]; + String get askYour => localizedValues['AskYour'][locale.languageCode]; + String get askYourSubtitle => localizedValues['AskYourSubtitle'][locale.languageCode]; + String get internet => localizedValues['Internet'][locale.languageCode]; + String get internetSubtitle => localizedValues['InternetSubtitle'][locale.languageCode]; + String get chatbot => localizedValues['Chatbot'][locale.languageCode]; + String get chatbotSubtitle => localizedValues['ChatbotSubtitle'][locale.languageCode]; + String get timeLine => localizedValues['TimeLine'][locale.languageCode]; + String get labOrders => localizedValues['LabOrders'][locale.languageCode]; + String get billNo => localizedValues['BillNo'][locale.languageCode]; + String get prescriptions => localizedValues['Prescriptions'][locale.languageCode]; + String get history => localizedValues['History'][locale.languageCode]; + String get orderNo => localizedValues['OrderNo'][locale.languageCode]; + String get orderDetails => localizedValues['OrderDetails'][locale.languageCode]; + String get vitalSign => localizedValues['VitalSign'][locale.languageCode]; } From 02ce04a39760e671d2de199862dc6427e8f3f63a Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 3 Sep 2020 16:12:16 +0300 Subject: [PATCH 4/6] medical_profile_page.dart --- lib/config/config.dart | 6 ++--- .../insurance/insurance_approval_screen.dart | 2 +- lib/pages/landing/landing_page.dart | 2 ++ lib/pages/medical/medical_profile_page.dart | 26 +++++++++---------- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 664a405c..956a2315 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -161,11 +161,9 @@ const GET_PHARMACY_LIST = "Services/Patients.svc/REST/GetPharmcyList"; const GET_PAtIENTS_INSURANCE = "Services/Patients.svc/REST/Get_PatientInsuranceDetails"; const GET_PAtIENTS_INSURANCE_UPDATED = - "/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; -const GET_PAtIENTS_INSURANCE_APPROVALS = "/Patients.svc/REST/GetApprovalStatus"; -const GET_VACCINES = "/Patients.svc/REST/GetDoneVaccinesByPatientID"; -const GET_VACCINES_EMAIL = "/Notifications.svc/REST/SendVaccinesEmail"; "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; +const GET_VACCINES = "Services/Patients.svc/REST/GetDoneVaccinesByPatientID"; +const GET_VACCINES_EMAIL = "Services/Notifications.svc/REST/SendVaccinesEmail"; const GET_PAtIENTS_INSURANCE_APPROVALS = "Services/Patients.svc/REST/GetApprovalStatus"; const SEARCH_BOT = 'HabibiChatBotApi/BotInterface/GetVoiceCommandResponse'; diff --git a/lib/pages/insurance/insurance_approval_screen.dart b/lib/pages/insurance/insurance_approval_screen.dart index 9cc40692..038468e0 100644 --- a/lib/pages/insurance/insurance_approval_screen.dart +++ b/lib/pages/insurance/insurance_approval_screen.dart @@ -80,7 +80,7 @@ class _InsuranceApprovalState extends State { children: [ ExpansionTile( title: Container( - height: 120.0, + //height: 120.0, child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 46e5e2fb..8eea389f 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -307,4 +307,6 @@ class _LandingPageState extends State with WidgetsBindingObserver { _changeCurrentTab(2); } } + + } diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index b87652c5..83628076 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -254,11 +254,10 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( - //TODO -// onTap: () { -// Navigator.push( -// context, FadePage(page: DoctorHomePage())); -// }, + onTap: () { + Navigator.push(context, + FadePage(page: InsuranceUpdate())); + }, child: MedicalProfileItem( title: TranslationBase.of(context) .updateInsurance, @@ -271,10 +270,10 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( - onTap: () { - Navigator.push( - context, FadePage(page: InsuranceApproval())); - }, + onTap: () { + Navigator.push(context, + FadePage(page: InsuranceApproval())); + }, child: MedicalProfileItem( title: TranslationBase.of(context) .insuranceApproval, @@ -299,11 +298,10 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( - //TODO -// onTap: () { -// Navigator.push( -// context, FadePage(page: DoctorHomePage())); -// }, + onTap: () { + Navigator.push(context, + FadePage(page: MyVaccines())); + }, child: MedicalProfileItem( title: TranslationBase.of(context) .myVaccines, From fe66ee59937cc3a1bd55f33c14977866e998e5f1 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 7 Sep 2020 09:27:34 +0300 Subject: [PATCH 5/6] fix lab result issues --- android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- assets/images/report.jpg | Bin 0 -> 37509 bytes lib/config/config.dart | 4 +- lib/config/localized_values.dart | 1 + lib/core/model/labs/lab_result.dart | 88 +++++++ lib/core/service/client/base_app_client.dart | 2 +- lib/core/service/insurance_service.dart | 41 +++- lib/core/service/medical/labs_service.dart | 23 ++ .../medical/reports_monthly_service.dart | 83 +++++++ .../viewModels/insurance_card_View_model.dart | 15 +- .../viewModels/medical/labs_view_model.dart | 23 +- .../medical/reports_monthly_view_model.dart | 84 +++++++ lib/locator.dart | 4 + .../insurance/insurance_update_screen.dart | 130 +++++----- lib/pages/landing/landing_page.dart | 15 +- .../medical/labs/laboratory_result_page.dart | 4 +- lib/pages/medical/medical_profile_page.dart | 2 +- .../medical/reports/monthly_reports.dart | 18 ++ lib/uitl/translations_delegate_base.dart | 1 + .../medical/laboratory_result_widget.dart | 228 +++++++++++++++++- lib/widgets/others/app_scaffold_widget.dart | 2 +- pubspec.yaml | 2 +- 23 files changed, 679 insertions(+), 97 deletions(-) create mode 100644 assets/images/report.jpg create mode 100644 lib/core/model/labs/lab_result.dart create mode 100644 lib/core/service/medical/reports_monthly_service.dart create mode 100644 lib/core/viewModels/medical/reports_monthly_view_model.dart create mode 100644 lib/pages/medical/reports/monthly_reports.dart diff --git a/android/build.gradle b/android/build.gradle index e2e8a05f..8e56476b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.2' } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 296b146b..5660070d 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Thu Sep 03 16:26:30 EEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/assets/images/report.jpg b/assets/images/report.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5846cd538dec27f12011b3de3ecfbdae4d411f29 GIT binary patch literal 37509 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 literal 0 HcmV?d00001 diff --git a/lib/config/config.dart b/lib/config/config.dart index 956a2315..fc636ceb 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -28,8 +28,8 @@ const GET_PRESCRIPTION_REPORT_ENH = ///Lab Order const GET_Patient_LAB_ORDERS = 'Services/Patients.svc/REST/GetPatientLabOrders'; -const GET_Patient_LAB_SPECIAL_RESULT = - 'Services/Patients.svc/REST/GetPatientLabSpecialResults'; +const GET_Patient_LAB_SPECIAL_RESULT = 'Services/Patients.svc/REST/GetPatientLabSpecialResults'; +const GET_Patient_LAB_RESULT = '/Services/Patients.svc/REST/GetPatientLabResults'; /// const GET_PATIENT_ORDERS = 'Services/Patients.svc/REST/GetPatientRadOrders'; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 903943ef..ddd98917 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -448,4 +448,5 @@ const Map> localizedValues = { "OrderNo": {"en": "Order No", "ar": "رقم الطلب"}, "OrderDetails": {"en": "Order Details", "ar": "تفاصيل الطلب"}, "VitalSign": {"en": "Vital Sign", "ar": "العلامة حيوية"}, + "MonthlyReports": {"en": "Monthly Reports", "ar": "تقارير شهرية"}, }; diff --git a/lib/core/model/labs/lab_result.dart b/lib/core/model/labs/lab_result.dart new file mode 100644 index 00000000..23b3363d --- /dev/null +++ b/lib/core/model/labs/lab_result.dart @@ -0,0 +1,88 @@ +class LabResult { + String description; + Null femaleInterpretativeData; + int gender; + int lineItemNo; + Null maleInterpretativeData; + String notes; + String packageID; + int patientID; + String projectID; + String referanceRange; + String resultValue; + String sampleCollectedOn; + String sampleReceivedOn; + String setupID; + Null superVerifiedOn; + String testCode; + String uOM; + String verifiedOn; + Null verifiedOnDateTime; + + LabResult( + {this.description, + this.femaleInterpretativeData, + this.gender, + this.lineItemNo, + this.maleInterpretativeData, + this.notes, + this.packageID, + this.patientID, + this.projectID, + this.referanceRange, + this.resultValue, + this.sampleCollectedOn, + this.sampleReceivedOn, + this.setupID, + this.superVerifiedOn, + this.testCode, + this.uOM, + this.verifiedOn, + this.verifiedOnDateTime}); + + LabResult.fromJson(Map json) { + description = json['Description']; + femaleInterpretativeData = json['FemaleInterpretativeData']; + gender = json['Gender']; + lineItemNo = json['LineItemNo']; + maleInterpretativeData = json['MaleInterpretativeData']; + notes = json['Notes']; + packageID = json['PackageID']; + patientID = json['PatientID']; + projectID = json['ProjectID']; + referanceRange = json['ReferanceRange']; + resultValue = json['ResultValue']; + 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['LineItemNo'] = this.lineItemNo; + data['MaleInterpretativeData'] = this.maleInterpretativeData; + data['Notes'] = this.notes; + data['PackageID'] = this.packageID; + data['PatientID'] = this.patientID; + data['ProjectID'] = this.projectID; + data['ReferanceRange'] = this.referanceRange; + data['ResultValue'] = this.resultValue; + 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; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index efb168c8..aa48c49d 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -31,7 +31,7 @@ class BaseAppClient { //Map profile = await sharedPref.getObj(DOCTOR_PROFILE); String token = await sharedPref.getString(TOKEN); var languageID = - await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'ar'); + await sharedPref.getStringWithDefaultValue(APP_LANGUAGE, 'en'); var user = await sharedPref.getObject(USER_PROFILE); body['SetupID'] = body.containsKey('SetupID') ? body['SetupID'] != null ? body['SetupID'] : SETUP_ID diff --git a/lib/core/service/insurance_service.dart b/lib/core/service/insurance_service.dart index 8850e953..7fee6615 100644 --- a/lib/core/service/insurance_service.dart +++ b/lib/core/service/insurance_service.dart @@ -1,8 +1,13 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/insurance/insurance_approval.dart'; import 'package:diplomaticquarterapp/core/model/insurance/insurance_card.dart'; import 'package:diplomaticquarterapp/core/model/insurance/insurance_card_update.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; +import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordsByStatusReq.dart'; +import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; class InsuranceCardService extends BaseService { List _cardList = List(); @@ -15,6 +20,9 @@ class InsuranceCardService extends BaseService { List get insuranceApproval => _insuranceApproval; + GetAllSharedRecordsByStatusResponse getAllSharedRecordsByStatusResponse = + GetAllSharedRecordsByStatusResponse(); + clearInsuranceCard() { _cardList.clear(); } @@ -101,7 +109,7 @@ class InsuranceCardService extends BaseService { Future getInsuranceApproval({int appointmentNo}) async { hasError = false; // _cardList.clear(); - if(appointmentNo != null) { + if (appointmentNo != null) { _insuranceApprovalModel.appointmentNo = appointmentNo; _insuranceApprovalModel.eXuldAPPNO = null; _insuranceApprovalModel.projectID = null; @@ -124,4 +132,35 @@ class InsuranceCardService extends BaseService { super.error = error; }, body: _insuranceApprovalModel.toJson()); } + + Future getFamilyFiles() async { + var myFamily = await sharedPref.getObject(FAMILY_FILE); + if (myFamily != null) { + getAllSharedRecordsByStatusResponse = + GetAllSharedRecordsByStatusResponse.fromJson(myFamily); + } else { + getSharedRecordByStatus(); + } + } + + Future getSharedRecordByStatus() async { + try { + dynamic localRes; + var request = GetAllSharedRecordsByStatusReq(); + request.status = 0; + await baseAppClient.post(GET_SHARED_RECORD_BY_STATUS, + onSuccess: (dynamic response, int statusCode) { + localRes = response; + }, onFailure: (String error, int statusCode) { + AppToast.showErrorToast(message: error); + throw error; + }, body: request.toJson()); + sharedPref.setObject(FAMILY_FILE, localRes); + getAllSharedRecordsByStatusResponse = + GetAllSharedRecordsByStatusResponse.fromJson(localRes); + } catch (error) { + print(error); + throw error; + } + } } diff --git a/lib/core/service/medical/labs_service.dart b/lib/core/service/medical/labs_service.dart index 98f8110e..c1ad65f3 100644 --- a/lib/core/service/medical/labs_service.dart +++ b/lib/core/service/medical/labs_service.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/labs/lab_result.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_special_result.dart'; import 'package:diplomaticquarterapp/core/model/labs/request_patient_lab_orders.dart'; @@ -28,6 +29,7 @@ class LabsService extends BaseService { RequestPatientLabSpecialResult(); List patientLabSpecialResult = List(); + List labResultList = List(); Future getLaboratoryResult( {String projectID, @@ -52,6 +54,27 @@ class LabsService extends BaseService { }, body: _requestPatientLabSpecialResult.toJson()); } + Future getPatientLabResult({PatientLabOrders patientLabOrder}) async { + hasError = false; + Map body = Map(); + body['InvoiceNo'] = patientLabOrder.invoiceNo; + body['OrderNo'] = patientLabOrder.orderNo; + body['Procedure'] = "U/A"; + body['ProjectID'] = patientLabOrder.projectID; + body['ClinicID'] = patientLabOrder.clinicID; + //TODO Check the res + await baseAppClient.post(GET_Patient_LAB_RESULT, + onSuccess: (dynamic response, int statusCode) { + patientLabSpecialResult.clear(); + response['ListPLR'].forEach((lab) { + labResultList.add(LabResult.fromJson(lab)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + RequestSendLabReportEmail _requestSendLabReportEmail = RequestSendLabReportEmail(); diff --git a/lib/core/service/medical/reports_monthly_service.dart b/lib/core/service/medical/reports_monthly_service.dart new file mode 100644 index 00000000..5e643669 --- /dev/null +++ b/lib/core/service/medical/reports_monthly_service.dart @@ -0,0 +1,83 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/reports/Reports.dart'; +import 'package:diplomaticquarterapp/core/model/reports/request_reports.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; +import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart'; + +class ReportsMonthlyService extends BaseService { + List reportsList = List(); + List appointHistoryList = List(); + + RequestReports _requestReports = RequestReports( + isReport: true, + encounterType: 1, + requestType: 1, + versionID: 5.5, + channel: 3, + languageID: 2, + iPAdress: "10.20.10.20", + generalid: 'Cs2020@2016\$2958', + patientOutSA: 0, + sessionID: 'KIbLoqkytuKJEWECHQ', + isDentalAllowedBackend: false, + deviceTypeID: 2, + patientID: 1231755, + tokenID: '@dm!n', + patientTypeID: 1, + patientType: 1); + + Future getReports() async { + hasError = false; + await baseAppClient.post(REPORTS, + onSuccess: (dynamic response, int statusCode) { + reportsList.clear(); + response['GetPatientMedicalStatus'].forEach((reports) { + reportsList.add(Reports.fromJson(reports)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: _requestReports.toJson()); + } + + Future getPatentAppointmentHistory() async { + hasError = false; + Map body = new Map(); + body['IsForMedicalReport'] = true; + await baseAppClient.post(GET_PATIENT_AppointmentHistory, + onSuccess: (dynamic response, int statusCode) { + appointHistoryList = []; + response['AppoimentAllHistoryResultList'].forEach((appoint) { + appointHistoryList.add(AppointmentHistory.fromJson(appoint)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + + Future insertRequestForMedicalReport( + AppointmentHistory appointmentHistory) async { + Map body = new Map(); + body['ClinicID'] = appointmentHistory.clinicID; + body['DoctorID'] = appointmentHistory.doctorID; + body['SetupID'] = appointmentHistory.setupID; + body['EncounterNo'] = appointmentHistory.appointmentNo; + body['EncounterType'] = 1;// appointmentHistory.appointmentType; + body['IsActive'] = appointmentHistory.isActiveDoctor; + body['ProjectID'] = appointmentHistory.projectID; + body['Remarks'] = ""; + body['ProcedureId'] = ""; + body['RequestType'] = 1; + body['Source'] = 2; + body['Status'] = 1; + body['CreatedBy'] = 102; + hasError = false; + await baseAppClient.post(INSERT_REQUEST_FOR_MEDICAL_REPORT, + onSuccess: (dynamic response, int statusCode) {}, + onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/insurance_card_View_model.dart b/lib/core/viewModels/insurance_card_View_model.dart index a6975360..e99a53f6 100644 --- a/lib/core/viewModels/insurance_card_View_model.dart +++ b/lib/core/viewModels/insurance_card_View_model.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/model/insurance/insurance_approval.dar import 'package:diplomaticquarterapp/core/model/insurance/insurance_card.dart'; import 'package:diplomaticquarterapp/core/model/insurance/insurance_card_update.dart'; import 'package:diplomaticquarterapp/core/service/insurance_service.dart'; +import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import '../../locator.dart'; import 'base_view_model.dart'; @@ -20,6 +21,9 @@ class InsuranceViewModel extends BaseViewModel { List get insuranceApproval => _insuranceCardService.insuranceApproval; + GetAllSharedRecordsByStatusResponse get getAllSharedRecordsByStatusResponse => + _insuranceCardService.getAllSharedRecordsByStatusResponse; + Future getInsurance() async { hasError = false; _insuranceCardService.clearInsuranceCard(); @@ -41,7 +45,7 @@ class InsuranceViewModel extends BaseViewModel { error = _insuranceCardService.error; setState(ViewState.ErrorLocal); } else - setState(ViewState.Idle); + getFamilyFiles(); } Future getInsuranceApproval({int appointmentNo}) async { @@ -59,4 +63,13 @@ class InsuranceViewModel extends BaseViewModel { } else setState(ViewState.Idle); } + + Future getFamilyFiles() async { + await _insuranceCardService.getFamilyFiles(); + if (_insuranceCardService.hasError) { + error = _insuranceCardService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } diff --git a/lib/core/viewModels/medical/labs_view_model.dart b/lib/core/viewModels/medical/labs_view_model.dart index 1efdfb7c..032aeb1e 100644 --- a/lib/core/viewModels/medical/labs_view_model.dart +++ b/lib/core/viewModels/medical/labs_view_model.dart @@ -1,6 +1,6 @@ - import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/labs/lab_result.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; import 'package:diplomaticquarterapp/core/model/labs/patient_lab_special_result.dart'; import 'package:diplomaticquarterapp/core/service/medical/labs_service.dart'; @@ -78,13 +78,32 @@ class LabsViewModel extends BaseViewModel { List get patientLabSpecialResult => _labsService.patientLabSpecialResult; + List get labResultList => _labsService.labResultList; + getLaboratoryResult( {String projectID, int clinicID, String invoiceNo, String orderNo}) async { setState(ViewState.Busy); - await _labsService.getLaboratoryResult(invoiceNo: invoiceNo,orderNo: orderNo,projectID: projectID,clinicID: clinicID); + await _labsService.getLaboratoryResult( + invoiceNo: invoiceNo, + orderNo: orderNo, + projectID: projectID, + clinicID: clinicID); + if (_labsService.hasError) { + error = _labsService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + getPatientLabResult({PatientLabOrders patientLabOrder}) async { + setState(ViewState.Busy); + await _labsService.getPatientLabResult( + patientLabOrder: patientLabOrder + ); if (_labsService.hasError) { error = _labsService.error; setState(ViewState.Error); diff --git a/lib/core/viewModels/medical/reports_monthly_view_model.dart b/lib/core/viewModels/medical/reports_monthly_view_model.dart new file mode 100644 index 00000000..2e5952ae --- /dev/null +++ b/lib/core/viewModels/medical/reports_monthly_view_model.dart @@ -0,0 +1,84 @@ +import 'package:diplomaticquarterapp/pages/feedback/appointment_history.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; + +import '../../../core/enum/reportfilter_type.dart'; +import '../../../core/enum/viewstate.dart'; +import '../../../core/model/reports/Reports.dart'; +import '../../../core/service/medical/reports_service.dart'; +import '../../../locator.dart'; +import '../base_view_model.dart'; + +class ReportsMonthlyViewModel extends BaseViewModel { + ReportFilterType filterType = ReportFilterType.Requested; + + ReportsService _reportsService = locator(); + + List reportsOrderRequestList = List(); + List reportsOrderReadyList = List(); + List reportsOrderCompletedList = List(); + List reportsOrderCanceledList = List(); + + List get appointHistoryList => + _reportsService.appointHistoryList; + + getReports() async { + setState(ViewState.Busy); + reportsOrderRequestList.clear(); + reportsOrderReadyList.clear(); + reportsOrderCompletedList.clear(); + reportsOrderCanceledList.clear(); + await _reportsService.getReports(); + if (_reportsService.hasError) { + error = _reportsService.error; + setState(ViewState.Error); + } else { + _filterList(); + setState(ViewState.Idle); + } + } + + getPatentAppointmentHistory() async { + setState(ViewState.Busy); + await _reportsService.getPatentAppointmentHistory(); + if (_reportsService.hasError) { + error = _reportsService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + void _filterList() { + _reportsService.reportsList.forEach((report) { + switch (report.status) { + case 1: + reportsOrderRequestList.add(report); + break; + case 2: + reportsOrderReadyList.add(report); + break; + case 3: + reportsOrderCompletedList.add(report); + break; + case 4: + reportsOrderCanceledList.add(report); + break; + default: + } + }); + } + + + insertRequestForMedicalReport(AppointmentHistory appointmentHistory)async{ + setState(ViewState.Busy); + await _reportsService.insertRequestForMedicalReport(appointmentHistory); + if (_reportsService.hasError) { + error = _reportsService.error; + AppToast.showErrorToast(message: error); + setState(ViewState.ErrorLocal); + } else { + AppToast.showSuccessToast(message: 'The order was send '); + setState(ViewState.Idle); + } + } +} diff --git a/lib/locator.dart b/lib/locator.dart index b2e974a8..6839fbc2 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -12,6 +12,7 @@ import 'core/service/medical/medical_service.dart'; import 'core/service/medical/my_doctor_service.dart'; import 'core/service/medical/prescriptions_service.dart'; import 'core/service/medical/radiology_service.dart'; +import 'core/service/medical/reports_monthly_service.dart'; import 'core/service/medical/vital_sign_service.dart'; import 'core/viewModels/appointment_rate_view_model.dart'; import 'core/viewModels/feedback/feedback_view_model.dart'; @@ -22,6 +23,7 @@ import 'core/viewModels/medical/medical_view_model.dart'; import 'core/viewModels/medical/my_doctor_view_model.dart'; import 'core/viewModels/medical/prescriptions_view_model.dart'; import 'core/viewModels/medical/radiology_view_model.dart'; +import 'core/viewModels/medical/reports_monthly_view_model.dart'; import 'core/viewModels/medical/vital_sign_view_model.dart'; import 'core/viewModels/medical/reports_view_model.dart'; import 'core/viewModels/pharmacies_view_model.dart'; @@ -53,6 +55,7 @@ void setupLocator() { locator.registerLazySingleton(() => AppointmentRateService()); locator.registerLazySingleton(() => QrService()); locator.registerFactory(() => VaccineService()); + locator.registerLazySingleton(() => ReportsMonthlyService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -70,5 +73,6 @@ void setupLocator() { locator.registerFactory(() => DashboardViewModel()); locator.registerFactory(() => AppointmentRateViewModel()); locator.registerFactory(() => QrViewModel()); + locator.registerFactory(() => ReportsMonthlyViewModel()); } diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index 9cfa41a9..2fa291df 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:flutter/cupertino.dart'; @@ -97,9 +98,12 @@ class _InsuranceUpdateState extends State children: [ Container( child: ListView.builder( - itemCount: model.insuranceUpdate == null + itemCount: model.getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList == + null ? 0 - : model.insuranceUpdate.length, + : model.getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList.length, itemBuilder: (BuildContext context, int index) { return Container( margin: EdgeInsets.all(10.0), @@ -112,81 +116,63 @@ class _InsuranceUpdateState extends State child: Container( width: MediaQuery.of(context).size.width, padding: EdgeInsets.all(10.0), - child: Column( + child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: [ - Flex( - direction: Axis.horizontal, - children: [ - Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - top: 2.0, - left: 10.0, - right: 20.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Text("TAMER FANASHEH ", - style: TextStyle( - fontSize: 14.0, - color: Colors.black, - fontWeight: - FontWeight.w500, - letterSpacing: 1.0)), - Text( - 'File No.' + - model - .insuranceUpdate[ - index] - .patientID - .toString(), - style: TextStyle( - fontSize: 14.0, - color: Colors.black, - fontWeight: - FontWeight.w500, - letterSpacing: 1.0)), - Text( - model.insuranceUpdate[index] - .createdOn, - style: TextStyle( - fontSize: 14.0, - color: Colors.black, - fontWeight: - FontWeight.w500, - letterSpacing: 1.0)), - ], - ), - ), + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 2.0, left: 10.0, right: 20.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + model.getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index].patientName, + style: TextStyle( + fontSize: 14.0, + color: Colors.black, + fontWeight: FontWeight.w500, + letterSpacing: 1.0)), + Text( + 'File No.' + + model.getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index].patientID.toString(), + style: TextStyle( + fontSize: 14.0, + color: Colors.black, + fontWeight: FontWeight.w500, + letterSpacing: 1.0)), + ], ), - Expanded( - flex: 1, - child: Container( -// height: MediaQuery.of(context).size.height * 0.12, - margin: EdgeInsets.only(top: 20.0), - child: Column( - children: [ - Container( - child: Button( - label: 'Fetch', - ), - height: SizeConfig - .heightMultiplier * - 3.8, - width: - SizeConfig.screenWidth * - 4.2, - ), - ], - ), - ), - ) - ], + ), ), + Expanded( + flex: 2, + child: Container( + // height: MediaQuery.of(context).size.height * 0.12, + margin: EdgeInsets.only(top: 2.0), + child: Column( + children: [ + Container( + child: SecondaryButton( + label: 'Update', + small: true, + textColor: Colors.white, + // color: Colors.grey, + ), + //height: 45, + // width:90 + ), + ], + ), + ), + ) ], ), ), diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 8eea389f..073a1d52 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -235,16 +235,21 @@ class _LandingPageState extends State with WidgetsBindingObserver { physics: NeverScrollableScrollPhysics(), controller: pageController, children: [ - HomePage(goToMyProfile: (){ - _changeCurrentTab(1); - },), + HomePage( + goToMyProfile: () { + _changeCurrentTab(1); + }, + ), MedicalProfilePage(), MyAdmissionsPage(), ToDo(), BookingOptions() ], // Please do not remove the BookingOptions from this array ), - bottomNavigationBar: BottomNavBar(changeIndex: _changeCurrentTab,index: currentTab,), + bottomNavigationBar: BottomNavBar( + changeIndex: _changeCurrentTab, + index: currentTab, + ), ); } @@ -307,6 +312,4 @@ class _LandingPageState extends State with WidgetsBindingObserver { _changeCurrentTab(2); } } - - } diff --git a/lib/pages/medical/labs/laboratory_result_page.dart b/lib/pages/medical/labs/laboratory_result_page.dart index 216b8adb..01cb6725 100644 --- a/lib/pages/medical/labs/laboratory_result_page.dart +++ b/lib/pages/medical/labs/laboratory_result_page.dart @@ -27,8 +27,10 @@ class LaboratoryResultPage extends StatelessWidget { body: ListView.builder( itemBuilder: (context, index) => LaboratoryResultWidget( onTap: () => model.sendLabReportEmail(patientLabOrder: patientLabOrders), - billNo: model.patientLabSpecialResult[index].invoiceNo, + billNo: patientLabOrders.invoiceNo, details: model.patientLabSpecialResult[index].resultDataHTML, + orderNo: patientLabOrders.orderNo, + patientLabOrder: patientLabOrders, ), itemCount: model.patientLabSpecialResult.length, ), diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 83628076..5dccb514 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -73,7 +73,7 @@ class _MedicalProfilePageState extends State { itemCount: model.appoitmentAllHistoryResultList.length, scrollDirection: Axis.horizontal, - reverse: true, + reverse: !projectViewModel.isArabic, ), ], ), diff --git a/lib/pages/medical/reports/monthly_reports.dart b/lib/pages/medical/reports/monthly_reports.dart new file mode 100644 index 00000000..9c913705 --- /dev/null +++ b/lib/pages/medical/reports/monthly_reports.dart @@ -0,0 +1,18 @@ +import 'package:diplomaticquarterapp/core/viewModels/medical/reports_monthly_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; + +class MonthlyReportsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + builder: (_, model, w) => AppScaffold( + isShowAppBar: true, + appBarTitle: TranslationBase.of(context).monthlyReports, + body: Container(), + ), + ); + } +} diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 114f3a1b..22e39c39 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -508,6 +508,7 @@ class TranslationBase { String get orderNo => localizedValues['OrderNo'][locale.languageCode]; String get orderDetails => localizedValues['OrderDetails'][locale.languageCode]; String get vitalSign => localizedValues['VitalSign'][locale.languageCode]; + String get monthlyReports => localizedValues['MonthlyReports'][locale.languageCode]; } diff --git a/lib/widgets/data_display/medical/laboratory_result_widget.dart b/lib/widgets/data_display/medical/laboratory_result_widget.dart index b84b1076..53356095 100644 --- a/lib/widgets/data_display/medical/laboratory_result_widget.dart +++ b/lib/widgets/data_display/medical/laboratory_result_widget.dart @@ -1,5 +1,13 @@ +import 'package:diplomaticquarterapp/core/model/labs/lab_result.dart'; +import 'package:diplomaticquarterapp/core/model/labs/patient_lab_orders.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/labs_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/widgets/others/network_base_view.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; import '../text.dart'; @@ -7,8 +15,16 @@ class LaboratoryResultWidget extends StatefulWidget { final GestureTapCallback onTap; final String billNo; final String details; + final String orderNo; + final PatientLabOrders patientLabOrder; - const LaboratoryResultWidget({Key key, this.onTap, this.billNo, this.details}) + const LaboratoryResultWidget( + {Key key, + this.onTap, + this.billNo, + this.details, + this.orderNo, + this.patientLabOrder}) : super(key: key); @override @@ -17,9 +33,12 @@ class LaboratoryResultWidget extends StatefulWidget { class _LaboratoryResultWidgetState extends State { bool _isShowMore = false; + bool _isShowMoreGeneral = false; + ProjectViewModel projectViewModel; @override Widget build(BuildContext context) { + projectViewModel = Provider.of(context); return Container( margin: EdgeInsets.all(15), child: Column( @@ -45,7 +64,7 @@ class _LaboratoryResultWidgetState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Texts('Bill No'), + Texts('Invoice No'), Texts(widget.billNo), ], ), @@ -102,7 +121,7 @@ class _LaboratoryResultWidgetState extends State { )), child: Row( children: [ - Expanded(child: Texts('Result')), + Expanded(child: Texts('Special Result')), Container( width: 25, height: 25, @@ -132,12 +151,211 @@ class _LaboratoryResultWidgetState extends State { bottomRight: Radius.circular(5.0), )), duration: Duration(milliseconds: 7000), - child: Text(widget.details?? 'No Data'), - ) + child: Container( + width: double.infinity, + child: Text(widget.details ?? 'No Data')), + ), + SizedBox(height: 12,), + BaseView( + onModelReady: (model) => model.getPatientLabResult( + patientLabOrder: widget.patientLabOrder), + builder: (_, model, w) => NetworkBaseView( + baseViewModel: model, + child: Container( + child: Column( + children: [ + InkWell( + onTap: () { + setState(() { + _isShowMoreGeneral = !_isShowMoreGeneral; + }, + ); + }, + child: Container( + padding: EdgeInsets.all(10.0), + margin: EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Colors.white, + borderRadius: BorderRadius.all( + Radius.circular(5.0), + )), + child: Row( + children: [ + Expanded(child: Texts('General Result')), + Container( + width: 25, + height: 25, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.red[900]), + child: Icon( + _isShowMoreGeneral + ? Icons.keyboard_arrow_up + : Icons.keyboard_arrow_down, + color: Colors.white, + size: 22, + ), + ) + ], + ), + ), + ), + if (_isShowMoreGeneral) + AnimatedContainer( + padding: EdgeInsets.all(10.0), + margin: EdgeInsets.only(left: 5, right: 5), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(5.0), + bottomRight: Radius.circular(5.0), + ), + ), + duration: Duration(milliseconds: 7000), + child: Container( + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts('U/A'), + InkWell( + onTap: () { + model.getPatientLabResult( + patientLabOrder: + widget.patientLabOrder); + }, + child: Texts( + 'Flow Chart', + decoration: TextDecoration.underline, + color: Colors.blue, + ), + ), + ], + ), + Table( + border: TableBorder.symmetric( + inside: BorderSide( + width: 2.0, color: Colors.grey[300]), + ), + children: fullData(model.labResultList), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ) ], ), ], ), ); } + + List fullData(List labResultList) { + List tableRow = []; + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: projectViewModel.isArabic ? Radius.circular(0.0): Radius.circular(10.0), + topRight: projectViewModel.isArabic ? Radius.circular(10.0) : Radius.circular(0.0), + ), + ), + child: Center( + child: Texts( + 'Description', + color: Colors.white, + ), + ), + height: 60, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + + ), + child: Center( + child: Texts('Value', color: Colors.white), + ), + height: 60), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Hexcolor('#515B5D'), + borderRadius: BorderRadius.only( + topLeft: projectViewModel.isArabic ? Radius.circular(10.0):Radius.circular(0.0), + topRight: projectViewModel.isArabic ? Radius.circular(0.0) : Radius.circular(10.0), + ), + ), + child: Center( + child: Texts('Range', color: Colors.white), + ), + height: 60), + ), + ], + ), + ); + labResultList.forEach((lab) { + tableRow.add( + TableRow( + children: [ + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + lab.description, + textAlign: TextAlign.center, + ), + ), + ), + ), + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + lab.resultValue, + textAlign: TextAlign.center, + ), + ), + ), + ), + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + lab.referanceRange, + textAlign: TextAlign.center, + ), + ), + ), + ), + ], + ), + ); + }); + return tableRow; + } } diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index b18a5fd9..56e06939 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -74,7 +74,7 @@ class AppScaffold extends StatelessWidget { ) : buildBodyWidget(), bottomSheet: bottomSheet, - bottomNavigationBar: BottomBarSearch() + // bottomNavigationBar: BottomBarSearch() //floatingActionButton: FloatingSearchButton(), ); } diff --git a/pubspec.yaml b/pubspec.yaml index b5b359a9..4a87b43a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,7 +38,7 @@ dependencies: url_launcher: ^5.5.0 shared_preferences: ^0.5.8 flutter_flexible_toast: ^0.1.4 - firebase_messaging: 6.0.12 + firebase_messaging: ^7.0.0 # Progress bar progress_hud_v2: ^2.0.0 From b0f0b8734515fe7dfa53467bae344e4b25a626d6 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 7 Sep 2020 11:43:13 +0300 Subject: [PATCH 6/6] fix merge issues --- lib/config/config.dart | 3 +- lib/config/localized_values.dart | 12 - lib/core/service/client/base_app_client.dart | 12 +- .../service/medical/my_doctor_service.dart | 5 +- .../medical/my_doctor_view_model.dart | 5 +- lib/core/viewModels/project_view_model.dart | 4 +- .../Appointments/DoctorListResponse.dart | 4 +- lib/pages/MyAppointments/MyAppointments.dart | 105 ++++---- lib/pages/landing/landing_page.dart | 226 +++++++++--------- .../medical/doctor/doctor_home_page.dart | 2 +- 10 files changed, 183 insertions(+), 195 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index c9a37d70..0165cb1b 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -43,7 +43,8 @@ const SEND_RAD_REPORT_EMAIL = const SEND_FEEDBACK = 'Services/COCWS.svc/REST/InsertCOCItemInSPList'; const GET_STATUS_FOR_COCO = 'Services/COCWS.svc/REST/GetStatusforCOC'; const GET_PATIENT_AppointmentHistory = - 'Services/Doctors.svc/REST/PateintHasAppoimentHistory'; + 'Services' + '/Doctors.svc/REST/PateintHasAppoimentHistory'; ///VITAL SIGN const GET_PATIENT_VITAL_SIGN = diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index bc50d61c..696e2665 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -449,18 +449,6 @@ const Map> localizedValues = { "OrderDetails": {"en": "Order Details", "ar": "تفاصيل الطلب"}, "VitalSign": {"en": "Vital Sign", "ar": "العلامة حيوية"}, "MonthlyReports": {"en": "Monthly Reports", "ar": "تقارير شهرية"}, - "textToSpeech": {"en": "How May I Help You?", "ar": "كيف يمكنني مساعدتك؟"}, "locationDialogMessage": {"en": "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.", "ar": "السماح لتطبيق مجموعة الحبيب الطبية بالوصول إلى موقعك سيساعدك في إظهار المستشفيات وفقًا للأقرب إليك."}, - "parking":{"en":"Parking","ar":"مواقف"}, - "alhabiServices":{"en":"HMG Service","ar":"خدمات الحبيب"}, - "parkingTitle":{"en":"Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the car’s location in Google Maps. 3- Read another position by pressing the Clear Position Data button.","ar":" خدمة المواقف، تتيح هذه الخدمة للمستخدم معلومات عن موقف السيارة ليسهل عليه العودة لها لاحقاً ، 1- بالضغط على زر(قراءة الكود) تستطيع حفظ البيانات الخاصة بالموقف. 2-بالضغط على زر(عرض موقف سيارتي) يعرض لك موقع السيارة في خرائط قوقل. 3- لإعادة قراءة موقف آخرعن طريق الضغط على زر(مسح بيانات الموقف). "}, - "readBarcode":{"en":"Read Barcode","ar":"قراءة الكود"}, - "showMyPark":{"en":"Show My Park","ar":"عرض بارك"}, - "clearMyData":{"en":"clear My Data","ar":"امسح البيانات"}, - "floor":{"en":"Floor:","ar":"الطابق"}, - "gate":{"en":"Gate:","ar":"بوابة"}, - "building":{"en":"Building:","ar":"المبنى"}, - "branch":{"en":"Branch:","ar":"الفرع"}, - "emergencyServices":{"en":"Emergency Services:","ar":"خدمات الطوارئ"}, "km":{"en":"KMs:","ar":"كم"}, }; diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 04bc88d6..e80d1e83 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -44,27 +44,27 @@ class BaseAppClient { ? body['PatientOutSA'] != null ? body['PatientOutSA'] : PATIENT_OUT_SA : PATIENT_OUT_SA; - if (body.containsKey('isDentalAllowedBackend')) { + // if (body.containsKey('isDentalAllowedBackend')) { body['isDentalAllowedBackend'] = body.containsKey('isDentalAllowedBackend') ? body['isDentalAllowedBackend'] != null ? body['isDentalAllowedBackend'] : IS_DENTAL_ALLOWED_BACKEND : IS_DENTAL_ALLOWED_BACKEND; - } + // } body['DeviceTypeID'] = DeviceTypeID; - if (body.containsKey('PatientType')) { + // if (body.containsKey('PatientType')) { body['PatientType'] = body.containsKey('PatientType') ? body['PatientType'] != null ? body['PatientType'] : PATIENT_TYPE : PATIENT_TYPE; - } + // } - if (body.containsKey('PatientTypeID')) { + // if (body.containsKey('PatientTypeID')) { body['PatientTypeID'] = body.containsKey('PatientTypeID') ? body['PatientTypeID'] != null ? body['PatientTypeID'] : PATIENT_TYPE_ID : PATIENT_TYPE_ID; - } + // } if (user != null) { body['TokenID'] = token; diff --git a/lib/core/service/medical/my_doctor_service.dart b/lib/core/service/medical/my_doctor_service.dart index d688c7e7..4df3ce8a 100644 --- a/lib/core/service/medical/my_doctor_service.dart +++ b/lib/core/service/medical/my_doctor_service.dart @@ -1,7 +1,6 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; import 'package:diplomaticquarterapp/core/model/doctor/reques_patient_doctor_appointmentt.dart'; import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_profile.dart'; import 'package:diplomaticquarterapp/core/model/doctor/request_doctor_rating.dart'; @@ -9,7 +8,7 @@ import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; class MyDoctorService extends BaseService { - List patientDoctorAppointmentList = List(); + List patientDoctorAppointmentList = List(); DoctorProfile doctorProfile; DoctorList doctorList; DoctorRating doctorRating = DoctorRating(); @@ -51,7 +50,7 @@ class MyDoctorService extends BaseService { patientDoctorAppointmentList.clear(); response['PatientDoctorAppointmentResultList'].forEach((hospital) { patientDoctorAppointmentList - .add(PatientDoctorAppointment.fromJson(hospital)); + .add(DoctorList.fromJson(hospital)); }); }, onFailure: (String error, int statusCode) { hasError = true; diff --git a/lib/core/viewModels/medical/my_doctor_view_model.dart b/lib/core/viewModels/medical/my_doctor_view_model.dart index f1db7804..266157ff 100644 --- a/lib/core/viewModels/medical/my_doctor_view_model.dart +++ b/lib/core/viewModels/medical/my_doctor_view_model.dart @@ -2,7 +2,6 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/doctor/doctor_profile.dart'; import 'package:diplomaticquarterapp/core/model/doctor/doctor_rating.dart'; -import 'package:diplomaticquarterapp/core/model/doctor/patient_doctor_appointment.dart'; import 'package:diplomaticquarterapp/core/service/medical/my_doctor_service.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; @@ -65,9 +64,7 @@ class MyDoctorViewModel extends BaseViewModel { .toList(); if (doctorByHospital.length != 0) { - _patientDoctorAppointmentListHospital[ - _patientDoctorAppointmentListHospital - .indexOf(doctorByHospital[0])] + _patientDoctorAppointmentListHospital[_patientDoctorAppointmentListHospital.indexOf(doctorByHospital[0])] .patientDoctorAppointmentList .add(element); } else { diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index 40cdd432..5975daf2 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -9,7 +9,7 @@ import 'package:flutter/cupertino.dart'; class ProjectViewModel extends BaseViewModel { AppSharedPreferences sharedPref = AppSharedPreferences(); Locale _appLocale; - String currentLanguage = 'ar'; + String currentLanguage = 'en'; bool _isArabic = false; bool isInternetConnection = true; bool isLoading = false; @@ -45,7 +45,7 @@ class ProjectViewModel extends BaseViewModel { void loadSharedPrefLanguage() async { currentLanguage = await sharedPref.getString(APP_LANGUAGE); - _appLocale = Locale(currentLanguage ?? 'ar'); + _appLocale = Locale(currentLanguage ?? 'en'); _isArabic = currentLanguage != null ? currentLanguage == 'ar' ? true : false : true; diff --git a/lib/models/Appointments/DoctorListResponse.dart b/lib/models/Appointments/DoctorListResponse.dart index 3b5557bc..65d28910 100644 --- a/lib/models/Appointments/DoctorListResponse.dart +++ b/lib/models/Appointments/DoctorListResponse.dart @@ -85,7 +85,7 @@ class DoctorList { clinicName = json['ClinicName']; doctorTitle = json['DoctorTitle']; iD = json['ID']; - name = json['Name']; + name = json['DoctorName']??json['Name']; projectID = json['ProjectID']; projectName = json['ProjectName']; actualDoctorRate = json['ActualDoctorRate']; @@ -118,7 +118,7 @@ class DoctorList { rateNumber = json['RateNumber']; serviceID = json['ServiceID']; setupID = json['SetupID']; - if (json.containsKey('Speciality')) + if (json.containsKey('Speciality') && json['Speciality']!=null) speciality = json['Speciality'].cast(); workingHours = json['WorkingHours']; } diff --git a/lib/pages/MyAppointments/MyAppointments.dart b/lib/pages/MyAppointments/MyAppointments.dart index 782b5012..8076554e 100644 --- a/lib/pages/MyAppointments/MyAppointments.dart +++ b/lib/pages/MyAppointments/MyAppointments.dart @@ -241,59 +241,62 @@ class _MyAppointmentsState extends State fontSize: 16.0, )), ), - ], - margin: EdgeInsets.only(top: 10.0), - child: Container( - child: widget.bookedAppoList.length != 0 - ? SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: Column( - children: [ - ...List.generate( - widget._patientBookedAppointmentListHospital.length, - (index) => AppExpandableNotifier( - title: widget - ._patientBookedAppointmentListHospital[index] - .filterName, - bodyWidget: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: widget - ._patientBookedAppointmentListHospital[index] - .patientDoctorAppointmentList - .map((doctor) { - return AppointmentCard( - appo: doctor, - onReloadAppointmentHistory: - getPatientAppointmentHistory, - ); - }).toList(), - )), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Container( + child: widget.bookedAppoList.length != 0 + ? SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: Column( + children: [ + ...List.generate( + widget._patientBookedAppointmentListHospital.length, + (index) => AppExpandableNotifier( + title: widget + ._patientBookedAppointmentListHospital[index] + .filterName, + bodyWidget: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: widget + ._patientBookedAppointmentListHospital[index] + .patientDoctorAppointmentList + .map((doctor) { + return AppointmentCard( + appo: doctor, + onReloadAppointmentHistory: + getPatientAppointmentHistory, + ); + }).toList(), + )), + ) + ], + ), + ) + : Container( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + "assets/images/new-design/noAppointmentIcon.png"), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Text("No Booked Appointments", + style: TextStyle( + fontSize: 16.0, + )), + ), + ], + ), + ), + ), + ), ) ], - ), - ) - : Container( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - "assets/images/new-design/noAppointmentIcon.png"), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Text("No Booked Appointments", - style: TextStyle( - fontSize: 16.0, - )), - ), - ], - ), - ), - ), - ), - ); + + )))); } Widget getConfirmedAppointments() { diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 8cfbbbcd..d892be83 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -130,119 +130,119 @@ class _LandingPageState extends State with WidgetsBindingObserver { //_firebase Background message handler _firebaseMessaging.configure( - onMessage: (Map message) async { - showDialog("onMessage: $message"); - print("onMessage: $message"); - print(message); - print(message['name']); - print(message['appointmentdate']); - - if (Platform.isIOS) { - if (message['is_call'] == "true") { - var route = ModalRoute.of(context); - - if (route != null) { - print(route.settings.name); - } - - Map myMap = new Map.from(message); - print(myMap); - LandingPage.isOpenCallPage = true; - LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - if (!isPageNavigated) { - isPageNavigated = true; - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => IncomingCall( - incomingCallData: LandingPage.incomingCallData))) - .then((value) { - isPageNavigated = false; - }); - } - } else { - print("Is Call Not Found iOS"); - } - } else { - print("Is Call Not Found iOS"); - } - - if (Platform.isAndroid) { - if (message['data'].containsKey("is_call")) { - var route = ModalRoute.of(context); - - if (route != null) { - print(route.settings.name); - } - - Map myMap = - new Map.from(message['data']); - print(myMap); - LandingPage.isOpenCallPage = true; - LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - if (!isPageNavigated) { - isPageNavigated = true; - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => IncomingCall( - incomingCallData: LandingPage.incomingCallData))) - .then((value) { - isPageNavigated = false; - }); - } - } else { - print("Is Call Not Found Android"); - } - } else { - print("Is Call Not Found Android"); - } - }, - onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, - onLaunch: (Map message) async { - print("onLaunch: $message"); - showDialog("onLaunch: $message"); - }, - onResume: (Map message) async { - print("onResume: $message"); - print(message); - print(message['name']); - print(message['appointmentdate']); - - showDialog("onResume: $message"); - - if (Platform.isIOS) { - if (message['is_call'] == "true") { - var route = ModalRoute.of(context); - - if (route != null) { - print(route.settings.name); - } - - Map myMap = - new Map.from(message); - print(myMap); - LandingPage.isOpenCallPage = true; - LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - if (!isPageNavigated) { - isPageNavigated = true; - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => IncomingCall( - incomingCallData: LandingPage.incomingCallData))) - .then((value) { - isPageNavigated = false; - }); - } - } else { - print("Is Call Not Found iOS"); - } - } else { - print("Is Call Not Found iOS"); - } - }, - ); + // onMessage: (Map message) async { + // showDialog("onMessage: $message"); + // print("onMessage: $message"); + // print(message); + // print(message['name']); + // print(message['appointmentdate']); + // + // if (Platform.isIOS) { + // if (message['is_call'] == "true") { + // var route = ModalRoute.of(context); + // + // if (route != null) { + // print(route.settings.name); + // } + // + // Map myMap = new Map.from(message); + // print(myMap); + // LandingPage.isOpenCallPage = true; + // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); + // if (!isPageNavigated) { + // isPageNavigated = true; + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => IncomingCall( + // incomingCallData: LandingPage.incomingCallData))) + // .then((value) { + // isPageNavigated = false; + // }); + // } + // } else { + // print("Is Call Not Found iOS"); + // } + // } else { + // print("Is Call Not Found iOS"); + // } + // + // if (Platform.isAndroid) { + // if (message['data'].containsKey("is_call")) { + // var route = ModalRoute.of(context); + // + // if (route != null) { + // print(route.settings.name); + // } + // + // Map myMap = + // new Map.from(message['data']); + // print(myMap); + // LandingPage.isOpenCallPage = true; + // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); + // if (!isPageNavigated) { + // isPageNavigated = true; + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => IncomingCall( + // incomingCallData: LandingPage.incomingCallData))) + // .then((value) { + // isPageNavigated = false; + // }); + // } + // } else { + // print("Is Call Not Found Android"); + // } + // } else { + // print("Is Call Not Found Android"); + // } + // }, + // onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, + // onLaunch: (Map message) async { + // print("onLaunch: $message"); + // showDialog("onLaunch: $message"); + // }, + // onResume: (Map message) async { + // print("onResume: $message"); + // print(message); + // print(message['name']); + // print(message['appointmentdate']); + // + // showDialog("onResume: $message"); + // + // if (Platform.isIOS) { + // if (message['is_call'] == "true") { + // var route = ModalRoute.of(context); + // + // if (route != null) { + // print(route.settings.name); + // } + // + // Map myMap = + // new Map.from(message); + // print(myMap); + // LandingPage.isOpenCallPage = true; + // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); + // if (!isPageNavigated) { + // isPageNavigated = true; + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => IncomingCall( + // incomingCallData: LandingPage.incomingCallData))) + // .then((value) { + // isPageNavigated = false; + // }); + // } + // } else { + // print("Is Call Not Found iOS"); + // } + // } else { + // print("Is Call Not Found iOS"); + // } + // }, + ); } showDialog(String message) { diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart index 456b0bcb..7a01ef90 100644 --- a/lib/pages/medical/doctor/doctor_home_page.dart +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -89,7 +89,7 @@ class DoctorHomePage extends StatelessWidget { doctorRate: doctor.doctorRate, gender: doctor.gender, doctorTitle: doctor.doctorTitle, - name: doctor.doctorName, + name: doctor.name, doctorImageURL: doctor.doctorImageURL, nationalityFlagURL: doctor.nationalityFlagURL); return DoctorView(