From fcf6e8ef03054485ee45abb3c2ff8c1e9147fbb1 Mon Sep 17 00:00:00 2001 From: Arthur L-Brjc Date: Wed, 18 Dec 2024 10:58:41 +0100 Subject: [PATCH 1/2] fix: eslint --- components/ConfirmationUpdateRdvModal.tsx | 3 +-- .../jeune/BeneficiairesMultiselectAutocomplete.tsx | 7 +++---- components/jeune/TableauBeneficiaires.tsx | 3 +-- components/rdv/OngletAgendaEtablissement.tsx | 3 +-- components/ui/Navigation/Tab.tsx | 3 +-- components/ui/SelecteurPeriode.tsx | 5 ++--- eslint.config.mjs | 9 ++++++++- 7 files changed, 17 insertions(+), 16 deletions(-) diff --git a/components/ConfirmationUpdateRdvModal.tsx b/components/ConfirmationUpdateRdvModal.tsx index 32c80026e..6902a916c 100644 --- a/components/ConfirmationUpdateRdvModal.tsx +++ b/components/ConfirmationUpdateRdvModal.tsx @@ -1,9 +1,8 @@ import { useRef } from 'react' -import IconComponent, { IconName } from './ui/IconComponent' - import Modal, { ModalHandles } from 'components/Modal' import Button, { ButtonStyle } from 'components/ui/Button/Button' +import IconComponent, { IconName } from 'components/ui/IconComponent' interface ConfirmationUpdateRdvModalProps { onConfirmation: () => void diff --git a/components/jeune/BeneficiairesMultiselectAutocomplete.tsx b/components/jeune/BeneficiairesMultiselectAutocomplete.tsx index f7882cbc0..e1df9dede 100644 --- a/components/jeune/BeneficiairesMultiselectAutocomplete.tsx +++ b/components/jeune/BeneficiairesMultiselectAutocomplete.tsx @@ -1,8 +1,7 @@ import React, { ReactElement, useEffect, useRef, useState } from 'react' -import { ButtonStyle } from '../ui/Button/Button' -import ButtonLink from '../ui/Button/ButtonLink' - +import { ButtonStyle } from 'components/ui/Button/Button' +import ButtonLink from 'components/ui/Button/ButtonLink' import { InputError } from 'components/ui/Form/InputError' import Label from 'components/ui/Form/Label' import Multiselection from 'components/ui/Form/Multiselection' @@ -307,7 +306,7 @@ export default function BeneficiairesMultiselectAutocomplete({

{typeSelection} ({countBeneficiairesUniques()}) {lienExport && trackExport && ( diff --git a/components/jeune/TableauBeneficiaires.tsx b/components/jeune/TableauBeneficiaires.tsx index 4edfa47d3..6901ba020 100644 --- a/components/jeune/TableauBeneficiaires.tsx +++ b/components/jeune/TableauBeneficiaires.tsx @@ -2,10 +2,9 @@ import { DateTime } from 'luxon' import dynamic from 'next/dynamic' import React, { ForwardedRef, forwardRef, useEffect, useState } from 'react' -import SortIcon from '../ui/SortIcon' - import EmptyState from 'components/EmptyState' import { IllustrationName } from 'components/ui/IllustrationComponent' +import SortIcon from 'components/ui/SortIcon' import Pagination from 'components/ui/Table/Pagination' import Table from 'components/ui/Table/Table' import { BeneficiaireAvecInfosComplementaires } from 'interfaces/beneficiaire' diff --git a/components/rdv/OngletAgendaEtablissement.tsx b/components/rdv/OngletAgendaEtablissement.tsx index fb6a43ff2..94895b176 100644 --- a/components/rdv/OngletAgendaEtablissement.tsx +++ b/components/rdv/OngletAgendaEtablissement.tsx @@ -1,13 +1,12 @@ import { DateTime } from 'luxon' import React, { useEffect, useRef, useState } from 'react' -import ResettableTextInput from '../ui/Form/ResettableTextInput' - import EmptyState from 'components/EmptyState' import { AnimationCollectiveRow } from 'components/rdv/AnimationCollectiveRow' import FiltresStatutAnimationsCollectives, { FiltresHandles, } from 'components/rdv/FiltresStatutAnimationsCollectives' +import ResettableTextInput from 'components/ui/Form/ResettableTextInput' import IconComponent, { IconName } from 'components/ui/IconComponent' import { IllustrationName } from 'components/ui/IllustrationComponent' import { SelecteurPeriode } from 'components/ui/SelecteurPeriode' diff --git a/components/ui/Navigation/Tab.tsx b/components/ui/Navigation/Tab.tsx index 5e55bcca4..7b87837ac 100644 --- a/components/ui/Navigation/Tab.tsx +++ b/components/ui/Navigation/Tab.tsx @@ -1,5 +1,4 @@ -import IconComponent, { IconName } from '../IconComponent' - +import IconComponent, { IconName } from 'components/ui/IconComponent' import { Badge } from 'components/ui/Indicateurs/Badge' export interface TabProps { diff --git a/components/ui/SelecteurPeriode.tsx b/components/ui/SelecteurPeriode.tsx index 7be5d8d31..abcfd921f 100644 --- a/components/ui/SelecteurPeriode.tsx +++ b/components/ui/SelecteurPeriode.tsx @@ -1,9 +1,8 @@ import { DateTime } from 'luxon' import React, { ReactElement, useEffect, useRef, useState } from 'react' -import Button, { ButtonStyle } from './Button/Button' -import IconComponent, { IconName } from './IconComponent' - +import Button, { ButtonStyle } from 'components/ui/Button/Button' +import IconComponent, { IconName } from 'components/ui/IconComponent' import { toLongMonthDate, toShortDate } from 'utils/date' import { useDebounce } from 'utils/hooks/useDebounce' diff --git a/eslint.config.mjs b/eslint.config.mjs index 8b08c3e82..c7ee51c5c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -29,7 +29,14 @@ const eslintConfig = [ }, 'newlines-between': 'always', - groups: ['builtin', 'external', 'parent', 'sibling', 'index'], + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + ], pathGroupsExcludedImportTypes: ['builtin'], }, ], From 409912ea451d94e7f5d00508069b327926dcfbc4 Mon Sep 17 00:00:00 2001 From: Arthur L-Brjc Date: Wed, 18 Dec 2024 11:10:05 +0100 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20tri=20actions=20pilotage=20par=20da?= =?UTF-8?q?te=20r=C3=A9alisation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/pilotage/OngletActionsPilotage.tsx | 4 +- .../pilotage/TableauActionsAQualifier.tsx | 58 +++++++++++++++--- services/actions.service.ts | 25 ++++---- .../pilotage/PilotagePage.actions.test.tsx | 59 ++++++++++++++----- tests/services/actions.service.test.ts | 33 ++++++++++- 5 files changed, 139 insertions(+), 40 deletions(-) diff --git a/components/pilotage/OngletActionsPilotage.tsx b/components/pilotage/OngletActionsPilotage.tsx index 97445c3a5..da8d664b8 100644 --- a/components/pilotage/OngletActionsPilotage.tsx +++ b/components/pilotage/OngletActionsPilotage.tsx @@ -46,7 +46,9 @@ export default function OngletActionsPilotage({ useState(metadonneesInitiales) const [page, setPage] = useState(1) - const [tri, setTri] = useState() + const [tri, setTri] = useState( + 'REALISATION_CHRONOLOGIQUE' + ) const [filtres, setFiltres] = useState([]) const [erreurQualification, setErreurQualification] = useState< string | undefined diff --git a/components/pilotage/TableauActionsAQualifier.tsx b/components/pilotage/TableauActionsAQualifier.tsx index 802952a5b..cf352b3d3 100644 --- a/components/pilotage/TableauActionsAQualifier.tsx +++ b/components/pilotage/TableauActionsAQualifier.tsx @@ -24,7 +24,7 @@ import { TriActionsAQualifier } from 'services/actions.service' type TableauActionsConseillerProps = { categories: SituationNonProfessionnelle[] actionsFiltrees: ActionPilotage[] - tri: TriActionsAQualifier | undefined + tri: TriActionsAQualifier onTri: (tri: TriActionsAQualifier) => void onFiltres: (categories: string[]) => void onLienExterne: (label: string) => void @@ -69,7 +69,19 @@ export default function TableauActionsAQualifier({ plusieursBeneficiairesSelectionnes function inverserTriBeneficiaires() { - const nouvelOrdre = tri === 'ALPHABETIQUE' ? 'INVERSE' : 'ALPHABETIQUE' + const nouvelOrdre = + tri === 'BENEFICIAIRE_ALPHABETIQUE' + ? 'BENEFICIAIRE_INVERSE' + : 'BENEFICIAIRE_ALPHABETIQUE' + onTri(nouvelOrdre) + setActionsSelectionnees([]) + } + + function inverserTriDateRealisation() { + const nouvelOrdre = + tri === 'REALISATION_CHRONOLOGIQUE' + ? 'REALISATION_ANTICHRONOLOGIQUE' + : 'REALISATION_CHRONOLOGIQUE' onTri(nouvelOrdre) setActionsSelectionnees([]) } @@ -246,18 +258,21 @@ export default function TableauActionsAQualifier({ @@ -271,7 +286,32 @@ export default function TableauActionsAQualifier({ onFiltres={filtrerActionsParCategorie} /> - Date de réalisation + + + Voir le détail diff --git a/services/actions.service.ts b/services/actions.service.ts index a075c77c7..6710b9189 100644 --- a/services/actions.service.ts +++ b/services/actions.service.ts @@ -130,7 +130,11 @@ export async function getActionsAQualifierServerSide( actions: ActionPilotage[] metadonnees: MetadonneesPagination }> { - return getActionsAQualifier(idConseiller, { page: 1 }, accessToken) + return getActionsAQualifier( + idConseiller, + { page: 1, tri: 'REALISATION_CHRONOLOGIQUE' }, + accessToken + ) } export async function creerAction( @@ -280,7 +284,12 @@ async function getActionsBeneficiaire( } } -export type TriActionsAQualifier = 'ALPHABETIQUE' | 'INVERSE' +export type TriActionsAQualifier = + | 'BENEFICIAIRE_ALPHABETIQUE' + | 'BENEFICIAIRE_INVERSE' + | 'REALISATION_CHRONOLOGIQUE' + | 'REALISATION_ANTICHRONOLOGIQUE' + async function getActionsAQualifier( idConseiller: string, { @@ -302,18 +311,10 @@ async function getActionsAQualifier( aQualifier: 'true', }) - if (tri) { - queryParams.append( - 'tri', - tri === 'ALPHABETIQUE' - ? 'BENEFICIAIRE_ALPHABETIQUE' - : 'BENEFICIAIRE_INVERSE' - ) - } + if (tri) queryParams.append('tri', tri) - if (filtres) { + if (filtres) filtres.forEach((filtre) => queryParams.append('codesCategories', filtre)) - } const { content: { pagination, resultats }, diff --git a/tests/pages/pilotage/PilotagePage.actions.test.tsx b/tests/pages/pilotage/PilotagePage.actions.test.tsx index b94dbdb9d..bd6942107 100644 --- a/tests/pages/pilotage/PilotagePage.actions.test.tsx +++ b/tests/pages/pilotage/PilotagePage.actions.test.tsx @@ -171,18 +171,18 @@ describe('PilotagePage client side - Actions', () => { //When await userEvent.click( screen.getByRole('button', { - name: 'Afficher la liste des bénéficiaires triée par noms de famille par ordre alphabétique', + name: 'Afficher la liste des actions triées par bénéficiaire par ordre alphabétique', }) ) // Then expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { page: 1, - tri: 'ALPHABETIQUE', + tri: 'BENEFICIAIRE_ALPHABETIQUE', filtres: [], }) expect( - screen.getByText('Action page 1 ALPHABETIQUE 0filtres') + screen.getByText('Action page 1 BENEFICIAIRE_ALPHABETIQUE 0filtres') ).toBeInTheDocument() }) @@ -190,24 +190,53 @@ describe('PilotagePage client side - Actions', () => { //When await userEvent.click( screen.getByRole('button', { - name: 'Afficher la liste des bénéficiaires triée par noms de famille par ordre alphabétique', + name: 'Afficher la liste des actions triées par bénéficiaire par ordre alphabétique', }) ) await userEvent.click( screen.getByRole('button', { - name: 'Afficher la liste des bénéficiaires triée par noms de famille par ordre alphabétique inversé', + name: 'Afficher la liste des actions triées par bénéficiaire par ordre alphabétique inversé', }) ) // Then expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { page: 1, - tri: 'INVERSE', + tri: 'BENEFICIAIRE_INVERSE', filtres: [], }) expect( - screen.getByText('Action page 1 INVERSE 0filtres') + screen.getByText('Action page 1 BENEFICIAIRE_INVERSE 0filtres') + ).toBeInTheDocument() + }) + it('permet de trier les actions par date de réalisation', async () => { + await userEvent.click( + screen.getByRole('button', { + name: 'Afficher la liste des actions triées par date de réalisation décroissante', + }) + ) + expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { + page: 1, + tri: 'REALISATION_ANTICHRONOLOGIQUE', + filtres: [], + }) + expect( + screen.getByText('Action page 1 REALISATION_ANTICHRONOLOGIQUE 0filtres') + ).toBeInTheDocument() + + await userEvent.click( + screen.getByRole('button', { + name: 'Afficher la liste des actions triées par date de réalisation croissante', + }) + ) + expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { + page: 1, + tri: 'REALISATION_CHRONOLOGIQUE', + filtres: [], + }) + expect( + screen.getByText('Action page 1 REALISATION_CHRONOLOGIQUE 0filtres') ).toBeInTheDocument() }) @@ -216,7 +245,7 @@ describe('PilotagePage client side - Actions', () => { // Given await userEvent.click( screen.getByRole('button', { - name: 'Afficher la liste des bénéficiaires triée par noms de famille par ordre alphabétique', + name: 'Afficher la liste des actions triées par bénéficiaire par ordre alphabétique', }) ) await userEvent.click(screen.getByLabelText('Page 2')) @@ -246,11 +275,11 @@ describe('PilotagePage client side - Actions', () => { // Then expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { page: 1, - tri: 'ALPHABETIQUE', + tri: 'BENEFICIAIRE_ALPHABETIQUE', filtres: ['SNP_1', 'SNP_2'], }) expect( - screen.getByText('Action page 1 ALPHABETIQUE 2filtres') + screen.getByText('Action page 1 BENEFICIAIRE_ALPHABETIQUE 2filtres') ).toBeInTheDocument() }) @@ -261,11 +290,11 @@ describe('PilotagePage client side - Actions', () => { // Then expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { page: 2, - tri: 'ALPHABETIQUE', + tri: 'BENEFICIAIRE_ALPHABETIQUE', filtres: ['SNP_1', 'SNP_2'], }) expect( - screen.getByText('Action page 2 ALPHABETIQUE 2filtres') + screen.getByText('Action page 2 BENEFICIAIRE_ALPHABETIQUE 2filtres') ).toBeInTheDocument() }) }) @@ -274,7 +303,7 @@ describe('PilotagePage client side - Actions', () => { // When await userEvent.click( screen.getByRole('button', { - name: 'Afficher la liste des bénéficiaires triée par noms de famille par ordre alphabétique', + name: 'Afficher la liste des actions triées par bénéficiaire par ordre alphabétique', }) ) await userEvent.click(screen.getByText('Catégorie')) @@ -289,11 +318,11 @@ describe('PilotagePage client side - Actions', () => { // Then expect(getActionsAQualifierClientSide).toHaveBeenCalledWith('1', { page: 2, - tri: 'ALPHABETIQUE', + tri: 'BENEFICIAIRE_ALPHABETIQUE', filtres: ['SNP_1'], }) expect( - screen.getByText('Action page 2 ALPHABETIQUE 1filtres') + screen.getByText('Action page 2 BENEFICIAIRE_ALPHABETIQUE 1filtres') ).toBeInTheDocument() }) diff --git a/tests/services/actions.service.test.ts b/tests/services/actions.service.test.ts index 764a1aecd..32df64420 100644 --- a/tests/services/actions.service.test.ts +++ b/tests/services/actions.service.test.ts @@ -451,7 +451,7 @@ describe('ActionsApiService', () => { }) describe('.getActionsAQualifierClientSide', () => { - it('renvoie les actions du conseiller à qualifier', async () => { + it('renvoie les actions du conseiller à qualifier triées par bénéficiaire', async () => { // GIVEN ;(apiGet as jest.Mock).mockResolvedValue({ content: { @@ -463,7 +463,7 @@ describe('ActionsApiService', () => { // WHEN const actual = await getActionsAQualifierClientSide('whatever', { page: 1, - tri: 'ALPHABETIQUE', + tri: 'BENEFICIAIRE_ALPHABETIQUE', filtres: ['SANTE', 'EMPLOI'], }) @@ -477,6 +477,33 @@ describe('ActionsApiService', () => { metadonnees: { nombrePages: 1, nombreTotal: 5 }, }) }) + + it('renvoie les actions du conseiller à qualifier triées par date de réalisation', async () => { + // GIVEN + ;(apiGet as jest.Mock).mockResolvedValue({ + content: { + resultats: uneListeDActionsAQualifierJson(), + pagination: { total: 5, limit: 10 }, + }, + }) + + // WHEN + const actual = await getActionsAQualifierClientSide('whatever', { + page: 1, + tri: 'REALISATION_ANTICHRONOLOGIQUE', + filtres: ['SANTE', 'EMPLOI'], + }) + + // THEN + expect(apiGet).toHaveBeenCalledWith( + '/v2/conseillers/whatever/actions?page=1&aQualifier=true&tri=REALISATION_ANTICHRONOLOGIQUE&codesCategories=SANTE&codesCategories=EMPLOI', + 'accessToken' + ) + expect(actual).toStrictEqual({ + actions: uneListeDActionsAQualifier(), + metadonnees: { nombrePages: 1, nombreTotal: 5 }, + }) + }) }) describe('.getActionsAQualifierServerSide', () => { @@ -497,7 +524,7 @@ describe('ActionsApiService', () => { // THEN expect(apiGet).toHaveBeenCalledWith( - '/v2/conseillers/whatever/actions?page=1&aQualifier=true', + '/v2/conseillers/whatever/actions?page=1&aQualifier=true&tri=REALISATION_CHRONOLOGIQUE', 'accessToken' ) expect(actual).toStrictEqual({