diff --git a/Back-End/Subscriptions/util.py b/Back-End/Subscriptions/util.py index b112ba5..fbc834b 100644 --- a/Back-End/Subscriptions/util.py +++ b/Back-End/Subscriptions/util.py @@ -487,7 +487,12 @@ def generate_form_json_pdf(register_form, form_json): for field in fields: label = field.get("label", field.get("id", "")) ftype = field.get("type", "") - c.drawString(100, y, f"{label} [{ftype}]") + value = field.get("value", "") + # Afficher la valeur si elle existe + if value not in (None, ""): + c.drawString(100, y, f"{label} [{ftype}] : {value}") + else: + c.drawString(100, y, f"{label} [{ftype}]") y -= 25 if y < 100: c.showPage() diff --git a/Back-End/Subscriptions/views/registration_parent_file_masters_views.py b/Back-End/Subscriptions/views/registration_parent_file_masters_views.py index df91d4d..c75e6dd 100644 --- a/Back-End/Subscriptions/views/registration_parent_file_masters_views.py +++ b/Back-End/Subscriptions/views/registration_parent_file_masters_views.py @@ -6,11 +6,10 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status -from Subscriptions.serializers import RegistrationParentFileMasterSerializer, RegistrationParentFileTemplateSerializer +from Subscriptions.serializers import RegistrationParentFileMasterSerializer from Subscriptions.models import ( RegistrationForm, - RegistrationParentFileMaster, - RegistrationParentFileTemplate + RegistrationParentFileMaster ) from N3wtSchool import bdd import logging @@ -176,97 +175,3 @@ class RegistrationParentFileMasterSimpleView(APIView): return JsonResponse({'message': 'La suppression du fichier parent a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) else: return JsonResponse({'erreur': 'Le fichier parent n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - -class RegistrationParentFileTemplateView(APIView): - @swagger_auto_schema( - operation_description="Récupère tous les templates parents pour un établissement donné", - manual_parameters=[ - openapi.Parameter( - 'establishment_id', - openapi.IN_QUERY, - description="ID de l'établissement", - type=openapi.TYPE_INTEGER, - required=True - ) - ], - responses={200: RegistrationParentFileTemplateSerializer(many=True)} - ) - def get(self, request): - establishment_id = request.GET.get('establishment_id') - if not establishment_id: - return Response({'error': "Paramètre 'establishment_id' requis"}, status=status.HTTP_400_BAD_REQUEST) - - # Filtrer les templates parents liés à l'établissement via master.groups.establishment - templates = RegistrationParentFileTemplate.objects.filter( - master__groups__establishment__id=establishment_id - ).distinct() - serializer = RegistrationParentFileTemplateSerializer(templates, many=True) - return Response(serializer.data) - - @swagger_auto_schema( - operation_description="Crée un nouveau template d'inscription", - request_body=RegistrationParentFileTemplateSerializer, - responses={ - 201: RegistrationParentFileTemplateSerializer, - 400: "Données invalides" - } - ) - def post(self, request): - serializer = RegistrationParentFileTemplateSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -class RegistrationParentFileTemplateSimpleView(APIView): - @swagger_auto_schema( - operation_description="Récupère un template d'inscription spécifique", - responses={ - 200: RegistrationParentFileTemplateSerializer, - 404: "Template non trouvé" - } - ) - def get(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileTemplate, _columnName='id', _value=id) - if template is None: - return JsonResponse({"errorMessage":'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationParentFileTemplateSerializer(template) - return JsonResponse(serializer.data, safe=False) - - @swagger_auto_schema( - operation_description="Met à jour un template d'inscription existant", - request_body=RegistrationParentFileTemplateSerializer, - responses={ - 200: RegistrationParentFileTemplateSerializer, - 400: "Données invalides", - 404: "Template non trouvé" - } - ) - def put(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileTemplate, _columnName='id', _value=id) - if template is None: - return JsonResponse({'erreur': 'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - - serializer = RegistrationParentFileTemplateSerializer(template, data=request.data, partial=True) - if serializer.is_valid(): - serializer.save() - return Response({'message': 'Template mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - @swagger_auto_schema( - operation_description="Supprime un template d'inscription", - responses={ - 204: "Suppression réussie", - 404: "Template non trouvé" - } - ) - def delete(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileTemplate, _columnName='id', _value=id) - if template is not None: - # Suppression du fichier PDF associé avant suppression de l'objet - if template.file and template.file.name: - template.file.delete(save=False) - template.delete() - return JsonResponse({'message': 'La suppression du template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) - else: - return JsonResponse({'erreur': 'Le template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) diff --git a/Back-End/Subscriptions/views/registration_school_file_templates_views.py b/Back-End/Subscriptions/views/registration_school_file_templates_views.py index 0f25471..50dc0fd 100644 --- a/Back-End/Subscriptions/views/registration_school_file_templates_views.py +++ b/Back-End/Subscriptions/views/registration_school_file_templates_views.py @@ -1,128 +1,21 @@ from django.http.response import JsonResponse from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi -from rest_framework.parsers import MultiPartParser, FormParser from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status import os +import glob -from Subscriptions.serializers import RegistrationSchoolFileMasterSerializer, RegistrationSchoolFileTemplateSerializer, RegistrationParentFileMasterSerializer, RegistrationParentFileTemplateSerializer -from Subscriptions.models import RegistrationSchoolFileMaster, RegistrationSchoolFileTemplate, RegistrationParentFileMaster, RegistrationParentFileTemplate +from Subscriptions.serializers import RegistrationSchoolFileTemplateSerializer +from Subscriptions.models import RegistrationSchoolFileTemplate from N3wtSchool import bdd import logging +from rest_framework.parsers import MultiPartParser, FormParser, JSONParser import Subscriptions.util as util logger = logging.getLogger(__name__) -class RegistrationSchoolFileMasterView(APIView): - parser_classes = [MultiPartParser, FormParser] - @swagger_auto_schema( - operation_description="Récupère tous les masters de templates d'inscription pour un établissement donné", - manual_parameters=[ - openapi.Parameter( - 'establishment_id', - openapi.IN_QUERY, - description="ID de l'établissement", - type=openapi.TYPE_INTEGER, - required=True - ) - ], - responses={200: RegistrationSchoolFileMasterSerializer(many=True)} - ) - def get(self, request): - establishment_id = request.GET.get('establishment_id') - if not establishment_id: - return Response({'error': "Paramètre 'establishment_id' requis"}, status=status.HTTP_400_BAD_REQUEST) - - # Filtrer les masters liés à l'établissement via groups.establishment - masters = RegistrationSchoolFileMaster.objects.filter( - groups__establishment__id=establishment_id - ).distinct() - serializer = RegistrationSchoolFileMasterSerializer(masters, many=True) - return Response(serializer.data) - - @swagger_auto_schema( - operation_description="Crée un nouveau master de template d'inscription", - request_body=RegistrationSchoolFileMasterSerializer, - responses={ - 201: RegistrationSchoolFileMasterSerializer, - 400: "Données invalides" - } - ) - def post(self, request): - logger.info(f"raw request.data: {request.data}") - - payload, resp = util.build_payload_from_request(request) - if resp: - return resp - - logger.info(f"payload for serializer: {payload}") - serializer = RegistrationSchoolFileMasterSerializer(data=payload, partial=True) - if serializer.is_valid(): - obj = serializer.save() - return Response(RegistrationSchoolFileMasterSerializer(obj).data, status=status.HTTP_201_CREATED) - - logger.error(f"serializer errors: {serializer.errors}") - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -class RegistrationSchoolFileMasterSimpleView(APIView): - @swagger_auto_schema( - operation_description="Récupère un master de template d'inscription spécifique", - responses={ - 200: RegistrationSchoolFileMasterSerializer, - 404: "Master non trouvé" - } - ) - def get(self, request, id): - master = bdd.getObject(_objectName=RegistrationSchoolFileMaster, _columnName='id', _value=id) - if master is None: - return JsonResponse({"errorMessage":'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationSchoolFileMasterSerializer(master) - return JsonResponse(serializer.data, safe=False) - - @swagger_auto_schema( - operation_description="Met à jour un master de template d'inscription existant", - request_body=RegistrationSchoolFileMasterSerializer, - responses={ - 200: RegistrationSchoolFileMasterSerializer, - 400: "Données invalides", - 404: "Master non trouvé" - } - ) - def put(self, request, id): - master = bdd.getObject(_objectName=RegistrationSchoolFileMaster, _columnName='id', _value=id) - if master is None: - return JsonResponse({'erreur': "Le master de template n'a pas été trouvé"}, safe=False, status=status.HTTP_404_NOT_FOUND) - - # Normaliser payload (supporte form-data avec champ 'data' JSON ou fichier JSON) - payload, resp = util.build_payload_from_request(request) - if resp: - return resp - - logger.info(f"payload for update serializer: {payload}") - serializer = RegistrationSchoolFileMasterSerializer(master, data=payload, partial=True) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_200_OK) - logger.error(f"serializer errors on put: {serializer.errors}") - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - @swagger_auto_schema( - operation_description="Supprime un master de template d'inscription", - responses={ - 204: "Suppression réussie", - 404: "Master non trouvé" - } - ) - def delete(self, request, id): - master = bdd.getObject(_objectName=RegistrationSchoolFileMaster, _columnName='id', _value=id) - if master is not None: - master.delete() - return JsonResponse({'message': 'La suppression du master de template a été effectuée avec succès'}, safe=False, status=status.HTTP_200_OK) - else: - return JsonResponse({'erreur': 'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - class RegistrationSchoolFileTemplateView(APIView): @swagger_auto_schema( operation_description="Récupère tous les templates d'inscription pour un établissement donné", @@ -165,6 +58,8 @@ class RegistrationSchoolFileTemplateView(APIView): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class RegistrationSchoolFileTemplateSimpleView(APIView): + parser_classes = [MultiPartParser, FormParser, JSONParser] + @swagger_auto_schema( operation_description="Récupère un template d'inscription spécifique", responses={ @@ -189,12 +84,83 @@ class RegistrationSchoolFileTemplateSimpleView(APIView): } ) def put(self, request, id): + # Normaliser la payload (support form-data avec champ 'data' JSON ou fichier JSON) + payload, resp = util.build_payload_from_request(request) + if resp is not None: + return resp + + # Synchroniser fields[].value dans le payload AVANT le serializer (pour les formulaires dynamiques) + formTemplateData = payload.get('formTemplateData') + if formTemplateData and isinstance(formTemplateData, dict): + responses = None + if "responses" in formTemplateData: + resp = formTemplateData["responses"] + if isinstance(resp, dict) and "responses" in resp: + responses = resp["responses"] + elif isinstance(resp, dict): + responses = resp + if responses and "fields" in formTemplateData: + for field in formTemplateData["fields"]: + field_id = field.get("id") + if field_id and field_id in responses: + field["value"] = responses[field_id] + payload['formTemplateData'] = formTemplateData + template = bdd.getObject(_objectName=RegistrationSchoolFileTemplate, _columnName='id', _value=id) if template is None: return JsonResponse({'erreur': 'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationSchoolFileTemplateSerializer(template, data=request.data) + + # Cas 1 : Upload d'un fichier existant (PDF/image) + if 'file' in request.FILES: + upload = request.FILES['file'] + file_field = template.file + upload_name = upload.name + upload_dir = os.path.dirname(file_field.path) if file_field and file_field.name else None + if upload_dir: + base_name, _ = os.path.splitext(upload_name) + pattern = os.path.join(upload_dir, f"{base_name}.*") + for f in glob.glob(pattern): + try: + if os.path.exists(f): + os.remove(f) + logger.info(f"Suppression du fichier existant (pattern): {f}") + except Exception as e: + logger.error(f"Erreur suppression fichier existant (pattern): {e}") + target_path = os.path.join(upload_dir, upload_name) + if os.path.exists(target_path): + try: + os.remove(target_path) + except Exception as e: + logger.error(f"Erreur suppression fichier cible: {e}") + # On écrase le fichier existant sans passer par le serializer + template.file.save(upload_name, upload, save=True) + return Response({'message': 'Template mis à jour avec succès', 'data': RegistrationSchoolFileTemplateSerializer(template).data}, status=status.HTTP_200_OK) + + # Cas 2 : Formulaire dynamique (JSON) + serializer = RegistrationSchoolFileTemplateSerializer(template, data=payload) if serializer.is_valid(): serializer.save() + # Régénérer le PDF si besoin + formTemplateData = serializer.validated_data.get('formTemplateData') + if ( + formTemplateData + and isinstance(formTemplateData, dict) + and formTemplateData.get("fields") + and hasattr(template, "file") + ): + old_pdf_name = None + if template.file and template.file.name: + old_pdf_name = os.path.basename(template.file.name) + try: + template.file.delete(save=False) + if os.path.exists(template.file.path): + os.remove(template.file.path) + except Exception as e: + logger.error(f"Erreur lors de la suppression du fichier existant: {e}") + from Subscriptions.util import generate_form_json_pdf + pdf_file = generate_form_json_pdf(template.registration_form, formTemplateData) + pdf_filename = old_pdf_name or f"{template.name}_{template.id}.pdf" + template.file.save(pdf_filename, pdf_file, save=True) return Response({'message': 'Template mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @@ -223,195 +189,3 @@ class RegistrationSchoolFileTemplateSimpleView(APIView): return JsonResponse({'message': 'La suppression du template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) else: return JsonResponse({'erreur': 'Le template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - -class RegistrationParentFileMasterView(APIView): - @swagger_auto_schema( - operation_description="Récupère tous les fichiers parents pour un établissement donné", - manual_parameters=[ - openapi.Parameter( - 'establishment_id', - openapi.IN_QUERY, - description="ID de l'établissement", - type=openapi.TYPE_INTEGER, - required=True - ) - ], - responses={200: RegistrationParentFileMasterSerializer(many=True)} - ) - def get(self, request): - establishment_id = request.GET.get('establishment_id') - if not establishment_id: - return Response({'error': "Paramètre 'establishment_id' requis"}, status=status.HTTP_400_BAD_REQUEST) - - # Filtrer les fichiers parents liés à l'établissement - templates = RegistrationParentFileMaster.objects.filter( - groups__establishment__id=establishment_id - ).distinct() - serializer = RegistrationParentFileMasterSerializer(templates, many=True) - return Response(serializer.data) - - @swagger_auto_schema( - operation_description="Crée un nouveau fichier parent", - request_body=RegistrationParentFileMasterSerializer, - responses={ - 201: RegistrationParentFileMasterSerializer, - 400: "Données invalides" - } - ) - def post(self, request): - serializer = RegistrationParentFileMasterSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -class RegistrationParentFileMasterSimpleView(APIView): - @swagger_auto_schema( - operation_description="Récupère un fichier parent spécifique", - responses={ - 200: RegistrationParentFileMasterSerializer, - 404: "Fichier parent non trouvé" - } - ) - def get(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileMaster, _columnName='id', _value=id) - if template is None: - return JsonResponse({"errorMessage":'Le fichier parent n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationParentFileMasterSerializer(template) - return JsonResponse(serializer.data, safe=False) - - @swagger_auto_schema( - operation_description="Met à jour un fichier parent existant", - request_body=RegistrationParentFileMasterSerializer, - responses={ - 200: RegistrationParentFileMasterSerializer, - 400: "Données invalides", - 404: "Fichier parent non trouvé" - } - ) - def put(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileMaster, _columnName='id', _value=id) - if template is None: - return JsonResponse({'erreur': 'Le fichier parent n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationParentFileMasterSerializer(template, data=request.data) - if serializer.is_valid(): - serializer.save() - return Response({'message': 'Fichier parent mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - @swagger_auto_schema( - operation_description="Supprime un fichier parent", - responses={ - 204: "Suppression réussie", - 404: "Fichier parent non trouvé" - } - ) - def delete(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileMaster, _columnName='id', _value=id) - if template is not None: - template.delete() - return JsonResponse({'message': 'La suppression du fichier parent a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) - else: - return JsonResponse({'erreur': 'Le fichier parent n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - -class RegistrationParentFileTemplateView(APIView): - @swagger_auto_schema( - operation_description="Récupère tous les templates parents pour un établissement donné", - manual_parameters=[ - openapi.Parameter( - 'establishment_id', - openapi.IN_QUERY, - description="ID de l'établissement", - type=openapi.TYPE_INTEGER, - required=True - ) - ], - responses={200: RegistrationParentFileTemplateSerializer(many=True)} - ) - def get(self, request): - establishment_id = request.GET.get('establishment_id') - if not establishment_id: - return Response({'error': "Paramètre 'establishment_id' requis"}, status=status.HTTP_400_BAD_REQUEST) - - # Filtrer les templates parents liés à l'établissement via master.groups.establishment - templates = RegistrationParentFileTemplate.objects.filter( - master__groups__establishment__id=establishment_id - ).distinct() - serializer = RegistrationParentFileTemplateSerializer(templates, many=True) - return Response(serializer.data) - - @swagger_auto_schema( - operation_description="Crée un nouveau template d'inscription", - request_body=RegistrationParentFileTemplateSerializer, - responses={ - 201: RegistrationParentFileTemplateSerializer, - 400: "Données invalides" - } - ) - def post(self, request): - serializer = RegistrationParentFileTemplateSerializer(data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - -class RegistrationParentFileTemplateSimpleView(APIView): - @swagger_auto_schema( - operation_description="Récupère un template d'inscription spécifique", - responses={ - 200: RegistrationParentFileTemplateSerializer, - 404: "Template non trouvé" - } - ) - def get(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileTemplate, _columnName='id', _value=id) - if template is None: - return JsonResponse({"errorMessage":'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - serializer = RegistrationParentFileTemplateSerializer(template) - return JsonResponse(serializer.data, safe=False) - - @swagger_auto_schema( - operation_description="Met à jour un template d'inscription existant", - request_body=RegistrationParentFileTemplateSerializer, - responses={ - 200: RegistrationParentFileTemplateSerializer, - 400: "Données invalides", - 404: "Template non trouvé" - } - ) - def put(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileTemplate, _columnName='id', _value=id) - if template is None: - return JsonResponse({'erreur': 'Le template d\'inscription n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) - - serializer = RegistrationParentFileTemplateSerializer(template, data=request.data, partial=True) - if serializer.is_valid(): - serializer.save() - return Response({'message': 'Template mis à jour avec succès', 'data': serializer.data}, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - - @swagger_auto_schema( - operation_description="Supprime un template d'inscription", - responses={ - 204: "Suppression réussie", - 404: "Template non trouvé" - } - ) - def delete(self, request, id): - template = bdd.getObject(_objectName=RegistrationParentFileTemplate, _columnName='id', _value=id) - if template is not None: - # Suppression du fichier PDF associé - if template.file and template.file.name: - file_path = template.file.path - template.file.delete(save=False) - # Vérification post-suppression - if os.path.exists(file_path): - try: - os.remove(file_path) - logger.info(f"Fichier supprimé manuellement: {file_path}") - except Exception as e: - logger.error(f"Erreur lors de la suppression manuelle du fichier: {e}") - template.delete() - return JsonResponse({'message': 'La suppression du template a été effectuée avec succès'}, safe=False, status=status.HTTP_204_NO_CONTENT) - else: - return JsonResponse({'erreur': 'Le template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) diff --git a/Front-End/src/components/Inscription/DynamicFormsList.js b/Front-End/src/components/Inscription/DynamicFormsList.js index 20f97fc..e866b2e 100644 --- a/Front-End/src/components/Inscription/DynamicFormsList.js +++ b/Front-End/src/components/Inscription/DynamicFormsList.js @@ -1,8 +1,10 @@ 'use client'; import React, { useState, useEffect } from 'react'; import FormRenderer from '@/components/Form/FormRenderer'; -import { CheckCircle, Hourglass, FileText } from 'lucide-react'; +import FileUpload from '@/components/Form/FileUpload'; +import { CheckCircle, Hourglass, FileText, Download, Upload } from 'lucide-react'; import logger from '@/utils/logger'; +import { BASE_URL } from '@/utils/Url'; /** * Composant pour afficher et gérer les formulaires dynamiques d'inscription @@ -10,6 +12,7 @@ import logger from '@/utils/logger'; * @param {Object} existingResponses - Réponses déjà sauvegardées * @param {Function} onFormSubmit - Callback appelé quand un formulaire est soumis * @param {Boolean} enable - Si les formulaires sont modifiables + * @param {Function} onFileUpload - Callback appelé quand un fichier est sélectionné */ export default function DynamicFormsList({ schoolFileMasters, @@ -17,10 +20,12 @@ export default function DynamicFormsList({ onFormSubmit, enable = true, onValidationChange, + onFileUpload, // nouvelle prop pour gérer l'upload (à passer depuis le parent) }) { const [currentTemplateIndex, setCurrentTemplateIndex] = useState(0); const [formsData, setFormsData] = useState({}); const [formsValidation, setFormsValidation] = useState({}); + const fileInputRefs = React.useRef({}); // Initialiser les données avec les réponses existantes useEffect(() => { @@ -138,6 +143,27 @@ export default function DynamicFormsList({ return schoolFileMasters[currentTemplateIndex]; }; + // Handler d'upload pour formulaire existant + const handleUpload = async (file, selectedFile) => { + if (!file || !selectedFile) return; + try { + if (onFileUpload) { + await onFileUpload(file, selectedFile); + setFormsValidation((prev) => ({ + ...prev, + [selectedFile.id]: true, + })); + } + } catch (error) { + logger.error('Erreur lors de l\'upload du fichier :', error); + } + }; + + const isDynamicForm = (template) => + template.formTemplateData && + Array.isArray(template.formTemplateData.fields) && + template.formTemplateData.fields.length > 0; + if (!schoolFileMasters || schoolFileMasters.length === 0) { return (
- {currentTemplate.formMasterData?.description || + {currentTemplate.formTemplateData?.description || currentTemplate.description || 'Veuillez compléter ce formulaire pour continuer votre inscription.'}
@@ -239,39 +265,57 @@ export default function DynamicFormsList({- Ce formulaire n'est pas encore configuré. -
-- Contactez l'administration pour plus d'informations. -
+ // Formulaire existant (PDF, image, etc.) +