1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-05-03 01:18:43 +02:00
unleash.unleash/frontend/src/component/project/Project/ProjectStats/StatusBox.tsx
Fredrik Strand Oseberg 897e97330a
Feat/project stats members (#3009)
This PR adds project members to the project stats and connects the stats
to the UI.
2023-01-27 13:13:41 +01:00

120 lines
3.6 KiB
TypeScript

import { ArrowOutward, SouthEast } from '@mui/icons-material';
import { Box, Typography, styled } from '@mui/material';
import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender';
import { flexRow } from 'themes/themeStyles';
const StyledBox = styled(Box)(({ theme }) => ({
padding: theme.spacing(4, 2),
backgroundColor: theme.palette.background.paper,
minWidth: '24%',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
borderRadius: `${theme.shape.borderRadiusLarge}px`,
[theme.breakpoints.down('lg')]: {
minWidth: '49%',
padding: theme.spacing(2),
':nth-child(n+3)': {
marginTop: theme.spacing(2),
},
},
[theme.breakpoints.down('sm')]: {
':nth-child(n+2)': {
marginTop: theme.spacing(2),
},
},
}));
const StyledTypographyHeader = styled(Typography)(({ theme }) => ({
marginBottom: theme.spacing(2),
}));
const StyledTypographyCount = styled(Typography)(({ theme }) => ({
fontSize: theme.fontSizes.largeHeader,
fontWeight: 'bold',
}));
const StyledBoxChangeContainer = styled(Box)(({ theme }) => ({
...flexRow,
flexDirection: 'column',
alignItems: 'center',
marginLeft: theme.spacing(1.5),
}));
const StyledTypographySubtext = styled(Typography)(({ theme }) => ({
color: theme.palette.neutral.main,
fontSize: theme.fontSizes.smallBody,
}));
const StyledTypographyChange = styled(Typography)(({ theme }) => ({
marginLeft: theme.spacing(1),
fontSize: theme.fontSizes.smallBody,
}));
interface IStatusBoxProps {
title: string;
boxText: string;
change: number;
percentage?: boolean;
}
const resolveIcon = (change: number) => {
if (change > 0) {
return (
<ArrowOutward
sx={{ color: 'success.main', height: 18, width: 18 }}
/>
);
}
return <SouthEast sx={{ color: 'warning.dark', height: 18, width: 18 }} />;
};
const resolveColor = (change: number) => {
if (change > 0) {
return 'success.main';
}
return 'error.main';
};
export const StatusBox = ({
title,
boxText,
change,
percentage,
}: IStatusBoxProps) => {
return (
<StyledBox>
<StyledTypographyHeader>{title}</StyledTypographyHeader>
<Box sx={{ ...flexRow }}>
<StyledTypographyCount>{boxText}</StyledTypographyCount>
<ConditionallyRender
condition={change !== 0}
show={
<StyledBoxChangeContainer>
<Box sx={{ ...flexRow }}>
{resolveIcon(change)}
<StyledTypographyChange
color={resolveColor(change)}
>
{change}
{percentage ? '%' : ''}
</StyledTypographyChange>
</Box>
<StyledTypographySubtext>
this month
</StyledTypographySubtext>
</StyledBoxChangeContainer>
}
elseShow={
<StyledBoxChangeContainer>
<StyledTypographySubtext>
No change
</StyledTypographySubtext>
</StyledBoxChangeContainer>
}
/>
</Box>
</StyledBox>
);
};