fix: Upload document

This commit is contained in:
Luc SORIGNET
2026-04-04 23:00:39 +02:00
parent 3c7266608d
commit b0e04e3adc
4 changed files with 96 additions and 15 deletions

View File

@ -55,6 +55,11 @@ export default function DynamicFormsList({
return cleaned;
};
const isDynamicForm = (template) =>
template.formTemplateData &&
Array.isArray(template.formTemplateData.fields) &&
template.formTemplateData.fields.length > 0;
const hasLocalCompletion = (templateId) => {
if (formsValidation[templateId] === true) return true;
@ -65,11 +70,22 @@ export default function DynamicFormsList({
}
const savedResponses = existingResponses[templateId];
return !!(
if (
savedResponses &&
typeof savedResponses === 'object' &&
Object.keys(savedResponses).length > 0
);
) {
return true;
}
// Pour les formulaires non dynamiques (upload de fichier),
// vérifier si un fichier a déjà été uploadé sur le template
const template = schoolFileTemplates.find((tpl) => tpl.id === templateId);
if (template && template.file && !isDynamicForm(template)) {
return true;
}
return false;
};
// Initialiser les données avec les réponses existantes
@ -233,11 +249,6 @@ export default function DynamicFormsList({
}
};
const isDynamicForm = (template) =>
template.formTemplateData &&
Array.isArray(template.formTemplateData.fields) &&
template.formTemplateData.fields.length > 0;
if (!schoolFileTemplates || schoolFileTemplates.length === 0) {
return (
<div className="text-center py-8">
@ -497,10 +508,10 @@ export default function DynamicFormsList({
{/* Cas non validé : bouton télécharger + upload */}
{currentTemplate.isValidated !== true && (
<div className="flex flex-col items-center gap-4 w-full">
{/* Bouton télécharger le document source */}
{currentTemplate.file && (
{/* Bouton télécharger le document source (fichier maître) */}
{(currentTemplate.master_file_url || currentTemplate.file) && (
<a
href={getSecureFileUrl(currentTemplate.file)}
href={getSecureFileUrl(currentTemplate.master_file_url || currentTemplate.file)}
className="flex items-center gap-2 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition"
download
>
@ -517,6 +528,7 @@ export default function DynamicFormsList({
onFileSelect={(file) =>
handleUpload(file, currentTemplate)
}
existingFile={currentTemplate.file_url || currentTemplate.file}
required
enable={true}
/>

View File

@ -67,11 +67,17 @@ const FilesModal = ({
: null,
schoolFiles: fetchedSchoolFiles.map((file) => ({
name: file.name || 'Document scolaire',
url: file.file ? getSecureFileUrl(file.file) : null,
url:
file.file_url || file.file
? getSecureFileUrl(file.file_url || file.file)
: null,
})),
parentFiles: parentFiles.map((file) => ({
name: file.master_name || 'Document parent',
url: file.file ? getSecureFileUrl(file.file) : null,
url:
file.file_url || file.file
? getSecureFileUrl(file.file_url || file.file)
: null,
})),
sepaFile: selectedRegisterForm.sepa_file
? {

View File

@ -11,6 +11,7 @@ import {
} from '@/app/actions/subscriptionAction';
import {
editRegistrationSchoolFileTemplates,
editRegistrationParentFileTemplates,
} from '@/app/actions/registerFileGroupAction';
import {
fetchRegistrationPaymentModes,
@ -415,7 +416,8 @@ export default function InscriptionFormShared({
const templateData = await fetchFormResponses(template.id);
if (templateData && templateData.formTemplateData) {
if (templateData.formTemplateData.responses) {
responsesMap[template.id] = templateData.formTemplateData.responses;
responsesMap[template.id] =
templateData.formTemplateData.responses;
} else {
// Extraire les réponses depuis les champs
const responses = {};
@ -554,7 +556,7 @@ export default function InscriptionFormShared({
const updateData = new FormData();
updateData.append('file', file, finalFileName);
return editRegistrationSchoolFileTemplates(
return editRegistrationParentFileTemplates(
selectedFile.id,
updateData,
csrfToken
@ -596,6 +598,46 @@ export default function InscriptionFormShared({
});
};
const handleSchoolFileUpload = (file, selectedFile) => {
if (!file || !selectedFile) {
logger.error('Données manquantes pour le téléversement.');
return Promise.reject(
new Error('Données manquantes pour le téléversement.')
);
}
const updateData = new FormData();
updateData.append('file', file);
return editRegistrationSchoolFileTemplates(
selectedFile.id,
updateData,
csrfToken
)
.then((response) => {
logger.debug('School file template mis à jour avec succès :', response);
// Mettre à jour uniquement schoolFileTemplates
setSchoolFileTemplates((prevTemplates) =>
prevTemplates.map((template) =>
template.id === selectedFile.id
? {
...template,
file: response.data.file,
file_url: response.data.file_url,
}
: template
)
);
return response;
})
.catch((error) => {
logger.error('Erreur lors de la mise à jour du school file :', error);
throw error;
});
};
const handleDeleteFile = (templateId) => {
const fileToDelete = uploadedFiles.find(
(file) => parseInt(file.id) === templateId && file.fileName
@ -827,7 +869,7 @@ export default function InscriptionFormShared({
onFormSubmit={handleDynamicFormSubmit}
onValidationChange={handleDynamicFormsValidationChange}
enable={enable}
onFileUpload={handleFileUpload}
onFileUpload={handleSchoolFileUpload}
/>
)}