diff --git a/frontend/src/component/project/Project/ProjectStatus/ProjectHealth.tsx b/frontend/src/component/project/Project/ProjectStatus/ProjectHealth.tsx index 20bcd9174f..efe6d7304d 100644 --- a/frontend/src/component/project/Project/ProjectStatus/ProjectHealth.tsx +++ b/frontend/src/component/project/Project/ProjectStatus/ProjectHealth.tsx @@ -4,6 +4,12 @@ import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig'; import { useProjectStatus } from 'hooks/api/getters/useProjectStatus/useProjectStatus'; import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; import { HealthGridTile } from './ProjectHealthGrid.styles'; +import { PrettifyLargeNumber } from 'component/common/PrettifyLargeNumber/PrettifyLargeNumber'; + +const ChartRadius = 40; +const ChartStrokeWidth = 13; +const ChartTotalWidth = ChartRadius * 2 + ChartStrokeWidth; +const ChartContainerWidth = 100; const TextContainer = styled('div')(({ theme }) => ({ display: 'flex', @@ -13,14 +19,14 @@ const TextContainer = styled('div')(({ theme }) => ({ const ChartRow = styled('div')(({ theme }) => ({ display: 'flex', - alignItems: 'center', + alignItems: 'flex-start', gap: theme.spacing(2), })); const SVGWrapper = styled('div')(({ theme }) => ({ flex: 'none', height: 85, - width: 100, + width: ChartContainerWidth, position: 'relative', })); @@ -28,16 +34,67 @@ const StyledSVG = styled('svg')({ position: 'absolute', }); +const BigText = styled('span')(({ theme }) => ({ + fontSize: theme.typography.h1.fontSize, +})); + +const UnhealthyStatContainer = styled('div')(({ theme }) => ({ + flex: 'none', + display: 'grid', + placeItems: 'center', + width: ChartContainerWidth, +})); + +const UnhealthyStatText = styled('p')(({ theme }) => ({ + fontSize: theme.typography.body2.fontSize, + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + borderRadius: '50%', + backgroundColor: + theme.mode === 'light' + ? theme.palette.background.elevation2 + : '#302E42', // in dark mode, elevation2 and elevation1 are the same color. This is an alternative + width: ChartTotalWidth, + height: ChartTotalWidth, + overflow: 'hidden', +})); + +const UnhealthyFlagBox = ({ flagCount }: { flagCount: number }) => { + const flagWord = flagCount === 1 ? 'flag' : 'flags'; + return ( + + + + + + unhealthy + {flagWord} + + + ); +}; + +const Wrapper = styled(HealthGridTile)(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-around', + gap: theme.spacing(2), +})); + export const ProjectHealth = () => { const projectId = useRequiredPathParam('projectId'); const { - data: { averageHealth }, + data: { averageHealth, staleFlags }, } = useProjectStatus(projectId); const { isOss } = useUiConfig(); const theme = useTheme(); - const radius = 40; - const strokeWidth = 13; - const circumference = 2 * Math.PI * radius; + const circumference = 2 * Math.PI * ChartRadius; // const gapLength = 0.3; const filledLength = 1 - gapLength; @@ -52,27 +109,27 @@ export const ProjectHealth = () => { : theme.palette.success.border; return ( - + @@ -82,7 +139,7 @@ export const ProjectHealth = () => { textAnchor='middle' dominantBaseline='middle' fill={theme.palette.text.primary} - fontSize='24px' + fontSize={theme.typography.h1.fontSize} > {averageHealth}% @@ -100,6 +157,19 @@ export const ProjectHealth = () => { )} - + + + + + To keep your project healthy, archive stale feature + flags and remove code from your code base to reduce + technical debt. + + + View unhealthy flags + + + + ); }; diff --git a/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.styles.tsx b/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.styles.tsx index 1cc5e10e43..709e354ab3 100644 --- a/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.styles.tsx +++ b/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.styles.tsx @@ -1,7 +1,7 @@ import { styled } from '@mui/material'; export const HealthGridTile = styled('article')(({ theme }) => ({ - backgroundColor: theme.palette.neutral.light, + backgroundColor: theme.palette.background.elevation1, padding: theme.spacing(3), borderRadius: theme.shape.borderRadiusExtraLarge, })); diff --git a/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.tsx b/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.tsx index bc6517a306..85db818ca4 100644 --- a/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.tsx +++ b/frontend/src/component/project/Project/ProjectStatus/ProjectHealthGrid.tsx @@ -1,6 +1,5 @@ import { ProjectHealth } from './ProjectHealth'; import { styled } from '@mui/material'; -import { StaleFlags } from './StaleFlags'; import { ProjectResources } from './ProjectResources'; const onNarrowGrid = (css: object) => ({ @@ -18,7 +17,7 @@ const HealthGrid = styled('div')(({ theme }) => ({ display: 'grid', gridTemplateAreas: ` "health resources" - "stale resources" + "health resources" `, gridTemplateColumns: 'repeat(2, minmax(300px, 1fr))', gap: theme.spacing(1, 2), @@ -45,9 +44,6 @@ export const ProjectHealthGrid = () => { - - - diff --git a/frontend/src/component/project/Project/ProjectStatus/StaleFlags.tsx b/frontend/src/component/project/Project/ProjectStatus/StaleFlags.tsx deleted file mode 100644 index 8c533f45f0..0000000000 --- a/frontend/src/component/project/Project/ProjectStatus/StaleFlags.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { Typography } from '@mui/material'; -import { styled } from '@mui/material'; -import { PrettifyLargeNumber } from 'component/common/PrettifyLargeNumber/PrettifyLargeNumber'; -import { useProjectStatus } from 'hooks/api/getters/useProjectStatus/useProjectStatus'; -import useLoading from 'hooks/useLoading'; -import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; -import type { FC } from 'react'; -import { Link } from 'react-router-dom'; -import { HealthGridTile } from './ProjectHealthGrid.styles'; - -const Wrapper = styled(HealthGridTile)(({ theme }) => ({ - display: 'flex', - flexDirection: 'column', - gap: theme.spacing(1), -})); - -const BigText = styled('span')(({ theme }) => ({ - fontSize: `calc(2 * ${theme.typography.body1.fontSize})`, - lineHeight: 0, -})); - -const BigNumber: FC<{ value?: number }> = ({ value }) => { - return ( - - - - ); -}; - -export const StaleFlags = () => { - const projectId = useRequiredPathParam('projectId'); - const { data, loading } = useProjectStatus(projectId); - const loadingRef = useLoading(loading, '[data-loading-stale-flags=true]'); - - return ( - - - {' '} - - stale flags - - - - Remember to archive your stale feature flags to keep the project - healthy - - - ); -};