'use client'; import React, { useState, useEffect } from 'react'; import { useEstablishment } from '@/context/EstablishmentContext'; import { PARENT_FILTER, SCHOOL_FILTER } from '@/utils/constants'; import { Trash2, ToggleLeft, ToggleRight, Info, XCircle } from 'lucide-react'; import Table from '@/components/Table'; import Popup from '@/components/Popup'; import StatusLabel from '@/components/StatusLabel'; import SpecialityItem from '@/components/Structure/Configuration/SpecialityItem'; import SidebarTabs from '@/components/SidebarTabs'; import { fetchProfileRoles, updateProfileRoles, deleteProfileRoles, } from '@/app/actions/authAction'; import { dissociateGuardian } from '@/app/actions/subscriptionAction'; import { useCsrfToken } from '@/context/CsrfContext'; import DjangoCSRFToken from '@/components/DjangoCSRFToken'; import logger from '@/utils/logger'; import AlertMessage from '@/components/AlertMessage'; const roleTypeToLabel = (roleType) => { switch (roleType) { case 0: return 'ECOLE'; case 1: return 'ADMIN'; case 2: return 'PARENT'; default: return 'UNKNOWN'; } }; const roleTypeToBadgeClass = (roleType) => { switch (roleType) { case 0: return 'bg-blue-100 text-blue-600'; case 1: return 'bg-red-100 text-red-600'; case 2: return 'bg-green-100 text-green-600'; default: return 'bg-gray-100 text-gray-600'; } }; export default function Page() { const [profileRolesDatasParent, setProfileRolesDatasParent] = useState([]); const [profileRolesDatasSchool, setProfileRolesDatasSchool] = useState([]); const [reloadFetch, setReloadFetch] = useState(false); const [popupVisible, setPopupVisible] = useState(false); const [popupMessage, setPopupMessage] = useState(''); const [confirmPopupVisible, setConfirmPopupVisible] = useState(false); const [confirmPopupMessage, setConfirmPopupMessage] = useState(''); const [confirmPopupOnConfirm, setConfirmPopupOnConfirm] = useState(() => {}); const [visibleTooltipId, setVisibleTooltipId] = useState(null); const [activeTab, setActiveTab] = useState('parent'); // Onglet actif const [totalProfilesParentPages, setTotalProfilesParentPages] = useState(1); const [totalProfilesSchoolPages, setTotalProfilesSchoolPages] = useState(1); const [currentProfilesParentPage, setCurrentProfilesParentPage] = useState(1); const [totalProfilesParent, setTotalProfilesParent] = useState(0); const [totalProfilesSchool, setTotalProfilesSchool] = useState(0); const [currentProfilesSchoolPage, setCurrentProfilesSchoolPage] = useState(1); const [profileRolesParent, setProfileRolesParent] = useState([]); const [profileRolesSchool, setProfileRolesSchool] = useState([]); const itemsPerPage = 15; // Nombre d'éléments par page const csrfToken = useCsrfToken(); const { selectedEstablishmentId } = useEstablishment(); const requestErrorHandler = (err) => { logger.error('Error fetching data:', err); }; useEffect(() => { if (selectedEstablishmentId) { // Fetch data for profileRolesParent handleProfiles(); } }, [ selectedEstablishmentId, reloadFetch, currentProfilesParentPage, currentProfilesSchoolPage, ]); const handleProfiles = () => { fetchProfileRoles( selectedEstablishmentId, PARENT_FILTER, currentProfilesParentPage, itemsPerPage ) .then((data) => { setProfileRolesDatasParent(data); }) .catch(requestErrorHandler); fetchProfileRoles( selectedEstablishmentId, SCHOOL_FILTER, currentProfilesSchoolPage, itemsPerPage ) .then((data) => { setProfileRolesDatasSchool(data); }) .catch(requestErrorHandler); setReloadFetch(false); }; const handleEdit = (profileRole) => { const updatedData = { ...profileRole, is_active: !profileRole.is_active }; return updateProfileRoles(profileRole.id, updatedData, csrfToken) .then((data) => { setProfileRolesParent((prevState) => prevState.map((item) => (item.id === profileRole.id ? data : item)) ); return data; }) .catch((error) => { logger.error('Error editing data:', error); throw error; }); }; const handleDelete = (id) => { return deleteProfileRoles(id, csrfToken) .then(() => { setProfileRolesParent((prevState) => prevState.filter((item) => item.id !== id) ); logger.debug('Profile deleted successfully:', id); }) .catch((error) => { logger.error('Error deleting profile:', error); throw error; }); }; const handleDissociate = (studentId, guardianId) => { return dissociateGuardian(studentId, guardianId) .then((response) => { logger.debug('Guardian dissociated successfully:', guardianId); // Vérifier si le Guardian a été supprimé const isGuardianDeleted = response?.isGuardianDeleted; // Mettre à jour le modèle profileRolesParent setProfileRolesParent( (prevState) => prevState .map((profileRole) => { if (profileRole.associated_person?.id === guardianId) { if (isGuardianDeleted) { // Si le Guardian est supprimé, retirer le profileRole return null; } else { // Si le Guardian n'est pas supprimé, mettre à jour les élèves associés const updatedStudents = profileRole.associated_person.students.filter( (student) => student.id !== studentId ); return { ...profileRole, associated_person: { ...profileRole.associated_person, students: updatedStudents, // Mettre à jour les élèves associés }, }; } } return profileRole; // Conserver les autres profileRolesParent }) .filter(Boolean) // Supprimer les entrées nulles ); }) .catch((error) => { logger.error('Error dissociating guardian:', error); throw error; }); }; const profilesRoleParentDataHandler = (data) => { if (data) { const { profilesRoles, count, page_size } = data; if (profilesRoles) { setProfileRolesParent(profilesRoles); } const calculatedTotalPages = count === 0 ? count : Math.ceil(count / page_size); setTotalProfilesParent(count); setTotalProfilesParentPages(calculatedTotalPages); } }; const profilesRoleSchoolDataHandler = (data) => { if (data) { const { profilesRoles, count, page_size } = data; if (profilesRoles) { setProfileRolesSchool(profilesRoles); } const calculatedTotalPages = count === 0 ? count : Math.ceil(count / page_size); setTotalProfilesSchool(count); setTotalProfilesSchoolPages(calculatedTotalPages); } }; useEffect(() => { profilesRoleParentDataHandler(profileRolesDatasParent); profilesRoleSchoolDataHandler(profileRolesDatasSchool); if (activeTab === 'parent') { setTotalProfilesParentPages( Math.ceil(totalProfilesParent / itemsPerPage) ); } else if (activeTab === 'school') { setTotalProfilesSchoolPages( Math.ceil(totalProfilesSchool / itemsPerPage) ); } }, [profileRolesDatasParent, profileRolesDatasSchool, activeTab]); const handlePageChange = (newPage) => { if (activeTab === 'parent') { setCurrentProfilesParentPage(newPage); } else if (activeTab === 'school') { setCurrentProfilesSchoolPage(newPage); } }; const handleTooltipVisibility = (id) => { setVisibleTooltipId(id); // Définir l'ID de la ligne pour laquelle la tooltip est visible }; const handleTooltipHide = () => { setVisibleTooltipId(null); // Cacher toutes les tooltips }; const handleConfirmActivateProfile = (profileRole) => { setConfirmPopupMessage( `Êtes-vous sûr de vouloir ${profileRole.is_active ? 'désactiver' : 'activer'} ce profil ?` ); setConfirmPopupOnConfirm(() => () => { handleEdit(profileRole) .then(() => { setPopupMessage( `Le profil a été ${profileRole.is_active ? 'désactivé' : 'activé'} avec succès.` ); setPopupVisible(true); }) .catch((error) => { setPopupMessage( `Erreur lors de la ${profileRole.is_active ? 'désactivation' : 'activation'} du profil.` ); setPopupVisible(true); }); setConfirmPopupVisible(false); }); setConfirmPopupVisible(true); }; const handleConfirmDeleteProfile = (id) => { setConfirmPopupMessage('Êtes-vous sûr de vouloir supprimer ce profil ?'); setConfirmPopupOnConfirm(() => () => { handleDelete(id) .then(() => { setPopupMessage('Le profil a été supprimé avec succès.'); setPopupVisible(true); }) .catch((error) => { setPopupMessage(error.message); setPopupVisible(true); }); setConfirmPopupVisible(false); }); setConfirmPopupVisible(true); }; const handleConfirmDissociateGuardian = (profileRole, student) => { setVisibleTooltipId(null); setConfirmPopupMessage( `Vous êtes sur le point de dissocier le responsable ${profileRole.associated_person?.guardian_name} de l'élève ${student.student_name}. Êtes-vous sûr de vouloir poursuivre cette opération ?` ); setConfirmPopupOnConfirm(() => () => { handleDissociate(student.id, profileRole.associated_person?.id) .then(() => { setPopupMessage('Le responsable a été dissocié avec succès.'); setPopupVisible(true); }) .catch((error) => { setPopupMessage(error.message); setPopupVisible(true); }); setConfirmPopupVisible(false); }); setConfirmPopupVisible(true); }; const parentColumns = [ { name: 'Identifiant', transform: (row) => row.associated_profile_email }, { name: 'Mise à jour', transform: (row) => row.updated_date_formatted }, { name: 'Rôle', transform: (row) => ( {roleTypeToLabel(row.role_type)} ), }, { name: 'Utilisateur', transform: (row) => (
{row.associated_person?.guardian_name} {row.associated_person && (
handleTooltipVisibility(row.id)} // Afficher la tooltip pour cette ligne onMouseLeave={handleTooltipHide} // Cacher la tooltip > {visibleTooltipId === row.id && ( // Afficher uniquement si l'ID correspond
Elève(s) associé(s):
{row.associated_person?.students?.map((student) => (
{student.student_name}
))}
)}
)}
), }, { name: 'Actions', transform: (row) => (
), }, ]; const schoolAdminColumns = [ { name: 'Identifiant', transform: (row) => row.associated_profile_email }, { name: 'Mise à jour', transform: (row) => row.updated_date_formatted }, { name: 'Rôle', transform: (row) => ( {roleTypeToLabel(row.role_type)} ), }, { name: 'Utilisateur', transform: (row) => (
{row.associated_person?.teacher_name} {row.associated_person && (
handleTooltipVisibility(row.id)} // Afficher la tooltip pour cette ligne onMouseLeave={handleTooltipHide} // Cacher la tooltip > {visibleTooltipId === row.id && ( // Afficher uniquement si l'ID correspond
Classes associées:
{row.associated_person?.classes?.map((classe) => ( {classe.name} ))}
Spécialités:
{row.associated_person?.specialities?.map( (speciality) => ( ) )}
)}
)}
), }, { name: 'Actions', transform: (row) => (
), }, ]; return ( <> } /> ), }, { id: 'school', label: 'École', content: (
} /> ), }, ]} onTabChange={(newActiveTab) => { setActiveTab(newActiveTab); }} /> {/* Popups */} setPopupVisible(false)} uniqueConfirmButton={true} /> setConfirmPopupVisible(false)} /> ); }