From 41aa9d55d388c0ddf189c7b9ab6057487f86484b Mon Sep 17 00:00:00 2001 From: Luc SORIGNET Date: Sun, 12 Jan 2025 16:34:32 +0100 Subject: [PATCH] refactor: Refactorisation du login et de admin/subscription --- Back-End/Subscriptions/views.py | 2 +- .../subscriptions/editInscription/page.js | 42 +++--- .../app/[locale]/admin/subscriptions/page.js | 10 +- Front-End/src/app/[locale]/parents/layout.js | 4 +- Front-End/src/app/[locale]/parents/page.js | 35 ++--- .../src/app/[locale]/users/login/page.js | 29 ++-- .../app/[locale]/users/password/new/page.js | 24 +--- .../app/[locale]/users/password/reset/page.js | 33 ++--- .../src/app/[locale]/users/subscribe/page.js | 61 ++------- Front-End/src/app/lib/authAction.js | 77 ++++++++++- Front-End/src/app/lib/subscriptionAction.js | 22 ++- .../Inscription/InscriptionFormShared.js | 125 +++++++++--------- .../Inscription/ResponsableInputFields.js | 36 ++--- Front-End/src/utils/Url.js | 4 +- 14 files changed, 254 insertions(+), 250 deletions(-) diff --git a/Back-End/Subscriptions/views.py b/Back-End/Subscriptions/views.py index 0d5ec12..32699fa 100644 --- a/Back-End/Subscriptions/views.py +++ b/Back-End/Subscriptions/views.py @@ -236,7 +236,7 @@ class ChildrenListView(APIView): # Récupération des élèves d'un parent # idProfile : identifiant du profil connecté rattaché aux fiches d'élèves def get(self, request, _idProfile): - students = bdd.getObjects(_objectName=RegistrationForm, _columnName='student__guardians__profilAssocie__id', _value=_idProfile) + students = bdd.getObjects(_objectName=RegistrationForm, _columnName='student__guardians__associated_profile__id', _value=_idProfile) students_serializer = RegistrationFormByParentSerializer(students, many=True) return JsonResponse(students_serializer.data, safe=False) diff --git a/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js b/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js index 4f2eaa5..8de7262 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js @@ -2,11 +2,10 @@ import React, { useState, useEffect } from 'react'; import { useSearchParams } from 'next/navigation'; import InscriptionFormShared from '@/components/Inscription/InscriptionFormShared'; -import { FE_ADMIN_SUBSCRIPTIONS_URL, - BE_SUBSCRIPTION_STUDENT_URL, - BE_SUBSCRIPTION_REGISTERFORM_URL } from '@/utils/Url'; +import { FE_ADMIN_SUBSCRIPTIONS_URL } from '@/utils/Url'; import useCsrfToken from '@/hooks/useCsrfToken'; import { mockStudent } from '@/data/mockStudent'; +import { editRegisterForm, fetchRegisterForm } from '@/app/lib/subscriptionAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; @@ -24,22 +23,21 @@ export default function Page() { setInitialData(mockStudent); setIsLoading(false); } else { - fetch(`${BE_SUBSCRIPTION_STUDENT_URL}/${studentId}`) // Utilisation de studentId au lieu de codeDI - .then(response => response.json()) + fetchRegisterForm(studentId) .then(data => { console.log('Fetched data:', data); // Pour le débogage const formattedData = { id: data.id, - nom: data.nom, - prenom: data.prenom, - adresse: data.adresse, - dateNaissance: data.dateNaissance, - lieuNaissance: data.lieuNaissance, - codePostalNaissance: data.codePostalNaissance, - nationalite: data.nationalite, - medecinTraitant: data.medecinTraitant, - niveau: data.niveau, - responsables: data.responsables || [] + last_name: data.last_name, + first_name: data.first_name, + address: data.address, + birth_date: data.birth_date, + birth_place: data.birth_place, + birth_postal_code: data.birth_postal_code, + nationality: data.nationality, + attending_physician: data.attending_physician, + level: data.level, + guardians: data.guardians || [] }; setInitialData(formattedData); setIsLoading(false); @@ -58,18 +56,8 @@ export default function Page() { } try { - const response = await fetch(`${BE_SUBSCRIPTION_REGISTERFORM_URL}/${studentId}`, { // Utilisation de studentId - method: 'PUT', - headers: { - 'Content-Type': 'application/json', - 'X-CSRFToken': csrfToken - }, - credentials: 'include', - body: JSON.stringify(data), - - }); - - const result = await response.json(); + const result = await editRegisterForm(studentId, data, csrfToken); + // Utilisation de studentId console.log('Success:', result); // Redirection après succès window.location.href = FE_ADMIN_SUBSCRIPTIONS_URL; diff --git a/Front-End/src/app/[locale]/admin/subscriptions/page.js b/Front-End/src/app/[locale]/admin/subscriptions/page.js index 67e3a13..cd8aa87 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/page.js @@ -21,7 +21,7 @@ import { PENDING, SUBSCRIBED, ARCHIVED, - fetchRegisterForm, + fetchRegisterForms, createRegisterForm, sendRegisterForm, archiveRegisterForm, @@ -159,13 +159,13 @@ const registerFormArchivedDataHandler = (data) => { useEffect(() => { const fetchDataAndSetState = () => { if (!useFakeData) { - fetchRegisterForm(PENDING, currentPage, itemsPerPage, searchTerm) + fetchRegisterForms(PENDING, currentPage, itemsPerPage, searchTerm) .then(registerFormPendingDataHandler) .catch(requestErrorHandler) - fetchRegisterForm(SUBSCRIBED) + fetchRegisterForms(SUBSCRIBED) .then(registerFormSubscribedDataHandler) .catch(requestErrorHandler) - fetchRegisterForm(ARCHIVED) + fetchRegisterForms(ARCHIVED) .then(registerFormArchivedDataHandler) .catch(requestErrorHandler) } else { @@ -184,7 +184,7 @@ const registerFormArchivedDataHandler = (data) => { // Modifier le useEffect pour la recherche useEffect(() => { const timeoutId = setTimeout(() => { - fetchRegisterForm(PENDING, currentPage, itemsPerPage, searchTerm) + fetchRegisterForms(PENDING, currentPage, itemsPerPage, searchTerm) .then(registerFormPendingDataHandler) .catch(requestErrorHandler) }, 500); // Debounce la recherche diff --git a/Front-End/src/app/[locale]/parents/layout.js b/Front-End/src/app/[locale]/parents/layout.js index 29bdc94..5e3ba9e 100644 --- a/Front-End/src/app/[locale]/parents/layout.js +++ b/Front-End/src/app/[locale]/parents/layout.js @@ -5,7 +5,7 @@ import DropdownMenu from '@/components/DropdownMenu'; import { useRouter } from 'next/navigation'; // Ajout de l'importation import { Bell, User, MessageSquare, LogOut, Settings, Home } from 'lucide-react'; // Ajout de l'importation de l'icône Home import Logo from '@/components/Logo'; // Ajout de l'importation du composant Logo -import { FE_PARENTS_HOME_URL,FE_PARENTS_MESSAGERIE_URL,FE_PARENTS_SETTINGS_URL, BE_GESTIONINSCRIPTION_MESSAGES_URL } from '@/utils/Url'; // Ajout de l'importation de l'URL de la page d'accueil parent +import { FE_PARENTS_HOME_URL,FE_PARENTS_MESSAGERIE_URL,FE_PARENTS_SETTINGS_URL, BE_GESTIONMESSAGERIE_MESSAGES_URL } from '@/utils/Url'; // Ajout de l'importation de l'URL de la page d'accueil parent import useLocalStorage from '@/hooks/useLocalStorage'; export default function Layout({ @@ -19,7 +19,7 @@ export default function Layout({ useEffect(() => { setUserId(userId); - fetch(`${BE_GESTIONINSCRIPTION_MESSAGES_URL}/${userId}`, { + fetch(`${BE_GESTIONMESSAGERIE_MESSAGES_URL}/${userId}`, { headers: { 'Content-Type': 'application/json', }, diff --git a/Front-End/src/app/[locale]/parents/page.js b/Front-End/src/app/[locale]/parents/page.js index f0614a8..6c19b54 100644 --- a/Front-End/src/app/[locale]/parents/page.js +++ b/Front-End/src/app/[locale]/parents/page.js @@ -5,7 +5,8 @@ import Table from '@/components/Table'; import { Edit } from 'lucide-react'; import StatusLabel from '@/components/StatusLabel'; import useLocalStorage from '@/hooks/useLocalStorage'; -import { BE_SUBSCRIPTION_CHILDRENS_URL , FE_PARENTS_EDIT_INSCRIPTION_URL } from '@/utils/Url'; +import { FE_PARENTS_EDIT_INSCRIPTION_URL } from '@/utils/Url'; +import { fetchChildren } from '@/app/lib/subscriptionAction'; export default function ParentHomePage() { const [actions, setActions] = useState([]); @@ -17,34 +18,22 @@ export default function ParentHomePage() { useEffect(() => { if (!userId) return; - const fetchActions = async () => { - const response = await fetch('/api/actions'); - const data = await response.json(); - setActions(data); - }; - - const fetchEleves = async () => { - const response = await fetch(`${BE_SUBSCRIPTION_CHILDRENS_URL}/${userId}`); - const data = await response.json(); - console.log(data); - - setChildren(data); - }; - - fetchEleves(); + fetchChildren(userId).then(data => { + setChildren(data); + }); }, [userId]); function handleEdit(eleveId) { // Logique pour éditer le dossier de l'élève - console.log(`Edit dossier for eleve id: ${eleveId}`); + console.log(`Edit dossier for student id: ${eleveId}`); router.push(`${FE_PARENTS_EDIT_INSCRIPTION_URL}?id=${userId}&studentId=${eleveId}`); } const actionColumns = [ { name: 'Action', transform: (row) => row.action }, ]; - const getShadowColor = (etat) => { - switch (etat) { + const getShadowColor = (status) => { + switch (status) { case 1: return 'shadow-blue-500'; // Couleur d'ombre plus visible case 2: @@ -73,12 +62,12 @@ export default function ParentHomePage() {

Enfants

{children.map((child) => ( -
+
-

{child.eleve.nom} {child.eleve.prenom}

- handleEdit(child.eleve.id)} /> +

{child.student.last_name} {child.student.first_name}

+ handleEdit(child.student.id)} />
- +
))}
diff --git a/Front-End/src/app/[locale]/users/login/page.js b/Front-End/src/app/[locale]/users/login/page.js index bbd382d..783872f 100644 --- a/Front-End/src/app/[locale]/users/login/page.js +++ b/Front-End/src/app/[locale]/users/login/page.js @@ -8,9 +8,15 @@ import InputTextIcon from '@/components/InputTextIcon'; import Loader from '@/components/Loader'; // Importez le composant Loader import Button from '@/components/Button'; // Importez le composant Button import { User, KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires -import { BE_AUTH_LOGIN_URL, FE_ADMIN_SUBSCRIPTIONS_EDIT_URL, FE_ADMIN_SUBSCRIPTIONS_URL, FE_PARENTS_HOME_URL, FE_USERS_NEW_PASSWORD_URL, FE_USERS_SUBSCRIBE_URL } from '@/utils/Url'; +import { + FE_ADMIN_SUBSCRIPTIONS_EDIT_URL, + FE_ADMIN_SUBSCRIPTIONS_URL, + FE_PARENTS_HOME_URL, + FE_USERS_NEW_PASSWORD_URL } from '@/utils/Url'; import useLocalStorage from '@/hooks/useLocalStorage'; import useCsrfToken from '@/hooks/useCsrfToken'; +import { login } from '@/app/lib/authAction'; + const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; export default function Page() { @@ -55,22 +61,11 @@ export default function Page() { } } } else { - const request = new Request( - `${BE_AUTH_LOGIN_URL}`, - { - method:'POST', - headers: { - 'Content-Type':'application/json', - 'X-CSRFToken': csrfToken - }, - body: JSON.stringify( { - email: formData.get('login'), - password: formData.get('password'), - }), - credentials: 'include', - } - ); - fetch(request).then(response => response.json()) + const data = { + email: formData.get('login'), + password: formData.get('password'), + } + login(data,csrfToken) .then(data => { console.log('Success:', data); setUserFieldError("") diff --git a/Front-End/src/app/[locale]/users/password/new/page.js b/Front-End/src/app/[locale]/users/password/new/page.js index 07099f4..dcc108e 100644 --- a/Front-End/src/app/[locale]/users/password/new/page.js +++ b/Front-End/src/app/[locale]/users/password/new/page.js @@ -1,16 +1,17 @@ 'use client' -import React, { useState, useEffect } from 'react'; +import React, { useState } from 'react'; import DjangoCSRFToken from '@/components/DjangoCSRFToken' import Logo from '@/components/Logo'; -import { useSearchParams, useRouter } from 'next/navigation'; +import { useSearchParams } from 'next/navigation'; import InputTextIcon from '@/components/InputTextIcon'; import Loader from '@/components/Loader'; // Importez le composant Loader import Button from '@/components/Button'; // Importez le composant Button import Popup from '@/components/Popup'; // Importez le composant Popup import { User } from 'lucide-react'; // Importez directement les icônes nécessaires -import { BE_AUTH_NEW_PASSWORD_URL,FE_USERS_LOGIN_URL } from '@/utils/Url'; +import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import useCsrfToken from '@/hooks/useCsrfToken'; +import { sendNewPassword } from '@/app/lib/authAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; @@ -34,21 +35,8 @@ export default function Page() { setPopupVisible(true); }, 1000); // Simule un délai de traitement } else { - const request = new Request( - `${BE_AUTH_NEW_PASSWORD_URL}`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-CSRFToken': csrfToken - }, - credentials: 'include', - body: JSON.stringify({ - email: formData.get('email') - }), - } - ); - fetch(request).then(response => response.json()) + const data = {email: formData.get('email')} + sendNewPassword(data, csrfToken) .then(data => { console.log('Success:', data); setUserFieldError(""); diff --git a/Front-End/src/app/[locale]/users/password/reset/page.js b/Front-End/src/app/[locale]/users/password/reset/page.js index fdb1741..cae7a16 100644 --- a/Front-End/src/app/[locale]/users/password/reset/page.js +++ b/Front-End/src/app/[locale]/users/password/reset/page.js @@ -9,9 +9,10 @@ import InputTextIcon from '@/components/InputTextIcon'; import Loader from '@/components/Loader'; // Importez le composant Loader import Button from '@/components/Button'; // Importez le composant Button import Popup from '@/components/Popup'; -import { BE_AUTH_RESET_PASSWORD_URL, FE_USERS_LOGIN_URL } from '@/utils/Url'; -import { KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires +import { FE_USERS_LOGIN_URL } from '@/utils/Url'; +import { KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires import useCsrfToken from '@/hooks/useCsrfToken'; +import { getResetPassword, resetPassword } from '@/app/lib/authAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; @@ -34,12 +35,7 @@ export default function Page() { setIsLoading(false); }, 1000); } else { - const url= `${BE_AUTH_RESET_PASSWORD_URL}/${uuid}`; - fetch(url, { - headers: { - 'Content-Type': 'application/json', - }, - }).then(response => response.json()) + getResetPassword(uuid) .then(data => { console.log('Success:', data); setIsLoading(true); @@ -65,22 +61,11 @@ export default function Page() { setPopupVisible(true); }, 1000); } else { - const request = new Request( - `${BE_AUTH_RESET_PASSWORD_URL}/${uuid}`, - { - method:'POST', - headers: { - 'Content-Type':'application/json', - 'X-CSRFToken': csrfToken - }, - credentials: 'include', - body: JSON.stringify( { - password1: formData.get('password1'), - password2: formData.get('password2'), - }), - } - ); - fetch(request).then(response => response.json()) + const data = { + password1: formData.get('password1'), + password2: formData.get('password2'), + } + resetPassword(uuid,data,csrfToken) .then(data => { console.log('Success:', data); setPassword1FieldError("") diff --git a/Front-End/src/app/[locale]/users/subscribe/page.js b/Front-End/src/app/[locale]/users/subscribe/page.js index b724a0b..5ea51ca 100644 --- a/Front-End/src/app/[locale]/users/subscribe/page.js +++ b/Front-End/src/app/[locale]/users/subscribe/page.js @@ -10,8 +10,9 @@ import Loader from '@/components/Loader'; // Importez le composant Loader import Button from '@/components/Button'; // Importez le composant Button import Popup from '@/components/Popup'; // Importez le composant Popup import { User, KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires -import { BE_AUTH_REGISTER_URL, FE_USERS_LOGIN_URL } from '@/utils/Url'; +import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import useCsrfToken from '@/hooks/useCsrfToken'; +import { subscribe } from '@/app/lib/authAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; export default function Page() { @@ -21,7 +22,7 @@ export default function Page() { const [userFieldError,setUserFieldError] = useState("") const [password1FieldError,setPassword1FieldError] = useState("") const [password2FieldError,setPassword2FieldError] = useState("") - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); const [popupVisible, setPopupVisible] = useState(false); const [popupMessage, setPopupMessage] = useState(""); @@ -30,6 +31,7 @@ export default function Page() { useEffect(() => { if (useFakeData) { + setIsLoading(true); // Simuler une réponse réussie const data = { errorFields: {}, @@ -40,33 +42,6 @@ export default function Page() { setPassword2FieldError("") setErrorMessage("") setIsLoading(false); - } else { - const url= `${BE_AUTH_REGISTER_URL}`; - fetch(url, { - headers: { - 'Content-Type': 'application/json', - }, - }).then(response => response.json()) - .then(data => { - console.log('Success:', data); - setUserFieldError("") - setPassword1FieldError("") - setPassword2FieldError("") - setErrorMessage("") - setIsLoading(true); - if(data.errorFields){ - setUserFieldError(data.errorFields.email) - setPassword1FieldError(data.errorFields.password1) - setPassword2FieldError(data.errorFields.password2) - } - if(data.errorMessage){ - setErrorMessage(data.errorMessage) - } - setIsLoading(false); - }) - .catch(error => { - console.error('Error fetching data:', error); - }); } }, []); @@ -74,7 +49,7 @@ export default function Page() { return data.errorMessage === "" } - function suscribe(formData) { + function subscribeFormSubmit(formData) { if (useFakeData) { // Simuler une réponse réussie const data = { @@ -99,24 +74,12 @@ export default function Page() { } } } else { - const request = new Request( - `${BE_AUTH_REGISTER_URL}`, - { - method:'POST', - headers: { - 'Content-Type':'application/json', - 'X-CSRFToken': csrfToken - }, - credentials: 'include', - body: JSON.stringify( { - email: formData.get('login'), - password1: formData.get('password1'), - password2: formData.get('password2'), - }), - } - ); - fetch(request).then(response => response.json()) - .then(data => { + const data ={ + email: formData.get('login'), + password1: formData.get('password1'), + password2: formData.get('password2'), + } + subscribe(data,csrfToken).then(data => { console.log('Success:', data); setUserFieldError("") setPassword1FieldError("") @@ -153,7 +116,7 @@ export default function Page() {

Nouveau profil

-
{ e.preventDefault(); suscribe(new FormData(e.target)); }}> + { e.preventDefault(); subscribeFormSubmit(new FormData(e.target)); }}> diff --git a/Front-End/src/app/lib/authAction.js b/Front-End/src/app/lib/authAction.js index bce3624..9cbc41f 100644 --- a/Front-End/src/app/lib/authAction.js +++ b/Front-End/src/app/lib/authAction.js @@ -1,7 +1,10 @@ import { BE_AUTH_LOGIN_URL, + BE_AUTH_REGISTER_URL, BE_AUTH_PROFILE_URL, + BE_AUTH_RESET_PASSWORD_URL, + BE_AUTH_NEW_PASSWORD_URL, FE_USERS_LOGIN_URL , } from '@/utils/Url'; @@ -9,6 +12,21 @@ import {mockUser} from "@/data/mockUsersData"; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; +export const login = (data, csrfToken) => { + const request = new Request( + `${BE_AUTH_LOGIN_URL}`, + { + method:'POST', + headers: { + 'Content-Type':'application/json', + 'X-CSRFToken': csrfToken + }, + body: JSON.stringify(data), + credentials: 'include', + } + ); + return fetch(request).then(response => response.json()) +} /** * Disconnects the user after confirming the action. @@ -49,7 +67,6 @@ const request = new Request( return fetch(request).then(response => response.json()) } - export const updateProfile = (id, data, csrfToken) => { const request = new Request( `${BE_AUTH_PROFILE_URL}/${id}`, @@ -64,4 +81,62 @@ export const updateProfile = (id, data, csrfToken) => { } ); return fetch(request).then(response => response.json()) +} + +export const sendNewPassword = (data, csrfToken) => { + + const request = new Request( + `${BE_AUTH_NEW_PASSWORD_URL}`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrfToken + }, + credentials: 'include', + body: JSON.stringify(data), + } + ); + return fetch(request).then(response => response.json()) +} + +export const subscribe = (data,csrfToken) =>{ + const request = new Request( + `${BE_AUTH_REGISTER_URL}`, + { + method:'POST', + headers: { + 'Content-Type':'application/json', + 'X-CSRFToken': csrfToken + }, + credentials: 'include', + body: JSON.stringify( data), + } + ); + return fetch(request).then(response => response.json()) +} + +export const resetPassword = (uuid, data, csrfToken) => { + const request = new Request( + `${BE_AUTH_RESET_PASSWORD_URL}/${uuid}`, + { + method:'POST', + headers: { + 'Content-Type':'application/json', + 'X-CSRFToken': csrfToken + }, + credentials: 'include', + body: JSON.stringify(data), + } + ); + return fetch(request).then(response => response.json()) +} + +export const getResetPassword = (uuid) => { + const url= `${BE_AUTH_RESET_PASSWORD_URL}/${uuid}`; + return fetch(url, { + headers: { + 'Content-Type': 'application/json', + }, + }).then(response => response.json()) } \ No newline at end of file diff --git a/Front-End/src/app/lib/subscriptionAction.js b/Front-End/src/app/lib/subscriptionAction.js index b6fc8bb..2066e59 100644 --- a/Front-End/src/app/lib/subscriptionAction.js +++ b/Front-End/src/app/lib/subscriptionAction.js @@ -1,7 +1,9 @@ import { BE_SUBSCRIPTION_STUDENTS_URL, + BE_SUBSCRIPTION_STUDENT_URL, BE_SUBSCRIPTION_ARCHIVE_URL, BE_SUBSCRIPTION_SEND_URL, + BE_SUBSCRIPTION_CHILDRENS_URL, BE_SUBSCRIPTION_REGISTERFORM_URL, BE_SUBSCRIPTION_REGISTERFORMS_URL, BE_SUBSCRIPTION_REGISTERFORMFILE_TEMPLATE_URL @@ -12,7 +14,7 @@ export const SUBSCRIBED = 'subscribed'; export const ARCHIVED = 'archived'; -export const fetchRegisterForm = (type=PENDING, page='', pageSize='', search = '') => { +export const fetchRegisterForms = (type=PENDING, page='', pageSize='', search = '') => { let url = `${BE_SUBSCRIPTION_REGISTERFORMS_URL}/${type}`; if (page !== '' && pageSize !== '') { url = `${BE_SUBSCRIPTION_REGISTERFORMS_URL}/${type}?page=${page}&search=${search}`; @@ -24,6 +26,11 @@ export const fetchRegisterForm = (type=PENDING, page='', pageSize='', search = }).then(response => response.json()) }; +export const fetchRegisterForm = (id) =>{ + return fetch(`${BE_SUBSCRIPTION_STUDENT_URL}/${id}`) // Utilisation de studentId au lieu de codeDI + .then(response => response.json()) +} + export const editRegisterForm=(id, data, csrfToken)=>{ return fetch(`${BE_SUBSCRIPTION_REGISTERFORM_URL}/${id}`, { @@ -121,3 +128,16 @@ export const fetchStudents = () => { return fetch(request).then(response => response.json()) }; + +export const fetchChildren = (id) =>{ + const request = new Request( + `${BE_SUBSCRIPTION_CHILDRENS_URL}/${id}`, + { + method:'GET', + headers: { + 'Content-Type':'application/json' + }, + } + ); + return fetch(request).then(response => response.json()) +} \ 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 0fb4416..2190a57 100644 --- a/Front-End/src/components/Inscription/InscriptionFormShared.js +++ b/Front-End/src/components/Inscription/InscriptionFormShared.js @@ -25,19 +25,19 @@ export default function InscriptionFormShared({ const [formData, setFormData] = useState(() => ({ id: initialData?.id || '', - nom: initialData?.nom || '', - prenom: initialData?.prenom || '', - adresse: initialData?.adresse || '', - dateNaissance: initialData?.dateNaissance || '', - lieuNaissance: initialData?.lieuNaissance || '', - codePostalNaissance: initialData?.codePostalNaissance || '', - nationalite: initialData?.nationalite || '', - medecinTraitant: initialData?.medecinTraitant || '', - niveau: initialData?.niveau || '' + last_name: initialData?.last_name || '', + first_name: initialData?.first_name || '', + address: initialData?.address || '', + birth_date: initialData?.birth_date || '', + birth_place: initialData?.birth_place || '', + birth_postal_code: initialData?.birth_postal_code || '', + nationality: initialData?.nationality || '', + attending_physician: initialData?.attending_physician || '', + level: initialData?.level || '' })); - const [responsables, setReponsables] = useState(() => - initialData?.responsables || [] + const [guardians, setGuardians] = useState(() => + initialData?.guardians || [] ); const [uploadedFiles, setUploadedFiles] = useState([]); @@ -47,17 +47,17 @@ export default function InscriptionFormShared({ if (initialData) { setFormData({ id: initialData.id || '', - nom: initialData.nom || '', - prenom: initialData.prenom || '', - adresse: initialData.adresse || '', - dateNaissance: initialData.dateNaissance || '', - lieuNaissance: initialData.lieuNaissance || '', - codePostalNaissance: initialData.codePostalNaissance || '', - nationalite: initialData.nationalite || '', - medecinTraitant: initialData.medecinTraitant || '', - niveau: initialData.niveau || '' + last_name: initialData.last_name || '', + first_name: initialData.first_name || '', + address: initialData.address || '', + birth_date: initialData.birth_date || '', + birth_place: initialData.birth_place || '', + birth_postal_code: initialData.birth_postal_code || '', + nationality: initialData.nationality || '', + attending_physician: initialData.attending_physician || '', + level: initialData.level || '' }); - setReponsables(initialData.responsables || []); + setGuardians(initialData.guardians || []); } }, [initialData]); @@ -71,16 +71,17 @@ export default function InscriptionFormShared({ const handleSubmit = (e) => { e.preventDefault(); - onSubmit({ - eleve: { + const data ={ + student: { ...formData, - responsables + guardians } - }); + } + onSubmit(data); }; const columns = [ - { name: 'Nom du fichier', transform: (row) => row.nom }, + { name: 'Nom du fichier', transform: (row) => row.last_name }, { name: 'Actions', transform: (row) => ( Télécharger @@ -99,64 +100,64 @@ export default function InscriptionFormShared({

Informations de l'élève

updateFormField('nom', e.target.value)} + value={formData.last_name} + onChange={(e) => updateFormField('last_name', e.target.value)} required /> updateFormField('prenom', e.target.value)} + value={formData.first_name} + onChange={(e) => updateFormField('first_name', e.target.value)} required /> updateFormField('nationalite', e.target.value)} + value={formData.nationality} + onChange={(e) => updateFormField('nationality', e.target.value)} /> updateFormField('dateNaissance', e.target.value)} + value={formData.birth_date} + onChange={(e) => updateFormField('birth_date', e.target.value)} required /> updateFormField('lieuNaissance', e.target.value)} + value={formData.birth_place} + onChange={(e) => updateFormField('birth_place', e.target.value)} /> updateFormField('codePostalNaissance', e.target.value)} + value={formData.birth_postal_code} + onChange={(e) => updateFormField('birth_postal_code', e.target.value)} />
updateFormField('adresse', e.target.value)} + value={formData.address} + onChange={(e) => updateFormField('address', e.target.value)} />
updateFormField('medecinTraitant', e.target.value)} + value={formData.attending_physician} + onChange={(e) => updateFormField('attending_physician', e.target.value)} /> updateFormField('niveau', e.target.value)} + selected={formData.level} + callback={(e) => updateFormField('level', e.target.value)} choices={niveaux} required /> @@ -167,21 +168,21 @@ export default function InscriptionFormShared({

Responsables

{ - const updatedResponsables = responsables.map(resp => + guardians={guardians} + onGuardiansChange={(id, field, value) => { + const updatedGuardians = guardians.map(resp => resp.id === id ? { ...resp, [field]: value } : resp ); - setReponsables(updatedResponsables); + setGuardians(updatedGuardians); }} - addResponsible={(e) => { + addGuardian={(e) => { e.preventDefault(); - setReponsables([...responsables, { id: Date.now() }]); + setGuardians([...guardians, { id: Date.now() }]); }} - deleteResponsable={(index) => { - const newArray = [...responsables]; + deleteGuardian={(index) => { + const newArray = [...guardians]; newArray.splice(index, 1); - setReponsables(newArray); + setGuardians(newArray); }} />
diff --git a/Front-End/src/components/Inscription/ResponsableInputFields.js b/Front-End/src/components/Inscription/ResponsableInputFields.js index 8b68846..00710b2 100644 --- a/Front-End/src/components/Inscription/ResponsableInputFields.js +++ b/Front-End/src/components/Inscription/ResponsableInputFields.js @@ -5,19 +5,19 @@ import React from 'react'; import { useTranslations } from 'next-intl'; import 'react-phone-number-input/style.css' -export default function ResponsableInputFields({responsables, onResponsablesChange, addResponsible, deleteResponsable}) { +export default function ResponsableInputFields({guardians, onGuardiansChange, addGuardian, deleteGuardian}) { const t = useTranslations('ResponsableInputFields'); return (
- {responsables.map((item, index) => ( + {guardians.map((item, index) => (

{t('responsable')} {index+1}

- {responsables.length > 1 && ( + {guardians.length > 1 && (
@@ -48,14 +48,14 @@ export default function ResponsableInputFields({responsables, onResponsablesChan name="mailResponsable" type="email" label={t('email')} - value={item.mail} - onChange={(event) => {onResponsablesChange(item.id, "mail", event.target.value)}} + value={item.email} + onChange={(event) => {onGuardiansChange(item.id, "email", event.target.value)}} /> {onResponsablesChange(item.id, "telephone", event)}} + value={item.phone} + onChange={(event) => {onGuardiansChange(item.id, "phone", event)}} />
@@ -64,15 +64,15 @@ export default function ResponsableInputFields({responsables, onResponsablesChan name="dateNaissanceResponsable" type="date" label={t('birthdate')} - value={item.dateNaissance} - onChange={(event) => {onResponsablesChange(item.id, "dateNaissance", event.target.value)}} + value={item.birth_date} + onChange={(event) => {onGuardiansChange(item.id, "birth_date", event.target.value)}} /> {onResponsablesChange(item.id, "profession", event.target.value)}} + onChange={(event) => {onGuardiansChange(item.id, "profession", event.target.value)}} />
@@ -81,8 +81,8 @@ export default function ResponsableInputFields({responsables, onResponsablesChan name="adresseResponsable" type="text" label={t('address')} - value={item.adresse} - onChange={(event) => {onResponsablesChange(item.id, "adresse", event.target.value)}} + value={item.address} + onChange={(event) => {onGuardiansChange(item.id, "address", event.target.value)}} />
@@ -91,7 +91,7 @@ export default function ResponsableInputFields({responsables, onResponsablesChan