From 001a5bc83c0bf54061b2b04967da3fc11e2cd8dc Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Sun, 27 Apr 2025 09:48:28 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Application=20du=20formattage=20sur=20le?= =?UTF-8?q?s=20fichiers=20modifi=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/[locale]/admin/subscriptions/page.js | 95 +++--- .../validateSubscription/page.js | 4 +- Front-End/src/components/FileUpload.js | 19 +- .../Inscription/InscriptionFormShared.js | 314 ++++++++++-------- .../Inscription/PaymentMethodSelector.js | 40 ++- .../Inscription/ResponsableInputFields.js | 69 ++-- .../components/Inscription/StudentInfoForm.js | 61 ++-- .../Inscription/ValidateSubscription.js | 53 ++- Front-End/src/components/SectionHeader.js | 36 +- .../Structure/Files/ParentFilesSection.js | 101 ++++-- 10 files changed, 486 insertions(+), 306 deletions(-) diff --git a/Front-End/src/app/[locale]/admin/subscriptions/page.js b/Front-End/src/app/[locale]/admin/subscriptions/page.js index 2948470..b4b0f6f 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/page.js @@ -54,9 +54,7 @@ import { fetchTuitionFees, } from '@/app/actions/schoolAction'; -import { - fetchProfiles, -} from '@/app/actions/authAction'; +import { fetchProfiles } from '@/app/actions/authAction'; import { BASE_URL, @@ -145,7 +143,7 @@ export default function Page({ params: { locale } }) { const files = []; if (row.registration_file) { files.push({ - name: 'Fichier d\'inscription', + name: "Fichier d'inscription", url: `${BASE_URL}${row.registration_file}`, }); } @@ -164,7 +162,7 @@ export default function Page({ params: { locale } }) { setSelectedRowFiles([]); }; - const requestErrorHandler = (err)=>{ + const requestErrorHandler = (err) => { logger.error('Error fetching data:', err); }; @@ -585,7 +583,7 @@ export default function Page({ params: { locale } }) { }) .catch((error) => { logger.error( - 'Erreur lors de l\'enregistrement du template:', + "Erreur lors de l'enregistrement du template:", error ); }); @@ -607,14 +605,11 @@ export default function Page({ params: { locale } }) { csrfToken ) .then((response) => { - logger.debug( - 'Parent template enregistré avec succès:', - response - ); + logger.debug('Parent template enregistré avec succès:', response); }) .catch((error) => { logger.error( - 'Erreur lors de l\'enregistrement du parent template:', + "Erreur lors de l'enregistrement du parent template:", error ); }); @@ -1166,45 +1161,45 @@ export default function Page({ params: { locale } }) { /> )} {isOpenAddGuardian && ( - ( - - )} - /> - )} - {isFilesModalOpen && ( - ( - - )} - /> - )} + ( + + )} + /> + )} + {isFilesModalOpen && ( + ( + + )} + /> + )} ); } diff --git a/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js b/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js index 1b57098..9785c6b 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/validateSubscription/page.js @@ -23,12 +23,12 @@ export default function Page() { const handleAcceptRF = (data) => { logger.debug('Mise à jour du RF avec les données:', data); - const {status, sepa_file, fusionParam} = 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) => { diff --git a/Front-End/src/components/FileUpload.js b/Front-End/src/components/FileUpload.js index d5020f2..3894a31 100644 --- a/Front-End/src/components/FileUpload.js +++ b/Front-End/src/components/FileUpload.js @@ -2,7 +2,11 @@ import React, { useState, useRef } from 'react'; import { CloudUpload } from 'lucide-react'; import logger from '@/utils/logger'; -export default function FileUpload({ selectionMessage, onFileSelect, uploadedFileName }) { +export default function FileUpload({ + selectionMessage, + onFileSelect, + uploadedFileName, +}) { const [localFileName, setLocalFileName] = useState(uploadedFileName || ''); const fileInputRef = useRef(null); // Utilisation de useRef pour cibler l'input @@ -34,7 +38,8 @@ export default function FileUpload({ selectionMessage, onFileSelect, uploadedFil onDragOver={(e) => e.preventDefault()} onDrop={handleFileDrop} > - {/* Icône de cloud */} + {' '} + {/* Icône de cloud */} {localFileName && ( @@ -57,4 +66,4 @@ export default function FileUpload({ selectionMessage, onFileSelect, uploadedFil )} ); -} \ No newline at end of file +} diff --git a/Front-End/src/components/Inscription/InscriptionFormShared.js b/Front-End/src/components/Inscription/InscriptionFormShared.js index a117000..ce5977e 100644 --- a/Front-End/src/components/Inscription/InscriptionFormShared.js +++ b/Front-End/src/components/Inscription/InscriptionFormShared.js @@ -65,13 +65,13 @@ export default function InscriptionFormShared({ const [uploadedFiles, setUploadedFiles] = useState([]); const [schoolFileTemplates, setSchoolFileTemplates] = useState([]); const [parentFileTemplates, setParentFileTemplates] = useState([]); - const [currentPage, setCurrentPage] = useState(1); - const [isSignatureComplete, setIsSignatureComplete] = useState(false); + const [currentPage, setCurrentPage] = useState(5); const [isPage1Valid, setIsPage1Valid] = useState(false); const [isPage2Valid, setIsPage2Valid] = useState(false); const [isPage3Valid, setIsPage3Valid] = useState(false); const [isPage4Valid, setIsPage4Valid] = useState(false); + const [isPage5Valid, setIsPage5Valid] = useState(false); const [hasInteracted, setHasInteracted] = useState(false); @@ -83,7 +83,7 @@ export default function InscriptionFormShared({ const firstUnsignedIndex = schoolFileTemplates.findIndex( (template) => template.file === null ); - + // Mettre à jour l'index du template actuel if (firstUnsignedIndex !== -1) { setCurrentTemplateIndex(firstUnsignedIndex); @@ -95,8 +95,10 @@ export default function InscriptionFormShared({ useEffect(() => { // Vérifier si tous les templates ont leur champ "file" différent de null - const allSigned = schoolFileTemplates.every((template) => template.file !== null); - + const allSigned = schoolFileTemplates.every( + (template) => template.file !== null + ); + // Mettre à jour isPage4Valid en fonction de cette condition setIsPage4Valid(allSigned); @@ -105,26 +107,34 @@ export default function InscriptionFormShared({ } }, [schoolFileTemplates]); + useEffect(() => { + // Vérifier si tous les parentFileTemplates ont leur champ "file" différent de null + const allUploaded = parentFileTemplates.every( + (template) => template.file !== null + ); + + // Mettre à jour isPage5Valid en fonction de cette condition + setIsPage5Valid(allUploaded); + }, [parentFileTemplates]); + const handleTemplateSigned = (index) => { const template = schoolFileTemplates[index]; - + if (!template) { - logger.error('Template introuvable pour l\'index donné.'); + logger.error("Template introuvable pour l'index donné."); return; } - + downloadTemplate(template.slug) .then((data) => fetch(data)) .then((response) => response.blob()) .then((blob) => { - const file = new File( - [blob], - `${template.name}.pdf`, - { type: blob.type } - ); + const file = new File([blob], `${template.name}.pdf`, { + type: blob.type, + }); const updateData = new FormData(); updateData.append('file', file); - + return editRegistrationSchoolFileTemplates( template.id, updateData, @@ -133,7 +143,7 @@ export default function InscriptionFormShared({ }) .then((data) => { logger.debug('Template mis à jour avec succès :', data); - + // Mettre à jour l'état local de schoolFileTemplates setSchoolFileTemplates((prevTemplates) => prevTemplates.map((t, i) => @@ -236,6 +246,15 @@ export default function InscriptionFormShared({ return updatedFiles; }); + // Mettre à jour parentFileTemplates + setParentFileTemplates((prevTemplates) => + prevTemplates.map((template) => + template.id === selectedFile.id + ? { ...template, file: response.data.file } + : template + ) + ); + return response; // Retourner la réponse pour signaler le succès }) .catch((error) => { @@ -265,6 +284,8 @@ export default function InscriptionFormShared({ .then((response) => { logger.debug('Fichier supprimé avec succès dans la base :', response); + setIsPage5Valid(false); + // Mettre à jour l'état local pour refléter la suppression setUploadedFiles((prev) => prev.map((uploadedFile) => @@ -273,6 +294,13 @@ export default function InscriptionFormShared({ : uploadedFile ) ); + + // Mettre à jour l'état local pour refléter la suppression dans parentFileTemplates + setParentFileTemplates((prevTemplates) => + prevTemplates.map((template) => + template.id === templateId ? { ...template, file: null } : template + ) + ); return response; }) .catch((error) => { @@ -311,10 +339,9 @@ export default function InscriptionFormShared({ const stepTitles = { 1: 'Elève', 2: 'Responsables légaux', - 3: "Modalités de paiement", - 4: "Formulaires à signer", - 5: "Pièces à fournir", - 6: "Validation" + 3: 'Modalités de paiement', + 4: 'Formulaires à signer', + 5: 'Pièces à fournir', }; const steps = [ @@ -323,7 +350,6 @@ export default function InscriptionFormShared({ 'Paiement', 'Formulaires', 'Documents parent', - 'Validation' ]; const isStepValid = (stepNumber) => { @@ -334,6 +360,10 @@ export default function InscriptionFormShared({ return isPage2Valid; case 3: return isPage3Valid; + case 4: + return isPage4Valid; + case 5: + return isPage5Valid; default: return false; } @@ -350,7 +380,10 @@ export default function InscriptionFormShared({ setStep={setCurrentPage} isStepValid={isStepValid} /> -
+
{/* Page 1 : Informations sur l'élève */} {currentPage === 1 && ( - {/* Liste des états de signature */} -
-

Documents

-
    - {schoolFileTemplates.map((template, index) => ( -
  • setCurrentTemplateIndex(index)} // Mettre à jour l'index du template actuel - > - - {template.file !== null ? ( - - ) : ( - - )} - - {template.name || 'Document sans nom'} -
  • - ))} -
+ {/* Liste des états de signature */} +
+

+ Documents +

+
    + {schoolFileTemplates.map((template, index) => ( +
  • setCurrentTemplateIndex(index)} // Mettre à jour l'index du template actuel + > + + {template.file !== null ? ( + + ) : ( + + )} + + {template.name || 'Document sans nom'} +
  • + ))} +
+
+ + {/* Affichage du fichier actuel */} +
+ {currentTemplateIndex < schoolFileTemplates.length && ( +
+

+ {schoolFileTemplates[currentTemplateIndex].name || + 'Document sans nom'} +

+

+ {schoolFileTemplates[currentTemplateIndex].description || + 'Aucune description disponible pour ce document.'} +

+ + {schoolFileTemplates[currentTemplateIndex].file === null ? ( + + handleTemplateSigned(currentTemplateIndex) + } + /> + ) : ( +