From 06416b49345000080c8955eca05b79cf2a66baa6 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Sun, 11 Oct 2020 14:32:14 +0300 Subject: [PATCH] add Not authenticated Page --- assets/images/Wifi-AR.png | Bin 0 -> 18245 bytes assets/images/wifi-EN.png | Bin 0 -> 19261 bytes lib/config/config.dart | 4 +- lib/config/localized_values.dart | 11 +- lib/core/enum/Ambulate.dart | 41 +++- lib/core/enum/OrderService.dart | 22 ++ lib/core/model/er/PickUpRequestPresOrder.dart | 204 ++++++++++++++++++ lib/core/service/client/base_app_client.dart | 4 +- lib/core/service/er/am_service.dart | 49 ++++- lib/core/service/medical/medical_service.dart | 19 ++ lib/core/viewModels/base_view_model.dart | 1 + .../viewModels/er/am_request_view_model.dart | 30 ++- .../viewModels/medical/labs_view_model.dart | 86 ++++---- .../medical/medical_view_model.dart | 19 +- lib/pages/ErService/AmbulanceReq.dart | 21 +- .../AmbulanceRequestIndex.dart | 8 +- .../BillAmount.dart | 19 +- .../PickupLocation.dart | 200 ++++++++++++----- .../SelectTransportationMethod.dart | 23 +- .../Summary.dart | 0 lib/pages/ErService/OrderLogPage.dart | 62 ++++++ lib/pages/base/base_view.dart | 4 +- lib/pages/landing/home_page.dart | 1 + lib/pages/login/confirm-login.dart | 1 + lib/pages/login/forgot-password.dart | 1 + lib/pages/login/login-type.dart | 1 + lib/pages/login/login.dart | 1 + lib/pages/login/register-info.dart | 1 + lib/pages/login/register.dart | 1 + lib/pages/login/welcome.dart | 1 + lib/pages/medical/labs/labs_home_page.dart | 1 + lib/pages/medical/medical_profile_page.dart | 1 + .../radiology/radiology_home_page.dart | 1 + lib/uitl/ProgressDialog.dart | 32 ++- lib/uitl/translations_delegate_base.dart | 4 + lib/widgets/others/OrderLogItem.dart | 32 +++ lib/widgets/others/app_scaffold_widget.dart | 95 ++++---- lib/widgets/others/not_auh_page.dart | 79 +++++++ pubspec.yaml | 3 + 39 files changed, 884 insertions(+), 199 deletions(-) create mode 100644 assets/images/Wifi-AR.png create mode 100644 assets/images/wifi-EN.png create mode 100644 lib/core/enum/OrderService.dart create mode 100644 lib/core/model/er/PickUpRequestPresOrder.dart rename lib/pages/ErService/{ => AmbulanceRequestIndexPages}/AmbulanceRequestIndex.dart (89%) rename lib/pages/ErService/{ => AmbulanceRequestIndexPages}/BillAmount.dart (96%) rename lib/pages/ErService/{ => AmbulanceRequestIndexPages}/PickupLocation.dart (67%) rename lib/pages/ErService/{ => AmbulanceRequestIndexPages}/SelectTransportationMethod.dart (92%) rename lib/pages/ErService/{ => AmbulanceRequestIndexPages}/Summary.dart (100%) create mode 100644 lib/pages/ErService/OrderLogPage.dart create mode 100644 lib/widgets/others/OrderLogItem.dart create mode 100644 lib/widgets/others/not_auh_page.dart diff --git a/assets/images/Wifi-AR.png b/assets/images/Wifi-AR.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e2d9af3fd23ab15c89bc14bb4602cf257c7567 GIT binary patch literal 18245 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 literal 0 HcmV?d00001 diff --git a/assets/images/wifi-EN.png b/assets/images/wifi-EN.png new file mode 100644 index 0000000000000000000000000000000000000000..5711925c73665a7cbccd0bba985c4b9acafad527 GIT binary patch literal 19261 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 jfq{X6fnh}9{{> localizedValues = { "All":{"en":"All","ar":"الكل"}, "QuestionHere":{"en":"Enter the question here...","ar":"اضف الاستفسار هنا"}, "ViewDoctorResponses":{"en":"View Doctor Responses","ar":"الاطلاع على ردود الأطباء"}, - + "ServiceInformationButton":{"en":"LOGIN / REGISTER","ar":"دخول / تسجيل"}, + "ServiceInformationTitle":{"en":"Service Information","ar":"معلومات الخدمة"}, + "info-lab": { + "en": "This service allows you to view the results of all laboratory tests performed in Al Habib Medical Group as well as sending the report via e-mail.", + "ar": "خدمة نتائج المختبر: هذه الخدمة تمكنك من الاطلاع على نتائج جميع الفحوصات المخبرية التي تمت في مجموعة الحبيب الطبية." + }, + "info-radiology": { + "en": "This service allows you to view the reports and photos of radiology in Al Habib Medical Group as well as send the report by e-mail.", + "ar": "خدمة الاشعة: هذه الخدمة تمكنك من الاطلاع على تقارير وصور الاشعة التي تمت في مجموعة الحبيب الطبية وكذلك ارسال التقرير عن طريق الايميل." + }, }; diff --git a/lib/core/enum/Ambulate.dart b/lib/core/enum/Ambulate.dart index 059a281c..f8b2e8be 100644 --- a/lib/core/enum/Ambulate.dart +++ b/lib/core/enum/Ambulate.dart @@ -6,22 +6,55 @@ extension SelectedAmbulate on Ambulate { String getAmbulateTitle(BuildContext context) { switch (this) { case Ambulate.Wheelchair: - // TODO: Handle this case. return 'Wheelchair'; break; case Ambulate.Walker: - // TODO: Handle this case. return 'Walker'; break; case Ambulate.Stretcher: - // TODO: Handle this case. return 'Stretcher'; break; case Ambulate.None: - // TODO: Handle this case. return 'None'; break; } return 'None'; } + + int selectAmbulateNumber() { + switch (this) { + case Ambulate.Wheelchair: + return 0; + break; + case Ambulate.Walker: + return 1; + break; + case Ambulate.Stretcher: + return 2; + break; + case Ambulate.None: + return 3; + break; + } + return 3; + } + + Ambulate getAmbulateById(int id) { + switch (id) { + case 0: + return Ambulate.Wheelchair; + break; + case 1: + return Ambulate.Walker; + break; + case 2: + return Ambulate.Stretcher; + break; + case 3: + return Ambulate.None; + break; + } + + return Ambulate.None; + } } diff --git a/lib/core/enum/OrderService.dart b/lib/core/enum/OrderService.dart new file mode 100644 index 00000000..e6ce24eb --- /dev/null +++ b/lib/core/enum/OrderService.dart @@ -0,0 +1,22 @@ +enum OrderService { AMBULANCE } + +extension SelectedOrderService on OrderService { + int getIdOrderService() { + switch (this) { + case OrderService.AMBULANCE: + return 4; + break; + } + return 4; + } + + OrderService getOrderServiceById(int id) { + switch (id) { + case 4: + return OrderService.AMBULANCE; + break; + } + + return OrderService.AMBULANCE; + } +} diff --git a/lib/core/model/er/PickUpRequestPresOrder.dart b/lib/core/model/er/PickUpRequestPresOrder.dart new file mode 100644 index 00000000..9ce3e678 --- /dev/null +++ b/lib/core/model/er/PickUpRequestPresOrder.dart @@ -0,0 +1,204 @@ +class PickUpRequestPresOrder { + int id; + int presOrderID; + String createDate; + String lastEditDate; + int createdBy; + int lastEditBy; + bool isActive; + String requestNo; + int requesterId; + int direction; + bool haveAppointment; + dynamic appointmentId; + int tripType; + int pickupUrgency; + String pickupDateTime; + dynamic pickupLocationId; + int pickupSpot; + dynamic dropoffLocationId; + int transportationMethodId; + int cost; + double vAT; + double totalPrice; + int amountCollected; + int selectedAmbulate; + String requesterNote; + int status; + int paymentStatus; + dynamic rejectReason; + int visibility; + dynamic durationId; + dynamic imageId; + String requesterFileNo; + String requesterMobileNo; + bool requesterIsOutSA; + String pickupLocationLongitude; + String pickupLocationLattitude; + String dropoffLocationLongitude; + String dropoffLocationLattitude; + dynamic appointmentClinicName; + dynamic appointmentDoctorName; + dynamic appointmentBranch; + dynamic appointmentTime; + String pickupLocationName; + String dropoffLocationName; + String title; + String titleAR; + String ambulateDescription; + String ambulateDescriptionN; + + PickUpRequestPresOrder( + {this.id, + this.presOrderID, + this.createDate, + this.lastEditDate, + this.createdBy, + this.lastEditBy, + this.isActive, + this.requestNo, + this.requesterId, + this.direction, + this.haveAppointment, + this.appointmentId, + this.tripType, + this.pickupUrgency, + this.pickupDateTime, + this.pickupLocationId, + this.pickupSpot, + this.dropoffLocationId, + this.transportationMethodId, + this.cost, + this.vAT, + this.totalPrice, + this.amountCollected, + this.selectedAmbulate, + this.requesterNote, + this.status, + this.paymentStatus, + this.rejectReason, + this.visibility, + this.durationId, + this.imageId, + this.requesterFileNo, + this.requesterMobileNo, + this.requesterIsOutSA, + this.pickupLocationLongitude, + this.pickupLocationLattitude, + this.dropoffLocationLongitude, + this.dropoffLocationLattitude, + this.appointmentClinicName, + this.appointmentDoctorName, + this.appointmentBranch, + this.appointmentTime, + this.pickupLocationName, + this.dropoffLocationName, + this.title, + this.titleAR, + this.ambulateDescription, + this.ambulateDescriptionN}); + + PickUpRequestPresOrder.fromJson(Map json) { + id = json['Id']; + presOrderID = json['PresOrderID']; + createDate = json['CreateDate']; + lastEditDate = json['LastEditDate']; + createdBy = json['CreatedBy']; + lastEditBy = json['LastEditBy']; + isActive = json['IsActive']; + requestNo = json['RequestNo']; + requesterId = json['RequesterId']; + direction = json['Direction']; + haveAppointment = json['HaveAppointment']; + appointmentId = json['AppointmentId']; + tripType = json['TripType']; + pickupUrgency = json['PickupUrgency']; + pickupDateTime = json['PickupDateTime']; + pickupLocationId = json['PickupLocationId']; + pickupSpot = json['PickupSpot']; + dropoffLocationId = json['DropoffLocationId']; + transportationMethodId = json['TransportationMethodId']; + cost = json['Cost']; + vAT = json['VAT']; + totalPrice = json['TotalPrice']; + amountCollected = json['AmountCollected']; + selectedAmbulate = json['SelectedAmbulate']; + requesterNote = json['RequesterNote']; + status = json['Status']; + paymentStatus = json['PaymentStatus']; + rejectReason = json['RejectReason']; + visibility = json['Visibility']; + durationId = json['DurationId']; + imageId = json['ImageId']; + requesterFileNo = json['RequesterFileNo']; + requesterMobileNo = json['RequesterMobileNo']; + requesterIsOutSA = json['RequesterIsOutSA']; + pickupLocationLongitude = json['PickupLocationLongitude']; + pickupLocationLattitude = json['PickupLocationLattitude']; + dropoffLocationLongitude = json['DropoffLocationLongitude']; + dropoffLocationLattitude = json['DropoffLocationLattitude']; + appointmentClinicName = json['AppointmentClinicName']; + appointmentDoctorName = json['AppointmentDoctorName']; + appointmentBranch = json['AppointmentBranch']; + appointmentTime = json['AppointmentTime']; + pickupLocationName = json['PickupLocationName']; + dropoffLocationName = json['DropoffLocationName']; + title = json['Title']; + titleAR = json['TitleAR']; + ambulateDescription = json['AmbulateDescription']; + ambulateDescriptionN = json['AmbulateDescriptionN']; + } + + Map toJson() { + final Map data = new Map(); + data['Id'] = this.id; + data['PresOrderID'] = this.presOrderID; + data['CreateDate'] = this.createDate; + data['LastEditDate'] = this.lastEditDate; + data['CreatedBy'] = this.createdBy; + data['LastEditBy'] = this.lastEditBy; + data['IsActive'] = this.isActive; + data['RequestNo'] = this.requestNo; + data['RequesterId'] = this.requesterId; + data['Direction'] = this.direction; + data['HaveAppointment'] = this.haveAppointment; + data['AppointmentId'] = this.appointmentId; + data['TripType'] = this.tripType; + data['PickupUrgency'] = this.pickupUrgency; + data['PickupDateTime'] = this.pickupDateTime; + data['PickupLocationId'] = this.pickupLocationId; + data['PickupSpot'] = this.pickupSpot; + data['DropoffLocationId'] = this.dropoffLocationId; + data['TransportationMethodId'] = this.transportationMethodId; + data['Cost'] = this.cost; + data['VAT'] = this.vAT; + data['TotalPrice'] = this.totalPrice; + data['AmountCollected'] = this.amountCollected; + data['SelectedAmbulate'] = this.selectedAmbulate; + data['RequesterNote'] = this.requesterNote; + data['Status'] = this.status; + data['PaymentStatus'] = this.paymentStatus; + data['RejectReason'] = this.rejectReason; + data['Visibility'] = this.visibility; + data['DurationId'] = this.durationId; + data['ImageId'] = this.imageId; + data['RequesterFileNo'] = this.requesterFileNo; + data['RequesterMobileNo'] = this.requesterMobileNo; + data['RequesterIsOutSA'] = this.requesterIsOutSA; + data['PickupLocationLongitude'] = this.pickupLocationLongitude; + data['PickupLocationLattitude'] = this.pickupLocationLattitude; + data['DropoffLocationLongitude'] = this.dropoffLocationLongitude; + data['DropoffLocationLattitude'] = this.dropoffLocationLattitude; + data['AppointmentClinicName'] = this.appointmentClinicName; + data['AppointmentDoctorName'] = this.appointmentDoctorName; + data['AppointmentBranch'] = this.appointmentBranch; + data['AppointmentTime'] = this.appointmentTime; + data['PickupLocationName'] = this.pickupLocationName; + data['DropoffLocationName'] = this.dropoffLocationName; + data['Title'] = this.title; + data['TitleAR'] = this.titleAR; + data['AmbulateDescription'] = this.ambulateDescription; + data['AmbulateDescriptionN'] = this.ambulateDescriptionN; + return data; + } +} diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index f5494049..4ad8de79 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -15,7 +15,7 @@ AppSharedPreferences sharedPref = new AppSharedPreferences(); ///await BaseAppClient.post('', /// onSuccess: (dynamic response, int statusCode) {}, /// onFailure: (String error, int statusCode) {}, -/// body: null); +/// body: Map(); class BaseAppClient { post(String endPoint, @@ -78,7 +78,7 @@ class BaseAppClient { print("URL : $url"); print("Body : ${json.encode(body)}"); - var asd=""; + if (await Utils.checkConnection()) { final response = await http.post(url.trim(), body: json.encode(body), diff --git a/lib/core/service/er/am_service.dart b/lib/core/service/er/am_service.dart index b6a91871..b654e0eb 100644 --- a/lib/core/service/er/am_service.dart +++ b/lib/core/service/er/am_service.dart @@ -1,23 +1,30 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientAllPresOrders.dart'; +import 'package:diplomaticquarterapp/core/model/er/PickUpRequestPresOrder.dart'; import 'package:diplomaticquarterapp/core/model/er/get_all_transportation_method_list_model.dart'; import '../base_service.dart'; class AmService extends BaseService { List amModelList = List(); List patientAllPresOrdersList = List(); + bool hasPendingOrder = false; + int pendingOrderID = 0; + String pendingOrderStatus = ""; + String pendingOrderStatusAR = ""; + PickUpRequestPresOrder pickUpRequestPresOrder; Future getAllTransportationOrders() async { hasError = false; Map body = Map(); - body['isDentalAllowedBackend']= false; + body['isDentalAllowedBackend'] = false; body['IdentificationNo'] = user.patientIdentificationNo; await baseAppClient.post(GET_AMBULANCE_REQUEST, onSuccess: (dynamic response, int statusCode) { - amModelList.clear(); - response['PatientER_RRT_GetAllTransportationMethodList'].forEach((vital) { - amModelList.add(PatientERTransportationMethod.fromJson(vital)); + amModelList.clear(); + response['PatientER_RRT_GetAllTransportationMethodList'].forEach((item) { + amModelList.add(PatientERTransportationMethod.fromJson(item)); }); }, onFailure: (String error, int statusCode) { hasError = true; @@ -27,11 +34,39 @@ class AmService extends BaseService { Future getPatientAllPresOrdersList() async { hasError = false; + hasPendingOrder = false; await baseAppClient.post(GET_PATIENT_ALL_PRES_ORDERS, onSuccess: (dynamic response, int statusCode) { - patientAllPresOrdersList.clear(); - response['PatientER_GetPatientAllPresOrdersList'].forEach((vital) { - patientAllPresOrdersList.add(PatientAllPresOrders.fromJson(vital)); + patientAllPresOrdersList.clear(); + response['PatientER_GetPatientAllPresOrdersList'].forEach((item) { + if (item['ServiceID'] == OrderService.AMBULANCE.getIdOrderService()) { + var order = PatientAllPresOrders.fromJson(item); + patientAllPresOrdersList.add(order); + if (order.status == 1) { + hasPendingOrder = true; + pendingOrderID = order.iD; + pendingOrderStatus = order.description; + pendingOrderStatusAR = order.descriptionN; + } + } + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: Map()); + } + + Future getOrderDetails() async { + hasError = false; + hasPendingOrder = false; + Map body = Map(); + body['PresOrderID'] = pendingOrderID; + await baseAppClient.post(GET_PICK_UP_REQUEST_BY_PRES_ORDER_ID, + onSuccess: (dynamic response, int statusCode) { + patientAllPresOrdersList.clear(); + response['PatientER_RRT_GetPickUpRequestByPresOrderIDList'] + .forEach((item) { + pickUpRequestPresOrder = PickUpRequestPresOrder.fromJson(item); }); }, onFailure: (String error, int statusCode) { hasError = true; diff --git a/lib/core/service/medical/medical_service.dart b/lib/core/service/medical/medical_service.dart index 572e5096..f90280cf 100644 --- a/lib/core/service/medical/medical_service.dart +++ b/lib/core/service/medical/medical_service.dart @@ -1,6 +1,8 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; +import 'package:flutter/cupertino.dart'; class MedicalService extends BaseService { List appoitmentAllHistoryResultList = List(); @@ -26,4 +28,21 @@ class MedicalService extends BaseService { super.error = error; }, body: body); } + + addAmbulanceRequest({@required PatientER patientER}) async { + hasError = false; + super.error = ""; + Map body = Map(); + body['RequesterFileNo'] = user.patientID; + body['RequesterMobileNo'] = user.mobileNumber; + body['RequesterIsOutSA'] = user.outSA; + await baseAppClient.post(GET_PATIENT_APPOINTMENT_HISTORY, + onSuccess: (response, statusCode) async { + + + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } } diff --git a/lib/core/viewModels/base_view_model.dart b/lib/core/viewModels/base_view_model.dart index 7e16d22d..18ab02e3 100644 --- a/lib/core/viewModels/base_view_model.dart +++ b/lib/core/viewModels/base_view_model.dart @@ -18,6 +18,7 @@ class BaseViewModel extends ChangeNotifier { AuthenticatedUser user; AppSharedPreferences sharedPref = AppSharedPreferences(); + AuthenticatedUserObject authenticatedUserObject = locator(); void setState(ViewState viewState) { _state = viewState; diff --git a/lib/core/viewModels/er/am_request_view_model.dart b/lib/core/viewModels/er/am_request_view_model.dart index a5261456..fbd3d95d 100644 --- a/lib/core/viewModels/er/am_request_view_model.dart +++ b/lib/core/viewModels/er/am_request_view_model.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientAllPresOrders.dart'; import 'package:diplomaticquarterapp/core/model/er/get_all_transportation_method_list_model.dart'; +import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/service/er/am_service.dart'; import 'package:diplomaticquarterapp/core/service/hospital_service.dart'; import 'package:diplomaticquarterapp/core/service/medical/medical_service.dart'; @@ -14,17 +15,22 @@ class AmRequestViewModel extends BaseViewModel { HospitalService _hospitalService = locator(); MedicalService _medicalService = locator(); - List - get amRequestModeList => _amService.amModelList; + List get amRequestModeList => + _amService.amModelList; - List get patientAllPresOrdersList =>_amService.patientAllPresOrdersList; + List get patientAllPresOrdersList => + _amService.patientAllPresOrdersList; List get appoitmentAllHistoryResultList => _medicalService.appoitmentAllHistoryResultList; + List get hospitals => _hospitalService.hospitals; + + bool get hasPendingOrder =>_amService.hasPendingOrder; + Future getAppointmentHistory() async { setState(ViewState.BusyLocal); - await _medicalService.getAppointmentHistory(isActiveAppointment: true); + await _medicalService.getAppointmentHistory(isActiveAppointment: true); if (_medicalService.hasError) { error = _medicalService.error; setState(ViewState.ErrorLocal); @@ -32,8 +38,6 @@ class AmRequestViewModel extends BaseViewModel { setState(ViewState.Idle); } - - Future getAmRequestOrders() async { setState(ViewState.Busy); await _amService.getAllTransportationOrders(); @@ -54,9 +58,21 @@ class AmRequestViewModel extends BaseViewModel { getPatientAllPresOrdersList(); } - Future getPatientAllPresOrdersList()async{ + Future getPatientAllPresOrdersList() async { setState(ViewState.Busy); await _amService.getPatientAllPresOrdersList(); + if (_hospitalService.hasError) { + error = _hospitalService.error; + setState(ViewState.Error); + } else if (_amService.hasPendingOrder) { + getOrderDetails(); + } else + setState(ViewState.Idle); + } + + Future getOrderDetails() async { + setState(ViewState.Busy); + await _amService.getOrderDetails(); if (_hospitalService.hasError) { error = _hospitalService.error; setState(ViewState.Error); diff --git a/lib/core/viewModels/medical/labs_view_model.dart b/lib/core/viewModels/medical/labs_view_model.dart index 032aeb1e..8cbf0efc 100644 --- a/lib/core/viewModels/medical/labs_view_model.dart +++ b/lib/core/viewModels/medical/labs_view_model.dart @@ -21,52 +21,54 @@ class LabsViewModel extends BaseViewModel { : _patientLabOrdersListHospital; void getLabs() async { - setState(ViewState.Busy); - await _labsService.getPatientLabOrdersList(); - if (_labsService.hasError) { - error = _labsService.error; - setState(ViewState.Error); - } else { - _labsService.patientLabOrdersList.forEach((element) { - List patientLabOrdersClinic = - _patientLabOrdersListClinic - .where((elementClinic) => - elementClinic.filterName == element.clinicDescription) - .toList(); + if (authenticatedUserObject.isLogin) { + setState(ViewState.Busy); + await _labsService.getPatientLabOrdersList(); + if (_labsService.hasError) { + error = _labsService.error; + setState(ViewState.Error); + } else { + _labsService.patientLabOrdersList.forEach((element) { + List patientLabOrdersClinic = + _patientLabOrdersListClinic + .where((elementClinic) => + elementClinic.filterName == element.clinicDescription) + .toList(); - if (patientLabOrdersClinic.length != 0) { - _patientLabOrdersListClinic[_patientLabOrdersListClinic - .indexOf(patientLabOrdersClinic[0])] - .patientLabOrdersList - .add(element); - } else { - _patientLabOrdersListClinic.add(PatientLabOrdersList( - filterName: element.clinicDescription, - patientDoctorAppointment: element)); - } + if (patientLabOrdersClinic.length != 0) { + _patientLabOrdersListClinic[_patientLabOrdersListClinic + .indexOf(patientLabOrdersClinic[0])] + .patientLabOrdersList + .add(element); + } else { + _patientLabOrdersListClinic.add(PatientLabOrdersList( + filterName: element.clinicDescription, + patientDoctorAppointment: element)); + } - // doctor list sort via project - List patientLabOrdersHospital = - _patientLabOrdersListHospital - .where( - (elementClinic) => - elementClinic.filterName == element.projectName, - ) - .toList(); + // doctor list sort via project + List patientLabOrdersHospital = + _patientLabOrdersListHospital + .where( + (elementClinic) => + elementClinic.filterName == element.projectName, + ) + .toList(); - if (patientLabOrdersHospital.length != 0) { - _patientLabOrdersListHospital[_patientLabOrdersListHospital - .indexOf(patientLabOrdersHospital[0])] - .patientLabOrdersList - .add(element); - } else { - _patientLabOrdersListHospital.add(PatientLabOrdersList( - filterName: element.projectName, - patientDoctorAppointment: element)); - } - }); + if (patientLabOrdersHospital.length != 0) { + _patientLabOrdersListHospital[_patientLabOrdersListHospital + .indexOf(patientLabOrdersHospital[0])] + .patientLabOrdersList + .add(element); + } else { + _patientLabOrdersListHospital.add(PatientLabOrdersList( + filterName: element.projectName, + patientDoctorAppointment: element)); + } + }); - setState(ViewState.Idle); + setState(ViewState.Idle); + } } } diff --git a/lib/core/viewModels/medical/medical_view_model.dart b/lib/core/viewModels/medical/medical_view_model.dart index fa330aad..4563f615 100644 --- a/lib/core/viewModels/medical/medical_view_model.dart +++ b/lib/core/viewModels/medical/medical_view_model.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/service/medical/medical_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; @@ -11,13 +12,15 @@ class MedicalViewModel extends BaseViewModel { _medicalService.appoitmentAllHistoryResultList; getAppointmentHistory() async { - setState(ViewState.Busy); - if (_medicalService.appoitmentAllHistoryResultList.length == 0) - await _medicalService.getAppointmentHistory(); - if (_medicalService.hasError) { - error = _medicalService.error; - setState(ViewState.Error); - } else - setState(ViewState.Idle); + if (authenticatedUserObject.isLogin) { + setState(ViewState.Busy); + if (_medicalService.appoitmentAllHistoryResultList.length == 0) + await _medicalService.getAppointmentHistory(); + if (_medicalService.hasError) { + error = _medicalService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } } } diff --git a/lib/pages/ErService/AmbulanceReq.dart b/lib/pages/ErService/AmbulanceReq.dart index c50093be..ec96f482 100644 --- a/lib/pages/ErService/AmbulanceReq.dart +++ b/lib/pages/ErService/AmbulanceReq.dart @@ -10,7 +10,8 @@ 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 'AmbulanceRequestIndex.dart'; +import 'AmbulanceRequestIndexPages/AmbulanceRequestIndex.dart'; +import 'OrderLogPage.dart'; class AmbulanceReq extends StatefulWidget { @override @@ -26,11 +27,13 @@ class _AmbulanceReqState extends State super.initState(); _tabController = TabController(length: 2, vsync: this); } + @override void dispose() { super.dispose(); _tabController.dispose(); } + @override Widget build(BuildContext context) { return BaseView( @@ -80,13 +83,14 @@ class _AmbulanceReqState extends State indicatorColor: Colors.red[800], labelColor: Theme.of(context).primaryColor, labelPadding: - EdgeInsets.only(top: 4.0, left: 18.0, right: 18.0), + EdgeInsets.only(top: 4.0, left: 18.0, right: 18.0), unselectedLabelColor: Colors.grey[800], tabs: [ Container( width: MediaQuery.of(context).size.width * 0.40, child: Center( - child: Texts("Ambulance Request"),//TranslationBase.of(context).prescriptions + child: Texts( + "Ambulance Request"), //TranslationBase.of(context).prescriptions ), ), Container( @@ -110,8 +114,14 @@ class _AmbulanceReqState extends State physics: BouncingScrollPhysics(), controller: _tabController, children: [ - AmbulanceRequestIndex(amRequestViewModel: model,), - Container() + model.hasPendingOrder + ? Container() + : AmbulanceRequestIndexPage( + amRequestViewModel: model, + ), + OrderLogPage( + amRequestViewModel: model, + ) ], ), ) @@ -121,5 +131,4 @@ class _AmbulanceReqState extends State ), ); } - } diff --git a/lib/pages/ErService/AmbulanceRequestIndex.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/AmbulanceRequestIndex.dart similarity index 89% rename from lib/pages/ErService/AmbulanceRequestIndex.dart rename to lib/pages/ErService/AmbulanceRequestIndexPages/AmbulanceRequestIndex.dart index 16d07b88..55e75e22 100644 --- a/lib/pages/ErService/AmbulanceRequestIndex.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/AmbulanceRequestIndex.dart @@ -9,16 +9,16 @@ import 'PickupLocation.dart'; import 'SelectTransportationMethod.dart'; import 'Summary.dart'; -class AmbulanceRequestIndex extends StatefulWidget { +class AmbulanceRequestIndexPage extends StatefulWidget { final AmRequestViewModel amRequestViewModel; - AmbulanceRequestIndex({Key key, this.amRequestViewModel}); + AmbulanceRequestIndexPage({Key key, this.amRequestViewModel}); @override - _AmbulanceRequestIndexState createState() => _AmbulanceRequestIndexState(); + _AmbulanceRequestIndexPageState createState() => _AmbulanceRequestIndexPageState(); } -class _AmbulanceRequestIndexState extends State { +class _AmbulanceRequestIndexPageState extends State { int currentIndex = 0; PageController pageController; PatientER _patientER = PatientER(); diff --git a/lib/pages/ErService/BillAmount.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart similarity index 96% rename from lib/pages/ErService/BillAmount.dart rename to lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart index 44e17c3a..cc6af0f2 100644 --- a/lib/pages/ErService/BillAmount.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/BillAmount.dart @@ -26,6 +26,22 @@ class BillAmount extends StatefulWidget { class _BillAmountState extends State { Ambulate _ambulate = Ambulate.None; String note =""; + + + @override + void initState() { + + if(widget.patientER.ambulate!=null) + { + setState(() { + _ambulate = widget.patientER.ambulate; + note = widget.patientER.requesterNote; + }); + } + super.initState(); + } + + @override Widget build(BuildContext context) { return SingleChildScrollView( @@ -278,7 +294,7 @@ class _BillAmountState extends State { color: Colors.white, ), child: ListTile( - title: Text('Walker'), + title: Text('None'), leading: Radio( value: Ambulate.None, groupValue: _ambulate, @@ -320,6 +336,7 @@ class _BillAmountState extends State { setState(() { widget.patientER.ambulate = _ambulate; widget.patientER.requesterNote = note; + widget.patientER.selectedAmbulate = _ambulate.selectAmbulateNumber(); widget.changeCurrentTab(3); }); }, diff --git a/lib/pages/ErService/PickupLocation.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart similarity index 67% rename from lib/pages/ErService/PickupLocation.dart rename to lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart index 4b32c9bb..795f4dcc 100644 --- a/lib/pages/ErService/PickupLocation.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart @@ -1,9 +1,12 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; +import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart'; +import 'package:diplomaticquarterapp/pages/Blood/dialogs/SelectHospitalDialog.dart'; import 'package:diplomaticquarterapp/pages/ErService/widgets/AppointmentCard.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page.dart'; +import 'package:diplomaticquarterapp/uitl/ProgressDialog.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; @@ -15,8 +18,8 @@ import 'package:geolocator/geolocator.dart'; import 'package:google_maps_place_picker/google_maps_place_picker.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'AmbulanceReq.dart'; -import 'AvailableAppointmentsPage.dart'; +import '../AmbulanceReq.dart'; +import '../AvailableAppointmentsPage.dart'; enum HaveAppointment { YES, NO } @@ -41,6 +44,8 @@ class _PickupLocationState extends State { double _latitude; double _longitude; AppoitmentAllHistoryResultList myAppointment; + HospitalsModel _selectedHospital; + PickResult _result; @override void initState() { @@ -142,7 +147,7 @@ class _PickupLocationState extends State { Expanded( child: InkWell( onTap: () { - if(myAppointment == null) { + if (myAppointment == null) { getAppointment(); setState(() { _haveAppointment = HaveAppointment.YES; @@ -164,13 +169,12 @@ class _PickupLocationState extends State { groupValue: _haveAppointment, activeColor: Colors.red[800], onChanged: (value) { - if(myAppointment == null) { + if (myAppointment == null) { getAppointment(); setState(() { _haveAppointment = value; }); } - }, ), ), @@ -212,18 +216,18 @@ class _PickupLocationState extends State { ), ], ), - - if(myAppointment!=null) + if (myAppointment != null) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: 12, ), - AppointmentCard(appointment: myAppointment,) + AppointmentCard( + appointment: myAppointment, + ) ], ), - SizedBox( height: 12, ), @@ -231,29 +235,35 @@ class _PickupLocationState extends State { SizedBox( height: 8, ), - Container( - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: Colors.grey, width: 0.5), - color: Colors.white, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts('Pickup Location'), - Icon( - Icons.arrow_drop_down, - size: 24, - color: Colors.black, - ) - ], + InkWell( + onTap: () { + confirmSelectHospitalDialog( + widget.amRequestViewModel.hospitals); + }, + child: Container( + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.grey, width: 0.5), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(getHospitalName('Pickup Location')), + Icon( + Icons.arrow_drop_down, + size: 24, + color: Colors.black, + ) + ], + ), ), ), ], ), - if (widget.patientER.direction == 2) + if (widget.patientER.direction == 1) Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -261,6 +271,39 @@ class _PickupLocationState extends State { SizedBox( height: 15, ), + InkWell( + onTap: () { + confirmSelectHospitalDialog( + widget.amRequestViewModel.hospitals); + }, + child: Container( + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.grey, width: 0.5), + color: Colors.white, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(getHospitalName('Pickup Location')), + Icon( + Icons.arrow_drop_down, + size: 24, + color: Colors.black, + ) + ], + ), + ), + ), + SizedBox( + height: 12, + ), + Texts('Drop off Location'), + SizedBox( + height: 8, + ), InkWell( onTap: () { Navigator.push( @@ -271,6 +314,9 @@ class _PickupLocationState extends State { // Put YOUR OWN KEY here. onPlacePicked: (PickResult result) { print(result.adrAddress); + setState(() { + _result = result; + }); Navigator.of(context).pop(); }, initialPosition: LatLng(_latitude, _longitude), @@ -290,9 +336,9 @@ class _PickupLocationState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Texts('Pickup Location'), + Texts('Select From Map'), Icon( - Icons.arrow_drop_down, + FontAwesomeIcons.mapMarkerAlt, size: 24, color: Colors.black, ) @@ -300,33 +346,6 @@ class _PickupLocationState extends State { ), ), ), - SizedBox( - height: 12, - ), - Texts('Drop off Location'), - SizedBox( - height: 8, - ), - Container( - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(8), - border: Border.all(color: Colors.grey, width: 0.5), - color: Colors.white, - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Texts('Select From Map'), - Icon( - FontAwesomeIcons.mapMarkerAlt, - size: 24, - color: Colors.black, - ) - ], - ), - ), ], ), //TODO show dialog projects @@ -342,7 +361,41 @@ class _PickupLocationState extends State { color: Colors.grey[800], textColor: Colors.white, onTap: () { + if(_result==null || _selectedHospital == null) + AppToast.showErrorToast(message: 'please select all fields'); + else setState(() { + widget.patientER.pickupSpot = _isInsideHome ? 1 : 0; + if (widget.patientER.direction == 0) { + widget.patientER.pickupLocationLattitude = _result.geometry.location.lat.toString(); + widget.patientER.pickupLocationLongitude = _result.geometry.location.lng.toString(); + widget.patientER.dropoffLocationLattitude = _selectedHospital.latitude; + widget.patientER.dropoffLocationLongitude = _selectedHospital.longitude; + + } else { + widget.patientER.pickupLocationLattitude = _selectedHospital.latitude; + widget.patientER.pickupLocationLongitude = _selectedHospital.longitude; + widget.patientER.dropoffLocationLattitude = _result.geometry.location.lat.toString(); + widget.patientER.dropoffLocationLongitude = _result.geometry.location.lng.toString(); + } + + widget.patientER.latitude = widget.patientER.pickupLocationLattitude; + widget.patientER.longitude = widget.patientER.pickupLocationLongitude; + + if(_haveAppointment == HaveAppointment.YES){ + widget.patientER.appointmentNo = myAppointment.appointmentNo.toString(); + widget.patientER.appointmentClinicName = myAppointment.clinicName; + widget.patientER.appointmentDoctorName = myAppointment.doctorNameObj; + widget.patientER.appointmentBranch = myAppointment.projectName; + widget.patientER.appointmentTime = myAppointment.appointmentDate; + }else{ + widget.patientER.appointmentNo ="0"; + widget.patientER.appointmentClinicName = null; + widget.patientER.appointmentDoctorName = null; + widget.patientER.appointmentBranch = null; + widget.patientER.appointmentTime = null; + } + widget.patientER.pickupSpot = _isInsideHome ? 1 : 0; widget.changeCurrentTab(2); }); @@ -356,12 +409,35 @@ class _PickupLocationState extends State { ); } + void confirmSelectHospitalDialog(List hospitals) { + showDialog( + context: context, + child: SelectHospitalDialog( + hospitals: hospitals, + selectedHospital: _selectedHospital, + onValueSelected: (value) { + setState(() { + _selectedHospital = value; + }); + }, + ), + ); + } + + String getHospitalName(String title) { + return _selectedHospital == null ? title : _selectedHospital.name; + } + getAppointment() { + ProgressDialogUtil.showProgressDialog(context); widget.amRequestViewModel.getAppointmentHistory().then((value) { if (widget.amRequestViewModel.state == ViewState.Error || widget.amRequestViewModel.state == ViewState.ErrorLocal) { AppToast.showErrorToast(message: widget.amRequestViewModel.error); - } else if (widget.amRequestViewModel.appoitmentAllHistoryResultList.length > 0) { + } else if (widget + .amRequestViewModel.appoitmentAllHistoryResultList.length > + 0) { + ProgressDialogUtil.hideProgressDialog(context); Navigator.push( context, MaterialPageRoute( @@ -375,17 +451,23 @@ class _PickupLocationState extends State { setState(() { myAppointment = value; }); - else + else { + ProgressDialogUtil.hideProgressDialog(context); setState(() { _haveAppointment = HaveAppointment.NO; }); + } }); } else { + ProgressDialogUtil.hideProgressDialog(context); setState(() { _haveAppointment = HaveAppointment.NO; }); AppToast.showErrorToast(message: 'You don\'t have any appointment'); } + }).catchError((e) { + ProgressDialogUtil.hideProgressDialog(context); + AppToast.showErrorToast(message: e); }); } } diff --git a/lib/pages/ErService/SelectTransportationMethod.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart similarity index 92% rename from lib/pages/ErService/SelectTransportationMethod.dart rename to lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart index 261b9f83..436aabe8 100644 --- a/lib/pages/ErService/SelectTransportationMethod.dart +++ b/lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/enum/OrderService.dart'; import 'package:diplomaticquarterapp/core/model/er/PatientER.dart'; import 'package:diplomaticquarterapp/core/model/er/get_all_transportation_method_list_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; @@ -32,11 +33,13 @@ class _SelectTransportationMethodState Direction _direction = Direction.FromHospital; Way _way = Way.OneWay; + OrderService _orderService = OrderService.AMBULANCE; + @override void initState() { super.initState(); if (widget.patientER.direction != null) { - _direction = widget.patientER.direction == 1 + _direction = widget.patientER.direction == 0 ? Direction.ToHospital : Direction.FromHospital; _way = widget.patientER.tripType == 1 ? Way.OneWay : Way.TwoWays; @@ -278,15 +281,17 @@ class _SelectTransportationMethodState textColor: Colors.white, onTap: () { setState(() { - widget.patientER.direction = - _direction == Direction.ToHospital ? 1 : 2; + widget.patientER.direction = _direction == Direction.ToHospital ? 0 : 1; widget.patientER.tripType = _way == Way.TwoWays ? 2 : 1; - widget.patientER.selectedAmbulate = (widget - .amRequestViewModel.amRequestModeList - .indexOf(_erTransportationMethod) + - 1); - widget.patientER.patientERTransportationMethod = - _erTransportationMethod; + widget.patientER.selectedAmbulate = (widget.amRequestViewModel.amRequestModeList.indexOf(_erTransportationMethod) + 1); + widget.patientER.patientERTransportationMethod = _erTransportationMethod; + widget.patientER.orderServiceID = _orderService.getIdOrderService(); + widget.patientER.pickupUrgency = 1; + widget.patientER.lineItemNo = 1; + widget.patientER.cost = _erTransportationMethod.price; + widget.patientER.vAT = _erTransportationMethod.vAT ?? 0; + widget.patientER.totalPrice = _erTransportationMethod.totalPrice; + widget.changeCurrentTab(1); }); }, diff --git a/lib/pages/ErService/Summary.dart b/lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart similarity index 100% rename from lib/pages/ErService/Summary.dart rename to lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart diff --git a/lib/pages/ErService/OrderLogPage.dart b/lib/pages/ErService/OrderLogPage.dart new file mode 100644 index 00000000..cbb508e5 --- /dev/null +++ b/lib/pages/ErService/OrderLogPage.dart @@ -0,0 +1,62 @@ +import 'package:diplomaticquarterapp/core/model/er/PatientAllPresOrders.dart'; +import 'package:diplomaticquarterapp/core/viewModels/er/am_request_view_model.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/OrderLogItem.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class OrderLogPage extends StatelessWidget { + final AmRequestViewModel amRequestViewModel; + + OrderLogPage({Key key, @required this.amRequestViewModel}); + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.all(10), + padding: EdgeInsets.all(8), + child: ListView.builder( + itemCount: amRequestViewModel.patientAllPresOrdersList.length, + itemBuilder: (context, index) => Container( + margin: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(2), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + OrderLogItem( + title: 'Request ID', + value: amRequestViewModel.patientAllPresOrdersList[index].iD + .toString(), + ), + OrderLogItem( + title: 'Status', + value: amRequestViewModel + .patientAllPresOrdersList[index].description, + ), + OrderLogItem( + title: 'Pickup Date', + value: DateUtil.getDayMonthYearDateFormatted( + DateUtil.convertStringToDate(amRequestViewModel + .patientAllPresOrdersList[index].createdOn)), + ), + OrderLogItem( + title: 'Pickup Location', + value: amRequestViewModel + .patientAllPresOrdersList[index].pickupLocationName, + ), + OrderLogItem( + title: 'Drop off Location', + value: amRequestViewModel + .patientAllPresOrdersList[index].dropoffLocationName, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/base/base_view.dart b/lib/pages/base/base_view.dart index 6014b6c3..f5311aae 100644 --- a/lib/pages/base/base_view.dart +++ b/lib/pages/base/base_view.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -19,10 +20,11 @@ class BaseView extends StatefulWidget { class _BaseViewState extends State> { T model = locator(); + AuthenticatedUserObject authenticatedUserObject = locator(); @override void initState() { - if (widget.onModelReady != null) { + if (widget.onModelReady != null && authenticatedUserObject.isLogin) { widget.onModelReady(model); } super.initState(); diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index b811ef8f..b20648e2 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -34,6 +34,7 @@ class _HomePageState extends State { return BaseView( onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, wi) => AppScaffold( + isShowDecPage: false, body: Container( width: double.infinity, child: SingleChildScrollView( diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index ac36c7d6..52afe85f 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -74,6 +74,7 @@ class _ConfirmLogin extends State { return AppScaffold( appBarTitle: TranslationBase.of(context).confirm, isShowAppBar: true, + isShowDecPage: false, body: isLoading == false ? SingleChildScrollView( child: Container( diff --git a/lib/pages/login/forgot-password.dart b/lib/pages/login/forgot-password.dart index c1fa7b18..bbdbb1ae 100644 --- a/lib/pages/login/forgot-password.dart +++ b/lib/pages/login/forgot-password.dart @@ -21,6 +21,7 @@ class _ForgotPassword extends State { return AppScaffold( appBarTitle: TranslationBase.of(context).forgotPassword, isShowAppBar: true, + isShowDecPage: false, body: SingleChildScrollView( child: Container( padding: EdgeInsets.only(top: 10, left: 20, right: 20), diff --git a/lib/pages/login/login-type.dart b/lib/pages/login/login-type.dart index 7a8a940d..d1ac54bb 100644 --- a/lib/pages/login/login-type.dart +++ b/lib/pages/login/login-type.dart @@ -16,6 +16,7 @@ class LoginType extends StatelessWidget { return AppScaffold( appBarTitle: TranslationBase.of(context).welcome, isShowAppBar: true, + isShowDecPage: false, body: Padding( padding: EdgeInsets.all(20), child: Column( diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index c1f04a71..22178444 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -57,6 +57,7 @@ class _Login extends State { return AppScaffold( appBarTitle: TranslationBase.of(context).login, isShowAppBar: true, + isShowDecPage: false, body: isLoading == true ? AppCircularProgressIndicator() : SingleChildScrollView( diff --git a/lib/pages/login/register-info.dart b/lib/pages/login/register-info.dart index 70e5fb29..e94c1af6 100644 --- a/lib/pages/login/register-info.dart +++ b/lib/pages/login/register-info.dart @@ -39,6 +39,7 @@ class _RegisterInfo extends State { return AppScaffold( appBarTitle: TranslationBase.of(context).register, isShowAppBar: true, + isShowDecPage: false, body: SingleChildScrollView( child: Container( padding: EdgeInsets.only(top: 10, left: 20, right: 20, bottom: 30), diff --git a/lib/pages/login/register.dart b/lib/pages/login/register.dart index 3706f452..3ee13a4c 100644 --- a/lib/pages/login/register.dart +++ b/lib/pages/login/register.dart @@ -45,6 +45,7 @@ class _Register extends State { return AppScaffold( appBarTitle: TranslationBase.of(context).register, isShowAppBar: true, + isShowDecPage: false, body: isLoading == true ? AppCircularProgressIndicator() : SingleChildScrollView( diff --git a/lib/pages/login/welcome.dart b/lib/pages/login/welcome.dart index b4b05900..90bc2a2c 100644 --- a/lib/pages/login/welcome.dart +++ b/lib/pages/login/welcome.dart @@ -28,6 +28,7 @@ class _WelcomeLogin extends State { Widget build(BuildContext context) { return AppScaffold( appBarTitle: TranslationBase.of(context).welcome, + isShowDecPage: false, isShowAppBar: true, body: Padding( padding: EdgeInsets.all(20), diff --git a/lib/pages/medical/labs/labs_home_page.dart b/lib/pages/medical/labs/labs_home_page.dart index 325d5dcd..995365d9 100644 --- a/lib/pages/medical/labs/labs_home_page.dart +++ b/lib/pages/medical/labs/labs_home_page.dart @@ -20,6 +20,7 @@ class LabsHomePage extends StatelessWidget { builder: (context, LabsViewModel model, widget) => AppScaffold( baseViewModel: model, isShowAppBar: true, + description: TranslationBase.of(context).infoLab, appBarTitle: TranslationBase.of(context).labOrders, body: SingleChildScrollView( physics: BouncingScrollPhysics(), diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index d2b9a9ea..2c5a6fb2 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -48,6 +48,7 @@ class _MedicalProfilePageState extends State { return BaseView( onModelReady: (model) => model.getAppointmentHistory(), builder: (_, model, widget) => AppScaffold( + isShowDecPage: false, baseViewModel: model, body: Container( child: SingleChildScrollView( diff --git a/lib/pages/medical/radiology/radiology_home_page.dart b/lib/pages/medical/radiology/radiology_home_page.dart index 0f9f4c7b..995ac485 100644 --- a/lib/pages/medical/radiology/radiology_home_page.dart +++ b/lib/pages/medical/radiology/radiology_home_page.dart @@ -20,6 +20,7 @@ class RadiologyHomePage extends StatelessWidget { isShowAppBar: true, appBarTitle: TranslationBase.of(context).radiology, baseViewModel: model, + description: TranslationBase.of(context).infoRadiology, body: FractionallySizedBox( widthFactor: 1.0, child: ListView( diff --git a/lib/uitl/ProgressDialog.dart b/lib/uitl/ProgressDialog.dart index 728b27dd..6820a6d5 100644 --- a/lib/uitl/ProgressDialog.dart +++ b/lib/uitl/ProgressDialog.dart @@ -1,12 +1,26 @@ import 'package:flutter/material.dart'; -class ProgressDialogUtil{ +AlertDialog _alert = AlertDialog( + content: Row( + children: [ + CircularProgressIndicator(), + Container(margin: EdgeInsets.only(left: 7), child: Text("Loading...")), + ], + ), +); - static AlertDialog alert = AlertDialog( - content: new Row( - children: [ - CircularProgressIndicator(), - Container(margin: EdgeInsets.only(left: 7),child:Text("Loading..." )), - ],), - ); -} \ No newline at end of file +class ProgressDialogUtil { + static showProgressDialog(BuildContext context) { + showDialog( + barrierDismissible: false, + context: context, + builder: (BuildContext context) { + return _alert; + }, + ); + } + + static hideProgressDialog(BuildContext context) { + Navigator.pop(context); + } +} diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 28b273e5..493bc327 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -589,6 +589,10 @@ class TranslationBase { String get all => localizedValues['All'][locale.languageCode]; String get questionHere => localizedValues['QuestionHere'][locale.languageCode]; String get viewDoctorResponses => localizedValues['ViewDoctorResponses'][locale.languageCode]; + String get serviceInformationButton => localizedValues['ServiceInformationButton'][locale.languageCode]; + String get serviceInformationTitle => localizedValues['ServiceInformationTitle'][locale.languageCode]; + String get infoLab => localizedValues['info-lab'][locale.languageCode]; + String get infoRadiology => localizedValues['info-radiology'][locale.languageCode]; } diff --git a/lib/widgets/others/OrderLogItem.dart b/lib/widgets/others/OrderLogItem.dart new file mode 100644 index 00000000..3e8305d3 --- /dev/null +++ b/lib/widgets/others/OrderLogItem.dart @@ -0,0 +1,32 @@ +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class OrderLogItem extends StatelessWidget { + final String title; + final String value; + OrderLogItem({ this.title, this.value}); + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(10), + width: double.maxFinite, + margin: EdgeInsets.only(bottom: 4,left: 4,right: 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(12), + bottomLeft: Radius.circular(12), + ), + color: Colors.white + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts(title,color: Colors.grey,), + SizedBox(height: 4,), + Texts(value??''), + ], + ), + ); + } +} diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index 80a3e7af..dabe3097 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -1,8 +1,10 @@ import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/routes.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; @@ -12,10 +14,12 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; +import '../../locator.dart'; import 'floating_button_search.dart'; import '../progress_indicator/app_loader_widget.dart'; import 'arrow_back.dart'; import 'network_base_view.dart'; +import 'not_auh_page.dart'; class AppScaffold extends StatelessWidget { final String appBarTitle; @@ -26,6 +30,12 @@ class AppScaffold extends StatelessWidget { final bool hasAppBarParam; final BaseViewModel baseViewModel; final Widget floatingActionButton; + final String title; + final String description; + final bool isShowDecPage; + + AuthenticatedUserObject authenticatedUserObject = + locator(); AppScaffold( {@required this.body, @@ -34,50 +44,61 @@ class AppScaffold extends StatelessWidget { this.isShowAppBar = false, this.hasAppBarParam, this.bottomSheet, - this.baseViewModel, this.floatingActionButton}); + this.baseViewModel, + this.floatingActionButton, + this.title, + this.description, + this.isShowDecPage = true}); @override Widget build(BuildContext context) { AppGlobal.context = context; return Scaffold( - backgroundColor: Theme.of(context).scaffoldBackgroundColor, - appBar: isShowAppBar - ? AppBar( - elevation: 0, - backgroundColor: Theme.of(context).appBarTheme.color, - textTheme: TextTheme( - headline6: TextStyle( - color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text(appBarTitle.toUpperCase()), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBar: isShowAppBar + ? AppBar( + elevation: 0, + backgroundColor: Theme.of(context).appBarTheme.color, + textTheme: TextTheme( + headline6: + TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text(authenticatedUserObject.isLogin + ? appBarTitle.toUpperCase() + : TranslationBase.of(context).serviceInformationTitle), + leading: Builder( + builder: (BuildContext context) { + return ArrowBack(); + }, + ), + centerTitle: true, + actions: [ + IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.of(context).popUntil(ModalRoute.withName('/')); }, ), - centerTitle: true, - actions: [ - IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.of(context).popUntil(ModalRoute.withName('/')); - }, - ), - ], - ) - : null, - body: baseViewModel != null - ? NetworkBaseView( - child: buildBodyWidget(), - baseViewModel: baseViewModel, - ) - : buildBodyWidget(), - bottomSheet: bottomSheet, - // bottomNavigationBar: BottomBarSearch() - floatingActionButton: floatingActionButton??floatingActionButton, - ); + ], + ) + : null, + body: (!authenticatedUserObject.isLogin && isShowDecPage) + ? NotAutPage( + title: appBarTitle, + description: description, + ) + : baseViewModel != null + ? NetworkBaseView( + child: buildBodyWidget(), + baseViewModel: baseViewModel, + ) + : buildBodyWidget(), + bottomSheet: bottomSheet, + // bottomNavigationBar: BottomBarSearch() + floatingActionButton: floatingActionButton ?? floatingActionButton, + ); } buildAppLoaderWidget(bool isLoading) { @@ -85,6 +106,6 @@ class AppScaffold extends StatelessWidget { } buildBodyWidget() { - return body ;//Stack(children: [body, buildAppLoaderWidget(isLoading)]); + return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); } } diff --git a/lib/widgets/others/not_auh_page.dart b/lib/widgets/others/not_auh_page.dart new file mode 100644 index 00000000..298b5609 --- /dev/null +++ b/lib/widgets/others/not_auh_page.dart @@ -0,0 +1,79 @@ +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/login/login-type.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.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'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +class NotAutPage extends StatelessWidget { + final String title; + final String description; + + NotAutPage({@required this.title, @required this.description}); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return Scaffold( + body: SingleChildScrollView( + padding: EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + title ?? 'Service', + fontWeight: FontWeight.w800, + fontSize: 25, + bold: true, + color: Hexcolor("#60686b"), + ), + SizedBox( + height: 12, + ), + Texts( + description ?? 'Description', + fontWeight: FontWeight.normal, + fontSize: 17, + ), + SizedBox( + height: 22, + ), + Center( + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.55, + width: MediaQuery.of(context).size.width * 0.50, + child: Image.asset(projectViewModel.isArabic + ? 'assets/images/wifi-EN.png' + : 'assets/images/Wifi-AR.png'), + ), + ), + SizedBox( + height: 77, + ), + ], + ), + ), + bottomSheet: Container( + height: MediaQuery.of(context).size.height * 0.10, + width: double.infinity, + child: Column( + children: [ + Container( + width: MediaQuery.of(context).size.width * 0.9, + child: SecondaryButton( + onTap: () => Navigator.pushReplacement( + context, FadePage(page: LoginType())), + label: TranslationBase.of(context).serviceInformationButton, + textColor: Theme.of(context).backgroundColor), + ), + ], + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 6e9349ab..2b078a1d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -60,6 +60,9 @@ dependencies: image_picker: ^0.6.7+1 image_cropper: ^1.2.1 + #GIF image + flutter_gifimage: ^1.0.1 + # UI Reqs dotted_border: 1.0.5 expandable: ^4.1.4