fix: conflits + closeModal lors de la création d'un RF

This commit is contained in:
N3WT DE COMPET
2025-04-26 10:37:28 +02:00
parent 10f66c69dd
commit 1617b132c4
4 changed files with 178 additions and 144 deletions

View File

@ -24,7 +24,6 @@ import Modal from '@/components/Modal';
import InscriptionForm from '@/components/Inscription/InscriptionForm';
import AffectationClasseForm from '@/components/AffectationClasseForm';
import { useEstablishment } from '@/context/EstablishmentContext';
import ValidateSubscription from '@/components/Inscription/ValidateSubscription';
import {
PENDING,
@ -56,8 +55,6 @@ import {
} from '@/app/actions/schoolAction';
import {
createProfile,
deleteProfile,
fetchProfiles,
} from '@/app/actions/authAction';
@ -115,6 +112,9 @@ export default function Page({ params: { locale } }) {
const [profiles, setProfiles] = useState([]);
const [isOpenAddGuardian, setIsOpenAddGuardian] = useState(false);
const [isFilesModalOpen, setIsFilesModalOpen] = useState(false);
const [selectedRowFiles, setSelectedRowFiles] = useState([]);
const csrfToken = useCsrfToken();
const router = useRouter();
const { selectedEstablishmentId } = useEstablishment();
@ -141,7 +141,30 @@ export default function Page({ params: { locale } }) {
setStudent(eleveSelected);
};
const requestErrorHandler = (err) => {
const openFilesModal = (row) => {
const files = [];
if (row.registration_file) {
files.push({
name: 'Fichier d\'inscription',
url: `${BASE_URL}${row.registration_file}`,
});
}
if (row.sepa_file) {
files.push({
name: 'Mandat SEPA',
url: `${BASE_URL}${row.sepa_file}`,
});
}
setSelectedRowFiles(files);
setIsFilesModalOpen(true);
};
const closeFilesModal = () => {
setIsFilesModalOpen(false);
setSelectedRowFiles([]);
};
const requestErrorHandler = (err)=>{
logger.error('Error fetching data:', err);
};
@ -451,6 +474,7 @@ export default function Page({ params: { locale } }) {
const createRF = (updatedData) => {
logger.debug('createRF updatedData:', updatedData);
const selectedRegistrationFeesIds =
updatedData.selectedRegistrationFees.map((feeId) => feeId);
const selectedRegistrationDiscountsIds =
@ -538,74 +562,66 @@ export default function Page({ params: { locale } }) {
const parent_masters = parentFileMasters.filter((file) =>
file.groups.includes(selectedFileGroup)
);
const clonePromises = masters
.map((templateMaster, index) => {
return cloneTemplate(
templateMaster.id,
updatedData.guardianEmail,
templateMaster.is_required
)
.then((clonedDocument) => {
// Sauvegarde des schoolFileTemplates clonés dans la base de données
const cloneData = {
name: `${templateMaster.name}_${updatedData.guardianFirstName}_${updatedData.guardianLastName}`,
slug: clonedDocument.slug,
id: clonedDocument.id,
master: templateMaster.id,
registration_form: data.student.id,
};
return createRegistrationSchoolFileTemplate(
cloneData,
csrfToken
)
.then((response) => {
logger.debug('Template enregistré avec succès:', response);
})
.catch((error) => {
logger.error(
"Erreur lors de l'enregistrement du template:",
error
);
});
})
.catch((error) => {
logger.error('Error during cloning or sending:', error);
});
})
.catch((error) => {
logger.error('Error:', error);
});
const clonePromises = masters.map((templateMaster) => {
return cloneTemplate(
templateMaster.id,
updatedData.guardianEmail,
templateMaster.is_required
)
.then((clonedDocument) => {
// Sauvegarde des schoolFileTemplates clonés dans la base de données
const cloneData = {
name: `${templateMaster.name}_${updatedData.guardianFirstName}_${updatedData.guardianLastName}`,
slug: clonedDocument.slug,
id: clonedDocument.id,
master: templateMaster.id,
registration_form: data.student.id,
};
return createRegistrationSchoolFileTemplate(cloneData, csrfToken)
.then((response) => {
logger.debug('Template enregistré avec succès:', response);
})
.catch((error) => {
logger.error(
'Erreur lors de l\'enregistrement du template:',
error
);
});
})
.catch((error) => {
logger.error('Error during cloning or sending:', error);
});
});
// Créer les parentFileTemplates pour chaque parentMaster
const parentClonePromises = parent_masters.map(
(parentMaster, index) => {
const parentTemplateData = {
master: parentMaster.id,
registration_form: data.student.id,
};
const parentClonePromises = parent_masters.map((parentMaster) => {
const parentTemplateData = {
master: parentMaster.id,
registration_form: data.student.id,
};
return createRegistrationParentFileTemplate(
parentTemplateData,
csrfToken
)
.then((response) => {
logger.debug(
'Parent template enregistré avec succès:',
response
);
})
.catch((error) => {
logger.error(
"Erreur lors de l'enregistrement du parent template:",
error
);
});
}
);
return createRegistrationParentFileTemplate(
parentTemplateData,
csrfToken
)
.then((response) => {
logger.debug(
'Parent template enregistré avec succès:',
response
);
})
.catch((error) => {
logger.error(
'Erreur lors de l\'enregistrement du parent template:',
error
);
});
});
// Attendre que tous les clones soient créés
Promise.all(clonePromises)
// Attendre que tous les clones (school et parent) soient créés
Promise.all([...clonePromises, ...parentClonePromises])
.then(() => {
// Mise à jour immédiate des données
setRegistrationFormsDataPending((prevState) => [
@ -620,7 +636,7 @@ export default function Page({ params: { locale } }) {
updatedData.studentFirstName
);
}
closeModal();
closeModal(); // Appeler closeModal ici après que tout soit terminé
// Forcer le rechargement complet des données
setReloadFetch(true);
})
@ -755,6 +771,14 @@ export default function Page({ params: { locale } }) {
},
],
3: [
{
icon: (
<span title="Voir les fichiers">
<FileText className="w-5 h-5 text-cyan-500 hover:text-cyan-700" />
</span>
),
onClick: () => openFilesModal(row),
},
{
icon: (
<span title="Valider le dossier">
@ -781,6 +805,16 @@ export default function Page({ params: { locale } }) {
onClick: () => openModalAssociationEleve(row.student),
},
],
7: [
{
icon: (
<span title="Voir les fichiers">
<FileText className="w-5 h-5 text-cyan-500 hover:text-cyan-700" />
</span>
),
onClick: () => openFilesModal(row),
},
],
default: [
{
icon: (
@ -1132,21 +1166,45 @@ export default function Page({ params: { locale } }) {
/>
)}
{isOpenAddGuardian && (
<Modal
isOpen={isOpenAddGuardian}
setIsOpen={setIsOpenAddGuardian}
title="Ajouter un responsable"
ContentComponent={() => (
<InscriptionForm
students={students}
profiles={profiles}
onSubmit={updateRF}
currentStep={2}
showOnlyStep2={true}
/>
)}
/>
)}
<Modal
isOpen={isOpenAddGuardian}
setIsOpen={setIsOpenAddGuardian}
title="Ajouter un responsable"
ContentComponent={() => (
<InscriptionForm
students={students}
profiles={profiles}
onSubmit={updateRF}
currentStep={2}
showOnlyStep2={true}
/>
)}
/>
)}
{isFilesModalOpen && (
<Modal
isOpen={isFilesModalOpen}
setIsOpen={setIsFilesModalOpen}
title="Fichiers disponibles"
ContentComponent={() => (
<ul className="space-y-4">
{selectedRowFiles.map((file, index) => (
<li key={index} className="flex items-center gap-2">
<FileText className="w-5 h-5 text-gray-500" />
<a
href={file.url}
target="_blank"
rel="noopener noreferrer"
className="text-blue-500 hover:text-blue-700 underline"
>
{file.name}
</a>
</li>
))}
</ul>
)}
/>
)}
</div>
);
}

View File

@ -23,11 +23,12 @@ export default function Page() {
const handleAcceptRF = (data) => {
logger.debug('Mise à jour du RF avec les données:', data);
const { status, sepa_file } = data;
const {status, sepa_file, fusionParam} = data
const formData = new FormData();
formData.append('status', status); // Ajoute le statut
formData.append('sepa_file', sepa_file); // Ajoute le fichier SEPA
formData.append('fusion', fusionParam);
// Appeler l'API pour mettre à jour le RF
sendSEPARegisterForm(studentId, formData, csrfToken)
.then((response) => {