Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 30 additions & 26 deletions examples/crm/src/companies/CompanyShow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
ListItem,
ListItemAvatar,
ListItemButton,
ListItemSecondaryAction,
ListItemText,
Stack,
Typography,
Expand Down Expand Up @@ -143,7 +142,22 @@ const ContactsIterator = () => {
<List dense sx={{ pt: 0 }}>
{contacts.map(contact => (
<RecordContextProvider key={contact.id} value={contact}>
<ListItem disablePadding>
<ListItem
disablePadding
secondaryAction={
contact.last_seen ? (
<Typography
variant="body2"
color="textSecondary"
component="span"
>
last activity{' '}
{formatDistance(contact.last_seen, now)} ago{' '}
<Status status={contact.status} />
</Typography>
) : null
}
>
<ListItemButton
component={RouterLink}
to={`/contacts/${contact.id}/show`}
Expand All @@ -169,19 +183,6 @@ const ContactsIterator = () => {
</>
}
/>
{contact.last_seen && (
<ListItemSecondaryAction>
<Typography
variant="body2"
color="textSecondary"
component="span"
>
last activity{' '}
{formatDistance(contact.last_seen, now)}{' '}
ago <Status status={contact.status} />
</Typography>
</ListItemSecondaryAction>
)}
</ListItemButton>
</ListItem>
</RecordContextProvider>
Expand Down Expand Up @@ -216,7 +217,20 @@ const DealsIterator = () => {
<Box>
<List dense>
{deals.map(deal => (
<ListItem key={deal.id} disablePadding>
<ListItem
key={deal.id}
disablePadding
secondaryAction={
<Typography
variant="body2"
color="textSecondary"
component="span"
>
last activity{' '}
{formatDistance(deal.updated_at, now)} ago{' '}
</Typography>
}
>
<ListItemButton
component={RouterLink}
to={`/deals/${deal.id}/show`}
Expand All @@ -239,16 +253,6 @@ const DealsIterator = () => {
</>
}
/>
<ListItemSecondaryAction>
<Typography
variant="body2"
color="textSecondary"
component="span"
>
last activity{' '}
{formatDistance(deal.updated_at, now)} ago{' '}
</Typography>
</ListItemSecondaryAction>
</ListItemButton>
</ListItem>
))}
Expand Down
46 changes: 23 additions & 23 deletions examples/crm/src/contacts/ContactListContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
ListItemButton,
ListItemAvatar,
ListItemIcon,
ListItemSecondaryAction,
ListItemText,
Typography,
useMediaQuery,
Expand Down Expand Up @@ -50,7 +49,29 @@ export const ContactListContent = () => {
<List dense>
{contacts.map(contact => (
<RecordContextProvider key={contact.id} value={contact}>
<ListItem disablePadding>
<ListItem
disablePadding
secondaryAction={
contact.last_seen ? (
<Typography
variant="body2"
color="textSecondary"
title={contact.last_seen}
sx={{
top: '10px',
transform: 'none',
}}
>
{!isSmall && 'last activity '}
{formatRelative(
contact.last_seen,
now
)}{' '}
<Status status={contact.status} />
</Typography>
) : null
}
>
<ListItemButton
component={Link}
to={`/contacts/${contact.id}/show`}
Expand Down Expand Up @@ -101,27 +122,6 @@ export const ContactListContent = () => {
</>
}
/>
{contact.last_seen && (
<ListItemSecondaryAction
sx={{
top: '10px',
transform: 'none',
}}
>
<Typography
variant="body2"
color="textSecondary"
title={contact.last_seen}
>
{!isSmall && 'last activity '}
{formatRelative(
contact.last_seen,
now
)}{' '}
<Status status={contact.status} />
</Typography>
</ListItemSecondaryAction>
)}
</ListItemButton>
</ListItem>
</RecordContextProvider>
Expand Down
27 changes: 14 additions & 13 deletions examples/demo/src/dashboard/PendingOrder.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import * as React from 'react';
import {
ListItem,
ListItemSecondaryAction,
ListItemAvatar,
ListItemText,
Avatar,
Expand All @@ -26,7 +25,20 @@ export const PendingOrder = (props: Props) => {
});

return (
<ListItem disablePadding>
<ListItem
disablePadding
secondaryAction={
<Box
component="span"
sx={{
marginRight: '1em',
color: 'text.primary',
}}
>
{order.total}$
</Box>
}
>
<ListItemButton component={Link} to={`/orders/${order.id}`}>
<ListItemAvatar>
{isPending ? (
Expand All @@ -49,17 +61,6 @@ export const PendingOrder = (props: Props) => {
: '',
})}
/>
<ListItemSecondaryAction>
<Box
component="span"
sx={{
marginRight: '1em',
color: 'text.primary',
}}
>
{order.total}$
</Box>
</ListItemSecondaryAction>
</ListItemButton>
</ListItem>
);
Expand Down
2 changes: 1 addition & 1 deletion examples/demo/src/reviews/ReviewItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export const ReviewItem = () => {
</Fragment>
}
secondary={record.comment}
secondaryTypographyProps={{ noWrap: true }}
slotProps={{ secondary: { noWrap: true } }}
/>
</ListItemButton>
</ListItem>
Expand Down
11 changes: 5 additions & 6 deletions examples/simple/src/tags/TagList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
List,
ListItem,
ListItemText,
ListItemSecondaryAction,
Collapse,
Card,
Stack,
Expand Down Expand Up @@ -76,16 +75,16 @@ const SubTree = ({ level, root, getChildNodes, openChildren, toggleNode }) => {
const open = openChildren.includes(root.id);
return (
<Fragment>
<ListItem disablePadding style={{ paddingLeft: level * 16 }}>
<ListItem
disablePadding
sx={{ paddingLeft: level * 16 }}
secondaryAction={<EditButton record={root} />}
>
<ListItemButton onClick={() => hasChildren && toggleNode(root)}>
{hasChildren && open && <ExpandLess />}
{hasChildren && !open && <ExpandMore />}
{!hasChildren && <div style={{ width: 24 }}>&nbsp;</div>}
<ListItemText primary={root.name.en} />

<ListItemSecondaryAction>
<EditButton record={root} />
</ListItemSecondaryAction>
</ListItemButton>
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
Expand Down
78 changes: 39 additions & 39 deletions packages/ra-ui-materialui/src/list/SimpleList/SimpleList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import {
List,
ListItemAvatar,
ListItemIcon,
ListItemSecondaryAction,
ListItemText,
ListProps,
} from '@mui/material';
Expand Down Expand Up @@ -125,13 +124,33 @@ export const SimpleList = <RecordType extends RaRecord = any>(
rowSx={rowSx}
rowStyle={rowStyle}
resource={resource}
secondaryAction={
rightAvatar || rightIcon ? (
<>
{rightAvatar && (
<Avatar>
{renderAvatar(
record,
rightAvatar
)}
</Avatar>
)}
{rightIcon && (
<ListItemIcon>
{rightIcon(
record,
record.id
)}
</ListItemIcon>
)}
</>
) : null
}
>
<SimpleListItemContent
leftAvatar={leftAvatar}
leftIcon={leftIcon}
primaryText={primaryText}
rightAvatar={rightAvatar}
rightIcon={rightIcon}
secondaryText={secondaryText}
tertiaryText={tertiaryText}
rowIndex={rowIndex}
Expand Down Expand Up @@ -163,35 +182,13 @@ export interface SimpleListProps<RecordType extends RaRecord = any>
const SimpleListItemContent = <RecordType extends RaRecord = any>(
props: SimpleListItemProps<RecordType>
) => {
const {
leftAvatar,
leftIcon,
primaryText,
rightAvatar,
rightIcon,
secondaryText,
tertiaryText,
} = props;
const { leftAvatar, leftIcon, primaryText, secondaryText, tertiaryText } =
props;
const resource = useResourceContext(props);
const record = useRecordContext<RecordType>(props);
const getRecordRepresentation = useGetRecordRepresentation(resource);
const translate = useTranslate();

const renderAvatar = (
record: RecordType,
avatarCallback: FunctionToElement<RecordType>
) => {
const avatarValue = avatarCallback(record, record.id);
if (
typeof avatarValue === 'string' &&
(avatarValue.startsWith('http') || avatarValue.startsWith('data:'))
) {
return <Avatar src={avatarValue} />;
} else {
return <Avatar>{avatarValue}</Avatar>;
}
};

if (!record) return null;

return (
Expand Down Expand Up @@ -250,22 +247,25 @@ const SimpleListItemContent = <RecordType extends RaRecord = any>(
secondaryText(record, record.id))
}
/>
{(rightAvatar || rightIcon) && (
<ListItemSecondaryAction>
{rightAvatar && (
<Avatar>{renderAvatar(record, rightAvatar)}</Avatar>
)}
{rightIcon && (
<ListItemIcon>
{rightIcon(record, record.id)}
</ListItemIcon>
)}
</ListItemSecondaryAction>
)}
</>
);
};

const renderAvatar = <RecordType extends RaRecord = any>(
record: RecordType,
avatarCallback: FunctionToElement<RecordType>
) => {
const avatarValue = avatarCallback(record, record.id);
if (
typeof avatarValue === 'string' &&
(avatarValue.startsWith('http') || avatarValue.startsWith('data:'))
) {
return <Avatar src={avatarValue} />;
} else {
return <Avatar>{avatarValue}</Avatar>;
}
};

const PREFIX = 'RaSimpleList';

export const SimpleListClasses = {
Expand Down
11 changes: 10 additions & 1 deletion packages/ra-ui-materialui/src/list/SimpleList/SimpleListItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,15 @@ import { RowClickFunction } from '../types';
export const SimpleListItem = <RecordType extends RaRecord = any>(
props: SimpleListItemProps<RecordType>
) => {
const { children, linkType, rowClick, rowIndex, rowSx, rowStyle } = props;
const {
children,
linkType,
rowClick,
rowIndex,
rowSx,
rowStyle,
secondaryAction,
} = props;
const resource = useResourceContext(props);
const record = useRecordContext<RecordType>(props);
const navigate = useNavigate();
Expand Down Expand Up @@ -64,6 +72,7 @@ export const SimpleListItem = <RecordType extends RaRecord = any>(
width: '100%',
},
}}
secondaryAction={secondaryAction}
>
<ListItemButton
onClick={handleClick}
Expand Down
Loading
Loading