mirror of
https://git.v0id.ovh/n3wt-innov/n3wt-school.git
synced 2026-04-05 12:41:27 +00:00
fix: Upload document
This commit is contained in:
@ -55,6 +55,11 @@ export default function DynamicFormsList({
|
|||||||
return cleaned;
|
return cleaned;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isDynamicForm = (template) =>
|
||||||
|
template.formTemplateData &&
|
||||||
|
Array.isArray(template.formTemplateData.fields) &&
|
||||||
|
template.formTemplateData.fields.length > 0;
|
||||||
|
|
||||||
const hasLocalCompletion = (templateId) => {
|
const hasLocalCompletion = (templateId) => {
|
||||||
if (formsValidation[templateId] === true) return true;
|
if (formsValidation[templateId] === true) return true;
|
||||||
|
|
||||||
@ -65,11 +70,22 @@ export default function DynamicFormsList({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const savedResponses = existingResponses[templateId];
|
const savedResponses = existingResponses[templateId];
|
||||||
return !!(
|
if (
|
||||||
savedResponses &&
|
savedResponses &&
|
||||||
typeof savedResponses === 'object' &&
|
typeof savedResponses === 'object' &&
|
||||||
Object.keys(savedResponses).length > 0
|
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
|
// 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) {
|
if (!schoolFileTemplates || schoolFileTemplates.length === 0) {
|
||||||
return (
|
return (
|
||||||
<div className="text-center py-8">
|
<div className="text-center py-8">
|
||||||
@ -497,10 +508,10 @@ export default function DynamicFormsList({
|
|||||||
{/* Cas non validé : bouton télécharger + upload */}
|
{/* Cas non validé : bouton télécharger + upload */}
|
||||||
{currentTemplate.isValidated !== true && (
|
{currentTemplate.isValidated !== true && (
|
||||||
<div className="flex flex-col items-center gap-4 w-full">
|
<div className="flex flex-col items-center gap-4 w-full">
|
||||||
{/* Bouton télécharger le document source */}
|
{/* Bouton télécharger le document source (fichier maître) */}
|
||||||
{currentTemplate.file && (
|
{(currentTemplate.master_file_url || currentTemplate.file) && (
|
||||||
<a
|
<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"
|
className="flex items-center gap-2 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition"
|
||||||
download
|
download
|
||||||
>
|
>
|
||||||
@ -517,6 +528,7 @@ export default function DynamicFormsList({
|
|||||||
onFileSelect={(file) =>
|
onFileSelect={(file) =>
|
||||||
handleUpload(file, currentTemplate)
|
handleUpload(file, currentTemplate)
|
||||||
}
|
}
|
||||||
|
existingFile={currentTemplate.file_url || currentTemplate.file}
|
||||||
required
|
required
|
||||||
enable={true}
|
enable={true}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -67,11 +67,17 @@ const FilesModal = ({
|
|||||||
: null,
|
: null,
|
||||||
schoolFiles: fetchedSchoolFiles.map((file) => ({
|
schoolFiles: fetchedSchoolFiles.map((file) => ({
|
||||||
name: file.name || 'Document scolaire',
|
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) => ({
|
parentFiles: parentFiles.map((file) => ({
|
||||||
name: file.master_name || 'Document parent',
|
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
|
sepaFile: selectedRegisterForm.sepa_file
|
||||||
? {
|
? {
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import {
|
|||||||
} from '@/app/actions/subscriptionAction';
|
} from '@/app/actions/subscriptionAction';
|
||||||
import {
|
import {
|
||||||
editRegistrationSchoolFileTemplates,
|
editRegistrationSchoolFileTemplates,
|
||||||
|
editRegistrationParentFileTemplates,
|
||||||
} from '@/app/actions/registerFileGroupAction';
|
} from '@/app/actions/registerFileGroupAction';
|
||||||
import {
|
import {
|
||||||
fetchRegistrationPaymentModes,
|
fetchRegistrationPaymentModes,
|
||||||
@ -415,7 +416,8 @@ export default function InscriptionFormShared({
|
|||||||
const templateData = await fetchFormResponses(template.id);
|
const templateData = await fetchFormResponses(template.id);
|
||||||
if (templateData && templateData.formTemplateData) {
|
if (templateData && templateData.formTemplateData) {
|
||||||
if (templateData.formTemplateData.responses) {
|
if (templateData.formTemplateData.responses) {
|
||||||
responsesMap[template.id] = templateData.formTemplateData.responses;
|
responsesMap[template.id] =
|
||||||
|
templateData.formTemplateData.responses;
|
||||||
} else {
|
} else {
|
||||||
// Extraire les réponses depuis les champs
|
// Extraire les réponses depuis les champs
|
||||||
const responses = {};
|
const responses = {};
|
||||||
@ -554,7 +556,7 @@ export default function InscriptionFormShared({
|
|||||||
const updateData = new FormData();
|
const updateData = new FormData();
|
||||||
updateData.append('file', file, finalFileName);
|
updateData.append('file', file, finalFileName);
|
||||||
|
|
||||||
return editRegistrationSchoolFileTemplates(
|
return editRegistrationParentFileTemplates(
|
||||||
selectedFile.id,
|
selectedFile.id,
|
||||||
updateData,
|
updateData,
|
||||||
csrfToken
|
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 handleDeleteFile = (templateId) => {
|
||||||
const fileToDelete = uploadedFiles.find(
|
const fileToDelete = uploadedFiles.find(
|
||||||
(file) => parseInt(file.id) === templateId && file.fileName
|
(file) => parseInt(file.id) === templateId && file.fileName
|
||||||
@ -827,7 +869,7 @@ export default function InscriptionFormShared({
|
|||||||
onFormSubmit={handleDynamicFormSubmit}
|
onFormSubmit={handleDynamicFormSubmit}
|
||||||
onValidationChange={handleDynamicFormsValidationChange}
|
onValidationChange={handleDynamicFormsValidationChange}
|
||||||
enable={enable}
|
enable={enable}
|
||||||
onFileUpload={handleFileUpload}
|
onFileUpload={handleSchoolFileUpload}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
21
conf/create-establishment.sample.json
Normal file
21
conf/create-establishment.sample.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"establishments": [
|
||||||
|
{
|
||||||
|
"name": "Ecole Demo",
|
||||||
|
"address": "1 rue de la Paix, Paris",
|
||||||
|
"total_capacity": 300,
|
||||||
|
"establishment_type": [
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"evaluation_frequency": 1,
|
||||||
|
"licence_code": "LIC-DEMO-001",
|
||||||
|
"directeur": {
|
||||||
|
"email": "luc.sorignet@gmail.com",
|
||||||
|
"password": "a",
|
||||||
|
"last_name": "Dupont",
|
||||||
|
"first_name": "Jean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user