From 8329c534a33d0829f24bfaa9190491557d5731eb Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 16 Dec 2020 19:10:34 +0200 Subject: [PATCH 01/34] hot fixes --- .../widgets/AppointmentCardView.dart | 15 ++++++++++++--- lib/pages/ToDoList/ToDo.dart | 11 +++++------ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart index a1e5c0e7..2f3d941f 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart @@ -4,6 +4,7 @@ import 'package:diplomaticquarterapp/pages/MyAppointments/models/AppointmentType import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_countdown_timer/countdown_timer_controller.dart'; import 'package:flutter_countdown_timer/current_remaining_time.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:provider/provider.dart'; @@ -23,6 +24,16 @@ class AppointmentCard extends StatefulWidget { } class _ApointmentCardState extends State { + + CountdownTimerController controller; + + @override + void initState() { + super.initState(); + int endTime = DateTime.now().millisecondsSinceEpoch + 1000 * 30; + controller = CountdownTimerController(endTime: endTime,); + } + @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); @@ -126,9 +137,7 @@ class _ApointmentCardState extends State { AppointmentType.CONFIRMED) ? Container( child: CountdownTimer( - endTime: DateTime.now().millisecondsSinceEpoch + - (widget.appo.remaniningHoursTocanPay * 1000) * - 60, + controller: controller, widgetBuilder: (_, CurrentRemainingTime time) { return Text( '${time.days}:${time.hours}:${time.min}:${time.sec} ' + diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index 9f93f45c..e64b2906 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -22,6 +22,7 @@ import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_countdown_timer/countdown_timer_controller.dart'; import 'package:flutter_countdown_timer/current_remaining_time.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -52,6 +53,7 @@ class _ToDoState extends State { List imagesInfo = List(); ToDoCountProviderModel toDoProvider; + CountdownTimerController controller; @override void initState() { @@ -65,6 +67,8 @@ class _ToDoState extends State { 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/en/0.png', imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/ar/0.png')); + int endTime = DateTime.now().millisecondsSinceEpoch + 1000 * 30; + controller = CountdownTimerController(endTime: endTime,); } @override @@ -229,12 +233,7 @@ class _ToDoState extends State { ), Container( child: CountdownTimer( - endTime: DateTime.now() - .millisecondsSinceEpoch + - (widget.appoList[index] - .remaniningHoursTocanPay * - 1000) * - 60, + controller: controller, widgetBuilder: (_, CurrentRemainingTime time) { return Text( From 040c8f38ab454b322dd1bb7367336cc6641166e0 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 17 Dec 2020 13:09:58 +0300 Subject: [PATCH 02/34] hot fixes --- lib/core/service/weather_service.dart | 6 +- .../all_habib_medical_service_page.dart | 37 +- .../health-weather-indicator.dart | 7 +- lib/pages/landing/landing_page.dart | 9 +- lib/pages/login/confirm-login.dart | 5 +- lib/pages/settings/profile_setting.dart | 360 +++++++++--------- lib/pages/settings/settings.dart | 8 + lib/widgets/otp/sms-popup.dart | 13 +- 8 files changed, 249 insertions(+), 196 deletions(-) diff --git a/lib/core/service/weather_service.dart b/lib/core/service/weather_service.dart index b2dcf0ef..679a4c9d 100644 --- a/lib/core/service/weather_service.dart +++ b/lib/core/service/weather_service.dart @@ -21,17 +21,15 @@ class WeatherService extends BaseService { await baseAppClient.post(WEATHER_INDICATOR, onSuccess: (dynamic response, int statusCode) { - - response['GetCityInfo_List'].forEach((data) { weatherIndicatorData.add(GetCityInfoList.fromJson(data)); }); print(weatherIndicatorData); - }, onFailure: (String error, int statusCode) { hasError = true; super.error = error; }, body: body); - await this.sharedPref.setObject(WEATHER,weatherIndicatorData[0]); + await this.sharedPref.setObject(WEATHER, weatherIndicatorData[0]); + return Future.value(weatherIndicatorData[0]); } } diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index 870fef97..a0166957 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/service/weather_service.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20health_calculators.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart'; @@ -31,6 +32,7 @@ import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; import 'package:url_launcher/url_launcher.dart'; class AllHabibMedicalService extends StatefulWidget { @@ -48,14 +50,16 @@ class _AllHabibMedicalServiceState extends State { AuthenticatedUser authUser = new AuthenticatedUser(); LocationUtils locationUtils; var weather = '--'; - + WeatherService _weatherService = WeatherService(); @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { - getAuthUser(); locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context); - locationUtils.getCurrentLocation(); + WidgetsBinding.instance.addPostFrameCallback((_) => { + Geolocator.getLastKnownPosition() + .then((value) => setLocation(value)) + }); }); super.initState(); } @@ -130,8 +134,11 @@ class _AllHabibMedicalServiceState extends State { width: 60, height: 60, ), - AppText(weather, - fontSize: 22, color: Colors.white) + Directionality( + textDirection: TextDirection.ltr, + child: AppText(weather, + fontSize: 22, + color: Colors.white)) ], ), Texts( @@ -276,7 +283,23 @@ class _AllHabibMedicalServiceState extends State { }); } var data = await this.sharedPref.getObject(WEATHER); - weather = data != null ? data['Temperature'].toString() + '\u2103' : '--'; - print(data); + if (data == null) { + var d = await _weatherService.getWeatherData(); + print(d); + setState(() { + weather = d != null ? d.temperature.toString() + '\u2103' : '--'; + }); + } else { + setState(() { + weather = + data != null ? data['Temperature'].toString() + '\u2103' : '--'; + }); + } + } + + void setLocation(Position position) { + this.sharedPref.setDouble(USER_LAT, position.latitude ?? 0.0); + this.sharedPref.setDouble(USER_LONG, position.longitude ?? 0.0); + getAuthUser(); } } diff --git a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart index 343c6e3e..dbb46eee 100644 --- a/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart +++ b/lib/pages/AlHabibMedicalService/health-weather/health-weather-indicator.dart @@ -97,8 +97,11 @@ class _HospitalsPageState extends State { width: 60, height: 60, ), - AppText(weather, - fontSize: 22, color: Colors.white) + Directionality( + textDirection: TextDirection.ltr, + child: AppText(weather, + fontSize: 22, + color: Colors.white)) ], ), ], diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 5935617d..bb629f6b 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -577,8 +577,13 @@ class _LandingPageState extends State with WidgetsBindingObserver { authService.getDashboard().then((value) => { setState(() { notificationCount = value['List_PatientDashboard'][0] - ['UnreadPatientNotificationCount'] - .toString(); + ['UnreadPatientNotificationCount'] > + 99 + ? '99+' + : value['List_PatientDashboard'][0] + ['UnreadPatientNotificationCount'] + .toString(); + sharedPref.setString(NOTIFICATION_COUNT, notificationCount); }) }); diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index 7f7c883d..a3537e54 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -360,8 +360,11 @@ class _ConfirmLogin extends State { context, type, this.mobileNumber, - (value) => {this.checkActivationCode(value: value)}, + (value) { + this.checkActivationCode(value: value); + }, () => { + Navigator.pop(context), print('Faild..'), }, ).displayDialog(context); diff --git a/lib/pages/settings/profile_setting.dart b/lib/pages/settings/profile_setting.dart index 13ca5da6..c0a3dafd 100644 --- a/lib/pages/settings/profile_setting.dart +++ b/lib/pages/settings/profile_setting.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; @@ -10,6 +11,7 @@ import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:provider/provider.dart'; class ProfileSettings extends StatefulWidget { @override @@ -28,7 +30,9 @@ class _ProfileSettings extends State @override void initState() { Future.delayed(new Duration(seconds: 0), () { - getSettings(context); + ProjectViewModel projectProvider; + projectProvider = Provider.of(context); + if (projectProvider.isLogin == true) getSettings(context); }); super.initState(); } @@ -37,182 +41,188 @@ class _ProfileSettings extends State return BaseView( onModelReady: (model) => {}, builder: (_, model, wi) => Container( - child: - ListView(scrollDirection: Axis.vertical, children: [ - Container( - padding: EdgeInsets.all(15), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText( - TranslationBase.of(context).fileNo, - color: Colors.black, + child: model.user != null + ? ListView(scrollDirection: Axis.vertical, children: [ + Container( + padding: EdgeInsets.all(15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText( + TranslationBase.of(context).fileNo, + color: Colors.black, + ), + AppText( + model.user.patientID.toString(), + color: Colors.black, + ), + ], + ), ), - AppText( - model.user.patientID.toString(), - color: Colors.black, + SizedBox( + height: 1, + width: MediaQuery.of(context).size.width, + child: Container( + color: Colors.grey[300], + ), ), - ], - ), - ), - SizedBox( - height: 1, - width: MediaQuery.of(context).size.width, - child: Container( - color: Colors.grey[300], - ), - ), - Padding( - child: AppText(TranslationBase.of(context).languageSetting, - fontWeight: FontWeight.bold), - padding: EdgeInsets.all(10), - ), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText(TranslationBase.of(context).english), - new Radio( - value: 2, - groupValue: language, - onChanged: (value) { - setState(() { - language = value; - }); - }, - ) - ], - )), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText(TranslationBase.of(context).arabic), - new Radio( - value: 1, - groupValue: language, - onChanged: (value) { - setState(() { - language = value; - }); - }, - ) - ], - )), - Padding( - child: AppText(TranslationBase.of(context).alert), - padding: EdgeInsets.all(10), - ), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText(TranslationBase.of(context).emailAlert), - Switch( - value: emailAlert, - onChanged: (value) { - setState(() { - emailAlert = value; - }); - }, - activeTrackColor: Colors.lightGreenAccent, - activeColor: Colors.green, - ) - ], - )), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - AppText(TranslationBase.of(context).smsAlert), - Switch( - value: smsAlert, - onChanged: (value) { - setState(() { - smsAlert = value; - }); - }, - activeTrackColor: Colors.lightGreenAccent, - activeColor: Colors.green, - ) - ], - )), - Padding( - child: AppText(TranslationBase.of(context).contactInfo), - padding: EdgeInsets.all(10), - ), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppText(TranslationBase.of(context).email), - TextField( - controller: emailController, - decoration: InputDecoration( - suffixIcon: Icon(Icons.edit), - )) - ], - )), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppText(TranslationBase.of(context).emergencyName), - TextField( - controller: emergencyContactName, - decoration: InputDecoration( - suffixIcon: Icon(Icons.edit), - )) - ], - )), - Container( - color: Colors.white, - padding: - EdgeInsets.only(top: 0, left: 10, right: 10, bottom: 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AppText(TranslationBase.of(context).emergencyContact), - TextField( - controller: emergencyContact, - decoration: InputDecoration( - suffixIcon: Icon(Icons.edit), - ), - ) - ], - )), - Container( - padding: EdgeInsets.all(10), - child: Row( - children: [ - Expanded( - child: DefaultButton( - TranslationBase.of(context).submit, - () { - saveSettings(); - }, - )), - ], - )) - ]))); + Padding( + child: AppText( + TranslationBase.of(context).languageSetting, + fontWeight: FontWeight.bold), + padding: EdgeInsets.all(10), + ), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText(TranslationBase.of(context).english), + new Radio( + value: 2, + groupValue: language, + onChanged: (value) { + setState(() { + language = value; + }); + }, + ) + ], + )), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText(TranslationBase.of(context).arabic), + new Radio( + value: 1, + groupValue: language, + onChanged: (value) { + setState(() { + language = value; + }); + }, + ) + ], + )), + Padding( + child: AppText(TranslationBase.of(context).alert), + padding: EdgeInsets.all(10), + ), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText(TranslationBase.of(context).emailAlert), + Switch( + value: emailAlert, + onChanged: (value) { + setState(() { + emailAlert = value; + }); + }, + activeTrackColor: Colors.lightGreenAccent, + activeColor: Colors.green, + ) + ], + )), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText(TranslationBase.of(context).smsAlert), + Switch( + value: smsAlert, + onChanged: (value) { + setState(() { + smsAlert = value; + }); + }, + activeTrackColor: Colors.lightGreenAccent, + activeColor: Colors.green, + ) + ], + )), + Padding( + child: AppText(TranslationBase.of(context).contactInfo), + padding: EdgeInsets.all(10), + ), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText(TranslationBase.of(context).email), + TextField( + controller: emailController, + decoration: InputDecoration( + suffixIcon: Icon(Icons.edit), + )) + ], + )), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText(TranslationBase.of(context).emergencyName), + TextField( + controller: emergencyContactName, + decoration: InputDecoration( + suffixIcon: Icon(Icons.edit), + )) + ], + )), + Container( + color: Colors.white, + padding: EdgeInsets.only( + top: 0, left: 10, right: 10, bottom: 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AppText( + TranslationBase.of(context).emergencyContact), + TextField( + controller: emergencyContact, + decoration: InputDecoration( + suffixIcon: Icon(Icons.edit), + ), + ) + ], + )), + Container( + padding: EdgeInsets.all(10), + child: Row( + children: [ + Expanded( + child: DefaultButton( + TranslationBase.of(context).submit, + () { + saveSettings(); + }, + )), + ], + )) + ]) + : Center( + child: + AppText(TranslationBase.of(context).loginToUseService), + ))); } getSettings(context) { diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index abdac118..cba561b3 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -30,6 +30,14 @@ class _Settings extends State with TickerProviderStateMixin { return Scaffold( appBar: AppBar( bottom: TabBar( + // isScrollable: true, + + indicatorWeight: 5.0, + //indicatorSize: TabBarIndicatorSize.label, + // indicatorSize: TabBarIndicatorSize.tab, + + indicatorColor: Theme.of(context).primaryColor, + // labelColor: Theme.of(context).primaryColor, tabs: [ Tab(text: TranslationBase.of(context).general), Tab( diff --git a/lib/widgets/otp/sms-popup.dart b/lib/widgets/otp/sms-popup.dart index 02282c7b..1694f675 100644 --- a/lib/widgets/otp/sms-popup.dart +++ b/lib/widgets/otp/sms-popup.dart @@ -64,7 +64,10 @@ class SMSOTP { children: [ IconButton( icon: Icon(Icons.close), - onPressed: () => {Navigator.pop(context), this.onSuccess()}, + onPressed: () { + Navigator.pop(context); + this.onFailure(); + }, ) ], ), @@ -111,7 +114,7 @@ class SMSOTP { textInputAction: TextInputAction.next, style: buildTextStyle(), autofocus: true, - maxLength: 1, + // maxLength: 1, controller: digit1, textAlign: TextAlign.center, keyboardType: TextInputType.number, @@ -138,7 +141,7 @@ class SMSOTP { child: TextFormField( focusNode: focusD2, textInputAction: TextInputAction.next, - maxLength: 1, + // maxLength: 1, controller: digit2, textAlign: TextAlign.center, style: buildTextStyle(), @@ -165,7 +168,7 @@ class SMSOTP { child: TextFormField( focusNode: focusD3, textInputAction: TextInputAction.next, - maxLength: 1, + // maxLength: 1, controller: digit3, textAlign: TextAlign.center, style: buildTextStyle(), @@ -191,7 +194,7 @@ class SMSOTP { width: SizeConfig.realScreenWidth * 0.15, child: TextFormField( focusNode: focusD4, - maxLength: 1, + // maxLength: 1, textAlign: TextAlign.center, style: buildTextStyle(), controller: digit4, From 8c9762c24fd22d91aa3c43dc137ba34b71488432 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 17 Dec 2020 17:40:35 +0300 Subject: [PATCH 03/34] Fixes --- lib/pages/BookAppointment/Search.dart | 99 +++++++++++++------ .../BookAppointment/components/DocInfo.dart | 2 + .../widgets/AppointmentCardView.dart | 28 ++++-- lib/pages/ToDoList/ToDo.dart | 60 ++++++----- lib/pages/paymentService/payment_service.dart | 24 ++++- .../bottom_navigation/bottom_nav_bar.dart | 28 +++++- 6 files changed, 164 insertions(+), 77 deletions(-) diff --git a/lib/pages/BookAppointment/Search.dart b/lib/pages/BookAppointment/Search.dart index 44cf46c3..6264c7a8 100644 --- a/lib/pages/BookAppointment/Search.dart +++ b/lib/pages/BookAppointment/Search.dart @@ -1,10 +1,11 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/pages/BookAppointment/components/SearchByClinic.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/components/SearchByDoctor.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/others/arrow_back.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; +import 'components/SearchByClinic.dart'; + class Search extends StatefulWidget { final int type; final List clnicIds; @@ -29,34 +30,70 @@ class _SearchState extends State with TickerProviderStateMixin { @override Widget build(BuildContext context) { AppGlobal.context = context; - return Scaffold( - appBar: AppBar( - bottom: TabBar( - tabs: [ - Tab(text: TranslationBase.of(context).clinicName), - Tab( - text: TranslationBase.of(context).doctorName, - ) - ], - controller: _tabController, - ), - title: Text(TranslationBase.of(context).bookAppo, - style: TextStyle(color: Colors.white)), - leading: Builder( - builder: (BuildContext context) { - return ArrowBack(); - }, - ), - ), - body: TabBarView( - physics: NeverScrollableScrollPhysics(), - children: [ - SearchByClinic( - clnicIds: widget.clnicIds, - ), - SearchByDoctor() - ], - controller: _tabController), - ); + return AppScaffold( + isShowAppBar: true, + isShowDecPage: false, + appBarTitle: TranslationBase.of(context).bookAppo, + body: Container( + child: Column( + children: [ + TabBar( + tabs: [ + Tab(text: TranslationBase.of(context).clinicName), + Tab( + text: TranslationBase.of(context).doctorName, + ) + ], + controller: _tabController, + ), + Divider( + color: Colors.grey[600], + thickness: 0.5, + ), + Expanded( + child: new TabBarView( + physics: NeverScrollableScrollPhysics(), + children: [ + SearchByClinic( + clnicIds: widget.clnicIds, + ), + SearchByDoctor() + ], + controller: _tabController, + ), + ) + ], + ), + )); + // Scaffold( + // appBar: AppBar( + // bottom: TabBar( + // labelColor: Colors.white, + // tabs: [ + // Tab(text: TranslationBase.of(context).clinicName), + // Tab( + // text: TranslationBase.of(context).doctorName, + // ) + // ], + // controller: _tabController, + // ), + // title: Text(TranslationBase.of(context).bookAppo, + // style: TextStyle(color: Colors.white)), + // leading: Builder( + // builder: (BuildContext context) { + // return ArrowBack(); + // }, + // ), + // ), + // body: TabBarView( + // physics: NeverScrollableScrollPhysics(), + // children: [ + // SearchByClinic( + // clnicIds: widget.clnicIds, + // ), + // SearchByDoctor() + // ], + // controller: _tabController), + // ); } } diff --git a/lib/pages/BookAppointment/components/DocInfo.dart b/lib/pages/BookAppointment/components/DocInfo.dart index 1d91f7de..89b9e4d0 100644 --- a/lib/pages/BookAppointment/components/DocInfo.dart +++ b/lib/pages/BookAppointment/components/DocInfo.dart @@ -17,6 +17,7 @@ class DoctorInformation extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ AppExpandableNotifier( + isExpand: true, headerWidget: Container( margin: EdgeInsets.all(10.0), child: Row( @@ -78,6 +79,7 @@ class DoctorInformation extends StatelessWidget { ), // ), AppExpandableNotifier( + isExpand: true, headerWidget: Container( margin: EdgeInsets.all(10.0), child: Row( diff --git a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart index 2f3d941f..b3839834 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart @@ -24,14 +24,15 @@ class AppointmentCard extends StatefulWidget { } class _ApointmentCardState extends State { - CountdownTimerController controller; @override void initState() { super.initState(); int endTime = DateTime.now().millisecondsSinceEpoch + 1000 * 30; - controller = CountdownTimerController(endTime: endTime,); + controller = CountdownTimerController( + endTime: endTime, + ); } @override @@ -137,15 +138,22 @@ class _ApointmentCardState extends State { AppointmentType.CONFIRMED) ? Container( child: CountdownTimer( - controller: controller, + controller: new CountdownTimerController( + endTime: + DateTime.now().millisecondsSinceEpoch + + (widget.appo.remaniningHoursTocanPay * + 1000) * + 60), widgetBuilder: (_, CurrentRemainingTime time) { - return Text( - '${time.days}:${time.hours}:${time.min}:${time.sec} ' + - TranslationBase.of(context) - .upcomingTimeLeft, - style: TextStyle( - fontSize: 12.0, - color: Color(0xff40ACC9))); + return time != null + ? Text( + '${time.days}:${time.hours}:${time.min}:${time.sec} ' + + TranslationBase.of(context) + .upcomingTimeLeft, + style: TextStyle( + fontSize: 12.0, + color: Color(0xff40ACC9))) + : Container(); }, ), ) diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index e64b2906..0a5584d9 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -12,7 +12,6 @@ import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dar import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; -import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; @@ -68,7 +67,7 @@ class _ToDoState extends State { imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/ar/0.png')); int endTime = DateTime.now().millisecondsSinceEpoch + 1000 * 30; - controller = CountdownTimerController(endTime: endTime,); + controller = CountdownTimerController(endTime: endTime); } @override @@ -118,11 +117,15 @@ class _ToDoState extends State { EdgeInsets.only(left: 10.0, right: 10.0), child: Text( DateUtil.getWeekDayMonthDayYearDateFormatted( - DateUtil.convertStringToDate(widget - .appoList[index].appointmentDate), - projectViewModel.isArabic - ? "ar" - : "en") + " " + widget.appoList[index].startTime.substring(0, 5), + DateUtil.convertStringToDate( + widget.appoList[index] + .appointmentDate), + projectViewModel.isArabic + ? "ar" + : "en") + + " " + + widget.appoList[index].startTime + .substring(0, 5), style: TextStyle(fontSize: 10.0)), ), widget.appoList[index].isLiveCareAppointment @@ -233,18 +236,26 @@ class _ToDoState extends State { ), Container( child: CountdownTimer( - controller: controller, + controller: new CountdownTimerController( + endTime: DateTime.now() + .millisecondsSinceEpoch + + (widget.appoList[index] + .remaniningHoursTocanPay * + 1000) * + 60), widgetBuilder: (_, CurrentRemainingTime time) { - return Text( - '${time.days}:${time.hours}:${time.min}:${time.sec} ' + - TranslationBase.of( - context) - .upcomingTimeLeft, - style: TextStyle( - fontSize: 12.0, - color: - Color(0xff40ACC9))); + return time != null + ? Text( + '${time.days}:${time.hours}:${time.min}:${time.sec} ' + + TranslationBase.of( + context) + .upcomingTimeLeft, + style: TextStyle( + fontSize: 12.0, + color: Color( + 0xff40ACC9))) + : Container(); }, ), ), @@ -525,23 +536,11 @@ class _ToDoState extends State { }); } - getToDoCount() { - toDoProvider.setState(0, true); - ClinicListService service = new ClinicListService(); - service.getActiveAppointmentNo(context).then((res) { - print(res['AppointmentActiveNumber']); - if (res['MessageStatus'] == 1) { - toDoProvider.setState(res['AppointmentActiveNumber'], true); - } else {} - }).catchError((err) { - print(err); - }); - } - getPatientAppointmentHistory() { GifLoaderDialogUtils.showMyDialog(context); DoctorsListService service = new DoctorsListService(); service.getPatientAppointmentHistory(true, context).then((res) { + widget.appoList.clear(); GifLoaderDialogUtils.hideDialog(context); if (res['MessageStatus'] == 1) { setState(() { @@ -553,7 +552,6 @@ class _ToDoState extends State { }); } else {} }); - getToDoCount(); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); } diff --git a/lib/pages/paymentService/payment_service.dart b/lib/pages/paymentService/payment_service.dart index 126c3cdc..2bcca630 100644 --- a/lib/pages/paymentService/payment_service.dart +++ b/lib/pages/paymentService/payment_service.dart @@ -1,7 +1,9 @@ import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/advance_payment_page.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/my_balance_page.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.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'; @@ -12,9 +14,13 @@ import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; class PaymentService extends StatelessWidget { + ToDoCountProviderModel model; + ProjectViewModel projectViewModel; + @override Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); + projectViewModel = Provider.of(context); + model = Provider.of(context); return AppScaffold( isShowAppBar: true, isShowDecPage: false, @@ -70,8 +76,7 @@ class PaymentService extends StatelessWidget { ), Expanded( child: InkWell( - onTap: () => - Navigator.push(context, FadePage(page: ToDo(isShowAppBar: true))), + onTap: () => navigateToToDoPage(context), child: Container( margin: EdgeInsets.all(5.0), padding: EdgeInsets.all(9), @@ -166,4 +171,17 @@ class PaymentService extends StatelessWidget { ), ); } + + navigateToToDoPage(BuildContext context) { + if (projectViewModel.isLogin) { + if (model.count != 0) { + Navigator.push(context, FadePage(page: ToDo(isShowAppBar: true))); + } else { + AppToast.showErrorToast( + message: TranslationBase.of(context).upcomingEmpty); + } + } else { + Navigator.push(context, FadePage(page: ToDo(isShowAppBar: true))); + } + } } diff --git a/lib/widgets/bottom_navigation/bottom_nav_bar.dart b/lib/widgets/bottom_navigation/bottom_nav_bar.dart index 2632ec4a..7acd0340 100644 --- a/lib/widgets/bottom_navigation/bottom_nav_bar.dart +++ b/lib/widgets/bottom_navigation/bottom_nav_bar.dart @@ -1,9 +1,14 @@ +import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/locator.dart'; +import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:eva_icons_flutter/eva_icons_flutter.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../../d_q_icons_icons.dart'; import 'bottom_navigation_item.dart'; @@ -21,12 +26,30 @@ class BottomNavBar extends StatefulWidget { class _BottomNavBarState extends State { int _index = 0; + ToDoCountProviderModel model; + AuthenticatedUserObject authenticatedUserObject = + locator(); + _changeIndex(int index) { - widget.changeIndex(index); + if (index != 4) + widget.changeIndex(index); + else { + if (authenticatedUserObject.isLogin) { + if (model.count != 0) { + widget.changeIndex(index); + } else { + AppToast.showErrorToast( + message: TranslationBase.of(context).upcomingEmpty); + } + } else { + widget.changeIndex(index); + } + } } @override Widget build(BuildContext context) { + model = Provider.of(context); return BottomAppBar( elevation: 4, shape: CircularNotchedRectangle(), @@ -103,6 +126,7 @@ class _BottomNavBarState extends State { } Future navigateToToDoList(context) async { - Navigator.push(context, MaterialPageRoute(builder: (context) => ToDo(isShowAppBar: false))); + Navigator.push(context, + MaterialPageRoute(builder: (context) => ToDo(isShowAppBar: false))); } } From 53282e3ae6537432b0236d043d95a58a3cff867f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 17 Dec 2020 17:52:19 +0300 Subject: [PATCH 04/34] ToDo back issue fixed --- lib/pages/ToDoList/ToDo.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index 0a5584d9..b635bc52 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -11,6 +11,7 @@ import 'package:diplomaticquarterapp/pages/BookAppointment/QRCode.dart'; import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart'; +import 'package:diplomaticquarterapp/routes.dart'; import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; @@ -550,7 +551,9 @@ class _ToDoState extends State { widget.appoList .add(new AppoitmentAllHistoryResultList.fromJson(v)); }); - } else {} + } else { + Navigator.of(context).popAndPushNamed(HOME); + } }); } else { AppToast.showErrorToast(message: res['ErrorEndUserMessage']); From 9c18c69d90bf7661a5be40f91ba8e283b34fd8af Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 17 Dec 2020 17:13:13 +0200 Subject: [PATCH 05/34] hot fixes --- lib/config/localized_values.dart | 4 + lib/core/service/hospital_service.dart | 2 + lib/core/service/pharmacies_service.dart | 1 + .../medical/my_balance_view_model.dart | 4 +- lib/pages/ToDoList/payment_method_select.dart | 2 +- .../insurance/insurance_card_screen.dart | 1 - .../insurance/insurance_update_screen.dart | 2 +- .../medical/balance/advance_payment_page.dart | 2 +- .../medical/balance/confirm_payment_page.dart | 3 +- lib/pages/medical/medical_profile_page.dart | 16 +- .../medical/reports/report_home_page.dart | 6 +- .../medical/vital_sign/LineChartCurved.dart | 4 +- .../LineChartCurvedBloodPressure.dart | 226 ++++++++++++++++++ ...al_sign_details_blood_pressurewideget.dart | 146 +++++++++++ .../vital_sign_item_details_screen.dart | 38 +-- .../vital_sing_chart_and_detials.dart | 2 +- .../vital_sing_chart_blood_pressure.dart | 87 +++++++ lib/uitl/translations_delegate_base.dart | 1 + .../lab_result_chart_and_detials.dart | 2 +- .../dialogs/confirm_send_email_dialog.dart | 1 + lib/widgets/drawer/app_drawer_widget.dart | 3 +- lib/widgets/others/app_scaffold_widget.dart | 75 ++---- 22 files changed, 535 insertions(+), 93 deletions(-) create mode 100644 lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart create mode 100644 lib/pages/medical/vital_sign/vital_sign_details_blood_pressurewideget.dart create mode 100644 lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index d22522c3..6314cebd 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1207,4 +1207,8 @@ const Map localizedValues = { "en": "The request has been submitted successfully", "ar": "تم تنفيذ طلبك بنجاح" }, + "pulseTitle": { + "en": "Heart rate", + "ar": "معدل النبض بالدقيقة" + }, }; diff --git a/lib/core/service/hospital_service.dart b/lib/core/service/hospital_service.dart index 519fc8c0..312d7fd7 100644 --- a/lib/core/service/hospital_service.dart +++ b/lib/core/service/hospital_service.dart @@ -27,6 +27,8 @@ class HospitalService extends BaseService { Map body = Map(); body['Latitude'] = _latitude; body['Longitude'] = _longitude; + body['IsOnlineCheckIn'] = true; + body['PatientOutSA'] = 0; await baseAppClient.post(GET_PROJECT, onSuccess: (dynamic response, int statusCode) { diff --git a/lib/core/service/pharmacies_service.dart b/lib/core/service/pharmacies_service.dart index 8f85d82e..9fc7d3f5 100644 --- a/lib/core/service/pharmacies_service.dart +++ b/lib/core/service/pharmacies_service.dart @@ -80,6 +80,7 @@ class PharmacyService extends BaseService { body['PHR_itemName'] = drugName; body['isLoginForDoctorApp'] = true; body['isDentalAllowedBackend'] = true; + body['PageSize'] = 25; body['Latitude'] = _latitude; body['Longitude'] = _longitude; diff --git a/lib/core/viewModels/medical/my_balance_view_model.dart b/lib/core/viewModels/medical/my_balance_view_model.dart index 62b7868b..e86ed55b 100644 --- a/lib/core/viewModels/medical/my_balance_view_model.dart +++ b/lib/core/viewModels/medical/my_balance_view_model.dart @@ -74,11 +74,10 @@ class MyBalanceViewModel extends BaseViewModel { setState(ViewState.Idle); } - //============== + Future getCities() async { setState(ViewState.Busy); await _bloodDonationService.getAllCitiesOrders(); - // getHospitals(); if (_bloodDonationService.hasError) { error = _bloodDonationService.error; setState(ViewState.Error); @@ -98,7 +97,6 @@ class MyBalanceViewModel extends BaseViewModel { setState(ViewState.Idle); } - //=============== Future getPatientInfoByPatientID({String id}) async { setState(ViewState.Busy); diff --git a/lib/pages/ToDoList/payment_method_select.dart b/lib/pages/ToDoList/payment_method_select.dart index fe2a217b..af74836f 100644 --- a/lib/pages/ToDoList/payment_method_select.dart +++ b/lib/pages/ToDoList/payment_method_select.dart @@ -218,7 +218,7 @@ class _PaymentMethodState extends State { shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10.0), ), - minWidth: MediaQuery.of(context).size.width * 0.7, + minWidth: MediaQuery.of(context).size.height * 0.1, height: 45.0, child: RaisedButton( color: new Color(0xFF60686b), diff --git a/lib/pages/insurance/insurance_card_screen.dart b/lib/pages/insurance/insurance_card_screen.dart index ebd3eada..42efc179 100644 --- a/lib/pages/insurance/insurance_card_screen.dart +++ b/lib/pages/insurance/insurance_card_screen.dart @@ -44,7 +44,6 @@ class _InsuranceCardState extends State { AppScaffold( isShowAppBar: true, baseViewModel: model, - image: 'assets/images/medical/insurance_card_icon.png', appBarTitle: TranslationBase.of(context).insuranceCards, description: TranslationBase.of(context).infoInsuranceCards, infoList: TranslationBase.of(context).infoInsuranceCardsPoints, diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index 70a3a302..d8a0d80f 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -102,7 +102,7 @@ class _InsuranceUpdateState extends State controller: _tabController, children: [ Container( - child: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList.isNotEmpty + child: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList.isNotEmpty?? false ? ListView.builder( itemCount: model.getAllSharedRecordsByStatusResponse .getAllSharedRecordsByStatusList.length, diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 85a0cc8f..f72f18a0 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -236,7 +236,7 @@ class _AdvancePaymentPageState extends State { ), ), bottomSheet: Container( - height: MediaQuery.of(context).size.height * 0.1, + height: MediaQuery.of(context).size.height * 0.13, width: double.infinity, padding: EdgeInsets.all(12), child: SecondaryButton( diff --git a/lib/pages/medical/balance/confirm_payment_page.dart b/lib/pages/medical/balance/confirm_payment_page.dart index 679a16db..8a69bf5d 100644 --- a/lib/pages/medical/balance/confirm_payment_page.dart +++ b/lib/pages/medical/balance/confirm_payment_page.dart @@ -156,11 +156,12 @@ class ConfirmPaymentPage extends StatelessWidget { ), ), bottomSheet: Container( - height: MediaQuery.of(context).size.height * 0.1, + height: MediaQuery.of(context).size.height * 0.13, width: double.infinity, padding: EdgeInsets.all(12), child: SecondaryButton( textColor: Colors.white, + color: Theme.of(context).primaryColor, label: TranslationBase.of(context).confirm.toUpperCase(), disabled: model.state == ViewState.Busy, onTap: () { diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 37592733..12c1baf7 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/pages/MyAppointments/MyAppointments.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/patient_sick_leave_page.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_home_page.dart'; import 'package:diplomaticquarterapp/pages/medical/radiology/radiology_home_page.dart'; @@ -343,7 +344,20 @@ class _MedicalProfilePageState extends State { ), ), Expanded( - child: Container(), + flex: 1, + child: InkWell( + onTap: () { + Navigator.push(context, + FadePage(page: InsuranceUpdate())); + }, + child: MedicalProfileItem( + title: + TranslationBase.of(context).updateInsurance, + imagePath: 'insurance_card_icon.png', + subTitle: TranslationBase.of(context) + .updateInsuranceSubtitle, + ), + ), ), Expanded( child: Container(), diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 3de1eda0..7d92b47c 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -105,13 +105,13 @@ class _HomeReportPageState extends State Container( width: MediaQuery.of(context).size.width * 0.15, child: Center( - child: Texts(TranslationBase.of(context).requested,fontSize: 12,), + child: Texts(TranslationBase.of(context).requested,fontSize: 11,), ), ), Container( width: MediaQuery.of(context).size.width * 0.15, child: Center( - child: Texts(TranslationBase.of(context).ready,fontSize: 12,), + child: Texts(TranslationBase.of(context).ready,fontSize: 11,), ), ), Container( @@ -125,7 +125,7 @@ class _HomeReportPageState extends State width: MediaQuery.of(context).size.width * 0.15, child: Center( child: - Texts(TranslationBase.of(context).cancelled,fontSize: 12,), + Texts(TranslationBase.of(context).cancelled,fontSize: 11,), ), ), ], diff --git a/lib/pages/medical/vital_sign/LineChartCurved.dart b/lib/pages/medical/vital_sign/LineChartCurved.dart index 8bf43053..7b7449a8 100644 --- a/lib/pages/medical/vital_sign/LineChartCurved.dart +++ b/lib/pages/medical/vital_sign/LineChartCurved.dart @@ -35,11 +35,11 @@ class LineChartCurved extends StatelessWidget { title, style: TextStyle( color: Colors.black, - fontSize: 32, - fontWeight: FontWeight.bold, + fontSize: 15, letterSpacing: 2), textAlign: TextAlign.center, ), + SizedBox(height: 10,), Expanded( child: Padding( padding: const EdgeInsets.only(right: 18.0, left: 16.0), diff --git a/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart b/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart new file mode 100644 index 00000000..f56d0f04 --- /dev/null +++ b/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart @@ -0,0 +1,226 @@ +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; + +class LineChartCurvedBloodPressure extends StatelessWidget { + final String title; + final List timeSeries1; + final List timeSeries2; + final int indexes; + + LineChartCurvedBloodPressure({this.title, this.timeSeries1, this.indexes, this.timeSeries2}); + + List xAxixs = List(); + List yAxixs = List(); + + @override + Widget build(BuildContext context) { + getXaxix(); + return AspectRatio( + aspectRatio: 1.1, + child: Container( + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(18)), + // color: Colors.white, + ), + child: Stack( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox( + height: 15, + ), + Text( + title, + style: TextStyle( + color: Colors.black, + fontSize: 15, + letterSpacing: 2), + textAlign: TextAlign.center, + ), + + SizedBox(height: 10,), + Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 18.0, left: 16.0,top: 15), + child: LineChart( + sampleData1(context), + swapAnimationDuration: const Duration(milliseconds: 250), + ), + ), + ), + const SizedBox( + height: 10, + ), + ], + ), + ], + ), + ), + ); + } + + getXaxix() { + for (int index = 0; index < timeSeries1.length; index++) { + int mIndex = indexes * index; + if (mIndex < timeSeries1.length) { + xAxixs.add(mIndex); + } + } + } + + + LineChartData sampleData1(context) { + return LineChartData( + lineTouchData: LineTouchData( + touchTooltipData: LineTouchTooltipData( + tooltipBgColor: Colors.white, + + ), + touchCallback: (LineTouchResponse touchResponse) {}, + handleBuiltInTouches: true, + ), + gridData: FlGridData( + show: true, drawVerticalLine: true, drawHorizontalLine: true), + titlesData: FlTitlesData( + bottomTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontSize: 10, + ), + rotateAngle:-65, + //rotateAngle:-65, + margin: 22, + getTitles: (value) { + if (timeSeries1.length < 15) { + if (timeSeries1.length > value.toInt()) { + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + } else + return ''; + } else { + if (value.toInt() == 0) + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + if (value.toInt() == timeSeries1.length - 1) + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + if (xAxixs.contains(value.toInt())) { + return '${timeSeries1[value.toInt()].time.month}/ ${timeSeries1[value.toInt()].time.year}'; + } + } + return ''; + }, + ), + leftTitles: SideTitles( + showTitles: true, + getTextStyles: (value) => const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 10, + ), + getTitles: (value) { + return '${value.toInt()}'; + }, + margin: 12, + ), + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide( + color: Colors.black, + width: 0.5, + ), + left: BorderSide( + color: Colors.black, + ), + right: BorderSide( + color: Colors.black, + ), + top: BorderSide( + color: Colors.transparent, + ), + ), + ), + minX: 0, + maxX: (timeSeries1.length - 1).toDouble(), + maxY: getMaxY()+0.3, + minY: getMinY(), + lineBarsData: getData(context), + ); + } + + double getMaxY() { + double max = 0; + timeSeries1.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + timeSeries2.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble > max) max = resultValueDouble; + }); + + return max.roundToDouble() ; + } + + double getMinY() { + double min = timeSeries1[0].sales; + timeSeries1.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + timeSeries2.forEach((element) { + double resultValueDouble = element.sales; + if (resultValueDouble < min) min = resultValueDouble; + }); + + int value = min.toInt(); + + return value.toDouble(); + } + + List getData(context) { + List spots = List(); + for (int index = 0; index < timeSeries1.length; index++) { + spots.add(FlSpot(index.toDouble(), timeSeries1[index].sales)); + } + + List spots2 = List(); + for (int index = 0; index < timeSeries2.length; index++) { + spots2.add(FlSpot(index.toDouble(), timeSeries2[index].sales)); + } + + final LineChartBarData lineChartBarData1 = LineChartBarData( + spots: spots, + isCurved: true, + colors: [Theme.of(context).primaryColor], + barWidth: 5, + isStrokeCapRound: true, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + final LineChartBarData lineChartBarData2 = LineChartBarData( + spots: spots2, + isCurved: true, + colors: [Colors.grey], + barWidth: 5, + isStrokeCapRound: true, + dotData: FlDotData( + show: false, + ), + belowBarData: BarAreaData( + show: false, + ), + ); + + return [ + lineChartBarData1, + lineChartBarData2 + ]; + } +} diff --git a/lib/pages/medical/vital_sign/vital_sign_details_blood_pressurewideget.dart b/lib/pages/medical/vital_sign/vital_sign_details_blood_pressurewideget.dart new file mode 100644 index 00000000..e28b52e1 --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sign_details_blood_pressurewideget.dart @@ -0,0 +1,146 @@ +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hexcolor/hexcolor.dart'; +import 'package:provider/provider.dart'; + +class VitalSignBloodPressureWidget extends StatefulWidget { + final List vitalList; + final String title1; + final String title2; + final String title3; + final String viewKey1; + final String viewKey2; + + VitalSignBloodPressureWidget( + {Key key, this.vitalList, this.title1, this.title2, this.viewKey1, this.title3, this.viewKey2}); + + @override + _VitalSignDetailsWidgetState createState() => _VitalSignDetailsWidgetState(); +} + +class _VitalSignDetailsWidgetState extends State { + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return Container( + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0)), + border: Border.all(color: Colors.grey, width: 1), + ), + margin: EdgeInsets.all(20), + child: Container( + color: Colors.transparent, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Table( + border: TableBorder.symmetric( + inside: BorderSide(width: 2.0, color: Colors.grey[300]), + ), + children: fullData(projectViewModel), + ), + ], + ), + ), + ); + } + + List fullData(ProjectViewModel projectViewModel) { + List tableRow = []; + tableRow.add(TableRow(children: [ + Container( + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + 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( + TranslationBase.of(context).date, + color: Colors.white, + ), + ), + height: 60, + ), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + + ), + child: Center( + child: Texts(widget.title2, color: Colors.white), + ), + height: 60), + ), + Container( + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.only( + topRight: projectViewModel.isArabic? Radius.circular(0.0):Radius.circular(10.0), + topLeft: projectViewModel.isArabic? Radius.circular(10.0):Radius.circular(0.0) + ), + ), + child: Center( + child: Texts(widget.title3, color: Colors.white), + ), + height: 60), + ), + ])); + widget.vitalList.forEach((vital) { + var data = vital.toJson()[widget.viewKey1]; + if (data != 0) + tableRow.add(TableRow(children: [ + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${projectViewModel.isArabic ? DateUtil.getWeekDayArabic(vital.vitalSignDate.weekday) : DateUtil.getWeekDay(vital.vitalSignDate.weekday)}, ${vital.vitalSignDate.day} ${projectViewModel.isArabic ? DateUtil.getMonthArabic(vital.vitalSignDate.month) : DateUtil.getMonth(vital.vitalSignDate.month)}, ${vital.vitalSignDate.year} ', + textAlign: TextAlign.center, + ), + ), + ), + ), + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${vital.toJson()[widget.viewKey1]}', + textAlign: TextAlign.center, + ), + ), + ), + ), + Container( + child: Container( + padding: EdgeInsets.all(10), + color: Colors.white, + child: Center( + child: Texts( + '${vital.toJson()[widget.viewKey2]}', + textAlign: TextAlign.center, + ), + ), + ), + ), + ])); + }); + return tableRow; + } +} diff --git a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart index 55f91d02..37a81a6d 100644 --- a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/patient_lookup.dart'; import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sing_chart_and_detials.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -38,7 +39,7 @@ class VitalSignItemDetailsScreen extends StatelessWidget { 'viewKey': 'WeightKg', }, { - 'name': 'Body Mass Index', + 'name': 'Body Mass ', 'nameAr': 'مؤشر كتلة الجسم', 'title1': 'Date', 'title2': 'BodyMass', @@ -115,21 +116,16 @@ class VitalSignItemDetailsScreen extends StatelessWidget { case VitalSignDetails.BloodPressure: VSchart = [ { - 'name': 'Blood Pressure Higher', - 'nameAr': 'ضغط الدم الإنقباض', + 'name': 'Blood Pressure Systolic Diastolic', + 'nameAr': 'ضغط الدم الإنقباض الإنبساط', 'title1': 'Date', - 'title2': 'Minute', + 'title2': 'systolic', + 'title3': 'Diastolic', 'title2Ar': 'الإنقباض', - 'viewKey': 'BloodPressureHigher', + 'title3Ar': 'الإنبساط', + 'viewKey': 'BloodPressure', }, - { - 'name': 'Blood Pressure Lower', - 'nameAr': 'ضغط الدم الإنبساط', - 'title1': 'Date', - 'title2': 'Minute', - 'title2Ar': 'الإنبساط', - 'viewKey': 'BloodPressureLower', - } + ]; break; @@ -149,7 +145,7 @@ class VitalSignItemDetailsScreen extends StatelessWidget { case VitalSignDetails.heart: VSchart = [ { - 'name': 'FIO2', + 'name': 'Heart rate', 'nameAr': 'معدل النبض بالدقيقة', 'title1': 'Date', 'title2': 'bpm', @@ -209,6 +205,20 @@ class VitalSignItemDetailsScreen extends StatelessWidget { var vitalListTemp = vitalList.where( (element) => element.toJson()[chartInfo['viewKey']] != null, ); + + if(vitalListTemp.length != 0 && chartInfo['viewKey']=='BloodPressure'){ + return VitalSingChartBloodPressure( + vitalList: vitalList, + name:projectViewModel.isArabic? chartInfo['nameAr']:chartInfo['name'], + title1: chartInfo['title1'], + title2:projectViewModel.isArabic?chartInfo['title2Ar']: chartInfo['title2'], + title3:projectViewModel.isArabic?chartInfo['title3Ar']: chartInfo['title3'], + viewKey1: 'BloodPressureHigher', + viewKey2: 'BloodPressureLower', + + ); + } + return vitalListTemp.length != 0 ? VitalSingChartAndDetials( vitalList: vitalList, diff --git a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart index d6d70cb3..06a31848 100644 --- a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart +++ b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart @@ -46,7 +46,7 @@ class VitalSingChartAndDetials extends StatelessWidget { generateData() { if (vitalList.length > 0) { - vitalList.forEach( + vitalList.reversed.toList().forEach( (element) { if( element.toJson()[viewKey]?.toInt()!=0) timeSeriesData.add( diff --git a/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart b/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart new file mode 100644 index 00000000..1bbf298c --- /dev/null +++ b/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart @@ -0,0 +1,87 @@ +import 'package:diplomaticquarterapp/core/model/vital_sign/vital_sign_res_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_blood_pressurewideget.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_wideget.dart'; +import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_expandable_notifier.dart'; +import 'package:flutter/material.dart'; + +import 'package:charts_flutter/flutter.dart' as charts; + +import 'LineChartCurved.dart'; +import 'LineChartCurvedBloodPressure.dart'; + +class VitalSingChartBloodPressure extends StatelessWidget { + VitalSingChartBloodPressure({ + Key key, + @required this.vitalList, + @required this.name, + @required this.viewKey1, + @required this.viewKey2, + @required this.title1, + @required this.title2, + @required this.title3, + }) : super(key: key); + + final List vitalList; + final String name; + final String viewKey1; + final String viewKey2; + final String title1; + final String title2; + final String title3; + List timeSeriesData1 = []; + List timeSeriesData2 = []; + + @override + Widget build(BuildContext context) { + generateData(); + return Column( + children: [ + AppExpandableNotifier( + isExpand: true, + headerWidget: LineChartCurvedBloodPressure( + title: name, + timeSeries1: timeSeriesData1, + timeSeries2: timeSeriesData2, + indexes: timeSeriesData1.length ~/ 5.5, + ), + bodyWidget: VitalSignBloodPressureWidget( + vitalList: vitalList, + title1: title1, + title2: title2, + title3: title3, + viewKey1: viewKey1, + viewKey2: viewKey2, + ), + ), + ], + ); + } + + generateData() { + if (vitalList.length > 0) { + vitalList.reversed.toList().forEach( + (element) { + if (element.toJson()[viewKey1]?.toInt() != 0) + timeSeriesData1.add( + TimeSeriesSales2( + new DateTime(element.vitalSignDate.year, + element.vitalSignDate.month, element.vitalSignDate.day), + element.toJson()[viewKey1].toDouble(), + ), + ); + if (element.toJson()[viewKey2]?.toInt() != 0) + timeSeriesData2.add( + TimeSeriesSales2( + new DateTime(element.vitalSignDate.year, + element.vitalSignDate.month, element.vitalSignDate.day), + element.toJson()[viewKey2].toDouble(), + ), + ); + + var asd=""; + }, + ); + } + } +} diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 2952c132..7365a598 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1052,6 +1052,7 @@ class TranslationBase { String get requestReport => localizedValues['requestReport'][locale.languageCode]; String get confirmMsgReport => localizedValues['confirm-msg-report'][locale.languageCode]; String get successSendReport => localizedValues['successSendReport'][locale.languageCode]; + String get pulseTitle => localizedValues['pulseTitle'][locale.languageCode]; } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/data_display/medical/LabResult/lab_result_chart_and_detials.dart b/lib/widgets/data_display/medical/LabResult/lab_result_chart_and_detials.dart index e726ff44..767649a8 100644 --- a/lib/widgets/data_display/medical/LabResult/lab_result_chart_and_detials.dart +++ b/lib/widgets/data_display/medical/LabResult/lab_result_chart_and_detials.dart @@ -31,7 +31,7 @@ class LabResultChartAndDetails extends StatelessWidget { child: LineChartCurved(title: name,labResult:labResult,), ), bodyWidget: LabResultDetailsWidget( - labResult: labResult, + labResult: labResult.reversed.toList(), ), isExpand: true, ), diff --git a/lib/widgets/dialogs/confirm_send_email_dialog.dart b/lib/widgets/dialogs/confirm_send_email_dialog.dart index 694a1268..96c7a7c8 100644 --- a/lib/widgets/dialogs/confirm_send_email_dialog.dart +++ b/lib/widgets/dialogs/confirm_send_email_dialog.dart @@ -41,6 +41,7 @@ class _ConfirmSendEmailDialogState extends State { Center( child: Texts( TranslationBase.of(context).sendConfEmail, + fontSize: 14, color: Colors.grey, ), ), diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index 3a80c598..2c09df47 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -550,7 +550,6 @@ class _AppDrawerState extends State { .silentLoggin(user is AuthenticatedUser ? null : user, mainUser: user is AuthenticatedUser) .then((value) async { - await authenticatedUserObject.getUser(); _vitalSignService.heightCm = ""; _vitalSignService.weightKg = ""; GifLoaderDialogUtils.hideDialog(context); @@ -579,7 +578,7 @@ class _AppDrawerState extends State { this.sharedPref.setObject(FAMILY_FILE, familyFile); this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); - //this.checkIfUserAgreedBefore(result), + await authenticatedUserObject.getUser(getUser: true); appointmentRateViewModel .getIsLastAppointmentRatedList() .then((value) => { diff --git a/lib/widgets/others/app_scaffold_widget.dart b/lib/widgets/others/app_scaffold_widget.dart index cdc6025a..f9e07f6f 100644 --- a/lib/widgets/others/app_scaffold_widget.dart +++ b/lib/widgets/others/app_scaffold_widget.dart @@ -1,31 +1,20 @@ import 'package:diplomaticquarterapp/config/config.dart'; -import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.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/insurance/insurance_update_screen.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/data_display/text.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'; -import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart'; -import 'package:diplomaticquarterapp/widgets/robo-search/search.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.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'; +// ignore: must_be_immutable class AppScaffold extends StatelessWidget { final String appBarTitle; final Widget body; @@ -38,7 +27,6 @@ class AppScaffold extends StatelessWidget { final Widget floatingActionButton; final String title; final String description; - final String image; final bool isShowDecPage; final List infoList; final List imagesInfo; @@ -58,7 +46,6 @@ class AppScaffold extends StatelessWidget { this.description, this.isShowDecPage = true, this.isBottomBar, - this.image, this.infoList, this.imagesInfo}); @@ -93,72 +80,38 @@ class AppScaffold extends StatelessWidget { ), centerTitle: true, actions: [ - image != null - ? InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: InsuranceUpdate(), - ), - ), - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Image.asset( - image, - height: SizeConfig.heightMultiplier * 5, - width: SizeConfig.heightMultiplier * 5, - color: Colors.white, - ), - ), - ) - : IconButton( - icon: Icon(FontAwesomeIcons.home), - color: Colors.white, - onPressed: () { - Navigator.pushAndRemoveUntil( - context, - MaterialPageRoute( - builder: (context) => LandingPage()), - (Route r) => false); - }, - ), + IconButton( + icon: Icon(FontAwesomeIcons.home), + color: Colors.white, + onPressed: () { + Navigator.pushAndRemoveUntil( + context, + MaterialPageRoute(builder: (context) => LandingPage()), + (Route r) => false); + }, + ), ], ) : null, body: (!Provider.of(context, listen: false).isLogin && isShowDecPage) ? NotAutPage( - title: appBarTitle, + title: title?? appBarTitle, description: description, infoList: infoList, imagesInfo: imagesInfo, ) : baseViewModel != null ? NetworkBaseView( - child: buildBodyWidget(), + child: body, baseViewModel: baseViewModel, ) - : buildBodyWidget(), + : body, bottomSheet: (Provider.of(context, listen: false).isLogin || !isShowDecPage) ? bottomSheet : null, - //floatingActionButton: floatingActionButton ?? floatingActionButton, - // bottomNavigationBar: - // this.isBottomBar == true ? BottomBarSearch() : SizedBox() - // floatingActionButton: FloatingSearchButton(), ); } - - buildAppLoaderWidget(bool isLoading) { - return isLoading ? AppLoaderWidget() : Container(); - } - - buildBodyWidget() { - // return body; //Stack(children: [body, buildAppLoaderWidget(isLoading)]); - return Stack(children: [ - body, /*FloatingSearchButton()*/ - ]); - } } From a0baaac3141b4aabc95892b5de29bfdb9bd08251 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sat, 19 Dec 2020 13:18:23 +0300 Subject: [PATCH 06/34] bug fixes --- lib/core/service/weather_service.dart | 1 + lib/pages/landing/landing_page.dart | 39 +++++++++++++------ lib/pages/login/confirm-login.dart | 3 ++ .../authentication/auth_provider.dart | 2 +- lib/widgets/drawer/app_drawer_widget.dart | 2 +- lib/widgets/otp/sms-popup.dart | 11 +++--- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/lib/core/service/weather_service.dart b/lib/core/service/weather_service.dart index 679a4c9d..10ab1adf 100644 --- a/lib/core/service/weather_service.dart +++ b/lib/core/service/weather_service.dart @@ -21,6 +21,7 @@ class WeatherService extends BaseService { await baseAppClient.post(WEATHER_INDICATOR, onSuccess: (dynamic response, int statusCode) { + weatherIndicatorData = []; response['GetCityInfo_List'].forEach((data) { weatherIndicatorData.add(GetCityInfoList.fromJson(data)); }); diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index bb629f6b..fe4e82ca 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -516,14 +516,15 @@ class _LandingPageState extends State with WidgetsBindingObserver { // ); // themeNotifier.setTheme(defaultTheme); } - void checkUserStatus(token) async { - //GifLoaderDialogUtils.showMyDialog(context); - authService - .selectDeviceImei(token) - .then((SelectDeviceIMEIRES value) => setUserValues(value)) - .catchError((err) { - //GifLoaderDialogUtils.hideDialog(context); - }); + void checkUserStatus(token, {isLoader}) async { + if (isLoader) + //GifLoaderDialogUtils.showMyDialog(context); + authService + .selectDeviceImei(token) + .then((SelectDeviceIMEIRES value) => setUserValues(value)) + .catchError((err) { + //GifLoaderDialogUtils.hideDialog(context); + }); } static Future myBackgroundMessageHandler( @@ -560,9 +561,25 @@ class _LandingPageState extends State with WidgetsBindingObserver { if (data != null) { Navigator.of(context).pushNamed(CONFIRM_LOGIN); } else { - Navigator.of(context).pushNamed( - WELCOME_LOGIN, - ); + GifLoaderDialogUtils.showMyDialog(context); + authService + .selectDeviceImei(DEVICE_TOKEN) + .then((SelectDeviceIMEIRES value) { + GifLoaderDialogUtils.hideDialog(context); + if (value != null) { + setUserValues(value); + Navigator.of(context).pushNamed(CONFIRM_LOGIN); + } else { + Navigator.of(context).pushNamed( + WELCOME_LOGIN, + ); + } + }).catchError((err) { + GifLoaderDialogUtils.hideDialog(context); + Navigator.of(context).pushNamed( + WELCOME_LOGIN, + ); + }); } } diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index a3537e54..37ce9bc2 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -540,6 +540,9 @@ class _ConfirmLogin extends State { .catchError((err) { print(err); GifLoaderDialogUtils.hideDialog(context); + Future.delayed(Duration(seconds: 1), () { + AppToast.showErrorToast(message: err); + }); }); } diff --git a/lib/services/authentication/auth_provider.dart b/lib/services/authentication/auth_provider.dart index d4e6dd22..8f0ea470 100644 --- a/lib/services/authentication/auth_provider.dart +++ b/lib/services/authentication/auth_provider.dart @@ -258,7 +258,7 @@ class AuthProvider with ChangeNotifier { sharedPref.setString(BLOOD_TYPE, localRes['PatientBloodType']); return Future.value(localRes); } catch (error) { - throw error; + throw localRes; //return Future.value(error); } } diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index 3a80c598..0f6f60db 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -370,7 +370,7 @@ class _AppDrawerState extends State { "https://apps.apple.com/sa/app/dr-suliaman-alhabib/id733503978"); } else { launch( - "https://play.google.com/store/apps/details?id=com.ejada.hmg&hl=en"); + "https://play.google.com/store/apps/details?id=com.cloud.diplomaticquarterapp&hl=en"); } }, ), diff --git a/lib/widgets/otp/sms-popup.dart b/lib/widgets/otp/sms-popup.dart index 1694f675..703886d0 100644 --- a/lib/widgets/otp/sms-popup.dart +++ b/lib/widgets/otp/sms-popup.dart @@ -114,7 +114,7 @@ class SMSOTP { textInputAction: TextInputAction.next, style: buildTextStyle(), autofocus: true, - // maxLength: 1, + maxLength: 1, controller: digit1, textAlign: TextAlign.center, keyboardType: TextInputType.number, @@ -141,7 +141,7 @@ class SMSOTP { child: TextFormField( focusNode: focusD2, textInputAction: TextInputAction.next, - // maxLength: 1, + maxLength: 1, controller: digit2, textAlign: TextAlign.center, style: buildTextStyle(), @@ -168,7 +168,7 @@ class SMSOTP { child: TextFormField( focusNode: focusD3, textInputAction: TextInputAction.next, - // maxLength: 1, + maxLength: 1, controller: digit3, textAlign: TextAlign.center, style: buildTextStyle(), @@ -194,7 +194,7 @@ class SMSOTP { width: SizeConfig.realScreenWidth * 0.15, child: TextFormField( focusNode: focusD4, - // maxLength: 1, + maxLength: 1, textAlign: TextAlign.center, style: buildTextStyle(), controller: digit4, @@ -242,8 +242,9 @@ class SMSOTP { InputDecoration buildInputDecoration(BuildContext context) { return InputDecoration( + counterText: " ", // ts/images/password_icon.png - contentPadding: EdgeInsets.only(top: 20, bottom: 20), + // contentPadding: EdgeInsets.only(top: 20, bottom: 20), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10)), borderSide: BorderSide(color: Colors.black), From 9c12e949e8e26fbf944774d0c86ec7fa6041e903 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 21 Dec 2020 15:02:05 +0200 Subject: [PATCH 07/34] hot fixes --- .../images/{ => medical}/vital_sign_icon.png | Bin lib/config/config.dart | 3 + lib/config/localized_values.dart | 70 ++++++ .../insurance/Insurance_card_details.dart | 88 +++++++ ....dart => insurance_card_update_model.dart} | 0 lib/core/service/client/base_app_client.dart | 13 +- lib/core/service/insurance_service.dart | 40 ++- .../service/medical/my_balance_service.dart | 4 + lib/core/service/pharmacies_service.dart | 2 +- lib/core/viewModels/base_view_model.dart | 5 + lib/core/viewModels/dashboard_view_model.dart | 5 +- .../viewModels/insurance_card_View_model.dart | 11 +- .../medical/my_balance_view_model.dart | 2 +- .../new_e_referral_step_three_page.dart | 91 ++++--- lib/pages/DrawerPages/family/my-family.dart | 3 + lib/pages/feedback/send_feedback_page.dart | 7 +- .../AttachInsuranceCardImageDialog.dart | 147 +++++++++++ .../insurance_card_update_details.dart | 235 ++++++++++++++++++ .../insurance/insurance_update_screen.dart | 202 ++++++++------- lib/pages/landing/home_page.dart | 14 +- .../balance/dialogs/ConfirmSMSDialog.dart | 8 +- lib/pages/medical/medical_profile_page.dart | 20 +- .../medical/reports/report_home_page.dart | 1 + .../LineChartCurvedBloodPressure.dart | 65 +++-- .../vital_sign/vital_sign_details_screen.dart | 4 +- .../vital_sign_item_details_screen.dart | 2 +- .../vital_sing_chart_blood_pressure.dart | 2 - .../rate_appointment_doctor.dart | 4 +- lib/pages/settings/settings.dart | 4 + lib/uitl/translations_delegate_base.dart | 12 + lib/widgets/bottom_options/BottomSheet.dart | 6 +- lib/widgets/buttons/secondary_button.dart | 4 +- .../dialogs/confirm_send_email_dialog.dart | 14 +- lib/widgets/drawer/app_drawer_widget.dart | 1 + 34 files changed, 910 insertions(+), 179 deletions(-) rename assets/images/{ => medical}/vital_sign_icon.png (100%) create mode 100644 lib/core/model/insurance/Insurance_card_details.dart rename lib/core/model/insurance/{insurance_card_update.dart => insurance_card_update_model.dart} (100%) create mode 100644 lib/pages/insurance/AttachInsuranceCardImageDialog.dart create mode 100644 lib/pages/insurance/insurance_card_update_details.dart diff --git a/assets/images/vital_sign_icon.png b/assets/images/medical/vital_sign_icon.png similarity index 100% rename from assets/images/vital_sign_icon.png rename to assets/images/medical/vital_sign_icon.png diff --git a/lib/config/config.dart b/lib/config/config.dart index c2c1ef77..62eacd03 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -267,6 +267,9 @@ const GET_PAtIENTS_INSURANCE_UPDATED = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; const INSURANCE_DETAILS = "Services/Patients.svc/REST/Get_InsuranceCheckList"; +const GET_PATIENT_INSURANCE_DETAILS = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceDetails"; +const UPLOAD_INSURANCE_CARD = 'Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate'; + const GET_VACCINES = "Services/Patients.svc/REST/GetDoneVaccinesByPatientID"; const GET_VACCINES_EMAIL = "Services/Notifications.svc/REST/SendVaccinesEmail"; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 6314cebd..4b9c33dd 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1211,4 +1211,74 @@ const Map localizedValues = { "en": "Heart rate", "ar": "معدل النبض بالدقيقة" }, + "systolic-lng": { + "en": "Systolic", + "ar": "الإنقباض" + }, + "diastolic-lng": { + "en": "Diastolic", + "ar": "الإنبساط" + }, + "policy-holder": { + "en": "Policy Holder", + "ar": "حامل بطاقة التأمين" + }, + "policy-no": { + "en": "Policy Number", + "ar": "رقم سياسات" + }, + "agree": { + "en": "I agree, this is the correct information", + "ar": "موافق، هذه المعلومات صحيحة" + }, + "disagree": { + "en": "No, this is not the correct information", + "ar": "غير موافق، هذه المعلومات غير الصحيحة" + }, + "expiry-date": { + "en": "Expiry Date", + "ar": "تاريخ انتهاء الصلاحية" + }, + "class": { + "en": "Class", + "ar": "فئة" + }, + "approval": { + "en": "Approval", + "ar": "موافقة" + }, + "no-data": { + "en": "No data found", + "ar": "لاتوجد بيانات" + }, + "insurance-details": { + "en": "Insurance Details", + "ar": "تفاصيل التأمين" + }, + "nearest-hospital": { + "en": "Nearest Hospital", + "ar": "أقرب مستشفى" + }, + "request-sent": { + "en": "Request sent successfully", + "ar": "تم إرسال الطلب بنجاح" + }, + "message-sent": { + "en": "Message sent successfully", + "ar": "تم إرسال الرسالة بنجاح" + }, + "sent-on": { + "en": "Sent on", + "ar": "أرسلت في" + }, + "attach-insurace-image": { + "en": "Attach insurance card image", + "ar": "إرفاق صورة بطاقة التأمين" + }, + "upload-without-image": { + "en": "You can still submit, if you don't have Insurance Image", + "ar": "لا يزال بإمكانك الإرسال ، إذا لم يكن لديك صورة تأمين" + }, + + }; diff --git a/lib/core/model/insurance/Insurance_card_details.dart b/lib/core/model/insurance/Insurance_card_details.dart new file mode 100644 index 00000000..ddc33b2e --- /dev/null +++ b/lib/core/model/insurance/Insurance_card_details.dart @@ -0,0 +1,88 @@ +class InsuranceCardDetailsModel { + int approvalLimit; + int companyGroupID; + String companyName; + String companyRemarks; + String dOB; + int deductible; + String effectiveFrom; + String effectiveTo; + String eligabilityFailureReason; + bool isMemberEligible; + String memberID; + String memberName; + String memberStatus; + dynamic message; + String nationalId; + String policyNumber; + String responseMessage; + String room; + String subCategory; + + InsuranceCardDetailsModel( + {this.approvalLimit, + this.companyGroupID, + this.companyName, + this.companyRemarks, + this.dOB, + this.deductible, + this.effectiveFrom, + this.effectiveTo, + this.eligabilityFailureReason, + this.isMemberEligible, + this.memberID, + this.memberName, + this.memberStatus, + this.message, + this.nationalId, + this.policyNumber, + this.responseMessage, + this.room, + this.subCategory}); + + InsuranceCardDetailsModel.fromJson(Map json) { + approvalLimit = json['ApprovalLimit']; + companyGroupID = json['CompanyGroupID']; + companyName = json['CompanyName']; + companyRemarks = json['CompanyRemarks']; + dOB = json['DOB']; + deductible = json['Deductible']; + effectiveFrom = json['EffectiveFrom']; + effectiveTo = json['EffectiveTo']; + eligabilityFailureReason = json['EligabilityFailureReason']; + isMemberEligible = json['IsMemberEligible']; + memberID = json['MemberID']; + memberName = json['MemberName']; + memberStatus = json['MemberStatus']; + message = json['Message']; + nationalId = json['NationalId']; + policyNumber = json['PolicyNumber']; + responseMessage = json['ResponseMessage']; + room = json['Room']; + subCategory = json['SubCategory']; + } + + Map toJson() { + final Map data = new Map(); + data['ApprovalLimit'] = this.approvalLimit; + data['CompanyGroupID'] = this.companyGroupID; + data['CompanyName'] = this.companyName; + data['CompanyRemarks'] = this.companyRemarks; + data['DOB'] = this.dOB; + data['Deductible'] = this.deductible; + data['EffectiveFrom'] = this.effectiveFrom; + data['EffectiveTo'] = this.effectiveTo; + data['EligabilityFailureReason'] = this.eligabilityFailureReason; + data['IsMemberEligible'] = this.isMemberEligible; + data['MemberID'] = this.memberID; + data['MemberName'] = this.memberName; + data['MemberStatus'] = this.memberStatus; + data['Message'] = this.message; + data['NationalId'] = this.nationalId; + data['PolicyNumber'] = this.policyNumber; + data['ResponseMessage'] = this.responseMessage; + data['Room'] = this.room; + data['SubCategory'] = this.subCategory; + return data; + } +} diff --git a/lib/core/model/insurance/insurance_card_update.dart b/lib/core/model/insurance/insurance_card_update_model.dart similarity index 100% rename from lib/core/model/insurance/insurance_card_update.dart rename to lib/core/model/insurance/insurance_card_update_model.dart diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index c5dfc90d..54ba6963 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -132,7 +132,14 @@ class BaseAppClient { } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode); - } else if (!parsed['IsAuthenticated']) { + } + else if(parsed['MessageStatus'] == 2){ + onFailure( + parsed['message'] ?? parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], + statusCode); + } + + else if (!parsed['IsAuthenticated']) { await logout(); //helpers.showErrorToast('Your session expired Please login agian'); @@ -151,7 +158,7 @@ class BaseAppClient { onFailure('Please Check The Internet Connection', -1); } } catch (e) { - //print(e); + print(e); // if (e is String) { onFailure(e.toString(), -1); @@ -166,7 +173,7 @@ class BaseAppClient { await authenticatedUserObject.getUser(); Provider.of(AppGlobal.context, listen: false).isLogin = false; - var model = Provider.of(AppGlobal.context); + var model = Provider.of(AppGlobal.context,listen: false); _vitalSignService.weightKg = ""; _vitalSignService.heightCm = ""; model.setState(0, false); diff --git a/lib/core/service/insurance_service.dart b/lib/core/service/insurance_service.dart index 790003e9..900078d2 100644 --- a/lib/core/service/insurance_service.dart +++ b/lib/core/service/insurance_service.dart @@ -1,8 +1,9 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/insurance/Insurance_card_details.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/model/insurance/insurance_card_update_model.dart'; import 'package:diplomaticquarterapp/core/service/base_service.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordsByStatusReq.dart'; @@ -20,6 +21,8 @@ class InsuranceCardService extends BaseService { List get insuranceApproval => _insuranceApproval; + InsuranceCardDetailsModel insuranceCardDetails; + GetAllSharedRecordsByStatusResponse getAllSharedRecordsByStatusResponse = GetAllSharedRecordsByStatusResponse(); @@ -136,4 +139,39 @@ class InsuranceCardService extends BaseService { }, body:{'CompanyID': data.companyID,'SubCategoryID':data.subCategoryID },); return Future.value(localRes); } + + Future getPatientInsuranceDetails({String setupID, int projectID, String patientIdentificationID,int patientID}) async{ + error = ""; + insuranceCardDetails = null; + await baseAppClient.post(GET_PATIENT_INSURANCE_DETAILS, + onSuccess: (dynamic response, int statusCode) { + insuranceCardDetails = null; + response['List_PatientInsuranceDetails'].forEach((item) { + insuranceCardDetails = InsuranceCardDetailsModel.fromJson(item); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body:{'SetupID': setupID,'ProjectID':projectID,'PatientIdentificationID':patientIdentificationID ,'isDentalAllowedBackend':false,'PatientID':patientID},); + + } + + Future uploadInsuranceCard({ String patientIdentificationID,int patientID,String image=""}) async{ + error = ""; + Map body = Map(); + body['PatientID']=patientID; + body['PatientType']=user.patientType; + body['MobileNo']=user.mobileNumber; + body['PatientIdentificationID']=patientIdentificationID; + body['InsuranceCardImage']= image; + + await baseAppClient.post(UPLOAD_INSURANCE_CARD, + onSuccess: (dynamic response, int statusCode) { + + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body:body,); + + } } diff --git a/lib/core/service/medical/my_balance_service.dart b/lib/core/service/medical/my_balance_service.dart index e3be9bcf..32d3de39 100644 --- a/lib/core/service/medical/my_balance_service.dart +++ b/lib/core/service/medical/my_balance_service.dart @@ -25,6 +25,10 @@ class MyBalanceService extends BaseService { AuthenticatedUserObject authenticatedUserObject = locator(); + MyBalanceService(){ + getFamilyFiles(); + } + getPatientAdvanceBalanceAmount() async { hasError = false; super.error = ""; diff --git a/lib/core/service/pharmacies_service.dart b/lib/core/service/pharmacies_service.dart index 9fc7d3f5..dbd4fae1 100644 --- a/lib/core/service/pharmacies_service.dart +++ b/lib/core/service/pharmacies_service.dart @@ -77,7 +77,7 @@ class PharmacyService extends BaseService { hasError = false; await _getCurrentLocation(); Map body = Map(); - body['PHR_itemName'] = drugName; + body['PHR_itemName'] = drugName.trim(); body['isLoginForDoctorApp'] = true; body['isDentalAllowedBackend'] = true; body['PageSize'] = 25; diff --git a/lib/core/viewModels/base_view_model.dart b/lib/core/viewModels/base_view_model.dart index db709f6b..aab267e9 100644 --- a/lib/core/viewModels/base_view_model.dart +++ b/lib/core/viewModels/base_view_model.dart @@ -29,6 +29,11 @@ class BaseViewModel extends ChangeNotifier { if (hasListeners) notifyListeners(); } + setUser(AuthenticatedUser user){ + this.user = user; + notifyListeners(); + } + BaseViewModel() { //authenticatedUserObject.getUser(); user = authenticatedUserObject.user; diff --git a/lib/core/viewModels/dashboard_view_model.dart b/lib/core/viewModels/dashboard_view_model.dart index e98ca341..ff0e7c5e 100644 --- a/lib/core/viewModels/dashboard_view_model.dart +++ b/lib/core/viewModels/dashboard_view_model.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; @@ -10,12 +11,12 @@ class DashboardViewModel extends BaseViewModel { String get weightKg => _vitalSignService.weightKg; String get heightCm => _vitalSignService.heightCm; - String bloadType = ""; - + String booldType=""; // ToDoCountProviderModel toDoProvider = // Provider.of(AppGlobal.context); getPatientRadOrders() async { + booldType = await sharedPref.getString(BLOOD_TYPE); if (isLogin && _vitalSignService.weightKg.isEmpty) { setState(ViewState.Busy); await _vitalSignService.getPatientRadOrders(); diff --git a/lib/core/viewModels/insurance_card_View_model.dart b/lib/core/viewModels/insurance_card_View_model.dart index 7029f082..234db5d4 100644 --- a/lib/core/viewModels/insurance_card_View_model.dart +++ b/lib/core/viewModels/insurance_card_View_model.dart @@ -1,7 +1,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.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/model/insurance/insurance_card_update_model.dart'; import 'package:diplomaticquarterapp/core/service/insurance_service.dart'; import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; @@ -72,5 +72,14 @@ class InsuranceViewModel extends BaseViewModel { } else setState(ViewState.Idle); } + Future uploadInsuranceCard({String patientIdentificationID, int patientID,String image =""}) async { + setState(ViewState.BusyLocal); + await _insuranceCardService.uploadInsuranceCard(patientIdentificationID: patientIdentificationID,patientID: patientID,image: image); + if (_insuranceCardService.hasError) { + error = _insuranceCardService.error; + setState(ViewState.ErrorLocal); + } else + setState(ViewState.Idle); + } } diff --git a/lib/core/viewModels/medical/my_balance_view_model.dart b/lib/core/viewModels/medical/my_balance_view_model.dart index e86ed55b..34244ee1 100644 --- a/lib/core/viewModels/medical/my_balance_view_model.dart +++ b/lib/core/viewModels/medical/my_balance_view_model.dart @@ -152,7 +152,7 @@ class MyBalanceViewModel extends BaseViewModel { Future getFamilyFiles() async { setState(ViewState.Busy); - await _myBalanceService.getSharedRecordByStatus(); + await _myBalanceService.getFamilyFiles(); if (_myBalanceService.hasError) { error = _myBalanceService.error; setState(ViewState.ErrorLocal); diff --git a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart index d84b9d61..a823c154 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/New_E_Referral/new_e_referral_step_three_page.dart @@ -15,7 +15,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import '../dialogs/select_city_dialog.dart'; - +import 'dart:io'; class NewEReferralStepThreePage extends StatefulWidget { final CreateEReferralRequestModel createEReferralRequestModel; final Function changePageViewIndex; @@ -101,12 +101,17 @@ class _NewEReferralStepThreePageState extends State { InkWell( onTap: () { ImageOptions.showImageOptions(context, - (String image) { + (String image,File file) { setState(() { - EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${ medicalReportImages.length +1}.png',base64String: image ); - medicalReportImages.add(eReferralAttachment); + EReferralAttachment eReferralAttachment = + new EReferralAttachment( + fileName: + 'image ${medicalReportImages.length + 1}.png', + base64String: image); + medicalReportImages + .add(eReferralAttachment); }); - }); + }, ); }, child: Container( margin: EdgeInsets.only( @@ -158,15 +163,17 @@ class _NewEReferralStepThreePageState extends State { width: 8, ), Texts( - medicalReportImages[index].fileName, + medicalReportImages[index] + .fileName, ), ], ), InkWell( onTap: () { setState(() { - medicalReportImages - .remove(medicalReportImages[index]); + medicalReportImages.remove( + medicalReportImages[ + index]); }); }, child: Icon( @@ -262,12 +269,12 @@ class _NewEReferralStepThreePageState extends State { ], ), ), - if(isPatientInsured) - SizedBox( - height: 12, - ), + if (isPatientInsured) + SizedBox( + height: 12, + ), Opacity( - opacity: isPatientInsured?1:0, + opacity: isPatientInsured ? 1 : 0, child: Container( padding: EdgeInsets.only(top: 10), decoration: BoxDecoration( @@ -276,16 +283,21 @@ class _NewEReferralStepThreePageState extends State { ), child: Column( children: [ - InkWell( onTap: () { ImageOptions.showImageOptions(context, - (String image) { + (String image,File file) { setState(() { + EReferralAttachment + eReferralAttachment = + new EReferralAttachment( + fileName: + 'image ${medicalReportImages.length + 1}.png', + base64String: image); - EReferralAttachment eReferralAttachment = new EReferralAttachment(fileName: 'image ${ medicalReportImages.length +1}.png',base64String: image ); - - insuredPatientImages=[eReferralAttachment]; + insuredPatientImages = [ + eReferralAttachment + ]; }); }); }, @@ -333,8 +345,8 @@ class _NewEReferralStepThreePageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ - Icon( - FontAwesomeIcons.paperclip), + Icon(FontAwesomeIcons + .paperclip), SizedBox( width: 8, ), @@ -346,8 +358,9 @@ class _NewEReferralStepThreePageState extends State { InkWell( onTap: () { setState(() { - insuredPatientImages - .remove(insuredPatientImages[index]); + insuredPatientImages.remove( + insuredPatientImages[ + index]); }); }, child: Icon( @@ -378,25 +391,37 @@ class _NewEReferralStepThreePageState extends State { textColor: Colors.white, label: "Submit", onTap: () async { - this.widget.createEReferralRequestModel.medicalReportAttachment = medicalReportImages; - this.widget.createEReferralRequestModel.insuranceCardAttachment = insuredPatientImages.length !=0?insuredPatientImages[0]:null; - this.widget.createEReferralRequestModel.isInsuredPatient = isPatientInsured; + this + .widget + .createEReferralRequestModel + .medicalReportAttachment = medicalReportImages; + this + .widget + .createEReferralRequestModel + .insuranceCardAttachment = + insuredPatientImages.length != 0 + ? insuredPatientImages[0] + : null; + this.widget.createEReferralRequestModel.isInsuredPatient = + isPatientInsured; // ToDo make the preferred Branch info dynamic - this.widget.createEReferralRequestModel.preferredBranchCode = 15; - this.widget.createEReferralRequestModel. preferredBranchName= "Arryan Hospital"; - - + this.widget.createEReferralRequestModel.preferredBranchCode = + 15; + this.widget.createEReferralRequestModel.preferredBranchName = + "Arryan Hospital"; // this.widget.createEReferralRequestModel.fullName= ""; - this.widget.createEReferralRequestModel.otherRelationship= ""; + this.widget.createEReferralRequestModel.otherRelationship = + ""; // this.widget.createEReferralRequestModel.; // this.widget.createEReferralRequestModel. preferredBranchName= "Arryan Hospital"; // this.widget.createEReferralRequestModel. preferredBranchName= "Arryan Hospital"; - await model.createEReferral(this.widget.createEReferralRequestModel); + await model + .createEReferral(this.widget.createEReferralRequestModel); }, loading: model.state == ViewState.BusyLocal, - disabled: medicalReportImages.length == 0 , + disabled: medicalReportImages.length == 0, ), ))); } @@ -416,12 +441,10 @@ class _NewEReferralStepThreePageState extends State { ); } - String getRelationName() { if (_selectedCity != null) return _selectedCity.description; else return "Select Relationship" /*TranslationBase.of(context).selectHospital*/; } - } diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 62dae624..7a28b3f9 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -720,6 +720,9 @@ class _MyFamily extends State with TickerProviderStateMixin { this.sharedPref.setObject(FAMILY_FILE, familyFile); this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); + await authenticatedUserObject.getUser(getUser: true); + Provider.of(context, listen: false).setUser( authenticatedUserObject.user); + //this.checkIfUserAgreedBefore(result), Navigator.of(context).pushNamed( HOME, diff --git a/lib/pages/feedback/send_feedback_page.dart b/lib/pages/feedback/send_feedback_page.dart index 6f1d7871..4d511452 100644 --- a/lib/pages/feedback/send_feedback_page.dart +++ b/lib/pages/feedback/send_feedback_page.dart @@ -15,7 +15,8 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; - +import 'dart:convert'; +import 'dart:io'; import 'appointment_history.dart'; class SendFeedbackPage extends StatefulWidget { @@ -343,11 +344,11 @@ class _SendFeedbackPageState extends State { ), InkWell( onTap: () { - ImageOptions.showImageOptions(context, (String image) { + ImageOptions.showImageOptions(context, (String image,File file) { setState(() { images.add(image); }); - }); + } ); }, child: Container( margin: EdgeInsets.only(left: 10, right: 10, top: 15), diff --git a/lib/pages/insurance/AttachInsuranceCardImageDialog.dart b/lib/pages/insurance/AttachInsuranceCardImageDialog.dart new file mode 100644 index 00000000..20e17593 --- /dev/null +++ b/lib/pages/insurance/AttachInsuranceCardImageDialog.dart @@ -0,0 +1,147 @@ +import 'dart:io'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/bottom_options/BottomSheet.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class AttachInsuranceCardImageDialog extends StatefulWidget { + final String name; + final String fileNo; + final Function(File file, String image) image; + + const AttachInsuranceCardImageDialog( + {Key key, this.name, this.fileNo, this.image}) + : super(key: key); + + @override + _AttachInsuranceCardImageDialogState createState() => + _AttachInsuranceCardImageDialogState(); +} + +class _AttachInsuranceCardImageDialogState + extends State { + @override + void initState() { + super.initState(); + } + + String image; + File file; + + @override + Widget build(BuildContext context) { + return SimpleDialog( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Texts(TranslationBase.of(context).attachInsuraceImage), + Divider(), + Texts(widget.name), + SizedBox( + height: 3, + ), + Texts(TranslationBase.of(context).fileNo + " " + widget.fileNo), + SizedBox( + height: 5.0, + ), + InkWell( + onTap: () { + ImageOptions.showImageOptions(context, (String image,File file) { + setState(() { + this.image = image; + this.file = file; + }); + }); + }, + child: image == null + ? Padding( + padding: const EdgeInsets.all(18.0), + child: Container( + width: double.maxFinite, + height: 250, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(2), + border: Border.all(color: Colors.grey, width: 1.5)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment., + children: [ + SizedBox(height: 25,), + Icon( + Icons.camera_enhance_rounded, + size: 85, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.attach_file), + Texts(TranslationBase.of(context).selectAttachment.toUpperCase()) + ], + ), + ], + ), + ), + ) + : Image.file( + file, + fit: BoxFit.fill, + height: 250, + ), + ), + SizedBox( + height: 25.0, + ), + Divider(), + Row( + children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + child: Center( + child: Texts( + TranslationBase.of(context).cancel.toUpperCase(), + color: Colors.red, + ), + ), + ), + ), + ), + ), + Container( + width: 1, + height: 30, + color: Colors.grey[500], + ), + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.pop(context); + widget.image(file, image); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Texts( + TranslationBase.of(context).ok, + fontWeight: FontWeight.w400, + )), + ), + ), + ), + ], + ) + ], + ) + ], + ); + } +} diff --git a/lib/pages/insurance/insurance_card_update_details.dart b/lib/pages/insurance/insurance_card_update_details.dart new file mode 100644 index 00000000..a471fea2 --- /dev/null +++ b/lib/pages/insurance/insurance_card_update_details.dart @@ -0,0 +1,235 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/insurance/Insurance_card_details.dart'; +import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'AttachInsuranceCardImageDialog.dart'; + +class InsuranceCardUpdateDetails extends StatelessWidget { + final InsuranceCardDetailsModel insuranceCardDetailsModel; + final String patientIdentificationID; + final int patientID; + final String name; + + + const InsuranceCardUpdateDetails({Key key, + this.insuranceCardDetailsModel, + this.patientIdentificationID, + this.patientID, this.name}) + : super(key: key); + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + return BaseView( + builder: (context, model, w) => + AppScaffold( + isShowAppBar: true, + isShowDecPage: false, + appBarTitle: TranslationBase + .of(context) + .cardDetail, + body: SingleChildScrollView( + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: double.maxFinite, + margin: EdgeInsets.only(left: 8, right: 8, top: 8), + height:projectViewModel.isArabic?350: 270, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25), + color: Color(0xff515B5D), + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + insuranceCardDetailsModel.memberID, + textScaleFactor: 2.1, + style: TextStyle(color: Colors.white, + letterSpacing: 8.0, + fontWeight: FontWeight.w400, + fontSize: 17), + ), + SizedBox( + height: 5, + ), + Texts( + insuranceCardDetailsModel.companyName, + color: Colors.white, + ), + SizedBox( + height: 25, + ), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment + .start, + children: [ + Texts(TranslationBase + .of(context) + .policyHolder, color: Colors.white), + Texts( + insuranceCardDetailsModel.memberName, + color: Colors.white), + ], + ), + ), + Expanded( + child: Column( + children: [ + Texts(TranslationBase + .of(context) + .policyNo, color: Colors.white), + Texts(insuranceCardDetailsModel + .policyNumber, color: Colors.white), + ], + ), + ), + ], + ), + SizedBox( + height: 25, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment + .start, + children: [ + Texts( + TranslationBase + .of(context) + .expiryDateTitle, + color: Colors.white), + Texts(insuranceCardDetailsModel.dOB, + color: Colors.white), + ], + ), + ), + Expanded( + child: Column( + children: [ + Texts(TranslationBase + .of(context) + .classTitle, color: Colors.white), + Texts( + insuranceCardDetailsModel.subCategory, + color: Colors.white), + ], + ), + ), + Expanded( + child: Column( + children: [ + Texts(TranslationBase + .of(context) + .approval, color: Colors.white), + Texts(insuranceCardDetailsModel + .approvalLimit + .toString(), color: Colors.white), + ], + ), + ), + ], + ) + ], + ), + ), + ), + ) + ], + ), + ), + bottomSheet: Container( + width: double.infinity, + height: MediaQuery + .of(context) + .size + .height * 0.21, + child: Container( + margin: EdgeInsets.only(left: 8, right: 8), + child: Column( + children: [ + SizedBox(height: 8,), + SecondaryButton( + textColor: Colors.white, + label: TranslationBase + .of(context) + .agree + .toUpperCase(), + color: Theme + .of(context) + .primaryColor, + onTap: () async { + GifLoaderDialogUtils.showMyDialog(context); + await model.uploadInsuranceCard(patientIdentificationID: patientIdentificationID,patientID: patientID); + GifLoaderDialogUtils.hideDialog(context); + if (model.state == ViewState.ErrorLocal ) { + + AppToast.showErrorToast(message: model.error); + } else { + AppToast.showSuccessToast(message: TranslationBase.of(context).requestSent); + } + }, + ), + SizedBox(height: 12,), + SecondaryButton( + textColor: Colors.white, + label: TranslationBase + .of(context) + .disagree + .toUpperCase(), + color: Colors.grey[800], + onTap: () async { + confirmSelectFamilyDialog(context: context, name: name, fileNo: patientID.toString(),model: model); + }, + ) + ], + ), + ), + ), + ), + ); + } + + void confirmSelectFamilyDialog({BuildContext context, String name, String fileNo,InsuranceViewModel model}) { + showDialog( + context: context, + child: AttachInsuranceCardImageDialog( + fileNo: fileNo, + name: name, + image: (file, image) async{ + GifLoaderDialogUtils.showMyDialog(context); + await model.uploadInsuranceCard(patientIdentificationID: patientIdentificationID,patientID: patientID,image: image); + GifLoaderDialogUtils.hideDialog(context); + if (model.state == ViewState.ErrorLocal || + model.state == ViewState.Error) { + + AppToast.showErrorToast(message: model.error); + } else { + AppToast.showSuccessToast(message: TranslationBase.of(context).requestSent); + } + Navigator.pop(context); + }, + ), + ); + } +} diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index d8a0d80f..8fe82efe 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -1,8 +1,10 @@ import 'package:diplomaticquarterapp/core/service/insurance_service.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_details.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; @@ -12,6 +14,8 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; +import 'insurance_card_update_details.dart'; + class InsuranceUpdate extends StatefulWidget { @override _InsuranceUpdateState createState() => _InsuranceUpdateState(); @@ -33,7 +37,6 @@ class _InsuranceUpdateState extends State _tabController.dispose(); } - //TODO implement update card Widget build(BuildContext context) { return BaseView( onModelReady: (model) => model.getInsuranceUpdated(), @@ -41,6 +44,7 @@ class _InsuranceUpdateState extends State AppScaffold( appBarTitle: TranslationBase.of(context).insurCards, isShowAppBar: true, + isShowDecPage: true, baseViewModel: model, body: Scaffold( extendBodyBehindAppBar: true, @@ -102,12 +106,19 @@ class _InsuranceUpdateState extends State controller: _tabController, children: [ Container( - child: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList.isNotEmpty?? false + child: model.getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList!=null ?? + false ? ListView.builder( itemCount: model.getAllSharedRecordsByStatusResponse .getAllSharedRecordsByStatusList.length, itemBuilder: (BuildContext context, int index) { - return model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].status == 3 + return model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .status == + 3 ? Container( margin: EdgeInsets.all(10.0), child: Card( @@ -173,7 +184,6 @@ class _InsuranceUpdateState extends State ), ), ), - if (false) Expanded( flex: 2, child: Container( @@ -191,7 +201,12 @@ class _InsuranceUpdateState extends State Colors.white, onTap: () { getDetails( - model); + projectID: 15, + patientIdentificationID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientIdenficationNumber, + setupID: '010266', + patientID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].responseID, + name: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientName + ); }, ), ), @@ -207,89 +222,92 @@ class _InsuranceUpdateState extends State : Container(); }) : Container( - height: 80, - margin: EdgeInsets.all(10.0), - child: Column( - children: [ - SizedBox(height: 65,), - Container( - color: Colors.white, - width: MediaQuery.of(context).size.width, - padding: EdgeInsets.all(10.0), - child: Row( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - top: 2.0, - left: 10.0, - right: 20.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - Texts( - model.user.firstName+" "+model.user.lastName, - fontSize: 14, - color: Colors.black, - fontWeight: - FontWeight.w500, + height: 80, + margin: EdgeInsets.all(10.0), + child: Column( + children: [ + SizedBox( + height: 65, + ), + Container( + color: Colors.white, + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.all(10.0), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + if(model.user!=null) + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 2.0, + left: 10.0, + right: 20.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + model.user.firstName??'' + " " + model.user.lastName??'', + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + SizedBox( + height: 8, + ), + Texts( + TranslationBase.of(context) + .fileno + + ": " + + model.user.patientID + .toString(), + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ) + ], + ), ), - SizedBox( - height: 8, + ), + Expanded( + flex: 2, + child: Container( + margin: EdgeInsets.only(top: 2.0), + child: Column( + children: [ + Container( + child: SecondaryButton( + label: TranslationBase.of( + context) + .fetchData, + small: true, + textColor: Colors.white, + onTap: () { + getDetails( + setupID: '010266', + projectID: 15, + patientIdentificationID: model.user.patientIdentificationNo, + patientID: model.user.patientID, + name: model.user.firstName + " " + model.user.lastName + + ); + }, + ), + ), + ], + ), ), - Texts( - TranslationBase.of( - context) - .fileno + - ": " + - model.user.patientID.toString(), - fontSize: 14, - color: Colors.black, - fontWeight: - FontWeight.w500, - ) - ], - ), + ) + ], ), ), - if (false) - Expanded( - flex: 2, - child: Container( - margin: - EdgeInsets.only(top: 2.0), - child: Column( - children: [ - Container( - child: SecondaryButton( - label: TranslationBase - .of(context) - .fetchData, - small: true, - textColor: - Colors.white, - onTap: () { - getDetails( - model); - }, - ), - ), - ], - ), - ), - ) ], ), ), - ], - ), - ), ), Container( child: ListView.builder( @@ -407,12 +425,22 @@ class _InsuranceUpdateState extends State ); } - getDetails(data) { + getDetails({String setupID, int projectID, String patientIdentificationID,int patientID,String name}) { GifLoaderDialogUtils.showMyDialog(context); - _insuranceCardService.getInsuranceDetails(data).then((value) => { - GifLoaderDialogUtils.hideDialog(context), - Navigator.push(context, - FadePage(page: InsuranceCardDetails(data: value[0]['CheckList']))) - }); + _insuranceCardService + .getPatientInsuranceDetails( + setupID: setupID, + projectID: projectID, + patientID: patientID, + patientIdentificationID: patientIdentificationID) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (_insuranceCardService.insuranceCardDetails != null) { + Navigator.push(context, + FadePage(page: InsuranceCardUpdateDetails(insuranceCardDetailsModel: _insuranceCardService.insuranceCardDetails,patientID: patientID,patientIdentificationID: patientIdentificationID,name: name,))); + } else { + AppToast.showErrorToast(message: _insuranceCardService.error); + } + }); } } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index dcf51b3d..f220c3e0 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -208,7 +208,7 @@ class _HomePageState extends State { children: [ Row( children: [ - if (model.user != null && model.isLogin) + if (projectViewModel.user != null && model.isLogin) Expanded( child: Column( crossAxisAlignment: @@ -218,15 +218,15 @@ class _HomePageState extends State { height: 8, ), Texts( - model.user.firstName + + projectViewModel.user.firstName + " " + - model.user.lastName, + projectViewModel.user.lastName, color: Colors.grey[100], bold: true, fontSize: 15, ), Texts( - '${model.user.patientID}', + '${projectViewModel.user.patientID}', color: Colors.white, fontSize: 14, ), @@ -234,7 +234,7 @@ class _HomePageState extends State { height: 5, ), Texts( - '${DateUtil.getMonthDayYearDateFormatted(model.user.dateofBirthDataTime)} ,${model.user.genderDescription} ${model.user.ageDesc}', + '${DateUtil.getMonthDayYearDateFormatted(projectViewModel.user.dateofBirthDataTime)} ,${projectViewModel.user.genderDescription} ${projectViewModel.user.ageDesc}', color: Colors.grey[100], fontWeight: FontWeight.normal, @@ -358,7 +358,7 @@ class _HomePageState extends State { Column( children: [ Texts( - '${model.bloadType}', + '${model.booldType}', color: Colors.white, ), Texts( @@ -410,7 +410,7 @@ class _HomePageState extends State { shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(12) ), - child: Center(child: Image.asset('assets/images/vital_sign_icon.png', + child: Center(child: Image.asset('assets/images/medical/vital_sign_icon.png', width: 80, height: 50, fit: BoxFit.contain,)), diff --git a/lib/pages/medical/balance/dialogs/ConfirmSMSDialog.dart b/lib/pages/medical/balance/dialogs/ConfirmSMSDialog.dart index 10d61f68..380f250c 100644 --- a/lib/pages/medical/balance/dialogs/ConfirmSMSDialog.dart +++ b/lib/pages/medical/balance/dialogs/ConfirmSMSDialog.dart @@ -175,7 +175,7 @@ class _ConfirmSMSDialogState extends State { fontSize: SizeConfig.textMultiplier * 3, ), focusNode: focusD1, - maxLength: 1, + //maxLength: 1, controller: digit1, textAlign: TextAlign.center, keyboardType: TextInputType.number, @@ -200,7 +200,7 @@ class _ConfirmSMSDialogState extends State { focusNode: focusD2, controller: digit2, textInputAction: TextInputAction.next, - maxLength: 1, + //maxLength: 1, textAlign: TextAlign.center, style: TextStyle( fontSize: SizeConfig.textMultiplier * 3, @@ -227,7 +227,7 @@ class _ConfirmSMSDialogState extends State { focusNode: focusD3, controller: digit3, textInputAction: TextInputAction.next, - maxLength: 1, + //maxLength: 1, textAlign: TextAlign.center, style: TextStyle( fontSize: SizeConfig.textMultiplier * 3, @@ -253,7 +253,7 @@ class _ConfirmSMSDialogState extends State { child: TextFormField( focusNode: focusD4, controller: digit4, - maxLength: 1, + // maxLength: 1, textAlign: TextAlign.center, style: TextStyle( fontSize: SizeConfig.textMultiplier * 3, diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 12c1baf7..f923c610 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -11,6 +11,7 @@ import 'package:diplomaticquarterapp/pages/medical/patient_sick_leave_page.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/reports/report_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; @@ -351,8 +352,8 @@ class _MedicalProfilePageState extends State { FadePage(page: InsuranceUpdate())); }, child: MedicalProfileItem( - title: - TranslationBase.of(context).updateInsurance, + title: TranslationBase.of(context) + .updateInsurance, imagePath: 'insurance_card_icon.png', subTitle: TranslationBase.of(context) .updateInsuranceSubtitle, @@ -360,7 +361,20 @@ class _MedicalProfilePageState extends State { ), ), Expanded( - child: Container(), + flex: 1, + child: InkWell( + onTap: () { + Navigator.push(context, + FadePage(page: VitalSignDetailsScreen())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context) + .vitalSigns, + imagePath: 'vital_sign_icon.png', + subTitle: TranslationBase.of(context) + .vitalSignsSubtitle, + ), + ), ), ]), SizedBox( diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 7d92b47c..a6d241c2 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -138,6 +138,7 @@ class _HomeReportPageState extends State ), body: Column( children: [ + if(model.user!=null) Expanded( child: TabBarView( physics: BouncingScrollPhysics(), diff --git a/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart b/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart index f56d0f04..e8cb8b24 100644 --- a/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart +++ b/lib/pages/medical/vital_sign/LineChartCurvedBloodPressure.dart @@ -1,4 +1,6 @@ +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/charts/app_time_series_chart.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; @@ -8,7 +10,8 @@ class LineChartCurvedBloodPressure extends StatelessWidget { final List timeSeries2; final int indexes; - LineChartCurvedBloodPressure({this.title, this.timeSeries1, this.indexes, this.timeSeries2}); + LineChartCurvedBloodPressure( + {this.title, this.timeSeries1, this.indexes, this.timeSeries2}); List xAxixs = List(); List yAxixs = List(); @@ -34,25 +37,58 @@ class LineChartCurvedBloodPressure extends StatelessWidget { Text( title, style: TextStyle( - color: Colors.black, - fontSize: 15, - letterSpacing: 2), + color: Colors.black, fontSize: 15, letterSpacing: 2), textAlign: TextAlign.center, ), - - SizedBox(height: 10,), + SizedBox( + height: 10, + ), Expanded( child: Padding( - padding: const EdgeInsets.only(right: 18.0, left: 16.0,top: 15), + padding: + const EdgeInsets.only(right: 18.0, left: 16.0, top: 15), child: LineChart( sampleData1(context), swapAnimationDuration: const Duration(milliseconds: 250), ), ), ), - const SizedBox( + SizedBox( height: 10, ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Theme.of(context).primaryColor), + ), + SizedBox(width: 5,), + Texts(TranslationBase.of(context).systolicLng) + ], + ), + SizedBox(width: 15,), + Row( + children: [ + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: Colors.grey), + ), + SizedBox(width: 5,), + Texts(TranslationBase.of(context).diastolicLng) + ], + ), + ], + ) ], ), ], @@ -70,13 +106,11 @@ class LineChartCurvedBloodPressure extends StatelessWidget { } } - LineChartData sampleData1(context) { return LineChartData( lineTouchData: LineTouchData( touchTooltipData: LineTouchTooltipData( tooltipBgColor: Colors.white, - ), touchCallback: (LineTouchResponse touchResponse) {}, handleBuiltInTouches: true, @@ -90,7 +124,7 @@ class LineChartCurvedBloodPressure extends StatelessWidget { color: Colors.black, fontSize: 10, ), - rotateAngle:-65, + rotateAngle: -65, //rotateAngle:-65, margin: 22, getTitles: (value) { @@ -144,7 +178,7 @@ class LineChartCurvedBloodPressure extends StatelessWidget { ), minX: 0, maxX: (timeSeries1.length - 1).toDouble(), - maxY: getMaxY()+0.3, + maxY: getMaxY() + 0.3, minY: getMinY(), lineBarsData: getData(context), ); @@ -161,7 +195,7 @@ class LineChartCurvedBloodPressure extends StatelessWidget { if (resultValueDouble > max) max = resultValueDouble; }); - return max.roundToDouble() ; + return max.roundToDouble(); } double getMinY() { @@ -218,9 +252,6 @@ class LineChartCurvedBloodPressure extends StatelessWidget { ), ); - return [ - lineChartBarData1, - lineChartBarData2 - ]; + return [lineChartBarData1, lineChartBarData2]; } } 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 908fab8c..416074f2 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -196,13 +196,13 @@ class VitalSignDetailsScreen extends StatelessWidget { FadePage( page: VitalSignItemDetailsScreen( pageKey: VitalSignDetails.BloodPressure, - pageTitle: TranslationBase.of(context).pulse, + pageTitle: TranslationBase.of(context).bloodPressure, vitalList: mode.vitalSignResModelList, ), ), ), child: VitalSignItem( - des: TranslationBase.of(context).pulse, + des: TranslationBase.of(context).bloodPressure, icon: DQIcons.blood_pressure, lastVal: mode .vitalSignResModelList[ diff --git a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart index 37a81a6d..0c786f2e 100644 --- a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart @@ -39,7 +39,7 @@ class VitalSignItemDetailsScreen extends StatelessWidget { 'viewKey': 'WeightKg', }, { - 'name': 'Body Mass ', + 'name': 'BMI ', 'nameAr': 'مؤشر كتلة الجسم', 'title1': 'Date', 'title2': 'BodyMass', diff --git a/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart b/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart index 1bbf298c..84a2eb51 100644 --- a/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart +++ b/lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart @@ -78,8 +78,6 @@ class VitalSingChartBloodPressure extends StatelessWidget { element.toJson()[viewKey2].toDouble(), ), ); - - var asd=""; }, ); } diff --git a/lib/pages/rateAppointment/rate_appointment_doctor.dart b/lib/pages/rateAppointment/rate_appointment_doctor.dart index 2d8379ee..b3349704 100644 --- a/lib/pages/rateAppointment/rate_appointment_doctor.dart +++ b/lib/pages/rateAppointment/rate_appointment_doctor.dart @@ -190,7 +190,7 @@ class _RateAppointmentDoctorState extends State { child: SecondaryButton( onTap: () async { final form = formKey.currentState; - if (form.validate()) { + if (form.validate() && rating>0 ) { form.save(); Navigator.push( context, @@ -206,7 +206,7 @@ class _RateAppointmentDoctorState extends State { } }, label: TranslationBase.of(context).next, - disabled: model.state == ViewState.BusyLocal, + disabled: model.state == ViewState.BusyLocal|| rating==0, loading: model.state == ViewState.BusyLocal, textColor: Theme.of(context).backgroundColor), ), diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index cba561b3..0c63b900 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -21,6 +21,10 @@ class _Settings extends State with TickerProviderStateMixin { _tabController = new TabController(length: 2, vsync: this, initialIndex: widget.type); + if(widget.type==1){ + _tabController.animateTo(1); + } + super.initState(); } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 7365a598..ade3128e 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1053,6 +1053,18 @@ class TranslationBase { String get confirmMsgReport => localizedValues['confirm-msg-report'][locale.languageCode]; String get successSendReport => localizedValues['successSendReport'][locale.languageCode]; String get pulseTitle => localizedValues['pulseTitle'][locale.languageCode]; + String get systolicLng => localizedValues['systolic-lng'][locale.languageCode]; + String get diastolicLng => localizedValues['diastolic-lng'][locale.languageCode]; + String get policyHolder => localizedValues['policy-holder'][locale.languageCode]; + String get policyNo => localizedValues['policy-no'][locale.languageCode]; + String get expiryDateTitle => localizedValues['expiry-date'][locale.languageCode]; + String get classTitle => localizedValues['class'][locale.languageCode]; + String get approval => localizedValues['approval'][locale.languageCode]; + String get agree => localizedValues['agree'][locale.languageCode]; + String get disagree => localizedValues['disagree'][locale.languageCode]; + String get requestSent => localizedValues['request-sent'][locale.languageCode]; + String get attachInsuraceImage => localizedValues['attach-insurace-image'][locale.languageCode]; + } class TranslationBaseDelegate extends LocalizationsDelegate { diff --git a/lib/widgets/bottom_options/BottomSheet.dart b/lib/widgets/bottom_options/BottomSheet.dart index 494ddff3..7bbadd8c 100644 --- a/lib/widgets/bottom_options/BottomSheet.dart +++ b/lib/widgets/bottom_options/BottomSheet.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; class ImageOptions { - static showImageOptions(BuildContext context, Function(String) image) { + static showImageOptions(BuildContext context, Function(String,File) image,) { showModalBottomSheet( backgroundColor: Colors.transparent, context: context, @@ -28,7 +28,7 @@ class ImageOptions { final bytes = File(fileName).readAsBytesSync(); String base64Encode = base64.encode(bytes); if (base64Encode != null) { - image(base64Encode); + image(base64Encode,_image); } }, ), @@ -42,7 +42,7 @@ class ImageOptions { final bytes = File(fileName).readAsBytesSync(); String base64Encode = base64.encode(bytes); if (base64Encode != null) { - image(base64Encode); + image(base64Encode,_image); } }, ), diff --git a/lib/widgets/buttons/secondary_button.dart b/lib/widgets/buttons/secondary_button.dart index ccb436fe..262ab43b 100644 --- a/lib/widgets/buttons/secondary_button.dart +++ b/lib/widgets/buttons/secondary_button.dart @@ -236,8 +236,8 @@ class _SecondaryButtonState extends State widget.label, style: TextStyle( color: widget.textColor, - fontSize: widget.small ? 12.0 : 17.0, - fontWeight: FontWeight.w800, + fontSize: widget.small ? 12.0 : 15.0, + // fontWeight: FontWeight.w800, fontFamily: projectViewModel.isArabic ? 'Cairo' : 'WorkSans'), ), ) diff --git a/lib/widgets/dialogs/confirm_send_email_dialog.dart b/lib/widgets/dialogs/confirm_send_email_dialog.dart index 96c7a7c8..540824ee 100644 --- a/lib/widgets/dialogs/confirm_send_email_dialog.dart +++ b/lib/widgets/dialogs/confirm_send_email_dialog.dart @@ -1,8 +1,10 @@ import 'package:diplomaticquarterapp/core/model/AlHabibMedicalService/H2O/insert_user_activity_request_model.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/AlHabibMedicalService/H2O_view_model.dart'; +import 'package:diplomaticquarterapp/pages/settings/settings.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -89,10 +91,16 @@ class _ConfirmSendEmailDialogState extends State { height: 15.0, ), InkWell( - onTap: () { - Navigator.of(context).pushNamed( - SETTINGS, + onTap: () + { + Navigator.pop(context); + Navigator.push( + context, + FadePage( + page: Settings(type: 1,), + ), ); + }, child: Container( width: double.maxFinite, diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index 2c09df47..15b06ce7 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -579,6 +579,7 @@ class _AppDrawerState extends State { this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); await authenticatedUserObject.getUser(getUser: true); + Provider.of(context, listen: false).setUser( authenticatedUserObject.user); appointmentRateViewModel .getIsLastAppointmentRatedList() .then((value) => { From b505ed1be7ca26344a2a49cea003b473c6b925e0 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Tue, 22 Dec 2020 09:16:57 +0300 Subject: [PATCH 08/34] blood type added --- lib/config/config.dart | 9 ++++++--- lib/core/viewModels/dashboard_view_model.dart | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index c2c1ef77..c463ec68 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -38,12 +38,15 @@ const GET_PRESCRIPTION_REPORT_ENH = 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_RESULT = 'Services/Patients.svc/REST/GetPatientLabResults'; -const GET_Patient_LAB_ORDERS_RESULT = 'Services/Patients.svc/REST/GetPatientLabOrdersResults'; +const GET_Patient_LAB_RESULT = + 'Services/Patients.svc/REST/GetPatientLabResults'; +const GET_Patient_LAB_ORDERS_RESULT = + 'Services/Patients.svc/REST/GetPatientLabOrdersResults'; /// const GET_PATIENT_ORDERS = 'Services/Patients.svc/REST/GetPatientRadOrders'; -const GET_PATIENT_LAB_ORDERS_BY_APPOINTMENT = 'Services/Patients.svc/REST/GetPatientLabResultsByAppointmentNo'; +const GET_PATIENT_LAB_ORDERS_BY_APPOINTMENT = + 'Services/Patients.svc/REST/GetPatientLabResultsByAppointmentNo'; const GET_PATIENT_ORDERS_DETAILS = 'Services/Patients.svc/REST/Rad_UpdatePatientRadOrdersToRead'; diff --git a/lib/core/viewModels/dashboard_view_model.dart b/lib/core/viewModels/dashboard_view_model.dart index e98ca341..60481508 100644 --- a/lib/core/viewModels/dashboard_view_model.dart +++ b/lib/core/viewModels/dashboard_view_model.dart @@ -1,7 +1,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; - +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import '../../locator.dart'; class DashboardViewModel extends BaseViewModel { @@ -24,7 +24,7 @@ class DashboardViewModel extends BaseViewModel { setState(ViewState.Error); } else setState(ViewState.Idle); - // getToDoCount(); + bloadType = await sharedPref.getString(BLOOD_TYPE) ?? "-"; } } From f6983c138a78033619bc25cb66ff7c3c78f2b606 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 22 Dec 2020 13:33:01 +0200 Subject: [PATCH 09/34] fix issues --- lib/config/config.dart | 2 +- lib/config/localized_values.dart | 5 +- .../medical/my_balance_view_model.dart | 2 - .../insurance_card_update_details.dart | 4 +- .../insurance/insurance_update_screen.dart | 137 ++++++++++++------ .../medical/reports/report_home_page.dart | 1 + lib/uitl/translations_delegate_base.dart | 1 + lib/widgets/others/not_auh_page.dart | 2 +- 8 files changed, 98 insertions(+), 56 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 62eacd03..f42d73c1 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -248,7 +248,7 @@ const UPDATE_HEALTH_TERMS = const CHANNEL = 3; const GENERAL_ID = 'Cs2020@2016\$2958'; const IP_ADDRESS = '10.20.10.20'; -const VERSION_ID = 5.6; +const VERSION_ID = 5.8; const SETUP_ID = '91877'; const LANGUAGE = 2; const PATIENT_OUT_SA = 0; diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 4b9c33dd..e354f5da 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1279,6 +1279,9 @@ const Map localizedValues = { "en": "You can still submit, if you don't have Insurance Image", "ar": "لا يزال بإمكانك الإرسال ، إذا لم يكن لديك صورة تأمين" }, - + "info-insur-cards": { + "en": "This service allows you to view all the insurance cards that recorded during your visits to Al Habib Medical Group in addition to:", + "ar": "خدمة بطاقات التامين: هذه الخدمة تمكنك من الاطلاع على جميع بطاقات التامين والتي تم تسجيلها اثناء زياراتك لمجموعة الحبيب الطبية بالاضافة الى:" + }, }; diff --git a/lib/core/viewModels/medical/my_balance_view_model.dart b/lib/core/viewModels/medical/my_balance_view_model.dart index 34244ee1..f9554d94 100644 --- a/lib/core/viewModels/medical/my_balance_view_model.dart +++ b/lib/core/viewModels/medical/my_balance_view_model.dart @@ -88,8 +88,6 @@ class MyBalanceViewModel extends BaseViewModel { Future getBlood() async { setState(ViewState.Busy); await _bloodDetailsService.getAllBloodOrders(); - ; - if (_bloodDetailsService.hasError) { error = _bloodDetailsService.error; setState(ViewState.Error); diff --git a/lib/pages/insurance/insurance_card_update_details.dart b/lib/pages/insurance/insurance_card_update_details.dart index a471fea2..ec367e9f 100644 --- a/lib/pages/insurance/insurance_card_update_details.dart +++ b/lib/pages/insurance/insurance_card_update_details.dart @@ -35,9 +35,7 @@ class InsuranceCardUpdateDetails extends StatelessWidget { AppScaffold( isShowAppBar: true, isShowDecPage: false, - appBarTitle: TranslationBase - .of(context) - .cardDetail, + appBarTitle: TranslationBase.of(context).cardDetail, body: SingleChildScrollView( child: Column( children: [ diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index 8fe82efe..d07569b7 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -1,3 +1,4 @@ +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/service/insurance_service.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_details.dart'; @@ -25,11 +26,13 @@ class _InsuranceUpdateState extends State with SingleTickerProviderStateMixin { TabController _tabController; InsuranceCardService _insuranceCardService = locator(); - + List imagesInfo = List(); @override void initState() { super.initState(); _tabController = TabController(length: 2, vsync: this); + + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/ar/0.png')); } void dispose() { @@ -43,6 +46,9 @@ class _InsuranceUpdateState extends State builder: (BuildContext context, InsuranceViewModel model, Widget child) => AppScaffold( appBarTitle: TranslationBase.of(context).insurCards, + description: TranslationBase.of(context).infoInsurCards, + infoList: TranslationBase.of(context).infoPrescriptionsPoints, + imagesInfo: imagesInfo, isShowAppBar: true, isShowDecPage: true, baseViewModel: model, @@ -107,7 +113,8 @@ class _InsuranceUpdateState extends State children: [ Container( child: model.getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList!=null ?? + .getAllSharedRecordsByStatusList != + null ?? false ? ListView.builder( itemCount: model.getAllSharedRecordsByStatusResponse @@ -202,11 +209,23 @@ class _InsuranceUpdateState extends State onTap: () { getDetails( projectID: 15, - patientIdentificationID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientIdenficationNumber, - setupID: '010266', - patientID: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].responseID, - name: model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].patientName - ); + patientIdentificationID: model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .patientIdenficationNumber, + setupID: + '010266', + patientID: model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .responseID, + name: model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .patientName); }, ), ), @@ -238,41 +257,45 @@ class _InsuranceUpdateState extends State CrossAxisAlignment.start, mainAxisSize: MainAxisSize.max, children: [ - if(model.user!=null) - Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - top: 2.0, - left: 10.0, - right: 20.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - model.user.firstName??'' + " " + model.user.lastName??'', - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - SizedBox( - height: 8, - ), - Texts( - TranslationBase.of(context) - .fileno + - ": " + - model.user.patientID - .toString(), - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ) - ], + if (model.user != null) + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 2.0, + left: 10.0, + right: 20.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + model.user.firstName ?? + '' + + " " + + model.user.lastName ?? + '', + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + SizedBox( + height: 8, + ), + Texts( + TranslationBase.of(context) + .fileno + + ": " + + model.user.patientID + .toString(), + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ) + ], + ), ), ), - ), Expanded( flex: 2, child: Container( @@ -290,11 +313,16 @@ class _InsuranceUpdateState extends State getDetails( setupID: '010266', projectID: 15, - patientIdentificationID: model.user.patientIdentificationNo, - patientID: model.user.patientID, - name: model.user.firstName + " " + model.user.lastName - - ); + patientIdentificationID: + model.user + .patientIdentificationNo, + patientID: model + .user.patientID, + name: model.user + .firstName + + " " + + model + .user.lastName); }, ), ), @@ -425,7 +453,12 @@ class _InsuranceUpdateState extends State ); } - getDetails({String setupID, int projectID, String patientIdentificationID,int patientID,String name}) { + getDetails( + {String setupID, + int projectID, + String patientIdentificationID, + int patientID, + String name}) { GifLoaderDialogUtils.showMyDialog(context); _insuranceCardService .getPatientInsuranceDetails( @@ -436,8 +469,16 @@ class _InsuranceUpdateState extends State .then((value) { GifLoaderDialogUtils.hideDialog(context); if (_insuranceCardService.insuranceCardDetails != null) { - Navigator.push(context, - FadePage(page: InsuranceCardUpdateDetails(insuranceCardDetailsModel: _insuranceCardService.insuranceCardDetails,patientID: patientID,patientIdentificationID: patientIdentificationID,name: name,))); + Navigator.push( + context, + FadePage( + page: InsuranceCardUpdateDetails( + insuranceCardDetailsModel: + _insuranceCardService.insuranceCardDetails, + patientID: patientID, + patientIdentificationID: patientIdentificationID, + name: name, + ))); } else { AppToast.showErrorToast(message: _insuranceCardService.error); } diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index a6d241c2..1e360760 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -57,6 +57,7 @@ class _HomeReportPageState extends State builder: (_, model, widget) => AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).newMedReport, + title: TranslationBase.of(context).medReport, description: TranslationBase.of(context).infoMonthReport, baseViewModel: model, imagesInfo: imagesInfo, diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index ade3128e..5a5ecb2e 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1064,6 +1064,7 @@ class TranslationBase { String get disagree => localizedValues['disagree'][locale.languageCode]; String get requestSent => localizedValues['request-sent'][locale.languageCode]; String get attachInsuraceImage => localizedValues['attach-insurace-image'][locale.languageCode]; + String get infoInsurCards => localizedValues['info-insur-cards'][locale.languageCode]; } diff --git a/lib/widgets/others/not_auh_page.dart b/lib/widgets/others/not_auh_page.dart index 56df1c21..0dbbee43 100644 --- a/lib/widgets/others/not_auh_page.dart +++ b/lib/widgets/others/not_auh_page.dart @@ -73,7 +73,7 @@ class _NotAutPageState extends State { width: 40, height: 40, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), + borderRadius: BorderRadius.circular(20), color: Theme.of(context).primaryColor), child: Center( child: Texts('${index+1}',color: Colors.white,), From 4d8f42b517f15ecb0d7f74541d544c0942f8b13b Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 22 Dec 2020 14:25:41 +0200 Subject: [PATCH 10/34] fix issues vital sign issue --- lib/config/localized_values.dart | 2 +- lib/core/service/client/base_app_client.dart | 3 +- lib/core/viewModels/dashboard_view_model.dart | 14 +++--- lib/pages/landing/home_page.dart | 1 - .../vital_sign_item_details_screen.dart | 49 ++----------------- .../others/app_expandable_notifier.dart | 17 ++++--- 6 files changed, 25 insertions(+), 61 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index e354f5da..7c8ce344 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -305,7 +305,7 @@ const Map localizedValues = { "recieved-requests": {"en": "Recieved Requests", "ar": "الطلبات المستلمة"}, "manage-files": {"en": "Manage Family Files", "ar": "إدارة ملفات العائلة"}, 'oxygenation': {'en': 'Oxygenation', 'ar': 'الأوكسجين'}, - 'bodyMeasurements': {'en': 'body Mass', 'ar': 'قياسات الجسم'}, + 'bodyMeasurements': {'en': 'body Mass Index', 'ar': 'مؤشر الكتلة'}, 'temperature': {'en': 'Temperature', 'ar': 'درجة الحرارة'}, 'pulse': {'en': 'Pulse', 'ar': 'النبض'}, 'respiration': {'en': 'Respiration', 'ar': 'التنفس'}, diff --git a/lib/core/service/client/base_app_client.dart b/lib/core/service/client/base_app_client.dart index 54ba6963..130e4af6 100644 --- a/lib/core/service/client/base_app_client.dart +++ b/lib/core/service/client/base_app_client.dart @@ -133,12 +133,11 @@ class BaseAppClient { parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode); } - else if(parsed['MessageStatus'] == 2){ + else if(parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']){ onFailure( parsed['message'] ?? parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'], statusCode); } - else if (!parsed['IsAuthenticated']) { await logout(); diff --git a/lib/core/viewModels/dashboard_view_model.dart b/lib/core/viewModels/dashboard_view_model.dart index 8dad8b82..4f261c65 100644 --- a/lib/core/viewModels/dashboard_view_model.dart +++ b/lib/core/viewModels/dashboard_view_model.dart @@ -3,6 +3,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import '../../locator.dart'; class DashboardViewModel extends BaseViewModel { @@ -11,21 +12,22 @@ class DashboardViewModel extends BaseViewModel { String get weightKg => _vitalSignService.weightKg; String get heightCm => _vitalSignService.heightCm; - String booldType=""; + String booldType = "-"; + // ToDoCountProviderModel toDoProvider = // Provider.of(AppGlobal.context); getPatientRadOrders() async { - booldType = await sharedPref.getString(BLOOD_TYPE); if (isLogin && _vitalSignService.weightKg.isEmpty) { - setState(ViewState.Busy); + setState(ViewState.Busy); await _vitalSignService.getPatientRadOrders(); if (_vitalSignService.hasError) { error = _vitalSignService.error; - setState(ViewState.Error); - } else + setState(ViewState.ErrorLocal); + } else { + booldType = await sharedPref.getString(BLOOD_TYPE) ?? "-"; setState(ViewState.Idle); - bloadType = await sharedPref.getString(BLOOD_TYPE) ?? "-"; + } } } diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index f220c3e0..03c803b7 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -54,7 +54,6 @@ class _HomePageState extends State { return BaseView( onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, wi) => AppScaffold( - isShowDecPage: false, body: Container( width: double.infinity, diff --git a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart index 0c786f2e..6db865b6 100644 --- a/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart @@ -23,53 +23,14 @@ class VitalSignItemDetailsScreen extends StatelessWidget { case VitalSignDetails.BodyMeasurements: VSchart = [ { - 'name': 'Height', - 'nameAr': 'الطول', + 'name': 'BMI', + 'nameAr': 'مؤشر الكتلة', 'title1': 'Date', - 'title2': 'Cm', - 'title2Ar': 'سم', - 'viewKey': 'HeightCm', - }, - { - 'name': 'Weight Kg', - 'nameAr': 'الوزن كجم', - 'title1': 'Date', - 'title2': 'Kg', - 'title2Ar': 'كجم', - 'viewKey': 'WeightKg', - }, - { - 'name': 'BMI ', - 'nameAr': 'مؤشر كتلة الجسم', - 'title1': 'Date', - 'title2': 'BodyMass', - 'title2Ar': 'كتلة الجسم', + 'title2': 'BMI', + 'title2Ar': 'الكتلة', 'viewKey': 'BodyMassIndex', }, - { - 'name': 'Head Circum Cm', - 'nameAr': 'محيط رأس سم', - 'title1': 'Date', - 'title2': 'Cm', - 'title2Ar': 'سم', - 'viewKey': 'HeadCircumCm', - }, - { - 'name': 'Ideal Body Weight (Lbs)', - 'nameAr': 'وزن الجسم المثالي (رطل)', - 'title1': 'Date', - 'title2': 'Ideal Weight', - 'title2Ar': 'الوزن المثالي', - 'viewKey': 'IdealBodyWeightLbs', - }, - { - 'name': 'Lean Body WeightLbs (Lbs)', - 'nameAr': 'رطل وزن الجسم النحيل (رطل)', - 'title1': 'Date', - 'title2': 'Lean Weight', - 'title2Ar': 'وزن خفيف', - 'viewKey': 'LeanBodyWeightLbs', - } + ]; break; diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index eb422a63..98997ec5 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -27,14 +27,21 @@ class AppExpandableNotifier extends StatefulWidget { } class _AppExpandableNotifier extends State { + @override - Widget build(BuildContext context) { + void initState() { setState(() { - if (widget.isExpand == true) { + if (widget.isExpand) { widget.expandFlag = widget.isExpand; widget.controller.expanded = true; } }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return ExpandableNotifier( child: Padding( padding: const EdgeInsets.only(left: 10, right: 10, top: 4), @@ -90,11 +97,7 @@ class _AppExpandableNotifier extends State { onPressed: () { setState(() { widget.expandFlag = !widget.expandFlag; - if (widget.expandFlag == true) { - widget.controller.expanded = true; - } else { - widget.controller.expanded = false; - } + widget.controller.expanded = widget.expandFlag; }); }), ]), From 2059b76fc15f646a549bb7d9f548dfd2fed4dc8a Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 23 Dec 2020 00:00:23 +0200 Subject: [PATCH 11/34] fix Medical profile --- assets/images/no-data-found.png | Bin 0 -> 1647 bytes lib/config/localized_values.dart | 5 +- lib/core/service/insurance_service.dart | 9 +- lib/pages/feedback/status_feedback_page.dart | 1 - .../insurance_card_update_details.dart | 449 +++++++++++------- .../insurance/insurance_update_screen.dart | 8 +- lib/pages/landing/landing_page.dart | 2 +- .../medical/balance/advance_payment_page.dart | 1 + .../medical/patient_sick_leave_page.dart | 26 +- .../prescription_items_page.dart | 2 +- .../radiology/radiology_details_page.dart | 4 +- lib/uitl/translations_delegate_base.dart | 1 + .../others/app_expandable_notifier.dart | 2 +- 13 files changed, 314 insertions(+), 196 deletions(-) create mode 100644 assets/images/no-data-found.png diff --git a/assets/images/no-data-found.png b/assets/images/no-data-found.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ced5d3d22e25d78fda1b0a8453f4b7876cf826 GIT binary patch literal 1647 zcmV-#29WuQP)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR91KA-~t z1ONa40RR91Qvd(}0B1?NJpcd&xJ z+mWbBS(&Nc>-E~ZyStZi?BnC(X=Q-7TCD+?djbx9SD7_VB%cYilIY3+C#sKLUS1A) zogIj-%v6`BZ*FeJDwPU(T!Dhzi6vzGIXOA$W;A=7jQqBj!8GKt!6zdaxWEt`?un51 z(EUY%WjKcdo%3(uxn0ELtJ7fu+5bsLmVC*T4MvYo++00HF4M*d zGzNWwCo)Owj+VqY3!1jrD8uvF zY!{s_ei9&KT64?C5g+~1zO}&Du}`9dfse=I83H2moN-LKfjmvU3;K@DLXW!K$qZ6N zho$lbn)`!(Zs87NFmUxhPrEWi`{XmbCTZT#=fc1}fh^XqX`hbvp@wD2M^+M0 zL*-ijLcl#n-63=?AQc6_NItXZpSO}P@P&XAy(jejE|5_dkyirm0j=n*x5LWvkrAh0 z;CgM*bKmq=kpwbNK)M7>$KlT;*|GIuNCwpnWQ*j}uD3~W3I@*l{px5*K-;5#qUr4sHZ*yY7 zOFnWUpRBC<1_9{RG9c&xWfS|nO(jb-`6{dd3-ROn$2bpkP+J3(1{Tlhbi&KiSzzD25d(EF%=We54wbS)AVM*IRr$2`U~rN*1`;s zmL;py3>m;MFoQ7SPX8k_VV2b?Z`;bi4dC?Ea$3L60z``snS! zbHNhOdAv|61pMgeNZ-!{S{_OgV82i|#3MK){6m5jWbOneJj=tn&=??BgYb)ZjNYLJ zi0OY=L{~6yfhJh}Edy*4VCeojE-}n(=__dBX$`=8s~1{dR&RO!)z;-LzlGbJJy6zh zSpj{{sCU-^+SMbkqGL$iZ{$0tt>e(S$zYG`YbhfiNdtp0#F%MrZEwJ6Wu7aPs=0C#|K{8U|fBVE7;} ze;&RTwX#H5A?O;hjtFEd4QiNg5b<(W{ z!C@>VnFn+XoIf2AW^_soJTGYBZSp~{Px+aEp|2A&=u)N-&;r;pzr`w5R8M;*6tw!6 zey?5xbm@T?1uft$b1|>?-H3PGsVd8mRsk)1O`^Gd$@e9!3ZP@)E>I$SDPCvTnYlS} zG5P3H2DhvonGa~Xer~Uhz get insuranceApproval => _insuranceApproval; InsuranceCardDetailsModel insuranceCardDetails; + List insuranceCardDetailsList = List(); + bool isHaveInsuranceCard = false; GetAllSharedRecordsByStatusResponse getAllSharedRecordsByStatusResponse = GetAllSharedRecordsByStatusResponse(); @@ -142,12 +144,15 @@ class InsuranceCardService extends BaseService { Future getPatientInsuranceDetails({String setupID, int projectID, String patientIdentificationID,int patientID}) async{ error = ""; + hasError = false; insuranceCardDetails = null; + isHaveInsuranceCard = false; await baseAppClient.post(GET_PATIENT_INSURANCE_DETAILS, onSuccess: (dynamic response, int statusCode) { - insuranceCardDetails = null; + insuranceCardDetailsList.clear(); + isHaveInsuranceCard = true; response['List_PatientInsuranceDetails'].forEach((item) { - insuranceCardDetails = InsuranceCardDetailsModel.fromJson(item); + insuranceCardDetailsList.add(InsuranceCardDetailsModel.fromJson(item)); }); }, onFailure: (String error, int statusCode) { hasError = true; diff --git a/lib/pages/feedback/status_feedback_page.dart b/lib/pages/feedback/status_feedback_page.dart index ada758e9..59d68fa2 100644 --- a/lib/pages/feedback/status_feedback_page.dart +++ b/lib/pages/feedback/status_feedback_page.dart @@ -17,7 +17,6 @@ class _StatusFeedbackPageState extends State { @override Widget build(BuildContext context) { return BaseView( - allowAny: true, onModelReady: (model) => model.getCOC(), builder: (_, model, widget) => AppScaffold( baseViewModel: model, diff --git a/lib/pages/insurance/insurance_card_update_details.dart b/lib/pages/insurance/insurance_card_update_details.dart index ec367e9f..5e9db38a 100644 --- a/lib/pages/insurance/insurance_card_update_details.dart +++ b/lib/pages/insurance/insurance_card_update_details.dart @@ -15,215 +15,328 @@ import 'package:provider/provider.dart'; import 'AttachInsuranceCardImageDialog.dart'; class InsuranceCardUpdateDetails extends StatelessWidget { - final InsuranceCardDetailsModel insuranceCardDetailsModel; + final List insuranceCardDetailsModel; final String patientIdentificationID; final int patientID; final String name; - - const InsuranceCardUpdateDetails({Key key, - this.insuranceCardDetailsModel, - this.patientIdentificationID, - this.patientID, this.name}) + const InsuranceCardUpdateDetails( + {Key key, + this.insuranceCardDetailsModel, + this.patientIdentificationID, + this.patientID, + this.name}) : super(key: key); @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); return BaseView( - builder: (context, model, w) => - AppScaffold( - isShowAppBar: true, - isShowDecPage: false, - appBarTitle: TranslationBase.of(context).cardDetail, - body: SingleChildScrollView( - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - width: double.maxFinite, - margin: EdgeInsets.only(left: 8, right: 8, top: 8), - height:projectViewModel.isArabic?350: 270, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), - color: Color(0xff515B5D), - ), - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - insuranceCardDetailsModel.memberID, - textScaleFactor: 2.1, - style: TextStyle(color: Colors.white, - letterSpacing: 8.0, - fontWeight: FontWeight.w400, - fontSize: 17), - ), - SizedBox( - height: 5, - ), - Texts( - insuranceCardDetailsModel.companyName, - color: Colors.white, - ), - SizedBox( - height: 25, - ), - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment - .start, - children: [ - Texts(TranslationBase - .of(context) - .policyHolder, color: Colors.white), - Texts( - insuranceCardDetailsModel.memberName, - color: Colors.white), - ], - ), + builder: (context, model, w) => AppScaffold( + isShowAppBar: true, + isShowDecPage: false, + appBarTitle: TranslationBase.of(context).cardDetail, + body: SingleChildScrollView( + child: Column( + children: [ + ...List.generate( + insuranceCardDetailsModel.length, + (index) => Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: double.maxFinite, + margin: EdgeInsets.only(left: 8, right: 8, top: 8), + height: projectViewModel.isArabic ? 320 : 240, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(25), + color: Color(0xff515B5D), + ), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + insuranceCardDetailsModel[index].memberID, + textScaleFactor: 2.1, + style: TextStyle( + color: Colors.white, + letterSpacing: 8.0, + fontWeight: FontWeight.w400, + fontSize: 15), + ), + SizedBox( + height: 5, + ), + Texts( + insuranceCardDetailsModel[index].companyName, + fontSize: 14, + color: Colors.white, + ), + SizedBox( + height: 25, + ), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).policyHolder, + color: Colors.white, + fontSize: 14, + ), + Texts( + insuranceCardDetailsModel[index] + .memberName, + color: Colors.white, + fontSize: 14, + ), + ], ), - Expanded( - child: Column( - children: [ - Texts(TranslationBase - .of(context) - .policyNo, color: Colors.white), - Texts(insuranceCardDetailsModel - .policyNumber, color: Colors.white), - ], - ), + ), + Expanded( + child: Column( + children: [ + Texts(TranslationBase.of(context).policyNo, + color: Colors.white), + Texts( + insuranceCardDetailsModel[index] + .policyNumber, + color: Colors.white), + ], + ), + ), + ], + ), + SizedBox( + height: 25, + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context) + .expiryDateTitle, + color: Colors.white, + fontSize: 12, + ), + Texts( + insuranceCardDetailsModel[index].dOB, + color: Colors.white, + fontSize: 12, + ), + ], + ), + ), + Expanded( + child: Column( + children: [ + Texts( + TranslationBase.of(context).classTitle, + color: Colors.white, + fontSize: 12, + ), + Texts( + insuranceCardDetailsModel[index] + .subCategory, + color: Colors.white, + fontSize: 12, + ), + ], + ), + ), + Expanded( + child: Column( + children: [ + Texts( + TranslationBase.of(context).approval, + color: Colors.white, + fontSize: 12, + ), + Texts( + insuranceCardDetailsModel[index] + .approvalLimit + .toString(), + color: Colors.white, + fontSize: 12, + ), + ], ), - ], - ), - SizedBox( - height: 25, - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( + ), + ], + ) + ], + ), + ), + ), + ), + ), + if(insuranceCardDetailsModel.isEmpty) + Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + margin: EdgeInsets.all(10.0), + child: Card( + margin: EdgeInsets.fromLTRB( + 8.0, 16.0, 8.0, 8.0), + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(10), + ), + child: Container( + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.all(10.0), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 2.0, + left: 10.0, + right: 20.0), child: Column( - crossAxisAlignment: CrossAxisAlignment + crossAxisAlignment: + CrossAxisAlignment .start, - children: [ + children: [ Texts( - TranslationBase - .of(context) - .expiryDateTitle, - color: Colors.white), - Texts(insuranceCardDetailsModel.dOB, - color: Colors.white), - ], - ), - ), - Expanded( - child: Column( - children: [ - Texts(TranslationBase - .of(context) - .classTitle, color: Colors.white), + name, + fontSize: 14, + color: Colors.black, + fontWeight: + FontWeight.w500, + ), + SizedBox( + height: 8, + ), Texts( - insuranceCardDetailsModel.subCategory, - color: Colors.white), - ], - ), - ), - Expanded( - child: Column( - children: [ - Texts(TranslationBase - .of(context) - .approval, color: Colors.white), - Texts(insuranceCardDetailsModel - .approvalLimit - .toString(), color: Colors.white), + TranslationBase.of( + context) + .fileno + + ": " +patientID.toString(), + fontSize: 14, + color: Colors.black, + fontWeight: + FontWeight.w500, + ) ], ), ), - ], - ) - ], + ), + ], + ), ), ), ), - ) - ], - ), - ), - bottomSheet: Container( - width: double.infinity, - height: MediaQuery - .of(context) - .size - .height * 0.21, - child: Container( - margin: EdgeInsets.only(left: 8, right: 8), - child: Column( - children: [ + SizedBox(height: 150,), + Image.asset('assets/images/no-data-found.png',width: 80,height: 80,), SizedBox(height: 8,), - SecondaryButton( - textColor: Colors.white, - label: TranslationBase - .of(context) - .agree - .toUpperCase(), - color: Theme - .of(context) - .primaryColor, - onTap: () async { - GifLoaderDialogUtils.showMyDialog(context); - await model.uploadInsuranceCard(patientIdentificationID: patientIdentificationID,patientID: patientID); - GifLoaderDialogUtils.hideDialog(context); - if (model.state == ViewState.ErrorLocal ) { - - AppToast.showErrorToast(message: model.error); - } else { - AppToast.showSuccessToast(message: TranslationBase.of(context).requestSent); - } - }, - ), - SizedBox(height: 12,), - SecondaryButton( - textColor: Colors.white, - label: TranslationBase - .of(context) - .disagree - .toUpperCase(), - color: Colors.grey[800], - onTap: () async { - confirmSelectFamilyDialog(context: context, name: name, fileNo: patientID.toString(),model: model); - }, - ) + Texts(TranslationBase.of(context).noDataAvailable) ], + ) + ], + ), + ), + bottomSheet: Container( + width: double.infinity, + height:insuranceCardDetailsModel.isEmpty? MediaQuery.of(context).size.height * 0.14:MediaQuery.of(context).size.height * 0.21, + child: Container( + margin: EdgeInsets.only(left: 8, right: 8), + child: Column( + children: [ + SizedBox( + height: 8, ), - ), + if(insuranceCardDetailsModel.isEmpty) + SecondaryButton( + textColor: Colors.white, + label: TranslationBase.of(context).scanNow.toUpperCase(), + color: Theme.of(context).primaryColor, + onTap: () async { + confirmAttachInsuranceCardImageDialogDialog( + context: context, + name: name, + fileNo: patientID.toString(), + model: model); + }, + ), + if(insuranceCardDetailsModel.isNotEmpty) + SecondaryButton( + textColor: Colors.white, + label: TranslationBase.of(context).agree.toUpperCase(), + color: Theme.of(context).primaryColor, + onTap: () async { + GifLoaderDialogUtils.showMyDialog(context); + await model.uploadInsuranceCard( + patientIdentificationID: patientIdentificationID, + patientID: patientID); + GifLoaderDialogUtils.hideDialog(context); + if (model.state == ViewState.ErrorLocal) { + AppToast.showErrorToast(message: model.error); + } else { + AppToast.showSuccessToast( + message: TranslationBase.of(context).requestSent); + } + }, + ),if(insuranceCardDetailsModel.isNotEmpty) + SizedBox( + height: 12, + ),if(insuranceCardDetailsModel.isNotEmpty) + SecondaryButton( + textColor: Colors.white, + label: TranslationBase.of(context).disagree.toUpperCase(), + color: Colors.grey[800], + onTap: () async { + confirmAttachInsuranceCardImageDialogDialog( + context: context, + name: name, + fileNo: patientID.toString(), + model: model); + }, + ) + ], ), ), + ), + ), ); } - void confirmSelectFamilyDialog({BuildContext context, String name, String fileNo,InsuranceViewModel model}) { + void confirmAttachInsuranceCardImageDialogDialog( + {BuildContext context, + String name, + String fileNo, + InsuranceViewModel model}) { showDialog( context: context, child: AttachInsuranceCardImageDialog( fileNo: fileNo, name: name, - image: (file, image) async{ + image: (file, image) async { GifLoaderDialogUtils.showMyDialog(context); - await model.uploadInsuranceCard(patientIdentificationID: patientIdentificationID,patientID: patientID,image: image); + await model.uploadInsuranceCard( + patientIdentificationID: patientIdentificationID, + patientID: patientID, + image: image); GifLoaderDialogUtils.hideDialog(context); if (model.state == ViewState.ErrorLocal || model.state == ViewState.Error) { - AppToast.showErrorToast(message: model.error); } else { - AppToast.showSuccessToast(message: TranslationBase.of(context).requestSent); + AppToast.showSuccessToast( + message: TranslationBase.of(context).requestSent); } Navigator.pop(context); }, diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index d07569b7..d2d715cb 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -137,8 +137,7 @@ class _InsuranceUpdateState extends State BorderRadius.circular(10), ), child: Container( - width: - MediaQuery.of(context).size.width, + width: MediaQuery.of(context).size.width, padding: EdgeInsets.all(10.0), child: Row( crossAxisAlignment: @@ -468,13 +467,12 @@ class _InsuranceUpdateState extends State patientIdentificationID: patientIdentificationID) .then((value) { GifLoaderDialogUtils.hideDialog(context); - if (_insuranceCardService.insuranceCardDetails != null) { + if (!_insuranceCardService.hasError && _insuranceCardService.isHaveInsuranceCard) { Navigator.push( context, FadePage( page: InsuranceCardUpdateDetails( - insuranceCardDetailsModel: - _insuranceCardService.insuranceCardDetails, + insuranceCardDetailsModel: _insuranceCardService.insuranceCardDetailsList, patientID: patientID, patientIdentificationID: patientIdentificationID, name: name, diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index fe4e82ca..a2b55e50 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -516,7 +516,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { // ); // themeNotifier.setTheme(defaultTheme); } - void checkUserStatus(token, {isLoader}) async { + void checkUserStatus(token, {isLoader = true}) async { if (isLoader) //GifLoaderDialogUtils.showMyDialog(context); authService diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index f72f18a0..7f0f799a 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -214,6 +214,7 @@ class _AdvancePaymentPageState extends State { SizedBox( height: 12, ), + if(model.user!=null) NewTextFields( hintText: TranslationBase.of(context).depositorEmail, initialValue: model.user.emailAddress, diff --git a/lib/pages/medical/patient_sick_leave_page.dart b/lib/pages/medical/patient_sick_leave_page.dart index d95e03af..900c9666 100644 --- a/lib/pages/medical/patient_sick_leave_page.dart +++ b/lib/pages/medical/patient_sick_leave_page.dart @@ -1,6 +1,7 @@ import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/sick_leave/sick_leave.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/patient_sick_leave_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_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'; @@ -9,6 +10,7 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.d import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class PatientSickLeavePage extends StatefulWidget { @override @@ -19,12 +21,16 @@ class _PatientSickLeavePageState extends State { List imagesInfo = List(); @override - Widget build(BuildContext context) { + void initState() { imagesInfo.add(ImagesInfo( - imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/en/0.png', - imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/ar/0.png')); + imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/en/0.png', + imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/ar/0.png')); + super.initState(); + } + + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getSickLeave(), builder: (_, model, w) => AppScaffold( @@ -40,21 +46,13 @@ class _PatientSickLeavePageState extends State { itemCount: model.sickLeaveList.length, itemBuilder: (context, index) => DoctorCard( name: model.sickLeaveList[index].doctorName, - date: DateUtil.getMonthDayYearDateFormatted( - model.sickLeaveList[index].requestDate), + date:projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr(model.sickLeaveList[index].requestDate):DateUtil.getMonthDayYearDateFormatted(model.sickLeaveList[index].requestDate), profileUrl: model.sickLeaveList[index].doctorImageURL, rat: model.sickLeaveList[index].actualDoctorRate.toDouble(), subName: model.sickLeaveList[index].projectName, isInOutPatient: model.sickLeaveList[index].isInOutPatient, onEmailTap: () { showConfirmMessage(model, index); - // model.sendSickLeaveEmail( - // message: TranslationBase.of(context).emailSentSuccessfully, - // requestNo: model.sickLeaveList[index].requestNo, - // doctorName: model.sickLeaveList[index].doctorName, - // projectName: model.sickLeaveList[index].projectName, - // setupID: model.sickLeaveList[index].setupID, - // projectID: model.sickLeaveList[index].projectID); }, ), ), diff --git a/lib/pages/medical/prescriptions/prescription_items_page.dart b/lib/pages/medical/prescriptions/prescription_items_page.dart index 7eb2621b..62fb1c64 100644 --- a/lib/pages/medical/prescriptions/prescription_items_page.dart +++ b/lib/pages/medical/prescriptions/prescription_items_page.dart @@ -179,7 +179,7 @@ class PrescriptionItemsPage extends StatelessWidget { ), bottomSheet: Container( width: double.infinity, - height: MediaQuery.of(context).size.height * 0.12, + height: MediaQuery.of(context).size.height * 0.14, color: Colors.grey[100], child: Column( children: [ diff --git a/lib/pages/medical/radiology/radiology_details_page.dart b/lib/pages/medical/radiology/radiology_details_page.dart index 75279eee..f3f08cce 100644 --- a/lib/pages/medical/radiology/radiology_details_page.dart +++ b/lib/pages/medical/radiology/radiology_details_page.dart @@ -54,8 +54,8 @@ class RadiologyDetailsPage extends StatelessWidget { bottomSheet: Container( width: double.infinity, height: finalRadiology.dIAPACSURL != "" - ? MediaQuery.of(context).size.height * 0.2 - : MediaQuery.of(context).size.height * 0.15, + ? MediaQuery.of(context).size.height * 0.25 + : MediaQuery.of(context).size.height * 0.14, color: Colors.grey[100], child: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 5a5ecb2e..2cbee1df 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -1065,6 +1065,7 @@ class TranslationBase { String get requestSent => localizedValues['request-sent'][locale.languageCode]; String get attachInsuraceImage => localizedValues['attach-insurace-image'][locale.languageCode]; String get infoInsurCards => localizedValues['info-insur-cards'][locale.languageCode]; + String get scanNow => localizedValues['scan-now'][locale.languageCode]; } diff --git a/lib/widgets/others/app_expandable_notifier.dart b/lib/widgets/others/app_expandable_notifier.dart index 98997ec5..c5d3ec6f 100644 --- a/lib/widgets/others/app_expandable_notifier.dart +++ b/lib/widgets/others/app_expandable_notifier.dart @@ -21,7 +21,7 @@ class AppExpandableNotifier extends StatefulWidget { this.bodyWidget, this.title, this.collapsed, - this.isExpand}); + this.isExpand = false}); _AppExpandableNotifier createState() => _AppExpandableNotifier(); } From b9958acd53588a2ea299b01547cd74b358a1c656 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 23 Dec 2020 00:33:15 +0200 Subject: [PATCH 12/34] fix issues --- .../prescriptions/prescriptions_history_details_page.dart | 2 +- lib/pages/medical/prescriptions/prescriptions_page.dart | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart b/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart index 0eac55df..22896dad 100644 --- a/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart @@ -36,7 +36,7 @@ class PrescriptionsHistoryDetailsPage extends StatelessWidget { Container( width: double.infinity, decoration: BoxDecoration( - color: prescriptionsOrder.status==3 ?Colors.red:prescriptionsOrder.status==2? Colors.green: Colors.grey, + color: prescriptionsOrder.status == 3 ?Colors.green : prescriptionsOrder.status ==2 ? Colors.grey: Colors.red, borderRadius: BorderRadius.circular(5)), child: Padding( padding: const EdgeInsets.all(8.0), diff --git a/lib/pages/medical/prescriptions/prescriptions_page.dart b/lib/pages/medical/prescriptions/prescriptions_page.dart index dc842bdc..5f16b422 100644 --- a/lib/pages/medical/prescriptions/prescriptions_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/core/enum/filter_type.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_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'; @@ -9,6 +10,7 @@ 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:provider/provider.dart'; class PrescriptionsPage extends StatelessWidget { final PrescriptionsViewModel prescriptionsViewModel; @@ -18,6 +20,7 @@ class PrescriptionsPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( baseViewModel: prescriptionsViewModel, body: FractionallySizedBox( @@ -89,8 +92,7 @@ class PrescriptionsPage extends StatelessWidget { rat: prescriptions.actualDoctorRate.toDouble(), subName: prescriptions.name, isInOutPatient: prescriptions.isInOutPatient, - date: DateUtil.getMonthDayYearDateFormatted( - prescriptions.dischargeDate), + date:projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr(prescriptions.dischargeDate):DateUtil.getMonthDayYearDateFormatted(prescriptions.dischargeDate), ), ); }).toList(), From d53031b0e69afef566e4915dbcb380827daa905f Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Wed, 23 Dec 2020 10:02:04 +0300 Subject: [PATCH 13/34] blood type update for family files --- lib/core/viewModels/dashboard_view_model.dart | 5 +- lib/pages/DrawerPages/family/my-family.dart | 6 +- lib/pages/landing/home_page.dart | 185 +++++++++++------- lib/uitl/location_util.dart | 12 +- lib/widgets/drawer/app_drawer_widget.dart | 6 +- 5 files changed, 133 insertions(+), 81 deletions(-) diff --git a/lib/core/viewModels/dashboard_view_model.dart b/lib/core/viewModels/dashboard_view_model.dart index 8dad8b82..ed372df5 100644 --- a/lib/core/viewModels/dashboard_view_model.dart +++ b/lib/core/viewModels/dashboard_view_model.dart @@ -11,12 +11,11 @@ class DashboardViewModel extends BaseViewModel { String get weightKg => _vitalSignService.weightKg; String get heightCm => _vitalSignService.heightCm; - String booldType=""; + String booldType = ""; // ToDoCountProviderModel toDoProvider = // Provider.of(AppGlobal.context); getPatientRadOrders() async { - booldType = await sharedPref.getString(BLOOD_TYPE); if (isLogin && _vitalSignService.weightKg.isEmpty) { setState(ViewState.Busy); await _vitalSignService.getPatientRadOrders(); @@ -25,7 +24,7 @@ class DashboardViewModel extends BaseViewModel { setState(ViewState.Error); } else setState(ViewState.Idle); - bloadType = await sharedPref.getString(BLOOD_TYPE) ?? "-"; + booldType = await sharedPref.getString(BLOOD_TYPE) ?? "-"; } } diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 7a28b3f9..154b45f4 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -709,19 +709,21 @@ class _MyFamily extends State with TickerProviderStateMixin { result = list.CheckActivationCode.fromJson(result); var familyFile = await sharedPref.getObject(FAMILY_FILE); var mainUser = await sharedPref.getObject(MAIN_USER); + var bloodType = await sharedPref.getString(BLOOD_TYPE); this.sharedPref.clear(); if (mainUser["PatientID"] != result.list.patientID) { result.list.isFamily = true; } this.sharedPref.setString(APP_LANGUAGE, currentLang); this.sharedPref.setObject(MAIN_USER, mainUser); - //sharedPref.setString(BLOOD_TYPE, result['PatientBloodType']); + this.sharedPref.setString(BLOOD_TYPE, bloodType); this.sharedPref.setObject(USER_PROFILE, result.list); this.sharedPref.setObject(FAMILY_FILE, familyFile); this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); await authenticatedUserObject.getUser(getUser: true); - Provider.of(context, listen: false).setUser( authenticatedUserObject.user); + Provider.of(context, listen: false) + .setUser(authenticatedUserObject.user); //this.checkIfUserAgreedBefore(result), Navigator.of(context).pushNamed( diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index f220c3e0..b6049c0b 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -43,7 +43,6 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { ToDoCountProviderModel toDoProvider; - AuthenticatedUserObject authenticatedUserObject = locator(); @@ -54,7 +53,6 @@ class _HomePageState extends State { return BaseView( onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, wi) => AppScaffold( - isShowDecPage: false, body: Container( width: double.infinity, @@ -82,15 +80,19 @@ class _HomePageState extends State { left: 5, right: 5, child: Container( - width: MediaQuery.of(context).size.width * 0.8, + width: + MediaQuery.of(context).size.width * 0.8, child: Container(), ), ) ], ), - ), - Container(width: double.infinity, height:projectViewModel.isArabic ? MediaQuery.of(context).size.width * 0.3 :110), + Container( + width: double.infinity, + height: projectViewModel.isArabic + ? MediaQuery.of(context).size.width * 0.3 + : 110), ], ), Positioned( @@ -105,7 +107,7 @@ class _HomePageState extends State { Orientation.landscape ? 0.02 : 0.03), - child: (!model.isLogin ) + child: (!model.isLogin) ? Container( width: double.infinity, height: 160, @@ -174,7 +176,6 @@ class _HomePageState extends State { color: Theme.of(context) .primaryColor, fontSize: 14, - ), ), ), @@ -208,7 +209,8 @@ class _HomePageState extends State { children: [ Row( children: [ - if (projectViewModel.user != null && model.isLogin) + if (projectViewModel.user != null && + model.isLogin) Expanded( child: Column( crossAxisAlignment: @@ -218,9 +220,11 @@ class _HomePageState extends State { height: 8, ), Texts( - projectViewModel.user.firstName + + projectViewModel + .user.firstName + " " + - projectViewModel.user.lastName, + projectViewModel + .user.lastName, color: Colors.grey[100], bold: true, fontSize: 15, @@ -266,7 +270,8 @@ class _HomePageState extends State { ), child: Center( child: Texts( - TranslationBase.of(context).myMedicalFile, + TranslationBase.of(context) + .myMedicalFile, color: Theme.of(context) .primaryColor, fontSize: 12, @@ -301,7 +306,9 @@ class _HomePageState extends State { bold: true, ), Texts( - TranslationBase.of(context).height, + TranslationBase.of( + context) + .height, color: Colors.white, fontSize: 10, ), @@ -333,7 +340,9 @@ class _HomePageState extends State { bold: true, ), Texts( - TranslationBase.of(context).weight, + TranslationBase.of( + context) + .weight, color: Colors.white, fontSize: 10, ) @@ -347,8 +356,10 @@ class _HomePageState extends State { ), Expanded( child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.center, children: [ Image.asset( 'assets/images/blood-drop.png', @@ -360,9 +371,14 @@ class _HomePageState extends State { Texts( '${model.booldType}', color: Colors.white, + fontSize: 14, + fontWeight: + FontWeight.bold, ), Texts( - TranslationBase.of(context).bloodType, + TranslationBase.of( + context) + .bloodType, color: Colors.white, fontSize: 10, ) @@ -401,28 +417,35 @@ class _HomePageState extends State { padding: const EdgeInsets.all(15.0), child: Column( children: [ - SizedBox(height: 15,), - + SizedBox( + height: 15, + ), Container( width: 60, decoration: BoxDecoration( color: Colors.white, shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(12) - ), - child: Center(child: Image.asset('assets/images/medical/vital_sign_icon.png', + borderRadius: + BorderRadius.circular(12)), + child: Center( + child: Image.asset( + 'assets/images/medical/vital_sign_icon.png', width: 80, height: 50, - fit: BoxFit.contain,)), + fit: BoxFit.contain, + )), + ), + SizedBox( + height: 20, ), - SizedBox(height: 20,), Texts( - TranslationBase.of(context) - .vitalSigns, + TranslationBase.of(context).vitalSigns, textAlign: TextAlign.center, color: Colors.white, bold: true, - fontSize: projectViewModel.isArabic? SizeConfig.textMultiplier * 1.5 :SizeConfig.textMultiplier * 1.7, + fontSize: projectViewModel.isArabic + ? SizeConfig.textMultiplier * 1.5 + : SizeConfig.textMultiplier * 1.7, ) ], ), @@ -450,26 +473,35 @@ class _HomePageState extends State { padding: const EdgeInsets.all(15.0), child: Column( children: [ - SizedBox(height: 15,), + SizedBox( + height: 15, + ), Container( width: 50, decoration: BoxDecoration( color: Colors.white, shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(12) - ), - child: Center(child: Image.asset('assets/images/search_medicine_icon.png', + borderRadius: + BorderRadius.circular(12)), + child: Center( + child: Image.asset( + 'assets/images/search_medicine_icon.png', width: 50, height: 50, - fit: BoxFit.contain,)), + fit: BoxFit.contain, + )), + ), + SizedBox( + height: 20, ), - SizedBox(height: 20,), Texts( TranslationBase.of(context).searchMedicine, textAlign: TextAlign.center, color: Colors.white, bold: true, - fontSize: projectViewModel.isArabic? SizeConfig.textMultiplier * 1.5 :SizeConfig.textMultiplier * 1.7, + fontSize: projectViewModel.isArabic + ? SizeConfig.textMultiplier * 1.5 + : SizeConfig.textMultiplier * 1.7, ) ], ), @@ -481,8 +513,9 @@ class _HomePageState extends State { ), ), Expanded( - child: DashboardItem(opacity: 1.0, - onTap: (){ + child: DashboardItem( + opacity: 1.0, + onTap: () { Navigator.push( context, FadePage( @@ -495,25 +528,35 @@ class _HomePageState extends State { padding: const EdgeInsets.all(15.0), child: Column( children: [ - SizedBox(height: 15,), + SizedBox( + height: 15, + ), Container( decoration: BoxDecoration( color: Colors.white, shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(12) - ), - child: Center(child: Image.asset('assets/images/online_payment_icon.png', + borderRadius: + BorderRadius.circular(12)), + child: Center( + child: Image.asset( + 'assets/images/online_payment_icon.png', width: 80, height: 50, - fit: BoxFit.contain,)), + fit: BoxFit.contain, + )), + ), + SizedBox( + height: 15, ), - SizedBox(height: 15,), Texts( - TranslationBase.of(context).onlinePaymentService, + TranslationBase.of(context) + .onlinePaymentService, textAlign: TextAlign.center, color: Colors.white, bold: true, - fontSize: projectViewModel.isArabic? SizeConfig.textMultiplier * 1.5 :SizeConfig.textMultiplier * 1.7, + fontSize: projectViewModel.isArabic + ? SizeConfig.textMultiplier * 1.5 + : SizeConfig.textMultiplier * 1.7, ) ], ), @@ -527,7 +570,9 @@ class _HomePageState extends State { ], ), ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), // Padding( // padding: const EdgeInsets.all(8.0), // child: LineChartSample1(), @@ -554,34 +599,33 @@ class _HomePageState extends State { ); }, child: MedicalProfileItem( - title: TranslationBase.of(context) - .myAppointments, + title: + TranslationBase.of(context).myAppointments, imagePath: 'my_appointment_icon.png', - subTitle: TranslationBase.of(context).myAppointmentsList, + subTitle: TranslationBase.of(context) + .myAppointmentsList, ), ), ), Expanded( flex: 1, child: InkWell( - onTap: () => Navigator.push(context, - FadePage(page: LabsHomePage())), + onTap: () => Navigator.push( + context, FadePage(page: LabsHomePage())), child: MedicalProfileItem( title: TranslationBase.of(context).lab, imagePath: 'lab_result_icon.png', - subTitle: - TranslationBase.of(context).lab, + subTitle: TranslationBase.of(context).lab, ), ), ), Expanded( flex: 1, child: InkWell( - onTap: () => Navigator.push(context, - FadePage(page: RadiologyHomePage())), + onTap: () => Navigator.push( + context, FadePage(page: RadiologyHomePage())), child: MedicalProfileItem( - title: TranslationBase.of(context) - .radiology, + title: TranslationBase.of(context).radiology, imagePath: 'radiology_icon.png', subTitle: TranslationBase.of(context) .radiologySubtitle, @@ -604,8 +648,7 @@ class _HomePageState extends State { ); }, child: MedicalProfileItem( - title: TranslationBase.of(context) - .medicines, + title: TranslationBase.of(context).medicines, imagePath: 'prescription_icon.png', subTitle: TranslationBase.of(context) .medicinesSubtitle, @@ -624,8 +667,7 @@ class _HomePageState extends State { ); }, child: MedicalProfileItem( - title: TranslationBase.of(context) - .myDoctor, + title: TranslationBase.of(context).myDoctor, imagePath: 'doctor_icon.png', subTitle: TranslationBase.of(context) .myDoctorSubtitle, @@ -636,12 +678,11 @@ class _HomePageState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.push(context, - FadePage(page: InsuranceCard())); + Navigator.push( + context, FadePage(page: InsuranceCard())); }, child: MedicalProfileItem( - title: TranslationBase.of(context) - .insurance, + title: TranslationBase.of(context).insurance, imagePath: 'insurance_card_icon.png', subTitle: TranslationBase.of(context) .insuranceSubtitle, @@ -650,7 +691,6 @@ class _HomePageState extends State { ), ], ), - ], ), ), @@ -663,7 +703,7 @@ class _HomePageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ DashboardItem( - opacity:1.0, + opacity: 1.0, child: Container( width: double.infinity, padding: EdgeInsets.all(10), @@ -676,7 +716,8 @@ class _HomePageState extends State { bold: true, ), Texts( - TranslationBase.of(context).viewAllHabibMedicalService, + TranslationBase.of(context) + .viewAllHabibMedicalService, color: Colors.white, fontWeight: FontWeight.normal, fontSize: 10, @@ -694,13 +735,17 @@ class _HomePageState extends State { ), height: 112, imageName: 'ask_doctor_bg.png', - //color: Colors.grey[700], + //color: Colors.grey[700], width: MediaQuery.of(context).size.width * 0.45, onTap: () => Navigator.push( - context, FadePage(page: AllHabibMedicalService(goToMyProfile: widget.goToMyProfile,))), + context, + FadePage( + page: AllHabibMedicalService( + goToMyProfile: widget.goToMyProfile, + ))), ), DashboardItem( - opacity:1.0, + opacity: 1.0, onTap: () { Navigator.push( context, FadePage(page: ContactUsPage())); @@ -720,7 +765,7 @@ class _HomePageState extends State { TranslationBase.of(context).viewAllWaysReachUs, color: Colors.white, fontWeight: FontWeight.normal, - fontSize: SizeConfig.textMultiplier * 1.0 , + fontSize: SizeConfig.textMultiplier * 1.0, ), Expanded( child: Container(), diff --git a/lib/uitl/location_util.dart b/lib/uitl/location_util.dart index 5c2d3a3c..c3799425 100644 --- a/lib/uitl/location_util.dart +++ b/lib/uitl/location_util.dart @@ -20,7 +20,8 @@ class LocationUtils { Geolocator.checkPermission().then((permission) { if (permission == LocationPermission.always || permission == LocationPermission.whileInUse) { - Geolocator.getLastKnownPosition().then((value) => setLocation(value)); + Geolocator.getLastKnownPosition() + .then((value) => setLocation(value)); } if (permission == LocationPermission.denied || @@ -57,9 +58,12 @@ class LocationUtils { } void setLocation(Position position) { - print(position); - this.sharedPref.setDouble(USER_LAT, position.latitude ?? 0.0); - this.sharedPref.setDouble(USER_LONG, position.longitude ?? 0.0); + this + .sharedPref + .setDouble(USER_LAT, position != null ? position.latitude : 0.0); + this + .sharedPref + .setDouble(USER_LONG, position != null ? position.longitude : 0.0); } void setZeroLocation() { diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index 09a1fa33..da227d96 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -567,19 +567,21 @@ class _AppDrawerState extends State { var familyFile = await sharedPref.getObject(FAMILY_FILE); var currentLang = await sharedPref.getString(APP_LANGUAGE); var mainUser = await sharedPref.getObject(MAIN_USER); + var bloodType = await sharedPref.getString(BLOOD_TYPE); this.sharedPref.clear(); if (mainUser["PatientID"] != result.list.patientID) { result.list.isFamily = true; } this.sharedPref.setString(APP_LANGUAGE, currentLang); - // sharedPref.setString(BLOOD_TYPE, result['PatientBloodType']); + this.sharedPref.setString(BLOOD_TYPE, bloodType); this.sharedPref.setObject(MAIN_USER, mainUser); this.sharedPref.setObject(USER_PROFILE, result.list); this.sharedPref.setObject(FAMILY_FILE, familyFile); this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); await authenticatedUserObject.getUser(getUser: true); - Provider.of(context, listen: false).setUser( authenticatedUserObject.user); + Provider.of(context, listen: false) + .setUser(authenticatedUserObject.user); appointmentRateViewModel .getIsLastAppointmentRatedList() .then((value) => { From b0ea1fc26292b152717ecf4a463c882938319fa7 Mon Sep 17 00:00:00 2001 From: Haroon Amjad Date: Thu, 24 Dec 2020 05:40:25 +0500 Subject: [PATCH 14/34] updates & fixes --- .gitignore | 1 + lib/pages/BookAppointment/Search.dart | 30 ------- .../components/SearchByClinic.dart | 30 ++++--- .../MyAppointments/models/ArrivedButtons.dart | 8 +- .../MyAppointments/models/BookedButtons.dart | 2 +- .../models/BookedButtonsAllowCheckIn.dart | 2 +- .../models/ConfirmedButtons.dart | 2 +- .../models/ConfirmedButtonsAllowCheckIn.dart | 2 +- .../widgets/AppointmentActions.dart | 82 ++++++++++--------- pubspec.yaml | 2 +- 10 files changed, 71 insertions(+), 90 deletions(-) diff --git a/.gitignore b/.gitignore index 4b016310..fd4aca5a 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ app.*.map.json # Exceptions to above rules. !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +health_calculators.dart diff --git a/lib/pages/BookAppointment/Search.dart b/lib/pages/BookAppointment/Search.dart index 6264c7a8..ed93f626 100644 --- a/lib/pages/BookAppointment/Search.dart +++ b/lib/pages/BookAppointment/Search.dart @@ -65,35 +65,5 @@ class _SearchState extends State with TickerProviderStateMixin { ], ), )); - // Scaffold( - // appBar: AppBar( - // bottom: TabBar( - // labelColor: Colors.white, - // tabs: [ - // Tab(text: TranslationBase.of(context).clinicName), - // Tab( - // text: TranslationBase.of(context).doctorName, - // ) - // ], - // controller: _tabController, - // ), - // title: Text(TranslationBase.of(context).bookAppo, - // style: TextStyle(color: Colors.white)), - // leading: Builder( - // builder: (BuildContext context) { - // return ArrowBack(); - // }, - // ), - // ), - // body: TabBarView( - // physics: NeverScrollableScrollPhysics(), - // children: [ - // SearchByClinic( - // clnicIds: widget.clnicIds, - // ), - // SearchByDoctor() - // ], - // controller: _tabController), - // ); } } diff --git a/lib/pages/BookAppointment/components/SearchByClinic.dart b/lib/pages/BookAppointment/components/SearchByClinic.dart index 4d5d4d49..7aa0ff00 100644 --- a/lib/pages/BookAppointment/components/SearchByClinic.dart +++ b/lib/pages/BookAppointment/components/SearchByClinic.dart @@ -33,6 +33,7 @@ class _SearchByClinicState extends State { List projectsList = []; bool isMobileAppDentalAllow = false; bool isLoaded = false; + bool isProjectLoaded = false; @override void initState() { @@ -55,6 +56,11 @@ class _SearchByClinicState extends State { onChanged: (bool value) { setState(() { nearestAppo = value; + print(nearestAppo); + if (nearestAppo) + getProjectsList(); + else + isProjectLoaded = false; }); }, ), @@ -120,7 +126,8 @@ class _SearchByClinicState extends State { }, ), )), - isDentalSelectedAndSupported() == true || nearestAppo + isDentalSelectedAndSupported() == true || + (nearestAppo && isProjectLoaded) ? Container( height: 60.0, decoration: BoxDecoration( @@ -177,24 +184,30 @@ class _SearchByClinicState extends State { }); }); getProjectsList(); + GifLoaderDialogUtils.hideDialog(context); } else {} }).catchError((err) { print(err); + GifLoaderDialogUtils.hideDialog(context); }); } getProjectsList() { ClinicListService service = new ClinicListService(); + List projectsListLocal = []; service.getProjectsList(context).then((res) { if (res['MessageStatus'] == 1) { setState(() { res['ListProject'].forEach((v) { - projectsList.add(new HospitalsModel.fromJson(v)); + projectsListLocal.add(new HospitalsModel.fromJson(v)); }); + projectsList = projectsListLocal; }); - GifLoaderDialogUtils.hideDialog(context); filterClinic(); - } else {} + isProjectLoaded = true; + } else { + isProjectLoaded = false; + } }).catchError((err) { print(err); }); @@ -235,10 +248,6 @@ class _SearchByClinicState extends State { doctorsList.clear(); res['DoctorList'].forEach((v) { doctorsList.add(new DoctorList.fromJson(v)); - // arr.add(new DoctorList.fromJson(v).projectName); - // arrDistance.add(new DoctorList.fromJson(v) - // .projectDistanceInKiloMeters - // .toString()); }); doctorsList.forEach((element) { List doctorByHospital = @@ -269,8 +278,6 @@ class _SearchByClinicState extends State { result = LinkedHashSet.from(arr).toList(); numAll = result.length; - // navigateToSearchResults( - // context, doctorsList, result, numAll, arrDistance); navigateToSearchResults( context, doctorsList, _patientDoctorAppointmentListHospital); } else { @@ -299,6 +306,7 @@ class _SearchByClinicState extends State { List docList, List patientDoctorAppointmentListHospital) async { + isProjectLoaded = false; Navigator.push( context, MaterialPageRoute( @@ -313,7 +321,7 @@ class _SearchByClinicState extends State { filterClinic() { setState(() { - if (widget.clnicIds.length > 0) { + if (widget.clnicIds != null && widget.clnicIds.length > 0) { clinicsList = clinicsList .where((i) => widget.clnicIds.indexOf(i.clinicID) > -1) .toList(); diff --git a/lib/pages/MyAppointments/models/ArrivedButtons.dart b/lib/pages/MyAppointments/models/ArrivedButtons.dart index a710e00c..136bd30f 100644 --- a/lib/pages/MyAppointments/models/ArrivedButtons.dart +++ b/lib/pages/MyAppointments/models/ArrivedButtons.dart @@ -2,13 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class ArrivedButtons { - static var buttons = [ - // { - // "title": TranslationBase.of(AppGlobal.context).arrived, - // "subtitle": TranslationBase.of(AppGlobal.context).status, - // "icon": "assets/images/new-design/waiting-room.png", - // "caller": "openReschedule" - // }, + var buttons = [ { "title": TranslationBase.of(AppGlobal.context).medicines, "subtitle": TranslationBase.of(AppGlobal.context).medicinesSubtitle, diff --git a/lib/pages/MyAppointments/models/BookedButtons.dart b/lib/pages/MyAppointments/models/BookedButtons.dart index 1a76be63..709b3b1f 100644 --- a/lib/pages/MyAppointments/models/BookedButtons.dart +++ b/lib/pages/MyAppointments/models/BookedButtons.dart @@ -2,7 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class BookedButtons { - static var buttons = [ + var buttons = [ { "title": TranslationBase.of(AppGlobal.context).confirm, "subtitle": TranslationBase.of(AppGlobal.context).appointment, diff --git a/lib/pages/MyAppointments/models/BookedButtonsAllowCheckIn.dart b/lib/pages/MyAppointments/models/BookedButtonsAllowCheckIn.dart index 374ebf45..9548b7c8 100644 --- a/lib/pages/MyAppointments/models/BookedButtonsAllowCheckIn.dart +++ b/lib/pages/MyAppointments/models/BookedButtonsAllowCheckIn.dart @@ -2,7 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class BookedButtonsAllowCheckIn { - static var buttons = [ + var buttons = [ { "title": TranslationBase.of(AppGlobal.context).confirm, "subtitle": TranslationBase.of(AppGlobal.context).appointment, diff --git a/lib/pages/MyAppointments/models/ConfirmedButtons.dart b/lib/pages/MyAppointments/models/ConfirmedButtons.dart index d5b7836e..b02021c7 100644 --- a/lib/pages/MyAppointments/models/ConfirmedButtons.dart +++ b/lib/pages/MyAppointments/models/ConfirmedButtons.dart @@ -2,7 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class ConfirmedButtons { - static var buttons = [ + var buttons = [ { "title": TranslationBase.of(AppGlobal.context).reschedule, "subtitle": TranslationBase.of(AppGlobal.context).appointment, diff --git a/lib/pages/MyAppointments/models/ConfirmedButtonsAllowCheckIn.dart b/lib/pages/MyAppointments/models/ConfirmedButtonsAllowCheckIn.dart index 1368e3f3..07ba333e 100644 --- a/lib/pages/MyAppointments/models/ConfirmedButtonsAllowCheckIn.dart +++ b/lib/pages/MyAppointments/models/ConfirmedButtonsAllowCheckIn.dart @@ -2,7 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; class ConfirmedButtonsAllowCheckIn { - static var buttons = [ + var buttons = [ { "title": TranslationBase.of(AppGlobal.context).reschedule, "subtitle": TranslationBase.of(AppGlobal.context).appointment, diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index 7d985233..fb79b5ac 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -276,14 +276,15 @@ class _AppointmentActionsState extends State { Future> _getBookedAppoActionsList() async { print("_getBookedAppoActionsList"); - print(BookedButtons.buttons); + BookedButtons bookedButtons = new BookedButtons(); + print(bookedButtons.buttons); List buttonsList = []; - for (var i = 0; i < BookedButtons.buttons.length; i++) { + for (var i = 0; i < bookedButtons.buttons.length; i++) { buttonsList.add(AppoDetailsButton( - title: BookedButtons.buttons[i]['title'], - subtitle: BookedButtons.buttons[i]['subtitle'], - icon: BookedButtons.buttons[i]['icon'], - caller: BookedButtons.buttons[i]['caller'], + title: bookedButtons.buttons[i]['title'], + subtitle: bookedButtons.buttons[i]['subtitle'], + icon: bookedButtons.buttons[i]['icon'], + caller: bookedButtons.buttons[i]['caller'], )); } setState(() { @@ -293,14 +294,16 @@ class _AppointmentActionsState extends State { Future> _getBookedCheckInAppoActionsList() async { print("_getBookedCheckInAppoActionsList"); - print(BookedButtonsAllowCheckIn.buttons); + BookedButtonsAllowCheckIn bookedButtonsAllowCheckIn = + new BookedButtonsAllowCheckIn(); + print(bookedButtonsAllowCheckIn.buttons); List buttonsList = []; - for (var i = 0; i < BookedButtonsAllowCheckIn.buttons.length; i++) { + for (var i = 0; i < bookedButtonsAllowCheckIn.buttons.length; i++) { buttonsList.add(AppoDetailsButton( - title: BookedButtonsAllowCheckIn.buttons[i]['title'], - subtitle: BookedButtonsAllowCheckIn.buttons[i]['subtitle'], - icon: BookedButtonsAllowCheckIn.buttons[i]['icon'], - caller: BookedButtonsAllowCheckIn.buttons[i]['caller'], + title: bookedButtonsAllowCheckIn.buttons[i]['title'], + subtitle: bookedButtonsAllowCheckIn.buttons[i]['subtitle'], + icon: bookedButtonsAllowCheckIn.buttons[i]['icon'], + caller: bookedButtonsAllowCheckIn.buttons[i]['caller'], )); } setState(() { @@ -310,14 +313,15 @@ class _AppointmentActionsState extends State { Future> _getConfirmedAppoActionsList() async { print("_getConfirmedAppoActionsList"); - print(ConfirmedButtons.buttons); + ConfirmedButtons confirmedButtons = new ConfirmedButtons(); + print(confirmedButtons.buttons); List buttonsList = []; - for (var i = 0; i < ConfirmedButtons.buttons.length; i++) { + for (var i = 0; i < confirmedButtons.buttons.length; i++) { buttonsList.add(AppoDetailsButton( - title: ConfirmedButtons.buttons[i]['title'], - subtitle: ConfirmedButtons.buttons[i]['subtitle'], - icon: ConfirmedButtons.buttons[i]['icon'], - caller: ConfirmedButtons.buttons[i]['caller'], + title: confirmedButtons.buttons[i]['title'], + subtitle: confirmedButtons.buttons[i]['subtitle'], + icon: confirmedButtons.buttons[i]['icon'], + caller: confirmedButtons.buttons[i]['caller'], )); } setState(() { @@ -327,14 +331,16 @@ class _AppointmentActionsState extends State { Future> _getConfirmedCheckInAppoActionsList() async { print("_getConfirmedAllowCheckInAppoActionsList"); - print(ConfirmedButtonsAllowCheckIn.buttons); + ConfirmedButtonsAllowCheckIn confirmedButtonsAllowCheckIn = + new ConfirmedButtonsAllowCheckIn(); + print(confirmedButtonsAllowCheckIn.buttons); List buttonsList = []; - for (var i = 0; i < ConfirmedButtonsAllowCheckIn.buttons.length; i++) { + for (var i = 0; i < confirmedButtonsAllowCheckIn.buttons.length; i++) { buttonsList.add(AppoDetailsButton( - title: ConfirmedButtonsAllowCheckIn.buttons[i]['title'], - subtitle: ConfirmedButtonsAllowCheckIn.buttons[i]['subtitle'], - icon: ConfirmedButtonsAllowCheckIn.buttons[i]['icon'], - caller: ConfirmedButtonsAllowCheckIn.buttons[i]['caller'], + title: confirmedButtonsAllowCheckIn.buttons[i]['title'], + subtitle: confirmedButtonsAllowCheckIn.buttons[i]['subtitle'], + icon: confirmedButtonsAllowCheckIn.buttons[i]['icon'], + caller: confirmedButtonsAllowCheckIn.buttons[i]['caller'], )); } setState(() { @@ -344,14 +350,15 @@ class _AppointmentActionsState extends State { Future> _getArrivedAppoActionsList() async { print("_getArrivedAppoActionsList"); - print(ArrivedButtons.buttons); + ArrivedButtons arrivedButtons = new ArrivedButtons(); + print(arrivedButtons.buttons); List buttonsList = []; - for (var i = 0; i < ArrivedButtons.buttons.length; i++) { + for (var i = 0; i < arrivedButtons.buttons.length; i++) { buttonsList.add(AppoDetailsButton( - title: ArrivedButtons.buttons[i]['title'], - subtitle: ArrivedButtons.buttons[i]['subtitle'], - icon: ArrivedButtons.buttons[i]['icon'], - caller: ArrivedButtons.buttons[i]['caller'], + title: arrivedButtons.buttons[i]['title'], + subtitle: arrivedButtons.buttons[i]['subtitle'], + icon: arrivedButtons.buttons[i]['icon'], + caller: arrivedButtons.buttons[i]['caller'], )); } setState(() { @@ -361,14 +368,14 @@ class _AppointmentActionsState extends State { Future> _getArrivedInvoiceAppoActionsList() async { print("_getArrivedInvoiceAppoActionsList"); - print(ArrivedButtons.buttons); + ArrivedButtons arrivedButtons = new ArrivedButtons(); List buttonsList = []; - for (var i = 0; i < ArrivedButtons.buttons.length; i++) { + for (var i = 0; i < arrivedButtons.buttons.length; i++) { buttonsList.add(AppoDetailsButton( - title: ArrivedButtons.buttons[i]['title'], - subtitle: ArrivedButtons.buttons[i]['subtitle'], - icon: ArrivedButtons.buttons[i]['icon'], - caller: ArrivedButtons.buttons[i]['caller'], + title: arrivedButtons.buttons[i]['title'], + subtitle: arrivedButtons.buttons[i]['subtitle'], + icon: arrivedButtons.buttons[i]['icon'], + caller: arrivedButtons.buttons[i]['caller'], )); } setState(() { @@ -474,7 +481,8 @@ class _AppointmentActionsState extends State { prescriptionReportEnhList.add(PrescriptionReportEnh.fromJson(report)); }); print(prescriptionReportEnhList.length); - navigateToMedicinePrescriptionReport(prescriptionReportEnhList, res['ListPRM']); + navigateToMedicinePrescriptionReport( + prescriptionReportEnhList, res['ListPRM']); } else { AppToast.showErrorToast(message: TranslationBase.of(context).noRecords); } diff --git a/pubspec.yaml b/pubspec.yaml index d65a4f8e..7a31f862 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -146,7 +146,7 @@ dependencies: google_maps_place_picker: ^1.0.0 #countdown timer for Upcoming List - flutter_countdown_timer: ^1.4.0 + flutter_countdown_timer: ^1.6.0 #Dependencies for video call implementation native_device_orientation: ^0.3.0 From 73c8e008523ad3dab739542192e92e0a47aa6fb3 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 24 Dec 2020 09:20:40 +0300 Subject: [PATCH 15/34] bug fixes --- lib/pages/DrawerPages/family/my-family.dart | 40 +++++++++++++++++---- lib/pages/landing/landing_page.dart | 5 ++- lib/widgets/drawer/app_drawer_widget.dart | 10 +++--- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 154b45f4..6488d528 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -13,6 +13,8 @@ import 'package:diplomaticquarterapp/models/Authentication/check_activation_code import 'package:diplomaticquarterapp/models/FamilyFiles/GetAllSharedRecordByStatusResponse.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/pages/rateAppointment/rate_appointment_doctor.dart'; import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; @@ -25,6 +27,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_circular_progress_Indeicator.dart'; import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; @@ -704,7 +707,7 @@ class _MyFamily extends State with TickerProviderStateMixin { } loginAfter(result, context) async { - GifLoaderDialogUtils.hideDialog(context); + //GifLoaderDialogUtils.hideDialog(context); var currentLang = await sharedPref.getString(APP_LANGUAGE); result = list.CheckActivationCode.fromJson(result); var familyFile = await sharedPref.getObject(FAMILY_FILE); @@ -722,13 +725,38 @@ class _MyFamily extends State with TickerProviderStateMixin { this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); await authenticatedUserObject.getUser(getUser: true); + Provider.of(context, listen: false) .setUser(authenticatedUserObject.user); - - //this.checkIfUserAgreedBefore(result), - Navigator.of(context).pushNamed( - HOME, - ); + appointmentRateViewModel + .getIsLastAppointmentRatedList() + .then((value) => { + //getToDoCount(), + // Utils.hideProgressDialog(), + if (appointmentRateViewModel.isHaveAppointmentNotRate) + { + Navigator.pushAndRemoveUntil( + context, + FadePage( + page: RateAppointmentDoctor(), + ), + (r) => false) + } + else + { + Navigator.pushAndRemoveUntil( + context, + FadePage( + page: LandingPage(), + ), + (r) => false) + } + }) + .catchError((err) { + print(err); + // Utils.hideProgressDialog(); + // GifLoaderDialogUtils.hideDialog(context); + }); } deactivateRequest(ID, status, context) { diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index a2b55e50..e8a995a3 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -14,6 +14,8 @@ import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/services/family_files/family_files_provider.dart' + as family; import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart'; import 'package:diplomaticquarterapp/theme/theme_notifier.dart'; import 'package:diplomaticquarterapp/theme/theme_value.dart'; @@ -60,7 +62,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); final authService = new AuthProvider(); var event = RobotProvider(); - + var familyFileProvider = family.FamilyFilesProvider(); void _requestIOSPermissions() { flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation< @@ -604,6 +606,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { sharedPref.setString(NOTIFICATION_COUNT, notificationCount); }) }); + familyFileProvider.getSharedRecordByStatus(); } } } diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index da227d96..aea97d40 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -165,6 +165,7 @@ class _AppDrawerState extends State { sideArrow: true, ), onTap: () { + Navigator.of(context).pop(); Navigator.of(context).pushNamed( MY_FAMILIY, ); @@ -549,10 +550,10 @@ class _AppDrawerState extends State { .familyFileProvider .silentLoggin(user is AuthenticatedUser ? null : user, mainUser: user is AuthenticatedUser) - .then((value) async { + .then((value) { _vitalSignService.heightCm = ""; _vitalSignService.weightKg = ""; - GifLoaderDialogUtils.hideDialog(context); + loginAfter(value, context); }).catchError((err) { GifLoaderDialogUtils.hideDialog(context); @@ -579,6 +580,7 @@ class _AppDrawerState extends State { this.sharedPref.setObject(FAMILY_FILE, familyFile); this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); + // Navigator.of(context).pop(); await authenticatedUserObject.getUser(getUser: true); Provider.of(context, listen: false) .setUser(authenticatedUserObject.user); @@ -586,7 +588,7 @@ class _AppDrawerState extends State { .getIsLastAppointmentRatedList() .then((value) => { //getToDoCount(), - Utils.hideProgressDialog(), + //Utils.hideProgressDialog(), if (appointmentRateViewModel.isHaveAppointmentNotRate) { Navigator.pushAndRemoveUntil( @@ -608,7 +610,7 @@ class _AppDrawerState extends State { }) .catchError((err) { print(err); - Utils.hideProgressDialog(); + //Utils.hideProgressDialog(); // GifLoaderDialogUtils.hideDialog(context); }); } From 5e29dff448d4ee74ddeac5e120eba4a8f8508ce4 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 24 Dec 2020 14:14:30 +0200 Subject: [PATCH 16/34] fix issues insurance and medical profile order --- .../widgets/AppointmentActions.dart | 2 +- lib/pages/insurance/insurance_page.dart | 261 ++++++++++++++++++ .../insurance/insurance_update_screen.dart | 259 +---------------- lib/pages/medical/medical_profile_page.dart | 95 +++---- .../vital_sign/vital_sign_details_screen.dart | 31 ++- 5 files changed, 329 insertions(+), 319 deletions(-) create mode 100644 lib/pages/insurance/insurance_page.dart diff --git a/lib/pages/MyAppointments/widgets/AppointmentActions.dart b/lib/pages/MyAppointments/widgets/AppointmentActions.dart index fb79b5ac..60035ee1 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentActions.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentActions.dart @@ -668,7 +668,7 @@ class _AppointmentActionsState extends State { context, FadePage( page: VitalSignDetailsScreen( - appointmentNo: appoNo, projectID: projectID))); + appointmentNo: appoNo, projectID: projectID,isNotOneAppointment: false,))); } navigateToInsertComplaint() { diff --git a/lib/pages/insurance/insurance_page.dart b/lib/pages/insurance/insurance_page.dart new file mode 100644 index 00000000..f938d9e5 --- /dev/null +++ b/lib/pages/insurance/insurance_page.dart @@ -0,0 +1,261 @@ +import 'package:diplomaticquarterapp/core/service/insurance_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; +import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.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/transitions/fade_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../../locator.dart'; +import 'insurance_card_update_details.dart'; + +class InsurancePage extends StatelessWidget { + final InsuranceViewModel model; + InsuranceCardService _insuranceCardService = locator(); + + InsurancePage({Key key, this.model}) : super(key: key); + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: 65, + ), + Container( + margin: EdgeInsets.all(10.0), + color: Colors.white, + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.all(10.0), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + if (model.user != null) + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 2.0, + left: 10.0, + right: 20.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Texts( + model.user.firstName ?? '' + " " + model.user.lastName ?? '', + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ), + SizedBox( + height: 8, + ), + Texts( + TranslationBase.of(context) + .fileno + + ": " + + model.user.patientID + .toString(), + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.w500, + ) + ], + ), + ), + ), + Expanded( + flex: 2, + child: Container( + margin: EdgeInsets.only(top: 2.0), + child: Column( + children: [ + Container( + child: SecondaryButton( + label: TranslationBase.of( + context) + .fetchData, + small: true, + textColor: Colors.white, + onTap: () { + getDetails( + setupID: '010266', + projectID: 15, + patientIdentificationID: + model.user + .patientIdentificationNo, + patientID: model + .user.patientID, + name: model.user + .firstName + + " " + + model + .user.lastName,context: context); + }, + ), + ), + ], + ), + ), + ) + ], + ), + ), + if(model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList != null ?? false) + ...List.generate(model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList.length, (index) => + model.getAllSharedRecordsByStatusResponse.getAllSharedRecordsByStatusList[index].status == 3 + ? Container( + margin: EdgeInsets.all(10.0), + child: Card( + margin: EdgeInsets.fromLTRB( + 8.0, 16.0, 8.0, 8.0), + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(10), + ), + child: Container( + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.all(10.0), + child: Row( + crossAxisAlignment: + CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + flex: 3, + child: Container( + margin: EdgeInsets.only( + top: 2.0, + left: 10.0, + right: 20.0), + child: Column( + crossAxisAlignment: + CrossAxisAlignment + .start, + children: [ + Texts( + model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .patientName, + fontSize: 14, + color: Colors.black, + fontWeight: + FontWeight.w500, + ), + SizedBox( + height: 8, + ), + Texts( + TranslationBase.of( + context) + .fileno + + ": " + + model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .patientID + .toString(), + fontSize: 14, + color: Colors.black, + fontWeight: + FontWeight.w500, + ) + ], + ), + ), + ), + Expanded( + flex: 2, + child: Container( + margin: + EdgeInsets.only(top: 2.0), + child: Column( + children: [ + Container( + child: SecondaryButton( + label: TranslationBase + .of(context) + .fetchData, + small: true, + textColor: + Colors.white, + onTap: () { + getDetails( + projectID: 15, + patientIdentificationID: model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .patientIdenficationNumber, + setupID: + '010266', + patientID: model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index] + .responseID, + name: model + .getAllSharedRecordsByStatusResponse + .getAllSharedRecordsByStatusList[ + index].patientName,context: context); + }, + ), + ), + ], + ), + ), + ) + ], + ), + ), + ), + ) + : Container() + ), + + ], + ), + ); + } + + getDetails( + {String setupID, + int projectID, + String patientIdentificationID, + int patientID, + String name,BuildContext context}) { + GifLoaderDialogUtils.showMyDialog(context); + _insuranceCardService + .getPatientInsuranceDetails( + setupID: setupID, + projectID: projectID, + patientID: patientID, + patientIdentificationID: patientIdentificationID) + .then((value) { + GifLoaderDialogUtils.hideDialog(context); + if (!_insuranceCardService.hasError && _insuranceCardService.isHaveInsuranceCard) { + Navigator.push( + context, + FadePage( + page: InsuranceCardUpdateDetails( + insuranceCardDetailsModel: _insuranceCardService.insuranceCardDetailsList, + patientID: patientID, + patientIdentificationID: patientIdentificationID, + name: name, + ))); + } else { + AppToast.showErrorToast(message: _insuranceCardService.error); + } + }); + } +} diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index d2d715cb..36b424a8 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -16,6 +16,7 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; import 'package:diplomaticquarterapp/core/viewModels/insurance_card_View_model.dart'; import 'insurance_card_update_details.dart'; +import 'insurance_page.dart'; class InsuranceUpdate extends StatefulWidget { @override @@ -25,7 +26,6 @@ class InsuranceUpdate extends StatefulWidget { class _InsuranceUpdateState extends State with SingleTickerProviderStateMixin { TabController _tabController; - InsuranceCardService _insuranceCardService = locator(); List imagesInfo = List(); @override void initState() { @@ -111,231 +111,7 @@ class _InsuranceUpdateState extends State physics: BouncingScrollPhysics(), controller: _tabController, children: [ - Container( - child: model.getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList != - null ?? - false - ? ListView.builder( - itemCount: model.getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList.length, - itemBuilder: (BuildContext context, int index) { - return model - .getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList[ - index] - .status == - 3 - ? Container( - margin: EdgeInsets.all(10.0), - child: Card( - margin: EdgeInsets.fromLTRB( - 8.0, 16.0, 8.0, 8.0), - color: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(10), - ), - child: Container( - width: MediaQuery.of(context).size.width, - padding: EdgeInsets.all(10.0), - child: Row( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - top: 2.0, - left: 10.0, - right: 20.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment - .start, - children: [ - Texts( - model - .getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList[ - index] - .patientName, - fontSize: 14, - color: Colors.black, - fontWeight: - FontWeight.w500, - ), - SizedBox( - height: 8, - ), - Texts( - TranslationBase.of( - context) - .fileno + - ": " + - model - .getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList[ - index] - .patientID - .toString(), - fontSize: 14, - color: Colors.black, - fontWeight: - FontWeight.w500, - ) - ], - ), - ), - ), - Expanded( - flex: 2, - child: Container( - margin: - EdgeInsets.only(top: 2.0), - child: Column( - children: [ - Container( - child: SecondaryButton( - label: TranslationBase - .of(context) - .fetchData, - small: true, - textColor: - Colors.white, - onTap: () { - getDetails( - projectID: 15, - patientIdentificationID: model - .getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList[ - index] - .patientIdenficationNumber, - setupID: - '010266', - patientID: model - .getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList[ - index] - .responseID, - name: model - .getAllSharedRecordsByStatusResponse - .getAllSharedRecordsByStatusList[ - index] - .patientName); - }, - ), - ), - ], - ), - ), - ) - ], - ), - ), - ), - ) - : Container(); - }) - : Container( - height: 80, - margin: EdgeInsets.all(10.0), - child: Column( - children: [ - SizedBox( - height: 65, - ), - Container( - color: Colors.white, - width: MediaQuery.of(context).size.width, - padding: EdgeInsets.all(10.0), - child: Row( - crossAxisAlignment: - CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - if (model.user != null) - Expanded( - flex: 3, - child: Container( - margin: EdgeInsets.only( - top: 2.0, - left: 10.0, - right: 20.0), - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Texts( - model.user.firstName ?? - '' + - " " + - model.user.lastName ?? - '', - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ), - SizedBox( - height: 8, - ), - Texts( - TranslationBase.of(context) - .fileno + - ": " + - model.user.patientID - .toString(), - fontSize: 14, - color: Colors.black, - fontWeight: FontWeight.w500, - ) - ], - ), - ), - ), - Expanded( - flex: 2, - child: Container( - margin: EdgeInsets.only(top: 2.0), - child: Column( - children: [ - Container( - child: SecondaryButton( - label: TranslationBase.of( - context) - .fetchData, - small: true, - textColor: Colors.white, - onTap: () { - getDetails( - setupID: '010266', - projectID: 15, - patientIdentificationID: - model.user - .patientIdentificationNo, - patientID: model - .user.patientID, - name: model.user - .firstName + - " " + - model - .user.lastName); - }, - ), - ), - ], - ), - ), - ) - ], - ), - ), - ], - ), - ), - ), + InsurancePage(model:model), Container( child: ListView.builder( itemCount: model.insuranceUpdate == null @@ -452,34 +228,5 @@ class _InsuranceUpdateState extends State ); } - getDetails( - {String setupID, - int projectID, - String patientIdentificationID, - int patientID, - String name}) { - GifLoaderDialogUtils.showMyDialog(context); - _insuranceCardService - .getPatientInsuranceDetails( - setupID: setupID, - projectID: projectID, - patientID: patientID, - patientIdentificationID: patientIdentificationID) - .then((value) { - GifLoaderDialogUtils.hideDialog(context); - if (!_insuranceCardService.hasError && _insuranceCardService.isHaveInsuranceCard) { - Navigator.push( - context, - FadePage( - page: InsuranceCardUpdateDetails( - insuranceCardDetailsModel: _insuranceCardService.insuranceCardDetailsList, - patientID: patientID, - patientIdentificationID: patientIdentificationID, - name: name, - ))); - } else { - AppToast.showErrorToast(message: _insuranceCardService.error); - } - }); - } + } diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index f923c610..7eb0b5ba 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -222,16 +222,16 @@ class _MedicalProfilePageState extends State { Navigator.push( context, FadePage( - page: DoctorHomePage(), + page: HomePrescriptionsPage(), ), ); }, child: MedicalProfileItem( title: TranslationBase.of(context) - .myDoctor, - imagePath: 'doctor_icon.png', + .medicines, + imagePath: 'prescription_icon.png', subTitle: TranslationBase.of(context) - .myDoctorSubtitle, + .medicinesSubtitle, ), ), ), @@ -239,19 +239,15 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.push( - context, - FadePage( - page: HomePrescriptionsPage(), - ), - ); + Navigator.push(context, + FadePage(page: VitalSignDetailsScreen())); }, child: MedicalProfileItem( title: TranslationBase.of(context) - .medicines, - imagePath: 'prescription_icon.png', + .vitalSigns, + imagePath: 'vital_sign_icon.png', subTitle: TranslationBase.of(context) - .medicinesSubtitle, + .vitalSignsSubtitle, ), ), ), @@ -260,14 +256,14 @@ class _MedicalProfilePageState extends State { child: InkWell( onTap: () { Navigator.push(context, - FadePage(page: InsuranceCard())); + FadePage(page: HomeReportPage())); }, child: MedicalProfileItem( - title: TranslationBase.of(context) - .insurance, - imagePath: 'insurance_card_icon.png', + title: + TranslationBase.of(context).medical, + imagePath: 'medical_reports_icon.png', subTitle: TranslationBase.of(context) - .insuranceSubtitle, + .medicalSubtitle, ), ), ), @@ -275,6 +271,26 @@ class _MedicalProfilePageState extends State { ), Row( children: [ + Expanded( + flex: 1, + child: InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: DoctorHomePage(), + ), + ); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context) + .myDoctor, + imagePath: 'doctor_icon.png', + subTitle: TranslationBase.of(context) + .myDoctorSubtitle, + ), + ), + ), Expanded( flex: 1, child: InkWell( @@ -306,25 +322,7 @@ class _MedicalProfilePageState extends State { ), ), ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: InsuranceApproval())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .insuranceApproval, - imagePath: - 'insurance_approvals_icon.png', - subTitle: TranslationBase.of(context) - .insuranceApprovalSubtitle, - ), - ), - ), + ], ), Row(children: [ @@ -333,14 +331,14 @@ class _MedicalProfilePageState extends State { child: InkWell( onTap: () { Navigator.push(context, - FadePage(page: HomeReportPage())); + FadePage(page: InsuranceCard())); }, child: MedicalProfileItem( - title: - TranslationBase.of(context).medical, - imagePath: 'medical_reports_icon.png', + title: TranslationBase.of(context) + .insurance, + imagePath: 'insurance_card_icon.png', subTitle: TranslationBase.of(context) - .medicalSubtitle, + .insuranceSubtitle, ), ), ), @@ -364,15 +362,18 @@ class _MedicalProfilePageState extends State { flex: 1, child: InkWell( onTap: () { - Navigator.push(context, - FadePage(page: VitalSignDetailsScreen())); + Navigator.push( + context, + FadePage( + page: InsuranceApproval())); }, child: MedicalProfileItem( title: TranslationBase.of(context) - .vitalSigns, - imagePath: 'vital_sign_icon.png', + .insuranceApproval, + imagePath: + 'insurance_approvals_icon.png', subTitle: TranslationBase.of(context) - .vitalSignsSubtitle, + .insuranceApprovalSubtitle, ), ), ), 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 416074f2..b1c6df76 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -17,7 +17,8 @@ class VitalSignDetailsScreen extends StatelessWidget { int appointmentNo; int projectID; - VitalSignDetailsScreen({this.appointmentNo, this.projectID}); + bool isNotOneAppointment; + VitalSignDetailsScreen({this.appointmentNo, this.projectID,this.isNotOneAppointment=true}); List imagesInfo = List(); @@ -43,7 +44,7 @@ class VitalSignDetailsScreen extends StatelessWidget { Row( children: [ InkWell( - onTap: () => Navigator.push( + onTap: () =>isNotOneAppointment? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -52,7 +53,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ):null, child: Container( child: VitalSignItem( des: TranslationBase.of(context).height, @@ -67,7 +68,7 @@ class VitalSignDetailsScreen extends StatelessWidget { ), ), InkWell( - onTap: () => Navigator.push( + onTap: () => isNotOneAppointment ? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -76,7 +77,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ):null, child: VitalSignItem( des: TranslationBase.of(context).weight, icon: DQIcons.weight_scale, @@ -93,7 +94,7 @@ class VitalSignDetailsScreen extends StatelessWidget { Row( children: [ InkWell( - onTap: () => Navigator.push( + onTap: () => isNotOneAppointment ? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -103,7 +104,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ): null, child: VitalSignItem( des: TranslationBase.of(context).body, icon: DQIcons.bmi, @@ -114,7 +115,7 @@ class VitalSignDetailsScreen extends StatelessWidget { ), ), InkWell( - onTap: () => Navigator.push( + onTap: () => isNotOneAppointment ? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -124,7 +125,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ):null, child: Container( child: VitalSignItem( des: TranslationBase.of(context).temperature, @@ -141,7 +142,7 @@ class VitalSignDetailsScreen extends StatelessWidget { Row( children: [ InkWell( - onTap: () => Navigator.push( + onTap: () => isNotOneAppointment ? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -150,7 +151,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ):null, child: VitalSignItem( des: TranslationBase.of(context).heart, icon: DQIcons.heart, @@ -163,7 +164,7 @@ class VitalSignDetailsScreen extends StatelessWidget { ), ), InkWell( - onTap: () => Navigator.push( + onTap: () => isNotOneAppointment ? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -173,7 +174,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ):null, child: VitalSignItem( des: TranslationBase.of(context).respirationRate, icon: DQIcons.outline, @@ -191,7 +192,7 @@ class VitalSignDetailsScreen extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ InkWell( - onTap: () => Navigator.push( + onTap: () => isNotOneAppointment ? Navigator.push( context, FadePage( page: VitalSignItemDetailsScreen( @@ -200,7 +201,7 @@ class VitalSignDetailsScreen extends StatelessWidget { vitalList: mode.vitalSignResModelList, ), ), - ), + ):null, child: VitalSignItem( des: TranslationBase.of(context).bloodPressure, icon: DQIcons.blood_pressure, From 33c61afd2aad08e983dde5fa775ac7e2412aa480 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 24 Dec 2020 14:26:03 +0200 Subject: [PATCH 17/34] add powered by --- lib/splashPage.dart | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 2d8c3ef9..fb26f76d 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -1,10 +1,12 @@ import 'dart:async'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'config/shared_pref_kay.dart'; +import 'config/size_config.dart'; import 'core/service/AuthenticatedUserObject.dart'; import 'core/viewModels/project_view_model.dart'; import 'locator.dart'; @@ -46,11 +48,27 @@ class _SplashScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - body: Center( - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Image.asset('assets/images/DQ/DQ_logo.png'), - ), + body: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: MediaQuery.of(context).size.height * 0.35,), + Padding( + padding: const EdgeInsets.all(25.0), + child: Image.asset('assets/images/DQ/DQ_logo.png'), + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.30,), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(TranslationBase.of(context).poweredBy), + Image.asset( + 'assets/images/cs_logo_container.png', + width: 80, + ) + ], + ) + ], ), ); } From c9538c6a84024f620df3f816d2105e2d847029a9 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 25 Dec 2020 04:42:31 +0300 Subject: [PATCH 18/34] family files --- lib/widgets/drawer/app_drawer_widget.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index aea97d40..e42c1a2c 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -114,6 +114,8 @@ class _AppDrawerState extends State { padding: EdgeInsets.only( left: 30, right: 10), child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, children: [ AppText( TranslationBase.of( @@ -182,7 +184,7 @@ class _AppDrawerState extends State { case ConnectionState.waiting: return Padding( padding: EdgeInsets.all(10), - child: Text('Loading....')); + child: Text('')); default: if (snapshot.hasError) return Padding( From 8becd4f920ecf07e0f427f3d77c4e7cbc41e0b0a Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Sun, 27 Dec 2020 09:59:53 +0300 Subject: [PATCH 19/34] login issue fixed --- lib/pages/landing/landing_page.dart | 2 +- lib/pages/login/login.dart | 88 +++++----- lib/pages/login/register.dart | 260 ++++++++++++++-------------- 3 files changed, 175 insertions(+), 175 deletions(-) diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index e8a995a3..68eee783 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -154,7 +154,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { _firebaseMessaging.getToken().then((String token) async { sharedPref.setString(PUSH_TOKEN, token); - if (token != null && await sharedPref.getObject(USER_PROFILE) == null) { + if (token != null && projectViewModel.isLogin == false) { DEVICE_TOKEN = token; checkUserStatus(token); } else if (projectViewModel.isLogin) { diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 46f52280..5c4b3406 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -99,6 +99,7 @@ class _Login extends State { textDirection: TextDirection.ltr, child: Container( child: TextFields( + keyboardType: TextInputType.number, fontWeight: FontWeight.normal, controller: nationalIDorFile, onChanged: (value) => {validateForm()}, @@ -240,50 +241,49 @@ class _Login extends State { request['PatientID'] = int.parse(nationalIDorFile.text); } // request.isRegister = false; - this.authService.checkActivationCode(request, code).then((result) async{ - sharedPref.remove(FAMILY_FILE); - result = CheckActivationCode.fromJson(result); - result.list.isFamily = false; - // this.sharedPref.setString(BLOOD_TYPE, result['PatientBloodType']), - this.sharedPref.setObject(USER_PROFILE, result.list); - this.sharedPref.setObject(MAIN_USER, result.list); - this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); - this.sharedPref.setString(TOKEN, result.authenticationTokenID); - await authenticatedUserObject.getUser(getUser: true); - authenticatedUserObject.isLogin = true; - appointmentRateViewModel.isLogin = true; - projectViewModel.isLogin = true; - projectViewModel.user = authenticatedUserObject.user; - appointmentRateViewModel - .getIsLastAppointmentRatedList() - .then((value) => { - getToDoCount(), - GifLoaderDialogUtils.hideDialog(context), - if (appointmentRateViewModel.isHaveAppointmentNotRate) - { - Navigator.pushAndRemoveUntil( - context, - FadePage( - page: RateAppointmentDoctor(), - ), - (r) => false) - } - else - { - Navigator.pushAndRemoveUntil( - context, - FadePage( - page: LandingPage(), - ), - (r) => false) - } - }) - .catchError((err) { - print(err); - GifLoaderDialogUtils.hideDialog(context); - }); - - }); + this.authService.checkActivationCode(request, code).then((result) async { + sharedPref.remove(FAMILY_FILE); + result = CheckActivationCode.fromJson(result); + result.list.isFamily = false; + // this.sharedPref.setString(BLOOD_TYPE, result['PatientBloodType']), + this.sharedPref.setObject(USER_PROFILE, result.list); + this.sharedPref.setObject(MAIN_USER, result.list); + this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); + this.sharedPref.setString(TOKEN, result.authenticationTokenID); + await authenticatedUserObject.getUser(getUser: true); + authenticatedUserObject.isLogin = true; + appointmentRateViewModel.isLogin = true; + projectViewModel.isLogin = true; + projectViewModel.user = authenticatedUserObject.user; + appointmentRateViewModel + .getIsLastAppointmentRatedList() + .then((value) => { + getToDoCount(), + GifLoaderDialogUtils.hideDialog(context), + if (appointmentRateViewModel.isHaveAppointmentNotRate) + { + Navigator.pushAndRemoveUntil( + context, + FadePage( + page: RateAppointmentDoctor(), + ), + (r) => false) + } + else + { + Navigator.pushAndRemoveUntil( + context, + FadePage( + page: LandingPage(), + ), + (r) => false) + } + }) + .catchError((err) { + print(err); + GifLoaderDialogUtils.hideDialog(context); + }); + }); } getToDoCount() { diff --git a/lib/pages/login/register.dart b/lib/pages/login/register.dart index 9245d6c3..34337411 100644 --- a/lib/pages/login/register.dart +++ b/lib/pages/login/register.dart @@ -50,135 +50,136 @@ class _Register extends State { isShowAppBar: true, isShowDecPage: false, body: SingleChildScrollView( - child: Container( - padding: - EdgeInsets.only(top: 10, left: 20, right: 20, bottom: 30), - height: SizeConfig.realScreenHeight * .9, - width: SizeConfig.realScreenWidth, - child: Column(children: [ - Expanded( - flex: 1, - child: AppText( - TranslationBase.of(context).enterNationalId, - fontSize: SizeConfig.textMultiplier * 3, - textAlign: TextAlign.left, - )), - Expanded( - flex: 4, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - MobileNo( - onNumberChange: (value) => - {mobileNo = value, validateForm()}, - onCountryChange: (value) => countryCode = value), - Directionality( - textDirection:TextDirection.ltr,child:Container( - child: TextFields( - controller: nationalIDorFile, - onChanged: (value) => validateForm(), - prefixIcon: - Icon(Icons.chrome_reader_mode, color: Color(0xFF40ACC9)), - padding: EdgeInsets.only( - top: 20, bottom: 20, left: 10, right: 10), - hintText: TranslationBase.of(context).nationalID, - ))), - Row( + child: Container( + padding: EdgeInsets.only(top: 10, left: 20, right: 20, bottom: 30), + height: SizeConfig.realScreenHeight * .9, + width: SizeConfig.realScreenWidth, + child: Column(children: [ + Expanded( + flex: 1, + child: AppText( + TranslationBase.of(context).enterNationalId, + fontSize: SizeConfig.textMultiplier * 3, + textAlign: TextAlign.left, + )), + Expanded( + flex: 4, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + MobileNo( + onNumberChange: (value) => + {mobileNo = value, validateForm()}, + onCountryChange: (value) => countryCode = value), + Directionality( + textDirection: TextDirection.ltr, + child: Container( + child: TextFields( + controller: nationalIDorFile, + onChanged: (value) => validateForm(), + keyboardType: TextInputType.number, + prefixIcon: Icon(Icons.chrome_reader_mode, + color: Color(0xFF40ACC9)), + padding: EdgeInsets.only( + top: 20, bottom: 20, left: 10, right: 10), + hintText: TranslationBase.of(context).nationalID, + ))), + Row( + children: [ + Expanded( + child: Row( children: [ - Expanded( - child: Row( - children: [ - Radio( - value: 1, - groupValue: isHijri, - onChanged: (value) { - setState(() { - isHijri = value; - }); - validateForm(); - }, - ), - Text(TranslationBase.of(context).hijriDate), - ], - ), + Radio( + value: 1, + groupValue: isHijri, + onChanged: (value) { + setState(() { + isHijri = value; + }); + validateForm(); + }, ), - Expanded( - child: Row( - children: [ - Radio( - value: 0, - groupValue: isHijri, - onChanged: (value) { - setState(() { - isHijri = value; - }); - validateForm(); - }, - ), - Text(TranslationBase.of(context) - .gregorianDate), - ], - ), + Text(TranslationBase.of(context).hijriDate), + ], + ), + ), + Expanded( + child: Row( + children: [ + Radio( + value: 0, + groupValue: isHijri, + onChanged: (value) { + setState(() { + isHijri = value; + }); + validateForm(); + }, ), + Text(TranslationBase.of(context).gregorianDate), ], ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Container( + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( width: SizeConfig.realScreenWidth * .9, - height:60, - child: isHijri == 1 - ? TextFields( - onChanged: (value) => {dob = value}, - hintText: 'DD/MM/YYYY', - prefixIcon: Icon(Icons.date_range), - ) - : RaisedButton.icon( - shape: RoundedRectangleBorder( + height: 60, + child: isHijri == 1 + ? TextFields( + onChanged: (value) => {dob = value}, + hintText: 'DD/MM/YYYY', + prefixIcon: Icon(Icons.date_range), + ) + : RaisedButton.icon( + shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), - - ), - color:Colors.white, - onPressed: () => { - if (isHijri != null) - _selectDate(context) - }, - icon: Icon(Icons.date_range), - label: Text(selectedDate != null - ? "${selectedDate.toLocal()}" - .split(' ')[0] - : TranslationBase.of(context).dob))) - ]) + ), + color: Colors.white, + onPressed: () => { + if (isHijri != null) + _selectDate(context) + }, + icon: Icon(Icons.date_range), + label: Text(selectedDate != null + ? "${selectedDate.toLocal()}" + .split(' ')[0] + : TranslationBase.of(context).dob))) + ]) + ], + ), + ), + Expanded( + flex: 2, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Divider( + color: Colors.grey, + height: 2, + ), + SizedBox( + height: 10, + ), + Row( + children: [ + Expanded( + child: DefaultButton( + TranslationBase.of(context).registerNow, + () => {startRegistration()}, + textColor: Colors.white, + color: isButtonDisabled == true + ? Colors.grey + : Colors.grey[900])) ], ), - ), - Expanded( - flex: 2, - child: Column( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Divider( - color: Colors.grey, - height: 2, - ), - SizedBox(height: 10,), - Row( - children: [ - Expanded( - child: DefaultButton( - TranslationBase.of(context).registerNow, - () => {startRegistration()}, - textColor: Colors.white, - color: isButtonDisabled == true - ? Colors.grey - : Colors.grey[900])) - ], - ), - ], - )) - ]), - ))); + ], + )) + ]), + ))); } Future _selectDate(BuildContext context) async { @@ -216,7 +217,8 @@ class _Register extends State { this .authService .checkPatientForRegisteration(request) - .then((response) => {checkUserStatus(response, request)}).catchError((err) { + .then((response) => {checkUserStatus(response, request)}) + .catchError((err) { GifLoaderDialogUtils.hideDialog(context); ConfirmDialog dialog = new ConfirmDialog( context: context, @@ -224,15 +226,13 @@ class _Register extends State { okText: TranslationBase.of(context).confirm, cancelText: TranslationBase.of(context).cancel_nocaps, okFunction: () => { - ConfirmDialog.closeAlertDialog(context), - Navigator.of(context).pushNamed( - REGISTER, - ), - - }, + ConfirmDialog.closeAlertDialog(context), + Navigator.of(context).pushNamed( + REGISTER, + ), + }, cancelFunction: () => {ConfirmDialog.closeAlertDialog(context)}); dialog.showAlertDialog(context); - }); } @@ -257,7 +257,7 @@ class _Register extends State { var nRequest = request.toJson(); nRequest['LogInTokenID'] = response['LogInTokenID']; if (response['hasFile'] == true) { - // AppToast.showErrorToast(message: response['ErrorEndUserMessage']); + // AppToast.showErrorToast(message: response['ErrorEndUserMessage']); AlertDialogBox( context: context, confirmMessage: response['ErrorEndUserMessage'], @@ -308,7 +308,7 @@ class _Register extends State { request.isHijri = isHijri; request.patientOutSA = countryCode == '966' ? 0 : 1; this.authService.checkUserStatus(request).then((result) => { - GifLoaderDialogUtils.hideDialog(context), + GifLoaderDialogUtils.hideDialog(context), if (result is Map) { result = CheckUserStatusResponse.fromJson(result), From 591d56e624f7168303c05200d253f5d33a686ef7 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Sun, 27 Dec 2020 17:17:09 +0200 Subject: [PATCH 20/34] change the info images and change the out patient color --- ios/Flutter/.last_build_id | 2 +- .../E-Referral/e_referral_index_page.dart | 4 +- .../ContactUs/LiveChat/livechat_page.dart | 6 +- lib/pages/DrawerPages/family/my-family.dart | 8 +- lib/pages/ErService/AmbulanceReq.dart | 4 +- lib/pages/MyAppointments/MyAppointments.dart | 8 +- lib/pages/ToDoList/ToDo.dart | 4 +- .../insurance/insurance_approval_screen.dart | 8 +- .../insurance/insurance_card_screen.dart | 4 +- .../insurance/insurance_update_screen.dart | 2 +- lib/pages/medical/allergies_page.dart | 2 +- .../medical/balance/advance_payment_page.dart | 4 +- .../medical/balance/my_balance_page.dart | 106 +++++++++--------- .../medical/doctor/doctor_home_page.dart | 8 +- lib/pages/medical/labs/labs_home_page.dart | 2 +- .../medical/patient_sick_leave_page.dart | 4 +- .../prescriptions_home_page.dart | 4 +- .../radiology/radiology_home_page.dart | 4 +- .../medical/reports/report_home_page.dart | 12 +- .../vital_sign/vital_sign_details_screen.dart | 4 +- .../data_display/medical/doctor_card.dart | 2 +- 21 files changed, 103 insertions(+), 99 deletions(-) diff --git a/ios/Flutter/.last_build_id b/ios/Flutter/.last_build_id index 4a225219..b8024672 100644 --- a/ios/Flutter/.last_build_id +++ b/ios/Flutter/.last_build_id @@ -1 +1 @@ -d69545ca05f0ca200eba92121a1458fb \ No newline at end of file +59a6c452ee075b50114918f17f1ad8f5 \ No newline at end of file diff --git a/lib/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart b/lib/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart index c837bd2a..a68bca73 100644 --- a/lib/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart +++ b/lib/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart @@ -48,8 +48,8 @@ class EReferralIndexPage extends StatelessWidget { width: MediaQuery.of(context).size.width * 0.50, child: CarouselSlider( imagesUrlList: [ - "https://hmgwebservices.com/Images/MobileApp/images-info-home/referal/en/0.png", - "https://hmgwebservices.com/Images/MobileApp/images-info-home/referal/en/1.png" + "https://hmgwebservices.com/Images/MobileAppDq/images-info-home/referal/en/0.png", + "https://hmgwebservices.com/Images/MobileAppDq/images-info-home/referal/en/1.png" ], ), ), diff --git a/lib/pages/ContactUs/LiveChat/livechat_page.dart b/lib/pages/ContactUs/LiveChat/livechat_page.dart index a747db3d..a49b5a04 100644 --- a/lib/pages/ContactUs/LiveChat/livechat_page.dart +++ b/lib/pages/ContactUs/LiveChat/livechat_page.dart @@ -23,9 +23,9 @@ class _LiveChatPageState extends State @override void initState() { super.initState(); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/live-chat/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/live-chat/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/live-chat/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/live-chat/ar/1.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/live-chat/en/2.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/live-chat/ar/2.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/live-chat/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/live-chat/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/live-chat/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/live-chat/ar/1.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/live-chat/en/2.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/live-chat/ar/2.png')); _tabController = TabController(length: 2, vsync: this); } diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 6488d528..485e897c 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -72,17 +72,17 @@ class _MyFamily extends State with TickerProviderStateMixin { imagesInfo.add( ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/family-file/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/ar/0.png'), + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/family-file/ar/0.png'), ); imagesInfo.add( ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/en/1.png', + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/family-file/en/1.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/family-file/ar/1.png'), + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/family-file/ar/1.png'), ); projectViewModel = Provider.of(context); return AppScaffold( diff --git a/lib/pages/ErService/AmbulanceReq.dart b/lib/pages/ErService/AmbulanceReq.dart index 1690254a..e5e0cc04 100644 --- a/lib/pages/ErService/AmbulanceReq.dart +++ b/lib/pages/ErService/AmbulanceReq.dart @@ -43,9 +43,9 @@ class _AmbulanceReqState extends State Widget build(BuildContext context) { imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/Ambulance/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/Ambulance/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/Ambulance/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/Ambulance/ar/0.png')); return BaseView( onModelReady: (model) => model.getAmRequestOrders(), diff --git a/lib/pages/MyAppointments/MyAppointments.dart b/lib/pages/MyAppointments/MyAppointments.dart index a49149b5..39dfae41 100644 --- a/lib/pages/MyAppointments/MyAppointments.dart +++ b/lib/pages/MyAppointments/MyAppointments.dart @@ -60,14 +60,14 @@ class _MyAppointmentsState extends State }); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-appointment/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-appointment/ar/0.png')); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/en/1.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-appointment/en/1.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-appointment/ar/1.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-appointment/ar/1.png')); super.initState(); } diff --git a/lib/pages/ToDoList/ToDo.dart b/lib/pages/ToDoList/ToDo.dart index b635bc52..1e1e81b1 100644 --- a/lib/pages/ToDoList/ToDo.dart +++ b/lib/pages/ToDoList/ToDo.dart @@ -64,9 +64,9 @@ class _ToDoState extends State { super.initState(); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/todo/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/todo/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/todo/ar/0.png')); int endTime = DateTime.now().millisecondsSinceEpoch + 1000 * 30; controller = CountdownTimerController(endTime: endTime); } diff --git a/lib/pages/insurance/insurance_approval_screen.dart b/lib/pages/insurance/insurance_approval_screen.dart index d81e704e..4566b082 100644 --- a/lib/pages/insurance/insurance_approval_screen.dart +++ b/lib/pages/insurance/insurance_approval_screen.dart @@ -26,14 +26,14 @@ class _InsuranceApprovalState extends State { Widget build(BuildContext context) { imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/apporvals/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/apporvals/ar/0.png')); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/en/1.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/apporvals/en/1.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/apporvals/ar/1.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/apporvals/ar/1.png')); return BaseView( onModelReady: widget.appointmentNo != null ? (model) => diff --git a/lib/pages/insurance/insurance_card_screen.dart b/lib/pages/insurance/insurance_card_screen.dart index 42efc179..da59e414 100644 --- a/lib/pages/insurance/insurance_card_screen.dart +++ b/lib/pages/insurance/insurance_card_screen.dart @@ -34,9 +34,9 @@ class _InsuranceCardState extends State { Widget build(BuildContext context) { imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/insurance-card/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/insurance-card/ar/0.png')); return BaseView( onModelReady: (model) => model.getInsurance(), diff --git a/lib/pages/insurance/insurance_update_screen.dart b/lib/pages/insurance/insurance_update_screen.dart index 36b424a8..c26a3bf3 100644 --- a/lib/pages/insurance/insurance_update_screen.dart +++ b/lib/pages/insurance/insurance_update_screen.dart @@ -32,7 +32,7 @@ class _InsuranceUpdateState extends State super.initState(); _tabController = TabController(length: 2, vsync: this); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/insurance-card/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/insurance-card/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/insurance-card/ar/0.png')); } void dispose() { diff --git a/lib/pages/medical/allergies_page.dart b/lib/pages/medical/allergies_page.dart index 459ef0f8..4a3e5872 100644 --- a/lib/pages/medical/allergies_page.dart +++ b/lib/pages/medical/allergies_page.dart @@ -11,7 +11,7 @@ class AllergiesPage extends StatelessWidget { List imagesInfo = List(); @override Widget build(BuildContext context) { - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/alllergies/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/alllergies/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/alllergies/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/alllergies/ar/0.png')); return BaseView( onModelReady: (model) => model.getAllergies(), builder: (_, model, w) => AppScaffold( diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 7f0f799a..9958d6a5 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -58,9 +58,9 @@ class _AdvancePaymentPageState extends State { getAuthUser(); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/advance-payment/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/images-info-home/advance-payment/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/advance-payment/ar/0.png')); } @override diff --git a/lib/pages/medical/balance/my_balance_page.dart b/lib/pages/medical/balance/my_balance_page.dart index 50bb2dea..cdedf786 100644 --- a/lib/pages/medical/balance/my_balance_page.dart +++ b/lib/pages/medical/balance/my_balance_page.dart @@ -18,7 +18,7 @@ class MyBalancePage extends StatelessWidget { @override Widget build(BuildContext context) { - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/my-balance/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/images-info-home/my-balance/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/my-balance/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/images-info-home/my-balance/ar/0.png')); return BaseView( onModelReady: (model) => model.getPatientAdvanceBalanceAmount(), builder: (_, model, w) => AppScaffold( @@ -27,55 +27,26 @@ class MyBalancePage extends StatelessWidget { appBarTitle: TranslationBase.of(context).myBalances, imagesInfo: imagesInfo, description: TranslationBase.of(context).infoMyBalance, - body: Container( - margin: EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Texts( - TranslationBase.of(context).balanceAmount, - color: Colors.black, - bold: true, - ), - SizedBox( - height: 15, - ), - Container( - padding: EdgeInsets.all(8), - width: double.infinity, - height: 65, - decoration: BoxDecoration( - color: Theme.of(context).primaryColor, - shape: BoxShape.rectangle, - borderRadius: BorderRadius.circular(7), + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + TranslationBase.of(context).balanceAmount, + color: Colors.black, + bold: true, ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - - Texts( - '${model.totalAdvanceBalanceAmount ?? 0} '+ TranslationBase.of(context).sar, - color: Colors.white, - bold: true, - ), - Texts( - TranslationBase.of(context).totalBalance, - color: Colors.white, - ), - ], + SizedBox( + height: 15, ), - ), - SizedBox( - height: 9, - ), - ...List.generate( - model.patientAdvanceBalanceAmountList.length, - (index) => Container( + Container( padding: EdgeInsets.all(8), + width: double.infinity, height: 65, - margin: EdgeInsets.only(top: 8), decoration: BoxDecoration( - color: Colors.white, + color: Theme.of(context).primaryColor, shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(7), ), @@ -84,20 +55,53 @@ class MyBalancePage extends StatelessWidget { children: [ Texts( - '${model.patientAdvanceBalanceAmountList[index].patientAdvanceBalanceAmount} '+TranslationBase.of(context).sar, + '${model.totalAdvanceBalanceAmount ?? 0} '+ TranslationBase.of(context).sar, + color: Colors.white, bold: true, ), - Texts(model.patientAdvanceBalanceAmountList[index] - .projectDescription), + Texts( + TranslationBase.of(context).totalBalance, + color: Colors.white, + ), ], ), ), - ), - ], + SizedBox( + height: 9, + ), + ...List.generate( + model.patientAdvanceBalanceAmountList.length, + (index) => Container( + padding: EdgeInsets.all(8), + height: 65, + margin: EdgeInsets.only(top: 8), + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.rectangle, + borderRadius: BorderRadius.circular(7), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + + Texts( + '${model.patientAdvanceBalanceAmountList[index].patientAdvanceBalanceAmount} '+TranslationBase.of(context).sar, + bold: true, + ), + Texts(model.patientAdvanceBalanceAmountList[index] + .projectDescription), + ], + ), + ), + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.13 ,) + ], + ), ), ), bottomSheet: Container( - height: MediaQuery.of(context).size.height * 0.1, + height: MediaQuery.of(context).size.height * 0.12, + color: Colors.white, width: double.infinity, padding: EdgeInsets.all(12), child: SecondaryButton( diff --git a/lib/pages/medical/doctor/doctor_home_page.dart b/lib/pages/medical/doctor/doctor_home_page.dart index 6a03b58b..7a01eced 100644 --- a/lib/pages/medical/doctor/doctor_home_page.dart +++ b/lib/pages/medical/doctor/doctor_home_page.dart @@ -19,8 +19,8 @@ class DoctorHomePage extends StatelessWidget { List imagesInfo = List(); @override Widget build(BuildContext context) { - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-doctor/ar/1.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-doctor/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-doctor/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-doctor/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-doctor/ar/1.png')); return BaseView( onModelReady: (model) => model.getMyDoctor(), builder: (context, MyDoctorViewModel model, widget) => AppScaffold( @@ -48,7 +48,7 @@ class DoctorHomePage extends StatelessWidget { leading: Radio( value: FilterType.Clinic, groupValue: model.filterType, - activeColor: Colors.red[800], + activeColor:Theme.of(context).primaryColor, onChanged: (FilterType value) { model.setFilterType(value); }, @@ -65,7 +65,7 @@ class DoctorHomePage extends StatelessWidget { leading: Radio( value: FilterType.Hospital, groupValue: model.filterType, - activeColor: Colors.red[800], + activeColor: Theme.of(context).primaryColor, onChanged: (FilterType value) => model.setFilterType(value), ), diff --git a/lib/pages/medical/labs/labs_home_page.dart b/lib/pages/medical/labs/labs_home_page.dart index 96356a0f..5d23fe65 100644 --- a/lib/pages/medical/labs/labs_home_page.dart +++ b/lib/pages/medical/labs/labs_home_page.dart @@ -21,7 +21,7 @@ class LabsHomePage extends StatelessWidget { @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-lab/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-lab/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-lab/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-lab/ar/0.png')); return BaseView( onModelReady: (model) => model.getLabs(), builder: (context, LabsViewModel model, widget) => AppScaffold( diff --git a/lib/pages/medical/patient_sick_leave_page.dart b/lib/pages/medical/patient_sick_leave_page.dart index 900c9666..debc4f42 100644 --- a/lib/pages/medical/patient_sick_leave_page.dart +++ b/lib/pages/medical/patient_sick_leave_page.dart @@ -23,8 +23,8 @@ class _PatientSickLeavePageState extends State { @override void initState() { imagesInfo.add(ImagesInfo( - imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/en/0.png', - imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/sick-leaves/ar/0.png')); + imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/sick-leaves/en/0.png', + imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/sick-leaves/ar/0.png')); super.initState(); } diff --git a/lib/pages/medical/prescriptions/prescriptions_home_page.dart b/lib/pages/medical/prescriptions/prescriptions_home_page.dart index b13933c6..695e3400 100644 --- a/lib/pages/medical/prescriptions/prescriptions_home_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_home_page.dart @@ -25,8 +25,8 @@ class _HomePrescriptionsPageState extends State void initState() { super.initState(); _tabController = TabController(length: 2, vsync: this); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-prescriptions/ar/1.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-prescriptions/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-prescriptions/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-prescriptions/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-prescriptions/ar/1.png')); } @override diff --git a/lib/pages/medical/radiology/radiology_home_page.dart b/lib/pages/medical/radiology/radiology_home_page.dart index 80479a36..70304876 100644 --- a/lib/pages/medical/radiology/radiology_home_page.dart +++ b/lib/pages/medical/radiology/radiology_home_page.dart @@ -19,8 +19,8 @@ class RadiologyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-radiology/ar/1.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-radiology/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-radiology/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-radiology/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-radiology/ar/1.png')); return BaseView( onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, widget) => AppScaffold( diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 1e360760..7a367a32 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -39,19 +39,19 @@ class _HomeReportPageState extends State Widget build(BuildContext context) { imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/0.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/en/0.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/0.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/ar/0.png')); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/1.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/en/1.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/1.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/ar/1.png')); imagesInfo.add(ImagesInfo( imageEn: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/en/2.png', + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/en/2.png', imageAr: - 'https://hmgwebservices.com/Images/MobileApp/imges-info/medical-reorts/ar/2.png')); + 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/ar/2.png')); return BaseView( onModelReady: (model) => model.getReports(), //model.getPrescriptions(), builder: (_, model, widget) => AppScaffold( 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 b1c6df76..619c805f 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -24,8 +24,8 @@ class VitalSignDetailsScreen extends StatelessWidget { @override Widget build(BuildContext context) { - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/ar/0.png')); - imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileApp/imges-info/my-vital-signs/ar/1.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-vital-signs/en/0.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-vital-signs/ar/0.png')); + imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-vital-signs/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-vital-signs/ar/1.png')); return BaseView( onModelReady: appointmentNo != null && projectID != null ? (model) => model.getPatientRadOrders( diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index c6cbe23b..0fe387e8 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -57,7 +57,7 @@ class DoctorCard extends StatelessWidget { height: date == null ? projectViewModel.isArabic? 185 :100 : 180, decoration: BoxDecoration( color: !isInOutPatient - ? Colors.red[900] + ? Color(0xff404545) : Theme.of(context).primaryColor, borderRadius: BorderRadius.only( topLeft: projectViewModel.isArabic From 827768e96d0d08de8bca1848d7be97ffd21ae502 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Mon, 28 Dec 2020 12:50:05 +0300 Subject: [PATCH 21/34] language change --- lib/pages/settings/profile_setting.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/settings/profile_setting.dart b/lib/pages/settings/profile_setting.dart index c0a3dafd..e5c2c582 100644 --- a/lib/pages/settings/profile_setting.dart +++ b/lib/pages/settings/profile_setting.dart @@ -211,7 +211,7 @@ class _ProfileSettings extends State children: [ Expanded( child: DefaultButton( - TranslationBase.of(context).submit, + TranslationBase.of(context).save, () { saveSettings(); }, From 754e60eb72160d56a7a20bd3e639945266f14834 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 28 Dec 2020 13:16:59 +0200 Subject: [PATCH 22/34] fix send email lab result --- lib/config/config.dart | 8 ++++---- lib/core/service/medical/labs_service.dart | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 9524e019..f1178f6e 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,8 +6,8 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -// const BASE_URL = 'https://uat.hmgwebservices.com/'; -const BASE_URL = 'https://hmgwebservices.com/'; +//const BASE_URL = 'https://uat.hmgwebservices.com/'; + const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; //weather @@ -36,8 +36,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 SEND_LAB_RESULT_EMAIL = 'Services/Notifications.svc/REST/SendLabReportEmail'; const GET_Patient_LAB_RESULT = 'Services/Patients.svc/REST/GetPatientLabResults'; const GET_Patient_LAB_ORDERS_RESULT = diff --git a/lib/core/service/medical/labs_service.dart b/lib/core/service/medical/labs_service.dart index 92914964..c48448d1 100644 --- a/lib/core/service/medical/labs_service.dart +++ b/lib/core/service/medical/labs_service.dart @@ -110,17 +110,17 @@ class LabsService extends BaseService { _requestSendLabReportEmail.invoiceNo = patientLabOrder.invoiceNo; _requestSendLabReportEmail.doctorName = patientLabOrder.doctorName; _requestSendLabReportEmail.clinicName = patientLabOrder.clinicDescription; - _requestSendLabReportEmail.patientName = user.firstName + user.lastName; + _requestSendLabReportEmail.patientName = user.firstName +" "+ user.lastName; _requestSendLabReportEmail.patientIditificationNum = user.patientIdentificationNo; _requestSendLabReportEmail.dateofBirth = user.dateofBirth; _requestSendLabReportEmail.to = user.emailAddress; - _requestSendLabReportEmail.orderDate = - '${patientLabOrder.orderDate.year}-${patientLabOrder.orderDate.month}-${patientLabOrder.orderDate.day}'; + _requestSendLabReportEmail.orderDate = '${patientLabOrder.orderDate.year}-${patientLabOrder.orderDate.month}-${patientLabOrder.orderDate.day}'; _requestSendLabReportEmail.patientMobileNumber = user.mobileNumber; _requestSendLabReportEmail.projectName = patientLabOrder.projectName; + // _requestSendLabReportEmail.setupID = "010266"; - await baseAppClient.post(GET_Patient_LAB_SPECIAL_RESULT, + await baseAppClient.post(SEND_LAB_RESULT_EMAIL, onSuccess: (dynamic response, int statusCode) { }, onFailure: (String error, int statusCode) { From 5e3f6363cf8d76a8601c23c3378253b7528e6891 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Mon, 28 Dec 2020 18:04:23 +0200 Subject: [PATCH 23/34] fix issues --- lib/config/config.dart | 4 ++-- lib/pages/landing/landing_page.dart | 2 +- lib/pages/medical/prescriptions/prescriptions_page.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index f1178f6e..f402afd1 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,8 +6,8 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -//const BASE_URL = 'https://uat.hmgwebservices.com/'; - const BASE_URL = 'https://hmgwebservices.com/'; +// const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; //weather diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 68eee783..a36df1c0 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -143,7 +143,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { _firebaseMessaging.setAutoInitEnabled(true); locationUtils = - new LocationUtils(isShowConfirmDialog: true, context: context); + new LocationUtils(isShowConfirmDialog: false, context: context); WidgetsBinding.instance .addPostFrameCallback((_) => locationUtils.getCurrentLocation()); diff --git a/lib/pages/medical/prescriptions/prescriptions_page.dart b/lib/pages/medical/prescriptions/prescriptions_page.dart index 5f16b422..ee5fc453 100644 --- a/lib/pages/medical/prescriptions/prescriptions_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_page.dart @@ -92,7 +92,7 @@ class PrescriptionsPage extends StatelessWidget { rat: prescriptions.actualDoctorRate.toDouble(), subName: prescriptions.name, isInOutPatient: prescriptions.isInOutPatient, - date:projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr(prescriptions.dischargeDate):DateUtil.getMonthDayYearDateFormatted(prescriptions.dischargeDate), + date:projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr( DateUtil.convertStringToDate(prescriptions.appointmentDate) ):DateUtil.getMonthDayYearDateFormatted(DateUtil.convertStringToDate(prescriptions.appointmentDate)), ), ); }).toList(), From 519a474d414781f07d49ee646db41853edb1a8a0 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Tue, 29 Dec 2020 16:50:18 +0200 Subject: [PATCH 24/34] fix live care label and vital sign data --- lib/config/localized_values.dart | 4 + lib/core/model/labs/patient_lab_orders.dart | 6 +- .../model/prescriptions/Prescriptions.dart | 5 +- lib/core/model/radiology/final_radiology.dart | 5 +- lib/core/model/sick_leave/sick_leave.dart | 4 +- .../medical/vital_sign_view_model.dart | 46 +++- .../AppoimentAllHistoryResultList.dart | 3 + .../widgets/AppointmentCardView.dart | 241 +++++++++++------- lib/pages/medical/labs/labs_home_page.dart | 1 + .../medical/patient_sick_leave_page.dart | 1 + .../prescriptions_history_details_page.dart | 4 +- .../prescriptions/prescriptions_page.dart | 3 +- .../radiology/radiology_home_page.dart | 1 + .../vital_sign/vital_sign_details_screen.dart | 42 +-- lib/uitl/translations_delegate_base.dart | 1 + .../data_display/medical/doctor_card.dart | 50 ++-- 16 files changed, 260 insertions(+), 157 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index 103fe51e..1bb96d84 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1287,4 +1287,8 @@ const Map localizedValues = { "en": "If you have a card / Document Scan now", "ar": "إذا كانت لديك بطاقة / مستند ارفقها الان" }, + "liveCare": { + "en": "Live Care", + "ar": "لايف كير" + }, }; diff --git a/lib/core/model/labs/patient_lab_orders.dart b/lib/core/model/labs/patient_lab_orders.dart index 26daaff0..3c49b80a 100644 --- a/lib/core/model/labs/patient_lab_orders.dart +++ b/lib/core/model/labs/patient_lab_orders.dart @@ -34,7 +34,7 @@ class PatientLabOrders { String qR; String setupID; List speciality; - + bool isLiveCareAppointment; PatientLabOrders( {this.actualDoctorRate, this.clinicDescription, @@ -68,7 +68,7 @@ class PatientLabOrders { this.projectNameN, this.qR, this.setupID, - this.speciality}); + this.speciality,this.isLiveCareAppointment}); PatientLabOrders.fromJson(Map json) { actualDoctorRate = json['ActualDoctorRate']; @@ -103,6 +103,7 @@ class PatientLabOrders { projectNameN = json['ProjectNameN']; qR = json['QR']; setupID = json['SetupID']; + isLiveCareAppointment = json['IsLiveCareAppointment']; // speciality = json['Speciality'].cast(); } @@ -141,6 +142,7 @@ class PatientLabOrders { data['QR'] = this.qR; data['SetupID'] = this.setupID; data['Speciality'] = this.speciality; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; return data; } } diff --git a/lib/core/model/prescriptions/Prescriptions.dart b/lib/core/model/prescriptions/Prescriptions.dart index 1362f1c2..0169010f 100644 --- a/lib/core/model/prescriptions/Prescriptions.dart +++ b/lib/core/model/prescriptions/Prescriptions.dart @@ -27,6 +27,7 @@ class Prescriptions { bool isDoctorAllowVedioCall; bool isExecludeDoctor; bool isInOutPatient; + bool isLiveCareAppointment; String isInOutPatientDescription; String isInOutPatientDescriptionN; bool isInsurancePatient; @@ -68,7 +69,7 @@ class Prescriptions { this.nationalityFlagURL, this.noOfPatientsRate, this.qR, - this.speciality}); + this.speciality,this.isLiveCareAppointment}); Prescriptions.fromJson(Map json) { setupID = json['SetupID']; @@ -103,6 +104,7 @@ class Prescriptions { nationalityFlagURL = json['NationalityFlagURL']; noOfPatientsRate = json['NoOfPatientsRate']; qR = json['QR']; + isLiveCareAppointment = json['IsLiveCareAppointment']; // speciality = json['Speciality'].cast(); } @@ -141,6 +143,7 @@ class Prescriptions { data['NoOfPatientsRate'] = this.noOfPatientsRate; data['QR'] = this.qR; data['Speciality'] = this.speciality; + data['IsLiveCareAppointment'] = this.isLiveCareAppointment; return data; } } diff --git a/lib/core/model/radiology/final_radiology.dart b/lib/core/model/radiology/final_radiology.dart index 2efe4481..ed47b51d 100644 --- a/lib/core/model/radiology/final_radiology.dart +++ b/lib/core/model/radiology/final_radiology.dart @@ -41,6 +41,7 @@ class FinalRadiology { List speciality; bool isCVI; bool isRadMedicalReport; + bool isLiveCareAppointment; FinalRadiology( {this.setupID, @@ -82,7 +83,7 @@ class FinalRadiology { this.reportDataTextString, this.speciality, this.isCVI, - this.isRadMedicalReport}); + this.isRadMedicalReport,this.isLiveCareAppointment}); FinalRadiology.fromJson(Map json) { try { @@ -121,11 +122,13 @@ class FinalRadiology { orderNo = json['OrderNo']; projectName = json['ProjectName']; qR = json['QR']; + isLiveCareAppointment = json['IsLiveCareAppointment']; reportDataHTML = json['ReportDataHTML']; reportDataTextString = json['ReportDataTextString']; // speciality = json['Speciality'].cast(); isCVI = json['isCVI']; isRadMedicalReport = json['isRadMedicalReport']; + } catch (e) { print(e); } diff --git a/lib/core/model/sick_leave/sick_leave.dart b/lib/core/model/sick_leave/sick_leave.dart index ff73e1da..6811a552 100644 --- a/lib/core/model/sick_leave/sick_leave.dart +++ b/lib/core/model/sick_leave/sick_leave.dart @@ -32,6 +32,7 @@ class SickLeave { String projectName; String qR; List speciality; + bool isLiveCareAppointment; SickLeave( {this.setupID, @@ -64,7 +65,7 @@ class SickLeave { this.patientName, this.projectName, this.qR, - this.speciality}); + this.speciality,this.isLiveCareAppointment}); SickLeave.fromJson(Map json) { setupID = json['SetupID']; @@ -97,6 +98,7 @@ class SickLeave { patientName = json['PatientName']; projectName = json['ProjectName']; qR = json['QR']; + isLiveCareAppointment = json['IsLiveCareAppointment']; if(json['Speciality']!=null) speciality = json['Speciality'].cast(); } diff --git a/lib/core/viewModels/medical/vital_sign_view_model.dart b/lib/core/viewModels/medical/vital_sign_view_model.dart index f534140f..b2110187 100644 --- a/lib/core/viewModels/medical/vital_sign_view_model.dart +++ b/lib/core/viewModels/medical/vital_sign_view_model.dart @@ -11,7 +11,15 @@ class VitalSignViewModel extends BaseViewModel { List get vitalSignResModelList => _vitalSignService.vitalSignResModelList; - getPatientRadOrders({int appointmentNo, int projectID}) async { + String heightCm = "0"; + String weightKg = "0"; + String bodyMax = "0"; + String temperatureCelcius = "0"; + String hartRat = "0"; + String respirationBeatPerMinute = "0"; + String bloodPressure = "0 / 0"; + + getPatientVitalSign({int appointmentNo, int projectID}) async { setState(ViewState.Busy); if (appointmentNo != null && projectID != null) { @@ -23,7 +31,41 @@ class VitalSignViewModel extends BaseViewModel { if (_vitalSignService.hasError) { error = _vitalSignService.error; setState(ViewState.Error); - } else + } else { + _vitalSignService.vitalSignResModelList.forEach((element) { + if (heightCm == "0" || heightCm == null || heightCm == 'null') { + heightCm = element.heightCm.toString(); + } + if (weightKg == "0" || weightKg == null || weightKg == 'null') { + weightKg = element.weightKg.toString(); + } + if (bodyMax == "0" || + bodyMax == null || + bodyMax == 'null') { + bodyMax = element.bodyMassIndex.toString(); + } + if (temperatureCelcius == "0" || + temperatureCelcius == null || + temperatureCelcius == 'null') { + temperatureCelcius = element.temperatureCelcius.toString(); + } + if (hartRat == "0" || hartRat == null || hartRat == 'null') { + hartRat = element.pulseBeatPerMinute.toString(); + } + if (respirationBeatPerMinute == "0" || + respirationBeatPerMinute == null || + respirationBeatPerMinute == 'null') { + respirationBeatPerMinute = + element.respirationBeatPerMinute.toString(); + } + if (bloodPressure == "0 / 0" || + bloodPressure == null || + bloodPressure == 'null') { + bloodPressure = element.bloodPressure.toString(); + } + }); + setState(ViewState.Idle); + } } } diff --git a/lib/models/Appointments/AppoimentAllHistoryResultList.dart b/lib/models/Appointments/AppoimentAllHistoryResultList.dart index 20eace25..045f759e 100644 --- a/lib/models/Appointments/AppoimentAllHistoryResultList.dart +++ b/lib/models/Appointments/AppoimentAllHistoryResultList.dart @@ -50,6 +50,7 @@ class AppoitmentAllHistoryResultList { bool isExecludeDoctor; int isFollowup; bool isLiveCareAppointment; + bool isInOutPatient; bool isMedicalReportRequested; bool isOnlineCheckedIN; String latitude; @@ -188,6 +189,7 @@ class AppoitmentAllHistoryResultList { isExecludeDoctor = json['IsExecludeDoctor']; isFollowup = json['IsFollowup']; isLiveCareAppointment = json['IsLiveCareAppointment']; + isInOutPatient = json['IsInOutPatient']; isMedicalReportRequested = json['IsMedicalReportRequested']; isOnlineCheckedIN = json['IsOnlineCheckedIN']; latitude = json['Latitude']; @@ -259,6 +261,7 @@ class AppoitmentAllHistoryResultList { data['IsExecludeDoctor'] = this.isExecludeDoctor; data['IsFollowup'] = this.isFollowup; data['IsLiveCareAppointment'] = this.isLiveCareAppointment; + data['IsInOutPatient'] = this.isInOutPatient; data['IsMedicalReportRequested'] = this.isMedicalReportRequested; data['IsOnlineCheckedIN'] = this.isOnlineCheckedIN; data['Latitude'] = this.latitude; diff --git a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart index b3839834..c4299e33 100644 --- a/lib/pages/MyAppointments/widgets/AppointmentCardView.dart +++ b/lib/pages/MyAppointments/widgets/AppointmentCardView.dart @@ -55,110 +55,157 @@ class _ApointmentCardState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ + Container( + width: projectViewModel.isArabic ? 27 : 20, + height: projectViewModel.isArabic ? 165 : 140, + decoration: BoxDecoration( + //Colors.red[900] Color(0xff404545) + color: widget.appo.isLiveCareAppointment + ? Color(0xff404545) + : !widget.appo.isInOutPatient + ? Colors.red[900] + : Theme.of(context).primaryColor, + borderRadius: BorderRadius.only( + topLeft: projectViewModel.isArabic + ? Radius.circular(0) + : Radius.circular(8), + bottomLeft: projectViewModel.isArabic + ? Radius.circular(0) + : Radius.circular(8), + topRight: projectViewModel.isArabic + ? Radius.circular(8) + : Radius.circular(0), + bottomRight: projectViewModel.isArabic + ? Radius.circular(8) + : Radius.circular(0), + ), + ), + child: RotatedBox( + quarterTurns: 3, + child: Center( + child: Text( + widget.appo.isLiveCareAppointment + ? TranslationBase.of(context) + .liveCare + .toUpperCase() + : !widget.appo.isInOutPatient + ? TranslationBase.of(context) + .inPatient + .toUpperCase() + : TranslationBase.of(context) + .outpatient + .toUpperCase(), + style: TextStyle(color: Colors.white), + ), + )), + ), + SizedBox(width: 8,), ClipRRect( borderRadius: BorderRadius.circular(100.0), child: Image.network(widget.appo.doctorImageURL, fit: BoxFit.fill, height: 60.0, width: 60.0), ), - Container( - width: MediaQuery.of(context).size.width * 0.61, - margin: EdgeInsets.fromLTRB(20.0, 10.0, 10.0, 0.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - widget.appo.doctorTitle + - " " + - widget.appo.doctorNameObj, - style: TextStyle( - fontSize: 14.0, - color: Colors.grey[700], - letterSpacing: 1.0)), - Container( - margin: EdgeInsets.only(top: 3.0), - child: Text(widget.appo.clinicName, - style: TextStyle( - fontSize: 12.0, - color: Colors.grey[600], - letterSpacing: 1.0)), - ), - Container( - margin: EdgeInsets.only(top: 3.0), - child: Text(widget.appo.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( - DateUtil.getWeekDayMonthDayYearDateFormatted( - DateUtil.convertStringToDate( - widget.appo.appointmentDate), - projectViewModel.isArabic ? "ar" : "en") - .trim(), + Expanded( + child: Container( + width: MediaQuery.of(context).size.width * 0.61, + margin: EdgeInsets.fromLTRB(20.0, 10.0, 10.0, 0.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + widget.appo.doctorTitle + + " " + + widget.appo.doctorNameObj, 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: - widget.appo.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( - transform: - Matrix4.translationValues(15.0, -40.0, 0.0), - child: projectViewModel.isArabic - ? Image.asset( - "assets/images/new-design/arrow_menu_black-ar.png", - width: 25.0, - height: 25.0) - : Image.asset( - "assets/images/new-design/arrow_menu_black-en.png", - width: 25.0, - height: 25.0), - ), - ], - ), - (widget.appo.patientStatusType == AppointmentType.BOOKED || - widget.appo.patientStatusType == - AppointmentType.CONFIRMED) - ? Container( - child: CountdownTimer( - controller: new CountdownTimerController( - endTime: - DateTime.now().millisecondsSinceEpoch + - (widget.appo.remaniningHoursTocanPay * - 1000) * - 60), - widgetBuilder: (_, CurrentRemainingTime time) { - return time != null - ? Text( - '${time.days}:${time.hours}:${time.min}:${time.sec} ' + - TranslationBase.of(context) - .upcomingTimeLeft, - style: TextStyle( - fontSize: 12.0, - color: Color(0xff40ACC9))) - : Container(); - }, - ), - ) - : Container(), - ], + Container( + margin: EdgeInsets.only(top: 3.0), + child: Text(widget.appo.clinicName, + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + Container( + margin: EdgeInsets.only(top: 3.0), + child: Text(widget.appo.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( + DateUtil.getWeekDayMonthDayYearDateFormatted( + DateUtil.convertStringToDate( + widget.appo.appointmentDate), + projectViewModel.isArabic ? "ar" : "en") + .trim(), + style: TextStyle( + fontSize: 12.0, + color: Colors.grey[600], + letterSpacing: 1.0)), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + RatingBar.readOnly( + initialRating: + widget.appo.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( + transform: + Matrix4.translationValues(15.0, -40.0, 0.0), + child: projectViewModel.isArabic + ? Image.asset( + "assets/images/new-design/arrow_menu_black-ar.png", + width: 25.0, + height: 25.0) + : Image.asset( + "assets/images/new-design/arrow_menu_black-en.png", + width: 25.0, + height: 25.0), + ), + ], + ), + (widget.appo.patientStatusType == AppointmentType.BOOKED || + widget.appo.patientStatusType == + AppointmentType.CONFIRMED) + ? Container( + child: CountdownTimer( + controller: new CountdownTimerController( + endTime: + DateTime.now().millisecondsSinceEpoch + + (widget.appo.remaniningHoursTocanPay * + 1000) * + 60), + widgetBuilder: (_, CurrentRemainingTime time) { + return time != null + ? Text( + '${time.days}:${time.hours}:${time.min}:${time.sec} ' + + TranslationBase.of(context) + .upcomingTimeLeft, + style: TextStyle( + fontSize: 12.0, + color: Color(0xff40ACC9))) + : Container(); + }, + ), + ) + : Container(), + ], + ), ), ), ], diff --git a/lib/pages/medical/labs/labs_home_page.dart b/lib/pages/medical/labs/labs_home_page.dart index 5d23fe65..0b3695a0 100644 --- a/lib/pages/medical/labs/labs_home_page.dart +++ b/lib/pages/medical/labs/labs_home_page.dart @@ -97,6 +97,7 @@ class LabsHomePage extends StatelessWidget { billNo: ' ${labOrder.invoiceNo}', profileUrl: labOrder.doctorImageURL, subName: labOrder.projectName, + isLiveCareAppointment: labOrder.isLiveCareAppointment, date: projectViewModel.isArabic?DateUtil.getMonthDayYearDateFormattedAr(labOrder.orderDate):DateUtil.getMonthDayYearDateFormatted(labOrder.orderDate), ); }).toList(), diff --git a/lib/pages/medical/patient_sick_leave_page.dart b/lib/pages/medical/patient_sick_leave_page.dart index debc4f42..f09b8832 100644 --- a/lib/pages/medical/patient_sick_leave_page.dart +++ b/lib/pages/medical/patient_sick_leave_page.dart @@ -45,6 +45,7 @@ class _PatientSickLeavePageState extends State { child: ListView.builder( itemCount: model.sickLeaveList.length, itemBuilder: (context, index) => DoctorCard( + isLiveCareAppointment: model.sickLeaveList[index].isLiveCareAppointment, name: model.sickLeaveList[index].doctorName, date:projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr(model.sickLeaveList[index].requestDate):DateUtil.getMonthDayYearDateFormatted(model.sickLeaveList[index].requestDate), profileUrl: model.sickLeaveList[index].doctorImageURL, diff --git a/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart b/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart index 22896dad..30bfa13e 100644 --- a/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_history_details_page.dart @@ -24,7 +24,6 @@ class PrescriptionsHistoryDetailsPage extends StatelessWidget { appBarTitle: TranslationBase.of(context).orderDetails, baseViewModel: model, body: SingleChildScrollView( - physics: BouncingScrollPhysics(), child: Container( margin: EdgeInsets.all(15.0), child: Column( @@ -118,7 +117,8 @@ class PrescriptionsHistoryDetailsPage extends StatelessWidget { ], ), ), - ) + ), + SizedBox(height: 120,) ], ), ), diff --git a/lib/pages/medical/prescriptions/prescriptions_page.dart b/lib/pages/medical/prescriptions/prescriptions_page.dart index ee5fc453..79c7b7ff 100644 --- a/lib/pages/medical/prescriptions/prescriptions_page.dart +++ b/lib/pages/medical/prescriptions/prescriptions_page.dart @@ -91,7 +91,8 @@ class PrescriptionsPage extends StatelessWidget { profileUrl: prescriptions.doctorImageURL, rat: prescriptions.actualDoctorRate.toDouble(), subName: prescriptions.name, - isInOutPatient: prescriptions.isInOutPatient, + isInOutPatient: prescriptions.isInOutPatient, + isLiveCareAppointment: prescriptions.isLiveCareAppointment, date:projectViewModel.isArabic? DateUtil.getMonthDayYearDateFormattedAr( DateUtil.convertStringToDate(prescriptions.appointmentDate) ):DateUtil.getMonthDayYearDateFormatted(DateUtil.convertStringToDate(prescriptions.appointmentDate)), ), ); diff --git a/lib/pages/medical/radiology/radiology_home_page.dart b/lib/pages/medical/radiology/radiology_home_page.dart index 70304876..b1b82f93 100644 --- a/lib/pages/medical/radiology/radiology_home_page.dart +++ b/lib/pages/medical/radiology/radiology_home_page.dart @@ -94,6 +94,7 @@ class RadiologyHomePage extends StatelessWidget { ), child: DoctorCard( isInOutPatient: radiology.isInOutPatient, + isLiveCareAppointment: radiology.isLiveCareAppointment, name: radiology.doctorName, profileUrl: radiology.doctorImageURL, billNo: '${radiology.invoiceNo}', 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 619c805f..18b1ca08 100644 --- a/lib/pages/medical/vital_sign/vital_sign_details_screen.dart +++ b/lib/pages/medical/vital_sign/vital_sign_details_screen.dart @@ -28,9 +28,9 @@ class VitalSignDetailsScreen extends StatelessWidget { imagesInfo.add(ImagesInfo(imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-vital-signs/en/1.png',imageAr: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/my-vital-signs/ar/1.png')); return BaseView( onModelReady: appointmentNo != null && projectID != null - ? (model) => model.getPatientRadOrders( + ? (model) => model.getPatientVitalSign( appointmentNo: appointmentNo, projectID: projectID) - : (model) => model.getPatientRadOrders(), + : (model) => model.getPatientVitalSign(), builder: (_, mode, widget) => AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).vitalSigns, @@ -58,11 +58,7 @@ class VitalSignDetailsScreen extends StatelessWidget { child: VitalSignItem( des: TranslationBase.of(context).height, icon: DQIcons.height, - lastVal: mode - .vitalSignResModelList[ - mode.vitalSignResModelList.length - 1] - .heightCm - .toString(), + lastVal: mode.heightCm, unit: TranslationBase.of(context).cm, ), ), @@ -82,11 +78,7 @@ class VitalSignDetailsScreen extends StatelessWidget { des: TranslationBase.of(context).weight, icon: DQIcons.weight_scale, unit: TranslationBase.of(context).kg, - lastVal: mode - .vitalSignResModelList[ - mode.vitalSignResModelList.length - 1] - .weightKg - .toString(), + lastVal: mode.weightKg, ), ), ], @@ -108,9 +100,7 @@ class VitalSignDetailsScreen extends StatelessWidget { child: VitalSignItem( des: TranslationBase.of(context).body, icon: DQIcons.bmi, - lastVal: mode - .vitalSignResModelList[ mode.vitalSignResModelList.length - 1].pulseBeatPerMinute - .toString(), + lastVal: mode.bodyMax, unit: TranslationBase.of(context).mass, ), ), @@ -130,9 +120,7 @@ class VitalSignDetailsScreen extends StatelessWidget { child: VitalSignItem( des: TranslationBase.of(context).temperature, icon: DQIcons.thermometer, - lastVal: mode - .vitalSignResModelList[ mode.vitalSignResModelList.length - 1].temperatureCelcius - .toString(), + lastVal: mode.temperatureCelcius, unit: TranslationBase.of(context).tempC, ), ), @@ -155,11 +143,7 @@ class VitalSignDetailsScreen extends StatelessWidget { child: VitalSignItem( des: TranslationBase.of(context).heart, icon: DQIcons.heart, - lastVal: mode - .vitalSignResModelList[ - mode.vitalSignResModelList.length - 1] - .pulseBeatPerMinute - .toString(), + lastVal: mode.hartRat, unit: TranslationBase.of(context).bpm, ), ), @@ -178,11 +162,7 @@ class VitalSignDetailsScreen extends StatelessWidget { child: VitalSignItem( des: TranslationBase.of(context).respirationRate, icon: DQIcons.outline, - lastVal: mode - .vitalSignResModelList[ - mode.vitalSignResModelList.length - 1] - .respirationBeatPerMinute - .toString(), + lastVal: mode.respirationBeatPerMinute, unit: TranslationBase.of(context).respirationSigns, ), ), @@ -205,11 +185,7 @@ class VitalSignDetailsScreen extends StatelessWidget { child: VitalSignItem( des: TranslationBase.of(context).bloodPressure, icon: DQIcons.blood_pressure, - lastVal: mode - .vitalSignResModelList[ - mode.vitalSignResModelList.length - 1] - .bloodPressure - .toString(), + lastVal: mode.bloodPressure, unit: TranslationBase.of(context).sysDias, ), ), diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 2cbee1df..1f1a7172 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -883,6 +883,7 @@ class TranslationBase { String get range => localizedValues['range'][locale.languageCode]; String get outpatient => localizedValues['out-patient'][locale.languageCode]; String get inPatient => localizedValues['in-patient'][locale.languageCode]; + String get liveCare => localizedValues['liveCare'][locale.languageCode]; String get report => localizedValues['report'][locale.languageCode]; String get openRad => localizedValues['open-rad'][locale.languageCode]; String get sendCopyRad => localizedValues['send-copy'][locale.languageCode]; diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index 0fe387e8..0e0b27ae 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -19,6 +19,7 @@ class DoctorCard extends StatelessWidget { final Function onTap; final Function onEmailTap; final bool isInOutPatient; + final bool isLiveCareAppointment; DoctorCard( {this.name, @@ -29,7 +30,8 @@ class DoctorCard extends StatelessWidget { this.billNo, this.onTap, this.onEmailTap, - this.isInOutPatient}); + this.isInOutPatient, + this.isLiveCareAppointment = false}); @override Widget build(BuildContext context) { @@ -53,12 +55,19 @@ class DoctorCard extends StatelessWidget { Row( children: [ Container( - width:projectViewModel.isArabic? 27:20, - height: date == null ? projectViewModel.isArabic? 185 :100 : 180, + width: projectViewModel.isArabic ? 27 : 20, + height: date == null + ? projectViewModel.isArabic + ? 185 + : 100 + : 180, decoration: BoxDecoration( - color: !isInOutPatient + //Colors.red[900] Color(0xff404545) + color: isLiveCareAppointment ? Color(0xff404545) - : Theme.of(context).primaryColor, + : !isInOutPatient + ? Colors.red[900] + : Theme.of(context).primaryColor, borderRadius: BorderRadius.only( topLeft: projectViewModel.isArabic ? Radius.circular(0) @@ -66,21 +75,29 @@ class DoctorCard extends StatelessWidget { bottomLeft: projectViewModel.isArabic ? Radius.circular(0) : Radius.circular(8), - topRight: projectViewModel.isArabic? Radius.circular(8):Radius.circular(0), - bottomRight: projectViewModel.isArabic? Radius.circular(8):Radius.circular(0), + topRight: projectViewModel.isArabic + ? Radius.circular(8) + : Radius.circular(0), + bottomRight: projectViewModel.isArabic + ? Radius.circular(8) + : Radius.circular(0), ), ), child: RotatedBox( quarterTurns: 3, child: Center( child: Text( - !isInOutPatient + isLiveCareAppointment ? TranslationBase.of(context) - .inPatient + .liveCare .toUpperCase() - : TranslationBase.of(context) - .outpatient - .toUpperCase(), + : !isInOutPatient + ? TranslationBase.of(context) + .inPatient + .toUpperCase() + : TranslationBase.of(context) + .outpatient + .toUpperCase(), style: TextStyle(color: Colors.white), ), )), @@ -96,7 +113,7 @@ class DoctorCard extends StatelessWidget { Expanded( flex: 1, child: LargeAvatar( - name:name, + name: name, url: profileUrl, ), ), @@ -108,23 +125,22 @@ class DoctorCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Texts( - TranslationBase.of(context).dr+" "+ name, + TranslationBase.of(context).dr + + " " + + name, bold: true, ), Texts( subName, - ), if (billNo != null) Row( children: [ Texts( '${TranslationBase.of(context).billNo}: ', - ), Texts( billNo, - ) ], ), From 4263672f003136a85c41cf32c3a58dabfa5dc899 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 30 Dec 2020 12:38:31 +0200 Subject: [PATCH 25/34] fim last vital sign data --- lib/core/service/medical/labs_service.dart | 2 +- lib/core/service/medical/vital_sign_service.dart | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/core/service/medical/labs_service.dart b/lib/core/service/medical/labs_service.dart index c48448d1..11592956 100644 --- a/lib/core/service/medical/labs_service.dart +++ b/lib/core/service/medical/labs_service.dart @@ -118,7 +118,7 @@ class LabsService extends BaseService { _requestSendLabReportEmail.orderDate = '${patientLabOrder.orderDate.year}-${patientLabOrder.orderDate.month}-${patientLabOrder.orderDate.day}'; _requestSendLabReportEmail.patientMobileNumber = user.mobileNumber; _requestSendLabReportEmail.projectName = patientLabOrder.projectName; - // _requestSendLabReportEmail.setupID = "010266"; + _requestSendLabReportEmail.setupID = user.setupID; await baseAppClient.post(SEND_LAB_RESULT_EMAIL, onSuccess: (dynamic response, int statusCode) { diff --git a/lib/core/service/medical/vital_sign_service.dart b/lib/core/service/medical/vital_sign_service.dart index f8a6b356..d1fbbf1c 100644 --- a/lib/core/service/medical/vital_sign_service.dart +++ b/lib/core/service/medical/vital_sign_service.dart @@ -24,9 +24,17 @@ class VitalSignService extends BaseService { response['List_DoctorPatientVitalSign'].forEach((vital) { vitalSignResModelList.add(VitalSignResModel.fromJson(vital)); }); + bool isHaveWeight = false; + bool isHaveHeight = false; vitalSignResModelList.forEach((element) { - weightKg = '${element.weightKg}'; - heightCm = '${element.heightCm}'; + if (element.weightKg != 0 && !isHaveWeight) { + weightKg = '${element.weightKg}'; + isHaveWeight = true; + } + if (element.heightCm != 0 && !isHaveHeight) { + heightCm = '${element.heightCm}'; + isHaveHeight = true; + } }); }, onFailure: (String error, int statusCode) { hasError = true; From 016dffcb873dcbb86241c33f95dc372cd7a022ab Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Wed, 30 Dec 2020 15:39:03 +0300 Subject: [PATCH 26/34] change --- lib/config/config.dart | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 9524e019..da08f83d 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,8 +6,8 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -// const BASE_URL = 'https://uat.hmgwebservices.com/'; -const BASE_URL = 'https://hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; +//const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; //weather @@ -270,9 +270,10 @@ const GET_PAtIENTS_INSURANCE_UPDATED = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceCardUpdateHistory"; const INSURANCE_DETAILS = "Services/Patients.svc/REST/Get_InsuranceCheckList"; -const GET_PATIENT_INSURANCE_DETAILS = "Services/Patients.svc/REST/PatientER_GetPatientInsuranceDetails"; -const UPLOAD_INSURANCE_CARD = 'Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate'; - +const GET_PATIENT_INSURANCE_DETAILS = + "Services/Patients.svc/REST/PatientER_GetPatientInsuranceDetails"; +const UPLOAD_INSURANCE_CARD = + 'Services/Patients.svc/REST/PatientER_PatientInfoForInsuranceCardUpdate'; const GET_VACCINES = "Services/Patients.svc/REST/GetDoneVaccinesByPatientID"; const GET_VACCINES_EMAIL = "Services/Notifications.svc/REST/SendVaccinesEmail"; From c01246acf0810628170e2aaed946561b44ddd6f2 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Wed, 30 Dec 2020 20:29:57 +0300 Subject: [PATCH 27/34] hot fix --- lib/config/config.dart | 10 +- lib/pages/DrawerPages/family/my-family.dart | 3 +- lib/pages/login/confirm-login.dart | 265 +++++++++++--------- lib/widgets/drawer/app_drawer_widget.dart | 2 + 4 files changed, 151 insertions(+), 129 deletions(-) diff --git a/lib/config/config.dart b/lib/config/config.dart index 06cf1213..d981b062 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -6,8 +6,8 @@ import 'package:diplomaticquarterapp/widgets/mobile-no/mobile_no.dart'; const MAX_SMALL_SCREEN = 660; -const BASE_URL = 'https://uat.hmgwebservices.com/'; -//const BASE_URL = 'https://hmgwebservices.com/'; +// const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; //weather @@ -36,8 +36,10 @@ 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 SEND_LAB_RESULT_EMAIL = 'Services/Notifications.svc/REST/SendLabReportEmail'; +const GET_Patient_LAB_SPECIAL_RESULT = + 'Services/Patients.svc/REST/GetPatientLabSpecialResults'; +const SEND_LAB_RESULT_EMAIL = + 'Services/Notifications.svc/REST/SendLabReportEmail'; const GET_Patient_LAB_RESULT = 'Services/Patients.svc/REST/GetPatientLabResults'; const GET_Patient_LAB_ORDERS_RESULT = diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 485e897c..84ecb516 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -725,7 +725,8 @@ class _MyFamily extends State with TickerProviderStateMixin { this.sharedPref.setObject(LOGIN_TOKEN_ID, result.logInTokenID); this.sharedPref.setString(TOKEN, result.authenticationTokenID); await authenticatedUserObject.getUser(getUser: true); - + Provider.of(context, listen: false).user = + authenticatedUserObject.user; Provider.of(context, listen: false) .setUser(authenticatedUserObject.user); appointmentRateViewModel diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index 37ce9bc2..4b37fb29 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -103,127 +103,132 @@ class _ConfirmLogin extends State { width: SizeConfig.realScreenWidth, child: Column( children: [ - Expanded( - flex: 3, - child: user != null && isMoreOption == false - ? Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - 'assets/images/DQ/dq_logo_icon.png', - height: 90, - width: 90, - ), - AppText( - TranslationBase.of(context).welcomeBack + - ' ' + - user.name, - fontSize: SizeConfig.textMultiplier * 3.5, - ), - AppText( - TranslationBase.of(context).accountInfo, - fontSize: SizeConfig.textMultiplier * 2.5, - ), - Card( - color: Colors.grey[300], - child: Row( - children: [ - Expanded( - child: ListTile( - title: Text( - TranslationBase.of(context).lastLoginAt, - textAlign: TextAlign.center, - ), - subtitle: Text( - user.editedOn != null + user != null && isMoreOption == false + ? Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + 'assets/images/DQ/dq_logo_icon.png', + height: 90, + width: 90, + ), + AppText( + TranslationBase.of(context).welcomeBack + + ' ' + + user.name, + fontSize: SizeConfig.textMultiplier * 3.5, + ), + SizedBox( + height: 20, + ), + AppText( + TranslationBase.of(context).accountInfo, + fontSize: SizeConfig.textMultiplier * 2.5, + ), + SizedBox( + height: 20, + ), + Card( + color: Colors.grey[300], + child: Row( + children: [ + Flexible( + child: ListTile( + title: Text( + TranslationBase.of(context).lastLoginAt, + textAlign: TextAlign.center, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + user.editedOn != null + ? formatDate( + DateUtil.convertStringToDate( + user.editedOn)) + : user.createdOn != null ? formatDate( DateUtil.convertStringToDate( - user.editedOn)) + user.createdOn)) : '--', - textAlign: TextAlign.center), - )), - Expanded( - child: ListTile( - title: Text( - TranslationBase.of(context) - .lastLoginWith, - textAlign: TextAlign.center), - subtitle: Text( - getType(user.logInType, context), - textAlign: TextAlign.center), - )) - ], + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center), + )), + Flexible( + child: ListTile( + title: Text( + TranslationBase.of(context).lastLoginWith, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center), + subtitle: Text( + getType(user.logInType, context), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center), )) - ], - ) - : Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - 'assets/images/DQ/dq_logo_icon.png', - height: 90, - width: 90, - ), - this.onlySMSBox == false - ? AppText( - TranslationBase.of(context) - .verifyLoginWith, - fontSize: SizeConfig.textMultiplier * 3.5, - textAlign: TextAlign.left, - ) - : AppText( - TranslationBase.of(context) - .verifyFingerprint2, - fontSize: SizeConfig.textMultiplier * 2.5, - textAlign: TextAlign.start, - ), - ])), + ], + )), + ], + ) + : Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + 'assets/images/DQ/dq_logo_icon.png', + height: 90, + width: 90, + ), + this.onlySMSBox == false + ? AppText( + TranslationBase.of(context).verifyLoginWith, + fontSize: SizeConfig.textMultiplier * 3.5, + textAlign: TextAlign.left, + ) + : AppText( + TranslationBase.of(context) + .verifyFingerprint2, + fontSize: SizeConfig.textMultiplier * 2.5, + textAlign: TextAlign.start, + ), + ]), user != null && isMoreOption == false - ? Expanded( - flex: 2, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: InkWell( - onTap: () => { - authenticateUser( - 3, BiometricType.face.index) - }, - child: getButton(user.logInType))), - Expanded(child: getButton(5)) - ]) - ])) - : Expanded( - flex: 4, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - onlySMSBox == false - ? Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded(child: getButton(3)), - Expanded(child: getButton(2)) - ], - ) - : SizedBox(), - Row( + ? Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Expanded(child: getButton(1)), - Expanded(child: getButton(4)) - ], - ), - ]), - ), + Expanded( + child: InkWell( + onTap: () => { + authenticateUser( + 3, BiometricType.face.index) + }, + child: getButton(user.logInType))), + Expanded(child: getButton(5)) + ]) + ]) + : Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + onlySMSBox == false + ? Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded(child: getButton(3)), + Expanded(child: getButton(2)) + ], + ) + : SizedBox(), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded(child: getButton(1)), + Expanded(child: getButton(4)) + ], + ), + ]), Expanded( flex: 1, child: Column( @@ -580,6 +585,9 @@ class _ConfirmLogin extends State { authenticatedUserObject.isLogin = true; appointmentRateViewModel.isLogin = true; projectViewModel.isLogin = true; + projectViewModel.user = authenticatedUserObject.user; + Provider.of(context, listen: false) + .setUser(authenticatedUserObject.user); getToDoCount(); appointmentRateViewModel .getIsLastAppointmentRatedList() @@ -627,7 +635,7 @@ class _ConfirmLogin extends State { borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(25, 10, 25, 10), + padding: EdgeInsets.fromLTRB(30, 15, 30, 15), child: Column( children: [ Image.asset( @@ -653,7 +661,7 @@ class _ConfirmLogin extends State { borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(20, 10, 20, 10), + padding: EdgeInsets.fromLTRB(30, 15, 30, 15), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -662,12 +670,17 @@ class _ConfirmLogin extends State { height: SizeConfig.imageSizeMultiplier * 13, width: SizeConfig.imageSizeMultiplier * 16, ), - SizedBox( - height: 20, - ), + projectViewModel.isArabic + ? SizedBox( + height: 0, + ) + : SizedBox( + height: 20, + ), AppText( TranslationBase.of(context).verifySMS, fontSize: SizeConfig.textMultiplier * 2, + textAlign: TextAlign.center, ) ], ), @@ -683,7 +696,7 @@ class _ConfirmLogin extends State { borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(25, 10, 25, 10), + padding: EdgeInsets.fromLTRB(30, 15, 30, 15), child: Column( children: [ Image.asset( @@ -712,7 +725,7 @@ class _ConfirmLogin extends State { borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(20, 10, 20, 10), + padding: EdgeInsets.fromLTRB(30, 15, 30, 15), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -755,9 +768,13 @@ class _ConfirmLogin extends State { height: SizeConfig.imageSizeMultiplier * 13, width: SizeConfig.imageSizeMultiplier * 16, ), - SizedBox( - height: 20, - ), + projectViewModel.isArabic + ? SizedBox( + height: 15, + ) + : SizedBox( + height: 20, + ), AppText( TranslationBase.of(context).moreVerification, fontSize: SizeConfig.textMultiplier * 2, diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index e42c1a2c..e20032c4 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -584,6 +584,8 @@ class _AppDrawerState extends State { this.sharedPref.setString(TOKEN, result.authenticationTokenID); // Navigator.of(context).pop(); await authenticatedUserObject.getUser(getUser: true); + Provider.of(context, listen: false).user = + authenticatedUserObject.user; Provider.of(context, listen: false) .setUser(authenticatedUserObject.user); appointmentRateViewModel From 764e7060007573f3c14986bd16d5a540f7c31867 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Thu, 31 Dec 2020 20:03:06 +0300 Subject: [PATCH 28/34] dashboard issue fixed --- lib/pages/login/confirm-login.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index 4b37fb29..c82aff2f 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -581,7 +581,8 @@ class _ConfirmLogin extends State { }); } - goToHome() { + goToHome() async { + await authenticatedUserObject.getUser(getUser: true); authenticatedUserObject.isLogin = true; appointmentRateViewModel.isLogin = true; projectViewModel.isLogin = true; @@ -679,7 +680,9 @@ class _ConfirmLogin extends State { ), AppText( TranslationBase.of(context).verifySMS, - fontSize: SizeConfig.textMultiplier * 2, + fontSize: projectViewModel.isArabic + ? SizeConfig.textMultiplier * 1.8 + : SizeConfig.textMultiplier * 2, textAlign: TextAlign.center, ) ], From b992978af49f2ec421674a2b876b48b022fafc98 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 1 Jan 2021 09:06:35 +0300 Subject: [PATCH 29/34] login --- lib/pages/login/confirm-login.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index c82aff2f..eafab7b3 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -763,7 +763,7 @@ class _ConfirmLogin extends State { borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + padding: EdgeInsets.fromLTRB(5, 0, 5, 5), child: Column( children: [ Image.asset( From e6a94f8014b7dce3fdf88496d16b13fa588ffe90 Mon Sep 17 00:00:00 2001 From: Sultan Khan Date: Fri, 1 Jan 2021 11:40:39 +0300 Subject: [PATCH 30/34] login design --- lib/pages/login/confirm-login.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index eafab7b3..427e491c 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -662,7 +662,7 @@ class _ConfirmLogin extends State { borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(30, 15, 30, 15), + padding: EdgeInsets.fromLTRB(5, 15, 5, 15), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -673,7 +673,7 @@ class _ConfirmLogin extends State { ), projectViewModel.isArabic ? SizedBox( - height: 0, + height: 20, ) : SizedBox( height: 20, @@ -776,7 +776,7 @@ class _ConfirmLogin extends State { height: 15, ) : SizedBox( - height: 20, + height: 10, ), AppText( TranslationBase.of(context).moreVerification, From 6bda03e9356056e52a44dce4bd2e64da2cad9407 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Fri, 1 Jan 2021 14:45:42 +0200 Subject: [PATCH 31/34] hot fixing --- assets/images/powerd-by.jpg | Bin 0 -> 150482 bytes lib/main.dart | 2 +- lib/pages/landing/landing_page.dart | 2 +- lib/pages/login/confirm-login.dart | 13 ++-- lib/pages/medical/medical_profile_page.dart | 6 +- lib/splashPage.dart | 34 ++-------- lib/widgets/mobile-no/mobile_no.dart | 68 ++++++++++---------- 7 files changed, 55 insertions(+), 70 deletions(-) create mode 100644 assets/images/powerd-by.jpg diff --git a/assets/images/powerd-by.jpg b/assets/images/powerd-by.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93bdbb1881c65b9ad9e8463f2d0d251f1e0e64a1 GIT binary patch literal 150482 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 F{|9iKfB*mh literal 0 HcmV?d00001 diff --git a/lib/main.dart b/lib/main.dart index b93aa83e..6fc2788d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -24,7 +24,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { final themeNotifier = Provider.of(context); - + precacheImage(AssetImage('assets/images/powerd-by.jpg'), context); return LayoutBuilder( builder: (context, constraints) { return OrientationBuilder( diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index a36df1c0..68eee783 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -143,7 +143,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { _firebaseMessaging.setAutoInitEnabled(true); locationUtils = - new LocationUtils(isShowConfirmDialog: false, context: context); + new LocationUtils(isShowConfirmDialog: true, context: context); WidgetsBinding.instance .addPostFrameCallback((_) => locationUtils.getCurrentLocation()); diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index 427e491c..8dbf27f4 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -633,10 +633,11 @@ class _ConfirmLogin extends State { return InkWell( onTap: () => {authenticateUser(4, true)}, child: RoundedContainer( + height: 140, borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(30, 15, 30, 15), + padding: EdgeInsets.fromLTRB(5, 15, 5, 15), child: Column( children: [ Image.asset( @@ -659,6 +660,7 @@ class _ConfirmLogin extends State { return InkWell( onTap: () => {authenticateUser(1, true)}, child: RoundedContainer( + height: 140, borderColor: Colors.grey, showBorder: true, child: Padding( @@ -693,13 +695,14 @@ class _ConfirmLogin extends State { return InkWell( onTap: () => {authenticateUser(2, BiometricType.fingerprint.index)}, child: RoundedContainer( + height: 140, backgroundColor: BiometricType.fingerprint.index == 1 ? Colors.white : Colors.white.withOpacity(.7), borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(30, 15, 30, 15), + padding: EdgeInsets.fromLTRB(5, 15, 5, 15), child: Column( children: [ Image.asset( @@ -722,13 +725,14 @@ class _ConfirmLogin extends State { return InkWell( onTap: () => {authenticateUser(3, BiometricType.face.index)}, child: RoundedContainer( + height: 140, backgroundColor: checkIfBiometricAvailable(BiometricType.face) ? Colors.white : Colors.white.withOpacity(.7), borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(30, 15, 30, 15), + padding: EdgeInsets.fromLTRB(5, 15, 5, 15), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -757,13 +761,14 @@ class _ConfirmLogin extends State { }) }, child: RoundedContainer( + height: 140, backgroundColor: BiometricType.fingerprint.index == 1 ? Colors.white : Colors.white.withOpacity(.7), borderColor: Colors.grey, showBorder: true, child: Padding( - padding: EdgeInsets.fromLTRB(5, 0, 5, 5), + padding: EdgeInsets.fromLTRB(5, 15, 5, 15), child: Column( children: [ Image.asset( diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 7eb0b5ba..e266f535 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -372,8 +372,7 @@ class _MedicalProfilePageState extends State { .insuranceApproval, imagePath: 'insurance_approvals_icon.png', - subTitle: TranslationBase.of(context) - .insuranceApprovalSubtitle, + subTitle: '',//TranslationBase.of(context).insuranceApprovalSubtitle, ), ), ), @@ -384,7 +383,8 @@ class _MedicalProfilePageState extends State { ) ], ), - ) + ), + SizedBox(height: 20,), ], ), if (model.user != null && model.isLogin) diff --git a/lib/splashPage.dart b/lib/splashPage.dart index fb26f76d..8d69c330 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -11,6 +12,7 @@ import 'core/service/AuthenticatedUserObject.dart'; import 'core/viewModels/project_view_model.dart'; import 'locator.dart'; import 'models/Authentication/authenticated_user.dart'; +import 'widgets/transitions/slide_up_page.dart'; AppSharedPreferences sharedPref = new AppSharedPreferences(); AuthenticatedUserObject authenticatedUserObject = @@ -27,14 +29,11 @@ class _SplashScreenState extends State { void initState() { super.initState(); Timer( - Duration(seconds: 1, milliseconds: 500), + Duration(seconds: 1, milliseconds: 800), () { Provider.of(context, listen: false).loadSharedPrefLanguage().then((value) { - Navigator.of(context).pushReplacement( - MaterialPageRoute( - builder: (BuildContext context) => LandingPage(), - ), - ); + Navigator.of(context).pushReplacement(FadePage(page: LandingPage())); + }); }, ); @@ -48,28 +47,7 @@ class _SplashScreenState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, - body: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox(height: MediaQuery.of(context).size.height * 0.35,), - Padding( - padding: const EdgeInsets.all(25.0), - child: Image.asset('assets/images/DQ/DQ_logo.png'), - ), - SizedBox(height: MediaQuery.of(context).size.height * 0.30,), - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(TranslationBase.of(context).poweredBy), - Image.asset( - 'assets/images/cs_logo_container.png', - width: 80, - ) - ], - ) - ], - ), + body: Image.asset('assets/images/powerd-by.jpg',fit: BoxFit.fitWidth,width: MediaQuery.of(context).size.width,), ); } } diff --git a/lib/widgets/mobile-no/mobile_no.dart b/lib/widgets/mobile-no/mobile_no.dart index a16f40ce..11cb7020 100644 --- a/lib/widgets/mobile-no/mobile_no.dart +++ b/lib/widgets/mobile-no/mobile_no.dart @@ -53,40 +53,42 @@ class _MobileNo extends State { Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Container( - margin: EdgeInsets.only(bottom: 10.0), - height: 60.0, - decoration: BoxDecoration( - color: Colors.white, - border: Border.all( - color: Colors.grey[400], - width: 1.0, + Expanded( + child: Container( + margin: EdgeInsets.only(bottom: 10.0), + height: 60.0, + decoration: BoxDecoration( + color: Colors.white, + border: Border.all( + color: Colors.grey[400], + width: 1.0, + ), + borderRadius: BorderRadius.circular(10), ), - borderRadius: BorderRadius.circular(10), - ), - width: MediaQuery.of(context).size.width * 0.89, - child: Padding( - padding: EdgeInsets.all(10), - child: DropdownButtonHideUnderline( - child: DropdownButton( - isExpanded: true, - value: _selectedType, - iconSize: 40, - elevation: 16, - onChanged: (value) => { - widget.onCountryChange(value), - setState(() { - countryCode = value; - _selectedType = value; - }) - }, - items: widget.countries - .map>((Countries value) { - return DropdownMenuItem( - value: value.code, - child: Text(projectProvider.isArabic == true ? value.name_ar : value.name), - ); - }).toList())))), + width: MediaQuery.of(context).size.width * 0.89, + child: Padding( + padding: EdgeInsets.all(10), + child: DropdownButtonHideUnderline( + child: DropdownButton( + isExpanded: true, + value: _selectedType, + iconSize: 40, + elevation: 16, + onChanged: (value) => { + widget.onCountryChange(value), + setState(() { + countryCode = value; + _selectedType = value; + }) + }, + items: widget.countries + .map>((Countries value) { + return DropdownMenuItem( + value: value.code, + child: Text(projectProvider.isArabic == true ? value.name_ar : value.name), + ); + }).toList())))), + ), ], ), Directionality( From f77d2b497eba583f0c399ea8b8d72169cabe3c3f Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 6 Jan 2021 12:58:02 +0200 Subject: [PATCH 32/34] fix issues --- help/test/widget_test.dart | 4 +- ios/Podfile.lock | 14 +- lib/config/config.dart | 7 +- lib/core/model/privilege/PrivilegeModel.dart | 24 + lib/core/model/weahter/weather_model.dart | 267 ++++++ .../service/medical/my_balance_service.dart | 17 +- lib/core/service/privilege_service.dart | 22 + .../medical/my_balance_view_model.dart | 4 +- lib/core/viewModels/project_view_model.dart | 64 +- .../weather/weather_view_model.dart | 31 + lib/pages/landing/home_page.dart | 872 ++++++++++-------- lib/pages/landing/landing_page.dart | 403 ++++---- .../medical/balance/advance_payment_page.dart | 2 + lib/pages/medical/medical_profile_page.dart | 456 ++------- .../vital_sing_chart_and_detials.dart | 2 +- lib/uitl/LocalNotification.dart | 7 +- lib/uitl/utils.dart | 359 +++++++ .../weather_slider/weather_slider.dart | 191 ++++ pubspec.yaml | 2 - 19 files changed, 1728 insertions(+), 1020 deletions(-) create mode 100644 lib/core/model/privilege/PrivilegeModel.dart create mode 100644 lib/core/model/weahter/weather_model.dart create mode 100644 lib/core/service/privilege_service.dart create mode 100644 lib/core/viewModels/weather/weather_view_model.dart create mode 100644 lib/widgets/weather_slider/weather_slider.dart diff --git a/help/test/widget_test.dart b/help/test/widget_test.dart index 0d8435b7..9ca1523f 100644 --- a/help/test/widget_test.dart +++ b/help/test/widget_test.dart @@ -8,7 +8,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:help/main.dart'; +import '../lib/main.dart'; + + void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { diff --git a/ios/Podfile.lock b/ios/Podfile.lock index d65de659..a09481c1 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -173,6 +173,10 @@ PODS: - Flutter - url_launcher_windows (0.0.1): - Flutter + - vibration (1.7.3): + - Flutter + - vibration_web (1.6.2): + - Flutter - video_player (0.0.1): - Flutter - video_player_web (0.0.1): @@ -233,6 +237,8 @@ DEPENDENCIES: - url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`) - url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`) - url_launcher_windows (from `.symlinks/plugins/url_launcher_windows/ios`) + - vibration (from `.symlinks/plugins/vibration/ios`) + - vibration_web (from `.symlinks/plugins/vibration_web/ios`) - video_player (from `.symlinks/plugins/video_player/ios`) - video_player_web (from `.symlinks/plugins/video_player_web/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) @@ -355,6 +361,10 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/url_launcher_web/ios" url_launcher_windows: :path: ".symlinks/plugins/url_launcher_windows/ios" + vibration: + :path: ".symlinks/plugins/vibration/ios" + vibration_web: + :path: ".symlinks/plugins/vibration_web/ios" video_player: :path: ".symlinks/plugins/video_player/ios" video_player_web: @@ -432,6 +442,8 @@ SPEC CHECKSUMS: url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c url_launcher_windows: 683d7c283894db8d1914d3ab2223b20cc1ad95d5 + vibration: b5a33e764c3f609a975b9dca73dce20fdde627dc + vibration_web: 0ba303d92469ba34d71c612a228b315908d7fcd9 video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e video_player_web: da8cadb8274ed4f8dbee8d7171b420dedd437ce7 wakelock: 0d4a70faf8950410735e3f61fb15d517c8a6efc4 @@ -440,4 +452,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 5a17be3f8af73a757fa4439c77cf6ab2db29a6e7 -COCOAPODS: 1.8.4 +COCOAPODS: 1.10.0 diff --git a/lib/config/config.dart b/lib/config/config.dart index a0c7f6a7..4183fe68 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -12,10 +12,10 @@ const EXA_CART_API_BASE_URL = 'https://mdlaboratories.com/exacartapi'; const PACKAGES_CATEGORIES = '/api/categories'; const PACKAGES_PRODUCTS = '/api/products'; -// const BASE_URL = 'https://uat.hmgwebservices.com/'; +const BASE_URL = 'https://uat.hmgwebservices.com/'; const PING_SERVICE = 'Services/Weather.svc/REST/CheckConnectivity'; -const BASE_URL = 'https://hmgwebservices.com/'; +// const BASE_URL = 'https://hmgwebservices.com/'; const GET_PROJECT = 'Services/Lists.svc/REST/GetProject'; ///Geofencing @@ -24,6 +24,9 @@ const LOG_GEO_ZONES = 'Services/Patients.svc/REST/GeoF_InsertPatientFileInfo'; //weather const WEATHER_INDICATOR = 'Services/Weather.svc/REST/GetCityInfo'; +const GET_PRIVILEGE = 'Services/Patients.svc/REST/Service_Privilege'; + + ///Doctor const GET_MY_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointmentResult'; diff --git a/lib/core/model/privilege/PrivilegeModel.dart b/lib/core/model/privilege/PrivilegeModel.dart new file mode 100644 index 00000000..3b629fde --- /dev/null +++ b/lib/core/model/privilege/PrivilegeModel.dart @@ -0,0 +1,24 @@ +class PrivilegeModel { + int iD; + String serviceName; + bool privilege; + dynamic region; + + PrivilegeModel({this.iD, this.serviceName, this.privilege, this.region}); + + PrivilegeModel.fromJson(Map json) { + iD = json['ID']; + serviceName = json['ServiceName']; + privilege = json['Previlege']; + region = json['Region']; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ServiceName'] = this.serviceName; + data['Previlege'] = this.privilege; + data['Region'] = this.region; + return data; + } +} diff --git a/lib/core/model/weahter/weather_model.dart b/lib/core/model/weahter/weather_model.dart new file mode 100644 index 00000000..37ee5983 --- /dev/null +++ b/lib/core/model/weahter/weather_model.dart @@ -0,0 +1,267 @@ +class WeatherIndicatorModel { + Null date; + int languageID; + int serviceName; + Null time; + Null androidLink; + Null authenticationTokenID; + Null data; + bool dataw; + int dietType; + Null errorCode; + Null errorEndUserMessage; + Null errorEndUserMessageN; + Null errorMessage; + int errorType; + int foodCategory; + Null iOSLink; + bool isAuthenticated; + int mealOrderStatus; + int mealType; + int messageStatus; + int numberOfResultRecords; + Null patientBlodType; + Null successMsg; + Null successMsgN; + Null citiesList; + Null cityName; + Null get5DaysWeatherForecastList; + List getCityInfoList; + Null getTodayWeatherForecastList; + Null iniciesList; + + WeatherIndicatorModel( + {this.date, + this.languageID, + this.serviceName, + this.time, + this.androidLink, + this.authenticationTokenID, + this.data, + this.dataw, + this.dietType, + this.errorCode, + this.errorEndUserMessage, + this.errorEndUserMessageN, + this.errorMessage, + this.errorType, + this.foodCategory, + this.iOSLink, + this.isAuthenticated, + this.mealOrderStatus, + this.mealType, + this.messageStatus, + this.numberOfResultRecords, + this.patientBlodType, + this.successMsg, + this.successMsgN, + this.citiesList, + this.cityName, + this.get5DaysWeatherForecastList, + this.getCityInfoList, + this.getTodayWeatherForecastList, + this.iniciesList}); + + WeatherIndicatorModel.fromJson(Map json) { + date = json['Date']; + languageID = json['LanguageID']; + serviceName = json['ServiceName']; + time = json['Time']; + androidLink = json['AndroidLink']; + authenticationTokenID = json['AuthenticationTokenID']; + data = json['Data']; + dataw = json['Dataw']; + dietType = json['DietType']; + errorCode = json['ErrorCode']; + errorEndUserMessage = json['ErrorEndUserMessage']; + errorEndUserMessageN = json['ErrorEndUserMessageN']; + errorMessage = json['ErrorMessage']; + errorType = json['ErrorType']; + foodCategory = json['FoodCategory']; + iOSLink = json['IOSLink']; + isAuthenticated = json['IsAuthenticated']; + mealOrderStatus = json['MealOrderStatus']; + mealType = json['MealType']; + messageStatus = json['MessageStatus']; + numberOfResultRecords = json['NumberOfResultRecords']; + patientBlodType = json['PatientBlodType']; + successMsg = json['SuccessMsg']; + successMsgN = json['SuccessMsgN']; + citiesList = json['CitiesList']; + cityName = json['CityName']; + get5DaysWeatherForecastList = json['Get5DaysWeatherForecastList']; + if (json['GetCityInfo_List'] != null) { + getCityInfoList = new List(); + json['GetCityInfo_List'].forEach((v) { + getCityInfoList.add(new GetCityInfoList.fromJson(v)); + }); + } + getTodayWeatherForecastList = json['GetTodayWeatherForecastList']; + iniciesList = json['IniciesList']; + } + + Map toJson() { + final Map data = new Map(); + data['Date'] = this.date; + data['LanguageID'] = this.languageID; + data['ServiceName'] = this.serviceName; + data['Time'] = this.time; + data['AndroidLink'] = this.androidLink; + data['AuthenticationTokenID'] = this.authenticationTokenID; + data['Data'] = this.data; + data['Dataw'] = this.dataw; + data['DietType'] = this.dietType; + data['ErrorCode'] = this.errorCode; + data['ErrorEndUserMessage'] = this.errorEndUserMessage; + data['ErrorEndUserMessageN'] = this.errorEndUserMessageN; + data['ErrorMessage'] = this.errorMessage; + data['ErrorType'] = this.errorType; + data['FoodCategory'] = this.foodCategory; + data['IOSLink'] = this.iOSLink; + data['IsAuthenticated'] = this.isAuthenticated; + data['MealOrderStatus'] = this.mealOrderStatus; + data['MealType'] = this.mealType; + data['MessageStatus'] = this.messageStatus; + data['NumberOfResultRecords'] = this.numberOfResultRecords; + data['PatientBlodType'] = this.patientBlodType; + data['SuccessMsg'] = this.successMsg; + data['SuccessMsgN'] = this.successMsgN; + data['CitiesList'] = this.citiesList; + data['CityName'] = this.cityName; + data['Get5DaysWeatherForecastList'] = this.get5DaysWeatherForecastList; + if (this.getCityInfoList != null) { + data['GetCityInfo_List'] = + this.getCityInfoList.map((v) => v.toJson()).toList(); + } + data['GetTodayWeatherForecastList'] = this.getTodayWeatherForecastList; + data['IniciesList'] = this.iniciesList; + return data; + } +} + +class GetCityInfoList { + CategoriesNames categoriesNames; + String category; + String categoryValue; + int cityID; + String cityName; + String cityNameN; + String colorName; + String createdOn; + String iD; + int iniceID; + bool isOrderEmpty; + bool isValuesReversed; + bool language; + double latitude; + double longitude; + String name; + int orderNum; + double temperature; + String value; + + GetCityInfoList( + {this.categoriesNames, + this.category, + this.categoryValue, + this.cityID, + this.cityName, + this.cityNameN, + this.colorName, + this.createdOn, + this.iD, + this.iniceID, + this.isOrderEmpty, + this.isValuesReversed, + this.language, + this.latitude, + this.longitude, + this.name, + this.orderNum, + this.temperature, + this.value}); + + GetCityInfoList.fromJson(Map json) { + categoriesNames = json['CategoriesNames'] != null + ? new CategoriesNames.fromJson(json['CategoriesNames']) + : null; + category = json['Category']; + categoryValue = json['CategoryValue']; + cityID = json['CityID']; + cityName = json['CityName']; + cityNameN = json['CityNameN']; + colorName = json['ColorName']; + createdOn = json['CreatedOn']; + iD = json['ID']; + iniceID = json['IniceID']; + isOrderEmpty = json['IsOrderEmpty']; + isValuesReversed = json['IsValuesReversed']; + language = json['Language']; + latitude = json['Latitude']; + longitude = json['Longitude']; + name = json['Name']; + orderNum = json['OrderNum']; + temperature = json['Temperature']; + value = json['Value']; + } + + Map toJson() { + final Map data = new Map(); + if (this.categoriesNames != null) { + data['CategoriesNames'] = this.categoriesNames.toJson(); + } + data['Category'] = this.category; + data['CategoryValue'] = this.categoryValue; + data['CityID'] = this.cityID; + data['CityName'] = this.cityName; + data['CityNameN'] = this.cityNameN; + data['ColorName'] = this.colorName; + data['CreatedOn'] = this.createdOn; + data['ID'] = this.iD; + data['IniceID'] = this.iniceID; + data['IsOrderEmpty'] = this.isOrderEmpty; + data['IsValuesReversed'] = this.isValuesReversed; + data['Language'] = this.language; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['Name'] = this.name; + data['OrderNum'] = this.orderNum; + data['Temperature'] = this.temperature; + data['Value'] = this.value; + return data; + } +} + +class CategoriesNames { + String category1; + String category2; + String category3; + String category4; + String category5; + + CategoriesNames( + {this.category1, + this.category2, + this.category3, + this.category4, + this.category5}); + + CategoriesNames.fromJson(Map json) { + category1 = json['Category1']; + category2 = json['Category2']; + category3 = json['Category3']; + category4 = json['Category4']; + category5 = json['Category5']; + } + + Map toJson() { + final Map data = new Map(); + data['Category1'] = this.category1; + data['Category2'] = this.category2; + data['Category3'] = this.category3; + data['Category4'] = this.category4; + data['Category5'] = this.category5; + return data; + } +} + diff --git a/lib/core/service/medical/my_balance_service.dart b/lib/core/service/medical/my_balance_service.dart index 7f3747ee..86e925b8 100644 --- a/lib/core/service/medical/my_balance_service.dart +++ b/lib/core/service/medical/my_balance_service.dart @@ -24,7 +24,8 @@ class MyBalanceService extends BaseService { String logInTokenID; String verificationCode; - AuthenticatedUserObject authenticatedUserObject = locator(); + AuthenticatedUserObject authenticatedUserObject = + locator(); MyBalanceService(){ getFamilyFiles(); @@ -65,13 +66,14 @@ class MyBalanceService extends BaseService { }, body: body); } - getPatientInfoByPatientIDAndMobileNumber() async { + getPatientInfoByPatientIDAndMobileNumber(AdvanceModel advanceModel) async { hasError = false; super.error = ""; Map body = Map(); body['isDentalAllowedBackend'] = false; - body['MobileNo'] = authenticatedUserObject.user.mobileNumber; - body['ProjectID'] = authenticatedUserObject.user.projectID; + body['MobileNo'] = advanceModel.mobileNumber; + body['ProjectID'] = advanceModel.hospitalsModel.iD; + body['PatientID'] = advanceModel.fileNumber; await baseAppClient.post(GET_PATIENT_INFO_BY_ID_AND_MOBILE_NUMBER, onSuccess: (response, statusCode) async { @@ -85,7 +87,7 @@ class MyBalanceService extends BaseService { }, body: body); } - sendActivationCodeForAdvancePayment({int patientID,int projectID}) async { + sendActivationCodeForAdvancePayment({int patientID, int projectID}) async { hasError = false; super.error = ""; Map body = Map(); @@ -115,9 +117,8 @@ class MyBalanceService extends BaseService { body['LogInTokenID'] = logInTokenID; await baseAppClient.post(CHECK_ACTIVATION_CODE_FOR_ADVANCE_PAYMENT, - onSuccess: (response, statusCode) async { - - }, onFailure: (String error, int statusCode) { + onSuccess: (response, statusCode) async {}, + onFailure: (String error, int statusCode) { hasError = true; super.error = error; super.error = error; diff --git a/lib/core/service/privilege_service.dart b/lib/core/service/privilege_service.dart new file mode 100644 index 00000000..5beef992 --- /dev/null +++ b/lib/core/service/privilege_service.dart @@ -0,0 +1,22 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/privilege/PrivilegeModel.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class PrivilegeService extends BaseService { + + List privilegeModelList = List(); + + Future getPrivilege() async { + Map body = Map(); + body['PatientType'] = 4; + await baseAppClient.post(GET_PRIVILEGE, + onSuccess: (dynamic response, int statusCode) { + response['ServicePrivilegeList'].forEach((item) { + privilegeModelList.add(PrivilegeModel.fromJson(item)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } +} diff --git a/lib/core/viewModels/medical/my_balance_view_model.dart b/lib/core/viewModels/medical/my_balance_view_model.dart index 8c79f0f0..f9554d94 100644 --- a/lib/core/viewModels/medical/my_balance_view_model.dart +++ b/lib/core/viewModels/medical/my_balance_view_model.dart @@ -108,10 +108,10 @@ class MyBalanceViewModel extends BaseViewModel { } } - Future getPatientInfoByPatientIDAndMobileNumber() async { + Future getPatientInfoByPatientIDAndMobileNumber(AdvanceModel advanceModel) async { setState(ViewState.Busy); await _myBalanceService - .getPatientInfoByPatientIDAndMobileNumber(); + .getPatientInfoByPatientIDAndMobileNumber(advanceModel); if (_myBalanceService.hasError) { error = _myBalanceService.error; setState(ViewState.ErrorLocal); diff --git a/lib/core/viewModels/project_view_model.dart b/lib/core/viewModels/project_view_model.dart index a7aa6097..baaf6b5b 100644 --- a/lib/core/viewModels/project_view_model.dart +++ b/lib/core/viewModels/project_view_model.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'package:connectivity/connectivity.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/core/model/privilege/PrivilegeModel.dart'; +import 'package:diplomaticquarterapp/core/service/privilege_service.dart'; import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; @@ -24,9 +26,7 @@ class ProjectViewModel extends BaseViewModel { bool isError = false; String error = ''; dynamic searchvalue; - bool isLogin - = false; - + bool isLogin = false; dynamic get searchValue => searchvalue; @@ -36,14 +36,21 @@ class ProjectViewModel extends BaseViewModel { bool get isArabic => _isArabic; - // BaseViewModel baseViewModel = locator() + + bool isLoginChild = false; + List privilegeRootUser = List(); + List privilegeChildUser = List(); + + List get privileges => + isLoginChild ? privilegeChildUser : privilegeChildUser; + StreamSubscription subscription; ProjectViewModel() { - // PlatformBridge.init(context); // Moved to 'main.dart' due to context availability loadSharedPrefLanguage(); - - subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { + subscription = Connectivity() + .onConnectivityChanged + .listen((ConnectivityResult result) { switch (result) { case ConnectivityResult.wifi: isInternetConnection = true; @@ -82,6 +89,49 @@ class ProjectViewModel extends BaseViewModel { notifyListeners(); } + setPrivilegeModelList( + {List privilege}) { + this.isLoginChild = isLoginChild; + privilegeRootUser = privilege; + + notifyListeners(); + } + + setPrivilege({privilegeList, bool isLoginChild = false}) { + List privilege = List(); + + privilegeList['List'][0]['ListPrivilege'].forEach((item) { + privilege.add(PrivilegeModel.fromJson(item)); + }); + + this.isLoginChild = isLoginChild; + if (isLoginChild) + privilegeChildUser = privilege; + else + privilegeRootUser = privilege; + + notifyListeners(); + } + + setIsLoginChild({@required bool isLoginChild}){ + this.isLoginChild = isLoginChild; + notifyListeners(); + } + + bool havePrivilege(int id) { + bool isHavePrivilege = false; + if(isLoginChild) + privilegeChildUser.forEach((element) { + if (element.iD == id) isHavePrivilege = element.privilege; + }); + else{ + privilegeRootUser.forEach((element) { + if (element.iD == id) isHavePrivilege = element.privilege; + }); + } + return isHavePrivilege; + } + @override void dispose() { if (subscription != null) subscription.cancel(); diff --git a/lib/core/viewModels/weather/weather_view_model.dart b/lib/core/viewModels/weather/weather_view_model.dart new file mode 100644 index 00000000..bb201843 --- /dev/null +++ b/lib/core/viewModels/weather/weather_view_model.dart @@ -0,0 +1,31 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/er/projectavgerwaitingtime.dart'; +import 'package:diplomaticquarterapp/core/model/weahter/weather_model.dart'; + +import 'package:diplomaticquarterapp/core/service/er/er_service.dart'; +import 'package:diplomaticquarterapp/core/service/weather_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart'; + +import '../../../locator.dart'; + +class WeatherViewModel extends BaseViewModel { + WeatherService _weatherService = locator(); + List get weatherIndicatorData => + _weatherService.weatherIndicatorData; + getWeatherData() async { + setState(ViewState.Busy); + + // if (id != null && projectID != null) { + // await _erService.getProjectAvgERWaitingTimeOrders( + // id: id, projectID: projectID); + // } else { + await _weatherService.getWeatherData(); + // } + if (_weatherService.hasError) { + error = _weatherService.error; + setState(ViewState.Error); + } else + setState(ViewState.Idle); + } +} diff --git a/lib/pages/landing/home_page.dart b/lib/pages/landing/home_page.dart index 5c260384..3d49d707 100644 --- a/lib/pages/landing/home_page.dart +++ b/lib/pages/landing/home_page.dart @@ -1,12 +1,6 @@ import 'package:diplomaticquarterapp/config/size_config.dart'; -import 'package:diplomaticquarterapp/core/model/geofencing/requests/GeoZonesRequestModel.dart'; -import 'package:diplomaticquarterapp/core/model/geofencing/requests/LogGeoZoneRequestModel.dart'; -import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; -import 'package:diplomaticquarterapp/core/service/geofencing/GeofencingServices.dart'; import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; -import 'package:diplomaticquarterapp/locator.dart'; -import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/ComprehensiveMedicalCheckup/cmc_index_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/HomeHealthCare/home_health_care_index_page.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page.dart'; @@ -17,12 +11,9 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/livecare/livecare_home.dart'; import 'package:diplomaticquarterapp/pages/paymentService/payment_service.dart'; import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart'; -import 'package:diplomaticquarterapp/uitl/HMG_Geofence.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; -import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; -import 'package:diplomaticquarterapp/widgets/offers_packages/offers_packages.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; @@ -31,10 +22,6 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:provider/provider.dart'; -import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; -import '../../widgets/data_display/medical/LabResult/LineChartCurved.dart'; -import '../../locator.dart'; - class HomePage extends StatefulWidget { final Function goToMyProfile; @@ -45,15 +32,9 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State { - ToDoCountProviderModel toDoProvider; - - AuthenticatedUserObject authenticatedUserObject = - locator(); - @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); - toDoProvider = Provider.of(context); return BaseView( onModelReady: (model) => model.getPatientRadOrders(), builder: (_, model, wi) => AppScaffold( @@ -72,7 +53,10 @@ class _HomePageState extends State { width: double.infinity, height: 210, decoration: BoxDecoration( - image: DecorationImage(image: ExactAssetImage('assets/images/dashboard_top_bg.png'), fit: BoxFit.cover), + image: DecorationImage( + image: ExactAssetImage( + 'assets/images/dashboard_top_bg.png'), + fit: BoxFit.cover), ), child: Stack( children: [ @@ -81,7 +65,8 @@ class _HomePageState extends State { left: 5, right: 5, child: Container( - width: MediaQuery.of(context).size.width * 0.8, + width: + MediaQuery.of(context).size.width * 0.8, child: Row( children: [ Expanded( @@ -91,42 +76,81 @@ class _HomePageState extends State { margin: EdgeInsets.all(5), decoration: BoxDecoration( image: DecorationImage( - image: AssetImage("assets/images/new-design/covid_bg_transparent.png"), + image: AssetImage( + "assets/images/new-design/covid_bg_transparent.png"), fit: BoxFit.fill, ), - color: Colors.white.withOpacity(0.3), - borderRadius: BorderRadius.all(Radius.circular(5))), + color: + Colors.white.withOpacity(0.3), + borderRadius: BorderRadius.all( + Radius.circular(5))), child: Container( margin: EdgeInsets.only(top: 10.0), child: Column( children: [ - Text("COVID-19 TEST", style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 18.0)), + Text("COVID-19 TEST", + style: TextStyle( + color: Colors.white, + fontWeight: + FontWeight.bold, + fontSize: 18.0)), Row( children: [ Container( - margin: EdgeInsets.only(top: 15.0, left: 3.5, right: 3.5), - child: SvgPicture.asset('assets/images/new-design/covid-19-car.svg', width: 45.0, height: 45.0), + margin: EdgeInsets.only( + top: 15.0, left: 3.5, right: 3.5), + child: SvgPicture.asset( + 'assets/images/new-design/covid-19-car.svg', + width: 45.0, + height: 45.0), ), Container( - margin: EdgeInsets.only(left: 10.0, top: 10.0), + margin: EdgeInsets.only( + left: 10.0, + top: 10.0), child: Column( children: [ - Text("Drive-Thru", style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16.0)), + Text("Drive-Thru", + style: TextStyle( + color: Colors + .white, + fontWeight: + FontWeight + .bold, + fontSize: + 16.0)), ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), + shape: + RoundedRectangleBorder( + borderRadius: + BorderRadius + .circular( + 5.0), ), - minWidth: MediaQuery.of(context).size.width * 0.15, + minWidth: MediaQuery.of( + context) + .size + .width * + 0.15, height: 25.0, child: RaisedButton( - color: Colors.red[800], - textColor: Colors.white, - disabledTextColor: Colors.white, - disabledColor: new Color(0xFFbcc2c4), + color: Colors + .red[800], + textColor: + Colors.white, + disabledTextColor: + Colors.white, + disabledColor: + new Color( + 0xFFbcc2c4), onPressed: () { navigateToCovidDriveThru(); }, - child: Text("BOOK NOW", style: TextStyle(fontSize: 12.0)), + child: Text( + "BOOK NOW", + style: TextStyle( + fontSize: + 12.0)), ), ), ], @@ -141,14 +165,21 @@ class _HomePageState extends State { ), Expanded( child: InkWell( - onTap: () => Navigator.push(context, FadePage(page: LiveCareHome())), + onTap: () => Navigator.push(context, + FadePage(page: LiveCareHome())), child: Container( height: 120, padding: EdgeInsets.all(15), margin: EdgeInsets.all(5), - decoration: BoxDecoration(color: Colors.white.withOpacity(0.3), borderRadius: BorderRadius.all(Radius.circular(5))), + decoration: BoxDecoration( + color: Colors.white + .withOpacity(0.3), + borderRadius: BorderRadius.all( + Radius.circular(5))), child: SvgPicture.asset( - projectViewModel.isArabic ? 'assets/images/new-design/livecare_arabic_logo.svg' : 'assets/images/new-design/liveCare_white_logo.svg', + projectViewModel.isArabic + ? 'assets/images/new-design/livecare_arabic_logo.svg' + : 'assets/images/new-design/liveCare_white_logo.svg', ), ), ), @@ -159,339 +190,374 @@ class _HomePageState extends State { ) ], ), - ), Container(width: double.infinity, height: 80) ], ), Positioned( top: 155, - left: MediaQuery.of(context).size.width * (MediaQuery.of(context).orientation == Orientation.landscape ? 0.02 : 0.03), - right: MediaQuery.of(context).size.width * (MediaQuery.of(context).orientation == Orientation.landscape ? 0.02 : 0.03), + left: MediaQuery.of(context).size.width * + (MediaQuery.of(context).orientation == + Orientation.landscape + ? 0.02 + : 0.03), + right: MediaQuery.of(context).size.width * + (MediaQuery.of(context).orientation == + Orientation.landscape + ? 0.02 + : 0.03), child: (!model.isLogin && projectViewModel.user == null) ? Container( - width: double.infinity, - height: 125, - decoration: BoxDecoration( - color: HexColor('#A59E9E'), - 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: Container( - margin: EdgeInsets.all(5), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 8, - ), - Texts( - TranslationBase.of(context).myMedicalFile, - color: Colors.black87, - bold: true, - fontSize: 23, - ), - SizedBox( - height: 5, + width: double.infinity, + height: 125, + decoration: BoxDecoration( + color: HexColor('#A59E9E'), + 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: Container( + margin: EdgeInsets.all(5), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 8, + ), + Texts( + TranslationBase.of(context).myMedicalFile, + color: Colors.black87, + bold: true, + fontSize: 23, + ), + SizedBox( + height: 5, + ), + Texts( + TranslationBase.of(context) + .myMedicalFileSubTitle, + color: Colors.black, + fontSize: 16, + ), + Align( + alignment: projectViewModel.isArabic + ? Alignment.bottomRight + : Alignment.bottomLeft, + child: InkWell( + onTap: () { + widget.goToMyProfile(); + }, + child: Container( + margin: EdgeInsets.all(2), + width: 90, + height: 30, + decoration: BoxDecoration( + color: HexColor('#D81A2E'), + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, + width: 0.5), + borderRadius: BorderRadius.all( + Radius.circular(9)), ), - Texts( - TranslationBase.of(context).myMedicalFileSubTitle, - color: Colors.black, - fontSize: 16, + child: Center( + child: Texts( + TranslationBase.of(context) + .viewMore, + color: Colors.white, + fontSize: 12, + ), ), - Align( - alignment: projectViewModel.isArabic ? Alignment.bottomRight : Alignment.bottomLeft, - child: InkWell( - onTap: () { - widget.goToMyProfile(); - }, - child: Container( - margin: EdgeInsets.all(2), - width: 90, - height: 30, - decoration: BoxDecoration( - color: HexColor('#D81A2E'), - shape: BoxShape.rectangle, - border: Border.all(color: Colors.transparent, width: 0.5), - borderRadius: BorderRadius.all(Radius.circular(9)), + ), + ), + ) + ], + ), + ), + ) + : Container( + width: double.infinity, + height: 130, + decoration: BoxDecoration( + color: HexColor('#A59E9E'), + 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: Container( + margin: EdgeInsets.all(5), + child: Column( + children: [ + Row( + children: [ + if (model.user != null) + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 8, ), - child: Center( - child: Texts( - TranslationBase.of(context).viewMore, - color: Colors.white, - fontSize: 12, - ), + Texts( + model.user.firstName + + " " + + model.user.lastName, + color: Colors.grey[100], + bold: true, + fontSize: 15, + ), + Texts( + '${model.user.patientID}', + color: Colors.white, + fontSize: 14, + ), + SizedBox( + height: 5, ), + Texts( + '${DateUtil.getMonthDayYearDateFormatted(model.user.dateofBirthDataTime)} ,${model.user.genderDescription} ${model.user.ageDesc}', + color: Colors.grey[100], + fontWeight: FontWeight.normal, + fontSize: 14, + ), + ], + ), + ), + InkWell( + onTap: () { + widget.goToMyProfile(); + }, + child: Container( + margin: EdgeInsets.all(2), + width: 90, + height: 30, + decoration: BoxDecoration( + color: HexColor('#D81A2E'), + shape: BoxShape.rectangle, + border: Border.all( + color: Colors.transparent, + width: 0.5), + borderRadius: BorderRadius.all( + Radius.circular(5), ), ), - ) - ], - ), - ), - ) - : Container( - width: double.infinity, - height: 130, - decoration: BoxDecoration( - color: HexColor('#A59E9E'), - 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: Center( + child: Texts( + TranslationBase.of(context) + .viewMore, + color: Colors.white, + fontSize: 12, + ), + ), + ), + ) + ], ), - child: Container( - margin: EdgeInsets.all(5), - child: Column( - children: [ - Row( + Row( + //crossAxisAlignment: CrossAxisAlignment.center, + //mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - if (model.user != null) - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox( - height: 8, - ), - Texts( - model.user.firstName + " " + model.user.lastName, - color: Colors.grey[100], - bold: true, - fontSize: 15, - ), - Texts( - '${model.user.patientID}', - color: Colors.white, - fontSize: 14, - ), - SizedBox( - height: 5, - ), - Texts( - '${DateUtil.getMonthDayYearDateFormatted(model.user.dateofBirthDataTime)} ,${model.user.genderDescription} ${model.user.ageDesc}', - color: Colors.grey[100], - fontWeight: FontWeight.normal, - fontSize: 14, - ), - ], - ), - ), - InkWell( - onTap: () { - widget.goToMyProfile(); - }, - child: Container( - margin: EdgeInsets.all(2), - width: 90, - height: 30, - decoration: BoxDecoration( - color: HexColor('#D81A2E'), - shape: BoxShape.rectangle, - border: Border.all(color: Colors.transparent, width: 0.5), - borderRadius: BorderRadius.all( - Radius.circular(5), - ), - ), - child: Center( - child: Texts( - TranslationBase.of(context).viewMore, - color: Colors.white, - fontSize: 12, - ), - ), - ), + Image.asset( + 'assets/images/height_icon.png', + width: 35, + height: 40, + ), + Texts( + "${model.heightCm}", + color: Colors.white, ) ], ), - Row( - //crossAxisAlignment: CrossAxisAlignment.center, - //mainAxisAlignment: MainAxisAlignment.spaceAround, + ), + SizedBox( + width: 3, + ), + Expanded( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, children: [ - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'assets/images/height_icon.png', - width: 35, - height: 40, - ), - Texts( - "${model.heightCm}", - color: Colors.white, - ) - ], - ), - ), - SizedBox( - width: 3, + Image.asset( + 'assets/images/weight_icon.png', + width: 25, + height: 40, ), - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'assets/images/weight_icon.png', - width: 25, - height: 40, - ), - Texts( - '${model.weightKg}', - color: Colors.white, - ) - ], - ), - ), - SizedBox( - width: 3, - ), - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - 'assets/images/blood_icon.png', - width: 35, - height: 40, - ), - Texts( - '${model.bloadType}', - color: Colors.white, - ) - ], - ), + Texts( + '${model.weightKg}', + color: Colors.white, + ) + ], + ), + ), + SizedBox( + width: 3, + ), + Expanded( + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + 'assets/images/blood_icon.png', + width: 35, + height: 40, ), + Texts( + '${model.booldType}', + color: Colors.white, + ) ], - ) - ], - ), - ), - ), + ), + ), + ], + ) + ], + ), + ), + ), ), ], ), - - /* Zohiab Kambrani | Commented below because its in progress - OffersAndPackagesWidget(OfferPackagesItemModel.dummy()), - */ - - Container( - margin: EdgeInsets.only(left: 15, right: 15), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - DashboardItem( - onTap: () { - Navigator.push( - context, - FadePage( - page: HomeHealthCareIndexPage(), - ), - ); - }, - child: Center( - child: Padding( - padding: const EdgeInsets.all(15.0), - child: Column( - children: [ - Image.asset( - 'assets/images/home_health_care_icon.png', - width: 50, - height: 50, + if(projectViewModel.havePrivilege(64)||projectViewModel.havePrivilege(65)||projectViewModel.havePrivilege(67)) + Container( + margin: EdgeInsets.only(left: 15, right: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if(projectViewModel.havePrivilege(64)) + DashboardItem( + onTap: () { + Navigator.push( + context, + FadePage( + page: HomeHealthCareIndexPage(), ), - SizedBox( - height: 3, + ); + }, + child: Center( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Image.asset( + 'assets/images/home_health_care_icon.png', + width: 50, + height: 50, + ), + SizedBox( + height: 3, + ), + Texts( + TranslationBase.of(context) + .homeHealthCareService, + textAlign: TextAlign.center, + color: Colors.white, + bold: true, + fontSize: SizeConfig.textMultiplier * 1.7, + ) + ], ), - Texts( - TranslationBase.of(context).homeHealthCareService, - textAlign: TextAlign.center, - color: Colors.white, - bold: true, - fontSize: SizeConfig.textMultiplier * 1.7, - ) - ], + ), ), + height: MediaQuery.of(context).size.width * 0.4, + imageName: 'home_healthcare_service_bg.png', + opacity: 0.5, ), - ), - height: MediaQuery.of(context).size.width * 0.4, - imageName: 'home_healthcare_service_bg.png', - opacity: 0.5, - ), - DashboardItem( - onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), - child: Center( - child: Padding( - padding: const EdgeInsets.all(15.0), - child: Column( - children: [ - Image.asset( - 'assets/images/pharmacy_logo.png', - width: 40, - height: 40, - ), - SizedBox( - height: 20, + if(projectViewModel.havePrivilege(65)) + DashboardItem( + onTap: () => Navigator.push(context, FadePage(page: PharmacyPage())), + + child: Center( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Image.asset( + 'assets/images/pharmacy_logo.png', + width: 40, + height: 40, + ), + SizedBox( + height: 20, + ), + Texts( + TranslationBase.of(context).onlinePharmacy, + textAlign: TextAlign.center, + color: Colors.white, + bold: true, + fontSize: SizeConfig.textMultiplier * 1.7, + ) + ], ), - Texts( - TranslationBase.of(context).onlinePharmacy, - textAlign: TextAlign.center, - color: Colors.white, - bold: true, - fontSize: SizeConfig.textMultiplier * 1.7, - ) - ], + ), ), + height: MediaQuery.of(context).size.width * 0.4, + imageName: 'al-habib_onlne_pharmacy_bg.png', ), - ), - height: MediaQuery.of(context).size.width * 0.4, - imageName: 'al-habib_onlne_pharmacy_bg.png', - ), - DashboardItem( - onTap: () { - Navigator.push( - context, - FadePage( - page: CMCIndexPage(), - ), - ); - }, - child: Center( - child: Padding( - padding: const EdgeInsets.all(15.0), - child: Column( - children: [ - Image.asset( - 'assets/images/comprehensive_medical_checkup_logo.png', - width: 50, - height: 50, + if(projectViewModel.havePrivilege(67)) + DashboardItem( + onTap: (){ + Navigator.push( + context, + FadePage( + page: CMCIndexPage(), ), - SizedBox( - height: 3, + ); + }, + child: Center( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Image.asset( + 'assets/images/comprehensive_medical_checkup_logo.png', + width: 50, + height: 50, + ), + SizedBox( + height: 3, + ), + Texts( + TranslationBase.of(context).emergencyService, + textAlign: TextAlign.center, + color: Colors.white, + bold: true, + fontSize: SizeConfig.textMultiplier * 1.7, + ) + ], ), - Texts( - TranslationBase.of(context).emergencyService, - textAlign: TextAlign.center, - color: Colors.white, - bold: true, - fontSize: SizeConfig.textMultiplier * 1.7, - ) - ], + ), ), + height: MediaQuery.of(context).size.width * 0.4, + color: HexColor("#747C80"), + imageName: 'emergency_service_image.png', ), - ), - height: MediaQuery.of(context).size.width * 0.4, - color: HexColor("#747C80"), - imageName: 'emergency_service_image.png', - ), - ], + ], + ), ), - ), SizedBox( height: 8, ), InkWell( - onTap: () => Navigator.push(context, FadePage(page: PaymentService())), + onTap: () => + Navigator.push(context, FadePage(page: PaymentService())), child: Container( margin: EdgeInsets.only(left: 15, right: 15), child: Row( @@ -512,7 +578,8 @@ class _HomePageState extends State { height: 5, ), Texts( - TranslationBase.of(context).onlinePaymentService, + TranslationBase.of(context) + .onlinePaymentService, textAlign: TextAlign.center, color: Colors.black87, bold: false, @@ -543,7 +610,8 @@ class _HomePageState extends State { height: 10, ), Texts( - TranslationBase.of(context).offersAndPackages, + TranslationBase.of(context) + .offersAndPackages, textAlign: TextAlign.center, color: Colors.black87, bold: false, @@ -559,46 +627,48 @@ class _HomePageState extends State { borderRadius: BorderRadius.circular(6.0), color: Colors.white, )), - Container( - width: MediaQuery.of(context).size.width * 0.29, - child: InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: ErOptions( - isAppbar: true, - ))), - child: Center( - child: Padding( - padding: const EdgeInsets.all(15.0), - child: Column( - children: [ - Image.asset( - 'assets/images/Dr_Schedule_report.png', - width: 50, - height: 50, - ), - SizedBox( - height: 10, - ), - Texts( - TranslationBase.of(context).emergencyServices, - textAlign: TextAlign.center, - color: Colors.black87, - bold: false, - fontSize: SizeConfig.textMultiplier * 1.7, - ) - ], + if(projectViewModel.havePrivilege(60)) + Container( + width: MediaQuery.of(context).size.width * 0.29, + child: InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: ErOptions( + isAppbar: true, + ))), + child: Center( + child: Padding( + padding: const EdgeInsets.all(15.0), + child: Column( + children: [ + Image.asset( + 'assets/images/Dr_Schedule_report.png', + width: 50, + height: 50, + ), + SizedBox( + height: 10, + ), + Texts( + TranslationBase.of(context) + .emergencyServices, + textAlign: TextAlign.center, + color: Colors.black87, + bold: false, + fontSize: SizeConfig.textMultiplier * 1.7, + ) + ], + ), ), ), ), + height: MediaQuery.of(context).size.width * 0.4, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6.0), + color: Colors.white, + ), ), - height: MediaQuery.of(context).size.width * 0.4, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(6.0), - color: Colors.white, - ), - ), ], ), ), @@ -624,7 +694,8 @@ class _HomePageState extends State { fontWeight: FontWeight.normal, ), Texts( - TranslationBase.of(context).viewAllHabibMedicalService, + TranslationBase.of(context) + .viewAllHabibMedicalService, color: Colors.white, fontWeight: FontWeight.normal, fontSize: 10, @@ -645,14 +716,15 @@ class _HomePageState extends State { opacity: 0.5, color: Colors.grey[700], width: MediaQuery.of(context).size.width * 0.45, - onTap: () => Navigator.push(context, FadePage(page: AllHabibMedicalService( - ))), + onTap: () => Navigator.push( + context, FadePage(page: AllHabibMedicalService())), ), DashboardItem( onTap: () { // Navigator.push( // context, FadePage(page: FeedbackHomePage())); - Navigator.push(context, FadePage(page: ContactUsPage())); + Navigator.push( + context, FadePage(page: ContactUsPage())); }, child: Container( width: double.infinity, @@ -675,7 +747,7 @@ class _HomePageState extends State { child: Container(), ), Texts( - TranslationBase.of(context).viewAll, + TranslationBase.of(context).viewMore, color: Colors.white, fontWeight: FontWeight.normal, ) @@ -692,7 +764,7 @@ class _HomePageState extends State { ), ), SizedBox( - height: 130, + height: 120, ) ], ), @@ -703,24 +775,23 @@ class _HomePageState extends State { } navigateToCovidDriveThru() { - Navigator.push(context, MaterialPageRoute(builder: (context) => CovidDrivethruLocation())); + Navigator.push(context, + MaterialPageRoute(builder: (context) => CovidDrivethruLocation())); } } class DashboardItem extends StatelessWidget { const DashboardItem( {this.hasBorder = false, - this.imageName, - @required this.child, - this.onTap, - Key key, - this.width, - this.height, - this.color, - this.opacity = 1.0, - this.icon, - this.hasColorFilter = true, - this.margin = 0}) + this.imageName, + @required this.child, + this.onTap, + Key key, + this.width, + this.height, + this.color, + this.opacity = 0.4, + this.hasColorFilter = true}) : super(key: key); final bool hasBorder; final String imageName; @@ -730,9 +801,8 @@ class DashboardItem extends StatelessWidget { final double height; final Color color; final double opacity; - final double margin; - final Widget icon; final bool hasColorFilter; + @override Widget build(BuildContext context) { return InkWell( @@ -742,25 +812,27 @@ class DashboardItem extends StatelessWidget { height: height != null ? height : MediaQuery.of(context).orientation == Orientation.portrait - ? MediaQuery.of(context).size.height * 0.19 - : MediaQuery.of(context).size.height * 0.35, + ? MediaQuery.of(context).size.height * 0.19 + : MediaQuery.of(context).size.height * 0.35, decoration: BoxDecoration( color: !hasBorder ? color != null - ? color - : HexColor('#050705').withOpacity(opacity) + ? color + : HexColor('#050705').withOpacity(opacity) : Colors.white, borderRadius: BorderRadius.circular(6.0), - border: hasBorder ? Border.all(width: 1.0, color: const Color(0xffcccccc)) : Border.all(width: 0.0, color: Colors.transparent), + border: hasBorder + ? Border.all(width: 1.0, color: const Color(0xffcccccc)) + : Border.all(width: 0.0, color: Colors.transparent), image: imageName != null ? DecorationImage( - image: ExactAssetImage('assets/images/$imageName'), - fit: BoxFit.cover, - colorFilter: hasColorFilter ? new ColorFilter.mode(Colors.black.withOpacity(0.2), BlendMode.dstIn) : null, - ) - : icon, + image: ExactAssetImage('assets/images/$imageName'), + fit: BoxFit.cover, + colorFilter: hasColorFilter ? new ColorFilter.mode( + Colors.black.withOpacity(0.2), BlendMode.dstIn) : null, + ) + : null, ), - margin: EdgeInsets.all(margin), child: Center( child: child, ), diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 3cf01ae6..8c8f17fb 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,6 +1,4 @@ -import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; @@ -26,6 +24,7 @@ import 'package:diplomaticquarterapp/uitl/HMG_Geofence.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; +import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart'; @@ -62,25 +61,28 @@ class _LandingPageState extends State with WidgetsBindingObserver { var themeNotifier; ///inject the user data - AuthenticatedUserObject authenticatedUserObject = locator(); + AuthenticatedUserObject authenticatedUserObject = locator< + AuthenticatedUserObject>(); final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); final authService = new AuthProvider(); var event = RobotProvider(); var familyFileProvider = family.FamilyFilesProvider(); + void _requestIOSPermissions() { flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation< - IOSFlutterLocalNotificationsPlugin>() + IOSFlutterLocalNotificationsPlugin>() ?.requestPermissions( - alert: true, - badge: true, - sound: true, - ); + alert: true, + badge: true, + sound: true, + ); } bool isPageNavigated = false; LocationUtils locationUtils; + _changeCurrentTab(int tab) { setState(() { currentTab = tab; @@ -108,9 +110,10 @@ class _LandingPageState extends State with WidgetsBindingObserver { if (!isPageNavigated) { isPageNavigated = true; Navigator.push( - context, - MaterialPageRoute( - builder: (context) => IncomingCall( + context, + MaterialPageRoute( + builder: (context) => + IncomingCall( incomingCallData: LandingPage.incomingCallData))) .then((value) { isPageNavigated = false; @@ -149,7 +152,10 @@ class _LandingPageState extends State with WidgetsBindingObserver { // HMG (Guest/Internet) Wifi Access [Zohaib Kambrani] HMGNetworkConnectivity(context, () { GifLoaderDialogUtils.showMyDialog(context); - PlatformBridge().connectHMGGuestWifi().then((value) => {GifLoaderDialogUtils.hideDialog(context)}); + PlatformBridge().connectHMGGuestWifi().then((value) => + { + GifLoaderDialogUtils.hideDialog(context) + }); }).checkAndConnectIfNoInternet(); if (Platform.isIOS) { @@ -167,12 +173,12 @@ class _LandingPageState extends State with WidgetsBindingObserver { } }); - if (results[Permission.location].isGranted) ; - if (results[Permission.storage].isGranted) ; - if (results[Permission.camera].isGranted) ; - if (results[Permission.photos].isGranted) ; - if (results[Permission.accessMediaLocation].isGranted) ; - if (results[Permission.calendar].isGranted) ; + if (results[Permission.location].isGranted); + if (results[Permission.storage].isGranted); + if (results[Permission.camera].isGranted); + if (results[Permission.photos].isGranted); + if (results[Permission.accessMediaLocation].isGranted); + if (results[Permission.calendar].isGranted); }); requestPermissions(); // }); @@ -298,8 +304,12 @@ class _LandingPageState extends State with WidgetsBindingObserver { ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: message, - okText: TranslationBase.of(context).confirm, - cancelText: TranslationBase.of(context).cancel_nocaps, + okText: TranslationBase + .of(context) + .confirm, + cancelText: TranslationBase + .of(context) + .cancel_nocaps, okFunction: () => {}, cancelFunction: () => {}); dialog.showAlertDialog(context); @@ -325,149 +335,6 @@ class _LandingPageState extends State with WidgetsBindingObserver { return permissionResults; } - @override - Widget build(BuildContext context) { - projectViewModel = Provider.of(context); - - return Scaffold( - appBar: AppBar( - elevation: 0, - textTheme: TextTheme( - headline6: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), - ), - title: Text( - getText(currentTab).toUpperCase(), - style: TextStyle( - fontWeight: FontWeight.bold, - color: Colors.white, - fontFamily: projectViewModel.isArabic ? 'Cairo' : 'WorkSans'), - // bold: true, - // color: Colors.white, - ), - leading: Builder( - builder: (BuildContext context) { - return new Stack( - children: [ - IconButton( - icon: Icon(Icons.menu), - color: Colors.white, - onPressed: () => Scaffold.of(context).openDrawer(), - ), - notificationCount != '' - ? new Positioned( - right: projectViewModel.isArabic ? 35 : 0, - top: 5, - child: new Container( - padding: EdgeInsets.all(4), - decoration: new BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.circular(20), - ), - constraints: BoxConstraints( - minWidth: 20, - minHeight: 20, - ), - child: new Text( - notificationCount, - style: new TextStyle( - color: Colors.white, - fontSize: projectViewModel.isArabic ? 8 : 9, - ), - textAlign: TextAlign.center, - ), - ), - ) - : SizedBox() - ], - ); - }, - ), - actions: [ - IconButton( - //iconSize: 70, - icon: Icon( - projectViewModel.isLogin ? Icons.settings : Icons.login, - color: Colors.white, - ), - onPressed: () { - if (projectViewModel.isLogin) - Navigator.of(context).pushNamed( - SETTINGS, - ); - else - login(); - }, //do something, - ) - ], - centerTitle: true, - ), - drawer: SafeArea(child: AppDrawer()), - extendBody: true, - body: PageView( - physics: NeverScrollableScrollPhysics(), - controller: pageController, - children: [ - HomePage( - goToMyProfile: () { - _changeCurrentTab(1); - }, - ), - MedicalProfilePage(), - BookingOptions(), - MyFamily(isAppbarVisible: false), - ToDo(isShowAppBar: false), - ], // Please do not remove the BookingOptions from this array - ), - bottomNavigationBar: BottomNavBar( - changeIndex: _changeCurrentTab, - index: currentTab, - ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, - floatingActionButton: currentTab == 0 - ? FloatingButton( - elevation: true, - onTap: () { - _changeCurrentTab(2); - }) - : null); - } - - triggerRobot() { - event.setValue({"isRobot": 'true'}); - } - - getText(currentTab) { - switch (currentTab) { - case 0: - return TranslationBase.of(context).home; - case 1: - return TranslationBase.of(context).medicalProfile; - case 2: - return TranslationBase.of(context).mySchedule; - case 3: - return TranslationBase.of(context).services; - case 4: - return TranslationBase.of(context).bookAppo; - } - } - - void checkUserStatus(token) async { - var result = await authService - .selectDeviceImei(token) - ; - setUserValues(result); - registerGeofences(); - if (await sharedPref.getObject(USER_PROFILE) != null) { - var data = AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); - if (data != null) { - authService.registeredAuthenticatedUser(data, token, 0, 0).then((res) => {print(res)}); - authService.getDashboard().then((value) => { - setState(() { - notificationCount = value['List_PatientDashboard'][0]['UnreadPatientNotificationCount'].toString(); - }) - }); - } - } setTheme() async { // // defaultTheme = @@ -508,6 +375,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { // ); // themeNotifier.setTheme(defaultTheme); } + void checkUserStatus(token, {isLoader = true}) async { if (isLoader) //GifLoaderDialogUtils.showMyDialog(context); @@ -519,7 +387,8 @@ class _LandingPageState extends State with WidgetsBindingObserver { }); } - static Future myBackgroundMessageHandler(Map message) async { + static Future myBackgroundMessageHandler( + Map message) async { Map myMap = new Map.from(message['data']); if (message.containsKey('data')) { print("myBackgroundMessageHandler Inside"); @@ -548,27 +417,30 @@ class _LandingPageState extends State with WidgetsBindingObserver { _changeCurrentTab(2); } } - registerGeofences() async { - await locator().getAllGeoZones(GeoZonesRequestModel()); - void doIt() { - getUserInformation().then((value) { - if (value != null) projectViewModel.platformBridge().registerHmgGeofences(); - }); - } + registerGeofences() async { + await locator().getAllGeoZones(GeoZonesRequestModel()); - if (await Permission.location.isGranted) { - doIt(); - } else { - [Permission.location].request().then((value) async { - if (await Permission.location.isGranted) { - doIt(); - } - }); - } + void doIt() { + getUserInformation().then((value) { + if (value != null) projectViewModel.platformBridge() + .registerHmgGeofences(); + }); + } - requestPermissions().then((results) {}); + if (await Permission.location.isGranted) { + doIt(); + } else { + [Permission.location].request().then((value) async { + if (await Permission.location.isGranted) { + doIt(); + } + }); } + + requestPermissions().then((results) {}); + } + login() async { var data = await sharedPref.getObject(IMEI_USER_DATA); sharedPref.remove(REGISTER_DATA_FOR_LOGIIN); @@ -600,26 +472,167 @@ class _LandingPageState extends State with WidgetsBindingObserver { getNotificationCount(token) async { if (await sharedPref.getObject(USER_PROFILE) != null) { var data = - AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); + AuthenticatedUser.fromJson(await sharedPref.getObject(USER_PROFILE)); if (data != null) { authService .registeredAuthenticatedUser(data, token, 0, 0) .then((res) => {print(res)}); - authService.getDashboard().then((value) => { - setState(() { - notificationCount = value['List_PatientDashboard'][0] - ['UnreadPatientNotificationCount'] > - 99 - ? '99+' - : value['List_PatientDashboard'][0] - ['UnreadPatientNotificationCount'] - .toString(); - - sharedPref.setString(NOTIFICATION_COUNT, notificationCount); - }) - }); + authService.getDashboard().then((value) => + { + setState(() { + notificationCount = value['List_PatientDashboard'][0] + ['UnreadPatientNotificationCount'] > + 99 + ? '99+' + : value['List_PatientDashboard'][0] + ['UnreadPatientNotificationCount'] + .toString(); + + sharedPref.setString(NOTIFICATION_COUNT, notificationCount); + }) + }); familyFileProvider.getSharedRecordByStatus(); } } } + + + @override + Widget build(BuildContext context) { + projectViewModel = Provider.of(context); + + return Scaffold( + appBar: AppBar( + elevation: 0, + textTheme: TextTheme( + headline6: TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), + ), + title: Text( + getText(currentTab).toUpperCase(), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.white, + fontFamily: projectViewModel.isArabic ? 'Cairo' : 'WorkSans'), + // bold: true, + // color: Colors.white, + ), + leading: Builder( + builder: (BuildContext context) { + return new Stack( + children: [ + IconButton( + icon: Icon(Icons.menu), + color: Colors.white, + onPressed: () => Scaffold.of(context).openDrawer(), + ), + notificationCount != '' + ? new Positioned( + right: projectViewModel.isArabic ? 35 : 0, + top: 5, + child: new Container( + padding: EdgeInsets.all(4), + decoration: new BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(20), + ), + constraints: BoxConstraints( + minWidth: 20, + minHeight: 20, + ), + child: new Text( + notificationCount, + style: new TextStyle( + color: Colors.white, + fontSize: projectViewModel.isArabic ? 8 : 9, + ), + textAlign: TextAlign.center, + ), + ), + ) + : SizedBox() + ], + ); + }, + ), + actions: [ + IconButton( + //iconSize: 70, + icon: Icon( + projectViewModel.isLogin ? Icons.settings : Icons.login, + color: Colors.white, + ), + onPressed: () { + if (projectViewModel.isLogin) + Navigator.of(context).pushNamed( + SETTINGS, + ); + else + login(); + }, //do something, + ) + ], + centerTitle: true, + ), + drawer: SafeArea(child: AppDrawer()), + extendBody: true, + body: PageView( + physics: NeverScrollableScrollPhysics(), + controller: pageController, + children: [ + HomePage( + goToMyProfile: () { + _changeCurrentTab(1); + }, + ), + MedicalProfilePage(), + BookingOptions(), + MyFamily(isAppbarVisible: false), + ToDo(isShowAppBar: false), + ], // Please do not remove the BookingOptions from this array + ), + bottomNavigationBar: BottomNavBar( + changeIndex: _changeCurrentTab, + index: currentTab, + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + floatingActionButton: currentTab == 0 + ? FloatingButton( + elevation: true, + onTap: () { + _changeCurrentTab(2); + }) + : null); + } + + triggerRobot() { + event.setValue({"isRobot": 'true'}); + } + + getText(currentTab) { + switch (currentTab) { + case 0: + return TranslationBase + .of(context) + .home; + case 1: + return TranslationBase + .of(context) + .medicalProfile; + case 2: + return TranslationBase + .of(context) + .mySchedule; + case 3: + return TranslationBase + .of(context) + .services; + case 4: + return TranslationBase + .of(context) + .bookAppo; + } + } } + + diff --git a/lib/pages/medical/balance/advance_payment_page.dart b/lib/pages/medical/balance/advance_payment_page.dart index 2b61596c..c48906ca 100644 --- a/lib/pages/medical/balance/advance_payment_page.dart +++ b/lib/pages/medical/balance/advance_payment_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/model/my_balance/patient_info.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/my_balance_view_model.dart'; @@ -10,6 +11,7 @@ import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/balance/dialogs/SelectHospitalDialog.dart'; import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart'; import 'package:diplomaticquarterapp/uitl/app_toast.dart'; +import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/utils.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index e61d9709..ade69f45 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -18,9 +18,9 @@ import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescriptions_h 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/pages/medical/vital_sign/vital_sign_details_screen.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/uitl/utils.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'; @@ -54,12 +54,15 @@ class MedicalProfilePage extends StatefulWidget { class _MedicalProfilePageState extends State { var authProvider = new AuthProvider(); - + List medical=List(); + ProjectViewModel projectViewModel; @override Widget build(BuildContext context) { - ProjectViewModel projectViewModel = Provider.of(context); + projectViewModel = Provider.of(context); var appoCountProvider = Provider.of(context); - return BaseView( + + List myMedicalList = Utils.myMedicalList(projectViewModel: projectViewModel,context: context,count: appoCountProvider.count,isLogin: projectViewModel.isLogin); + return BaseView( onModelReady: (model) => model.getAppointmentHistory(), builder: (_, model, widget) => AppScaffold( isShowDecPage: false, @@ -85,410 +88,44 @@ class _MedicalProfilePageState extends State { ), if (model.isLogin) ListView.builder( - itemBuilder: (context, index) => TimeLineWidget( + itemBuilder: (context, index) => + TimeLineWidget( isUp: index % 2 == 1, - appoitmentAllHistoryResul: model.appoitmentAllHistoryResultList[index], + appoitmentAllHistoryResul: model + .appoitmentAllHistoryResultList[index], ), - itemCount: model.appoitmentAllHistoryResultList.length, + itemCount: model + .appoitmentAllHistoryResultList.length, scrollDirection: Axis.horizontal, reverse: !projectViewModel.isArabic, ), ], ), ), + SizedBox(height: 50,), Padding( padding: EdgeInsets.symmetric(vertical: 5.0), - child: Column( - children: [ - if (model.isLogin) - Container( - width: double.infinity, - height: 55, - ), - Row( - children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: MyAppointments(), - ), - ); - }, - child: authProvider.isLogin - ? Stack(children: [ - MedicalProfileItem( - title: TranslationBase.of(context).myAppointments, - imagePath: 'my_appointment_icon.png', - subTitle: TranslationBase.of(context).myAppointmentsList, - hasBadge: true, - ), - Positioned( - right: 0.0, - child: Badge( - toAnimate: false, - position: BadgePosition.topEnd(), - shape: BadgeShape.circle, - badgeColor: Color(0xFF40ACC9).withOpacity(1.0), - borderRadius: BorderRadius.circular(8), - badgeContent: Container( - padding: EdgeInsets.all(2.0), - child: Text(appoCountProvider.count.toString(), style: TextStyle(color: Colors.white, fontSize: 16.0)), - ), - ), - ), - ]) - : MedicalProfileItem( - title: TranslationBase.of(context).myAppointments, - imagePath: 'my_appointment_icon.png', - subTitle: TranslationBase.of(context).myAppointmentsList, - hasBadge: true, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, FadePage(page: LabsHomePage())), - child: MedicalProfileItem( - title: TranslationBase.of(context).lab, - imagePath: 'lab_result_icon.png', - subTitle: TranslationBase.of(context).labSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, FadePage(page: RadiologyHomePage())), - child: MedicalProfileItem( - title: TranslationBase.of(context).radiology, - imagePath: 'radiology_icon.png', - subTitle: TranslationBase.of(context).radiologySubtitle, - ), - ), - ), - ], - ), - Row( - children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push( - context, - FadePage( - page: HomePrescriptionsPage(), - ), - ); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).medicines, - imagePath: 'prescription_icon.png', - subTitle: TranslationBase.of(context).medicinesSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push( - context, - FadePage( - page: VitalSignDetailsScreen(), - ), - ), - child: MedicalProfileItem( - title: TranslationBase.of(context).vitalSigns, - imagePath: 'vital_signs.png', - subTitle: TranslationBase.of(context).vitalSignsSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, FadePage(page: ActiveMedicationsPage())), - child: MedicalProfileItem( - title: TranslationBase.of(context).myMedical, - imagePath: 'active_medications.png', - subTitle: TranslationBase.of(context).myMedicalSubtitle, - ), - ), - ), - ], - ), - Row( - children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, - FadePage(page: VitalSignDetailsScreen())); - Navigator.push( - context, - FadePage( - page: DoctorHomePage(), - ), - ); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context) - .vitalSigns, - imagePath: 'vital_sign_icon.png', - subTitle: TranslationBase.of(context) - .vitalSignsSubtitle, - title: TranslationBase.of(context).myDoctor, - imagePath: 'doctor_icon.png', - subTitle: TranslationBase.of(context).myDoctorSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: EyeMeasurementsPage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).eye, - imagePath: 'eye_measurement_icon.png', - subTitle: TranslationBase.of(context).eyeSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: InsuranceCard())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).insurance, - imagePath: 'insurance_card_icon.png', - subTitle: TranslationBase.of(context).insuranceSubtitle, - ), - ), - ), - ], - ), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: InsuranceUpdate())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).updateInsurance, - imagePath: 'insurance_update_icon_.png', - subTitle: TranslationBase.of(context).updateInsuranceSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: InsuranceApproval())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).insuranceApproval, - imagePath: 'insurance_approvals_icon.png', - subTitle: TranslationBase.of(context).insuranceApprovalSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () => Navigator.push(context, FadePage(page: AllergiesPage())), - child: MedicalProfileItem( - title: TranslationBase.of(context).allergies, - imagePath: 'my_allergies_icon.png', - subTitle: TranslationBase.of(context).allergiesSubtitle, - ), - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: MyVaccines())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).myVaccines, - imagePath: 'my_vaccines_icon.png', - subTitle: TranslationBase.of(context).myVaccinesSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: HomeReportPage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).medical, - imagePath: 'medical_reports_icon.png', - subTitle: TranslationBase.of(context).medicalSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: MonthlyReportsPage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).monthly, - imagePath: 'monthly_reports_icon.png', - subTitle: TranslationBase.of(context).monthlySubtitle, - ), - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: PatientSickLeavePage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).sick, - imagePath: 'sick_leaves_icons.png', - subTitle: TranslationBase.of(context).sickSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: MyBalancePage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).myBalance, - imagePath: 'check-in.png', - subTitle: TranslationBase.of(context).myBalanceSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: MedicalProfileItem( - title: TranslationBase.of(context).patientCall, - imagePath: 'medical_history_icon.png', - subTitle: TranslationBase.of(context).patientCallSubtitle, - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - //TODO - onTap: () { - Navigator.push(context, FadePage(page: SmartWatchInstructions())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).smartWatches, - imagePath: 'smartwatch_icon.png', - subTitle: TranslationBase.of(context).smartWatchesSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: MyTrackers())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).myTrackers, - imagePath: 'my_tracker_icon.png', - subTitle: TranslationBase.of(context).myTrackersSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( - onTap: () { - Navigator.push(context, FadePage(page: AskDoctorHomPage())); - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).askYour, - imagePath: 'ask_doctor_icon.png', - subTitle: TranslationBase.of(context).askYourSubtitle, - ), - ), - ), - ]), - Row(children: [ - Expanded( - flex: 1, - child: InkWell( - //TODO - onTap: () { - if (authProvider.isLogin) { - String patientID = authProvider.getAuthenticatedUser().patientID.toString(); - GifLoaderDialogUtils.showMyDialog(context); - projectViewModel.platformBridge().connectHMGInternetWifi(patientID).then((value) => {GifLoaderDialogUtils.hideDialog(context)}); - } else { - AlertDialogBox( - context: context, - confirmMessage: "Please login with your account first to use this feature", - okText: "OK", - okFunction: () { - AlertDialogBox.closeAlertDialog(context); - }).showAlertDialog(context); - } - }, - child: MedicalProfileItem( - title: TranslationBase.of(context).internet, - imagePath: 'insurance_card_icon.png', - subTitle: TranslationBase.of(context).internetSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: InkWell( -// onTap: () { -// Navigator.push( -// context, FadePage(page: InsuranceApproval())); -// }, - child: MedicalProfileItem( - title: TranslationBase.of(context).chatbot, - imagePath: 'insurance_approvals_icon.png', - subTitle: TranslationBase.of(context).chatbotSubtitle, - ), - ), - ), - Expanded( - flex: 1, - child: Container(), - ), - ]), - SizedBox( - height: MediaQuery.of(context).size.height * 0.12, - ) - ], + child: GridView.builder( + shrinkWrap: true, + primary: false, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: MediaQuery.of(context).size.width / (MediaQuery.of(context).size.height / 2.40), + ), + itemCount: myMedicalList.length, + itemBuilder: (BuildContext context, int index) { + + return myMedicalList[index]; + }, ), ) ], ), + SizedBox( + height: + MediaQuery.of(context).size.height * 0.12, + ), if (model.user != null && model.isLogin) Positioned( top: 185, @@ -500,9 +137,14 @@ class _MedicalProfilePageState extends State { decoration: BoxDecoration( color: Theme.of(context).primaryColor, 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)), + 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, mainAxisAlignment: MainAxisAlignment.spaceAround, @@ -511,7 +153,9 @@ class _MedicalProfilePageState extends State { height: 8, ), Texts( - model.user.firstName + " " + model.user.lastName, + model.user.firstName + + " " + + model.user.lastName, color: Colors.white, bold: true, ), @@ -543,4 +187,20 @@ class _MedicalProfilePageState extends State { ), ); } + + fullMedicalData(){ + if(projectViewModel.havePrivilege(5)) + {} + } +} + +class Medical{ + + final String title; + final String imagePath; + final String subTitle; + final Widget page; + + Medical({this.title, this.imagePath, this.subTitle, this.page}); + } diff --git a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart index 06a31848..43bc9f0a 100644 --- a/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart +++ b/lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart @@ -48,7 +48,7 @@ class VitalSingChartAndDetials extends StatelessWidget { if (vitalList.length > 0) { vitalList.reversed.toList().forEach( (element) { - if( element.toJson()[viewKey]?.toInt()!=0) + if( element.toJson()[viewKey]!=null && element.toJson()[viewKey]?.toInt()!=0) timeSeriesData.add( TimeSeriesSales2( new DateTime(element.vitalSignDate.year, element.vitalSignDate.month, element.vitalSignDate.day), diff --git a/lib/uitl/LocalNotification.dart b/lib/uitl/LocalNotification.dart index 0b148f49..e0367ba3 100644 --- a/lib/uitl/LocalNotification.dart +++ b/lib/uitl/LocalNotification.dart @@ -19,9 +19,10 @@ class LocalNotification { _instance._onNotificationClick = onNotificationClick; _instance._initialize(); }else{ - assert(false,(){ - "LocalNotification Already Initialized"; - }); + // assert(false,(){ + // //TODO fix it + // "LocalNotification Already Initialized"; + // }); } } diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 3e1e4892..34c0e58d 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -2,7 +2,33 @@ import 'dart:convert'; import 'dart:core'; import 'dart:typed_data'; +import 'package:badges/badges.dart'; import 'package:connectivity/connectivity.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/Blood/my_balance_page.dart'; +import 'package:diplomaticquarterapp/pages/MyAppointments/MyAppointments.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_approval_screen.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; +import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; +import 'package:diplomaticquarterapp/pages/medical/active_medications/ActiveMedicationsPage.dart'; +import 'package:diplomaticquarterapp/pages/medical/allergies_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/ask_doctor/ask_doctor_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/doctor/doctor_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/eye/EyeMeasurementsPage.dart'; +import 'package:diplomaticquarterapp/pages/medical/labs/labs_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers.dart'; +import 'package:diplomaticquarterapp/pages/medical/patient_sick_leave_page.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/reports/monthly_reports.dart'; +import 'package:diplomaticquarterapp/pages/medical/reports/report_home_page.dart'; +import 'package:diplomaticquarterapp/pages/medical/smart_watch_health_data/smart_watch_instructions.dart'; +import 'package:diplomaticquarterapp/pages/medical/vital_sign/vital_sign_details_screen.dart'; +import 'package:diplomaticquarterapp/pages/vaccine/my_vaccines_screen.dart'; +import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -160,7 +186,340 @@ class Utils { .hasMatch(email); } + static List myMedicalList({ProjectViewModel projectViewModel, BuildContext context, bool isLogin, count}) { + List medical = List(); + if (projectViewModel.havePrivilege(5)) { + medical.add(InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: MyAppointments(), + ), + ); + }, + child: isLogin + ? Container( + height: 120, + child: Stack(children: [ + MedicalProfileItem( + title: TranslationBase.of(context).myAppointments, + imagePath: 'my_appointment_icon.png', + subTitle: TranslationBase.of(context).myAppointmentsList, + hasBadge: true, + ), + Positioned( + right: 0.0, + child: Badge( + toAnimate: false, + position: BadgePosition.topEnd(), + shape: BadgeShape.circle, + badgeColor: Color(0xFF40ACC9).withOpacity(1.0), + borderRadius: BorderRadius.circular(8), + badgeContent: Container( + padding: EdgeInsets.all(2.0), + child: Text(count.toString(), + style: + TextStyle(color: Colors.white, fontSize: 16.0)), + ), + ), + ), + ]), + ) + : MedicalProfileItem( + title: TranslationBase.of(context).myAppointments, + imagePath: 'my_appointment_icon.png', + subTitle: TranslationBase.of(context).myAppointmentsList, + hasBadge: true, + ), + )); + } + if (projectViewModel.havePrivilege(10)) { + medical.add(InkWell( + onTap: () => Navigator.push(context, FadePage(page: LabsHomePage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).lab, + imagePath: 'lab_result_icon.png', + subTitle: TranslationBase.of(context).labSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(7)) { + medical.add(InkWell( + onTap: () => + Navigator.push(context, FadePage(page: RadiologyHomePage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).radiology, + imagePath: 'radiology_icon.png', + subTitle: TranslationBase.of(context).radiologySubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(12)) { + medical.add(InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: HomePrescriptionsPage(), + ), + ); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).medicines, + imagePath: 'prescription_icon.png', + subTitle: TranslationBase.of(context).medicinesSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(25)) { + medical.add(InkWell( + onTap: () => Navigator.push( + context, + FadePage( + page: VitalSignDetailsScreen(), + ), + ), + child: MedicalProfileItem( + title: TranslationBase.of(context).vitalSigns, + imagePath: 'vital_signs.png', + subTitle: TranslationBase.of(context).vitalSignsSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(48)) { + medical.add(InkWell( + onTap: () => + Navigator.push(context, FadePage(page: ActiveMedicationsPage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).myMedical, + imagePath: 'active_medications.png', + subTitle: TranslationBase.of(context).myMedicalSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(6)) { + medical.add(InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: DoctorHomePage(), + ), + ); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myDoctor, + imagePath: 'doctor_icon.png', + subTitle: TranslationBase.of(context).myDoctorSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(14)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: EyeMeasurementsPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).eye, + imagePath: 'eye_measurement_icon.png', + subTitle: TranslationBase.of(context).eyeSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(22)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: InsuranceCard())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).insurance, + imagePath: 'insurance_card_icon.png', + subTitle: TranslationBase.of(context).insuranceSubtitle, + ), + )); + } + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: InsuranceUpdate())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).updateInsurance, + imagePath: 'insurance_update_icon_.png', + subTitle: TranslationBase.of(context).updateInsuranceSubtitle, + ), + )); + + if (projectViewModel.havePrivilege(18)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: InsuranceApproval())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).insuranceApproval, + imagePath: 'insurance_approvals_icon.png', + subTitle: TranslationBase.of(context).insuranceApprovalSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(23)) { + medical.add(InkWell( + onTap: () => Navigator.push(context, FadePage(page: AllergiesPage())), + child: MedicalProfileItem( + title: TranslationBase.of(context).allergies, + imagePath: 'my_allergies_icon.png', + subTitle: TranslationBase.of(context).allergiesSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(26)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MyVaccines())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myVaccines, + imagePath: 'my_vaccines_icon.png', + subTitle: TranslationBase.of(context).myVaccinesSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(20)) + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: HomeReportPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).medical, + imagePath: 'medical_reports_icon.png', + subTitle: TranslationBase.of(context).medicalSubtitle, + ), + )); + + if (projectViewModel.havePrivilege(19)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MonthlyReportsPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).monthly, + imagePath: 'monthly_reports_icon.png', + subTitle: TranslationBase.of(context).monthlySubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(16)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: PatientSickLeavePage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).sick, + imagePath: 'sick_leaves_icons.png', + subTitle: TranslationBase.of(context).sickSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(47)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MyBalancePage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myBalance, + imagePath: 'check-in.png', + subTitle: TranslationBase.of(context).myBalanceSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(61)) { + medical.add(MedicalProfileItem( + title: TranslationBase.of(context).patientCall, + imagePath: 'medical_history_icon.png', + subTitle: TranslationBase.of(context).patientCallSubtitle, + )); + } + + if (projectViewModel.havePrivilege(24)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: MyTrackers())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).myTrackers, + imagePath: 'my_tracker_icon.png', + subTitle: TranslationBase.of(context).myTrackersSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(30)) + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: SmartWatchInstructions())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).smartWatches, + imagePath: 'smartwatch_icon.png', + subTitle: TranslationBase.of(context).smartWatchesSubtitle, + ), + )); + + if (projectViewModel.havePrivilege(28)) { + medical.add(InkWell( + onTap: () { + Navigator.push(context, FadePage(page: AskDoctorHomPage())); + }, + child: MedicalProfileItem( + title: TranslationBase.of(context).askYour, + imagePath: 'ask_doctor_icon.png', + subTitle: TranslationBase.of(context).askYourSubtitle, + ), + )); + } + if (projectViewModel.havePrivilege(32)) { + medical.add(InkWell( + //TODO +// onTap: () { +// Navigator.push( +// context, FadePage(page: DoctorHomePage())); +// }, + child: MedicalProfileItem( + title: TranslationBase.of(context).internet, + imagePath: 'insurance_card_icon.png', + subTitle: TranslationBase.of(context).internetSubtitle, + ), + )); + } + + if (projectViewModel.havePrivilege(40)) { + medical.add(InkWell( +// onTap: () { +// Navigator.push( +// context, FadePage(page: InsuranceApproval())); +// }, + child: MedicalProfileItem( + title: TranslationBase.of(context).chatbot, + imagePath: 'insurance_approvals_icon.png', + subTitle: TranslationBase.of(context).chatbotSubtitle, + ), + )); + } + + return medical; + } } + // extension function that use in iterations(list.. etc) to iterate items and get index and item it self extension IndexedIterable on Iterable { Iterable mapIndexed(T Function(E e, int i) f) { diff --git a/lib/widgets/weather_slider/weather_slider.dart b/lib/widgets/weather_slider/weather_slider.dart new file mode 100644 index 00000000..cf91520a --- /dev/null +++ b/lib/widgets/weather_slider/weather_slider.dart @@ -0,0 +1,191 @@ +import 'package:diplomaticquarterapp/core/model/weahter/weather_model.dart'; +import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class WeatherSlider extends StatelessWidget { + // final width; + // final LinearGradient color; + final GetCityInfoList data; + WeatherSlider(this.data); + LinearGradient red = LinearGradient( + colors: [ + Colors.redAccent[100], + Colors.redAccent + ]); + LinearGradient green = LinearGradient( + colors: [ + Colors.greenAccent[100], + Colors.greenAccent + ]); + LinearGradient grey = LinearGradient( + colors: [ + Colors.grey[100], + Colors.grey + ]); + LinearGradient orange = LinearGradient( + colors: [ + Colors.orangeAccent[100], + Colors.orange + ]); + LinearGradient yellow = LinearGradient( + colors: [ + Colors.yellow[100], + Colors.yellow[600] + ]); + @override + Widget build(BuildContext context) { + // TODO: implement build + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top:10), + child: AppText(data.name)), + AppText( + data.category, + fontSize: 24, + ), + Padding( + padding: EdgeInsets.all(10), + child: Stack( + children: [ + Container( + margin: EdgeInsets.only(bottom:10), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.grey[100], Colors.grey[400]]), + borderRadius: BorderRadius.circular(10)), + height: 15, + width: MediaQuery.of(context).size.width, + child: SizedBox(), + ), + Positioned( + top: 0, + child: Container( + decoration: BoxDecoration( + gradient: data.colorName =='red' ? red : data.colorName =='orange' ? orange : data.colorName =='green' ? green : data.colorName == 'yellow' ? yellow : grey, + borderRadius: BorderRadius.circular(10)), + height: 15, + width: (MediaQuery.of(context).size.width * (double.parse(data.value) / 10)), + padding: EdgeInsets.all(15), + child: SizedBox(), + )), + Positioned(child: Container( + height: 0, + width:0, + decoration: ShapeDecoration( + color:data.colorName =='red' ? Colors.redAccent : data.colorName =='orange' ? Colors.orangeAccent : data.colorName =='green' ? Colors.greenAccent : data.colorName == 'yellow' ? Colors.yellowAccent : Colors.grey, + shape: MessageBorder(), + + )),top:25, left: (MediaQuery.of(context).size.width * (double.parse(data.value) / 10)),) + + ], + ), + + ), + Padding( + padding: EdgeInsets.only(top:10), + child: data.isValuesReversed == false ? Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText( + data.categoriesNames.category1, + fontSize: 12, + color: data.categoriesNames.category1== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category1== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category1== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category1== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + ), + AppText( + data.categoriesNames.category2, + fontSize: 12, + color: data.categoriesNames.category2== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category2== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category2== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category2== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category3, + fontSize: 12, + color: data.categoriesNames.category3== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category3== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category3== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category3== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category4, + fontSize: 12, + color: data.categoriesNames.category4== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category4== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category4== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category4== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category5, + fontSize: 12, + color: data.categoriesNames.category5== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category5== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category5== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category5== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + ], + ) : Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + AppText( + data.categoriesNames.category5, + fontSize: 12, + color: data.categoriesNames.category5== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category5== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category5== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category5== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + ), + AppText( + data.categoriesNames.category4, + fontSize: 12, + color: data.categoriesNames.category4== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category4== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category4== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category4== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category3, + fontSize: 12, + color: data.categoriesNames.category3== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category3== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category3== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category3== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category2, + fontSize: 12, + color: data.categoriesNames.category2== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category2== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category2== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category2== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + AppText( + data.categoriesNames.category1, + fontSize: 12, + color: data.categoriesNames.category1== data.category && data.colorName=='red' ? Colors.redAccent : data.categoriesNames.category1== data.category && data.colorName=='orange' ? Colors.orangeAccent : data.categoriesNames.category1== data.category && data.colorName=='green' ? Colors.greenAccent : data.categoriesNames.category1== data.category && data.colorName=='yellow' ? Colors.yellow[900] : Colors.black + + ), + ], + )), + Padding( + padding: EdgeInsets.all(15), + child:Divider()) + ], + ); + + } +} +class MessageBorder extends ShapeBorder { + final bool usePadding; + + MessageBorder({this.usePadding = true}); + + @override + EdgeInsetsGeometry get dimensions => EdgeInsets.only(bottom: usePadding? 0 : 0); + + @override + Path getInnerPath(Rect rect, {TextDirection textDirection}) => null; + + @override + Path getOuterPath(Rect rect, {TextDirection textDirection}) { + rect = Rect.fromPoints(rect.bottomRight, rect.bottomLeft - Offset(0, 0)); + return Path() + ..addRRect(RRect.fromRectAndRadius(rect, Radius.circular(rect.height / 2))) + ..moveTo(rect.topCenter.dx - 10, rect.topCenter.dy) + ..relativeLineTo(10, -10) + ..relativeLineTo(10,10) + ..close(); + } + + @override + void paint(Canvas canvas, Rect rect, {TextDirection textDirection}) {} + + @override + ShapeBorder scale(double t) => this; +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 00fb4558..2cac9435 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -80,8 +80,6 @@ dependencies: # charts charts_flutter: ^0.9.0 - #image banner slider - carousel_slider: ^2.3.1 google_maps_flutter: ^1.0.3 From 952e106531cbaa76f0b15957b33d12d6eaac1b21 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 6 Jan 2021 14:29:25 +0200 Subject: [PATCH 33/34] return privilege --- .../all_habib_medical_service_page.dart | 10 +++++++- lib/pages/DrawerPages/family/my-family.dart | 1 + lib/pages/landing/landing_page.dart | 16 ++++--------- lib/pages/login/confirm-login.dart | 3 ++- lib/pages/login/login.dart | 2 +- lib/pages/medical/eye/ContactLensPage.dart | 4 ++++ .../prescription_items_page.dart | 5 +++- .../radiology/radiology_details_page.dart | 12 +++++++--- .../medical/reports/report_home_page.dart | 7 ++++-- lib/pages/paymentService/payment_service.dart | 2 ++ lib/pages/vaccine/my_vaccines_screen.dart | 4 ++++ lib/splashPage.dart | 23 ++++++++++++------- .../bottom_navigation/bottom_nav_bar.dart | 7 ++++-- .../data_display/medical/doctor_card.dart | 2 +- lib/widgets/drawer/app_drawer_widget.dart | 10 +++++--- 15 files changed, 73 insertions(+), 35 deletions(-) diff --git a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart index bc7584cd..1359ab8d 100644 --- a/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart +++ b/lib/pages/AlHabibMedicalService/all_habib_medical_service_page.dart @@ -1,5 +1,6 @@ import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/service/weather_service.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20health_calculators.dart'; import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/E-Referral/e_referral_index_page.dart'; @@ -33,6 +34,7 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class AllHabibMedicalService extends StatefulWidget { @@ -66,6 +68,7 @@ class _AllHabibMedicalServiceState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( isShowAppBar: true, appBarTitle: TranslationBase.of(context).alhabiServices, @@ -258,6 +261,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/family_menu_icon_red.png', title: 'My Family', ), + if(projectViewModel.havePrivilege(35)) ServicesContainer( onTap: () => Navigator.push( context, @@ -278,6 +282,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/upcoming_icon_bottom_bar.png', title: TranslationBase.of(context).todoList, ), + if(projectViewModel.havePrivilege(42)) ServicesContainer( onTap: () => Navigator.push( context, @@ -285,7 +290,8 @@ class _AllHabibMedicalServiceState extends State { ), imageLocation: 'assets/images/new-design/body_icon.png', title: 'Symptom Checker'), - ServicesContainer( + if(projectViewModel.havePrivilege(36)) + ServicesContainer( onTap: () => Navigator.push( context, FadePage(page: BloodDonationPage()), @@ -315,6 +321,7 @@ class _AllHabibMedicalServiceState extends State { 'assets/images/new-design/health_convertor_icon.png', title: 'Health Converter', ), + if(projectViewModel.havePrivilege(38)) ServicesContainer( onTap: () => Navigator.push( context, @@ -325,6 +332,7 @@ class _AllHabibMedicalServiceState extends State { imageLocation: 'assets/images/new-design/water_icon.png', title: 'H2O', ), + if(projectViewModel.havePrivilege(41)) ServicesContainer( onTap: () => Navigator.push( context, diff --git a/lib/pages/DrawerPages/family/my-family.dart b/lib/pages/DrawerPages/family/my-family.dart index 84ecb516..d1c0af58 100644 --- a/lib/pages/DrawerPages/family/my-family.dart +++ b/lib/pages/DrawerPages/family/my-family.dart @@ -708,6 +708,7 @@ class _MyFamily extends State with TickerProviderStateMixin { loginAfter(result, context) async { //GifLoaderDialogUtils.hideDialog(context); + Provider.of(context, listen: false).setPrivilege(privilegeList: result,isLoginChild: true); var currentLang = await sharedPref.getString(APP_LANGUAGE); result = list.CheckActivationCode.fromJson(result); var familyFile = await sharedPref.getObject(FAMILY_FILE); diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index 8c8f17fb..e1dd6b63 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -612,21 +612,13 @@ class _LandingPageState extends State with WidgetsBindingObserver { getText(currentTab) { switch (currentTab) { case 0: - return TranslationBase - .of(context) - .home; + return TranslationBase.of(context).home; case 1: - return TranslationBase - .of(context) - .medicalProfile; + return TranslationBase.of(context).medicalProfile; case 2: - return TranslationBase - .of(context) - .mySchedule; + return TranslationBase.of(context).bookAppo; case 3: - return TranslationBase - .of(context) - .services; + return TranslationBase.of(context).services; case 4: return TranslationBase .of(context) diff --git a/lib/pages/login/confirm-login.dart b/lib/pages/login/confirm-login.dart index 8dbf27f4..646158db 100644 --- a/lib/pages/login/confirm-login.dart +++ b/lib/pages/login/confirm-login.dart @@ -510,7 +510,8 @@ class _ConfirmLogin extends State { .then((result) => { if (result is Map) { - result = CheckActivationCode.fromJson(result), + projectViewModel.setPrivilege(privilegeList: result), + result = CheckActivationCode.fromJson(result), if (this.registerd_data != null && this.registerd_data.isRegister == true) { diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 97884596..c2a943d2 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -243,7 +243,7 @@ class _Login extends State { sharedPref.remove(FAMILY_FILE); // Register GeoZones after login registerGeoZones(); - + projectViewModel.setPrivilege(privilegeList: result); result = CheckActivationCode.fromJson(result); result.list.isFamily = false; // this.sharedPref.setString(BLOOD_TYPE, result['PatientBloodType']), diff --git a/lib/pages/medical/eye/ContactLensPage.dart b/lib/pages/medical/eye/ContactLensPage.dart index 26503c89..373c3c79 100644 --- a/lib/pages/medical/eye/ContactLensPage.dart +++ b/lib/pages/medical/eye/ContactLensPage.dart @@ -1,10 +1,12 @@ import 'package:diplomaticquarterapp/core/model/eye/AppoimentAllHistoryResult.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.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:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class ContactLensPage extends StatelessWidget { final ListHISGetContactLensPerscription listHISGetContactLensPerscription; @@ -14,6 +16,7 @@ class ContactLensPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return AppScaffold( body: SingleChildScrollView( child: Container( @@ -82,6 +85,7 @@ class ContactLensPage extends StatelessWidget { SizedBox( height: 17, ), + if(projectViewModel.havePrivilege(15)) Container( width: double.infinity, child: SecondaryButton( diff --git a/lib/pages/medical/prescriptions/prescription_items_page.dart b/lib/pages/medical/prescriptions/prescription_items_page.dart index 62fb1c64..6fb07f68 100644 --- a/lib/pages/medical/prescriptions/prescription_items_page.dart +++ b/lib/pages/medical/prescriptions/prescription_items_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/Prescriptions.dart'; import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/prescriptions_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/prescriptions/prescription_details_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -11,7 +12,7 @@ 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:provider/provider.dart'; import '../../../widgets/dialogs/confirm_send_email_dialog.dart'; class PrescriptionItemsPage extends StatelessWidget { @@ -21,6 +22,7 @@ class PrescriptionItemsPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getPrescriptionReport(prescriptions: prescriptions), @@ -184,6 +186,7 @@ class PrescriptionItemsPage extends StatelessWidget { child: Column( children: [ Divider(), + if(projectViewModel.havePrivilege(13)) Container( width: MediaQuery.of(context).size.width * 0.8, child: Button( diff --git a/lib/pages/medical/radiology/radiology_details_page.dart b/lib/pages/medical/radiology/radiology_details_page.dart index f3f08cce..742e3ddf 100644 --- a/lib/pages/medical/radiology/radiology_details_page.dart +++ b/lib/pages/medical/radiology/radiology_details_page.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; import 'package:diplomaticquarterapp/core/model/radiology/final_radiology.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/radiology_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; @@ -10,6 +11,7 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_send_email_dialog.d import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class RadiologyDetailsPage extends StatelessWidget { @@ -19,6 +21,7 @@ class RadiologyDetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getRadImageURL( projectId: finalRadiology.projectID, @@ -51,7 +54,9 @@ class RadiologyDetailsPage extends StatelessWidget { ], ), ), - bottomSheet: Container( + bottomSheet: (projectViewModel.havePrivilege(9) || + projectViewModel.havePrivilege(8)) + ? Container( width: double.infinity, height: finalRadiology.dIAPACSURL != "" ? MediaQuery.of(context).size.height * 0.25 @@ -61,7 +66,7 @@ class RadiologyDetailsPage extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Divider(), - if (finalRadiology.dIAPACSURL != "") + if (finalRadiology.dIAPACSURL != "" && projectViewModel.havePrivilege(9)) Container( width: MediaQuery.of(context).size.width * 0.8, child: Button( @@ -72,6 +77,7 @@ class RadiologyDetailsPage extends StatelessWidget { backgroundColor: Colors.grey[800], ), ), + if (projectViewModel.havePrivilege(8)) Container( width: MediaQuery.of(context).size.width * 0.8, child: Button( @@ -86,7 +92,7 @@ class RadiologyDetailsPage extends StatelessWidget { ) ], ), - )), + ):Container()), ); } diff --git a/lib/pages/medical/reports/report_home_page.dart b/lib/pages/medical/reports/report_home_page.dart index 7a367a32..c57dd3e9 100644 --- a/lib/pages/medical/reports/report_home_page.dart +++ b/lib/pages/medical/reports/report_home_page.dart @@ -2,6 +2,7 @@ import 'dart:ui'; import 'package:diplomaticquarterapp/core/model/ImagesInfo.dart'; import 'package:diplomaticquarterapp/core/viewModels/medical/reports_view_model.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/pages/base/base_view.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/report_list_widget.dart'; import 'package:diplomaticquarterapp/pages/medical/reports/reports_page.dart'; @@ -12,6 +13,7 @@ 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:provider/provider.dart'; class HomeReportPage extends StatefulWidget { @override @@ -37,6 +39,7 @@ class _HomeReportPageState extends State @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); imagesInfo.add(ImagesInfo( imageEn: 'https://hmgwebservices.com/Images/MobileAppDq/imges-info/medical-reorts/en/0.png', @@ -169,7 +172,7 @@ class _HomeReportPageState extends State ) ], ), - bottomSheet: Container( + bottomSheet: projectViewModel.havePrivilege(21) ?Container( width: double.infinity, height: 90, margin: EdgeInsets.all(8.0), @@ -183,7 +186,7 @@ class _HomeReportPageState extends State ), ), ), - ), + ):null, ), ), ); diff --git a/lib/pages/paymentService/payment_service.dart b/lib/pages/paymentService/payment_service.dart index 415e05d0..c3a19917 100644 --- a/lib/pages/paymentService/payment_service.dart +++ b/lib/pages/paymentService/payment_service.dart @@ -74,6 +74,7 @@ class PaymentService extends StatelessWidget { ), ), ), + if(!projectViewModel.havePrivilege(33)) Expanded( child: InkWell( onTap: () => navigateToToDoPage(context), @@ -116,6 +117,7 @@ class PaymentService extends StatelessWidget { ) ], ), + if(!projectViewModel.havePrivilege(33)) Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/pages/vaccine/my_vaccines_screen.dart b/lib/pages/vaccine/my_vaccines_screen.dart index 02d67cac..3e81c41c 100644 --- a/lib/pages/vaccine/my_vaccines_screen.dart +++ b/lib/pages/vaccine/my_vaccines_screen.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/buttons/button.dart'; import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; @@ -6,6 +7,7 @@ import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:flutter/cupertino.dart'; +import 'package:provider/provider.dart'; import '../base/base_view.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/core/viewModels/vaccine_view_model.dart'; @@ -22,6 +24,7 @@ class MyVaccines extends StatefulWidget { class _MyVaccinesState extends State { @override Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); return BaseView( onModelReady: (model) => model.getVaccine(), builder: (BuildContext context, VaccineViewModel model, Widget child) => @@ -171,6 +174,7 @@ class _MyVaccinesState extends State { Navigator.push(context, FadePage(page: MyVaccinesItemPage())), ), ), + if(projectViewModel.havePrivilege(27)) Container( width: double.infinity, // height: 80.0, diff --git a/lib/splashPage.dart b/lib/splashPage.dart index 8d69c330..20da2ba6 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -9,6 +9,7 @@ import 'package:provider/provider.dart'; import 'config/shared_pref_kay.dart'; import 'config/size_config.dart'; import 'core/service/AuthenticatedUserObject.dart'; +import 'core/service/privilege_service.dart'; import 'core/viewModels/project_view_model.dart'; import 'locator.dart'; import 'models/Authentication/authenticated_user.dart'; @@ -24,23 +25,29 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { - //Provider.of(context, listen: false).isLogin + PrivilegeService _privilegeService = locator(); @override void initState() { super.initState(); Timer( - Duration(seconds: 1, milliseconds: 800), - () { - Provider.of(context, listen: false).loadSharedPrefLanguage().then((value) { - Navigator.of(context).pushReplacement(FadePage(page: LandingPage())); + Duration(seconds: 1, milliseconds: 500), + () { + loadPrivilege().then((value) { + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: (BuildContext context) => LandingPage(), + ), + ); + }); - }); }, ); } - Future getUserData() async { - Provider.of(context, listen: false).loadSharedPrefLanguage(); + /// load the Privilege from service + Future loadPrivilege() async { + await _privilegeService.getPrivilege(); + Provider.of(context, listen: false).setPrivilegeModelList(privilege: _privilegeService.privilegeModelList); } @override diff --git a/lib/widgets/bottom_navigation/bottom_nav_bar.dart b/lib/widgets/bottom_navigation/bottom_nav_bar.dart index 01a50757..66a83224 100644 --- a/lib/widgets/bottom_navigation/bottom_nav_bar.dart +++ b/lib/widgets/bottom_navigation/bottom_nav_bar.dart @@ -1,4 +1,5 @@ import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/locator.dart'; import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart'; @@ -49,6 +50,7 @@ class _BottomNavBarState extends State { @override Widget build(BuildContext context) { model = Provider.of(context); + ProjectViewModel projectViewModel = Provider.of(context); return BottomAppBar( elevation: 4, shape: CircularNotchedRectangle(), @@ -75,7 +77,7 @@ class _BottomNavBarState extends State { currentIndex: 1, name: TranslationBase.of(context).medicalProfile, ), - if(widget.index == 0) + if(widget.index == 0 && projectViewModel.havePrivilege(34)) Expanded( child: SizedBox( height: 50, @@ -88,7 +90,7 @@ class _BottomNavBarState extends State { ), ), ), - if(widget.index != 0) + if(widget.index != 0 && projectViewModel.havePrivilege(34)) BottomNavigationItem( icon: EvaIcons.calendar, activeIcon: EvaIcons.calendar, @@ -106,6 +108,7 @@ class _BottomNavBarState extends State { currentIndex: 3, name: TranslationBase.of(context).myFamily, ), + if(projectViewModel.havePrivilege(51)) BottomNavigationItem( icon: EvaIcons.calendar, activeIcon: EvaIcons.calendar, diff --git a/lib/widgets/data_display/medical/doctor_card.dart b/lib/widgets/data_display/medical/doctor_card.dart index 0e0b27ae..23e754fb 100644 --- a/lib/widgets/data_display/medical/doctor_card.dart +++ b/lib/widgets/data_display/medical/doctor_card.dart @@ -151,7 +151,7 @@ class DoctorCard extends StatelessWidget { ), ), ), - if (onEmailTap != null) + if (onEmailTap != null && projectViewModel.havePrivilege(17)) InkWell( onTap: onEmailTap, child: Icon( diff --git a/lib/widgets/drawer/app_drawer_widget.dart b/lib/widgets/drawer/app_drawer_widget.dart index fcc06c24..332db82e 100644 --- a/lib/widgets/drawer/app_drawer_widget.dart +++ b/lib/widgets/drawer/app_drawer_widget.dart @@ -155,8 +155,8 @@ class _AppDrawerState extends State { ? Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - user.isFamily == null || - user.isFamily == false + (user.isFamily == null || + user.isFamily == false)&& projectProvider.havePrivilege(2) ? InkWell( child: DrawerItem( TranslationBase.of(context).family, @@ -292,7 +292,9 @@ class _AppDrawerState extends State { } }, ), - InkWell( + if(projectProvider.havePrivilege(1)) + + InkWell( child: DrawerItem( TranslationBase.of(context) .arabicChange, @@ -353,6 +355,7 @@ class _AppDrawerState extends State { NotificationsPage())); }, ), + if(projectProvider.havePrivilege(3)) InkWell( child: DrawerItem( TranslationBase.of(context).appsetting, @@ -567,6 +570,7 @@ class _AppDrawerState extends State { loginAfter(result, context) async { result = CheckActivationCode.fromJson(result); + Provider.of(context, listen: false).setPrivilege(privilegeList: result,isLoginChild: true); var familyFile = await sharedPref.getObject(FAMILY_FILE); var currentLang = await sharedPref.getString(APP_LANGUAGE); var mainUser = await sharedPref.getObject(MAIN_USER); From 1968eb468241500931df82178244a936e7c59e16 Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Wed, 6 Jan 2021 14:34:42 +0200 Subject: [PATCH 34/34] return privilege --- lib/locator.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/locator.dart b/lib/locator.dart index f00cc1f6..271bdf23 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -47,6 +47,7 @@ import 'core/service/medical/vital_sign_service.dart'; import 'core/service/packages_offers/PackagesOffersServices.dart'; import 'core/service/parmacyModule/order-preview-service.dart'; import 'core/service/notifications_service.dart'; +import 'core/service/privilege_service.dart'; import 'core/viewModels/AlHabibMedicalService/cmc_view_model.dart'; import 'core/service/parmacyModule/parmacy_module_service.dart'; @@ -145,7 +146,7 @@ void setupLocator() { locator.registerLazySingleton(() => VaccinationTableService()); locator.registerLazySingleton(() => NotificationService()); - + locator.registerLazySingleton(() => PrivilegeService()); locator.registerLazySingleton(() => PharmacyModuleService()); locator.registerLazySingleton(() => OrderPreviewService());