<SimpleList>
For mobile devices, a <Datagrid>
is often unusable - there is simply not enough space to display several columns. The convention in that case is to use a simple list, with only one column per row. The <SimpleList>
component serves that purpose, leveraging Material UI’s <List>
and <ListItem>
components.
<SimpleList>
is an iterator component: it gets an array of ids and a data store from the ListContext
, and iterates over the ids to display each record.
Usage
You can use <SimpleList>
as <List>
or <ReferenceManyField>
child. You must set at least the primaryText
prop, and it should be a function returning the text to render for each list item.
import { List, SimpleList } from 'react-admin';
export const PostList = () => (
<List>
<SimpleList
primaryText={record => record.title}
secondaryText={record => `${record.views} views`}
tertiaryText={record => new Date(record.published_at).toLocaleDateString()}
linkType={record => record.canEdit ? "edit" : "show"}
rowSx={record => ({ backgroundColor: record.nb_views >= 500 ? '#efe' : 'white' })}
/>
</List>
);
<SimpleList>
executes the functions passed as primaryText
, secondaryText
, and tertiaryText
on render, passing the current record
as parameter. It uses the result to render each List item.
Props
Prop | Required | Type | Default | Description |
---|---|---|---|---|
primaryText |
Optional | mixed | record representation | The primary text to display. |
secondaryText |
Optional | mixed | The secondary text to display. | |
tertiaryText |
Optional | mixed | The tertiary text to display. | |
linkType |
Optional | mixed | "edit" |
The target of each item click. |
leftAvatar |
Optional | function | A function returning an <Avatar> component to display before the primary text. |
|
leftIcon |
Optional | function | A function returning an <Icon> component to display before the primary text. |
|
rightAvatar |
Optional | function | A function returning an <Avatar> component to display after the primary text. |
|
rightIcon |
Optional | function | A function returning an <Icon> component to display after the primary text. |
|
rowStyle |
Optional | function | A function returning a style object to apply to each row. | |
rowSx |
Optional | function | A function returning a sx object to apply to each row. | |
empty |
Optional | ReactElement | A ReactElement to display instead of the list when the data is empty. |
empty
It’s possible that a <SimpleList>
will have no records to display. If the <SimpleList>
’s parent component does not handle the empty state, the <SimpleList>
will display a message indicating there are no results. This message is translatable with the key ra.navigation.no_results
.
You can customize the empty state by passing a component to the empty
prop:
const CustomEmpty = () => <div>No books found</div>;
const PostList = () => (
<List>
<SimpleList
primaryText={record => record.title}
empty={<CustomEmpty />}
/>
</List>
);
leftAvatar
This prop should be a function returning an <Avatar>
component. When present, the <ListItem>
renders a <ListItemAvatar>
before the <ListItemText>
leftIcon
This prop should be a function returning an <Icon>
component. When present, the <ListItem>
renders a <ListIcon>
before the <ListItemText>
linkType
The <SimpleList>
items link to the edition page by default. You can also set the linkType
prop to show
directly to link to the <Show>
page instead.
import { List, SimpleList } from 'react-admin';
export const PostList = () => (
<List>
<SimpleList
primaryText={record => record.title}
secondaryText={record => `${record.views} views`}
tertiaryText={record => new Date(record.published_at).toLocaleDateString()}
linkType="show"
/>
</List>
);
linkType
accepts the following values:
linkType="edit"
: links to the edit page. This is the default behavior.linkType="show"
: links to the show page.linkType={false}
: does not create any link.
primaryText
The primaryText
, secondaryText
and tertiaryText
props can accept 4 types of values:
- a function returning a string,
- a string,
- a React element.
undefined
(the default)
If it’s a function, react-admin passes the current record as parameter:
import { List, SimpleList } from 'react-admin';
export const PostList = () => (
<List>
<SimpleList
primaryText={record => record.title}
secondaryText={record => `${record.views} views`}
/>
</List>
);
If it’s a string, react-admin passes it to the translate
function, together with the record
so you can use substitutions with the %{token}
syntax:
import { List, SimpleList } from 'react-admin';
export const PostList = () => (
<List>
<SimpleList
primaryText="%{title}"
secondaryText="%{views} views"
/>
</List>
);
If it’s a React element, react-admin renders it. This means you can use any react-admin field, including reference fields:
import {
List,
ReferenceField,
SimpleList,
TextField,
} from 'react-admin';
export const PostList = () => (
<List>
<SimpleList
primaryText={<TextField source="title" />}
secondaryText={
<ReferenceField reference="categories" source="category_id">
<TextField source="name" />
</ReferenceField>
}
/>
</List>
);
<SimpleList>
creates a RecordContext
for each list item. This allows Field components to grab the current record using useRecordContext
.
If it’s undefined, react-admin uses the recordRepresentation
for the current Resource. This is the default value.
import { List, SimpleList } from 'react-admin';
export const PostList = () => (
<List>
<SimpleList />
</List>
);
rightAvatar
This prop should be a function returning an <Avatar>
component. When present, the <ListItem>
renders a <ListItemAvatar>
after the <ListItemText>
rightIcon
This prop should be a function returning an <Icon>
component. When present, the <ListItem>
renders a <ListIcon>
after the <ListItemText>
.
rowStyle
Deprecated - use rowSx
instead.
This optional prop should be a function, which gets called for each row. It receives the current record and index as arguments, and should return a style object. The style object is applied to the <ListItem>
styles prop.
import { List, SimpleList } from 'react-admin';
const postRowStyle = (record, index) => ({
backgroundColor: record.nb_views >= 500 ? '#efe' : 'white',
});
export const PostList = () => (
<List>
<SimpleList primaryText={record => record.title} rowStyle={postRowStyle} />
</List>
);
rowSx
This optional prop should be a function, which gets called for each row. It receives the current record and index as arguments, and should return a Material UI sx
. The style object is applied to the <ListItem>
sx
prop.
import { List, SimpleList } from 'react-admin';
const postRowSx = (record, index) => ({
backgroundColor: record.nb_views >= 500 ? '#efe' : 'white',
});
export const PostList = () => (
<List>
<SimpleList primaryText={record => record.title} rowSx={postRowSx} />
</List>
);
secondaryText
See primaryText
tertiaryText
See primaryText
Using <SimpleList>
On Small Screens
To use <SimpleList>
on small screens and a <Datagrid>
on larger screens, use Material UI’s useMediaQuery
hook:
import { useMediaQuery } from '@mui/material';
import { List, SimpleList, Datagrid } from 'react-admin';
export const PostList = () => {
const isSmall = useMediaQuery(theme => theme.breakpoints.down('sm'));
return (
<List>
{isSmall ? (
<SimpleList
primaryText={record => record.title}
secondaryText={record => `${record.views} views`}
tertiaryText={record => new Date(record.published_at).toLocaleDateString()}
linkType={record => record.canEdit ? "edit" : "show"}
/>
) : (
<Datagrid>
//...
</Datagrid>
)}
</List>
);
}
Configurable
You can let end users customize the fields displayed in the <SimpleList>
by using the <SimpleListConfigurable>
component instead.
import {
List,
- SimpleList,
+ SimpleListConfigurable,
} from 'react-admin';
export const BookList = () => (
<List>
- <SimpleList
+ <SimpleListConfigurable
primaryText={record => record.title}
secondaryText={record => record.author}
tertiaryText={record => record.date}
/>
</List>
);
When users enter the configuration mode and select the <SimpleList>
, they can set the primaryText
, secondaryText
, and tertiaryText
fields via the inspector. <SimpleList>
uses the useTranslate
hook to render the fields. The translate
function receives the current record as parameter. This means users can access the record field using the %{field}
syntax, e.g.:
Title: %{title} (by %{author})