diff --git a/src/ui/i18n.tsx b/src/ui/i18n.tsx index c8e9e2e5..bce7d163 100644 --- a/src/ui/i18n.tsx +++ b/src/ui/i18n.tsx @@ -285,7 +285,7 @@ const { "filtersButton": "Filters", "organizationLabel": "Organization", "categoriesLabel": "Categories", - "contextLabel": "Context of use", + "environnement label": "Usage environnement ", "prerogativesLabel": "Prerogatives", "filters": "Filters", "isInstallableOnUserTerminal": "Can be installed on user terminal", @@ -294,7 +294,12 @@ const { "isPresentInSupportContract": "Is present in support contract", "isTestable": "Is testable", "organization filter hint": - "Only show software that have at least one referent from a given organization" + "Only show software that have at least one referent from a given organization", + "linux": "GNU/Linux", + "mac": "MacOS", + "windows": "Windows", + "browser": "Web browser", + "stack": "Library, Framework and other technical building blocks" }, "SoftwareDetails": { "catalog breadcrumb": "Software catalog", @@ -670,7 +675,7 @@ const { "filtersButton": "Filtres", "organizationLabel": "Organization", "categoriesLabel": "Catégories", - "contextLabel": "Contexte d'usage", + "environnement label": "Environement d'utilisation", "prerogativesLabel": "Prérogatives", "filters": "Filtres", "isInstallableOnUserTerminal": "Installable sur un poste agent", @@ -679,7 +684,13 @@ const { "isPresentInSupportContract": "Présent dans le marché de support", "isTestable": "Est essayable", "organization filter hint": - "Afficher uniquement les logiciels aillant au mois référent dans une organisation donnée" + "Afficher uniquement les logiciels aillant au mois référent dans une organisation donnée", + "linux": undefined, + "mac": undefined, + "windows": undefined, + "browser": "Navigateur internet (Ex: Jupiter Notebook)", + "stack": + "Biblothèques, frameworks et autre briques techniques (Ex: Angular, Ngnix, etc.)" }, "SoftwareDetails": { "catalog breadcrumb": "Le catalogue de logiciel", diff --git a/src/ui/pages/softwareCatalog/Search.tsx b/src/ui/pages/softwareCatalog/Search.tsx index 2ea0db2f..a365d13d 100644 --- a/src/ui/pages/softwareCatalog/Search.tsx +++ b/src/ui/pages/softwareCatalog/Search.tsx @@ -1,10 +1,9 @@ -import React, { useState } from "react"; +import { useState } from "react"; import { makeStyles } from "@codegouvfr/react-dsfr/tss"; import { SearchBar } from "@codegouvfr/react-dsfr/SearchBar"; import { Button } from "@codegouvfr/react-dsfr/Button"; import { fr } from "@codegouvfr/react-dsfr"; import { declareComponentKeys } from "i18nifty"; -import { Select } from "@codegouvfr/react-dsfr/Select"; import { assert } from "tsafe/assert"; import { Equals } from "tsafe"; import { useTranslation } from "ui/i18n"; @@ -15,44 +14,68 @@ import MenuItem from "@mui/material/MenuItem"; import SelectMui from "@mui/material/Select"; import { InputBase } from "@mui/material"; import Tooltip from "@mui/material/Tooltip"; +import { SelectNext } from "ui/shared/SelectNext"; export type Props = { className?: string; + search: string; onSearchChange: (search: string) => void; - organizations: { organization: string; softwareCount: number }[]; + + organizationOptions: { + organization: string; + softwareCount: number; + }[]; + organization: string | undefined; onOrganizationChange: (organization: string | undefined) => void; - selectedOrganization: string | undefined; - categories: { category: string; softwareCount: number }[]; - onCategoriesChange: (category: string | undefined) => void; - selectedCategories: string | undefined; - environments: { environment: Environment; softwareCount: number }[]; - onEnvironmentsChange: (environmentsFilter: Environment | undefined) => void; - selectedEnvironment: string | undefined; - prerogatives: { prerogative: Prerogative; softwareCount: number }[]; - onPrerogativesChange: (prerogatives: Prerogative[]) => void; - selectedPrerogatives: Prerogative[]; - onResetFilters: () => void; + + categoryOptions: { + category: string; + softwareCount: number; + }[]; + category: string | undefined; + onCategoryChange: (category: string | undefined) => void; + + environmentOptions: { + environment: SoftwareCatalogState.Environment; + softwareCount: number; + }[]; + environment: SoftwareCatalogState.Environment | undefined; + onEnvironmentChange: ( + environmentsFilter: SoftwareCatalogState.Environment | undefined + ) => void; + + prerogativesOptions: { + prerogative: SoftwareCatalogState.Prerogative; + softwareCount: number; + }[]; + prerogatives: SoftwareCatalogState.Prerogative[]; + onPrerogativesChange: (prerogatives: SoftwareCatalogState.Prerogative[]) => void; }; export function Search(props: Props) { const { className, + search, onSearchChange, - organizations, + + organizationOptions, + organization, onOrganizationChange, - selectedOrganization, - categories, - onCategoriesChange, - selectedCategories, - environments, - onEnvironmentsChange, - selectedEnvironment, + + categoryOptions, + category, + onCategoryChange, + + environmentOptions, + environment, + onEnvironmentChange, + + prerogativesOptions, prerogatives, onPrerogativesChange, - selectedPrerogatives, - onResetFilters, + ...rest } = props; @@ -62,27 +85,10 @@ export function Search(props: Props) { const [areFiltersOpen, setAreFiltersOpen] = useState(false); const { t } = useTranslation({ Search }); - const { t: tCommon } = useTranslation({ "App": "App" }); + const { t: tCommon } = useTranslation({ "App": undefined }); const { classes, cx } = useStyles(); - const onClickFilters = () => { - if (areFiltersOpen) { - onResetFilters(); - } - setAreFiltersOpen(!areFiltersOpen); - }; - - const mappedPrerogativesOption: { - [key in SoftwareCatalogState.Prerogative]: string; - } = { - "doRespectRgaa": t("doRespectRgaa"), - "isFromFrenchPublicServices": t("isFromFrenchPublicServices"), - "isInstallableOnUserTerminal": t("isInstallableOnUserTerminal"), - "isTestable": t("isTestable"), - "isPresentInSupportContract": t("isPresentInSupportContract") - }; - return (
@@ -100,7 +106,15 @@ export function Search(props: Props) { areFiltersOpen ? "ri-arrow-up-s-fill" : "ri-arrow-down-s-fill" } iconPosition="right" - onClick={onClickFilters} + onClick={() => { + if (areFiltersOpen) { + onOrganizationChange(undefined); + onCategoryChange(undefined); + onEnvironmentChange(undefined); + onPrerogativesChange([]); + } + setAreFiltersOpen(!areFiltersOpen); + }} aria-expanded="false" aria-controls="accordion-filters" > @@ -109,7 +123,8 @@ export function Search(props: Props) {
- - - + options={[ + { + "label": tCommon("allFeminine"), + "value": "" as const + }, + ...environmentOptions.map( + ({ environment, softwareCount }) => ({ + "value": environment, + "label": `${(() => { + switch (environment) { + case "browser": + return t("browser"); + case "linux": + return t("linux"); + case "mac": + return t("mac"); + case "stack": + return t("stack"); + case "windows": + return t("windows"); + } + })()} (${softwareCount})` + }) + ) + ]} + />