From 7c4f31f9ed82e70fd48f1ef552a87cb848bbcdd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Tue, 29 Nov 2022 18:17:38 +0100 Subject: [PATCH 01/33] feat(contact): Create a Contact form --- src/App.js | 2 + src/components/forms/category-term/index.js | 11 +- src/pages/nous-contacter.js | 127 ++++++++++++++++++++ 3 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 src/pages/nous-contacter.js diff --git a/src/App.js b/src/App.js index eba23757..1bcaf849 100644 --- a/src/App.js +++ b/src/App.js @@ -64,6 +64,7 @@ import { import './styles/index.scss'; import SearchPage from './pages/rechercher'; +import ContactPage from './pages/nous-contacter'; import AgendaOutlet from './components/outlets/evenements'; import DocumentsOutlet from './components/outlets/documents'; import ActualitesOutlet from './components/outlets/actualites'; @@ -84,6 +85,7 @@ function App() { } /> } /> } /> + } /> } /> }> diff --git a/src/components/forms/category-term/index.js b/src/components/forms/category-term/index.js index 8bfc53d6..5f61ae88 100644 --- a/src/components/forms/category-term/index.js +++ b/src/components/forms/category-term/index.js @@ -1,6 +1,7 @@ -import PropTypes from 'prop-types'; import { Col, Container, Row, TextInput, Title } from '@dataesr/react-dsfr'; +import PropTypes from 'prop-types'; import { useEffect, useState } from 'react'; + import api from '../../../utils/api'; import PaysageBlame from '../../paysage-blame'; import useForm from '../../../hooks/useForm'; @@ -39,7 +40,7 @@ function sanitize(form) { return body; } -export default function CategoryTermsForm({ id, data, onSave, onDelete }) { +export default function CategoryTermsForm({ data, id, onDelete, onSave }) { const [showErrors, setShowErrors] = useState(false); const [startDateOfficialTextQuery, setStartDateOfficialTextQuery] = useState(''); const [endDateOfficialTextQuery, setEndDateOfficialTextQuery] = useState(''); @@ -241,13 +242,13 @@ export default function CategoryTermsForm({ id, data, onSave, onDelete }) { } CategoryTermsForm.propTypes = { - id: PropTypes.string, data: PropTypes.oneOfType([PropTypes.shape, null]), - onSave: PropTypes.func.isRequired, + id: PropTypes.string, onDelete: PropTypes.func, + onSave: PropTypes.func.isRequired, }; CategoryTermsForm.defaultProps = { - id: null, data: { relatedObjects: [] }, + id: null, onDelete: null, }; diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js new file mode 100644 index 00000000..8c263231 --- /dev/null +++ b/src/pages/nous-contacter.js @@ -0,0 +1,127 @@ +import { Badge, Breadcrumb, BreadcrumbItem, Col, Container, Icon, Pagination, Row, SideMenu, SideMenuLink, Text, TextInput, Tile, Title } from '@dataesr/react-dsfr'; +import PropTypes from 'prop-types'; +import { useEffect, useState } from 'react'; +import { Link as RouterLink, useLocation, useSearchParams } from 'react-router-dom'; + +import FormFooter from '../components/forms/form-footer'; +import useForm from '../hooks/useForm'; + +function sanitize(form) { + const fields = [ + 'name', + 'organization', + 'fonction', + 'email', + 'message', + ]; + const body = {}; + Object.keys(form).forEach((key) => { if (fields.includes(key)) { body[key] = form[key]; } }); + body.priority = parseInt(body.priority, 10); + return body; +} + +function validate(body) { + const validationErrors = {}; + if (!body.usualNameFr) { validationErrors.usualNameFr = 'Le nom usuel est obligatoire.'; } + const priority = parseInt(body.priority, 10); + if (priority > 99 || priority < 1) { validationErrors.for = 'Doit être compris en 1 (priorité forte) et 99 (priorité faible)'; } + return validationErrors; +} + +export default function ContactPage({ id, onDelete, onSave }) { + const { form, updateForm, errors } = useForm({}, validate); + const [showErrors, setShowErrors] = useState(false); + + const handleSubmit = () => { + if (Object.keys(errors).length > 0) return setShowErrors(true); + const body = sanitize(form); + return onSave(body, id); + }; + + return ( + + + }> + Accueil + + + Nous contacter + + + + + Contact + + + + +
+ + + + updateForm({ name: e.target.value })} + required + message={(showErrors && errors.name) ? errors.name : null} + messageType={(showErrors && errors.name) ? 'error' : ''} + /> + updateForm({ organization: e.target.value })} + message={(showErrors && errors.organization) ? errors.organization : null} + messageType={(showErrors && errors.organization) ? 'error' : ''} + /> + updateForm({ fonction: e.target.value })} + message={(showErrors && errors.fonction) ? errors.fonction : null} + messageType={(showErrors && errors.fonction) ? 'error' : ''} + /> + updateForm({ email: e.target.value })} + required + message={(showErrors && errors.email) ? errors.email : null} + messageType={(showErrors && errors.email) ? 'error' : ''} + /> + + + updateForm({ message: e.target.value })} + required + message={(showErrors && errors.message) ? errors.message : null} + messageType={(showErrors && errors.message) ? 'error' : ''} + textarea + rows={13} + /> + + + + +
+ +
+
+ ); +} + +ContactPage.propTypes = { + id: PropTypes.string, + onDelete: PropTypes.func, + onSave: PropTypes.func.isRequired, +}; +ContactPage.defaultProps = { + id: null, + onDelete: null, +}; From f50624a05c3b40eb263c8400da57795079856663 Mon Sep 17 00:00:00 2001 From: folland87 Date: Wed, 30 Nov 2022 10:43:44 +0100 Subject: [PATCH 02/33] sort relations-associated --- src/components/blocs/relations-associated/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/blocs/relations-associated/index.js b/src/components/blocs/relations-associated/index.js index ec7fad92..ca3c19de 100644 --- a/src/components/blocs/relations-associated/index.js +++ b/src/components/blocs/relations-associated/index.js @@ -5,9 +5,9 @@ import { Bloc, BlocContent, BlocTitle } from '../../bloc'; import useFetch from '../../../hooks/useFetch'; import useUrl from '../../../hooks/useUrl'; -export default function RelationsAssociated({ blocName, tag }) { +export default function RelationsAssociated({ blocName, tag, sort }) { const { id: resourceId } = useUrl(); - const url = `/relations?filters[relationTag]=${tag}&filters[otherAssociatedObjectIds]=${resourceId}&limit=200`; + const url = `/relations?filters[relationTag]=${tag}&filters[otherAssociatedObjectIds]=${resourceId}&limit=200&sort=${sort}`; const { data, isLoading, error } = useFetch(url); const renderCards = () => { @@ -31,8 +31,10 @@ export default function RelationsAssociated({ blocName, tag }) { RelationsAssociated.propTypes = { blocName: PropTypes.string, tag: PropTypes.string.isRequired, + sort: PropTypes.string, }; RelationsAssociated.defaultProps = { blocName: '', + sort: '-startDate', }; From 8cd35764014e95eaa158ee85be4664fa2a3ccec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Wed, 30 Nov 2022 14:44:13 +0100 Subject: [PATCH 03/33] Fix the split in logo in the footer --- src/components/layout/footer.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/layout/footer.js b/src/components/layout/footer.js index 1c44658e..1f15a1d9 100644 --- a/src/components/layout/footer.js +++ b/src/components/layout/footer.js @@ -40,6 +40,7 @@ export default function Footer({ switchTheme }) { } + splitCharacter={9} > Ministère de l‘enseignement supérieur et de la recherche From fd0aac1b7c4b517398615f66b8d3581dcb9e4d57 Mon Sep 17 00:00:00 2001 From: Mihoub Debache Date: Wed, 30 Nov 2022 16:05:55 +0100 Subject: [PATCH 04/33] fix(contact): add contact form --- src/pages/nous-contacter.js | 58 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js index 8c263231..1b7edbb9 100644 --- a/src/pages/nous-contacter.js +++ b/src/pages/nous-contacter.js @@ -1,11 +1,21 @@ -import { Badge, Breadcrumb, BreadcrumbItem, Col, Container, Icon, Pagination, Row, SideMenu, SideMenuLink, Text, TextInput, Tile, Title } from '@dataesr/react-dsfr'; +import { Breadcrumb, BreadcrumbItem, Col, Container, Row, TextInput, Title } from '@dataesr/react-dsfr'; import PropTypes from 'prop-types'; -import { useEffect, useState } from 'react'; -import { Link as RouterLink, useLocation, useSearchParams } from 'react-router-dom'; +import { useState } from 'react'; +import { Link as RouterLink } from 'react-router-dom'; +import api from '../utils/api'; import FormFooter from '../components/forms/form-footer'; import useForm from '../hooks/useForm'; +function validate(body) { + const validationErrors = {}; + if (!body.usualNameFr) { validationErrors.usualNameFr = 'Le nom usuel est obligatoire.'; } + if (!body.email) { validationErrors.email = "L'email de contact est obligatoire."; } + if (!body.message) { validationErrors.message = 'Veuillez écrire ici votre message'; } + const priority = parseInt(body.priority, 10); + if (priority > 99 || priority < 1) { validationErrors.for = 'Doit être compris en 1 (priorité forte) et 99 (priorité faible)'; } + return validationErrors; +} function sanitize(form) { const fields = [ 'name', @@ -20,21 +30,25 @@ function sanitize(form) { return body; } -function validate(body) { - const validationErrors = {}; - if (!body.usualNameFr) { validationErrors.usualNameFr = 'Le nom usuel est obligatoire.'; } - const priority = parseInt(body.priority, 10); - if (priority > 99 || priority < 1) { validationErrors.for = 'Doit être compris en 1 (priorité forte) et 99 (priorité faible)'; } - return validationErrors; -} - export default function ContactPage({ id, onDelete, onSave }) { const { form, updateForm, errors } = useForm({}, validate); const [showErrors, setShowErrors] = useState(false); - const handleSubmit = () => { + // const handleSubmit = () => { + // if (Object.keys(errors).length > 0) return setShowErrors(true); + // const body = sanitize(form); + // return onSave(body, id); + // }; + + const handleSubmit = async (event) => { + event.preventDefault(); if (Object.keys(errors).length > 0) return setShowErrors(true); const body = sanitize(form); + api.post('/contact', form) + .then((response) => + // eslint-disable-next-line + { console.log(response); }) + .catch(() => { }); return onSave(body, id); }; @@ -64,8 +78,16 @@ export default function ContactPage({ id, onDelete, onSave }) { value={form.name || ''} onChange={(e) => updateForm({ name: e.target.value })} required - message={(showErrors && errors.name) ? errors.name : null} - messageType={(showErrors && errors.name) ? 'error' : ''} + message={(showErrors && errors.usualNameFr) ? errors.usualNameFr : null} + messageType={(showErrors && errors.usualNameFr) ? 'error' : ''} + /> + updateForm({ email: e.target.value })} + required + message={(showErrors && errors.email) ? errors.email : null} + messageType={(showErrors && errors.email) ? 'error' : ''} /> - updateForm({ email: e.target.value })} - required - message={(showErrors && errors.email) ? errors.email : null} - messageType={(showErrors && errors.email) ? 'error' : ''} - /> Date: Wed, 30 Nov 2022 16:12:35 +0100 Subject: [PATCH 05/33] fix(contact): buttonlabel --- src/components/forms/form-footer/index.js | 6 ++++-- src/components/layout/footer.js | 2 +- src/pages/nous-contacter.js | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/forms/form-footer/index.js b/src/components/forms/form-footer/index.js index c878ba95..3d7bb1f9 100644 --- a/src/components/forms/form-footer/index.js +++ b/src/components/forms/form-footer/index.js @@ -5,7 +5,7 @@ import classNames from 'classnames'; import Button from '../../button'; import useViewport from '../../../hooks/useViewport'; -export default function FormFooter({ id, onDeleteHandler, onSaveHandler }) { +export default function FormFooter({ id, onDeleteHandler, onSaveHandler, buttonLabel }) { const { mobile } = useViewport(); const [confirm, setConfirm] = useState(false); const classnames = classNames('flex--space-between', { 'flex--col-reverse': mobile }); @@ -50,7 +50,7 @@ export default function FormFooter({ id, onDeleteHandler, onSaveHandler }) { Supprimer ) :
} - + @@ -60,12 +60,14 @@ export default function FormFooter({ id, onDeleteHandler, onSaveHandler }) { } FormFooter.propTypes = { + buttonLabel: PropTypes.string, id: PropTypes.string, onSaveHandler: PropTypes.func.isRequired, onDeleteHandler: PropTypes.func, }; FormFooter.defaultProps = { + buttonLabel: 'Sauvegarder', id: null, onDeleteHandler: () => {}, }; diff --git a/src/components/layout/footer.js b/src/components/layout/footer.js index 1f15a1d9..6c113a78 100644 --- a/src/components/layout/footer.js +++ b/src/components/layout/footer.js @@ -24,7 +24,7 @@ export default function Footer({ switchTheme }) { }> Aide - }> + }> Nous contacter diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js index 1b7edbb9..e99c346d 100644 --- a/src/pages/nous-contacter.js +++ b/src/pages/nous-contacter.js @@ -118,6 +118,7 @@ export default function ContactPage({ id, onDelete, onSave }) { Date: Wed, 30 Nov 2022 16:20:52 +0100 Subject: [PATCH 06/33] fix(contact): fix error name --- src/pages/nous-contacter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js index e99c346d..cc4c83d2 100644 --- a/src/pages/nous-contacter.js +++ b/src/pages/nous-contacter.js @@ -9,7 +9,7 @@ import useForm from '../hooks/useForm'; function validate(body) { const validationErrors = {}; - if (!body.usualNameFr) { validationErrors.usualNameFr = 'Le nom usuel est obligatoire.'; } + if (!body.name) { validationErrors.name = 'Votre nom est obligatoire.'; } if (!body.email) { validationErrors.email = "L'email de contact est obligatoire."; } if (!body.message) { validationErrors.message = 'Veuillez écrire ici votre message'; } const priority = parseInt(body.priority, 10); @@ -78,8 +78,8 @@ export default function ContactPage({ id, onDelete, onSave }) { value={form.name || ''} onChange={(e) => updateForm({ name: e.target.value })} required - message={(showErrors && errors.usualNameFr) ? errors.usualNameFr : null} - messageType={(showErrors && errors.usualNameFr) ? 'error' : ''} + message={(showErrors && errors.name) ? errors.name : null} + messageType={(showErrors && errors.name) ? 'error' : ''} /> Date: Wed, 30 Nov 2022 16:25:06 +0100 Subject: [PATCH 07/33] fix(contact): test for mail --- src/pages/nous-contacter.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js index cc4c83d2..1e28e469 100644 --- a/src/pages/nous-contacter.js +++ b/src/pages/nous-contacter.js @@ -30,7 +30,7 @@ function sanitize(form) { return body; } -export default function ContactPage({ id, onDelete, onSave }) { +export default function ContactPage({ onSave }) { const { form, updateForm, errors } = useForm({}, validate); const [showErrors, setShowErrors] = useState(false); @@ -48,8 +48,8 @@ export default function ContactPage({ id, onDelete, onSave }) { .then((response) => // eslint-disable-next-line { console.log(response); }) - .catch(() => { }); - return onSave(body, id); + .catch((e) => { console.log(e); }); + return null; }; return ( @@ -119,9 +119,7 @@ export default function ContactPage({ id, onDelete, onSave }) { @@ -132,11 +130,5 @@ export default function ContactPage({ id, onDelete, onSave }) { } ContactPage.propTypes = { - id: PropTypes.string, - onDelete: PropTypes.func, onSave: PropTypes.func.isRequired, }; -ContactPage.defaultProps = { - id: null, - onDelete: null, -}; From c30c2ab1a0871b129f168f78ff5e4ae54c108e79 Mon Sep 17 00:00:00 2001 From: Jerem Date: Wed, 30 Nov 2022 18:28:41 +0100 Subject: [PATCH 08/33] team and project page + footer --- src/App.js | 2 ++ src/components/layout/footer.js | 32 +++++++------------- src/pages/projet-et-equipe.js | 53 +++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 src/pages/projet-et-equipe.js diff --git a/src/App.js b/src/App.js index 1bcaf849..f1ae3655 100644 --- a/src/App.js +++ b/src/App.js @@ -65,6 +65,7 @@ import { import './styles/index.scss'; import SearchPage from './pages/rechercher'; import ContactPage from './pages/nous-contacter'; +import ProjetEtEquipe from './pages/projet-et-equipe'; import AgendaOutlet from './components/outlets/evenements'; import DocumentsOutlet from './components/outlets/documents'; import ActualitesOutlet from './components/outlets/actualites'; @@ -86,6 +87,7 @@ function App() { } /> } /> } /> + } /> } /> }> diff --git a/src/components/layout/footer.js b/src/components/layout/footer.js index 1c44658e..bb3faab4 100644 --- a/src/components/layout/footer.js +++ b/src/components/layout/footer.js @@ -19,24 +19,6 @@ export default function Footer({ switchTheme }) { return ( - - - }> - Aide - - }> - Nous contacter - - - - }> - Notes de version - - }> - Github - - - } @@ -63,15 +45,21 @@ export default function Footer({ switchTheme }) { - - Plan du Site + }> + Aide - - Accessibilité + }> + L'équipe et son projet + + }> + Nous contacter Mentions légales + }> + Github + {`Version de l'application v${process.env.REACT_APP_VERSION}`} diff --git a/src/pages/projet-et-equipe.js b/src/pages/projet-et-equipe.js new file mode 100644 index 00000000..c02906fb --- /dev/null +++ b/src/pages/projet-et-equipe.js @@ -0,0 +1,53 @@ +/* eslint-disable max-len */ +import { useEffect } from 'react'; +import { Container, Text, Title } from '@dataesr/react-dsfr'; + +export default function ProjetEtEquipe() { + useEffect(() => { document.title = 'Paysage · Projet & équipe'; }, []); + return ( + + + Le projet Paysage + + + Paysage est né d'un besoin initial de centraliser et de faciliter l'accès et la maintenabilité d'un grand nombre d'objets de l'enseignement supérieur. +
+ Yann Caradec à imaginer une solution novatrice capable de s'adapter à la constante évolution de cet écosystème et de ses données. +
+ La première version du projet à permis de mettre en lumière les forces d'un tel outil. La connaissance est partagée et l'utilisateur qualifie les données. + Paysage se charge d'afficher une donnée pertinente à jour et de créer la mémoire de notre écosystème dans un historique fible et exploitable. +
+
+ Victime de son succès, Paysage gère à présent X objets. + L'architecture logicielle a atteind ses limites et a due etre repenser afin de fournir à l'utilisateur une meilleure expérience de navigation. Naissance de la version 2. +
+ + + La version 2.0 + + + La nouvelle version était nécessaire pour des raisons de performance, d'interopérabilité et de maintenabilité. +
+ La phylosophie de la version 2 reste la meme mais techniquement, le nouveau Paysage est entièrement repenser et réécrit. + Le projet est maintenant entrièrement développé en Javascript (nodeJs pour l'API et React pour l'interface utilisateur). + Les données sont stockées dans MongoDb et indexées dans Elasticsearch pour la recherche. + Le choix de ces technologies inscrit Paysage dans les outils maitrisés par l'équipe du département des outils d'aide à la décision. + Le code source du projet est sous licence MIT et disponible sur Github. +
+ + + L'équipe derrière le projet + + + Cet outil, imaginé et développé dans sa première versions par Yann Caradec est dorénavant développé par l'ensemble de l'équipe du département des outils d'aide à la décision encadré par Emmanuel Weisenburger. + Julia, Alexandra, Mialy, ... contribuent à l'enrichissement des données. +
+ Pour créer cette verion 2, l'équipe aux compétences partagées et complémentaires a su reccueililr et interpréter l'information des utilisateurs de la version 1 grace à Alexandra et Pauline. +
+ Retranscrire et imaginer une nouvelle architecture adaptée au besoin grace à Anne, Frédéric et Jérémy. +
+ Et enfin développer la solution grace à Anne, Frédéric, Yann, Jérémy et Mihoub. +
+
+ ); +} From 2a8222d344d82ba3195801e98d0ba875f56a9bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Wed, 30 Nov 2022 21:10:20 +0100 Subject: [PATCH 09/33] Display city instead of locality in autocomplete --- src/components/forms/localisation/index.js | 4 ++-- src/components/search-bar/index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/forms/localisation/index.js b/src/components/forms/localisation/index.js index 10a67190..7a3d55fd 100644 --- a/src/components/forms/localisation/index.js +++ b/src/components/forms/localisation/index.js @@ -26,8 +26,8 @@ function validate(body) { function sanitize(form) { const fields = [ - 'cityId', 'city', 'distributionStatement', 'address', 'postOfficeBoxNumber', 'postalCode', - 'locality', 'place', 'country', 'telephone', 'coordinates', 'startDate', 'endDate', + 'address', 'city', 'cityId', 'coordinates', 'country', 'distributionStatement', 'endDate', + 'locality', 'place', 'postalCode', 'postOfficeBoxNumber', 'startDate', 'telephone', ]; const body = {}; Object.keys(form).forEach((key) => { if (fields.includes(key)) { body[key] = form[key]; } }); diff --git a/src/components/search-bar/index.js b/src/components/search-bar/index.js index 7c71669f..795cec81 100644 --- a/src/components/search-bar/index.js +++ b/src/components/search-bar/index.js @@ -176,7 +176,7 @@ const SearchBar = forwardRef((props, ref) => { {option.type && } {getName(option)} - {option.locality ? ` à ${capitalize(option.locality)}` : null} + {option.city ? ` à ${capitalize(option.city)}` : null} {option.creationDate ? ` depuis ${option.creationDate.slice(0, 4)}` : null} {optionsIcon && } From f9e6302c08ff8129acb909c937e51d576374d43e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Wed, 30 Nov 2022 21:42:38 +0100 Subject: [PATCH 10/33] Typo --- src/components/forms/legal-categories/index.js | 4 ++-- src/components/forms/person/index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/forms/legal-categories/index.js b/src/components/forms/legal-categories/index.js index 249c6a7d..eeda1626 100644 --- a/src/components/forms/legal-categories/index.js +++ b/src/components/forms/legal-categories/index.js @@ -34,13 +34,13 @@ export default function LegalCategoriesForm({ id, data, onSave, onDelete }) { }; const sectorOptions = [ - { value: null, label: "Selectionner un type d'objet" }, + { value: null, label: "Sélectionner un type d'objet" }, { value: 'public', label: 'Public' }, { value: 'privé', label: 'Privé' }, { value: 'sans objet', label: 'Sans objet' }, ]; const legalPersonalityOptions = [ - { value: null, label: "Selectionner un type d'objet" }, + { value: null, label: "Sélectionner un type d'objet" }, { value: 'personne morale de droit public', label: 'Personne morale de droit public' }, { value: 'personne morale de droit privé', label: 'Personne morale de droit privé' }, { value: 'organisation internationale', label: 'Organisation internationale' }, diff --git a/src/components/forms/person/index.js b/src/components/forms/person/index.js index 8722f1ca..dd0ba4b2 100644 --- a/src/components/forms/person/index.js +++ b/src/components/forms/person/index.js @@ -38,7 +38,7 @@ export default function PersonForm({ id, data, onSave, onDelete }) { return onSave(body); }; const genderOptions = [ - { value: '', label: 'Selectionner' }, + { value: '', label: 'Sélectionner' }, { value: 'Homme', label: 'Homme' }, { value: 'Femme', label: 'Femme' }, { value: 'Autre', label: 'Autre' }, From 53beb8787a12014e3d889080609de75fa09df065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Wed, 30 Nov 2022 21:44:03 +0100 Subject: [PATCH 11/33] feat(projects): Hide projects, to be reverted --- src/pages/contribuer.js | 3 ++- src/pages/personnes/[id]/index.js | 11 +++++++++-- src/pages/rechercher.js | 3 +++ src/pages/structures/[id]/index.js | 18 ++++++++++-------- src/utils/constants.js | 4 +++- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/pages/contribuer.js b/src/pages/contribuer.js index d972f822..4072ccda 100644 --- a/src/pages/contribuer.js +++ b/src/pages/contribuer.js @@ -39,7 +39,8 @@ export default function ContributePage() { { type: 'structures', icon: 'ri-building-line', name: 'Ajouter une structure', url: '/structures/ajouter' }, { type: 'persons', icon: 'ri-user-3-line', name: 'Ajouter une personne', url: '/personnes/ajouter' }, { type: 'prices', icon: 'ri-award-line', name: 'Ajouter un prix', url: '/prix/ajouter' }, - { type: 'projects', icon: 'ri-booklet-line', name: 'Ajouter un projet', url: '/projets/ajouter' }, + // TODO: Restore projects + // { type: 'projects', icon: 'ri-booklet-line', name: 'Ajouter un projet', url: '/projets/ajouter' }, { type: 'categories', icon: 'ri-price-tag-3-line', name: 'Ajouter une catégorie', url: '/categories/ajouter' }, { type: 'terms', icon: 'ri-hashtag', name: 'Ajouter un terme', url: '/termes/ajouter' }, ]; diff --git a/src/pages/personnes/[id]/index.js b/src/pages/personnes/[id]/index.js index 36b5eb9a..b0af63de 100644 --- a/src/pages/personnes/[id]/index.js +++ b/src/pages/personnes/[id]/index.js @@ -98,10 +98,11 @@ function PersonByIdPage() { Textes officiels - }> + {/* TODO: Restore projects */} + {/* }> Projets - + */} }> Prix & récompenses @@ -231,6 +232,12 @@ function PersonByIdPage() { onChange={(e) => updateForm({ textes: e.target.checked })} label="Textes officiels" /> + {/* TODO: Restore projects */} + {/* updateForm({ projets: e.target.checked })} + label="Projets" + /> */} updateForm({ prix: e.target.checked })} diff --git a/src/pages/rechercher.js b/src/pages/rechercher.js index 5134454a..8a2ed192 100644 --- a/src/pages/rechercher.js +++ b/src/pages/rechercher.js @@ -185,6 +185,8 @@ export default function SearchPage() { + {/* TODO: Restore projects */} + {/* }> @@ -194,6 +196,7 @@ export default function SearchPage() { + */} }> diff --git a/src/pages/structures/[id]/index.js b/src/pages/structures/[id]/index.js index 1a247b40..65375457 100644 --- a/src/pages/structures/[id]/index.js +++ b/src/pages/structures/[id]/index.js @@ -147,10 +147,11 @@ function StructureByIdPage() { Textes officiels - }> + {/* TODO: Restore projects */} + {/* }> Projets - + */} }> Prix & récompenses @@ -280,20 +281,21 @@ function StructureByIdPage() { onChange={(e) => updateForm({ chiffres: e.target.checked })} label="Chiffres clés" /> - updateForm({ prix: e.target.checked })} - label="Prix et récompenses" - /> updateForm({ textes: e.target.checked })} label="Textes officiels" /> - updateForm({ projets: e.target.checked })} label="Projets" + /> */} + updateForm({ prix: e.target.checked })} + label="Prix et récompenses" /> Date: Wed, 30 Nov 2022 21:55:32 +0100 Subject: [PATCH 12/33] fix(export): Correct export options --- src/pages/categories/[id]/index.js | 2 +- src/pages/personnes/[id]/index.js | 8 ++++---- src/pages/structures/[id]/index.js | 18 +++++++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/pages/categories/[id]/index.js b/src/pages/categories/[id]/index.js index 55c45ab9..1d49c2ca 100644 --- a/src/pages/categories/[id]/index.js +++ b/src/pages/categories/[id]/index.js @@ -166,7 +166,7 @@ function CategoryByIdPage() { updateForm({ related: e.target.checked })} - label="Elements liés" + label="Eléments liés" /> }> - Rôles et Mandats + Rôles et mandats }> @@ -105,7 +105,7 @@ function PersonByIdPage() { */} }> - Prix & récompenses + Prix et récompenses }> @@ -210,7 +210,7 @@ function PersonByIdPage() { updateForm({ mandats: e.target.checked })} - label="Rôles et Mandats" + label="Rôles et mandats" /> updateForm({ prix: e.target.checked })} - label="Prix & récompenses" + label="Prix et récompenses" /> */} }> - Prix & récompenses + Prix et récompenses }> - Écosysteme & Réseaux + Écosystème et réseaux {(viewer.role === 'admin') && ( }> @@ -271,15 +271,15 @@ function StructureByIdPage() { onChange={(e) => updateForm({ resources: e.target.checked })} label="Ressources" /> - updateForm({ categories: e.target.checked })} - label="Categories et termes" - /> updateForm({ chiffres: e.target.checked })} - label="Chiffres clés" + label="Analyses et données" + /> + updateForm({ categories: e.target.checked })} + label="Catégories et termes" /> updateForm({ elements: e.target.checked })} - label="Eléments liés" + label="Écosystème et réseaux" /> From 6c8a4059f0501b45cda7f658b4dd49266bcb7110 Mon Sep 17 00:00:00 2001 From: folland87 Date: Wed, 30 Nov 2022 22:38:20 +0100 Subject: [PATCH 13/33] fix documents --- .github/workflows/main.yml | 28 ++++++++++++++++++++++++++++ src/components/download/file.js | 2 +- src/components/outlets/documents.js | 2 +- src/pages/se-connecter.js | 8 ++++---- 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5580a2f8..085aa15c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -55,6 +55,34 @@ jobs: namespace: ${{ env.DEPLOYMENT_NAMESPACE }} restart: ${{ env.DEPLOYMENT }} + release: + name: Release new version + runs-on: ubuntu-latest + needs: publish-ghcr + steps: + - name: Check Out Repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Get version + id: version + run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + - name: Create changelog text + id: changelog + uses: loopwerk/tag-changelog@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + config_file: .github/config/changelog.js + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.version.outputs.tag }} + release_name: ${{ steps.version.outputs.tag }} + body: "${{ steps.changelog.outputs.changes }}" + notify: needs: deploy if: always() diff --git a/src/components/download/file.js b/src/components/download/file.js index 37db6da6..a00e5cfa 100644 --- a/src/components/download/file.js +++ b/src/components/download/file.js @@ -33,7 +33,7 @@ const mapping = { document: { icon: 'ri-file-word-fill', color: 'var(--blue-ecume-main-400)' }, powerpoint: { icon: 'ri-file-ppt-fill', color: 'var(--grey-main-525)' }, excel: { icon: 'ri-file-excel-fill', color: 'var(--green-emeraude-main-632)' }, - archive: { icon: 'ri-file-zip-fill', color: 'var(--grey-main-525)' }, + archive: { icon: 'ri-file-zip-fill', color: 'var(--yellow-tournesol-main-731)' }, }; const getFileIcon = (mimetype) => { diff --git a/src/components/outlets/documents.js b/src/components/outlets/documents.js index ca89d6e0..616b9f53 100644 --- a/src/components/outlets/documents.js +++ b/src/components/outlets/documents.js @@ -61,7 +61,7 @@ export default function DocumentsOutlet() { }; const renderGroupBadge = (canAccess = []) => { - if (!canAccess?.length > 0) return ; + if (!canAccess?.length > 0) return null; const { groups } = viewer; const accessGroups = groups.filter((elem) => (canAccess.includes(elem.id))); if (accessGroups.length > 0) { diff --git a/src/pages/se-connecter.js b/src/pages/se-connecter.js index ea2a8177..f11ae848 100644 --- a/src/pages/se-connecter.js +++ b/src/pages/se-connecter.js @@ -16,7 +16,7 @@ export default function SignIn() { const [otp, setOtp] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); - const [matchError, setMatchError] = useState(false); + const [error, setError] = useState(''); const validateEmail = () => MAIL_REGEXP.test(email); const validateOtp = () => OTP_REGEXP.test(otp); @@ -26,8 +26,8 @@ export default function SignIn() { e.preventDefault(); if (validateEmail(email) && (validatePassword(password) === true)) { const { message } = await requestSignInEmail({ email, password }); - if (message) { setStep(2); } else { setMatchError(true); } - } else { setMatchError(true); } + if (message.startsWith('Un nouveau code')) { setStep(2); } else { setError(message); } + } else { setError('Mauvaise combinaison utilisateur/mot de passe'); } }; const handleSignIn = async (e) => { e.preventDefault(); @@ -70,7 +70,7 @@ export default function SignIn() { { (step === 1) && ( - {matchError && } + {(error) && }
Date: Thu, 1 Dec 2022 08:51:33 +0100 Subject: [PATCH 14/33] some fix --- src/components/errors/index.js | 48 ++++++++++++++++------------- src/components/layout/footer.js | 11 +++---- src/pages/mon-compte/preferences.js | 2 +- src/pages/nous-contacter.js | 32 +++++++++---------- src/pages/projet-et-equipe.js | 23 ++++++++------ src/styles/flex.scss | 3 ++ 6 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/components/errors/index.js b/src/components/errors/index.js index a59508b2..e7a4dfbc 100644 --- a/src/components/errors/index.js +++ b/src/components/errors/index.js @@ -1,3 +1,4 @@ +import { ButtonGroup, Col, Container, Row, Text, Title } from '@dataesr/react-dsfr'; import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; import { ReactComponent as TechErrorSVG } from '../../assets/technical-error.svg'; @@ -5,51 +6,56 @@ import { ReactComponent as TechErrorSVG } from '../../assets/technical-error.svg function Error500() { return ( <> -

Erreur inattendue

-

Erreur 500

-

Essayez de rafraichir la page ou bien ressayez plus tard.

-

+ Erreur inattendue + Erreur 500 + Essayez de rafraichir la page ou bien ressayez plus tard. + Désolé, le service rencontre un problème, nous travaillons pour le résoudre le plus rapidement possible. -

+ ); } function Error404() { return ( <> -

Page non trouvée

-

Erreur 404

-

La page que vous cherchez est introuvable. Excusez-nous pour la gène occasionnée.

-

+ Page non trouvée + Erreur 404 + La page que vous cherchez est introuvable. Excusez-nous pour la gène occasionnée. + Si vous avez tapé l'adresse web dans le navigateur, vérifiez qu'elle est correcte. La page n’est peut-être plus disponible.
Dans ce cas, pour continuer votre visite vous pouvez consulter notre page d’accueil, ou effectuer une recherche avec notre moteur de recherche en haut de page.
Sinon contactez-nous pour que l’on puisse vous rediriger vers la bonne information. -

+ ); } export default function Error({ status }) { return ( -
-
-
- {['400', '404'].includes(status) ? : } -
    + + + + {['400', '404', '403', '401'].includes(status) ? : } + +
  • + + Retour à l'accueil + +
  • Contactez-nous
  • -
-
-
+ + + -
-
-
+ + + ); } diff --git a/src/components/layout/footer.js b/src/components/layout/footer.js index 575298f3..7d8259a6 100644 --- a/src/components/layout/footer.js +++ b/src/components/layout/footer.js @@ -1,8 +1,6 @@ import { Link as RouterLink } from 'react-router-dom'; import PropTypes from 'prop-types'; import { - FooterTop, - FooterTopCategory, Footer as FooterWrapper, FooterBody, FooterBottom, @@ -21,7 +19,7 @@ export default function Footer({ switchTheme }) { } + asLink={} splitCharacter={9} > Ministère de l‘enseignement supérieur et de la recherche @@ -64,14 +62,15 @@ export default function Footer({ switchTheme }) { {`Version de l'application v${process.env.REACT_APP_VERSION}`} - setIsOpen(true)}> + diff --git a/src/pages/mon-compte/preferences.js b/src/pages/mon-compte/preferences.js index f65ac765..d1f0df7c 100644 --- a/src/pages/mon-compte/preferences.js +++ b/src/pages/mon-compte/preferences.js @@ -63,7 +63,7 @@ export default function PreferencesPage() { { localStorage.setItem('prefers-edit-mode', value); diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js index 1e28e469..2ab4d967 100644 --- a/src/pages/nous-contacter.js +++ b/src/pages/nous-contacter.js @@ -1,19 +1,18 @@ +// TODO: Put the form in /components/forms !? import { Breadcrumb, BreadcrumbItem, Col, Container, Row, TextInput, Title } from '@dataesr/react-dsfr'; -import PropTypes from 'prop-types'; import { useState } from 'react'; import { Link as RouterLink } from 'react-router-dom'; import api from '../utils/api'; import FormFooter from '../components/forms/form-footer'; import useForm from '../hooks/useForm'; +import useAuth from '../hooks/useAuth'; function validate(body) { const validationErrors = {}; if (!body.name) { validationErrors.name = 'Votre nom est obligatoire.'; } if (!body.email) { validationErrors.email = "L'email de contact est obligatoire."; } if (!body.message) { validationErrors.message = 'Veuillez écrire ici votre message'; } - const priority = parseInt(body.priority, 10); - if (priority > 99 || priority < 1) { validationErrors.for = 'Doit être compris en 1 (priorité forte) et 99 (priorité faible)'; } return validationErrors; } function sanitize(form) { @@ -26,30 +25,31 @@ function sanitize(form) { ]; const body = {}; Object.keys(form).forEach((key) => { if (fields.includes(key)) { body[key] = form[key]; } }); - body.priority = parseInt(body.priority, 10); return body; } -export default function ContactPage({ onSave }) { - const { form, updateForm, errors } = useForm({}, validate); +export default function ContactPage() { + // Prefill form if user is connected + const { viewer } = useAuth(); + const initialForm = viewer?.id + ? { name: `${viewer.firstName} ${viewer.lastName}`.trim(), organization: viewer?.service, fonction: viewer?.position, email: viewer?.email } + : {}; + const { form, updateForm, errors } = useForm(initialForm, validate); const [showErrors, setShowErrors] = useState(false); - // const handleSubmit = () => { - // if (Object.keys(errors).length > 0) return setShowErrors(true); - // const body = sanitize(form); - // return onSave(body, id); - // }; - - const handleSubmit = async (event) => { - event.preventDefault(); + const handleSubmit = async () => { if (Object.keys(errors).length > 0) return setShowErrors(true); + // TODO: Send sanitized body, not form + // eslint-disable-next-line const body = sanitize(form); api.post('/contact', form) .then((response) => // eslint-disable-next-line { console.log(response); }) + // eslint-disable-next-line .catch((e) => { console.log(e); }); return null; + // TODO: Set a state 'step' to 2 and display success page if step = 2 }; return ( @@ -128,7 +128,3 @@ export default function ContactPage({ onSave }) { ); } - -ContactPage.propTypes = { - onSave: PropTypes.func.isRequired, -}; diff --git a/src/pages/projet-et-equipe.js b/src/pages/projet-et-equipe.js index c02906fb..11359605 100644 --- a/src/pages/projet-et-equipe.js +++ b/src/pages/projet-et-equipe.js @@ -1,6 +1,6 @@ /* eslint-disable max-len */ import { useEffect } from 'react'; -import { Container, Text, Title } from '@dataesr/react-dsfr'; +import { Container, Link, Text, Title } from '@dataesr/react-dsfr'; export default function ProjetEtEquipe() { useEffect(() => { document.title = 'Paysage · Projet & équipe'; }, []); @@ -12,14 +12,14 @@ export default function ProjetEtEquipe() { Paysage est né d'un besoin initial de centraliser et de faciliter l'accès et la maintenabilité d'un grand nombre d'objets de l'enseignement supérieur.
- Yann Caradec à imaginer une solution novatrice capable de s'adapter à la constante évolution de cet écosystème et de ses données. + Yann Caradec à imaginé une solution novatrice capable de s'adapter à la constante évolution de cet écosystème et de ses données.
La première version du projet à permis de mettre en lumière les forces d'un tel outil. La connaissance est partagée et l'utilisateur qualifie les données. - Paysage se charge d'afficher une donnée pertinente à jour et de créer la mémoire de notre écosystème dans un historique fible et exploitable. + Paysage se charge d'afficher une donnée pertinente à jour et de créer la mémoire de notre écosystème dans un historique fiable et exploitable.

Victime de son succès, Paysage gère à présent X objets. - L'architecture logicielle a atteind ses limites et a due etre repenser afin de fournir à l'utilisateur une meilleure expérience de navigation. Naissance de la version 2. + L'architecture logicielle a atteind ses limites et a du être repensé afin de fournir à l'utilisateur une meilleure expérience de navigation. Naissance de la version 2.
@@ -28,11 +28,14 @@ export default function ProjetEtEquipe() { <Text> La nouvelle version était nécessaire pour des raisons de performance, d'interopérabilité et de maintenabilité. <br /> - La phylosophie de la version 2 reste la meme mais techniquement, le nouveau Paysage est entièrement repenser et réécrit. - Le projet est maintenant entrièrement développé en Javascript (nodeJs pour l'API et React pour l'interface utilisateur). + La philosophie de la version 2 reste la même mais techniquement, le nouveau Paysage est entièrement repensé et réécrit. + Le projet est maintenant entrièrement développé en Javascript (nodeJS pour l'API et React pour l'interface utilisateur). Les données sont stockées dans MongoDb et indexées dans Elasticsearch pour la recherche. Le choix de ces technologies inscrit Paysage dans les outils maitrisés par l'équipe du département des outils d'aide à la décision. - Le code source du projet est sous licence MIT et disponible sur Github. + Le code source du projet est sous licence MIT et disponible sur + {' '} + <Link href="https://github.com/search?q=org%3Adataesr+paysage">Github</Link> + . </Text> <Title as="h2"> @@ -42,11 +45,11 @@ export default function ProjetEtEquipe() { Cet outil, imaginé et développé dans sa première versions par Yann Caradec est dorénavant développé par l'ensemble de l'équipe du département des outils d'aide à la décision encadré par Emmanuel Weisenburger. Julia, Alexandra, Mialy, ... contribuent à l'enrichissement des données. <br /> - Pour créer cette verion 2, l'équipe aux compétences partagées et complémentaires a su reccueililr et interpréter l'information des utilisateurs de la version 1 grace à Alexandra et Pauline. + Pour créer cette verion 2, l'équipe aux compétences partagées et complémentaires a su reccueillir et interpréter l'information des utilisateurs de la version 1 grâce à Alexandra et Pauline. <br /> - Retranscrire et imaginer une nouvelle architecture adaptée au besoin grace à Anne, Frédéric et Jérémy. + Retranscrire et imaginer une nouvelle architecture adaptée au besoin grâce à Anne, Frédéric et Jérémy. <br /> - Et enfin développer la solution grace à Anne, Frédéric, Yann, Jérémy et Mihoub. + Et enfin développer la solution grâce à Anne, Frédéric, Yann, Jérémy et Mihoub. </Text> </Container> ); diff --git a/src/styles/flex.scss b/src/styles/flex.scss index e5c0997d..eed7cf70 100644 --- a/src/styles/flex.scss +++ b/src/styles/flex.scss @@ -1,3 +1,6 @@ +.inline-flex { + display: inline-flex !important; +} .flex { display: flex !important; } From 93cf85e2d87ae111665b8f6e75470e100de42a15 Mon Sep 17 00:00:00 2001 From: folland87 <frederic@olland.me> Date: Thu, 1 Dec 2022 08:58:55 +0100 Subject: [PATCH 15/33] add breadcrumb --- src/pages/projet-et-equipe.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/pages/projet-et-equipe.js b/src/pages/projet-et-equipe.js index 11359605..1e0d7720 100644 --- a/src/pages/projet-et-equipe.js +++ b/src/pages/projet-et-equipe.js @@ -1,11 +1,20 @@ /* eslint-disable max-len */ import { useEffect } from 'react'; -import { Container, Link, Text, Title } from '@dataesr/react-dsfr'; +import { Link as RouterLink } from 'react-router-dom'; +import { Breadcrumb, BreadcrumbItem, Container, Link, Text, Title } from '@dataesr/react-dsfr'; export default function ProjetEtEquipe() { useEffect(() => { document.title = 'Paysage · Projet & équipe'; }, []); return ( - <Container> + <Container spacing="pb-6w"> + <Breadcrumb> + <BreadcrumbItem asLink={<RouterLink to="/" />}> + Accueil + </BreadcrumbItem> + <BreadcrumbItem> + L'équipe et son projet + </BreadcrumbItem> + </Breadcrumb> <Title as="h2"> Le projet Paysage @@ -34,7 +43,7 @@ export default function ProjetEtEquipe() { Le choix de ces technologies inscrit Paysage dans les outils maitrisés par l'équipe du département des outils d'aide à la décision. Le code source du projet est sous licence MIT et disponible sur {' '} - Github + Github . From c3ae761bbd3d6f53980fc2d07f23eab093406173 Mon Sep 17 00:00:00 2001 From: folland87 Date: Thu, 1 Dec 2022 09:08:08 +0100 Subject: [PATCH 16/33] restore outlines --- src/components/layout/not-found.scss | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/layout/not-found.scss b/src/components/layout/not-found.scss index dd61f0a6..9c1f5489 100644 --- a/src/components/layout/not-found.scss +++ b/src/components/layout/not-found.scss @@ -54,9 +54,13 @@ } } -:focus { - outline: 0; -} +// ATTENTION: les classes ecrites ici peuvent affecter tout le css du site car elles sont importées sans .module.scss +// Par exemple, les deux lignes suivantes enlèvent les outlines de tout le site ! +// TODO: utiliser not-found.module.scss, importer la feuille de style dans le js et écrire les classes styles.starfifth ou styles["e-nav"] +// Enfin, vérifier que toutes les classes présentes ici sont utilisées. +// :focus { +// outline: 0; +// } .clearfix:before, .clearfix:after { content: "\0020"; From c1b94364f8e3029b52d2ab9226fef4d435d5498b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Thu, 1 Dec 2022 10:45:24 +0100 Subject: [PATCH 17/33] typos --- src/pages/projet-et-equipe.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/pages/projet-et-equipe.js b/src/pages/projet-et-equipe.js index 1e0d7720..4996b25f 100644 --- a/src/pages/projet-et-equipe.js +++ b/src/pages/projet-et-equipe.js @@ -21,26 +21,26 @@ export default function ProjetEtEquipe() { Paysage est né d'un besoin initial de centraliser et de faciliter l'accès et la maintenabilité d'un grand nombre d'objets de l'enseignement supérieur.
- Yann Caradec à imaginé une solution novatrice capable de s'adapter à la constante évolution de cet écosystème et de ses données. + Yann Caradec a imaginé une solution novatrice capable de s'adapter à la constante évolution de cet écosystème et de ses données.
- La première version du projet à permis de mettre en lumière les forces d'un tel outil. La connaissance est partagée et l'utilisateur qualifie les données. + La première version du projet a permis de mettre en lumière les forces d'un tel outil. La connaissance est partagée et l'utilisateur qualifie les données. Paysage se charge d'afficher une donnée pertinente à jour et de créer la mémoire de notre écosystème dans un historique fiable et exploitable.

- Victime de son succès, Paysage gère à présent X objets. - L'architecture logicielle a atteind ses limites et a du être repensé afin de fournir à l'utilisateur une meilleure expérience de navigation. Naissance de la version 2. + Victime de son succès, Paysage gère à présent plus de 35 000 objets. + L'architecture logicielle a atteint ses limites et a dû être repensée afin de fournir à l'utilisateur une meilleure expérience de navigation. Naissance de la version 2.
- La version 2.0 + La version 2 La nouvelle version était nécessaire pour des raisons de performance, d'interopérabilité et de maintenabilité.
La philosophie de la version 2 reste la même mais techniquement, le nouveau Paysage est entièrement repensé et réécrit. - Le projet est maintenant entrièrement développé en Javascript (nodeJS pour l'API et React pour l'interface utilisateur). + Le projet est maintenant entièrement développé en Javascript (NodeJS pour l'API et React pour l'interface utilisateur). Les données sont stockées dans MongoDb et indexées dans Elasticsearch pour la recherche. - Le choix de ces technologies inscrit Paysage dans les outils maitrisés par l'équipe du département des outils d'aide à la décision. + Le choix de ces technologies inscrit Paysage dans les outils maîtrisés par l'équipe du département des outils d'aide à la décision. Le code source du projet est sous licence MIT et disponible sur {' '} Github @@ -51,8 +51,8 @@ export default function ProjetEtEquipe() { L'équipe derrière le projet - Cet outil, imaginé et développé dans sa première versions par Yann Caradec est dorénavant développé par l'ensemble de l'équipe du département des outils d'aide à la décision encadré par Emmanuel Weisenburger. - Julia, Alexandra, Mialy, ... contribuent à l'enrichissement des données. + Cet outil, imaginé et développé dans sa première version par Yann Caradec est dorénavant développé par l'ensemble de l'équipe du département des outils d'aide à la décision encadré par Emmanuel Weisenburger. + Alexandra, Julia, Mialy, ... contribuent à l'enrichissement des données.
Pour créer cette verion 2, l'équipe aux compétences partagées et complémentaires a su reccueillir et interpréter l'information des utilisateurs de la version 1 grâce à Alexandra et Pauline.
From e21228f1f2d497a3767388df6fb6a95caebf88a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Thu, 1 Dec 2022 10:58:51 +0100 Subject: [PATCH 18/33] Typo and hide projects --- src/components/forms/laureate/index.js | 8 +++++--- src/pages/prix/[id]/presentation.js | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components/forms/laureate/index.js b/src/components/forms/laureate/index.js index 655961e4..4ee526ee 100644 --- a/src/components/forms/laureate/index.js +++ b/src/components/forms/laureate/index.js @@ -141,7 +141,7 @@ export default function LaureateForm({ id, resourceType, relatedObjectTypes, dat buttonLabel="Rechercher" value={resourceQuery || ''} label="Prix" - hint="Rechercher parmis les prix" + hint="Rechercher parmi les prix" required scope={form.resourceName} placeholder={form.resourceId ? '' : 'Rechercher...'} @@ -159,7 +159,9 @@ export default function LaureateForm({ id, resourceType, relatedObjectTypes, dat buttonLabel="Rechercher" value={relatedObjectQuery || ''} label="Lauréat" - hint="Rechercher parmis les structures, les personnes et les projets" + // TODO: Restore projects + // hint="Rechercher parmi les structures, les personnes et les projets" + hint="Rechercher parmi les structures et les personnes" required scope={form.relatedObjectName} placeholder={form.relatedObjectId ? '' : 'Rechercher...'} @@ -175,7 +177,7 @@ export default function LaureateForm({ id, resourceType, relatedObjectTypes, dat { setAssociatedQuery(e.target.value); }} options={associatedOptions} diff --git a/src/pages/prix/[id]/presentation.js b/src/pages/prix/[id]/presentation.js index 0ade85d9..235199a2 100644 --- a/src/pages/prix/[id]/presentation.js +++ b/src/pages/prix/[id]/presentation.js @@ -46,7 +46,9 @@ export default function PricePresentationPage() { tag={LAUREAT} blocName="Lauréats" resourceType="prices" - relatedObjectTypes={['persons', 'structures', 'projects']} + // TODO: Restore projects + // relatedObjectTypes={['persons', 'structures', 'projects']} + relatedObjectTypes={['persons', 'structures']} Form={LaureateForm} /> From 77fcee8be6c96b21a84211019c2b9d59edf8e032 Mon Sep 17 00:00:00 2001 From: Mihoub Debache Date: Thu, 1 Dec 2022 11:07:29 +0100 Subject: [PATCH 19/33] fix(contacts): user can no longer change fields --- src/pages/nous-contacter.js | 44 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/pages/nous-contacter.js b/src/pages/nous-contacter.js index 2ab4d967..c3a50f41 100644 --- a/src/pages/nous-contacter.js +++ b/src/pages/nous-contacter.js @@ -1,8 +1,8 @@ -// TODO: Put the form in /components/forms !? import { Breadcrumb, BreadcrumbItem, Col, Container, Row, TextInput, Title } from '@dataesr/react-dsfr'; import { useState } from 'react'; -import { Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink, useNavigate } from 'react-router-dom'; import api from '../utils/api'; +import useToast from '../hooks/useToast'; import FormFooter from '../components/forms/form-footer'; import useForm from '../hooks/useForm'; @@ -10,11 +10,10 @@ import useAuth from '../hooks/useAuth'; function validate(body) { const validationErrors = {}; - if (!body.name) { validationErrors.name = 'Votre nom est obligatoire.'; } - if (!body.email) { validationErrors.email = "L'email de contact est obligatoire."; } - if (!body.message) { validationErrors.message = 'Veuillez écrire ici votre message'; } + if (!body.message) { validationErrors.message = 'Veuillez écrire votre message'; } return validationErrors; } + function sanitize(form) { const fields = [ 'name', @@ -29,27 +28,30 @@ function sanitize(form) { } export default function ContactPage() { - // Prefill form if user is connected const { viewer } = useAuth(); const initialForm = viewer?.id ? { name: `${viewer.firstName} ${viewer.lastName}`.trim(), organization: viewer?.service, fonction: viewer?.position, email: viewer?.email } : {}; const { form, updateForm, errors } = useForm(initialForm, validate); const [showErrors, setShowErrors] = useState(false); + const { toast } = useToast(); + const navigate = useNavigate(); + const [validationMessage, setValidationMessage] = useState(''); - const handleSubmit = async () => { + const handleSubmit = async (event) => { + event.preventDefault(); if (Object.keys(errors).length > 0) return setShowErrors(true); - // TODO: Send sanitized body, not form - // eslint-disable-next-line const body = sanitize(form); - api.post('/contact', form) - .then((response) => - // eslint-disable-next-line - { console.log(response); }) - // eslint-disable-next-line - .catch((e) => { console.log(e); }); - return null; - // TODO: Set a state 'step' to 2 and display success page if step = 2 + api.post('/contacts', body) + .then((response) => { + setValidationMessage(response.data.message); + toast({ toastType: 'success', description: 'Votre message a bien été envoyé' }); + navigate('/'); + }) + .catch(() => { + toast({ toastType: 'error', description: "Une erreur s'est produite" }); + }); + return validationMessage; }; return ( @@ -76,16 +78,12 @@ export default function ContactPage() { updateForm({ name: e.target.value })} - required - message={(showErrors && errors.name) ? errors.name : null} - messageType={(showErrors && errors.name) ? 'error' : ''} + disabled /> updateForm({ email: e.target.value })} - required + disabled message={(showErrors && errors.email) ? errors.email : null} messageType={(showErrors && errors.email) ? 'error' : ''} /> From c0d236515bd335682f6941cb9c9bb6666cd3a347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anne=20L=27H=C3=B4te?= Date: Thu, 1 Dec 2022 11:13:31 +0100 Subject: [PATCH 20/33] typo --- src/components/errors/index.js | 10 +++++----- src/pages/structures/[id]/prix-et-recompenses.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/errors/index.js b/src/components/errors/index.js index e7a4dfbc..5eeb8ca2 100644 --- a/src/components/errors/index.js +++ b/src/components/errors/index.js @@ -8,7 +8,7 @@ function Error500() { <> Erreur inattendue Erreur 500 - Essayez de rafraichir la page ou bien ressayez plus tard. + Essayez de rafraîchir la page ou bien réessayez plus tard. Désolé, le service rencontre un problème, nous travaillons pour le résoudre le plus rapidement possible. @@ -20,13 +20,13 @@ function Error404() { <> Page non trouvée Erreur 404 - La page que vous cherchez est introuvable. Excusez-nous pour la gène occasionnée. + La page que vous cherchez est introuvable. Excusez-nous pour la gêne occasionnée. - Si vous avez tapé l'adresse web dans le navigateur, vérifiez qu'elle est correcte. La page n’est peut-être plus disponible. + Si vous avez tapé l'adresse web dans le navigateur, vérifiez qu'elle est correcte. La page n'est peut-être plus disponible.
- Dans ce cas, pour continuer votre visite vous pouvez consulter notre page d’accueil, ou effectuer une recherche avec notre moteur de recherche en haut de page. + Dans ce cas, pour continuer votre visite, vous pouvez consulter notre page d'accueil, ou effectuer une recherche avec notre moteur de recherche en haut de page.
- Sinon contactez-nous pour que l’on puisse vous rediriger vers la bonne information. + Sinon contactez-nous pour que l'on puisse vous rediriger vers la bonne information.
); diff --git a/src/pages/structures/[id]/prix-et-recompenses.js b/src/pages/structures/[id]/prix-et-recompenses.js index eb546f7c..9d754a51 100644 --- a/src/pages/structures/[id]/prix-et-recompenses.js +++ b/src/pages/structures/[id]/prix-et-recompenses.js @@ -8,7 +8,7 @@ export default function StructurePrixEtRecompensesPage() { <> Date: Thu, 1 Dec 2022 11:40:34 +0100 Subject: [PATCH 21/33] fix(not-found): clean style with module --- src/components/layout/not-found.js | 56 +++++++++--------- .../{not-found.scss => not-found.module.scss} | 58 ++++++------------- 2 files changed, 45 insertions(+), 69 deletions(-) rename src/components/layout/{not-found.scss => not-found.module.scss} (93%) diff --git a/src/components/layout/not-found.js b/src/components/layout/not-found.js index 485dcb67..6caad7a4 100644 --- a/src/components/layout/not-found.js +++ b/src/components/layout/not-found.js @@ -1,7 +1,7 @@ import React from 'react'; -import { Button, Text, Title } from '@dataesr/react-dsfr'; +import { Button, Text } from '@dataesr/react-dsfr'; import { useNavigate } from 'react-router-dom'; -import './not-found.scss'; +import styles from './not-found.module.scss'; const randomDisplay = Math.floor(Math.random() * 2); @@ -10,54 +10,54 @@ export default function NotFound() { return randomDisplay === 1 ? (
-
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
-
- Page Introuvable! - Désolé, la page que vous cherchez n'existe pas. - Vous pouvez relancer une recherche ou vous rendre sur la page d'accueil +
+
+
+ Page Introuvable! + Désolé, la page que vous cherchez n'existe pas. + Vous pouvez relancer une recherche ou vous rendre sur la page d'accueil
- +
) : ( -
-
-
+
+
+
-
- Page Introuvable! +
+ Page Introuvable!
- + Désolé, la page que vous cherchez n'existe pas. - Vous pouvez relancer une recherche ou vous rendre sur la page d'accueil + Vous pouvez relancer une recherche ou vous rendre sur la page d'accueil
{editMode && onEdit && ( @@ -81,6 +83,7 @@ KeyValueCard.propTypes = { onEdit: PropTypes.func, titleAsText: PropTypes.string, tooltip: PropTypes.string, + inactive: PropTypes.bool, }; KeyValueCard.defaultProps = { className: '', @@ -91,4 +94,5 @@ KeyValueCard.defaultProps = { onEdit: null, titleAsText: false, tooltip: null, + inactive: false, };