1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-13 13:48:59 +02:00

refactor: simplify project filters

This commit is contained in:
Tymoteusz Czech 2024-04-17 16:27:05 +02:00
parent c6e3d2a105
commit 3033653784
No known key found for this signature in database
GPG Key ID: 133555230D88D75F
2 changed files with 29 additions and 31 deletions

View File

@ -1,8 +1,5 @@
///<reference path="../../global.d.ts" /> ///<reference path="../../global.d.ts" />
import { import { SEARCH_INPUT } from '../../../src/utils/testIds';
SEARCH_INPUT,
//@ts-ignore
} from '../../../src/utils/testIds';
describe('project overview', () => { describe('project overview', () => {
const randomId = String(Math.random()).split('.')[1]; const randomId = String(Math.random()).split('.')[1];

View File

@ -1,6 +1,6 @@
import { useContext, useMemo, useState } from 'react'; import { useContext, useMemo, useState } from 'react';
import { Link, useNavigate } from 'react-router-dom'; import { Link, useNavigate } from 'react-router-dom';
import { BooleanParam, StringParam, withDefault } from 'use-query-params'; import { StringParam, withDefault } from 'use-query-params';
import { mutate } from 'swr'; import { mutate } from 'swr';
import { getProjectFetcher } from 'hooks/api/getters/useProject/getProjectFetcher'; import { getProjectFetcher } from 'hooks/api/getters/useProject/getProjectFetcher';
import useProjects from 'hooks/api/getters/useProjects/useProjects'; import useProjects from 'hooks/api/getters/useProjects/useProjects';
@ -125,6 +125,19 @@ function resolveCreateButtonData(
} }
} }
const filterOptions = [
{
label: 'All projects',
value: 'all',
},
{
label: 'My projects',
value: 'my_projects',
},
] as const;
// type FilterOptions = (typeof filterOptions)[number]['value'];
export const ProjectListNew = () => { export const ProjectListNew = () => {
const { hasAccess } = useContext(AccessContext); const { hasAccess } = useContext(AccessContext);
const navigate = useNavigate(); const navigate = useNavigate();
@ -135,30 +148,18 @@ export const ProjectListNew = () => {
const showProjectFilterButtons = useUiFlag('projectListFilterMyProjects'); const showProjectFilterButtons = useUiFlag('projectListFilterMyProjects');
const myProjects = new Set(useProfile().profile?.projects || []); const myProjects = new Set(useProfile().profile?.projects || []);
const filterOptions = [
{
label: 'All projects',
value: false,
},
{
label: 'My projects',
value: true,
},
];
const stateConfig = {
myProjects: withDefault(BooleanParam, false),
search: withDefault(StringParam, ''),
};
const [filterState, setFilterState] = usePersistentTableState( const [filterState, setFilterState] = usePersistentTableState(
`projects-list`, `projects-list`,
stateConfig, {
filter: withDefault(StringParam, 'all'),
search: withDefault(StringParam, ''),
},
); );
const searchValue = filterState.search; const searchValue = filterState.search;
const filteredProjects = useMemo(() => { const filteredProjects = useMemo(() => {
const preFilteredProjects = const preFilteredProjects =
showProjectFilterButtons && filterState.myProjects showProjectFilterButtons && filterState.filter === 'my_projects'
? projects.filter(shouldDisplayInMyProjects(myProjects)) ? projects.filter(shouldDisplayInMyProjects(myProjects))
: projects; : projects;
@ -181,7 +182,7 @@ export const ProjectListNew = () => {
}, [ }, [
projects, projects,
searchValue, searchValue,
filterState.myProjects, filterState.filter,
myProjects, myProjects,
showProjectFilterButtons, showProjectFilterButtons,
]); ]);
@ -226,23 +227,23 @@ export const ProjectListNew = () => {
aria-label='project list filter' aria-label='project list filter'
size='small' size='small'
color='primary' color='primary'
value={filterState.myProjects} value={filterState.filter}
exclusive exclusive
onChange={(event, value) => { onChange={(event, filter) => {
if (value !== null) { if (filter !== null) {
setFilterState({ setFilterState({
myProjects: value, filter,
}); });
} }
}} }}
> >
{filterOptions.map((filter) => { {filterOptions.map((option) => {
return ( return (
<ToggleButton <ToggleButton
key={`${filter.value}`} key={`${option.value}`}
value={filter.value} value={option.value}
> >
{filter.label} {option.label}
</ToggleButton> </ToggleButton>
); );
})} })}