@using OnProfNext.Client.Services @using OnProfNext.Shared.Models.DTOs @inject BookingApiService BookingService
@CurrentMonth.ToString("MMMM yyyy")
@foreach (var week in GetCalendarWeeks()) { @foreach (var day in week) { } }
Mo Di Mi Do Fr Sa So
@day.Day
@GetHoursForDay(day) h
@if (showModal) { } @code { [Parameter] public List Bookings { get; set; } = new(); [Parameter] public List Orders { get; set; } = new(); [Parameter] public EventCallback OnBookingCreated { get; set; } [Parameter] public EventCallback OnError { get; set; } private DateTime CurrentMonth = DateTime.Today; private bool showModal; private DateTime selectedDate; private BookingCreateDto newBooking = new(); private void PreviousMonth() { CurrentMonth = CurrentMonth.AddMonths(-1); } private void NextMonth() { CurrentMonth = CurrentMonth.AddMonths(1); } private List GetCalendarWeeks() { var weeks = new List(); var firstDayOfMonth = new DateTime(CurrentMonth.Year, CurrentMonth.Month, 1); var firstMonday = firstDayOfMonth.AddDays(-(int)firstDayOfMonth.DayOfWeek + (firstDayOfMonth.DayOfWeek == DayOfWeek.Sunday ? 0 : 1)); var currentDay = firstMonday; for (int weekCount = 0; weekCount < 6; weekCount++) { // Prüfe, ob currentDay noch im gültigen DateTime-Bereich liegt if (currentDay.Year >= DateTime.MaxValue.Year) break; var week = new DateTime[7]; for (int i = 0; i < 7; i++) { week[i] = currentDay; // Prüfe, ob das Hinzufügen eines Tages möglich ist if (currentDay < DateTime.MaxValue.AddDays(-1)) currentDay = currentDay.AddDays(1); else break; } weeks.Add(week); // Wenn currentDay nicht mehr incrementiert werden kann, beende die Schleife if (currentDay >= DateTime.MaxValue.AddDays(-1)) break; } return weeks; } private bool IsWeekend(DateTime day) { return day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday; } private decimal GetHoursForDay(DateTime day) { return Bookings.Where(b => b.Date.Date == day.Date).Sum(b => b.Hours); } private string GetHoursColorClass(DateTime day) { var hours = GetHoursForDay(day); if (hours >= 8) return "text-success"; else if (hours > 6 && hours < 8) return "text-warning"; else return "text-danger"; } private void OpenModal(DateTime date) { selectedDate = date; newBooking = new() { Date = date, MandantId = 1 }; showModal = true; } private void CloseModal() => showModal = false; private async Task SaveBookingAsync() { var (success, error) = await BookingService.CreateBookingAsync(newBooking); if (success) { await OnBookingCreated.InvokeAsync(); CloseModal(); } else { await OnError.InvokeAsync(error ?? "Fehler beim Speichern der Buchung."); } } }