import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { format, addDays, startOfWeek } from 'date-fns'; import { fr } from 'date-fns/locale'; import DropTargetCell from '@/components/Structure/Planning/DropTargetCell'; import { useClasseForm } from '@/context/ClasseFormContext'; import { useClasses } from '@/context/ClassesContext'; import { Calendar } from 'lucide-react'; import SpecialityEventModal from '@/components/Structure/Planning/SpecialityEventModal'; // Assurez-vous du bon chemin d'importation const PlanningClassView = ({ schedule, onDrop, selectedLevel, handleUpdatePlanning, classe, }) => { const { formData } = useClasseForm(); const { determineInitialPeriod } = useClasses(); const [currentPeriod, setCurrentPeriod] = useState( schedule?.emploiDuTemps ? determineInitialPeriod(schedule.emploiDuTemps) : null ); const [isModalOpen, setIsModalOpen] = useState(false); const [selectedCell, setSelectedCell] = useState(null); const [existingEvent, setExistingEvent] = useState(null); useEffect(() => { if (schedule?.emploiDuTemps) { setCurrentPeriod(determineInitialPeriod(schedule.emploiDuTemps)); } }, [schedule]); if (!schedule || !schedule.emploiDuTemps) { return (

Planning

); } const emploiDuTemps = schedule.emploiDuTemps[currentPeriod] || schedule.emploiDuTemps; const joursOuverture = Object.keys(emploiDuTemps); const currentWeekDays = joursOuverture .map((day) => { switch (day.toLowerCase()) { case 'lundi': return 1; case 'mardi': return 2; case 'mercredi': return 3; case 'jeudi': return 4; case 'vendredi': return 5; case 'samedi': return 6; case 'dimanche': return 7; default: return 0; } }) .sort((a, b) => a - b) // Trier les jours dans l'ordre croissant .map((day) => addDays(startOfWeek(new Date(), { weekStartsOn: 1 }), day - 1) ); // Calculer les dates à partir du lundi const getFilteredEvents = (day, time, level) => { const [hour, minute] = time.split(':').map(Number); const startTime = hour + minute / 60; // Convertir l'heure en fraction d'heure return ( emploiDuTemps[day.toLowerCase()]?.filter((event) => { const [eventHour, eventMinute] = event.heure.split(':').map(Number); const eventStartTime = eventHour + eventMinute / 60; const eventEndTime = eventStartTime + parseFloat(event.duree); // Filtrer en fonction du selectedLevel return ( schedule.niveau === level && startTime >= eventStartTime && startTime < eventEndTime ); }) || [] ); }; const handleCellClick = (hour, day) => { const cellEvents = getFilteredEvents(day, hour, selectedLevel); setSelectedCell({ hour, day, selectedLevel }); setExistingEvent(cellEvents.length ? cellEvents[0] : null); setIsModalOpen(true); }; const renderTimeSlots = () => { const timeSlots = []; for ( let hour = parseInt(formData.time_range[0], 10); hour <= parseInt(formData.time_range[1], 10); hour++ ) { const hourString = hour.toString().padStart(2, '0'); timeSlots.push(
{`${hourString}:00`}
{currentWeekDays.map((date, index) => { const day = format(date, 'iiii', { locale: fr }).toLowerCase(); const uniqueKey = `${hourString}:00-${day}-${index}`; return (
handleCellClick(hour, day)} /> handleCellClick(hour, day)} />
); })}
); } return timeSlots; }; return (

Planning

{schedule.emploiDuTemps.S1 && schedule.emploiDuTemps.S2 && (
)} {schedule.emploiDuTemps.T1 && schedule.emploiDuTemps.T2 && schedule.emploiDuTemps.T3 && (
)}
{/* En-tête des jours */}
{currentWeekDays.map((date, index) => (
{format(date, 'EEEE', { locale: fr })}
))}
{/* Contenu du planning */}
{renderTimeSlots()}
setIsModalOpen(false)} selectedCell={selectedCell} existingEvent={existingEvent} handleUpdatePlanning={handleUpdatePlanning} classe={classe} />
); }; PlanningClassView.propTypes = { schedule: PropTypes.shape({ emploiDuTemps: PropTypes.objectOf( PropTypes.arrayOf( PropTypes.shape({ duree: PropTypes.string.isRequired, heure: PropTypes.string.isRequired, matiere: PropTypes.string.isRequired, teachers: PropTypes.arrayOf(PropTypes.string).isRequired, color: PropTypes.string.isRequired, }) ) ).isRequired, plageHoraire: PropTypes.shape({ startHour: PropTypes.number.isRequired, endHour: PropTypes.number.isRequired, }).isRequired, joursOuverture: PropTypes.arrayOf(PropTypes.number).isRequired, }).isRequired, }; export default PlanningClassView;