Dostępność trenerów (widok administratora)
Wspólny, kolorowy kalendarz tygodniowy pokazujący dostępność wszystkich trenerów w jednym miejscu, z możliwością edycji.
👤 Instrukcja dla pracownika / administratora
Ścieżka: Dashboard ➔ Kalendarz ➔ Dostępność trenerów
Zamiast osobnego kalendarza dla każdego trenera, administrator i pracownik widzą jeden wspólny kalendarz tygodniowy, na którym zebrana jest dostępność wszystkich trenerów.
Jak czytać kalendarz
- Każdy trener ma przypisany osobny, stały kolor. Kolor jest przypisywany automatycznie i nie zmienia się przy filtrowaniu.
- Dostępność wyświetla się jako bloki przypominające rezerwacje — z imieniem trenera i zakresem godzin (np. Sławek 9:00–18:00).
- Gdy kilku trenerów jest dostępnych tego samego dnia, ich bloki układają się obok siebie w kolumnach, więc żaden się nie przysłania.
- Nad kalendarzem znajduje się legenda z kolorem i imieniem każdego widocznego trenera.
- Zaplanowane zajęcia trenera pokazywane są jako blok w jego kolorze z ukośnym wzorem (zajęcia nie są edytowalne z tego widoku).
Filtrowanie
Lista rozwijana „Wybierz trenerów” pozwala zawęzić kalendarz do jednego lub kilku wybranych trenerów. Brak zaznaczenia oznacza wyświetlenie wszystkich trenerów. Kolory trenerów pozostają niezmienione po zawężeniu listy.
Edycja i dodawanie dostępności
- Edycja: kliknij blok dostępności, aby otworzyć okno edycji (zmiana godzin, cykliczności lub usunięcie).
- Dodawanie w miejscu: kliknij pustą część kolumny dnia — otworzy się okno dodawania z wstępnie ustawioną datą i godziną. Jeśli filtr zawężono do jednego trenera, zostanie on wybrany automatycznie; w przeciwnym razie należy wskazać trenera na liście.
- Dodawanie z przycisku: przycisk „Dodaj dostępność” otwiera okno, w którym wybiera się trenera, datę i godziny.
Widok mobilny
Na urządzeniach mobilnych kalendarz przełącza się w listę agendy — dni tygodnia z kolorowymi pozycjami trenerów (imię + godziny). Kliknięcie pozycji dostępności otwiera edycję.
🛠️ Dokumentacja techniczna
Komponenty
app/(dashboard)/dashboard/availability/page.tsx— server component; pobiera dane przezgetInstructorsWithScheduleData(currentWeekStart, weekEndDate)i renderujeAdminAvailabilityViewdla rólADMIN/BACKOFFICE.app/(dashboard)/dashboard/availability/components/AdminAvailabilityView.tsx— nawigacja po tygodniach, filtr trenerów (MultiSelect), budowanie mapy kolorów, legenda oraz podłączenie okien dodawania/edycji.components/availability/CombinedWeeklyCalendar.tsx— wspólny kalendarz: rozwijanie dostępności cyklicznej, scalanie sąsiadujących przedziałów, układ kolumnowy nakładających się bloków oraz warianty desktop (siatka) i mobile (agenda).components/availability/AddAvailabilityDialog.tsx— obsługuje opcjonalny wybór trenera (instructorOptions), gdy dodawanie odbywa się z widoku zbiorczego.lib/utils/instructor-colors.ts— paleta kolorów (INSTRUCTOR_COLOR_PALETTE) orazbuildInstructorColorMap(instructorIds)przypisujący kolor deterministycznie wg indeksu.
Przypisywanie kolorów
Kolory przypisywane są na podstawie listy trenerów posortowanej alfabetycznie po nazwisku, indeksem do palety (index % długość palety). Sortowanie odbywa się przed filtrowaniem, dzięki czemu kolor danego trenera jest stały niezależnie od aktywnego filtra.
Układ nakładających się bloków
Zdarzenia w obrębie jednego dnia (dostępności + zajęcia) są grupowane w „klastry” nachodzących na siebie przedziałów. W klastrze każdemu zdarzeniu przydzielana jest pierwsza wolna kolumna (lane), a szerokość bloku to 100% / liczba kolumn w klastrze. Gwarantuje to, że nakładające się bloki nie zasłaniają się wzajemnie.
Dane
Typy InstructorAvailabilitySlot i InstructorGame pochodzą z lib/actions/instructor-schedule.ts. Dostępność cykliczna (is_recurring, recurrence_type, recurrence_end_date) jest rozwijana po stronie klienta na zakres wyświetlanego tygodnia. Zapis/edycja/usuwanie korzystają z akcji createAvailabilitySlot, updateAvailabilitySlot, deleteAvailabilitySlot.