mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-01-29 07:53:23 +00:00
157 lines
4.0 KiB
JavaScript
157 lines
4.0 KiB
JavaScript
import { createContext, useContext, useEffect, useState } from 'react';
|
|
import {
|
|
createPlanning,
|
|
fetchEvents,
|
|
fetchPlannings,
|
|
updatePlanning,
|
|
createEvent,
|
|
deleteEvent,
|
|
updateEvent,
|
|
} from '@/app/actions/planningAction';
|
|
import { useCsrfToken } from './CsrfContext';
|
|
import logger from '@/utils/logger';
|
|
import { useEstablishment } from '@/context/EstablishmentContext';
|
|
|
|
/**
|
|
* Contexte de planification pour gérer l'état global du planning
|
|
* Fournit des fonctionnalités pour :
|
|
* - Gestion des événements (ajout, modification, suppression)
|
|
* - Gestion des emplois du temps (ajout, modification, suppression)
|
|
* - Gestion de la visibilité des emplois du temps
|
|
* - Contrôle de la vue du calendrier (date courante, type de vue)
|
|
* - Stockage de l'état des événements et des emplois du temps
|
|
*/
|
|
const PlanningContext = createContext();
|
|
|
|
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,
|
|
readOnly = false
|
|
}) {
|
|
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 [parentView, setParentView] = useState(readOnly);
|
|
const [hiddenSchedules, setHiddenSchedules] = useState([]);
|
|
const { selectedEstablishmentId } = useEstablishment();
|
|
|
|
const csrfToken = useCsrfToken();
|
|
useEffect(() => {
|
|
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(() => {
|
|
reloadEvents();
|
|
});
|
|
};
|
|
|
|
const handleUpdateEvent = (id, updatedEvent) => {
|
|
updateEvent(id, updatedEvent, csrfToken).then((data) => {
|
|
reloadEvents();
|
|
});
|
|
};
|
|
|
|
const handleDeleteEvent = (id) => {
|
|
deleteEvent(id, csrfToken).then((data) => {
|
|
reloadEvents();
|
|
});
|
|
};
|
|
|
|
const addSchedule = (newSchedule) => {
|
|
logger.debug('newSchedule', newSchedule);
|
|
newSchedule.establishment = selectedEstablishmentId;
|
|
createPlanning(newSchedule, csrfToken).then((_) => {
|
|
reloadPlanning();
|
|
});
|
|
};
|
|
|
|
const updateSchedule = (id, updatedSchedule) => {
|
|
updatePlanning(id, updatedSchedule, csrfToken).then((data) => {
|
|
reloadPlanning();
|
|
});
|
|
};
|
|
|
|
const deleteSchedule = (id) => {
|
|
deletePlanning(id, csrfToken).then((data) => {
|
|
reloadPlanning();
|
|
reloadEvents();
|
|
});
|
|
};
|
|
|
|
const toggleScheduleVisibility = (planning) => {
|
|
setHiddenSchedules((prev) => {
|
|
const isHidden = prev.includes(planning);
|
|
const newHiddenSchedules = isHidden
|
|
? prev.filter((id) => id !== planning)
|
|
: [...prev, planning];
|
|
return newHiddenSchedules;
|
|
});
|
|
};
|
|
|
|
const value = {
|
|
events,
|
|
setEvents,
|
|
schedules,
|
|
setSchedules,
|
|
selectedSchedule,
|
|
setSelectedSchedule,
|
|
addEvent,
|
|
handleUpdateEvent,
|
|
handleDeleteEvent,
|
|
addSchedule,
|
|
updateSchedule,
|
|
deleteSchedule,
|
|
currentDate,
|
|
setCurrentDate,
|
|
viewType,
|
|
setViewType,
|
|
hiddenSchedules,
|
|
setHiddenSchedules,
|
|
toggleScheduleVisibility,
|
|
planningMode,
|
|
reloadEvents,
|
|
reloadPlanning,
|
|
parentView
|
|
};
|
|
|
|
return (
|
|
<PlanningContext.Provider value={value}>
|
|
{children}
|
|
</PlanningContext.Provider>
|
|
);
|
|
}
|
|
|
|
export const usePlanning = () => useContext(PlanningContext);
|