import { useState, useEffect } from 'react'; import { Layers, Plus, Trash2, Save, RefreshCw } from 'lucide-react'; import { matchingAPI, divisionsAPI } from '../../services/api'; /** * Schedule configuration section for division collision groups * Allows organizing divisions into time slots for matching algorithm */ const ScheduleConfigSection = ({ slug, event, onRefresh }) => { const [divisions, setDivisions] = useState([]); const [scheduleSlots, setScheduleSlots] = useState([]); const [savingSchedule, setSavingSchedule] = useState(false); // Load divisions on mount useEffect(() => { loadDivisions(); }, []); // Initialize schedule slots when event changes useEffect(() => { if (event?.scheduleConfig?.slots) { setScheduleSlots(event.scheduleConfig.slots); } else { setScheduleSlots([]); } }, [event]); const loadDivisions = async () => { try { const data = await divisionsAPI.getAll(); setDivisions(data); } catch (err) { console.error('Failed to load divisions:', err); } }; const handleAddSlot = () => { const maxOrder = scheduleSlots.length > 0 ? Math.max(...scheduleSlots.map(s => s.order)) : 0; setScheduleSlots([...scheduleSlots, { order: maxOrder + 1, divisionIds: [] }]); }; const handleRemoveSlot = (order) => { setScheduleSlots(scheduleSlots.filter(s => s.order !== order)); }; const handleToggleDivision = (slotOrder, divisionId) => { setScheduleSlots(scheduleSlots.map(slot => { if (slot.order !== slotOrder) { // Remove division from other slots if it's being added to this one return { ...slot, divisionIds: slot.divisionIds.filter(id => id !== divisionId) }; } // Toggle division in this slot const hasDiv = slot.divisionIds.includes(divisionId); return { ...slot, divisionIds: hasDiv ? slot.divisionIds.filter(id => id !== divisionId) : [...slot.divisionIds, divisionId] }; })); }; const handleSaveSchedule = async () => { try { setSavingSchedule(true); const scheduleConfig = scheduleSlots.length > 0 ? { slots: scheduleSlots.filter(s => s.divisionIds.length > 0) } : null; await matchingAPI.setScheduleConfig(slug, scheduleConfig); onRefresh?.(); } catch (err) { console.error('Failed to save schedule:', err); alert('Nie udalo sie zapisac harmonogramu'); } finally { setSavingSchedule(false); } }; // Get all assigned division IDs const getAssignedDivisionIds = () => { return new Set(scheduleSlots.flatMap(s => s.divisionIds)); }; return (

Konfiguracja harmonogramu

Dywizje w tym samym slocie czasowym koliduja ze soba (nie mozna nagrywac podczas gdy sie tancczy). Dywizje bez przypisanego slotu sa traktowane jako osobne.

{/* Slots */}
{scheduleSlots .sort((a, b) => a.order - b.order) .map((slot) => (

Slot {slot.order}

{divisions.map((division) => { const isInSlot = slot.divisionIds.includes(division.id); const assignedDivIds = getAssignedDivisionIds(); const isInOtherSlot = assignedDivIds.has(division.id) && !isInSlot; return ( ); })}
{slot.divisionIds.length === 0 && (

Kliknij dywizje aby dodac do slotu

)}
))}
{/* Add slot button */}
{/* Current config info */} {event?.scheduleConfig?.slots?.length > 0 && (

Zapisany harmonogram: {event.scheduleConfig.slots.length} slot(ow)

)}
); }; export default ScheduleConfigSection;