From 01ccd484f4ce72d4570cda4c2425a06550e6f3b8 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 10 Oct 2021 17:48:26 +0300 Subject: [PATCH] Calendar plugin changed --- lib/config/localized_values.dart | 3 + lib/config/shared_pref_kay.dart | 1 + lib/pages/BookAppointment/DoctorProfile.dart | 2 +- .../components/DocAvailableAppointments.dart | 293 +++++++--------- .../components/SearchByClinic.dart | 43 ++- .../Covid-DriveThru/Covid-TimeSlots.dart | 329 +++++++++--------- .../covid-dirvethru-questions.dart | 1 - .../clinic_services/get_clinic_service.dart | 1 + lib/uitl/translations_delegate_base.dart | 3 + pubspec.yaml | 3 +- 10 files changed, 325 insertions(+), 354 deletions(-) diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart index f9946ea6..2da7d536 100644 --- a/lib/config/localized_values.dart +++ b/lib/config/localized_values.dart @@ -1484,4 +1484,7 @@ const Map localizedValues = { "rateAppointment": {"en": "Rate Appointment", "ar": "سعر التعيين"}, "noInsuranceCardAttached": {"en": "Please attach your insurance card image to continue", "ar": "يرجى إرفاق صورة بطاقة التأمين الخاصة بك للمتابعة"}, "bodyMassIndex": {"en": "Body Mass Index is: ", "ar": "مؤشر كتلة الجسم هو:"}, + "noSlotsError": {"en": "No appointments available for selected date", "ar": "لا توجد مواعيد متاحة للتاريخ المحدد"}, + "selectSlot": {"en": "Please select Time Slot to continue", "ar": "الرجاء تحديد فترة زمنية للمتابعة"}, + }; diff --git a/lib/config/shared_pref_kay.dart b/lib/config/shared_pref_kay.dart index c1dc168c..c256d0c1 100644 --- a/lib/config/shared_pref_kay.dart +++ b/lib/config/shared_pref_kay.dart @@ -35,3 +35,4 @@ const H2O_REMINDER = 'H2O_REMINDER'; const LIVECARE_CLINIC_DATA = 'LIVECARE_CLINIC_DATA'; const DOCTOR_SCHEDULE_DATE_SEL = 'DOCTOR_SCHEDULE_DATE_SEL'; const APPOINTMENT_HISTORY_MEDICAL = 'APPOINTMENT_HISTORY_MEDICAL'; +const CLINICS_LIST = 'CLINICS_LIST'; diff --git a/lib/pages/BookAppointment/DoctorProfile.dart b/lib/pages/BookAppointment/DoctorProfile.dart index 99afbd7f..e71fa02b 100644 --- a/lib/pages/BookAppointment/DoctorProfile.dart +++ b/lib/pages/BookAppointment/DoctorProfile.dart @@ -500,7 +500,7 @@ class _DoctorProfileState extends State with TickerProviderStateM dialog.showAlertDialog(context); } } else - AppToast.showErrorToast(message: "Please select Time Slot to continue"); + AppToast.showErrorToast(message: TranslationBase.of(context).selectSlot); } navigateToLogin() { diff --git a/lib/pages/BookAppointment/components/DocAvailableAppointments.dart b/lib/pages/BookAppointment/components/DocAvailableAppointments.dart index aaceb5ca..af4c4f88 100644 --- a/lib/pages/BookAppointment/components/DocAvailableAppointments.dart +++ b/lib/pages/BookAppointment/components/DocAvailableAppointments.dart @@ -7,11 +7,13 @@ import 'package:diplomaticquarterapp/theme/colors.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_new.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import 'package:table_calendar/table_calendar.dart'; + +import 'package:syncfusion_flutter_calendar/calendar.dart'; import '../../../uitl/date_uitl.dart'; @@ -24,6 +26,7 @@ class DocAvailableAppointments extends StatefulWidget { static String selectedTime; bool isLiveCareAppointment; final dynamic doctorSchedule; + DocAvailableAppointments({@required this.doctor, this.doctorSchedule, @required this.isLiveCareAppointment}); @override @@ -55,8 +58,8 @@ class _DocAvailableAppointmentsState extends State wit @override void didUpdateWidget(covariant DocAvailableAppointments oldWidget) { if (oldWidget.doctorSchedule != widget.doctorSchedule) { - _calendarController.setSelectedDay(DateUtil.convertStringToDate(widget.doctorSchedule['Date']), isProgrammatic: true); - _onDaySelected(DateUtil.convertStringToDate(widget.doctorSchedule['Date']), List()); + _onDaySelected(DateUtil.convertStringToDate(widget.doctorSchedule['Date'])); + _calendarController.selectedDate = DateUtil.convertStringToDate(widget.doctorSchedule['Date']); } super.didUpdateWidget(oldWidget); } @@ -99,28 +102,17 @@ class _DocAvailableAppointmentsState extends State wit super.dispose(); } - void _onDaySelected(DateTime day, List events) { + void _onDaySelected(DateTime day) { final DateFormat formatter = DateFormat('yyyy-MM-dd'); setState(() { this.selectedDate = DateUtil.getWeekDayMonthDayYearDateFormatted(day, language); openTimeSlotsPickerForDate(day, docFreeSlots); DocAvailableAppointments.selectedDate = formatter.format(day); - print(DocAvailableAppointments.selectedDate); + _calendarController.selectedDate = day; + print(_calendarController.selectedDate); }); } - void _onVisibleDaysChanged(DateTime first, DateTime last, CalendarFormat format) { - print('CALLBACK: _onVisibleDaysChanged'); - print(first); - print(last); - } - - void _onCalendarCreated(DateTime first, DateTime last, CalendarFormat format) { - print('CALLBACK: _onCalendarCreated'); - print(first); - print(last); - } - @override Widget build(BuildContext context) { return SingleChildScrollView( @@ -134,30 +126,36 @@ class _DocAvailableAppointmentsState extends State wit padding: const EdgeInsets.only(left: 16, right: 16, bottom: 16), child: Text(selectedDate, style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.w600, letterSpacing: -0.64)), ), - Container( - height: 40, - child: ListView.builder( - controller: _scrollController, - scrollDirection: Axis.horizontal, - itemCount: dayEvents.length, - itemBuilder: (context, index) { - return Container( - margin: EdgeInsets.only(right: (index == dayEvents.length - 1) ? 16 : 5.0, left: index == 0 ? 16 : 5), - child: ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), - side: BorderSide( - color: index == selectedButtonIndex ? CustomColors.green : Colors.black, //Color of the border - style: BorderStyle.solid, //Style of the border - width: 1.5, //width of the border - ), - ), - minWidth: MediaQuery.of(context).size.width * 0.18, - child: index == selectedButtonIndex ? getSelectedButton(index) : getNormalButton(index)), - ); - }, - ), - ), + DocAvailableAppointments.areSlotsAvailable + ? Container( + height: 40, + child: ListView.builder( + controller: _scrollController, + scrollDirection: Axis.horizontal, + itemCount: dayEvents.length, + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.only(right: (index == dayEvents.length - 1) ? 16 : 5.0, left: index == 0 ? 16 : 5), + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: BorderSide( + color: index == selectedButtonIndex ? CustomColors.green : Colors.black, //Color of the border + style: BorderStyle.solid, //Style of the border + width: 1.5, //width of the border + ), + ), + minWidth: MediaQuery.of(context).size.width * 0.18, + child: index == selectedButtonIndex ? getSelectedButton(index) : getNormalButton(index)), + ); + }, + ), + ) + : Center( + child: Padding( + padding: const EdgeInsets.only(left: 12.0, right: 12.0), + child: Text(TranslationBase.of(context).noSlotsError, style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: CustomColors.grey)), + )), ], ), ), @@ -166,99 +164,42 @@ class _DocAvailableAppointmentsState extends State wit Widget _buildTableCalendarWithBuilders() { return Card( - shape: cardRadius(12), - margin: EdgeInsets.all(16), - clipBehavior: Clip.antiAlias, - child: Padding( - padding: const EdgeInsets.only(bottom: 12), - child: TableCalendar( - locale: language == "en" ? 'en_US' : 'ar_SA', - calendarController: _calendarController, - events: _events, - initialCalendarFormat: CalendarFormat.month, - startDay: DateTime.now(), - formatAnimation: FormatAnimation.slide, - startingDayOfWeek: StartingDayOfWeek.sunday, - weekendDays: [DateTime.friday, DateTime.saturday], - availableGestures: AvailableGestures.horizontalSwipe, - availableCalendarFormats: const { - CalendarFormat.month: '', - CalendarFormat.week: '', - }, - calendarStyle: CalendarStyle( - outsideDaysVisible: false, - weekendStyle: TextStyle().copyWith(color: Colors.blue[800]), - holidayStyle: TextStyle().copyWith(color: Colors.blue[800]), - ), - daysOfWeekStyle: DaysOfWeekStyle( - weekendStyle: TextStyle().copyWith(color: Colors.black, fontSize: 11.0, fontWeight: FontWeight.w600), - weekdayStyle: TextStyle().copyWith(color: Colors.black, fontSize: 11.0, fontWeight: FontWeight.w600), - ), - headerStyle: HeaderStyle(centerHeaderTitle: true, formatButtonVisible: false, titleTextStyle: TextStyle(fontSize: 16, letterSpacing: -0.64, fontWeight: FontWeight.w600)), - builders: CalendarBuilders( - selectedDayBuilder: (context, date, _) { - return FadeTransition( - opacity: Tween(begin: 0.0, end: 1.0).animate(_animationController), - child: Container( - margin: const EdgeInsets.all(4.0), - padding: const EdgeInsets.only(top: 5.0, left: 5.0), - color: Colors.transparent, - width: 0, - height: 0, - child: Text( - '${date.day}', - style: TextStyle().copyWith(fontSize: 14.0), - ), - ), - ); - }, - todayDayBuilder: (context, date, _) { - return Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - color: _calendarController.isSelected(date) - ? Colors.green[400] - : _calendarController.isToday(date) - ? Colors.transparent - : Color(0xff76cfb7), - ), - width: 40.0, - height: 40.0, - child: Center( - child: Text( - '${date.day}', - style: TextStyle().copyWith( - color: Colors.white, - fontSize: 14.0, - ), - ), - ), - ); - }, - markersBuilder: (context, date, events, _) { - final children = []; - if (events.isNotEmpty) { - children.add( - Positioned( - right: 4, - bottom: 4, - child: _buildEventsMarker(date, events), - ), - ); - } - - return children; - }, + shape: cardRadius(12), + margin: EdgeInsets.all(16), + clipBehavior: Clip.antiAlias, + child: Padding( + padding: const EdgeInsets.only(bottom: 12), + child: Container( + child: SfCalendar( + controller: _calendarController, + minDate: DateTime.now(), + showNavigationArrow: true, + headerStyle: CalendarHeaderStyle(textAlign: TextAlign.center, textStyle: TextStyle(fontSize: 14.0, fontWeight: FontWeight.w600, letterSpacing: -0.46)), + viewHeaderStyle: ViewHeaderStyle(dayTextStyle: TextStyle(fontSize: 12.0, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: CustomColors.black)), + view: CalendarView.month, + todayHighlightColor: CustomColors.green, + selectionDecoration: containerColorRadiusBorderWidth(Colors.transparent, 4, CustomColors.green, 2.5), + cellBorderColor: Colors.white, + dataSource: MeetingDataSource(_getDataSource()), + monthViewSettings: const MonthViewSettings(appointmentDisplayMode: MonthAppointmentDisplayMode.indicator, showTrailingAndLeadingDates: false, appointmentDisplayCount: 1), + onTap: (CalendarTapDetails details) { + _calendarController.selectedDate = details.date; + _onDaySelected(details.date); + }, + ), ), - onDaySelected: (date, event, _) { - _onDaySelected(date, event); - _animationController.forward(from: 0.0); - }, - onVisibleDaysChanged: _onVisibleDaysChanged, - onCalendarCreated: _onCalendarCreated, - ), - ), - ); + )); + } + + List _getDataSource() { + final List meetings = []; + + _events.forEach((key, value) { + final DateTime startTime = DateTime(key.year, key.month, key.day, 9, 0, 0); + final DateTime endTime = startTime.add(const Duration(hours: 2)); + meetings.add(Meeting("", startTime, endTime, CustomColors.green, false)); + }); + return meetings; } openTimeSlotsPickerForDate(DateTime dateStart, List freeSlots) { @@ -270,14 +211,12 @@ class _DocAvailableAppointmentsState extends State wit }); setState(() { - if (dayEvents.length != 0) + if (dayEvents.length != 0) { DocAvailableAppointments.areSlotsAvailable = true; - else + selectedButtonIndex = 0; + DocAvailableAppointments.selectedTime = dayEvents[selectedButtonIndex].isoTime; + } else DocAvailableAppointments.areSlotsAvailable = false; - - selectedButtonIndex = 0; - - DocAvailableAppointments.selectedTime = dayEvents[selectedButtonIndex].isoTime; }); } @@ -299,7 +238,7 @@ class _DocAvailableAppointmentsState extends State wit selectedDateJSON = freeSlotsResponse[0]; }); openTimeSlotsPickerForDate(DateUtil.convertStringToDate(selectedDateJSON), docFreeSlots); - _calendarController.setFocusedDay(DateUtil.convertStringToDate(selectedDateJSON)); + _calendarController.selectedDate = DateUtil.convertStringToDate(selectedDateJSON); return _eventsParsed; } @@ -321,7 +260,8 @@ class _DocAvailableAppointmentsState extends State wit Widget getSelectedButton(int index) { return RaisedButton( - color: CustomColors.green, //Color of the border + color: CustomColors.green, + //Color of the border textColor: Colors.white, elevation: 0, onPressed: () { @@ -352,10 +292,7 @@ class _DocAvailableAppointmentsState extends State wit _events.clear(), _events = value, if (widget.doctorSchedule != null) - { - _calendarController.setSelectedDay(DateUtil.convertStringToDate(widget.doctorSchedule['Date']), isProgrammatic: true), - _onDaySelected(DateUtil.convertStringToDate(widget.doctorSchedule['Date']), List()) - } + {_onDaySelected(DateUtil.convertStringToDate(widget.doctorSchedule['Date'])), _calendarController.selectedDate = DateUtil.convertStringToDate(widget.doctorSchedule['Date'])} }); }); } else { @@ -403,29 +340,49 @@ class _DocAvailableAppointmentsState extends State wit this.language = languageID; }); } +} - Widget _buildEventsMarker(DateTime date, List events) { - return Container( - decoration: containerColorRadiusBorderWidth( - _calendarController.isSelected(date) - ? CustomColors.green - : _calendarController.isToday(date) - ? CustomColors.green.withOpacity(0.5) - : Colors.white, - 200, - _calendarController.isSelected(date) ? CustomColors.green : Colors.black, - 2), - width: 40.0, - height: 40.0, - child: Center( - child: Text( - '${date.day}', - style: TextStyle().copyWith( - color: _calendarController.isSelected(date) ? Colors.white : Colors.black, - fontSize: 14.0, - ), - ), - ), - ); +class MeetingDataSource extends CalendarDataSource { + MeetingDataSource(List source) { + appointments = source; } + + @override + DateTime getStartTime(int index) { + return _getMeetingData(index).from; + } + @override + DateTime getEndTime(int index) { + return _getMeetingData(index).to; + } + @override + String getSubject(int index) { + return _getMeetingData(index).eventName; + } + @override + Color getColor(int index) { + return _getMeetingData(index).background; + } + @override + bool isAllDay(int index) { + return _getMeetingData(index).isAllDay; + } + Meeting _getMeetingData(int index) { + final dynamic meeting = appointments[index]; + Meeting meetingData; + if (meeting is Meeting) { + meetingData = meeting; + } + return meetingData; + } +} + +class Meeting { + Meeting(this.eventName, this.from, this.to, this.background, this.isAllDay); + + String eventName; + DateTime from; + DateTime to; + Color background; + bool isAllDay; } diff --git a/lib/pages/BookAppointment/components/SearchByClinic.dart b/lib/pages/BookAppointment/components/SearchByClinic.dart index dc983581..d1030636 100644 --- a/lib/pages/BookAppointment/components/SearchByClinic.dart +++ b/lib/pages/BookAppointment/components/SearchByClinic.dart @@ -1,5 +1,6 @@ import "dart:collection"; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; import 'package:diplomaticquarterapp/core/model/hospitals/hospitals_model.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; @@ -429,24 +430,36 @@ class _SearchByClinicState extends State { return false; } - getClinicsList() { + getClinicsList() async { GifLoaderDialogUtils.showMyDialog(context); - ClinicListService service = new ClinicListService(); - service.getClinicsList(context).then((res) { - if (res['MessageStatus'] == 1) { - setState(() { - isMobileAppDentalAllow = res['ISMobileAppDentalAllow']; - res['ListClinicCentralized'].forEach((v) { - clinicsList.add(new ListClinicCentralized.fromJson(v)); - }); + if (await sharedPref.getObject(CLINICS_LIST) != null) { + dynamic res = await sharedPref.getObject(CLINICS_LIST); + setState(() { + isMobileAppDentalAllow = res['ISMobileAppDentalAllow']; + res['ListClinicCentralized'].forEach((v) { + clinicsList.add(new ListClinicCentralized.fromJson(v)); }); - getProjectsList(); - GifLoaderDialogUtils.hideDialog(context); - } else {} - }).catchError((err) { - print(err); + }); + getProjectsList(); GifLoaderDialogUtils.hideDialog(context); - }); + } else { + ClinicListService service = new ClinicListService(); + service.getClinicsList(context).then((res) { + if (res['MessageStatus'] == 1) { + setState(() { + isMobileAppDentalAllow = res['ISMobileAppDentalAllow']; + res['ListClinicCentralized'].forEach((v) { + clinicsList.add(new ListClinicCentralized.fromJson(v)); + }); + }); + getProjectsList(); + GifLoaderDialogUtils.hideDialog(context); + } else {} + }).catchError((err) { + print(err); + GifLoaderDialogUtils.hideDialog(context); + }); + } } getProjectsList() { diff --git a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart index b49a18c6..2d3ffbfe 100644 --- a/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart +++ b/lib/pages/Covid-DriveThru/Covid-TimeSlots.dart @@ -21,10 +21,11 @@ import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:table_calendar/table_calendar.dart'; +// import 'package:table_calendar/table_calendar.dart'; + +import 'package:syncfusion_flutter_calendar/calendar.dart'; class CovidTimeSlots extends StatefulWidget { int projectID; @@ -100,24 +101,17 @@ class _CovidTimeSlotsState extends State with TickerProviderStat super.dispose(); } - void _onDaySelected(DateTime day, List events, ProjectViewModel projectViewModel) { + void _onDaySelected(DateTime day, ProjectViewModel projectViewModel) { final DateFormat formatter = DateFormat('yyyy-MM-dd'); setState(() { this.selectedDate = DateUtil.getWeekDayMonthDayYearDateFormatted(day, projectViewModel.isArabic ? "ar" : "en"); openTimeSlotsPickerForDate(day, docFreeSlots); CovidTimeSlots.selectedDate = formatter.format(day); + _calendarController.selectedDate = day; print(CovidTimeSlots.selectedDate); }); } - void _onVisibleDaysChanged(DateTime first, DateTime last, CalendarFormat format) { - print('CALLBACK: _onVisibleDaysChanged'); - } - - void _onCalendarCreated(DateTime first, DateTime last, CalendarFormat format) { - print('CALLBACK: _onCalendarCreated'); - } - @override Widget build(BuildContext context) { ProjectViewModel projectViewModel = Provider.of(context); @@ -151,6 +145,7 @@ class _CovidTimeSlotsState extends State with TickerProviderStat fontWeight: FontWeight.w600, ), ), + mHeight(12), Card( shape: cardRadius(12), child: _buildTableCalendarWithBuilders(projectViewModel), @@ -165,30 +160,36 @@ class _CovidTimeSlotsState extends State with TickerProviderStat ), ), mHeight(8), - Container( - height: 40, - child: ListView.builder( - controller: _scrollController, - scrollDirection: Axis.horizontal, - itemCount: dayEvents.length, - itemBuilder: (context, index) { - return Container( - margin: EdgeInsets.only(right: (index == dayEvents.length - 1) ? 0 : 5.0, left: index == 0 ? 0 : 5), - child: ButtonTheme( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5.0), - side: BorderSide( - color: index == selectedButtonIndex ? CustomColors.green : Colors.black, //Color of the border - style: BorderStyle.solid, //Style of the border - width: 1.5, //width of the border - ), - ), - minWidth: MediaQuery.of(context).size.width * 0.2, - child: index == selectedButtonIndex ? getSelectedButton(index) : getNormalButton(index)), - ); - }, - ), - ), + CovidTimeSlots.areSlotsAvailable + ? Container( + height: 40, + child: ListView.builder( + controller: _scrollController, + scrollDirection: Axis.horizontal, + itemCount: dayEvents.length, + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.only(right: (index == dayEvents.length - 1) ? 0 : 5.0, left: index == 0 ? 0 : 5), + child: ButtonTheme( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5.0), + side: BorderSide( + color: index == selectedButtonIndex ? CustomColors.green : Colors.black, //Color of the border + style: BorderStyle.solid, //Style of the border + width: 1.5, //width of the border + ), + ), + minWidth: MediaQuery.of(context).size.width * 0.2, + child: index == selectedButtonIndex ? getSelectedButton(index) : getNormalButton(index)), + ); + }, + ), + ) + : Center( + child: Padding( + padding: const EdgeInsets.only(left: 12.0, right: 12.0), + child: Text(TranslationBase.of(context).noSlotsError, style: TextStyle(fontSize: 14.0, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: CustomColors.grey)), + )), ], ), ), @@ -239,95 +240,35 @@ class _CovidTimeSlotsState extends State with TickerProviderStat } Widget _buildTableCalendarWithBuilders(ProjectViewModel projectViewModel) { - return TableCalendar( - locale: projectViewModel.isArabic ? 'ar_SA' : 'en_US', - calendarController: _calendarController, - events: _events, - initialCalendarFormat: CalendarFormat.month, - startDay: DateTime.now(), - formatAnimation: FormatAnimation.slide, - startingDayOfWeek: StartingDayOfWeek.sunday, - weekendDays: [DateTime.friday, DateTime.saturday], - availableGestures: AvailableGestures.horizontalSwipe, - availableCalendarFormats: const { - CalendarFormat.month: '', - CalendarFormat.week: '', - }, - calendarStyle: CalendarStyle( - outsideDaysVisible: false, - weekendStyle: TextStyle().copyWith(color: Colors.blue[800]), - holidayStyle: TextStyle().copyWith(color: Colors.blue[800]), - ), - daysOfWeekStyle: DaysOfWeekStyle( - weekendStyle: TextStyle().copyWith(color: Colors.black, fontSize: 11.0, fontWeight: FontWeight.w600), - weekdayStyle: TextStyle().copyWith(color: Colors.black, fontSize: 11.0, fontWeight: FontWeight.w600), - ), - headerStyle: HeaderStyle(centerHeaderTitle: true, formatButtonVisible: false, titleTextStyle: TextStyle(fontSize: 16, letterSpacing: -0.64, fontWeight: FontWeight.w600)), - builders: CalendarBuilders( - selectedDayBuilder: (context, date, _) { - return FadeTransition( - opacity: Tween(begin: 0.0, end: 1.0).animate(_animationController), - child: Container( - margin: const EdgeInsets.all(4.0), - padding: const EdgeInsets.only(top: 5.0, left: 6.0), - color: Colors.transparent, - width: 0, - height: 0, - child: Text( - '${date.day}', - style: TextStyle().copyWith(fontSize: 14.0), - ), - ), - ); - }, - todayDayBuilder: (context, date, _) { - return Container( - decoration: BoxDecoration( - shape: BoxShape.circle, - color: _calendarController.isSelected(date) - ? Colors.green[400] - : _calendarController.isToday(date) - ? Colors.transparent - : Color(0xff76cfb7), - ), - width: 40.0, - height: 40.0, - child: Center( - child: Text( - '${date.day}', - style: TextStyle().copyWith( - color: Colors.white, - fontSize: 14.0, - ), - ), - ), - ); - }, - markersBuilder: (context, date, events, holidays) { - final children = []; - - if (events.isNotEmpty) { - children.add( - Positioned( - right: 4, - bottom: 4, - child: _buildEventsMarker(date, events), - ), - ); - } - - return children; - }, - ), - onDaySelected: (date, event, _) { - _onDaySelected(date, event, projectViewModel); - _animationController.forward(from: 0.0); + return SfCalendar( + controller: _calendarController, + minDate: DateTime.now(), + showNavigationArrow: true, + headerStyle: CalendarHeaderStyle(textAlign: TextAlign.center, textStyle: TextStyle(fontSize: 14.0, fontWeight: FontWeight.w600, letterSpacing: -0.46)), + viewHeaderStyle: ViewHeaderStyle(dayTextStyle: TextStyle(fontSize: 12.0, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: CustomColors.black)), + view: CalendarView.month, + todayHighlightColor: CustomColors.green, + selectionDecoration: containerColorRadiusBorderWidth(Colors.transparent, 4, CustomColors.green, 2.5), + cellBorderColor: Colors.white, + dataSource: MeetingDataSource(_getDataSource()), + monthViewSettings: const MonthViewSettings(appointmentDisplayMode: MonthAppointmentDisplayMode.indicator, showTrailingAndLeadingDates: false, appointmentDisplayCount: 1), + onTap: (CalendarTapDetails details) { + _calendarController.selectedDate = details.date; + _onDaySelected(details.date, projectViewModel); }, - onVisibleDaysChanged: _onVisibleDaysChanged, - onCalendarCreated: _onCalendarCreated, ); } + List _getDataSource() { + final List meetings = []; + _events.forEach((key, value) { + final DateTime startTime = DateTime(key.year, key.month, key.day, 9, 0, 0); + final DateTime endTime = startTime.add(const Duration(hours: 2)); + meetings.add(Meeting("", startTime, endTime, CustomColors.green, false)); + }); + return meetings; + } + openTimeSlotsPickerForDate(DateTime dateStart, List freeSlots) { dayEvents.clear(); DateTime dateStartObj = new DateTime(dateStart.year, dateStart.month, dateStart.day, 0, 0, 0, 0, 0); @@ -337,14 +278,12 @@ class _CovidTimeSlotsState extends State with TickerProviderStat }); setState(() { - if (dayEvents.length != 0) + if (dayEvents.length != 0) { CovidTimeSlots.areSlotsAvailable = true; - else + selectedButtonIndex = 0; + CovidTimeSlots.selectedTime = dayEvents[selectedButtonIndex].isoTime; + } else CovidTimeSlots.areSlotsAvailable = false; - - selectedButtonIndex = 0; - - CovidTimeSlots.selectedTime = dayEvents[selectedButtonIndex].isoTime; }); } @@ -366,43 +305,43 @@ class _CovidTimeSlotsState extends State with TickerProviderStat selectedDateJSON = freeSlotsResponse[0]['FreeTimeSlots']; }); openTimeSlotsPickerForDate(DateUtil.convertStringToDate(selectedDateJSON), docFreeSlots); - _calendarController.setFocusedDay(DateUtil.convertStringToDate(selectedDateJSON)); + _calendarController.selectedDate = DateUtil.convertStringToDate(selectedDateJSON); return _eventsParsed; } - Widget _buildEventsMarker(DateTime date, List events) { - return Container( - // decoration: BoxDecoration( - // shape: BoxShape.circle, - // color: _calendarController.isSelected(date) - // ? Colors.green[400] - // : _calendarController.isToday(date) - // ? Colors.brown[300] - // : Colors.blue[400], - // ), - - decoration: containerColorRadiusBorderWidth( - _calendarController.isSelected(date) - ? CustomColors.green - : _calendarController.isToday(date) - ? CustomColors.green.withOpacity(0.5) - : Colors.white, - 200, - _calendarController.isSelected(date) ? CustomColors.green : Colors.black, - 2), - width: 40.0, - height: 40.0, - child: Center( - child: Text( - '${date.day}', - style: TextStyle().copyWith( - color: _calendarController.isSelected(date) ? Colors.white : Colors.black, - fontSize: 13.0, - ), - ), - ), - ); - } + // Widget _buildEventsMarker(DateTime date, List events) { + // return Container( + // // decoration: BoxDecoration( + // // shape: BoxShape.circle, + // // color: _calendarController.isSelected(date) + // // ? Colors.green[400] + // // : _calendarController.isToday(date) + // // ? Colors.brown[300] + // // : Colors.blue[400], + // // ), + // + // decoration: containerColorRadiusBorderWidth( + // _calendarController.isSelected(date) + // ? CustomColors.green + // : _calendarController.isToday(date) + // ? CustomColors.green.withOpacity(0.5) + // : Colors.white, + // 200, + // _calendarController.isSelected(date) ? CustomColors.green : Colors.black, + // 2), + // width: 40.0, + // height: 40.0, + // child: Center( + // child: Text( + // '${date.day}', + // style: TextStyle().copyWith( + // color: _calendarController.isSelected(date) ? Colors.white : Colors.black, + // fontSize: 13.0, + // ), + // ), + // ), + // ); + // } Widget getNormalButton(int index) { return RaisedButton( @@ -436,12 +375,16 @@ class _CovidTimeSlotsState extends State with TickerProviderStat } bookCovidTestAppointment() { - GifLoaderDialogUtils.showMyDialog(context); - DoctorList docObject = new DoctorList(); - docObject.doctorID = widget.selectedDoctorID; - docObject.clinicID = widget.selectedClinicID; - docObject.projectID = widget.projectID; - insertAppointmentCovidTest(context, docObject); + if(CovidTimeSlots.areSlotsAvailable) { + GifLoaderDialogUtils.showMyDialog(context); + DoctorList docObject = new DoctorList(); + docObject.doctorID = widget.selectedDoctorID; + docObject.clinicID = widget.selectedClinicID; + docObject.projectID = widget.projectID; + insertAppointmentCovidTest(context, docObject); + } else { + AppToast.showErrorToast(message: TranslationBase.of(context).selectSlot); + } } insertAppointmentCovidTest(context, DoctorList docObject) { @@ -546,8 +489,8 @@ class _CovidTimeSlotsState extends State with TickerProviderStat if (res['COVID19_FreeTimeSlots'].length != 0) { freeSlotsResponse = res['COVID19_FreeTimeSlots']; _getJSONSlots().then((value) => { - setState(() => {widget.selectedClinicID = freeSlotsResponse[0]['ClinicID'], widget.selectedDoctorID = freeSlotsResponse[0]['DoctorID'], _events.clear(), _events = value}) - }); + setState(() => {widget.selectedClinicID = freeSlotsResponse[0]['ClinicID'], widget.selectedDoctorID = freeSlotsResponse[0]['DoctorID'], _events.clear(), _events = value}) + }); } else {} } else { GifLoaderDialogUtils.hideDialog(context); @@ -560,3 +503,53 @@ class _CovidTimeSlotsState extends State with TickerProviderStat }); } } + +class MeetingDataSource extends CalendarDataSource { + MeetingDataSource(List source) { + appointments = source; + } + + @override + DateTime getStartTime(int index) { + return _getMeetingData(index).from; + } + + @override + DateTime getEndTime(int index) { + return _getMeetingData(index).to; + } + + @override + String getSubject(int index) { + return _getMeetingData(index).eventName; + } + + @override + Color getColor(int index) { + return _getMeetingData(index).background; + } + + @override + bool isAllDay(int index) { + return _getMeetingData(index).isAllDay; + } + + Meeting _getMeetingData(int index) { + final dynamic meeting = appointments[index]; + Meeting meetingData; + if (meeting is Meeting) { + meetingData = meeting; + } + return meetingData; + } +} + +class Meeting { + Meeting(this.eventName, this.from, this.to, this.background, this.isAllDay); + + String eventName; + DateTime from; + DateTime to; + Color background; + bool isAllDay; +} diff --git a/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart b/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart index 97953978..45cab249 100644 --- a/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart +++ b/lib/pages/Covid-DriveThru/covid-dirvethru-questions.dart @@ -145,7 +145,6 @@ class CovidDirveThruQuestionsState extends State { itemBuilder: (ctx, idx) { var obj = qa[idx]; var qtext = isArabic ? obj["questionAR"] : obj["questionEN"]; - print("dddddddddddddd " + obj["ans"].toString()); return Padding( padding: const EdgeInsets.symmetric(vertical: 10), diff --git a/lib/services/clinic_services/get_clinic_service.dart b/lib/services/clinic_services/get_clinic_service.dart index 2b2d933f..d525dbb1 100644 --- a/lib/services/clinic_services/get_clinic_service.dart +++ b/lib/services/clinic_services/get_clinic_service.dart @@ -40,6 +40,7 @@ class ClinicListService extends BaseService { }, onFailure: (String error, int statusCode) { throw error; }, body: request); + sharedPref.setObject(CLINICS_LIST, localRes); return Future.value(localRes); } diff --git a/lib/uitl/translations_delegate_base.dart b/lib/uitl/translations_delegate_base.dart index 34eb3b9e..5ca1e1e6 100644 --- a/lib/uitl/translations_delegate_base.dart +++ b/lib/uitl/translations_delegate_base.dart @@ -2343,6 +2343,9 @@ class TranslationBase { String get respirationBPM => localizedValues["respirationBPM"][locale.languageCode]; + String get noSlotsError => localizedValues["noSlotsError"][locale.languageCode]; + + String get selectSlot => localizedValues["selectSlot"][locale.languageCode]; } diff --git a/pubspec.yaml b/pubspec.yaml index 40fbf98c..bf8086b5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -102,7 +102,8 @@ dependencies: rating_bar: ^0.2.0 # Calendar - table_calendar: ^2.3.0 +# table_calendar: ^2.3.0 + syncfusion_flutter_calendar: ^18.4.49 # SVG Images flutter_svg: ^0.18.0