mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 16:03:21 +00:00
feat: Gestion du planning [3]
This commit is contained in:
@ -1,71 +0,0 @@
|
||||
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({});
|
||||
|
||||
useEffect(() => {
|
||||
const plannings = initialClasse.plannings_read || [];
|
||||
|
||||
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 = {
|
||||
atmosphere_name: initialClasse.atmosphere_name || '',
|
||||
age_range: initialClasse.age_range || '',
|
||||
number_of_students: initialClasse.number_of_students || '',
|
||||
teaching_language: initialClasse.teaching_language || 'Français',
|
||||
school_year: initialClasse.school_year || '',
|
||||
teachers: initialClasse.teachers || [],
|
||||
teachers_details: initialClasse.teachers_details || [],
|
||||
type: initialClasse.type || 1,
|
||||
time_range: initialClasse.time_range || ['08:30', '17:30'],
|
||||
opening_days: initialClasse.opening_days || [1, 2, 4, 5],
|
||||
levels: initialClasse.levels || [],
|
||||
// plannings: plannings.length ? plannings.map(planning => ({
|
||||
// niveau: planning.planning.niveau,
|
||||
// emploiDuTemps: planning.planning.emploiDuTemps
|
||||
// })) : (initialClasse.levels || []).map(niveau => ({
|
||||
// niveau: niveau,
|
||||
// emploiDuTemps: generateEmploiDuTemps(initialClasse.type || 1)
|
||||
// }))
|
||||
};
|
||||
|
||||
setFormData(newFormData);
|
||||
}, [initialClasse, getNiveauxLabels]);
|
||||
|
||||
return (
|
||||
<ClasseFormContext.Provider value={{ formData, setFormData }}>
|
||||
{children}
|
||||
</ClasseFormContext.Provider>
|
||||
);
|
||||
};
|
||||
@ -47,22 +47,6 @@ export const ClassesProvider = ({ children }) => {
|
||||
...niveauxTroisiemeCycle,
|
||||
];
|
||||
|
||||
const typeEmploiDuTemps = [
|
||||
{ id: 1, label: 'Annuel' },
|
||||
{ id: 2, label: 'Semestriel' },
|
||||
{ id: 3, label: 'Trimestriel' },
|
||||
];
|
||||
|
||||
const selectedDays = {
|
||||
1: 'lundi',
|
||||
2: 'mardi',
|
||||
3: 'mercredi',
|
||||
4: 'jeudi',
|
||||
5: 'vendredi',
|
||||
6: 'samedi',
|
||||
7: 'dimanche',
|
||||
};
|
||||
|
||||
const getNiveauxLabels = (levels) => {
|
||||
return levels.map((niveauId) => {
|
||||
const niveau = allNiveaux.find((n) => n.id === niveauId);
|
||||
@ -132,71 +116,6 @@ export const ClassesProvider = ({ children }) => {
|
||||
}
|
||||
};
|
||||
|
||||
const updatePlannings = (formData, existingPlannings) => {
|
||||
return formData.levels.map((niveau) => {
|
||||
let existingPlanning = existingPlannings.find(
|
||||
(planning) => planning.niveau === niveau
|
||||
);
|
||||
|
||||
const emploiDuTemps = formData.opening_days.reduce((acc, dayId) => {
|
||||
const dayName = selectedDays[dayId];
|
||||
if (dayName) {
|
||||
acc[dayName] = existingPlanning?.emploiDuTemps?.[dayName] || [];
|
||||
}
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
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,
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
// Fusionner les plannings existants avec les nouvelles données
|
||||
return existingPlanning
|
||||
? { ...existingPlanning, ...updatedPlanning }
|
||||
: updatedPlanning;
|
||||
});
|
||||
};
|
||||
|
||||
const groupSpecialitiesBySubject = (teachers) => {
|
||||
const groupedSpecialities = {};
|
||||
@ -223,14 +142,6 @@ export const ClassesProvider = ({ children }) => {
|
||||
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
|
||||
@ -243,13 +154,11 @@ export const ClassesProvider = ({ children }) => {
|
||||
niveauxPremierCycle,
|
||||
niveauxSecondCycle,
|
||||
niveauxTroisiemeCycle,
|
||||
typeEmploiDuTemps,
|
||||
updatePlannings,
|
||||
allNiveaux,
|
||||
getAmbianceText,
|
||||
getAmbianceName,
|
||||
groupSpecialitiesBySubject,
|
||||
getNiveauNameById,
|
||||
determineInitialPeriod,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
|
||||
@ -23,13 +23,25 @@ import { useEstablishment } from '@/context/EstablishmentContext';
|
||||
*/
|
||||
const PlanningContext = createContext();
|
||||
|
||||
export function PlanningProvider({ children }) {
|
||||
// const [events, setEvents] = useState([]);
|
||||
// const [schedules, setSchedules] = useState([]);
|
||||
// const [selectedSchedule, setSelectedSchedule] = useState(null);
|
||||
export const RecurrenceType = Object.freeze({
|
||||
NONE: 0,
|
||||
DAILY: 1,
|
||||
WEEKLY: 2,
|
||||
MONTHLY: 3,
|
||||
CUSTOM: 4,
|
||||
});
|
||||
|
||||
export const PlanningModes = Object.freeze({
|
||||
CLASS_SCHEDULE: 'classSchedule',
|
||||
PLANNING: 'planning'
|
||||
});
|
||||
|
||||
export function PlanningProvider({ children, modeSet=PlanningModes.PLANNING}) {
|
||||
|
||||
const [events, setEvents] = useState([]);
|
||||
const [schedules, setSchedules] = useState([]);
|
||||
const [selectedSchedule, setSelectedSchedule] = useState(0);
|
||||
const [planningMode, setPlanningMode] = useState(modeSet);
|
||||
const [currentDate, setCurrentDate] = useState(new Date());
|
||||
const [viewType, setViewType] = useState('week'); // Changer 'month' en 'week'
|
||||
const [hiddenSchedules, setHiddenSchedules] = useState([]);
|
||||
@ -37,60 +49,61 @@ export function PlanningProvider({ children }) {
|
||||
|
||||
const csrfToken = useCsrfToken();
|
||||
useEffect(() => {
|
||||
fetchPlannings().then((data) => {
|
||||
setSchedules(data);
|
||||
if (data.length > 0) {
|
||||
setSelectedSchedule(data[0].id);
|
||||
}
|
||||
});
|
||||
fetchEvents().then((data) => {
|
||||
setEvents(data);
|
||||
});
|
||||
}, []);
|
||||
reloadPlanning();
|
||||
reloadEvents();
|
||||
}, [planningMode, selectedEstablishmentId]);
|
||||
|
||||
|
||||
const reloadEvents = () =>{
|
||||
fetchEvents(selectedEstablishmentId, planningMode).then((data) => {
|
||||
setEvents(data);
|
||||
});
|
||||
}
|
||||
|
||||
const reloadPlanning = () =>{
|
||||
fetchPlannings(selectedEstablishmentId, planningMode).then((data) => {
|
||||
setSchedules(data);
|
||||
if (data.length > 0) {
|
||||
setSelectedSchedule(data[0].id);
|
||||
}
|
||||
});
|
||||
}
|
||||
const addEvent = (newEvent) => {
|
||||
createEvent(newEvent).then((data) => {
|
||||
setEvents((prevEvents) => [...prevEvents, data]);
|
||||
createEvent(newEvent).then(() => {
|
||||
reloadEvents();
|
||||
});
|
||||
};
|
||||
|
||||
const handleUpdateEvent = (id, updatedEvent) => {
|
||||
updateEvent(id, updatedEvent, csrfToken).then((data) => {
|
||||
setEvents((prevEvents) =>
|
||||
prevEvents.map((event) => (event.id === id ? updatedEvent : event))
|
||||
);
|
||||
reloadEvents();
|
||||
});
|
||||
};
|
||||
|
||||
const handleDeleteEvent = (id) => {
|
||||
deleteEvent(id, csrfToken).then((data) => {
|
||||
setEvents((prevEvents) => prevEvents.filter((event) => event.id !== id));
|
||||
reloadEvents();
|
||||
});
|
||||
};
|
||||
|
||||
const addSchedule = (newSchedule) => {
|
||||
logger.debug('newSchedule', newSchedule);
|
||||
newSchedule.establishment = selectedEstablishmentId;
|
||||
createPlanning(newSchedule, csrfToken).then((data) => {
|
||||
setSchedules((prevSchedules) => [...prevSchedules, data]);
|
||||
createPlanning(newSchedule, csrfToken).then((_) => {
|
||||
reloadPlanning();
|
||||
});
|
||||
};
|
||||
|
||||
const updateSchedule = (id, updatedSchedule) => {
|
||||
updatePlanning(id, updatedSchedule, csrfToken).then((data) => {
|
||||
setSchedules((prevSchedules) =>
|
||||
prevSchedules.map((schedule) =>
|
||||
schedule.id === id ? updatedSchedule : schedule
|
||||
)
|
||||
);
|
||||
reloadPlanning();
|
||||
});
|
||||
};
|
||||
|
||||
const deleteSchedule = (id) => {
|
||||
deletePlanning(id, csrfToken).then((data) => {
|
||||
setSchedules((prevSchedules) =>
|
||||
prevSchedules.filter((schedule) => schedule.id !== id)
|
||||
);
|
||||
reloadPlanning();
|
||||
reloadEvents();
|
||||
});
|
||||
};
|
||||
|
||||
@ -123,6 +136,9 @@ export function PlanningProvider({ children }) {
|
||||
setViewType,
|
||||
hiddenSchedules,
|
||||
toggleScheduleVisibility,
|
||||
planningMode,
|
||||
reloadEvents,
|
||||
reloadPlanning,
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
@ -1,18 +0,0 @@
|
||||
import React, { createContext, useState, useContext } from 'react';
|
||||
|
||||
const SpecialityFormContext = createContext();
|
||||
|
||||
export const useSpecialityForm = () => useContext(SpecialityFormContext);
|
||||
|
||||
export const SpecialityFormProvider = ({ children, initialSpeciality }) => {
|
||||
const [formData, setFormData] = useState(() => ({
|
||||
name: initialSpeciality.name || '',
|
||||
color_code: initialSpeciality.color_code || '#FFFFFF',
|
||||
}));
|
||||
|
||||
return (
|
||||
<SpecialityFormContext.Provider value={{ formData, setFormData }}>
|
||||
{children}
|
||||
</SpecialityFormContext.Provider>
|
||||
);
|
||||
};
|
||||
@ -1,25 +0,0 @@
|
||||
import React, { createContext, useState, useContext } from 'react';
|
||||
|
||||
const TeacherFormContext = createContext();
|
||||
|
||||
export const useTeacherForm = () => useContext(TeacherFormContext);
|
||||
|
||||
export const TeacherFormProvider = ({ children, initialTeacher }) => {
|
||||
const [formData, setFormData] = useState(() => ({
|
||||
last_name: initialTeacher.last_name || '',
|
||||
first_name: initialTeacher.first_name || '',
|
||||
email: initialTeacher.email || '',
|
||||
specialities: initialTeacher.specialities || [],
|
||||
associated_profile: initialTeacher.associated_profile || '',
|
||||
droit: {
|
||||
label: initialTeacher.droit?.label || '',
|
||||
id: initialTeacher.droit?.id || 0,
|
||||
},
|
||||
}));
|
||||
|
||||
return (
|
||||
<TeacherFormContext.Provider value={{ formData, setFormData }}>
|
||||
{children}
|
||||
</TeacherFormContext.Provider>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user