diff --git a/packages/applications/ssr/src/components/molecules/Search.tsx b/packages/applications/ssr/src/components/molecules/Search.tsx index 84b9391c87..018555c205 100644 --- a/packages/applications/ssr/src/components/molecules/Search.tsx +++ b/packages/applications/ssr/src/components/molecules/Search.tsx @@ -1,3 +1,4 @@ +'use client'; import assert from 'assert'; import SearchBar from '@codegouvfr/react-dsfr/SearchBar'; diff --git a/packages/applications/ssr/src/components/organisms/List.tsx b/packages/applications/ssr/src/components/organisms/List.tsx index 55e08f4f46..129151b9ee 100644 --- a/packages/applications/ssr/src/components/organisms/List.tsx +++ b/packages/applications/ssr/src/components/organisms/List.tsx @@ -1,9 +1,7 @@ -'use client'; -import { usePathname, useSearchParams } from 'next/navigation'; import { FC } from 'react'; -import { Pagination } from './Pagination'; import { Tile } from './Tile'; +import { ListPagination } from './ListPagination'; type ListProps = { items: Array; @@ -20,16 +18,6 @@ export const List = ({ itemsPerPage, ItemComponent, }: ListProps) => { - const pathname = usePathname(); - const searchParams = useSearchParams(); - const pageCount = Math.ceil(totalItems / itemsPerPage); - - const getPageUrl = (pageToGo: number): string => { - const urlSearchParams = new URLSearchParams(searchParams); - urlSearchParams.set('page', pageToGo.toString()); - return `${pathname}${urlSearchParams.size > 0 ? `?${urlSearchParams.toString()}` : ''}`; - }; - return ( <>
    @@ -41,8 +29,11 @@ export const List = ({ ))}
- - + ); }; diff --git a/packages/applications/ssr/src/components/organisms/ListHeader.tsx b/packages/applications/ssr/src/components/organisms/ListHeader.tsx index fba04d1361..2e7ad2a1e8 100644 --- a/packages/applications/ssr/src/components/organisms/ListHeader.tsx +++ b/packages/applications/ssr/src/components/organisms/ListHeader.tsx @@ -3,31 +3,44 @@ import Tag from '@codegouvfr/react-dsfr/Tag'; import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { FC } from 'react'; +import { ListFiltersProps } from './ListFilters'; + export type ListHeaderProps = { - tagFilters: Array<{ - label: string; - searchParamKey: string; - }>; + filters: ListFiltersProps['filters']; totalCount: number; }; -export const ListHeader: FC = ({ tagFilters, totalCount }) => { - const currentSearchParams = useSearchParams(); - const searchParams = tagFilters.reduce((urlSearchParams, { searchParamKey }) => { - if (currentSearchParams.has(searchParamKey)) { - urlSearchParams.set(searchParamKey, currentSearchParams.get(searchParamKey) ?? ''); - } - - return urlSearchParams; - }, new URLSearchParams()); - +export const ListHeader: FC = ({ filters, totalCount }) => { + const searchParams = useSearchParams(); const pathname = usePathname(); const router = useRouter(); - const onClick = (tagName: string) => { - searchParams.delete(tagName); + const tagFilters = filters.reduce( + (allFilters, { searchParamKey, label, options }) => { + const currentFilterValue = searchParams.get(searchParamKey); + if (!currentFilterValue) { + return allFilters; + } + return [ + ...allFilters, + { + label: `${label}: ${options.find((x) => x.value === currentFilterValue)?.label}`, + searchParamKey, + }, + ]; + }, + [] as { label: string; searchParamKey: string }[], + ); - const url = `${pathname}${searchParams.size > 0 ? `?${searchParams.toString()}` : ''}`; + const onClick = (tagName: string) => { + const newSearchParams = tagFilters.reduce((urlSearchParams, { searchParamKey }) => { + if (searchParams.has(searchParamKey)) { + urlSearchParams.set(searchParamKey, searchParams.get(searchParamKey) ?? ''); + } + return urlSearchParams; + }, new URLSearchParams()); + newSearchParams.delete(tagName); + const url = `${pathname}${newSearchParams.size > 0 ? `?${newSearchParams.toString()}` : ''}`; router.push(url); }; diff --git a/packages/applications/ssr/src/components/organisms/ListPagination.tsx b/packages/applications/ssr/src/components/organisms/ListPagination.tsx new file mode 100644 index 0000000000..c913c42b0c --- /dev/null +++ b/packages/applications/ssr/src/components/organisms/ListPagination.tsx @@ -0,0 +1,30 @@ +'use client'; + +import { usePathname, useSearchParams } from 'next/navigation'; +import { FC } from 'react'; + +import { Pagination } from './Pagination'; + +type ListPaginationProps = { + currentPage: number; + totalItems: number; + itemsPerPage: number; +}; + +export const ListPagination: FC = ({ + currentPage, + itemsPerPage, + totalItems, +}) => { + const pathname = usePathname(); + const searchParams = useSearchParams(); + const pageCount = Math.ceil(totalItems / itemsPerPage); + + const getPageUrl = (pageToGo: number): string => { + const urlSearchParams = new URLSearchParams(searchParams); + urlSearchParams.set('page', pageToGo.toString()); + return `${pathname}${urlSearchParams.size > 0 ? `?${urlSearchParams.toString()}` : ''}`; + }; + + return ; +}; diff --git "a/packages/applications/ssr/src/components/pages/attestation-conformit\303\251/transmettre/transmettreAttestationConformit\303\251.page.tsx" "b/packages/applications/ssr/src/components/pages/attestation-conformit\303\251/transmettre/transmettreAttestationConformit\303\251.page.tsx" index 83fefd2a19..54a8e5201a 100644 --- "a/packages/applications/ssr/src/components/pages/attestation-conformit\303\251/transmettre/transmettreAttestationConformit\303\251.page.tsx" +++ "b/packages/applications/ssr/src/components/pages/attestation-conformit\303\251/transmettre/transmettreAttestationConformit\303\251.page.tsx" @@ -1,5 +1,3 @@ -'use client'; - import { FC } from 'react'; import { PageTemplate } from '@/components/templates/Page.template'; diff --git "a/packages/applications/ssr/src/components/pages/r\303\251seau/gestionnaire/lister/GestionnaireR\303\251seauList.page.tsx" "b/packages/applications/ssr/src/components/pages/r\303\251seau/gestionnaire/lister/GestionnaireR\303\251seauList.page.tsx" index 8938882074..d8815145ff 100644 --- "a/packages/applications/ssr/src/components/pages/r\303\251seau/gestionnaire/lister/GestionnaireR\303\251seauList.page.tsx" +++ "b/packages/applications/ssr/src/components/pages/r\303\251seau/gestionnaire/lister/GestionnaireR\303\251seauList.page.tsx" @@ -1,5 +1,3 @@ -'use client'; - import { FC } from 'react'; import { Routes } from '@potentiel-applications/routes'; diff --git "a/packages/applications/ssr/src/components/pages/t\303\242che/T\303\242cheList.page.tsx" "b/packages/applications/ssr/src/components/pages/t\303\242che/T\303\242cheList.page.tsx" index fc2fdf16d8..ee939922bb 100644 --- "a/packages/applications/ssr/src/components/pages/t\303\242che/T\303\242cheList.page.tsx" +++ "b/packages/applications/ssr/src/components/pages/t\303\242che/T\303\242cheList.page.tsx" @@ -1,5 +1,3 @@ -'use client'; - import { FC } from 'react'; import { ListerTâchesReadModel } from '@potentiel-domain/tache'; diff --git a/packages/applications/ssr/src/components/templates/ListPage.template.tsx b/packages/applications/ssr/src/components/templates/ListPage.template.tsx index da1804edb1..1c3cffc5e6 100644 --- a/packages/applications/ssr/src/components/templates/ListPage.template.tsx +++ b/packages/applications/ssr/src/components/templates/ListPage.template.tsx @@ -1,6 +1,3 @@ -'use client'; - -import { useSearchParams } from 'next/navigation'; import { FC } from 'react'; import { LinkAction } from '../atoms/LinkAction'; @@ -38,29 +35,6 @@ export const ListPageTemplate = ({ totalItems, search, }: ListPageTemplateProps) => { - /** - * Use search params as key for the ListFilters component - * This will force react to mount again this component - * when the search params changed - */ - const listFiltersKey = new URLSearchParams(useSearchParams()).toString(); - const searchParams = useSearchParams(); - const tagFilters = filters.reduce( - (allFilters, { searchParamKey, label, options }) => { - const currentFilterValue = searchParams.get(searchParamKey); - if (!currentFilterValue) { - return allFilters; - } - return [ - ...allFilters, - { - label: `${label}: ${options.find((x) => x.value === currentFilterValue)?.label}`, - searchParamKey, - }, - ]; - }, - [] as { label: string; searchParamKey: string }[], - ); return ( {heading}}>
@@ -77,7 +51,7 @@ export const ListPageTemplate = ({ ))} ) : null} - {filters.length ? : null} + {filters.length ? : null}
@@ -87,7 +61,7 @@ export const ListPageTemplate = ({
- +
{items.length ? (