bookedDates = $bookedDates; $this->year = now()->year; $this->month = now()->month; $this->loadMonthAvailability(); } public function loadMonthAvailability(): void { $service = app(AvailabilityService::class); $this->monthAvailability = $service->getMonthAvailability($this->year, $this->month); } public function previousMonth(): void { $date = Carbon::create($this->year, $this->month, 1)->subMonth(); // Prevent navigating to past months if ($date->lt(now()->startOfMonth())) { return; } $this->year = $date->year; $this->month = $date->month; $this->selectedDate = null; $this->availableSlots = []; $this->loadMonthAvailability(); } public function nextMonth(): void { $date = Carbon::create($this->year, $this->month, 1)->addMonth(); $this->year = $date->year; $this->month = $date->month; $this->selectedDate = null; $this->availableSlots = []; $this->loadMonthAvailability(); } public function selectDate(string $date): void { // Prevent selecting user's already booked dates if (in_array($date, $this->bookedDates)) { return; } $status = $this->monthAvailability[$date] ?? 'unavailable'; if (in_array($status, ['available', 'partial'])) { $this->selectedDate = $date; $this->loadAvailableSlots(); } } public function loadAvailableSlots(): void { if (! $this->selectedDate) { $this->availableSlots = []; return; } $service = app(AvailabilityService::class); $this->availableSlots = $service->getAvailableSlots( Carbon::parse($this->selectedDate) ); } /** * Get the day headers with locale-aware ordering. * * @return array */ private function getDayHeaders(): array { $days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; // Arabic calendar traditionally starts on Saturday if (app()->getLocale() === 'ar') { array_unshift($days, array_pop($days)); } return $days; } /** * Build calendar days array for the current month. * * @return array */ private function buildCalendarDays(): array { $firstDay = Carbon::create($this->year, $this->month, 1); $lastDay = $firstDay->copy()->endOfMonth(); // Calculate start padding based on locale $startPadding = $firstDay->dayOfWeek; if (app()->getLocale() === 'ar') { // Adjust for Saturday start $startPadding = ($firstDay->dayOfWeek + 1) % 7; } $days = array_fill(0, $startPadding, null); // Fill month days $current = $firstDay->copy(); while ($current->lte($lastDay)) { $dateStr = $current->format('Y-m-d'); // Check if user has already booked this date $status = in_array($dateStr, $this->bookedDates) ? 'user_booked' : ($this->monthAvailability[$dateStr] ?? 'unavailable'); $days[] = [ 'date' => $dateStr, 'day' => $current->day, 'status' => $status, ]; $current->addDay(); } return $days; } public function with(): array { return [ 'monthName' => Carbon::create($this->year, $this->month, 1)->translatedFormat('F Y'), 'calendarDays' => $this->buildCalendarDays(), 'dayHeaders' => $this->getDayHeaders(), 'bookedDates' => $this->bookedDates, ]; } }; ?>
{{ $monthName }}
@foreach($dayHeaders as $day)
{{ __("calendar.{$day}") }}
@endforeach
@foreach($calendarDays as $dayData) @if($dayData === null)
@else @endif @endforeach
@if($selectedDate)
{{ __('booking.available_times') }} - {{ \Carbon\Carbon::parse($selectedDate)->translatedFormat('d M Y') }} @if(count($availableSlots) > 0)
@foreach($availableSlots as $slot) @endforeach
@else

{{ __('booking.no_slots_available') }}

@endif
@endif
{{ __('booking.available') }}
{{ __('booking.partial') }}
@if(count($bookedDates) > 0)
{{ __('booking.user_booked') }}
@endif
{{ __('booking.unavailable') }}