diff --git a/frontend/src/component/common/PageHeader/PageHeader.tsx b/frontend/src/component/common/PageHeader/PageHeader.tsx index 4ad55d2ac7..33282b557f 100644 --- a/frontend/src/component/common/PageHeader/PageHeader.tsx +++ b/frontend/src/component/common/PageHeader/PageHeader.tsx @@ -40,7 +40,7 @@ const StyledHeader = styled('div')(({ theme }) => ({ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', - marginRight: theme.spacing(2), + marginRight: theme.spacing(5), })); const StyledHeaderTitle = styled(Typography)(({ theme }) => ({ @@ -57,6 +57,15 @@ const StyledHeaderActions = styled('div')(({ theme }) => ({ gap: theme.spacing(1), })); +const StyledLeftHeaderActions = styled('div')(({ theme }) => ({ + display: 'flex', + flexGrow: 1, + justifyContent: 'flex-start', + alignItems: 'center', + gap: theme.spacing(1), + marginRight: theme.spacing(2), +})); + interface IPageHeaderProps { title?: string; titleElement?: ReactNode; @@ -64,6 +73,7 @@ interface IPageHeaderProps { variant?: TypographyProps['variant']; loading?: boolean; actions?: ReactNode; + leftActions?: ReactNode; className?: string; secondary?: boolean; } @@ -74,6 +84,7 @@ const PageHeaderComponent: FC & { title, titleElement, actions, + leftActions, subtitle, variant, loading, @@ -100,6 +111,14 @@ const PageHeaderComponent: FC & { {subtitle && {subtitle}} + + {leftActions} + + } + /> {actions}} diff --git a/frontend/src/component/project/ProjectList/ProjectList.tsx b/frontend/src/component/project/ProjectList/ProjectList.tsx index 45217f06c3..44d85caeeb 100644 --- a/frontend/src/component/project/ProjectList/ProjectList.tsx +++ b/frontend/src/component/project/ProjectList/ProjectList.tsx @@ -16,7 +16,12 @@ import Add from '@mui/icons-material/Add'; import ApiError from 'component/common/ApiError/ApiError'; import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import { TablePlaceholder } from 'component/common/Table'; -import { useMediaQuery, styled } from '@mui/material'; +import { + useMediaQuery, + styled, + ToggleButtonGroup, + ToggleButton, +} from '@mui/material'; import theme from 'themes/theme'; import { Search } from 'component/common/Search/Search'; import { PremiumFeature } from 'component/common/PremiumFeature/PremiumFeature'; @@ -25,6 +30,7 @@ import { ReactComponent as ProPlanIcon } from 'assets/icons/pro-enterprise-featu import { ReactComponent as ProPlanIconLight } from 'assets/icons/pro-enterprise-feature-badge-light.svg'; import { safeRegExp } from '@server/util/escape-regex'; import { ThemeMode } from 'component/common/ThemeMode/ThemeMode'; +import { useUiFlag } from 'hooks/useUiFlag'; const StyledDivContainer = styled('div')(({ theme }) => ({ display: 'flex', @@ -49,6 +55,24 @@ const StyledCardLink = styled(Link)(({ theme }) => ({ pointer: 'cursor', })); +const StyledButtonGroup = styled(ToggleButtonGroup)(({ theme }) => ({ + button: { + color: theme.palette.primary.main, + borderColor: theme.palette.background.alternative, + textTransform: 'none', + paddingInline: theme.spacing(3), + transition: 'background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms', + }, + 'button[aria-pressed=true]': { + backgroundColor: theme.palette.background.alternative, + color: theme.palette.primary.contrastText, + + '&:hover': { + backgroundColor: theme.palette.action.alternative, + }, + }, +})); + type PageQueryType = Partial>; type projectMap = { @@ -112,6 +136,10 @@ export const ProjectListNew = () => { searchParams.get('search') || '', ); + const showProjectFilterButtons = useUiFlag('projectListFilterMyProjects'); + const filters = ['All projects', 'My projects']; + const [filter, setFilter] = useState(filters[0]); + useEffect(() => { const tableState: PageQueryType = {}; if (searchValue) { @@ -172,6 +200,36 @@ export const ProjectListNew = () => { header={ { + if (value !== null) { + setFilter(value); + } + }} + > + {filters.map((filter) => { + return ( + + {filter} + + ); + })} + + } + /> + } actions={ <>