diff --git a/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.locale.tsx b/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.locale.tsx index 31ef0019..cca5aed5 100644 --- a/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.locale.tsx +++ b/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.locale.tsx @@ -15,6 +15,7 @@ const { i18n } = declareComponentKeys< | { K: "sandbox_datastore_explanation"; R: ReactNode } | "refresh_datasheet_list" | { K: "last_refresh_date"; P: { dataUpdatedAt: number }; R: string } + | { K: "nb_results"; P: { nb: number }; R: string } | "filter_label" | "filter_placeholder" | { K: "filter_option"; P: { filter: FilterEnum }; R: string } @@ -43,10 +44,13 @@ export const DatasheetListFrTranslations: Translations<"fr">["DatasheetList"] = ), refresh_datasheet_list: "Rafraîchir", last_refresh_date: ({ dataUpdatedAt }) => `Données mises à jour le ${formatDateFromISO(new Date(dataUpdatedAt).toISOString())}`, + nb_results: ({ nb }) => `(${nb}) résultats`, filter_label: "Filtrer", filter_placeholder: "Sélectionner un filtre", filter_option: ({ filter }) => { switch (filter) { + case FilterEnum.ALL: + return "Toutes les fiches"; case FilterEnum.PUBLISHED: return "Fiches publiées"; case FilterEnum.NOT_PUBLISHED: @@ -60,21 +64,21 @@ export const DatasheetListFrTranslations: Translations<"fr">["DatasheetList"] = sort_option: ({ sort }) => { switch (sort) { case SortByEnum.NAME: - return "Nom"; + return "Trier par : Nom"; case SortByEnum.NB_SERVICES: - return "Fiches publiées"; + return "Trier par : Nombre de services publiés"; default: return "Tri inconnu"; } }, - sort_order_label: "Trier", - sort_order_placeholder: "Dans l'ordre", + sort_order_label: "Ordre de tri", + sort_order_placeholder: "Ordre", sort_order_option: ({ sortOrder }) => { switch (sortOrder) { case SortOrderEnum.ASCENDING: - return "Croissant"; + return "Ordre : Croissant"; case SortOrderEnum.DESCENDING: - return "Décroissant"; + return "Ordre : Décroissant"; default: return "Ordre inconnu"; } @@ -91,6 +95,7 @@ export const DatasheetListEnTranslations: Translations<"en">["DatasheetList"] = sandbox_datastore_explanation: undefined, refresh_datasheet_list: undefined, last_refresh_date: undefined, + nb_results: undefined, filter_label: undefined, filter_placeholder: undefined, filter_option: undefined, diff --git a/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.tsx b/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.tsx index a222de10..66bb863d 100644 --- a/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.tsx +++ b/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.tsx @@ -1,12 +1,12 @@ import { fr } from "@codegouvfr/react-dsfr"; import Alert from "@codegouvfr/react-dsfr/Alert"; import ButtonsGroup from "@codegouvfr/react-dsfr/ButtonsGroup"; +import Checkbox from "@codegouvfr/react-dsfr/Checkbox"; import Pagination from "@codegouvfr/react-dsfr/Pagination"; import SearchBar from "@codegouvfr/react-dsfr/SearchBar"; import SelectNext from "@codegouvfr/react-dsfr/SelectNext"; -import Tag from "@codegouvfr/react-dsfr/Tag"; import { useQuery } from "@tanstack/react-query"; -import { FC, useMemo, useState } from "react"; +import { ChangeEvent, FC, useMemo, useState } from "react"; import { Datasheet, EndpointTypeEnum } from "../../../../@types/app"; import Main from "../../../../components/Layout/Main"; @@ -91,8 +91,18 @@ const DatasheetList: FC = ({ datastoreId }) => { const datasheetList = getSortedList(getFilteredList(datasheetListQuery.data ?? [], filters, searchDatasheetName), sort); + function toggleFilter(e: ChangeEvent): void { + const selectedFilter = Number(e.currentTarget.value); + + if (isNaN(selectedFilter) || selectedFilter === 0) return; + + setFilters((prev) => (prev.includes(selectedFilter) ? prev.filter((f) => f !== selectedFilter) : [...prev, selectedFilter])); + e.currentTarget.value = ""; + routes.datasheet_list({ datastoreId }).replace(); + } + return ( -
+

@@ -157,128 +167,116 @@ const DatasheetList: FC = ({ datastoreId }) => {

- {/*
-
- -
-
*/} - -
-
- +
+ {t("filter_label")}} options={[ { - value: FilterEnum.PUBLISHED.toString(), + label: t("filter_option", { filter: FilterEnum.ALL }), + nativeInputProps: { + value: FilterEnum.ALL.toString(), + checked: filters.length === 0, + onChange: () => { + setFilters([]); + routes.datasheet_list({ datastoreId }).replace(); + }, + }, + }, + { label: t("filter_option", { filter: FilterEnum.PUBLISHED }), + nativeInputProps: { + value: FilterEnum.PUBLISHED.toString(), + checked: filters.includes(FilterEnum.PUBLISHED), + onChange: toggleFilter, + }, }, { - value: FilterEnum.NOT_PUBLISHED.toString(), label: t("filter_option", { filter: FilterEnum.NOT_PUBLISHED }), + nativeInputProps: { + value: FilterEnum.NOT_PUBLISHED.toString(), + checked: filters.includes(FilterEnum.NOT_PUBLISHED), + onChange: toggleFilter, + }, }, ]} - nativeSelectProps={{ - "aria-label": t("filter_label"), - onClick: (e) => { - const selectedFilter = Number(e.currentTarget.value); - if (isNaN(selectedFilter) || selectedFilter === 0) return; - - setFilters((prev) => (prev.includes(selectedFilter) ? [...prev] : [...prev, selectedFilter])); - e.currentTarget.value = ""; - routes.datasheet_list({ datastoreId }).replace(); - }, - }} - placeholder={t("filter_placeholder")} />
-
-
    - {filters.map((filter) => ( -
  • - { - setFilters((prev) => prev.filter((f) => f !== filter)); - routes.datasheet_list({ datastoreId }).replace(); - }, - }} - > - {t("filter_option", { filter: Number(filter) })} - -
  • - ))} -
-
-
-
-
- { - const selectedSortBy = Number(e.currentTarget.value); +
+
+
+ {t("nb_results", { nb: datasheetList.length })} +
+
+ { + const selectedSortBy = Number(e.currentTarget.value); - if (isNaN(selectedSortBy) || selectedSortBy === 0) return; - setSort((prev) => ({ ...prev, by: selectedSortBy })); - }, - }} - placeholder={t("sort_placeholder")} - /> -
-
- { - const selectedSortOrder = Number(e.currentTarget.value); - if (isNaN(selectedSortOrder) || selectedSortOrder === 0) return; - setSort((prev) => ({ ...prev, order: selectedSortOrder })); - }, - }} - placeholder={t("sort_order_placeholder")} - /> -
-
+ if (isNaN(selectedSortBy) || selectedSortBy === 0) return; + setSort((prev) => ({ ...prev, by: selectedSortBy })); + }, + }} + placeholder={t("sort_placeholder")} + /> +
+
+ { + const selectedSortOrder = Number(e.currentTarget.value); + if (isNaN(selectedSortOrder) || selectedSortOrder === 0) return; + setSort((prev) => ({ ...prev, order: selectedSortOrder })); + }, + }} + placeholder={t("sort_order_placeholder")} + /> +
+
- {datasheetList - ?.slice((pagination.page - 1) * pagination.limit, pagination.page * pagination.limit) - .map((datasheet: Datasheet) => )} +
-
- ({ - ...routes.datasheet_list({ datastoreId, page: pageNumber, limit: pagination.limit }).link, - })} - defaultPage={pagination.page} - /> + {datasheetList + ?.slice((pagination.page - 1) * pagination.limit, pagination.page * pagination.limit) + .map((datasheet: Datasheet) => )} + +
+ ({ + ...routes.datasheet_list({ datastoreId, page: pageNumber, limit: pagination.limit }).link, + })} + defaultPage={pagination.page} + /> +
+
)} diff --git a/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.types.tsx b/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.types.tsx index 4b780274..f05028d3 100644 --- a/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.types.tsx +++ b/assets/entrepot/pages/datasheet/DatasheetList/DatasheetList.types.tsx @@ -1,4 +1,5 @@ export enum FilterEnum { + ALL = 0, PUBLISHED = 1, NOT_PUBLISHED = 2, }