mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +00:00
feat: Configuration et gestion du planning [#2]
This commit is contained in:
@ -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 (
|
||||
<ClasseFormContext.Provider value={{ formData, setFormData }}>
|
||||
@ -68,3 +69,4 @@ export const ClasseFormProvider = ({ children, initialClasse }) => {
|
||||
</ClasseFormContext.Provider>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -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 (
|
||||
<ClassesContext.Provider value={{ schoolYears, getNiveauxLabels, generateAgeToNiveaux, niveauxPremierCycle, niveauxSecondCycle, niveauxTroisiemeCycle, typeEmploiDuTemps, updatePlanning }}>
|
||||
<ClassesContext.Provider value={{ schoolYears,
|
||||
getNiveauxLabels,
|
||||
getNiveauxTabs,
|
||||
generateAgeToNiveaux,
|
||||
niveauxPremierCycle,
|
||||
niveauxSecondCycle,
|
||||
niveauxTroisiemeCycle,
|
||||
typeEmploiDuTemps,
|
||||
updatePlannings,
|
||||
getAmbianceText,
|
||||
getAmbianceName,
|
||||
groupSpecialitiesBySubject,
|
||||
getNiveauNameById,
|
||||
determineInitialPeriod
|
||||
}}>
|
||||
{children}
|
||||
</ClassesContext.Provider>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user