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})`
+ })
+ )
+ ]}
+ />