month)) { $this->month = now()->format('Y-m'); } } public static function canAccess(): bool { return Auth::user()?->can('panel.access') ?? false; } public static function getNavigationGroup(): string|UnitEnum|null { return __('panel.groups.content'); } public static function getNavigationLabel(): string { return __('panel.calendar.title'); } public function getTitle(): string|Htmlable { return __('panel.calendar.title'); } public function previous(): void { $this->month = $this->first()->subMonth()->format('Y-m'); } public function next(): void { $this->month = $this->first()->addMonth()->format('Y-m'); } public function today(): void { $this->month = now()->format('Y-m'); } public function first(): CarbonImmutable { return CarbonImmutable::createFromFormat('Y-m-d', $this->month.'-01')->startOfDay(); } public function label(): string { return ucfirst($this->first()->locale(app()->getLocale())->isoFormat('MMMM YYYY')); } /** * Whole weeks, Monday first, covering the month. * * @return array>}>> */ public function weeks(): array { $start = $this->first()->startOfWeek(CarbonImmutable::MONDAY); $end = $this->first()->endOfMonth()->endOfWeek(CarbonImmutable::SUNDAY); $events = Calendar::between($start, $end, Auth::user())->groupBy('date'); $weeks = []; for ($day = $start; $day->lte($end); $day = $day->addDay()) { $weeks[intdiv((int) $start->diffInDays($day), 7)][] = [ 'date' => $day, 'inMonth' => $day->month === $this->first()->month, 'isToday' => $day->isToday(), 'events' => ($events[$day->toDateString()] ?? collect())->all(), ]; } return $weeks; } /** * @return array */ public function weekdays(): array { $monday = CarbonImmutable::now()->locale(app()->getLocale())->startOfWeek(CarbonImmutable::MONDAY); return array_map(fn (int $i) => $monday->addDays($i)->isoFormat('ddd'), range(0, 6)); } }