-
+
+
+
+
+ Planning
+
+ {schedule.emploiDuTemps.S1 && schedule.emploiDuTemps.S2 && (
+
+
+
)}
-
-
- {renderCells()}
+ {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}
+ />
);
};
@@ -124,6 +193,11 @@ PlanningClassView.propTypes = {
})
)
).isRequired,
+ plageHoraire: PropTypes.shape({
+ startHour: PropTypes.number.isRequired,
+ endHour: PropTypes.number.isRequired,
+ }).isRequired,
+ joursOuverture: PropTypes.arrayOf(PropTypes.number).isRequired,
}).isRequired,
};
diff --git a/Front-End/src/components/Structure/Planning/ScheduleManagement.js b/Front-End/src/components/Structure/Planning/ScheduleManagement.js
index 6b858ee..1c98914 100644
--- a/Front-End/src/components/Structure/Planning/ScheduleManagement.js
+++ b/Front-End/src/components/Structure/Planning/ScheduleManagement.js
@@ -1,195 +1,184 @@
'use client'
-import React, { useState, useEffect, useRef } from 'react';
+import React, { useState, useEffect } from 'react';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { DndProvider } from 'react-dnd';
-import { AnimatePresence, findSpring, motion } from 'framer-motion'; // Ajouter cet import
+import { AnimatePresence, motion } from 'framer-motion';
import PlanningClassView from '@/components/Structure/Planning/PlanningClassView';
-import SpecialityEventModal from '@/components/Structure/Planning/SpecialityEventModal';
-import ClassesInfo from '@/components/Structure/Planning/ClassesInfo';
+import SpecialitiesList from '@/components/Structure/Planning/SpecialitiesList';
import { BK_GESTIONENSEIGNANTS_PLANNING_URL } from '@/utils/Url';
-import { ChevronLeft, ChevronRight, Calendar } from 'lucide-react'
-import SelectChoice from '@/components/SelectChoice';
+import { useClasses } from '@/context/ClassesContext';
+import { ClasseFormProvider } from '@/context/ClasseFormContext';
+import TabsStructure from '@/components/Structure/Configuration/TabsStructure';
+import { Bookmark, Users, BookOpen, Newspaper } from 'lucide-react';
-const ScheduleManagement = ({ schedules, setSchedules, handleUpdatePlanning, specialities, teachers, classes }) => {
+const ScheduleManagement = ({ handleUpdatePlanning, classes }) => {
+ const currentYear = new Date().getFullYear();
+ const currentMonth = new Date().getMonth();
+ const currentSchoolYearStart = currentMonth >= 8 ? currentYear : currentYear - 1;
- const [isModalOpen, setIsModalOpen] = useState(false);
- const [selectedClass, setSelectedClass] = useState(null);
- const [schedule, setSchedule] = useState(null);
- const scheduleRef = useRef(null);
- const scheduleId = useRef(null);
- const [planningType, setPlanningType] = useState('TRIMESTRIEL');
- const [currentPeriod, setCurrentPeriod] = useState('T1');
+ const [selectedClass, setSelectedClass] = useState(null);
+ const [selectedLevel, setSelectedLevel] = useState('');
+ const [schedule, setSchedule] = useState(null);
- const planningChoices = [
- { value: 'TRIMESTRIEL', label: 'TRIMESTRIEL' },
- { value: 'SEMESTRIEL', label: 'SEMESTRIEL' },
- { value: 'ANNUEL', label: 'ANNUEL' },
- ];
+ const { getNiveauxTabs } = useClasses();
+ const niveauxLabels = Array.isArray(selectedClass?.niveaux) ? getNiveauxTabs(selectedClass.niveaux) : [];
- useEffect(() => {
- if (selectedClass) {
- scheduleId.current = selectedClass.planning.id;
- setSchedule(selectedClass.planning);
- } else {
- setSchedule(null);
- }
- }, [selectedClass]);
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const handleOpenModal = () => setIsModalOpen(true);
+ const handleCloseModal = () => setIsModalOpen(false);
- // Synchroniser scheduleRef avec schedule
- useEffect(() => {
- scheduleRef.current = schedule;
- }, [schedule]);
+ useEffect(() => {
+ if (selectedClass) {
+ const defaultLevel = niveauxLabels.length > 0 ? niveauxLabels[0].id : '';
+ const niveau = selectedLevel || defaultLevel;
- const handleClassSelect = (cls) => {
- setSelectedClass(cls);
- };
+ setSelectedLevel(niveau);
- useEffect(() => {
- if (schedule) {
- console.log("Schedule data:", schedule);
- }
- }, [schedule]);
-
-
- // Fonction onDrop dans PlanningClassView ou un composant parent
- const onDrop = (item, hour, day) => {
- // Les données de l'élément drag and drop (spécialité par exemple)
- const { id, name, color, teachers } = item;
-
- // Créez une nouvelle copie du planning
- const newSchedule = { ...scheduleRef.current };
-
- // Vérifiez s'il existe déjà une entrée pour le jour
- if (!newSchedule.emploiDuTemps[day]) {
- newSchedule.emploiDuTemps[day] = [];
- }
- const courseTime = `${hour.toString().padStart(2, '0')}:00`;
-
- // Rechercher s'il y a déjà un cours à l'heure spécifiée
- const existingCourseIndex = newSchedule.emploiDuTemps[day].findIndex(course =>
- course.heure === courseTime
- );
-
- const newCourse = {
- duree: '1',
- heure: courseTime,
- matiere: name,
- teachers: teachers,
- color: color,
- };
-
- // S'il existe déjà un cours à cette heure, on le remplace
- if (existingCourseIndex !== -1) {
- newSchedule.emploiDuTemps[day][existingCourseIndex] = newCourse;
- } else {
- // Sinon on ajoute le nouveau cours
- newSchedule.emploiDuTemps[day].push(newCourse);
- }
-
- // Mettez à jour l'état du planning
- setSchedule(newSchedule)
-
- // Appelez la fonction handleUpdatePlanning en dehors de setSchedule
- handleUpdatePlanning(`${BK_GESTIONENSEIGNANTS_PLANNING_URL}`, scheduleId.current, newSchedule);
- };
-
- const getPeriodLabel = (period) => {
- switch(period) {
- case 'T1': return '1er trimestre';
- case 'T2': return '2e trimestre';
- case 'T3': return '3e trimestre';
- case 'S1': return '1er semestre';
- case 'S2': return '2e semestre';
- default: return period;
- }
- };
-
- const handlePeriodChange = (direction) => {
- if (planningType === 'TRIMESTRIEL') {
- if (direction === 'prev') {
- setCurrentPeriod(currentPeriod === 'T1' ? 'T3' : `T${parseInt(currentPeriod.slice(1)) - 1}`);
- } else {
- setCurrentPeriod(currentPeriod === 'T3' ? 'T1' : `T${parseInt(currentPeriod.slice(1)) + 1}`);
- }
- } else if (planningType === 'SEMESTRIEL') {
- setCurrentPeriod(currentPeriod === 'S1' ? 'S2' : 'S1');
+ const currentPlanning = selectedClass.plannings_read.find(planning => planning.niveau === niveau);
+ setSchedule(currentPlanning ? currentPlanning.planning : {});
}
+ }, [selectedClass, niveauxLabels]);
+
+ useEffect(() => {
+ if (selectedClass && selectedLevel) {
+ const currentPlanning = selectedClass.plannings_read.find(planning => planning.niveau === selectedLevel);
+ setSchedule(currentPlanning ? currentPlanning.planning : {});
+ }
+ }, [selectedClass, selectedLevel]);
+
+ const handleLevelSelect = (niveau) => {
+ setSelectedLevel(niveau);
+ };
+
+ const handleClassSelect = (classId) => {
+ const selectedClasse = categorizedClasses['Actives'].find(classe => classe.id === classId);
+ setSelectedClass(selectedClasse);
+ setSelectedLevel('');
+ };
+
+ const onDrop = (item, hour, day) => {
+ const { id, name, color, teachers } = item;
+ const newSchedule = { ...schedule, emploiDuTemps: schedule.emploiDuTemps || {} };
+
+ if (!newSchedule.emploiDuTemps[day]) {
+ newSchedule.emploiDuTemps[day] = [];
+ }
+ const courseTime = `${hour.toString().padStart(2, '0')}:00`;
+
+ const existingCourseIndex = newSchedule.emploiDuTemps[day].findIndex(course => course.heure === courseTime);
+
+ const newCourse = {
+ duree: '1',
+ heure: courseTime,
+ matiere: name,
+ teachers: teachers,
+ color: color,
};
+
+ if (existingCourseIndex !== -1) {
+ newSchedule.emploiDuTemps[day][existingCourseIndex] = newCourse;
+ } else {
+ newSchedule.emploiDuTemps[day].push(newCourse);
+ }
+
+ // Mettre à jour scheduleRef
+ setSchedule(newSchedule)
+
+ // Utiliser `handleUpdatePlanning` pour mettre à jour le planning du niveau de la classe
+ const planningId = selectedClass.plannings_read.find(planning => planning.niveau === selectedLevel)?.planning.id;
+ if (planningId) {
+ console.log('newSchedule : ', newSchedule)
+ handleUpdatePlanning(BK_GESTIONENSEIGNANTS_PLANNING_URL, planningId, newSchedule);
+ }
+ };
- // Fonctionnalité de gestion des emplois du temps
- return (
-
-
-
+ const categorizedClasses = classes.reduce((acc, classe) => {
+ const { annee_scolaire } = classe;
+ const [startYear] = annee_scolaire.split('-').map(Number);
+ const category = startYear >= currentSchoolYearStart ? 'Actives' : 'Anciennes';
-
-
- {
- setPlanningType(e.target.value);
- setCurrentPeriod(e.target.value === 'TRIMESTRIEL' ? 'T1' : 'S1');
- }}
- />
-
+ if (!acc[category]) {
+ acc[category] = [];
+ }
+ acc[category].push(classe);
+ return acc;
+ }, {});
- {planningType !== 'ANNUEL' && (
-
-
- {getPeriodLabel(currentPeriod)}
-
-
- )}
-
-
-
-
- {/*
setIsModalOpen(false)}
- eventData={eventData}
- setEventData={setEventData}
- selectedClass={selectedClass}
- /> */}
+ return (
+
+
+
+
+
+ {/* Colonne Classes */}
+
+
+
+
+ Classes
+
+
+ {categorizedClasses['Actives'] &&
+
({
+ id: classe.id,
+ title: classe.nom_ambiance,
+ icon: Users
+ }))}
+ />
+ }
+
+
+ {/* Colonne Niveaux */}
+
+
+
+
+ Niveaux
+
+
+ {niveauxLabels &&
+
+ }
+
+
+ {/* Colonne Spécialités */}
+
+
+
+
+ Spécialités
+
+
+
+
+
+
- );
+
+
+
+
+ );
+
};
export default ScheduleManagement;
diff --git a/Front-End/src/components/Structure/Planning/SpecialitiesList.js b/Front-End/src/components/Structure/Planning/SpecialitiesList.js
new file mode 100644
index 0000000..e3126ee
--- /dev/null
+++ b/Front-End/src/components/Structure/Planning/SpecialitiesList.js
@@ -0,0 +1,21 @@
+import React from 'react';
+import { useClasses } from '@/context/ClassesContext';
+import DraggableSpeciality from '@/components/Structure/Planning/DraggableSpeciality';
+
+const SpecialitiesList = ({ teachers }) => {
+ const { groupSpecialitiesBySubject } = useClasses();
+
+ return (
+
+
+ {groupSpecialitiesBySubject(teachers).map((speciality) => (
+
+ ))}
+
+
+ );
+};
+
+export default SpecialitiesList;
+
+
diff --git a/Front-End/src/components/Structure/Planning/SpecialityEventModal.js b/Front-End/src/components/Structure/Planning/SpecialityEventModal.js
index 4265b3c..5d6a482 100644
--- a/Front-End/src/components/Structure/Planning/SpecialityEventModal.js
+++ b/Front-End/src/components/Structure/Planning/SpecialityEventModal.js
@@ -1,77 +1,151 @@
-import { usePlanning } from '@/context/PlanningContext';
+import React, { useState, useEffect } from 'react';
import SelectChoice from '@/components/SelectChoice';
-import { format } from 'date-fns';
-import React, { useEffect } from 'react';
-import { Users, BookOpen } from 'lucide-react';
+import { useClasses } from '@/context/ClassesContext';
+import { useClasseForm } from '@/context/ClasseFormContext';
+import { BK_GESTIONENSEIGNANTS_PLANNING_URL } from '@/utils/Url';
+import { BookOpen, Users } from 'lucide-react';
-export default function SpecialityEventModal({ isOpen, onClose, eventData, setEventData, selectedClass }) {
- const { addEvent, updateEvent, deleteEvent, schedules } = usePlanning();
+const SpecialityEventModal = ({ isOpen, onClose, selectedCell, existingEvent, handleUpdatePlanning, classe }) => {
+ const { formData, setFormData } = useClasseForm();
+ const { groupSpecialitiesBySubject } = useClasses();
+ const [selectedSpeciality, setSelectedSpeciality] = useState('');
+ const [selectedTeacher, setSelectedTeacher] = useState('');
+ const [eventData, setEventData] = useState({
+ specialiteId: '',
+ teacherId: '',
+ start: '',
+ duration: '1h'
+ });
useEffect(() => {
if (!isOpen) {
// Réinitialiser eventData lorsque la modale se ferme
setEventData({
- scheduleId: '',
specialiteId: '',
- specialities: [],
- // Réinitialiser d'autres champs si nécessaire
+ teacherId: '',
+ start: '',
+ duration: '1h'
});
+ setSelectedSpeciality('');
+ setSelectedTeacher('');
}
- }, [isOpen, setEventData]);
+ }, [isOpen]);
useEffect(() => {
- if (isOpen && selectedClass) {
-
- setEventData(prev => ({
- ...prev,
- scheduleId: selectedClass.id,
- specialities: Array.from(new Map(
- selectedClass.enseignants.flatMap(teacher =>
- teacher.specialites.map(specialite => [specialite.id, {
- id: specialite.id,
- nom: specialite.nom,
- codeCouleur: specialite.codeCouleur
- }])
- )
- ).values())
- }));
+ if (isOpen) {
+ console.log('debug : ', selectedCell);
+ if (existingEvent) {
+ // Mode édition
+ setEventData(existingEvent);
+ setSelectedSpeciality(existingEvent.specialiteId);
+ setSelectedTeacher(existingEvent.teacherId);
+ } else {
+ // Mode création
+ setEventData(prev => ({
+ ...prev,
+ start: selectedCell.hour,
+ duration: '1h'
+ }));
+ setSelectedSpeciality('');
+ setSelectedTeacher('');
+ }
}
- }, [isOpen, selectedClass, setEventData]);
+ }, [isOpen, existingEvent, selectedCell]);
if (!isOpen) return null;
const handleSubmit = (e) => {
e.preventDefault();
-
- if (!eventData.scheduleId) {
+
+ if (!eventData.specialiteId) {
alert('Veuillez sélectionner une spécialité');
return;
}
-
- const selectedSchedule = schedules.find(s => s.id === eventData.scheduleId);
-
- if (eventData.id) {
- updateEvent(eventData.id, {
- ...eventData,
- scheduleId: eventData.scheduleId,
- color: eventData.color || selectedSchedule?.color
- });
- } else {
- addEvent({
- ...eventData,
- id: `event-${Date.now()}`,
- scheduleId: eventData.scheduleId,
- color: eventData.color || selectedSchedule?.color
- });
+
+ if (!eventData.teacherId) {
+ alert('Veuillez sélectionner un enseignant');
+ return;
}
+
+ // Transformer eventData pour correspondre au format du planning
+ const selectedTeacherData = formData.enseignants.find(teacher => teacher.id === parseInt(eventData.teacherId, 10));
+ const newCourse = {
+ color: '#FF0000', // Vous pouvez définir la couleur de manière dynamique si nécessaire
+ teachers: selectedTeacherData ? [`${selectedTeacherData.nom} ${selectedTeacherData.prenom}`] : [],
+ heure: `${eventData.start}:00`,
+ duree: eventData.duration.replace('h', ''), // Supposons que '1h' signifie 1
+ matiere: 'GROUPE'
+ };
+
+ // Mettre à jour le planning
+ const updatedPlannings = classe.plannings_read.map(planning => {
+ if (planning.niveau === selectedCell.selectedLevel) {
+ const newEmploiDuTemps = { ...planning.emploiDuTemps };
+
+ if (!newEmploiDuTemps[selectedCell.day]) {
+ newEmploiDuTemps[selectedCell.day] = [];
+ }
+
+ const courseTime = newCourse.heure;
+ const existingCourseIndex = newEmploiDuTemps[selectedCell.day].findIndex(course => course.heure === courseTime);
+
+ if (existingCourseIndex !== -1) {
+ newEmploiDuTemps[selectedCell.day][existingCourseIndex] = newCourse;
+ } else {
+ newEmploiDuTemps[selectedCell.day].push(newCourse);
+ }
+
+ return {
+ ...planning,
+ emploiDuTemps: newEmploiDuTemps
+ };
+ }
+ return planning;
+ });
+
+ const updatedPlanning = updatedPlannings.find(planning => planning.niveau === selectedCell.selectedLevel);
+
+ setFormData(prevFormData => ({
+ ...prevFormData,
+ plannings: updatedPlannings
+ }));
+
+ // Appeler handleUpdatePlanning avec les arguments appropriés
+ const planningId = updatedPlanning ? updatedPlanning.planning.id : null;
+ console.log("id : ", planningId)
+ if (planningId) {
+ handleUpdatePlanning(BK_GESTIONENSEIGNANTS_PLANNING_URL, planningId, updatedPlanning.emploiDuTemps);
+ }
+
onClose();
};
- const handleDelete = () => {
- if (eventData.id && confirm('Êtes-vous sûr de vouloir supprimer cet événement ?')) {
- deleteEvent(eventData.id);
- onClose();
- }
+ const filteredTeachers = selectedSpeciality
+ ? formData.enseignants.filter(teacher =>
+ teacher.specialites_ids.includes(parseInt(selectedSpeciality, 10))
+ )
+ : formData.enseignants;
+
+ const handleSpecialityChange = (e) => {
+ const specialityId = e.target.value;
+ setSelectedSpeciality(specialityId);
+
+ // Mettre à jour eventData
+ setEventData(prev => ({
+ ...prev,
+ specialiteId: specialityId
+ }));
+ };
+
+ const handleTeacherChange = (e) => {
+ const teacherId = e.target.value;
+ setSelectedTeacher(teacherId);
+
+ // Mettre à jour eventData
+ setEventData(prev => ({
+ ...prev,
+ teacherId: teacherId
+ }));
};
return (
@@ -84,103 +158,77 @@ export default function SpecialityEventModal({ isOpen, onClose, eventData, setEv
);
-}
+};
+
+export default SpecialityEventModal;
diff --git a/Front-End/src/context/ClasseFormContext.js b/Front-End/src/context/ClasseFormContext.js
index 0fcd629..7ab60db 100644
--- a/Front-End/src/context/ClasseFormContext.js
+++ b/Front-End/src/context/ClasseFormContext.js
@@ -1,66 +1,67 @@
-import React, { createContext, useState, useContext } from 'react';
-import { useClasses } from '@/context/ClassesContext'
+import React, { createContext, useState, useContext, useEffect } from 'react';
+import { useClasses } from '@/context/ClassesContext';
const ClasseFormContext = createContext();
export const useClasseForm = () => useContext(ClasseFormContext);
export const ClasseFormProvider = ({ children, initialClasse }) => {
+ const { getNiveauxLabels } = useClasses();
+ const [formData, setFormData] = useState({});
- const { getNiveauxLabels, selectedDays } = useClasses();
+ useEffect(() => {
+ const plannings = initialClasse.plannings_read || [];
- const [formData, setFormData] = useState(() => {
- const planning = initialClasse.planning || {};
- const emploiDuTemps = planning.emploiDuTemps || {};
-
- const dateDebutSemestre1 = emploiDuTemps.S1 ? emploiDuTemps.S1.DateDebut : '';
- const dateFinSemestre1 = emploiDuTemps.S1 ? emploiDuTemps.S1.DateFin : '';
- const dateDebutSemestre2 = emploiDuTemps.S2 ? emploiDuTemps.S2.DateDebut : '';
- const dateFinSemestre2 = emploiDuTemps.S2 ? emploiDuTemps.S2.DateFin : '';
-
- const dateDebutTrimestre1 = emploiDuTemps.T1 ? emploiDuTemps.T1.DateDebut : '';
- const dateFinTrimestre1 = emploiDuTemps.T1 ? emploiDuTemps.T1.DateFin : '';
- const dateDebutTrimestre2 = emploiDuTemps.T2 ? emploiDuTemps.T2.DateDebut : '';
- const dateFinTrimestre2 = emploiDuTemps.T2 ? emploiDuTemps.T2.DateFin : '';
- const dateDebutTrimestre3 = emploiDuTemps.T3 ? emploiDuTemps.T3.DateDebut : '';
- const dateFinTrimestre3 = emploiDuTemps.T3 ? emploiDuTemps.T3.DateFin : '';
-
- return {
- nom_ambiance: initialClasse.nom_ambiance || '',
- tranche_age: initialClasse.tranche_age || '',
- nombre_eleves: initialClasse.nombre_eleves || '',
- langue_enseignement: initialClasse.langue_enseignement || 'Français',
- annee_scolaire: initialClasse.annee_scolaire || '',
- enseignants_ids: initialClasse.enseignants_ids || [],
- planning_type: planning.type || 1,
- plage_horaire: planning.plageHoraire || ['08:30', '17:30'],
- jours_ouverture: planning.joursOuverture || [1, 2, 4, 5],
- niveaux: initialClasse.niveaux || [],
- niveaux_label: getNiveauxLabels(initialClasse.niveaux || []),
- date_debut_semestre_1: dateDebutSemestre1,
- date_fin_semestre_1: dateFinSemestre1,
- date_debut_semestre_2: dateDebutSemestre2,
- date_fin_semestre_2: dateFinSemestre2,
- date_debut_trimestre_1: dateDebutTrimestre1,
- date_fin_trimestre_1: dateFinTrimestre1,
- date_debut_trimestre_2: dateDebutTrimestre2,
- date_fin_trimestre_2: dateFinTrimestre2,
- date_debut_trimestre_3: dateDebutTrimestre3,
- date_fin_trimestre_3: dateFinTrimestre3,
- planning: {
- type: planning.type || 1,
- plageHoraire: planning.plageHoraire || ['08:30', '17:30'],
- joursOuverture: planning.joursOuverture || [1, 2, 4, 5],
- emploiDuTemps: planning.emploiDuTemps || {
- S1: { DateDebut: '', DateFin: '', lundi: [], mardi: [], mercredi: [], jeudi: [], vendredi: [], samedi: [], dimanche: [] },
- S2: { DateDebut: '', DateFin: '', lundi: [], mardi: [], mercredi: [], jeudi: [], vendredi: [], samedi: [], dimanche: [] },
- T1: { DateDebut: '', DateFin: '', lundi: [], mardi: [], mercredi: [], jeudi: [], vendredi: [], samedi: [], dimanche: [] },
- T2: { DateDebut: '', DateFin: '', lundi: [], mardi: [], mercredi: [], jeudi: [], vendredi: [], samedi: [], dimanche: [] },
- T3: { DateDebut: '', DateFin: '', lundi: [], mardi: [], mercredi: [], jeudi: [], vendredi: [], samedi: [], dimanche: [] },
- }
- }
+ const defaultEmploiDuTemps = {
+ lundi: [],
+ mardi: [],
+ mercredi: [],
+ jeudi: [],
+ vendredi: [],
+ samedi: [],
+ dimanche: []
};
- });
+
+ const generateEmploiDuTemps = (planningType) => {
+ if (planningType === 1) {
+ return defaultEmploiDuTemps;
+ } else if (planningType === 2) {
+ return {
+ S1: { DateDebut: '', DateFin: '', ...defaultEmploiDuTemps },
+ S2: { DateDebut: '', DateFin: '', ...defaultEmploiDuTemps },
+ };
+ } else if (planningType === 3) {
+ return {
+ T1: { DateDebut: '', DateFin: '', ...defaultEmploiDuTemps },
+ T2: { DateDebut: '', DateFin: '', ...defaultEmploiDuTemps },
+ T3: { DateDebut: '', DateFin: '', ...defaultEmploiDuTemps },
+ };
+ }
+ };
+
+ const newFormData = {
+ nom_ambiance: initialClasse.nom_ambiance || '',
+ tranche_age: initialClasse.tranche_age || '',
+ nombre_eleves: initialClasse.nombre_eleves || '',
+ langue_enseignement: initialClasse.langue_enseignement || 'Français',
+ annee_scolaire: initialClasse.annee_scolaire || '',
+ enseignants: initialClasse.enseignants || [],
+ enseignants_ids: initialClasse.enseignants_ids || [],
+ type: initialClasse.type || 1,
+ plage_horaire: initialClasse.plage_horaire || ['08:30', '17:30'],
+ jours_ouverture: initialClasse.jours_ouverture || [1, 2, 4, 5],
+ niveaux: initialClasse.niveaux || [],
+ plannings: plannings.length ? plannings.map(planning => ({
+ niveau: planning.planning.niveau,
+ emploiDuTemps: planning.planning.emploiDuTemps
+ })) : (initialClasse.niveaux || []).map(niveau => ({
+ niveau: niveau,
+ emploiDuTemps: generateEmploiDuTemps(initialClasse.type || 1)
+ }))
+ };
+
+ setFormData(newFormData);
+}, [initialClasse, getNiveauxLabels]);
return (
@@ -68,3 +69,4 @@ export const ClasseFormProvider = ({ children, initialClasse }) => {
);
};
+
diff --git a/Front-End/src/context/ClassesContext.js b/Front-End/src/context/ClassesContext.js
index 7050e2b..5a6dfca 100644
--- a/Front-End/src/context/ClassesContext.js
+++ b/Front-End/src/context/ClassesContext.js
@@ -1,4 +1,5 @@
import React, { createContext, useContext } from 'react';
+import { School } from 'lucide-react';
const ClassesContext = createContext();
@@ -9,9 +10,9 @@ export const ClassesProvider = ({ children }) => {
const schoolYears = [
{ value: '', label: 'Sélectionner une période' },
+ { value: `${currentYear - 1}-${currentYear}`, label: `${currentYear - 1}-${currentYear}` },
{ value: `${currentYear}-${currentYear + 1}`, label: `${currentYear}-${currentYear + 1}` },
{ value: `${currentYear + 1}-${currentYear + 2}`, label: `${currentYear + 1}-${currentYear + 2}` },
- { value: `${currentYear + 2}-${currentYear + 3}`, label: `${currentYear + 2}-${currentYear + 3}` },
];
const niveauxPremierCycle = [
@@ -57,6 +58,18 @@ export const ClassesProvider = ({ children }) => {
});
};
+ const getNiveauxTabs = (niveaux) => {
+ // Trier les niveaux par id
+ const sortedNiveaux = niveaux.sort((a, b) => a - b);
+
+ // Mapper les labels correspondants
+ return sortedNiveaux.map(niveauId => {
+ const niveau = allNiveaux.find(n => n.id === niveauId);
+ return niveau ? { id: niveau.id, title: niveau.name, icon: School } : { id: 'unknown', title: 'Niveau inconnu', icon: null };
+ });
+ };
+
+
const generateAgeToNiveaux = (minAge, maxAge) => {
if (minAge === null || isNaN(minAge)) {
return [];
@@ -67,73 +80,149 @@ export const ClassesProvider = ({ children }) => {
.map(({ id }) => id);
};
- const updatePlanning = (formData) => {
+ const getNiveauNameById = (id) => {
+ const niveau = allNiveaux.find(item => item.id.toString() === id);
+ return niveau ? niveau.name : '';
+ };
- let updatedPlanning = { ...formData.planning };
+ const getAmbianceText = (classe) => {
+ const ambiance = classe.nom_ambiance ? classe.nom_ambiance : '';
+ const trancheAge = classe.tranche_age ? `${classe.tranche_age} ans` : '';
- const emploiDuTemps = formData.jours_ouverture.reduce((acc, dayId) => {
- const dayName = selectedDays[dayId];
- if (dayName) {
- acc[dayName] = [];
- }
- return acc;
- }, {});
-
- if (formData.planning_type === 1) {
- updatedPlanning = {
- type: 1,
- plageHoraire: formData.plage_horaire,
- joursOuverture: formData.jours_ouverture,
- emploiDuTemps
- };
- } else if (formData.planning_type === 2) {
- updatedPlanning = {
- type: 2,
- plageHoraire: formData.plage_horaire,
- joursOuverture: formData.jours_ouverture,
- emploiDuTemps: {
- S1: {
- DateDebut: formData.date_debut_semestre_1,
- DateFin: formData.date_fin_semestre_1,
- ...emploiDuTemps
- },
- S2: {
- DateDebut: formData.date_debut_semestre_2,
- DateFin: formData.date_fin_semestre_2,
- ...emploiDuTemps
- }
- }
- };
- } else if (formData.planning_type === 3) {
- updatedPlanning = {
- type: 3,
- plageHoraire: formData.plage_horaire,
- joursOuverture: formData.jours_ouverture,
- emploiDuTemps: {
- T1: {
- DateDebut: formData.date_debut_trimestre_1,
- DateFin: formData.date_fin_trimestre_1,
- ...emploiDuTemps
- },
- T2: {
- DateDebut: formData.date_debut_trimestre_2,
- DateFin: formData.date_fin_trimestre_2,
- ...emploiDuTemps
- },
- T3: {
- DateDebut: formData.date_debut_trimestre_3,
- DateFin: formData.date_fin_trimestre_3,
- ...emploiDuTemps
- }
- }
- };
+ if (ambiance && trancheAge) {
+ return `${ambiance} (${trancheAge})`;
+ } else if (ambiance) {
+ return ambiance;
+ } else if (trancheAge) {
+ return trancheAge;
+ } else {
+ return 'Non spécifié';
}
+ };
- return updatedPlanning;
+ const getAmbianceName = (classe) => {
+ const ambiance = classe.nom_ambiance ? classe.nom_ambiance : '';
+
+ if (ambiance) {
+ return ambiance;
+ } else {
+ return 'Non spécifié';
+ }
+ };
+
+ const updatePlannings = (formData, existingPlannings) => {
+ return formData.niveaux.map(niveau => {
+ let existingPlanning = existingPlannings.find(planning => planning.niveau === niveau);
+
+ const emploiDuTemps = formData.jours_ouverture.reduce((acc, dayId) => {
+ const dayName = selectedDays[dayId];
+ console.log('dayId:', dayId, 'dayName:', dayName); // Ajout de log pour vérifier les correspondances
+ if (dayName) {
+ acc[dayName] = existingPlanning?.emploiDuTemps?.[dayName] || [];
+ }
+ return acc;
+ }, {});
+
+ console.log('Emploi du Temps initialisé :', emploiDuTemps);
+
+ let updatedPlanning;
+ if (formData.type === 1) {
+ updatedPlanning = {
+ niveau: niveau,
+ emploiDuTemps
+ };
+ } else if (formData.type === 2) {
+ updatedPlanning = {
+ niveau: niveau,
+ emploiDuTemps: {
+ S1: {
+ DateDebut: formData.date_debut_semestre_1,
+ DateFin: formData.date_fin_semestre_1,
+ ...emploiDuTemps
+ },
+ S2: {
+ DateDebut: formData.date_debut_semestre_2,
+ DateFin: formData.date_fin_semestre_2,
+ ...emploiDuTemps
+ }
+ }
+ };
+ } else if (formData.type === 3) {
+ updatedPlanning = {
+ niveau: niveau,
+ emploiDuTemps: {
+ T1: {
+ DateDebut: formData.date_debut_trimestre_1,
+ DateFin: formData.date_fin_trimestre_1,
+ ...emploiDuTemps
+ },
+ T2: {
+ DateDebut: formData.date_debut_trimestre_2,
+ DateFin: formData.date_fin_trimestre_2,
+ ...emploiDuTemps
+ },
+ T3: {
+ DateDebut: formData.date_debut_trimestre_3,
+ DateFin: formData.date_fin_trimestre_3,
+ ...emploiDuTemps
+ }
+ }
+ };
+ }
+
+ console.log('Updated Planning:', updatedPlanning);
+
+ // Fusionner les plannings existants avec les nouvelles données
+ return existingPlanning
+ ? { ...existingPlanning, ...updatedPlanning }
+ : updatedPlanning;
+ });
+};
+
+ const groupSpecialitiesBySubject = (enseignants) => {
+ const groupedSpecialities = {};
+
+ enseignants.forEach(teacher => {
+ teacher.specialites.forEach(specialite => {
+ if (!groupedSpecialities[specialite.id]) {
+ groupedSpecialities[specialite.id] = {
+ ...specialite,
+ teachers: [`${teacher.nom} ${teacher.prenom}`],
+ };
+ } else {
+ groupedSpecialities[specialite.id].teachers.push(`${teacher.nom} ${teacher.prenom}`);
+ }
+ });
+ });
+
+ return Object.values(groupedSpecialities);
+ };
+
+ const determineInitialPeriod = (emploiDuTemps) => {
+ if (emploiDuTemps.S1 && emploiDuTemps.S2) {
+ return 'S1'; // Planning semestriel
+ } else if (emploiDuTemps.T1 && emploiDuTemps.T2 && emploiDuTemps.T3) {
+ return 'T1'; // Planning trimestriel
+ }
+ return ''; // Planning annuel ou autre
};
return (
-
+
{children}
);