From a65bd47905cc33c44416c1def0413579b96d820d Mon Sep 17 00:00:00 2001 From: N3WT DE COMPET Date: Tue, 15 Apr 2025 18:00:58 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Gestion=20des=20pi=C3=A8ces=20=C3=A0=20?= =?UTF-8?q?fournir=20par=20les=20parents=20(configuration=20=C3=A9cole)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Back-End/Subscriptions/models.py | 27 +- Back-End/Subscriptions/serializers.py | 10 +- Back-End/Subscriptions/urls.py | 5 +- Back-End/Subscriptions/views/__init__.py | 4 +- .../views/registration_file_views copy.py | 159 ++++++++ .../views/registration_file_views.py | 79 +++- Front-End/src/app/[locale]/parents/page.js | 82 ++++- .../app/actions/registerFileGroupAction.js | 55 +++ Front-End/src/components/FileUpload copy.js | 101 ------ Front-End/src/components/InputPhone.js | 7 +- .../src/components/Inscription/FileUpload.js | 59 +++ .../components/Inscription/InscriptionForm.js | 4 +- .../Inscription/InscriptionFormShared.js | 9 + .../Inscription/ValidateSubscription.js | 50 +-- .../Configuration/SpecialitiesSection.js | 18 +- .../{FileUpload.js => FileUploadDocuSeal.js} | 2 +- .../Structure/Files/FilesGroupsManagement.js | 264 +++++++++++--- .../Structure/Files/FilesManagement.js | 343 ------------------ .../Structure/Files/ParentFilesSection.js | 246 +++++++++++++ Front-End/src/utils/Url.js | 1 + 20 files changed, 956 insertions(+), 569 deletions(-) create mode 100644 Back-End/Subscriptions/views/registration_file_views copy.py delete mode 100644 Front-End/src/components/FileUpload copy.js create mode 100644 Front-End/src/components/Inscription/FileUpload.js rename Front-End/src/components/Structure/Files/{FileUpload.js => FileUploadDocuSeal.js} (97%) delete mode 100644 Front-End/src/components/Structure/Files/FilesManagement.js create mode 100644 Front-End/src/components/Structure/Files/ParentFilesSection.js diff --git a/Back-End/Subscriptions/models.py b/Back-End/Subscriptions/models.py index 86f5b85..60e3135 100644 --- a/Back-End/Subscriptions/models.py +++ b/Back-End/Subscriptions/models.py @@ -163,6 +163,9 @@ class RegistrationFileGroup(models.Model): def __str__(self): return self.name + def __str__(self): + return f'{self.group.name} - {self.id}' + def registration_file_path(instance, filename): # Génère le chemin : registration_files/dossier_rf_{student_id}/filename return f'registration_files/dossier_rf_{instance.student_id}/{filename}' @@ -211,7 +214,7 @@ class RegistrationForm(models.Model): # Many-to-Many Relationship discounts = models.ManyToManyField(Discount, blank=True, related_name='register_forms') fileGroup = models.ForeignKey(RegistrationFileGroup, - on_delete=models.CASCADE, + on_delete=models.SET_NULL, related_name='register_forms', null=True, blank=True) @@ -223,6 +226,20 @@ class RegistrationForm(models.Model): def __str__(self): return "RF_" + self.student.last_name + "_" + self.student.first_name + def save(self, *args, **kwargs): + # Vérifier si un fichier existant doit être remplacé + if self.pk: # Si l'objet existe déjà dans la base de données + try: + old_instance = RegistrationForm.objects.get(pk=self.pk) + if old_instance.sepa_file and old_instance.sepa_file != self.sepa_file: + # Supprimer l'ancien fichier + old_instance.sepa_file.delete(save=False) + except RegistrationForm.DoesNotExist: + pass # L'objet n'existe pas encore, rien à supprimer + + # Appeler la méthode save originale + super().save(*args, **kwargs) + def registration_file_upload_to(instance, filename): return f"registration_files/dossier_rf_{instance.registration_form.pk}/{filename}" @@ -246,4 +263,10 @@ class RegistrationTemplate(models.Model): filenames = [] for reg_file in registration_files: filenames.append(reg_file.file.path) - return filenames \ No newline at end of file + return filenames + +class RegistrationParentFile(models.Model): + groups = models.ManyToManyField(RegistrationFileGroup, related_name='parent_files', blank=True) + name = models.CharField(max_length=255, default="") + description = models.CharField(blank=True, null=True) + file = models.FileField(null=True,blank=True, upload_to=registration_file_upload_to) \ No newline at end of file diff --git a/Back-End/Subscriptions/serializers.py b/Back-End/Subscriptions/serializers.py index 36519df..764a1e1 100644 --- a/Back-End/Subscriptions/serializers.py +++ b/Back-End/Subscriptions/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import RegistrationFileGroup, RegistrationForm, Student, Guardian, Sibling, Language, RegistrationTemplateMaster, RegistrationTemplate +from .models import RegistrationFileGroup, RegistrationForm, Student, Guardian, Sibling, Language, RegistrationTemplateMaster, RegistrationTemplate, RegistrationParentFile from School.models import SchoolClass, Fee, Discount, FeeType from School.serializers import FeeSerializer, DiscountSerializer from Auth.models import ProfileRole, Profile @@ -24,6 +24,12 @@ class RegistrationTemplateSerializer(serializers.ModelSerializer): model = RegistrationTemplate fields = '__all__' +class RegistrationParentFileSerializer(serializers.ModelSerializer): + id = serializers.IntegerField(required=False) + class Meta: + model = RegistrationParentFile + fields = '__all__' + class GuardianSimpleSerializer(serializers.ModelSerializer): associated_profile_email = serializers.SerializerMethodField() @@ -280,7 +286,7 @@ class RegistrationFormByParentSerializer(serializers.ModelSerializer): class Meta: model = RegistrationForm - fields = ['student', 'status'] + fields = ['student', 'status', 'sepa_file'] def __init__(self, *args, **kwargs): super(RegistrationFormByParentSerializer, self).__init__(*args, **kwargs) diff --git a/Back-End/Subscriptions/urls.py b/Back-End/Subscriptions/urls.py index b652644..7f664f9 100644 --- a/Back-End/Subscriptions/urls.py +++ b/Back-End/Subscriptions/urls.py @@ -7,7 +7,7 @@ from .views import RegisterFormView, RegisterFormWithIdView, send, resend, archi # SubClasses from .views import StudentView, GuardianView, ChildrenListView, StudentListView, DissociateGuardianView # Files -from .views import RegistrationTemplateMasterView, RegistrationTemplateMasterSimpleView, RegistrationTemplateView, RegistrationTemplateSimpleView +from .views import RegistrationTemplateMasterView, RegistrationTemplateMasterSimpleView, RegistrationTemplateView, RegistrationTemplateSimpleView, RegistrationParentFileSimpleView, RegistrationParentFileView from .views import RegistrationFileGroupView, RegistrationFileGroupSimpleView, get_registration_files_by_group from .views import registration_file_views, get_templates_by_rf @@ -39,6 +39,9 @@ urlpatterns = [ re_path(r'^registrationTemplates/(?P[0-9]+)$', RegistrationTemplateSimpleView.as_view(), name='registrationTemplates'), re_path(r'^registrationTemplates$', RegistrationTemplateView.as_view(), name="registrationTemplates"), + re_path(r'^registrationParentFiles/(?P[0-9]+)$', RegistrationParentFileSimpleView.as_view(), name='registrationParentFiles'), + re_path(r'^registrationParentFiles$', RegistrationParentFileView.as_view(), name="registrationParentFiles"), + re_path(r'^students/(?P[0-9]+)/guardians/(?P[0-9]+)/dissociate', DissociateGuardianView.as_view(), name='dissociate-guardian'), ] \ No newline at end of file diff --git a/Back-End/Subscriptions/views/__init__.py b/Back-End/Subscriptions/views/__init__.py index 6ae84c4..41be263 100644 --- a/Back-End/Subscriptions/views/__init__.py +++ b/Back-End/Subscriptions/views/__init__.py @@ -1,5 +1,5 @@ from .register_form_views import RegisterFormView, RegisterFormWithIdView, send, resend, archive, get_templates_by_rf -from .registration_file_views import RegistrationTemplateMasterView, RegistrationTemplateMasterSimpleView, RegistrationTemplateView, RegistrationTemplateSimpleView +from .registration_file_views import RegistrationTemplateMasterView, RegistrationTemplateMasterSimpleView, RegistrationTemplateView, RegistrationTemplateSimpleView, RegistrationParentFileView, RegistrationParentFileSimpleView from .registration_file_group_views import RegistrationFileGroupView, RegistrationFileGroupSimpleView, get_registration_files_by_group from .student_views import StudentView, StudentListView, ChildrenListView from .guardian_views import GuardianView, DissociateGuardianView @@ -12,6 +12,8 @@ __all__ = [ 'archive', 'RegistrationTemplateView', 'RegistrationTemplateSimpleView', + 'RegistrationParentFileSimpleView', + 'RegistrationParentFileView', 'RegistrationTemplateMasterView', 'RegistrationTemplateMasterSimpleView', 'RegistrationFileGroupView', diff --git a/Back-End/Subscriptions/views/registration_file_views copy.py b/Back-End/Subscriptions/views/registration_file_views copy.py new file mode 100644 index 0000000..7df225a --- /dev/null +++ b/Back-End/Subscriptions/views/registration_file_views copy.py @@ -0,0 +1,159 @@ +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 + +from Subscriptions.serializers import RegistrationTemplateMasterSerializer, RegistrationTemplateSerializer +from Subscriptions.models import RegistrationTemplateMaster, RegistrationTemplate +from N3wtSchool import bdd + +class RegistrationTemplateMasterView(APIView): + @swagger_auto_schema( + operation_description="Récupère tous les masters de templates d'inscription", + responses={200: RegistrationTemplateMasterSerializer(many=True)} + ) + def get(self, request): + masters = RegistrationTemplateMaster.objects.all() + serializer = RegistrationTemplateMasterSerializer(masters, many=True) + return Response(serializer.data) + + @swagger_auto_schema( + operation_description="Crée un nouveau master de template d'inscription", + request_body=RegistrationTemplateMasterSerializer, + responses={ + 201: RegistrationTemplateMasterSerializer, + 400: "Données invalides" + } + ) + def post(self, request): + serializer = RegistrationTemplateMasterSerializer(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 RegistrationTemplateMasterSimpleView(APIView): + @swagger_auto_schema( + operation_description="Récupère un master de template d'inscription spécifique", + responses={ + 200: RegistrationTemplateMasterSerializer, + 404: "Master non trouvé" + } + ) + def get(self, request, id): + master = bdd.getObject(_objectName=RegistrationTemplateMaster, _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 = RegistrationTemplateMasterSerializer(master) + return JsonResponse(serializer.data, safe=False) + + @swagger_auto_schema( + operation_description="Met à jour un master de template d'inscription existant", + request_body=RegistrationTemplateMasterSerializer, + responses={ + 200: RegistrationTemplateMasterSerializer, + 400: "Données invalides", + 404: "Master non trouvé" + } + ) + def put(self, request, id): + master = bdd.getObject(_objectName=RegistrationTemplateMaster, _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) + serializer = RegistrationTemplateMasterSerializer(master, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + 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=RegistrationTemplateMaster, _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_204_NO_CONTENT) + else: + return JsonResponse({'erreur': 'Le master de template n\'a pas été trouvé'}, safe=False, status=status.HTTP_404_NOT_FOUND) + +class RegistrationTemplateView(APIView): + @swagger_auto_schema( + operation_description="Récupère tous les templates d'inscription", + responses={200: RegistrationTemplateSerializer(many=True)} + ) + def get(self, request): + templates = RegistrationTemplate.objects.all() + serializer = RegistrationTemplateSerializer(templates, many=True) + return Response(serializer.data) + + @swagger_auto_schema( + operation_description="Crée un nouveau template d'inscription", + request_body=RegistrationTemplateSerializer, + responses={ + 201: RegistrationTemplateSerializer, + 400: "Données invalides" + } + ) + def post(self, request): + serializer = RegistrationTemplateSerializer(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 RegistrationTemplateSimpleView(APIView): + @swagger_auto_schema( + operation_description="Récupère un template d'inscription spécifique", + responses={ + 200: RegistrationTemplateSerializer, + 404: "Template non trouvé" + } + ) + def get(self, request, id): + template = bdd.getObject(_objectName=RegistrationTemplate, _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 = RegistrationTemplateSerializer(template) + return JsonResponse(serializer.data, safe=False) + + @swagger_auto_schema( + operation_description="Met à jour un template d'inscription existant", + request_body=RegistrationTemplateSerializer, + responses={ + 200: RegistrationTemplateSerializer, + 400: "Données invalides", + 404: "Template non trouvé" + } + ) + def put(self, request, id): + template = bdd.getObject(_objectName=RegistrationTemplate, _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 = RegistrationTemplateSerializer(template, data=request.data) + 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=RegistrationTemplate, _columnName='id', _value=id) + if template is not None: + 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_file_views.py b/Back-End/Subscriptions/views/registration_file_views.py index 7df225a..e3e9be3 100644 --- a/Back-End/Subscriptions/views/registration_file_views.py +++ b/Back-End/Subscriptions/views/registration_file_views.py @@ -6,8 +6,8 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status -from Subscriptions.serializers import RegistrationTemplateMasterSerializer, RegistrationTemplateSerializer -from Subscriptions.models import RegistrationTemplateMaster, RegistrationTemplate +from Subscriptions.serializers import RegistrationTemplateMasterSerializer, RegistrationTemplateSerializer, RegistrationParentFileSerializer +from Subscriptions.models import RegistrationTemplateMaster, RegistrationTemplate, RegistrationParentFile from N3wtSchool import bdd class RegistrationTemplateMasterView(APIView): @@ -157,3 +157,78 @@ class RegistrationTemplateSimpleView(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 RegistrationParentFileView(APIView): + @swagger_auto_schema( + operation_description="Récupère tous les fichiers parents", + responses={200: RegistrationParentFileSerializer(many=True)} + ) + def get(self, request): + templates = RegistrationParentFile.objects.all() + serializer = RegistrationParentFileSerializer(templates, many=True) + return Response(serializer.data) + + @swagger_auto_schema( + operation_description="Crée un nouveau fichier parent", + request_body=RegistrationParentFileSerializer, + responses={ + 201: RegistrationParentFileSerializer, + 400: "Données invalides" + } + ) + def post(self, request): + serializer = RegistrationParentFileSerializer(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 RegistrationParentFileSimpleView(APIView): + @swagger_auto_schema( + operation_description="Récupère un fichier parent spécifique", + responses={ + 200: RegistrationParentFileSerializer, + 404: "Fichier parent non trouvé" + } + ) + def get(self, request, id): + template = bdd.getObject(_objectName=RegistrationParentFile, _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 = RegistrationParentFileSerializer(template) + return JsonResponse(serializer.data, safe=False) + + @swagger_auto_schema( + operation_description="Met à jour un fichier parent existant", + request_body=RegistrationParentFileSerializer, + responses={ + 200: RegistrationParentFileSerializer, + 400: "Données invalides", + 404: "Fichier parent non trouvé" + } + ) + def put(self, request, id): + template = bdd.getObject(_objectName=RegistrationParentFile, _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 = RegistrationParentFileSerializer(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=RegistrationParentFile, _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) \ No newline at end of file diff --git a/Front-End/src/app/[locale]/parents/page.js b/Front-End/src/app/[locale]/parents/page.js index 2fabe0d..1058271 100644 --- a/Front-End/src/app/[locale]/parents/page.js +++ b/Front-End/src/app/[locale]/parents/page.js @@ -2,13 +2,13 @@ import React, { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import Table from '@/components/Table'; -import { Edit, Users } from 'lucide-react'; +import { Edit3, Users, Download, Eye } from 'lucide-react'; import StatusLabel from '@/components/StatusLabel'; import { FE_PARENTS_EDIT_INSCRIPTION_URL } from '@/utils/Url'; import { fetchChildren } from '@/app/actions/subscriptionAction'; import logger from '@/utils/logger'; import { useSession } from 'next-auth/react'; -import { FE_USERS_LOGIN_URL } from '@/utils/Url'; +import { FE_USERS_LOGIN_URL, BASE_URL } from '@/utils/Url'; import { useEstablishment } from '@/context/EstablishmentContext'; export default function ParentHomePage() { @@ -40,10 +40,12 @@ export default function ParentHomePage() { if (!selectedEstablishmentId && userEstablishments.length > 0) { setSelectedEstablishmentId(userEstablishments[0].id); } - console.log(selectedEstablishmentId) - fetchChildren(userIdFromSession, selectedEstablishmentId).then(data => { - setChildren(data); - }); + + if (selectedEstablishmentId) { + fetchChildren(userIdFromSession, selectedEstablishmentId).then(data => { + setChildren(data); + }); + } } }, [status, session, selectedEstablishmentId]); @@ -52,6 +54,12 @@ export default function ParentHomePage() { setSelectedEstablishmentId(establishmentId); }; + function handleView(eleveId) { + // Logique pour éditer le dossier de l'élève + logger.debug(`View dossier for student id: ${eleveId}`); + router.push(`${FE_PARENTS_EDIT_INSCRIPTION_URL}?id=${userId}&studentId=${eleveId}&view=true`); + } + function handleEdit(eleveId) { // Logique pour éditer le dossier de l'élève logger.debug(`Edit dossier for student id: ${eleveId}`); @@ -77,17 +85,57 @@ export default function ParentHomePage() { { name: 'Actions', transform: (row) => ( -
- +
+ {/* Actions en fonction du statut */} + {row.status === 2 && ( + + )} + + {row.status === 3 && ( + + )} + + {row.status === 7 && ( + <> + + + + + + )}
) } diff --git a/Front-End/src/app/actions/registerFileGroupAction.js b/Front-End/src/app/actions/registerFileGroupAction.js index 604ca7b..2937c0a 100644 --- a/Front-End/src/app/actions/registerFileGroupAction.js +++ b/Front-End/src/app/actions/registerFileGroupAction.js @@ -1,6 +1,7 @@ import { BE_SUBSCRIPTION_REGISTRATIONFILE_GROUPS_URL, BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL, BE_SUBSCRIPTION_REGISTRATION_TEMPLATE_MASTER_URL, + BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL, FE_API_DOCUSEAL_CLONE_URL, FE_API_DOCUSEAL_DOWNLOAD_URL, FE_API_DOCUSEAL_GENERATE_TOKEN @@ -91,6 +92,60 @@ export const fetchRegistrationFileFromGroup = async (groupId) => { return response.json(); } +export const fetchRegistrationParentFiles = (id = null) => { + let url = `${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}` + if (id) { + url = `${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}/${id}`; + } + const request = new Request( + `${url}`, + { + method:'GET', + headers: { + 'Content-Type':'application/json' + }, + } + ); + return fetch(request).then(requestResponseHandler) +}; + +export const createRegistrationParentFiles = (data,csrfToken) => { + + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}`, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'X-CSRFToken': csrfToken, + 'Content-Type': 'application/json', + }, + credentials: 'include', + }) + .then(requestResponseHandler) +} + +export const editRegistrationParentFiles = (id, data, csrfToken) => { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}/${id}`, { + method: 'PUT', + body: JSON.stringify(data), + headers: { + 'X-CSRFToken': csrfToken, + 'Content-Type': 'application/json', + }, + credentials: 'include', + }) + .then(requestResponseHandler) +} + +export const deleteRegistrationParentFiles = (id, csrfToken) => { + return fetch(`${BE_SUBSCRIPTION_REGISTRATION_PARENT_FILES_URL}/${id}`, { + method: 'DELETE', + headers: { + 'X-CSRFToken': csrfToken, + }, + credentials: 'include', + }) +} + export const fetchRegistrationTemplates = (id = null) => { let url = `${BE_SUBSCRIPTION_REGISTRATION_TEMPLATES_URL}` if (id) { diff --git a/Front-End/src/components/FileUpload copy.js b/Front-End/src/components/FileUpload copy.js deleted file mode 100644 index f77a798..0000000 --- a/Front-End/src/components/FileUpload copy.js +++ /dev/null @@ -1,101 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import ToggleSwitch from '@/components/ToggleSwitch'; // Import du composant ToggleSwitch -import DraggableFileUpload from './DraggableFileUpload'; -import { fetchRegistrationFileGroups } from '@/app/actions/registerFileGroupAction'; -import { useEstablishment } from '@/context/EstablishmentContext'; - -export default function FileUpload({ onFileUpload, fileToEdit = null }) { - const [fileName, setFileName] = useState(''); - const [file, setFile] = useState(null); - const [isRequired, setIsRequired] = useState(false); // État pour le toggle isRequired - const [order, setOrder] = useState(0); - const [groups, setGroups] = useState([]); - const [selectedGroup, setSelectedGroup] = useState(''); - - const { selectedEstablishmentId } = useEstablishment(); - - useEffect(() => { - fetchRegistrationFileGroups(selectedEstablishmentId).then(data => setGroups(data)); - - if (fileToEdit) { - setFileName(fileToEdit.name || ''); - setIsRequired(fileToEdit.is_required || false); - setOrder(fileToEdit.fusion_order || 0); - setSelectedGroup(fileToEdit.group_id || ''); - } - }, [fileToEdit]); - - const handleFileNameChange = (event) => { - setFileName(event.target.value); - }; - - const handleUpload = () => { - onFileUpload({ - file, - name: fileName, - is_required: isRequired, - order: parseInt(order, 10), - groupId: selectedGroup || null - }); - setFile(null); - setFileName(''); - setIsRequired(false); - setOrder(0); - setSelectedGroup(''); - }; - - return ( -
- { - setFile(selectedFile); - setFileName(selectedFile.name.replace(/\.[^/.]+$/, "")); - }} - /> -
- - setOrder(e.target.value)} - placeholder="Ordre de fusion" - className="p-2 border border-gray-200 rounded-md ml-2 w-20" - /> - -
-
- setIsRequired(!isRequired)} - /> -
-
- - -
-
- ); -} \ No newline at end of file diff --git a/Front-End/src/components/InputPhone.js b/Front-End/src/components/InputPhone.js index aa70493..1b28dd2 100644 --- a/Front-End/src/components/InputPhone.js +++ b/Front-End/src/components/InputPhone.js @@ -3,6 +3,11 @@ import { PhoneInput } from 'react-international-phone'; import 'react-international-phone/style.css'; export default function InputPhone({ name, label, value, onChange, errorMsg, className, required }) { + const handlePhoneChange = (phone) => { + // Appeler onChange avec un objet personnalisé + onChange({ target: { name, value: phone } }); + }; + return (