From 1870159deae73474a8eae66ea6bb406515c3f756 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Sun, 12 Jul 2026 18:56:17 -0500 Subject: [PATCH] hide professional-blocked slots from user-facing calendar CalendarView now treats self_booked services as unavailable: - _isBlocked() filters slots with selfBooked status from the range list - _isHora1Ocupada() excludes selfBooked so they don't show as Ocupado - Blocked slots render as grey "No disponible" with block icon Co-Authored-By: Claude Sonnet 4.6 --- lib/ui/views/calendar_view.dart | 53 ++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/ui/views/calendar_view.dart b/lib/ui/views/calendar_view.dart index a7eff1f..5d457bb 100644 --- a/lib/ui/views/calendar_view.dart +++ b/lib/ui/views/calendar_view.dart @@ -3,6 +3,7 @@ import 'package:intl/intl.dart'; import 'package:prosapp_web_app/models/profesional.dart'; import 'package:prosapp_web_app/models/schedules_entity.dart'; import 'package:prosapp_web_app/models/service.dart'; +import 'package:prosapp_web_app/models/service_status.dart'; import 'package:prosapp_web_app/providers/professional_form_provider.dart'; import 'package:prosapp_web_app/providers/professional_provider.dart'; import 'package:prosapp_web_app/providers/calendar_services_provider.dart'; @@ -215,12 +216,22 @@ class _CalendarViewState extends State { } } + bool _isBlocked(TimeOfDay hora1, List? events, DateTime selectedDay) { + if (events == null) return false; + final dayStr = selectedDay.toIso8601String().split('T').first; + return events.any((e) => + e.day == dayStr && + e.range1Hour1 == hora1 && + e.status == ServiceStatus.selfBooked); + } + bool _isHora1Ocupada( TimeOfDay hora1, List? events, DateTime selectedDay) { if (events != null) { for (Service event in events) { if (selectedDay.toIso8601String().split('T').first == event.day) { - if (hora1 == event.range1Hour1) { + if (hora1 == event.range1Hour1 && + event.status != ServiceStatus.selfBooked) { return true; } } @@ -285,6 +296,46 @@ class _CalendarViewState extends State { ); } + if (_isBlocked(time, events, selectedDay)) { + return Card( + elevation: 4, + margin: const EdgeInsets.only(top: 15, left: 10, right: 10), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: ListTile( + contentPadding: const EdgeInsets.all(16), + leading: Container( + width: 40, + height: 40, + decoration: const BoxDecoration( + color: Colors.grey, + shape: BoxShape.circle, + ), + child: const Center( + child: Icon(Icons.block, color: Colors.white), + ), + ), + title: Text( + ScheduleEntity.getFormatTime(time) ?? '', + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + subtitle: const Text( + 'No disponible', + style: TextStyle( + color: Colors.red, + fontSize: 13, + fontWeight: FontWeight.bold, + ), + ), + ), + ); + } + if (_isHora1Ocupada(time, events, selectedDay)) { return Card( elevation: 4,