From 937cba4c1a4dccc3b47c67953465f89b08ddf7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nuno=20G=C3=B3is?= Date: Fri, 8 Aug 2025 08:03:02 +0100 Subject: [PATCH] chore: make project list table take less horizontal space (#10480) https://linear.app/unleash/issue/2-3761/address-ux-feedback-make-table-take-less-horizontal-space-to-prevent Addresses UX feedback by making the project list table take less horizontal space. This should prevent us from having to scroll horizontally in most cases. image --- .../ProjectLastSeen/ProjectLastSeen.tsx | 54 +++++++++++-------- .../ProjectListTableLastSeenCell.tsx | 25 +++++++++ .../ProjectsListTable/ProjectsListTable.tsx | 34 ++++++++---- ...Name.tsx => ProjectsListTableNameCell.tsx} | 6 +-- 4 files changed, 82 insertions(+), 37 deletions(-) create mode 100644 frontend/src/component/project/ProjectList/ProjectsListTable/ProjectListTableLastSeenCell.tsx rename frontend/src/component/project/ProjectList/ProjectsListTable/{ProjectsListTableProjectName.tsx => ProjectsListTableNameCell.tsx} (91%) diff --git a/frontend/src/component/project/ProjectCard/ProjectLastSeen/ProjectLastSeen.tsx b/frontend/src/component/project/ProjectCard/ProjectLastSeen/ProjectLastSeen.tsx index 5a70c85241..4051453c1d 100644 --- a/frontend/src/component/project/ProjectCard/ProjectLastSeen/ProjectLastSeen.tsx +++ b/frontend/src/component/project/ProjectCard/ProjectLastSeen/ProjectLastSeen.tsx @@ -10,15 +10,21 @@ import { HtmlTooltip } from 'component/common/HtmlTooltip/HtmlTooltip'; type ProjectLastSeenProps = { date?: Date | number | string | null; + hideLabel?: boolean; }; -const StyledContainer = styled(Box)(({ theme }) => ({ +const StyledContainer = styled(Box, { + shouldForwardProp: (prop) => prop !== 'secondary', +})<{ secondary?: boolean }>(({ theme, secondary }) => ({ ...flexRow, justifyContent: 'flex-start', textWrap: 'nowrap', width: '50%', gap: theme.spacing(1), cursor: 'default', + color: secondary + ? theme.palette.text.secondary + : theme.palette.text.primary, })); const StyledIcon = styled(StyledIconWrapper)<{ background: string }>( @@ -28,13 +34,18 @@ const StyledIcon = styled(StyledIconWrapper)<{ background: string }>( }), ); -const Title = () => ( +const Title = ({ date }: Pick) => ( <> ({ fontSize: theme.fontSizes.smallBody })} > - Last usage reported + Last usage reported:{' '} + {date ? ( + + ) : ( + No activity + )} ({ @@ -48,32 +59,29 @@ const Title = () => ( ); -export const ProjectLastSeen: FC = ({ date }) => { +export const ProjectLastSeen: FC = ({ + date, + hideLabel, +}) => { const getColor = useLastSeenColors(); const { text, background } = getColor(date); - if (!date) { - return ( - } arrow> - ({ color: theme.palette.text.secondary })} - > - - - {' '} -
No activity
-
-
- ); - } - return ( - } arrow> - + } arrow> + - + {date ? ( + + ) : ( + + )} {' '} - + {!hideLabel && + (date ? ( + + ) : ( +
No activity
+ ))}
); diff --git a/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectListTableLastSeenCell.tsx b/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectListTableLastSeenCell.tsx new file mode 100644 index 0000000000..e22fcbbd9b --- /dev/null +++ b/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectListTableLastSeenCell.tsx @@ -0,0 +1,25 @@ +import { styled } from '@mui/material'; +import { ProjectLastSeen } from 'component/project/ProjectCard/ProjectLastSeen/ProjectLastSeen'; + +const StyledContainer = styled('div', { + shouldForwardProp: (prop) => prop !== 'hideLabel', +})<{ hideLabel?: boolean }>(({ theme, hideLabel }) => ({ + display: 'flex', + alignItems: 'center', + justifyContent: hideLabel ? 'center' : 'start', + padding: theme.spacing(1, 2), +})); + +type ProjectListTableLastSeenCellProps = { + value?: Date | number | string | null; + hideLabel?: boolean; +}; + +export const ProjectListTableLastSeenCell = ({ + value, + hideLabel, +}: ProjectListTableLastSeenCellProps) => ( + + + +); diff --git a/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTable.tsx b/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTable.tsx index dc04ac0b6c..2ea02e9a61 100644 --- a/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTable.tsx +++ b/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTable.tsx @@ -4,14 +4,16 @@ import { HighlightCell } from 'component/common/Table/cells/HighlightCell/Highli import { TextCell } from 'component/common/Table/cells/TextCell/TextCell'; import { TimeAgoCell } from 'component/common/Table/cells/TimeAgoCell/TimeAgoCell'; import { ProjectOwners } from 'component/project/ProjectCard/ProjectCardFooter/ProjectOwners/ProjectOwners'; -import { ProjectLastSeen } from 'component/project/ProjectCard/ProjectLastSeen/ProjectLastSeen'; import { useFavoriteProjectsApi } from 'hooks/api/actions/useFavoriteProjectsApi/useFavoriteProjectsApi'; import useProjects from 'hooks/api/getters/useProjects/useProjects'; import type { ProjectSchema, ProjectSchemaOwners } from 'openapi'; import { useCallback, useMemo } from 'react'; import { useFlexLayout, useTable } from 'react-table'; import { formatDateYMDHMS } from 'utils/formatDate'; -import { ProjectsListTableProjectName } from './ProjectsListTableProjectName.tsx'; +import { ProjectsListTableNameCell } from './ProjectsListTableNameCell.tsx'; +import { useMediaQuery } from '@mui/material'; +import theme from 'themes/theme.ts'; +import { ProjectListTableLastSeenCell } from './ProjectListTableLastSeenCell.tsx'; type ProjectsListTableProps = { projects: ProjectSchema[]; @@ -20,6 +22,7 @@ type ProjectsListTableProps = { export const ProjectsListTable = ({ projects }: ProjectsListTableProps) => { const { refetch } = useProjects(); const { favorite, unfavorite } = useFavoriteProjectsApi(); + const isMediumScreen = useMediaQuery(theme.breakpoints.down('lg')); const onFavorite = useCallback( async (project: ProjectSchema) => { @@ -51,7 +54,7 @@ export const ProjectsListTable = ({ projects }: ProjectsListTableProps) => { accessor: 'name', minWidth: 200, searchable: true, - Cell: ProjectsListTableProjectName, + Cell: ProjectsListTableNameCell, }, { Header: 'Last updated', @@ -64,15 +67,17 @@ export const ProjectsListTable = ({ projects }: ProjectsListTableProps) => { dateFormat={formatDateYMDHMS} /> ), + width: 150, }, { - Header: 'Number of flags', + Header: 'Flags', accessor: 'featureCount', Cell: ({ value }: { value: number }) => ( {value} flag{value === 1 ? '' : 's'} ), + width: 90, }, { Header: 'Health', @@ -80,24 +85,30 @@ export const ProjectsListTable = ({ projects }: ProjectsListTableProps) => { Cell: ({ value }: { value: number }) => ( {value}% ), - width: 100, + width: 70, }, { Header: 'Last seen', accessor: 'lastReportedFlagUsage', Cell: ({ value }: { value: Date }) => ( - + ), + width: isMediumScreen ? 100 : 140, }, { Header: 'Owner', accessor: 'owners', Cell: ({ value }: { value: ProjectSchemaOwners }) => ( - owner.ownerType !== 'system', - )} - /> + + owner.ownerType !== 'system', + )} + /> + ), }, { @@ -106,6 +117,7 @@ export const ProjectsListTable = ({ projects }: ProjectsListTableProps) => { Cell: ({ value }: { value: number }) => ( {value} members ), + width: 120, }, ], [onFavorite], diff --git a/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTableProjectName.tsx b/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTableNameCell.tsx similarity index 91% rename from frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTableProjectName.tsx rename to frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTableNameCell.tsx index f2b026fe87..fdffe8e6fa 100644 --- a/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTableProjectName.tsx +++ b/frontend/src/component/project/ProjectList/ProjectsListTable/ProjectsListTableNameCell.tsx @@ -20,15 +20,15 @@ const StyledFeatureLink = styled(Link)({ }, }); -type ProjectsListTableProjectNameProps = { +type ProjectsListTableNameCellProps = { row: { original: ProjectSchema; }; }; -export const ProjectsListTableProjectName = ({ +export const ProjectsListTableNameCell = ({ row, -}: ProjectsListTableProjectNameProps) => { +}: ProjectsListTableNameCellProps) => { const { searchQuery } = useSearchHighlightContext(); return (