import { useEffect, useState } from 'react'; import { formatIsoDate, toIsoDate } from '../shared/dates.js'; import { absenceStatusClass, absenceStatusLabel, cancelAbsence, createAbsence, fetchAbsences, validateAbsence } from './teacher-service.js'; export function AbsencePanel() { const [formOpen, setFormOpen] = useState(false); const [startDate, setStartDate] = useState(() => toIsoDate(new Date())); const [endDate, setEndDate] = useState(() => toIsoDate(new Date())); const [reason, setReason] = useState(''); const [status, setStatus] = useState({ message: '', isError: false }); const [items, setItems] = useState(null); const [error, setError] = useState(false); useEffect(() => { let active = true; (async () => { try { const loaded = await fetchAbsences(); if (active) setItems(loaded); } catch { if (active) setError(true); } })(); return () => { active = false; }; }, []); async function reload() { try { setItems(await fetchAbsences()); setError(false); } catch { setError(true); } } async function submit(event) { event.preventDefault(); const validation = validateAbsence({ endDate, reason, startDate }); if (validation) { setStatus({ message: validation, isError: true }); return; } try { await createAbsence({ endDate, reason: reason.trim(), startDate }); setReason(''); setStatus({ message: 'Заявка отправлена кафедре', isError: false }); await reload(); } catch { setStatus({ message: 'Не удалось отправить заявку об отсутствии', isError: true }); } } async function cancel(id) { try { await cancelAbsence(id); setStatus({ message: 'Заявка отменена', isError: false }); await reload(); } catch { setStatus({ message: 'Не удалось отменить заявку', isError: true }); } } return (
Изменение планов

Сообщить об отсутствии

Заявка поступит кафедре на подтверждение. После согласования учебный отдел сможет подобрать замены.

{status.message}
{error ? (
Не удалось загрузить заявки об отсутствии
) : items === null ? (
Загрузка заявок...
) : items.length === 0 ? (
Заявок об отсутствии пока нет
) : items.map(item => (
{formatIsoDate(item.startDate)} — {formatIsoDate(item.endDate)}

{item.reason || 'Причина не указана'}

{absenceStatusLabel(item.status)} {item.status === 'PENDING' && ( )}
))}
); }