From c247614c0cbcb3752b52cd13c8946a88874c1ee5 Mon Sep 17 00:00:00 2001
From: Benjamin Morali
Date: Mon, 23 Sep 2024 13:56:03 +0200
Subject: [PATCH] Ajout du lien au back-end sur le formulaire coordinateur
(#220)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Ajout du lien au back-end sur le formulaire coordinateur
* Ajout de tests
* Correction de l'appel à la GeoAPI
---------
Co-authored-by: Ornella <68587983+Ornella452@users.noreply.github.com>
---
.../CandidatureConseiller.css | 6 +-
.../candidature-conseiller/useApiAdmin.js | 33 +++-
src/views/candidature-conseiller/useGeoApi.js | 2 +-
.../BesoinEnCoordinateur.jsx | 10 +-
.../CandidatureCoordinateur.jsx | 33 +++-
.../CandidatureCoordinateur.test.jsx | 124 +++++++++++++-
.../CandidatureStructure.css | 4 +
.../CandidatureStructure.test.jsx | 156 +++++++++++++++---
8 files changed, 328 insertions(+), 40 deletions(-)
diff --git a/src/views/candidature-conseiller/CandidatureConseiller.css b/src/views/candidature-conseiller/CandidatureConseiller.css
index d091151d..430a0c05 100644
--- a/src/views/candidature-conseiller/CandidatureConseiller.css
+++ b/src/views/candidature-conseiller/CandidatureConseiller.css
@@ -8,7 +8,7 @@
width: 100%;
}
-.cc-section legend + * {
+.cc-section legend+* {
clear: left;
}
@@ -37,3 +37,7 @@
display: flex;
justify-content: center;
}
+
+html {
+ scroll-behavior: smooth;
+}
diff --git a/src/views/candidature-conseiller/useApiAdmin.js b/src/views/candidature-conseiller/useApiAdmin.js
index 3de4f1ce..b7350c31 100644
--- a/src/views/candidature-conseiller/useApiAdmin.js
+++ b/src/views/candidature-conseiller/useApiAdmin.js
@@ -33,6 +33,21 @@ export const useApiAdmin = () => {
}
};
+ const creerCandidatureCoordinateur = async structureData => {
+ const baseUrl = import.meta.env.VITE_APP_API_URL;
+ const requestOptions = {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: structureData
+ };
+
+ try {
+ return await fetch(`${baseUrl}/candidature-structure-coordinateur`, requestOptions);
+ } catch (error) {
+ return error;
+ }
+ };
+
const convertValueToBoolean = (conseillerData, key) => {
conseillerData[key] = conseillerData[key] === 'on' || conseillerData[key] === 'oui';
};
@@ -62,7 +77,7 @@ export const useApiAdmin = () => {
convertValueToBoolean(conseillerData, 'estEnFormation');
convertValueToBoolean(conseillerData, 'estDiplomeMedNum');
convertValueToBoolean(conseillerData, 'aUneExperienceMedNum');
- const codePostal = conseillerData.lieuHabitation.split(' ')?.[0];
+ const codePostal = conseillerData.lieuHabitation.match(/\d{5}/)?.[0];
await handleInformationsVille(conseillerData, codePostal);
delete conseillerData.lieuHabitation;
delete conseillerData['g-recaptcha-response'];
@@ -108,9 +123,23 @@ export const useApiAdmin = () => {
return JSON.stringify(structureData);
};
+ const buildCoordinateurData = async formData => {
+ const coordinateurData = Object.fromEntries(formData);
+ handleContact(coordinateurData);
+ handleInformationsStructure(coordinateurData);
+ await handleAdresse(coordinateurData);
+ convertValueToBoolean(coordinateurData, 'aIdentifieCoordinateur');
+ convertValueToBoolean(coordinateurData, 'confirmationEngagement');
+ delete coordinateurData['g-recaptcha-response'];
+ return JSON.stringify(coordinateurData);
+ };
+
return {
buildConseillerData,
buildStructureData,
+ buildCoordinateurData,
creerCandidatureConseiller,
- creerCandidatureStructure };
+ creerCandidatureStructure,
+ creerCandidatureCoordinateur,
+ };
};
diff --git a/src/views/candidature-conseiller/useGeoApi.js b/src/views/candidature-conseiller/useGeoApi.js
index 68a5b320..d1d4aff8 100644
--- a/src/views/candidature-conseiller/useGeoApi.js
+++ b/src/views/candidature-conseiller/useGeoApi.js
@@ -15,7 +15,7 @@ export const useGeoApi = () => {
};
const getVilleParCode = async codePostal => {
- const url = `${baseUrl.toString()}&code=${codePostal}`;
+ const url = `${baseUrl.toString()}&codePostal=${codePostal}`;
const ville = await fetch(url);
return await ville.json();
};
diff --git a/src/views/candidature-coordinateur/BesoinEnCoordinateur.jsx b/src/views/candidature-coordinateur/BesoinEnCoordinateur.jsx
index ad831ad1..d3990630 100644
--- a/src/views/candidature-coordinateur/BesoinEnCoordinateur.jsx
+++ b/src/views/candidature-coordinateur/BesoinEnCoordinateur.jsx
@@ -13,22 +13,22 @@ export default function BesoinEnCoordinateur() {
Avez-vous déjà identifié un candidat pour le poste de coordinateur de conseiller numérique ?*
Si oui, merci d’inviter ce candidat à s’inscrire sur la plateforme Conseiller numérique
-
+
Oui
-
+
Non
Le coordinateur*
-
+
Effectuera uniquement des missions de coordination
-
+
Accompagnera également des publics
À partir de quand êtes vous prêt à accueillir votre coordinateur ?*
-
+
Choisir une date
diff --git a/src/views/candidature-coordinateur/CandidatureCoordinateur.jsx b/src/views/candidature-coordinateur/CandidatureCoordinateur.jsx
index 44088658..d85ef9b6 100644
--- a/src/views/candidature-coordinateur/CandidatureCoordinateur.jsx
+++ b/src/views/candidature-coordinateur/CandidatureCoordinateur.jsx
@@ -5,8 +5,11 @@ import InformationsDeStructure from '../candidature-structure/InformationsDeStru
import BesoinEnCoordinateur from './BesoinEnCoordinateur';
import Motivation from './Motivation';
import Engagement from './Engagement';
-import { useScrollToSection } from '../../hooks/useScrollToSection';
+import Alert from '../../components/commun/Alert';
import Captcha from '../../components/commun/Captcha';
+import { useScrollToSection } from '../../hooks/useScrollToSection';
+import { useNavigate } from 'react-router-dom';
+import { useApiAdmin } from '../candidature-conseiller/useApiAdmin';
import '@gouvfr/dsfr/dist/component/form/form.min.css';
import '@gouvfr/dsfr/dist/component/input/input.min.css';
@@ -15,16 +18,35 @@ import '@gouvfr/dsfr/dist/component/radio/radio.min.css';
import '@gouvfr/dsfr/dist/component/badge/badge.min.css';
import '@gouvfr/dsfr/dist/component/notice/notice.min.css';
import '@gouvfr/dsfr/dist/component/sidemenu/sidemenu.min.css';
+import '@gouvfr/dsfr/dist/component/alert/alert.min.css';
import '../candidature-conseiller/CandidatureConseiller.css';
export default function CandidatureCoordinateur() {
const [geoLocation, setGeoLocation] = useState(null);
+ const [validationError, setValidationError] = useState('');
+ const navigate = useNavigate();
+ const { buildCoordinateurData, creerCandidatureCoordinateur } = useApiAdmin();
useScrollToSection();
useEffect(() => {
document.title = 'Conseiller numérique - Devenir coordinateur de conseillers numériques';
}, []);
+ const validerLaCandidature = async event => {
+ event.preventDefault();
+
+ const formData = new FormData(event.currentTarget);
+ const coordinateurData = await buildCoordinateurData(formData);
+ const resultatCreation = await creerCandidatureCoordinateur(coordinateurData);
+ if (resultatCreation.status >= 400) {
+ const error = await resultatCreation.json();
+ setValidationError(error.message);
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ } else {
+ navigate('/candidature-validee');
+ }
+ };
+
return (
@@ -34,7 +56,14 @@ export default function CandidatureCoordinateur() {
Je souhaite engager un coordinateur pour mes conseillers numériques
Les champs avec * sont obligatoires.
-