chore: application prettier

This commit is contained in:
Luc SORIGNET
2025-04-15 19:37:47 +02:00
parent dd0884bbce
commit f7666c894b
174 changed files with 10609 additions and 8760 deletions

View File

@ -1,5 +1,14 @@
import React, { useState, useEffect } from 'react';
import { Plus, Edit3, Trash2, GraduationCap, Check, X, Hand, Search } from 'lucide-react';
import {
Plus,
Edit3,
Trash2,
GraduationCap,
Check,
X,
Hand,
Search,
} from 'lucide-react';
import Table from '@/components/Table';
import Popup from '@/components/Popup';
import ToggleSwitch from '@/components/ToggleSwitch';
@ -18,30 +27,46 @@ const ItemTypes = {
SPECIALITY: 'speciality',
};
const SpecialitiesDropZone = ({ teacher, handleSpecialitiesChange, specialities, isEditing }) => {
const [localSpecialities, setLocalSpecialities] = useState(teacher.specialities_details || []);
const SpecialitiesDropZone = ({
teacher,
handleSpecialitiesChange,
specialities,
isEditing,
}) => {
const [localSpecialities, setLocalSpecialities] = useState(
teacher.specialities_details || []
);
useEffect(() => {
}, [specialities]);
useEffect(() => {}, [specialities]);
useEffect(() => {
setLocalSpecialities(teacher.specialities_details || []);
}, [teacher.specialities_details]);
useEffect(() => {
handleSpecialitiesChange(localSpecialities.map(speciality => speciality.id));
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);
const specialityDetails = specialities.find(
(speciality) => speciality.id === item.id
);
const exists = localSpecialities.some(
(speciality) => speciality.id === item.id
);
if (!exists) {
setLocalSpecialities(prevSpecialities => {
setLocalSpecialities((prevSpecialities) => {
const updatedSpecialities = [
...prevSpecialities,
{ id: item.id, name: specialityDetails.name, color_code: specialityDetails.color_code }
{
id: item.id,
name: specialityDetails.name,
color_code: specialityDetails.color_code,
},
];
return updatedSpecialities;
});
@ -57,26 +82,37 @@ const SpecialitiesDropZone = ({ teacher, handleSpecialitiesChange, specialities,
});
const handleRemoveSpeciality = (id) => {
setLocalSpecialities(prevSpecialities => {
const updatedSpecialities = prevSpecialities.filter(speciality => speciality.id !== id);
setLocalSpecialities((prevSpecialities) => {
const updatedSpecialities = prevSpecialities.filter(
(speciality) => speciality.id !== id
);
return updatedSpecialities;
});
};
return (
<div ref={drop} className={`p-2 rounded-md flex flex-col items-center ${isEditing ? 'border-2 border-dashed border-blue-500 bg-blue-50' : ''} ${
isOver && canDrop ? 'border-2 border-solid border-blue-300' : ''
}`}
<div
ref={drop}
className={`p-2 rounded-md flex flex-col items-center ${isEditing ? 'border-2 border-dashed border-blue-500 bg-blue-50' : ''} ${
isOver && canDrop ? 'border-2 border-solid border-blue-300' : ''
}`}
>
{isEditing && (
{isEditing && (
<div className="mb-2 text-blue-500 font-semibold flex items-center space-x-2">
<Hand className="w-5 h-5" /> {/* Ajoutez l'icône Hand */}
<span>Déposez une spécialité ici</span>
</div>
)}
{localSpecialities.map((speciality, index) => (
<div key={`${speciality.id}-${index}`} className="flex items-center space-x-2 mb-2">
<SpecialityItem key={speciality.id} speciality={speciality} isDraggable={false}/>
<div
key={`${speciality.id}-${index}`}
className="flex items-center space-x-2 mb-2"
>
<SpecialityItem
key={speciality.id}
speciality={speciality}
isDraggable={false}
/>
{isEditing && (
<button
type="button"
@ -92,37 +128,45 @@ const SpecialitiesDropZone = ({ teacher, handleSpecialitiesChange, specialities,
);
};
const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handleCreate, handleEdit, handleDelete }) => {
const TeachersSection = ({
teachers,
setTeachers,
specialities,
profiles,
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 [popupMessage, setPopupMessage] = useState('');
const [removePopupVisible, setRemovePopupVisible] = useState(false);
const [removePopupMessage, setRemovePopupMessage] = useState("");
const [removePopupMessage, setRemovePopupMessage] = useState('');
const [removePopupOnConfirm, setRemovePopupOnConfirm] = useState(() => {});
const [confirmPopupVisible, setConfirmPopupVisible] = useState(false);
const [confirmPopupMessage, setConfirmPopupMessage] = useState("");
const [confirmPopupMessage, setConfirmPopupMessage] = useState('');
const [confirmPopupOnConfirm, setConfirmPopupOnConfirm] = useState(() => {});
const { selectedEstablishmentId } = useEstablishment();
const handleEmailChange = (e) => {
const email = e.target.value;
// Vérifier si l'email correspond à un profil existant
const existingProfile = profiles.find((profile) => profile.email === email);
setFormData((prevData) => ({
...prevData,
associated_profile_email: email,
existingProfileId: existingProfile ? existingProfile.id : null,
}));
if (newTeacher) {
setNewTeacher((prevData) => ({
...prevData,
@ -133,7 +177,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
};
const handleCancelConfirmation = () => {
setConfirmPopupVisible(false);
setConfirmPopupVisible(false);
};
// Récupération des messages d'erreur
@ -142,22 +186,41 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
};
const handleAddTeacher = () => {
setNewTeacher({ id: Date.now(), last_name: '', first_name: '', associated_profile_email: '', specialities: [], role_type: 0 });
setFormData({ last_name: '', first_name: '', associated_profile_email: '', specialities: [], role_type: 0});
setNewTeacher({
id: Date.now(),
last_name: '',
first_name: '',
associated_profile_email: '',
specialities: [],
role_type: 0,
});
setFormData({
last_name: '',
first_name: '',
associated_profile_email: '',
specialities: [],
role_type: 0,
});
};
const handleRemoveTeacher = (id) => {
return handleDelete(id)
.then(() => {
setTeachers(prevTeachers => prevTeachers.filter(teacher => teacher.id !== id));
setTeachers((prevTeachers) =>
prevTeachers.filter((teacher) => teacher.id !== id)
);
})
.catch(error => {
.catch((error) => {
logger.error(error);
});
};
const handleSaveNewTeacher = () => {
if (formData.last_name && formData.first_name && formData.associated_profile_email) {
if (
formData.last_name &&
formData.first_name &&
formData.associated_profile_email
) {
const data = {
last_name: formData.last_name,
first_name: formData.first_name,
@ -177,7 +240,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
},
specialities: formData.specialities || [],
};
handleCreate(data)
.then((createdTeacher) => {
setTeachers([createdTeacher, ...teachers]);
@ -192,7 +255,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
}
});
} else {
setPopupMessage("Tous les champs doivent être remplis et valides");
setPopupMessage('Tous les champs doivent être remplis et valides');
setPopupVisible(true);
}
};
@ -202,17 +265,24 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
const currentTeacher = teachers.find((teacher) => teacher.id === id);
// Vérifier si l'email correspond à un profil existant
const existingProfile = profiles.find((profile) => profile.email === currentTeacher.associated_profile_email);
const existingProfile = profiles.find(
(profile) => profile.email === currentTeacher.associated_profile_email
);
// Vérifier si l'email a été modifié
const isEmailModified = currentTeacher
? currentTeacher.associated_profile_email !== updatedData.associated_profile_email
: true;
? currentTeacher.associated_profile_email !==
updatedData.associated_profile_email
: true;
// Mettre à jour existingProfileId en fonction de l'email
updatedData.existingProfileId = existingProfile ? existingProfile.id : null;
if (updatedData.last_name && updatedData.first_name && updatedData.associated_profile_email) {
if (
updatedData.last_name &&
updatedData.first_name &&
updatedData.associated_profile_email
) {
const data = {
last_name: updatedData.last_name,
first_name: updatedData.first_name,
@ -238,7 +308,9 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
handleEdit(id, data)
.then((updatedTeacher) => {
setTeachers((prevTeachers) =>
prevTeachers.map((teacher) => (teacher.id === id ? { ...teacher, ...updatedTeacher } : teacher))
prevTeachers.map((teacher) =>
teacher.id === id ? { ...teacher, ...updatedTeacher } : teacher
)
);
setEditingTeacher(null);
setFormData({});
@ -251,7 +323,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
}
});
} else {
setPopupMessage("Tous les champs doivent être remplis et valides");
setPopupMessage('Tous les champs doivent être remplis et valides');
setPopupVisible(true);
}
};
@ -347,7 +419,12 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
);
case 'SPECIALITES':
return (
<SpecialitiesDropZone teacher={currentData} handleSpecialitiesChange={handleSpecialitiesChange} specialities={specialities} isEditing={isEditing || isCreating} />
<SpecialitiesDropZone
teacher={currentData}
handleSpecialitiesChange={handleSpecialitiesChange}
specialities={specialities}
isEditing={isEditing || isCreating}
/>
);
case 'ADMINISTRATEUR':
return (
@ -364,14 +441,20 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
<div className="flex justify-center space-x-2">
<button
type="button"
onClick={() => (isEditing ? handleUpdateTeacher(editingTeacher, formData) : handleSaveNewTeacher())}
onClick={() =>
isEditing
? handleUpdateTeacher(editingTeacher, formData)
: handleSaveNewTeacher()
}
className="text-green-500 hover:text-green-700"
>
<Check className="w-5 h-5" />
</button>
<button
type="button"
onClick={() => (isEditing ? setEditingTeacher(null) : setNewTeacher(null))}
onClick={() =>
isEditing ? setEditingTeacher(null) : setNewTeacher(null)
}
className="text-red-500 hover:text-red-700"
>
<X className="w-5 h-5" />
@ -384,33 +467,43 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
} else {
switch (column) {
case 'NOM - PRENOM':
return (
<TeacherItem key={teacher.id} teacher={teacher} />
);
return <TeacherItem key={teacher.id} teacher={teacher} />;
case 'EMAIL':
return teacher.associated_profile_email;
case 'SPECIALITES':
return (
<div className="flex justify-center space-x-2 flex-wrap">
{teacher.specialities_details.map((speciality) => (
<SpecialityItem key={speciality.id} speciality={speciality} isDraggable={false} />
<SpecialityItem
key={speciality.id}
speciality={speciality}
isDraggable={false}
/>
))}
</div>
);
case 'ADMINISTRATEUR':
if (teacher.associated_profile_email) {
const badgeClass = teacher.role_type === 1 ? 'bg-red-100 text-red-600' : 'bg-blue-100 text-blue-600';
const label = teacher.role_type === 1 ? 'OUI' : 'NON';
return (
<div key={teacher.id} className="flex justify-center items-center space-x-2">
<span className={`px-3 py-1 rounded-full font-bold ${badgeClass}`}>
{label}
</span>
</div>
);
} else {
return <i>Non définie</i>;
};
if (teacher.associated_profile_email) {
const badgeClass =
teacher.role_type === 1
? 'bg-red-100 text-red-600'
: 'bg-blue-100 text-blue-600';
const label = teacher.role_type === 1 ? 'OUI' : 'NON';
return (
<div
key={teacher.id}
className="flex justify-center items-center space-x-2"
>
<span
className={`px-3 py-1 rounded-full font-bold ${badgeClass}`}
>
{label}
</span>
</div>
);
} else {
return <i>Non définie</i>;
}
case 'MISE A JOUR':
return teacher.updated_date_formatted;
case 'ACTIONS':
@ -427,18 +520,35 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
type="button"
onClick={() => {
setRemovePopupVisible(true);
setRemovePopupMessage("Attentions ! \nVous êtes sur le point de supprimer l'enseignant " + teacher.last_name + " " + teacher.first_name + ".\nÊtes-vous sûr(e) de vouloir poursuivre l'opération ?");
setRemovePopupMessage(
"Attentions ! \nVous êtes sur le point de supprimer l'enseignant " +
teacher.last_name +
' ' +
teacher.first_name +
".\nÊtes-vous sûr(e) de vouloir poursuivre l'opération ?"
);
setRemovePopupOnConfirm(() => () => {
handleRemoveTeacher(teacher.id)
.then(data => {
.then((data) => {
logger.debug('Success:', data);
setPopupMessage("L'enseignant " + teacher.last_name + " " + teacher.first_name + " a été correctement supprimé");
setPopupMessage(
"L'enseignant " +
teacher.last_name +
' ' +
teacher.first_name +
' a été correctement supprimé'
);
setPopupVisible(true);
setRemovePopupVisible(false);
})
.catch(error => {
.catch((error) => {
logger.error('Error archiving data:', error);
setPopupMessage("Erreur lors de la suppression de l'enseignant " + teacher.last_name + " " + teacher.first_name);
setPopupMessage(
"Erreur lors de la suppression de l'enseignant " +
teacher.last_name +
' ' +
teacher.first_name
);
setPopupVisible(true);
setRemovePopupVisible(false);
});
@ -462,7 +572,7 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
{ name: 'SPECIALITES', label: 'Spécialités' },
{ name: 'ADMINISTRATEUR', label: 'Profil' },
{ name: 'MISE A JOUR', label: 'Mise à jour' },
{ name: 'ACTIONS', label: 'Actions' }
{ name: 'ACTIONS', label: 'Actions' },
];
return (
@ -473,7 +583,11 @@ const TeachersSection = ({ teachers, setTeachers, specialities, profiles, handle
<GraduationCap className="w-6 h-6 text-emerald-500 mr-2" />
<h2 className="text-xl font-semibold">Enseignants</h2>
</div>
<button type="button" onClick={handleAddTeacher} className="text-emerald-500 hover:text-emerald-700">
<button
type="button"
onClick={handleAddTeacher}
className="text-emerald-500 hover:text-emerald-700"
>
<Plus className="w-5 h-5" />
</button>
</div>