Add line break to card's secondary text
Original-merge: 1c8f221006
Merged-by: thornbill <thornbill@users.noreply.github.com>
Backported-by: thornbill <thornbill@users.noreply.github.com>
122 lines
3.7 KiB
TypeScript
122 lines
3.7 KiB
TypeScript
import React from 'react';
|
|
import Box from '@mui/material/Box';
|
|
import Card from '@mui/material/Card';
|
|
import CardContent from '@mui/material/CardContent';
|
|
import CardMedia from '@mui/material/CardMedia';
|
|
import IconButton from '@mui/material/IconButton';
|
|
import Typography from '@mui/material/Typography';
|
|
import MoreVertIcon from '@mui/icons-material/MoreVert';
|
|
import { getDefaultBackgroundClass } from 'components/cardbuilder/cardBuilderUtils';
|
|
import CardActionArea from '@mui/material/CardActionArea';
|
|
import Stack from '@mui/material/Stack';
|
|
import { Link, To } from 'react-router-dom';
|
|
|
|
interface BaseCardProps {
|
|
title?: string;
|
|
text?: string;
|
|
image?: string | null;
|
|
icon?: React.ReactNode;
|
|
to?: To;
|
|
onClick?: () => void;
|
|
action?: boolean;
|
|
actionRef?: React.MutableRefObject<HTMLButtonElement | null>;
|
|
onActionClick?: () => void;
|
|
height?: number;
|
|
width?: number;
|
|
};
|
|
|
|
const BaseCard = ({
|
|
title,
|
|
text,
|
|
image,
|
|
icon,
|
|
to,
|
|
onClick,
|
|
action,
|
|
actionRef,
|
|
onActionClick,
|
|
height,
|
|
width
|
|
}: BaseCardProps) => {
|
|
return (
|
|
<Card
|
|
sx={{
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
height: height || 240,
|
|
width: width
|
|
}}
|
|
>
|
|
<CardActionArea
|
|
{...(to && {
|
|
component: Link,
|
|
to: to
|
|
})}
|
|
onClick={onClick}
|
|
sx={{
|
|
display: 'flex',
|
|
flexGrow: 1,
|
|
alignItems: 'stretch'
|
|
}}
|
|
>
|
|
{image ? (
|
|
<CardMedia
|
|
sx={{ flexGrow: 1 }}
|
|
image={image}
|
|
title={title}
|
|
/>
|
|
) : (
|
|
<Box className={getDefaultBackgroundClass(title)} sx={{
|
|
flexGrow: 1,
|
|
display: 'flex',
|
|
alignItems: 'center',
|
|
justifyContent: 'center'
|
|
}}>
|
|
{icon}
|
|
</Box>
|
|
)}
|
|
</CardActionArea>
|
|
<CardContent
|
|
sx={{
|
|
minHeight: 50,
|
|
'&:last-child': {
|
|
paddingBottom: 2,
|
|
paddingRight: 1
|
|
}
|
|
}}>
|
|
<Stack flexGrow={1} direction='row'>
|
|
<Stack flexGrow={1}>
|
|
<Typography gutterBottom sx={{
|
|
overflow: 'hidden',
|
|
whiteSpace: 'nowrap',
|
|
textOverflow: 'ellipsis'
|
|
}}>
|
|
{title}
|
|
</Typography>
|
|
{text && (
|
|
<Typography
|
|
variant='body2'
|
|
color='text.secondary'
|
|
sx={{
|
|
lineBreak: 'anywhere'
|
|
}}
|
|
>
|
|
{text}
|
|
</Typography>
|
|
)}
|
|
</Stack>
|
|
<Box>
|
|
{action ? (
|
|
<IconButton ref={actionRef} onClick={onActionClick}>
|
|
<MoreVertIcon />
|
|
</IconButton>
|
|
) : null}
|
|
</Box>
|
|
</Stack>
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
};
|
|
|
|
export default BaseCard;
|