Skip to content

Commit e67a47b

Browse files
authored
[UI] Remember filter settings in local storage #2039 (#2352)
1 parent 5dbae21 commit e67a47b

6 files changed

Lines changed: 67 additions & 67 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { useEffect, useMemo } from 'react';
2+
3+
import { SelectCSDProps } from 'components';
4+
5+
import { useGetProjectsQuery } from 'services/project';
6+
7+
import { useLocalStorageState } from './useLocalStorageState';
8+
9+
type Args = {
10+
localStorePrefix: string;
11+
};
12+
13+
export const useProjectFilter = ({ localStorePrefix }: Args) => {
14+
const [selectedProject, setSelectedProject] = useLocalStorageState<SelectCSDProps.Option | null>(
15+
`${localStorePrefix}-project_name`,
16+
null,
17+
);
18+
19+
const { data: projectsData } = useGetProjectsQuery();
20+
21+
const projectOptions = useMemo<SelectCSDProps.Options>(() => {
22+
if (!projectsData?.length) return [];
23+
24+
return projectsData.map((project) => ({ label: project.project_name, value: project.project_name }));
25+
}, [projectsData]);
26+
27+
useEffect(() => {
28+
if (!projectsData || !selectedProject) {
29+
return;
30+
}
31+
32+
const hasSelectedProject = projectsData.some(({ project_name }) => selectedProject?.value === project_name);
33+
34+
if (!hasSelectedProject) {
35+
setSelectedProject(null);
36+
}
37+
}, [projectsData]);
38+
39+
return {
40+
projectOptions,
41+
selectedProject,
42+
setSelectedProject,
43+
} as const;
44+
};

frontend/src/pages/Fleets/List/hooks.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
import React, { useCallback, useMemo, useState } from 'react';
1+
import React, { useCallback } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { format } from 'date-fns';
44

55
import { Button, ListEmptyMessage, NavigateLink, StatusIndicator, TableProps } from 'components';
6-
import { SelectCSDProps } from 'components';
76

87
import { DATE_TIME_FORMAT } from 'consts';
98
import { useLocalStorageState } from 'hooks/useLocalStorageState';
9+
import { useProjectFilter } from 'hooks/useProjectFilter';
1010
import { getFleetInstancesLinkText, getFleetPrice, getFleetStatusIconType } from 'libs/fleet';
1111
import { ROUTES } from 'routes';
12-
import { useGetProjectsQuery } from 'services/project';
1312

1413
export const useEmptyMessages = ({
1514
clearFilters,
@@ -100,17 +99,9 @@ export const useColumnsDefinitions = () => {
10099
return { columns } as const;
101100
};
102101

103-
export const useFilters = () => {
104-
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>('fleet-list-is-active', true);
105-
const [selectedProject, setSelectedProject] = useState<SelectCSDProps.Option | null>(null);
106-
107-
const { data: projectsData } = useGetProjectsQuery();
108-
109-
const projectOptions = useMemo<SelectCSDProps.Options>(() => {
110-
if (!projectsData?.length) return [];
111-
112-
return projectsData.map((project) => ({ label: project.project_name, value: project.project_name }));
113-
}, [projectsData]);
102+
export const useFilters = (localStorePrefix = 'fleet-list-page') => {
103+
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>(`${localStorePrefix}-is-active`, true);
104+
const { selectedProject, setSelectedProject, projectOptions } = useProjectFilter({ localStorePrefix });
114105

115106
const clearFilters = () => {
116107
setOnlyActive(false);

frontend/src/pages/Instances/List/hooks/useFilters.ts

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,13 @@
1-
import { useMemo, useState } from 'react';
1+
import { useMemo } from 'react';
22
import { useSearchParams } from 'react-router-dom';
33

4-
import { SelectCSDProps } from 'components';
5-
64
import { useLocalStorageState } from 'hooks/useLocalStorageState';
7-
import { useGetProjectsQuery } from 'services/project';
5+
import { useProjectFilter } from 'hooks/useProjectFilter';
86

9-
export const useFilters = () => {
7+
export const useFilters = (localStorePrefix = 'instances-list-page') => {
108
const [searchParams, setSearchParams] = useSearchParams();
11-
12-
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>('instances-list-is-active', false);
13-
const [selectedProject, setSelectedProject] = useState<SelectCSDProps.Option | null>(null);
14-
15-
const { data: projectsData } = useGetProjectsQuery();
16-
17-
const projectOptions = useMemo<SelectCSDProps.Options>(() => {
18-
if (!projectsData?.length) return [];
19-
20-
return projectsData.map((project) => ({ label: project.project_name, value: project.project_name }));
21-
}, [projectsData]);
9+
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>(`${localStorePrefix}-is-active`, false);
10+
const { selectedProject, setSelectedProject, projectOptions } = useProjectFilter({ localStorePrefix });
2211

2312
const clearFilters = () => {
2413
setOnlyActive(false);

frontend/src/pages/Models/List/hooks.tsx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import React, { useCallback, useEffect, useMemo, useState } from 'react';
1+
import React, { useCallback, useEffect } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { useSearchParams } from 'react-router-dom';
44
import { format } from 'date-fns';
55

66
import { Button, ListEmptyMessage, NavigateLink, SelectCSDProps, TableProps } from 'components';
77

88
import { DATE_TIME_FORMAT } from 'consts';
9+
import { useProjectFilter } from 'hooks/useProjectFilter';
910
import { ROUTES } from 'routes';
10-
import { useGetProjectsQuery } from 'services/project';
1111

1212
import { getModelGateway } from '../helpers';
1313

@@ -118,19 +118,12 @@ export const useEmptyMessages = ({
118118

119119
type Args = {
120120
projectSearchKey?: string;
121+
localStorePrefix?: string;
121122
};
122123

123-
export const useFilters = ({ projectSearchKey }: Args) => {
124+
export const useFilters = ({ projectSearchKey, localStorePrefix = 'models-list-page' }: Args) => {
124125
const [searchParams] = useSearchParams();
125-
const [selectedProject, setSelectedProject] = useState<SelectCSDProps.Option | null>(null);
126-
127-
const { data: projectsData } = useGetProjectsQuery();
128-
129-
const projectOptions = useMemo<SelectCSDProps.Options>(() => {
130-
if (!projectsData?.length) return [];
131-
132-
return projectsData.map((project) => ({ label: project.project_name, value: project.project_name }));
133-
}, [projectsData]);
126+
const { selectedProject, setSelectedProject, projectOptions } = useProjectFilter({ localStorePrefix });
134127

135128
const setSelectedOptionFromParams = (
136129
searchKey: string,

frontend/src/pages/Runs/List/hooks/useFilters.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { useEffect, useMemo, useState } from 'react';
1+
import { useEffect } from 'react';
22
import { useSearchParams } from 'react-router-dom';
33

44
import { SelectCSDProps } from 'components';
55

66
import { useLocalStorageState } from 'hooks/useLocalStorageState';
7-
import { useGetProjectsQuery } from 'services/project';
7+
import { useProjectFilter } from 'hooks/useProjectFilter';
88

99
type Args = {
1010
localStorePrefix: string;
@@ -14,17 +14,9 @@ type Args = {
1414

1515
export const useFilters = ({ localStorePrefix, projectSearchKey }: Args) => {
1616
const [searchParams] = useSearchParams();
17-
const [selectedProject, setSelectedProject] = useState<SelectCSDProps.Option | null>(null);
17+
const { selectedProject, setSelectedProject, projectOptions } = useProjectFilter({ localStorePrefix });
1818
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>(`${localStorePrefix}-is-active`, false);
1919

20-
const { data: projectsData } = useGetProjectsQuery();
21-
22-
const projectOptions = useMemo<SelectCSDProps.Options>(() => {
23-
if (!projectsData?.length) return [];
24-
25-
return projectsData.map((project) => ({ label: project.project_name, value: project.project_name }));
26-
}, [projectsData]);
27-
2820
const setSelectedOptionFromParams = (
2921
searchKey: string,
3022
options: SelectCSDProps.Options | null,

frontend/src/pages/Volumes/List/hooks.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
import React, { useMemo, useState } from 'react';
1+
import React, { useState } from 'react';
22
import { useTranslation } from 'react-i18next';
33
import { format } from 'date-fns';
44

55
import { Button, ListEmptyMessage, NavigateLink, StatusIndicator } from 'components';
6-
import { SelectCSDProps } from 'components';
76

87
import { DATE_TIME_FORMAT } from 'consts';
98
import { useNotifications } from 'hooks';
109
import { useLocalStorageState } from 'hooks/useLocalStorageState';
10+
import { useProjectFilter } from 'hooks/useProjectFilter';
1111
import { getServerError } from 'libs';
1212
import { getStatusIconType } from 'libs/volumes';
1313
import { ROUTES } from 'routes';
14-
import { useGetProjectsQuery } from 'services/project';
1514
import { useDeleteVolumesMutation } from 'services/volume';
1615

1716
export const useVolumesTableEmptyMessages = ({
@@ -102,17 +101,9 @@ export const useColumnsDefinitions = () => {
102101
return { columns } as const;
103102
};
104103

105-
export const useFilters = (storagePrefix?: string) => {
106-
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>(`${storagePrefix}volume-list-is-active`, true);
107-
const [selectedProject, setSelectedProject] = useState<SelectCSDProps.Option | null>(null);
108-
109-
const { data: projectsData } = useGetProjectsQuery();
110-
111-
const projectOptions = useMemo<SelectCSDProps.Options>(() => {
112-
if (!projectsData?.length) return [];
113-
114-
return projectsData.map((project) => ({ label: project.project_name, value: project.project_name }));
115-
}, [projectsData]);
104+
export const useFilters = (localStorePrefix = 'volume-list-page') => {
105+
const [onlyActive, setOnlyActive] = useLocalStorageState<boolean>(`${localStorePrefix}-is-active`, true);
106+
const { selectedProject, setSelectedProject, projectOptions } = useProjectFilter({ localStorePrefix });
116107

117108
const clearFilters = () => {
118109
setOnlyActive(false);

0 commit comments

Comments
 (0)