import React, { useState, useEffect } from 'react' const AdminCalendarResource = () => { const [currentDate, setCurrentDate] = useState(new Date()) const [guides, setGuides] = useState([]) const [selectedGuide, setSelectedGuide] = useState(null) const [workingDays, setWorkingDays] = useState([]) const [holidays, setHolidays] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { loadData() }, [currentDate]) const loadData = async () => { setLoading(true) try { const [guidesRes, holidaysRes] = await Promise.all([ fetch('/api/guides'), fetch('/api/holidays') ]) const guidesData = await guidesRes.json() const holidaysData = await holidaysRes.json() setGuides(guidesData.data || guidesData) setHolidays(holidaysData) if (selectedGuide) { const workingRes = await fetch(`/api/guide-working-days?guide_id=${selectedGuide}&month=${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}`) const workingData = await workingRes.json() setWorkingDays(workingData) } } catch (error) { console.error('Error loading data:', error) } setLoading(false) } const getDaysInMonth = (date) => { const year = date.getFullYear() const month = date.getMonth() const daysInMonth = new Date(year, month + 1, 0).getDate() const firstDayOfWeek = new Date(year, month, 1).getDay() const days = [] // Добавляем пустые дни в начале for (let i = 0; i < (firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1); i++) { days.push(null) } // Добавляем дни месяца for (let day = 1; day <= daysInMonth; day++) { days.push(day) } return days } const isWorkingDay = (day) => { if (!day || !selectedGuide) return false const dateStr = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` return workingDays.some(wd => wd.work_date === dateStr) } const isHoliday = (day) => { if (!day) return false const dateStr = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` return holidays.some(h => h.date === dateStr) } const toggleWorkingDay = async (day) => { if (!selectedGuide || !day) return const dateStr = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}` const isWorking = isWorkingDay(day) try { if (isWorking) { await fetch('/api/guide-working-days', { method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ guide_id: selectedGuide, work_date: dateStr }) }) } else { await fetch('/api/guide-working-days', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ guide_id: selectedGuide, work_date: dateStr }) }) } loadData() } catch (error) { console.error('Error toggling working day:', error) } } const changeMonth = (delta) => { const newDate = new Date(currentDate) newDate.setMonth(newDate.getMonth() + delta) setCurrentDate(newDate) } const monthNames = [ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' ] const weekDays = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС'] if (loading) { return (
Загрузка календаря...
) } return (

Календарь рабочих дней гидов

{monthNames[currentDate.getMonth()]} {currentDate.getFullYear()}

{selectedGuide && (
{weekDays.map(day => (
{day}
))}
{getDaysInMonth(currentDate).map((day, index) => (
toggleWorkingDay(day)} style={{ padding: '15px', textAlign: 'center', border: '1px solid #ddd', minHeight: '50px', cursor: day ? 'pointer' : 'default', background: day ? (isHoliday(day) ? '#ffcccb' : isWorkingDay(day) ? '#c8e6c9' : 'white') : '#f9f9f9', color: day ? (isHoliday(day) ? '#d32f2f' : '#333') : '#ccc', fontWeight: day ? 'normal' : '300' }} > {day || ''}
))}
Рабочий день
Выходной/Праздник
Не назначено
)} {!selectedGuide && (
Выберите гида для просмотра календаря
)}
) } export default AdminCalendarResource