Skip to content

Commit

Permalink
Showing 42 changed files with 579 additions and 249 deletions.
28 changes: 28 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -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()
4 changes: 4 additions & 0 deletions src/App.js
Original file line number Diff line number Diff line change
@@ -64,6 +64,8 @@ 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';
@@ -84,6 +86,8 @@ function App() {
<Route path="/mot-de-passe-oublie" element={<Passwordless />} />
<Route path="/ressources-externes" element={<RessourcesExternesPage />} />
<Route path="/aide" element={<HelpPage />} />
<Route path="/nous-contacter" element={<ContactPage />} />
<Route path="/projet-et-equipe" element={<ProjetEtEquipe />} />
<Route path="*" element={<NotFound />} />

<Route element={<ProtectedRoute roles={['admin']} />}>
5 changes: 5 additions & 0 deletions src/components/blocs/identifiers/index.js
Original file line number Diff line number Diff line change
@@ -168,6 +168,7 @@ export default function IdentifiersComponent() {
key={el.id}
onEdit={() => onOpenModalHandler(el)}
linkTo={getLink(el)}
inactive={!(el?.active === true)}
/>,
);
if (el.type === 'Id unité CNRS') {
@@ -181,6 +182,7 @@ export default function IdentifiersComponent() {
key={el.id}
onEdit={() => onOpenModalHandler(el)}
linkTo={getLink({ ...el, type: 'CNRS - grafilabo' })}
inactive={!(el?.active === true)}
/>,
);
}
@@ -195,6 +197,7 @@ export default function IdentifiersComponent() {
key={el.id}
onEdit={() => onOpenModalHandler(el)}
linkTo={getLink({ ...el, type: 'Wikidata JSON' })}
inactive={!(el?.active === true)}
/>,
);
}
@@ -210,6 +213,7 @@ export default function IdentifiersComponent() {
key={el.id}
onEdit={() => onOpenModalHandler(el)}
linkTo={getLink({ ...el, type: 'Siren' })}
inactive={!(el?.active === true)}
/>,
);
list.push(
@@ -221,6 +225,7 @@ export default function IdentifiersComponent() {
icon="ri-fingerprint-2-line"
key={el.id}
onEdit={() => onOpenModalHandler(el)}
inactive={!(el?.active === true)}
/>,
);
}
6 changes: 4 additions & 2 deletions src/components/blocs/relations-associated/index.js
Original file line number Diff line number Diff line change
@@ -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',
};
6 changes: 3 additions & 3 deletions src/components/blocs/relations-by-group/index.js
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ import { deleteError, saveError, saveSuccess, deleteSuccess } from '../../../uti
export default function RelationsByGroup({ group, reloader }) {
const { id: groupId, name: groupName, accepts: groupAccepts } = group;
const { notice } = useNotice();
const { id: resourceId, apiObject, url: listUrl } = useUrl('relations-groups');
const { id: resourceId, apiObject } = useUrl('relations-groups');
const url = `/relations?filters[relationsGroupId]=${groupId}`;
const { data, isLoading, error, reload } = useFetch(url);
const [showModal, setShowModal] = useState(false);
@@ -39,13 +39,13 @@ export default function RelationsByGroup({ group, reloader }) {
};

const onSaveListHandler = async (body, id = null) => {
const saveUrl = `${listUrl}/${id}`;
const saveUrl = `/relations-groups/${id}`;
await api.patch(saveUrl, body).then(() => { notice(saveSuccess); reloader(); }).catch(() => notice(saveError));
return setShowListModal(false);
};

const onDeleteListHandler = async (id) => {
await api.delete(`${listUrl}/${id}`)
await api.delete(`/relations-groups/${id}`)
.then(() => { notice(deleteSuccess); reloader(); })
.catch(() => notice(deleteError));
return setShowListModal(false);
43 changes: 29 additions & 14 deletions src/components/blocs/relations-by-tag/index.js
Original file line number Diff line number Diff line change
@@ -12,6 +12,19 @@ import useNotice from '../../../hooks/useNotice';
import Map from '../../map/auto-bound-map';
import { deleteError, saveError, saveSuccess, deleteSuccess } from '../../../utils/notice-contents';

const getMarkers = (structures) => structures.map((element) => {
const { coordinates } = element.currentLocalisation.geometry;
const markersCoordinates = [...coordinates];
const reversed = markersCoordinates.reverse();
return ({
latLng: reversed,
address: `${element.displayName}
${element.currentLocalisation?.address},
${element.currentLocalisation?.postalCode},
${element.currentLocalisation?.locality}`,
});
});

export default function RelationsByTag({ blocName, tag, resourceType, relatedObjectTypes, inverse, noRelationType, Form, sort }) {
const queryObject = inverse ? 'relatedObjectId' : 'resourceId';
const { notice } = useNotice();
@@ -61,19 +74,19 @@ export default function RelationsByTag({ blocName, tag, resourceType, relatedObj
const renderCards = () => {
const relatedKey = inverse ? 'resource' : 'relatedObject';
if (!data && !data?.data?.length) return null;
const structures = data.data.filter((element) => (element[relatedKey]?.collection === 'structures' && element[relatedKey]?.currentLocalisation?.geometry?.coordinates));
const markers = structures.map((element) => {
const { coordinates } = element[relatedKey].currentLocalisation.geometry;
const markersCoordinates = [...coordinates];
const reversed = markersCoordinates.reverse();
return ({
latLng: reversed,
address: `${element[relatedKey].displayName}
${element[relatedKey].currentLocalisation?.address},
${element[relatedKey].currentLocalisation?.postalCode},
${element[relatedKey].currentLocalisation?.locality}`,
});
});
const relatedStructures = data.data
.filter((element) => (element[relatedKey]?.collection === 'structures'))
.filter((element) => element[relatedKey]?.currentLocalisation?.geometry?.coordinates)
.map((element) => element[[relatedKey]]);
const relatedMarkers = getMarkers(relatedStructures);
const associatedStructures = data.data
.map((element) => element.otherAssociatedObjects)
.filter((element) => (element?.length > 0))
.flat()
.filter((element) => element.collection === 'structures')
.filter((element) => element?.currentLocalisation?.geometry?.coordinates);
const associatedStructuresMarkers = getMarkers(associatedStructures);

const currentRelations = data?.data
.filter((relation) => (!relation.endDate || (new Date(relation.endDate) >= new Date())))
.map((relation) => ({ ...relation, current: true }));
@@ -90,7 +103,9 @@ export default function RelationsByTag({ blocName, tag, resourceType, relatedObj
onEdit={() => onOpenModalHandler(element)}
/>
));
if (structures.length) {

const markers = [...relatedMarkers, ...associatedStructuresMarkers];
if (markers.length) {
return (
<Row gutters>
<Col n="12">
6 changes: 5 additions & 1 deletion src/components/card/key-value-card.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Icon } from '@dataesr/react-dsfr';
import { Badge, Icon } from '@dataesr/react-dsfr';
import PropTypes from 'prop-types';
import { Link as RouterLink } from 'react-router-dom';

@@ -17,6 +17,7 @@ export default function KeyValueCard({
onEdit,
titleAsText,
tooltip,
inactive,
}) {
const { editMode } = useEditMode();

@@ -51,6 +52,7 @@ export default function KeyValueCard({
title={tooltip}
/>
)}
{inactive && <Badge isSmall text="inactif" />}
</p>
</div>
{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,
};
2 changes: 1 addition & 1 deletion src/components/download/file.js
Original file line number Diff line number Diff line change
@@ -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) => {
54 changes: 30 additions & 24 deletions src/components/errors/index.js
Original file line number Diff line number Diff line change
@@ -1,55 +1,61 @@
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';

function Error500() {
return (
<>
<h1>Erreur inattendue</h1>
<p className="fr-text--sm fr-mb-3w">Erreur 500</p>
<p className="fr-text--lead fr-mb-3w">Essayez de rafraichir la page ou bien ressayez plus tard.</p>
<p className="fr-text--sm fr-mb-5w">
<Title as="h1" look="h1">Erreur inattendue</Title>
<Text size="sm" className="fr-mb-3w">Erreur 500</Text>
<Text size="lead" className="fr-mb-3w">Essayez de rafraîchir la page ou bien réessayez plus tard.</Text>
<Text size="sm" className="fr-mb-5w">
Désolé, le service rencontre un problème, nous travaillons pour le résoudre le plus rapidement possible.
</p>
</Text>
</>
);
}
function Error404() {
return (
<>
<h1>Page non trouvée</h1>
<p className="fr-text--sm fr-mb-3w">Erreur 404</p>
<p className="fr-text--lead fr-mb-3w">La page que vous cherchez est introuvable. Excusez-nous pour la gène occasionnée.</p>
<p className="fr-text--sm fr-mb-5w">
Si vous avez tapé l'adresse web dans le navigateur, vérifiez qu'elle est correcte. La page nest peut-être plus disponible.
<Title as="h1" look="h1">Page non trouvée</Title>
<Text size="sm" className="fr-mb-3w">Erreur 404</Text>
<Text size="lead" className="fr-mb-3w">La page que vous cherchez est introuvable. Excusez-nous pour la gêne occasionnée.</Text>
<Text size="sm" className="fr-mb-5w">
Si vous avez tapé l'adresse web dans le navigateur, vérifiez qu'elle est correcte. La page n'est peut-être plus disponible.
<br />
Dans ce cas, pour continuer votre visite vous pouvez consulter notre page daccueil, 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.
<br />
Sinon contactez-nous pour que lon puisse vous rediriger vers la bonne information.
</p>
Sinon contactez-nous pour que l'on puisse vous rediriger vers la bonne information.
</Text>
</>
);
}

export default function Error({ status }) {
return (
<div className="fr-container">
<div className="fr-my-7w fr-mt-md-12w fr-mb-md-10w fr-grid-row fr-grid-row--gutters fr-grid-row--middle fr-grid-row--center">
<div className="fr-py-0 fr-col-12 fr-col-md-6">
{['400', '404'].includes(status) ? <Error404 /> : <Error500 />}
<ul className="fr-btns-group fr-btns-group--inline-md">
<Container>
<Row gutters alignItems="center" justifyContent="middle" spacing="my-7w mt-md-12w mb-md-10w">
<Col spacing="py-0" n="12 md-6">
{['400', '404', '403', '401'].includes(status) ? <Error404 /> : <Error500 />}
<ButtonGroup isInlineFrom="sm">
<li>
<Link className="fr-btn fr-btn--primary" to="/">
Retour à l'accueil
</Link>
</li>
<li>
<Link className="fr-btn fr-btn--secondary" to="/nous-contacter">
Contactez-nous
</Link>
</li>
</ul>
</div>
<div className="fr-col-12 fr-col-md-3 fr-col-offset-md-1 fr-px-6w fr-px-md-0 fr-py-0">
</ButtonGroup>
</Col>
<Col spacing="px-6w px-md-0 py-0" offset="md-1" n="12 md-3">
<TechErrorSVG />
</div>
</div>
</div>
</Col>
</Row>
</Container>
);
}

11 changes: 6 additions & 5 deletions src/components/forms/category-term/index.js
Original file line number Diff line number Diff line change
@@ -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,
};
Loading

0 comments on commit c832a6c

Please sign in to comment.