import React, { useState, useEffect } from 'react'; import { Plus, Edit3, Trash2, GraduationCap, Check, X, Hand } from 'lucide-react'; import Table from '@/components/Table'; import Popup from '@/components/Popup'; import ToggleSwitch from '@/components/ToggleSwitch'; import { createProfile, updateProfile } from '@/app/actions/authAction'; import { useCsrfToken } from '@/context/CsrfContext'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import InputText from '@/components/InputText'; import SpecialityItem from '@/components/Structure/Configuration/SpecialityItem'; import TeacherItem from './TeacherItem'; import logger from '@/utils/logger'; const ItemTypes = { SPECIALITY: 'speciality', }; const SpecialitiesDropZone = ({ teacher, handleSpecialitiesChange, specialities, isEditing }) => { const [localSpecialities, setLocalSpecialities] = useState(teacher.specialities_details || []); useEffect(() => { }, [specialities]); useEffect(() => { setLocalSpecialities(teacher.specialities_details || []); }, [teacher.specialities_details]); useEffect(() => { handleSpecialitiesChange(localSpecialities.map(speciality => speciality.id)); }, [localSpecialities]); const [{ isOver, canDrop }, drop] = useDrop({ accept: ItemTypes.SPECIALITY, drop: (item) => { const specialityDetails = specialities.find(speciality => speciality.id === item.id); const exists = localSpecialities.some(speciality => speciality.id === item.id); if (!exists) { setLocalSpecialities(prevSpecialities => { const updatedSpecialities = [ ...prevSpecialities, { id: item.id, name: specialityDetails.name, color_code: specialityDetails.color_code } ]; return updatedSpecialities; }); } }, collect: (monitor) => ({ isOver: !!monitor.isOver(), canDrop: !!monitor.canDrop(), }), canDrop: () => { return isEditing; }, }); const handleRemoveSpeciality = (id) => { setLocalSpecialities(prevSpecialities => { const updatedSpecialities = prevSpecialities.filter(speciality => speciality.id !== id); return updatedSpecialities; }); }; return (
{isEditing && (
{/* Ajoutez l'icône Hand */} Déposez une spécialité ici
)} {localSpecialities.map((speciality, index) => (
{isEditing && ( )}
))}
); }; const TeachersSection = ({ teachers, setTeachers, specialities, handleCreate, handleEdit, handleDelete }) => { const csrfToken = useCsrfToken(); const [editingTeacher, setEditingTeacher] = useState(null); const [newTeacher, setNewTeacher] = useState(null); const [formData, setFormData] = useState({}); const [localErrors, setLocalErrors] = useState({}); const [popupVisible, setPopupVisible] = useState(false); const [popupMessage, setPopupMessage] = useState(""); const [removePopupVisible, setRemovePopupVisible] = useState(false); const [removePopupMessage, setRemovePopupMessage] = useState(""); const [removePopupOnConfirm, setRemovePopupOnConfirm] = useState(() => {}); // Récupération des messages d'erreur const getError = (field) => { return localErrors?.[field]?.[0]; }; const handleAddTeacher = () => { setNewTeacher({ id: Date.now(), last_name: '', first_name: '', email: '', specialities: [], droit: 0 }); setFormData({ last_name: '', first_name: '', email: '', specialities: [], droit: 0 }); }; const handleRemoveTeacher = (id) => { return handleDelete(id) .then(() => { setTeachers(prevTeachers => prevTeachers.filter(teacher => teacher.id !== id)); }) .catch(error => { logger.error(error); }); }; const handleSaveNewTeacher = () => { if (formData.last_name && formData.first_name && formData.email) { const data = { email: formData.email, password: 'Provisoire01!', username: formData.email, is_active: 1, droit: formData.droit, }; createProfile(data, csrfToken) .then(response => { logger.debug('Success:', response); if (response.id) { let idProfil = response.id; newTeacher.associated_profile = idProfil; handleCreate(newTeacher) .then((createdTeacher) => { setTeachers([createdTeacher, ...teachers]); setNewTeacher(null); setLocalErrors({}); }) .catch((error) => { logger.error('Error:', error.message); if (error.details) { logger.error('Form errors:', error.details); setLocalErrors(error.details); } }); } setLocalErrors({}); }) .catch((error) => { logger.error('Error:', error.message); if (error.details) { logger.error('Form errors:', error.details); setLocalErrors(error.details); } }); } else { setPopupMessage("Tous les champs doivent être remplis et valides"); setPopupVisible(true); } }; const handleUpdateTeacher = (id, updatedData) => { if (updatedData.last_name && updatedData.first_name && updatedData.email) { const data = { email: updatedData.email, username: updatedData.email, droit: updatedData.droit, }; updateProfile(updatedData.associated_profile, data, csrfToken) .then(response => { logger.debug('Success:', response); handleEdit(id, updatedData) .then((updatedTeacher) => { setTeachers(prevTeachers => prevTeachers.map(teacher => teacher.id === id ? { ...teacher, ...updatedTeacher } : teacher)); setEditingTeacher(null); setFormData({}); }) .catch((error) => { logger.error('Error:', error.message); if (error.details) { logger.error('Form errors:', error.details); setLocalErrors(error.details); } }); }) .catch((error) => { logger.error('Error:', error.message); if (error.details) { logger.error('Form errors:', error.details); setLocalErrors(error.details); } }); } else { setPopupMessage("Tous les champs doivent être remplis et valides"); setPopupVisible(true); } }; const handleChange = (e) => { const { name, value, type, checked } = e.target; let parsedValue = value; if (type === 'checkbox') { parsedValue = checked ? 1 : 0; } if (editingTeacher) { setFormData((prevData) => ({ ...prevData, [name]: parsedValue, })); } else if (newTeacher) { setNewTeacher((prevData) => ({ ...prevData, [name]: parsedValue, })); setFormData((prevData) => ({ ...prevData, [name]: parsedValue, })); } }; const handleSpecialitiesChange = (selectedSpecialities) => { if (editingTeacher) { setFormData((prevData) => ({ ...prevData, specialities: selectedSpecialities, })); } else if (newTeacher) { setNewTeacher((prevData) => ({ ...prevData, specialities: selectedSpecialities, })); setFormData((prevData) => ({ ...prevData, specialities: selectedSpecialities, })); } }; const renderTeacherCell = (teacher, column) => { const isEditing = editingTeacher === teacher.id; const isCreating = newTeacher && newTeacher.id === teacher.id; const currentData = isEditing ? formData : newTeacher; if (isEditing || isCreating) { switch (column) { case 'NOM - PRENOM': return (
); case 'EMAIL': return ( ); case 'SPECIALITES': return ( ); case 'ADMINISTRATEUR': return (
); case 'ACTIONS': return (
); default: return null; } } else { switch (column) { case 'NOM - PRENOM': return ( ); case 'EMAIL': return teacher.associated_profile_email; case 'SPECIALITES': return (
{teacher.specialities_details.map((speciality) => ( ))}
); case 'ADMINISTRATEUR': if (teacher.associated_profile) { const badgeClass = teacher.droit === 1 ? 'bg-red-100 text-red-600' : 'bg-blue-100 text-blue-600'; const label = teacher.droit === 1 ? 'OUI' : 'NON'; return (
{label}
); } else { return Non définie; }; case 'MISE A JOUR': return teacher.updated_date_formatted; case 'ACTIONS': return (
); default: return null; } } }; const columns = [ { name: 'NOM - PRENOM', label: 'Nom et prénom' }, { name: 'EMAIL', label: 'Email' }, { name: 'SPECIALITES', label: 'Spécialités' }, { name: 'ADMINISTRATEUR', label: 'Profil' }, { name: 'MISE A JOUR', label: 'Mise à jour' }, { name: 'ACTIONS', label: 'Actions' } ]; return (

Enseignants

setPopupVisible(false)} onCancel={() => setPopupVisible(false)} uniqueConfirmButton={true} /> setRemovePopupVisible(false)} /> ); }; export default TeachersSection;