From 39602dfcd7f5d4f84eaa01958551a803e8a5e2b7 Mon Sep 17 00:00:00 2001 From: fzaninotto Date: Wed, 15 Nov 2023 08:01:39 +0100 Subject: [PATCH 01/10] [Doc] Add headless section in pages components --- docs/Create.md | 89 +++++++++++ docs/Edit.md | 89 +++++++++++ docs/EditBase.md | 29 ++-- docs/List.md | 149 ++++++++++++++++++ docs/Show.md | 94 ++++++++--- docs/SimpleForm.md | 32 ++++ docs/useCreateController.md | 51 +++--- docs/useEditController.md | 9 +- .../src/form/SimpleForm.stories.tsx | 24 ++- 9 files changed, 505 insertions(+), 61 deletions(-) diff --git a/docs/Create.md b/docs/Create.md index 6190ab2cdd9..80f2dac1ef6 100644 --- a/docs/Create.md +++ b/docs/Create.md @@ -50,6 +50,8 @@ const App = () => ( export default App; ``` +## Props + You can customize the `` component using the following props: * [`actions`](#actions): override the actions toolbar with a custom component @@ -599,3 +601,90 @@ export default OrderEdit; ``` **Tip:** If you'd like to avoid creating an intermediate component like ``, or are using an ``, you can use the [``](./Inputs.md#linking-two-inputs) component as an alternative. + +## Controlled Mode + +`` deduces the resource and the initial form values from the URL. This is fine for a creation page, but if you need to let users create records from another page, you probably want to define this parameter yourself. + +In that case, use the [`resource`](#resource) and [`record`](#record) props to set the creation parameters regardless of the URL. + +```jsx +import { Create, SimpleForm, TextInput, SelectInput } from "react-admin"; + +export const BookCreate = () => ( + + + + + + + +); +``` + +**Tip**: You probably also want to customize [the `redirect` prop](#redirect) if you embed an `` component in another page. + +## Headless Version + +Besides preparing a save handler, `` renders the default creation page layout (title, actions, a Material UI ``) and its children. If you need a custom creation layout, you may prefer [the `` component](./CreateBase.md), which only renders its children in a [`CreateContext`](./useCreateContext.md). + +```jsx +import { CreateBase, SelectInput, SimpleForm, TextInput, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; + +export const BookCreate = () => ( + + + + <Card> + <CardContent> + <SimpleForm> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </CardContent> + </Card> + </Container> + </CreateBase> +); +``` + +In the previous example, `<SimpleForm>` grabs the save handler from the `CreateContext`. + +If you don't need the `CreateContext`, you can use [the `useCreateController` hook](./useCreateController.md), which does the same data fetching as `<CreateBase>` but lets you render the content. + +```jsx +import { useCreateController, SelectInput, SimpleForm, TextInput, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; + +export const BookCreate = () => { + const { save } = useCreateController(); + return ( + <Container> + <Title title="Create book" /> + <Card> + <CardContent> + <SimpleForm onSubmit={save}> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </CardContent> + </Card> + </Container> + ); +}; +``` \ No newline at end of file diff --git a/docs/Edit.md b/docs/Edit.md index 3a12eaf1f51..436365b7b60 100644 --- a/docs/Edit.md +++ b/docs/Edit.md @@ -58,6 +58,8 @@ const App = () => ( export default App; ``` +## Props + You can customize the `<Edit>` component using the following props: * [`actions`](#actions): override the actions toolbar with a custom component @@ -770,3 +772,90 @@ export const PostEdit = () => ( ``` **Tips:** If you want users to be warned if they haven't pressed the Save button when they browse to another record, you can follow the tutorial [Navigating Through Records In`<Edit>` Views](./PrevNextButtons.md#navigating-through-records-in-edit-views-after-submit). + +## Controlled Mode + +`<Edit>` deduces the resource and the record id from the URL. This is fine for an edition page, but if you need to let users edit records from another page, you probably want to define the edit parameters yourself. + +In that case, use the [`resource`](#resource) and [`id`](#id) props to set the edit parameters regardless of the URL. + +```jsx +import { Edit, SimpleForm, TextInput, SelectInput } from "react-admin"; + +export const BookEdit = ({ id }) => ( + <Edit resource="books" id={id} redirect={false}> + <SimpleForm> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </Edit> +); +``` + +**Tip**: You probably also want to customize [the `redirect` prop](#redirect) if you embed an `<Edit>` component in another page. + +## Headless Version + +Besides fetching a record and preparing a save handler, `<Edit>` renders the default edition page layout (title, actions, a Material UI `<Card>`) and its children. If you need a custom edition layout, you may prefer [the `<EditBase>` component](./EditBase.md), which only renders its children in an [`EditContext`](./useEditContext.md). + +```jsx +import { EditBase, SelectInput, SimpleForm, TextInput, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; + +export const BookEdit = () => ( + <EditBase> + <Container> + <Title title="Book Edition" /> + <Card> + <CardContent> + <SimpleForm> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </CardContent> + </Card> + </Container> + </EditBase> +); +``` + +In the previous example, `<SimpleForm>` grabs the record and the save handler from the `EditContext`. + +If you don't need the `EditContext`, you can use [the `useEditController` hook](./useEditController.md), which does the same data fetching as `<EditBase>` but lets you render the content. + +```tsx +import { useEditController, SelectInput, SimpleForm, TextInput, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; + +export const BookEdit = () => { + const { record, save } = useEditController(); + return ( + <Container> + <Title title={`Edit book ${record?.title}`} /> + <Card> + <CardContent> + <SimpleForm record={record} onSubmit={save}> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </CardContent> + </Card> + </Container> + ); +}; +``` \ No newline at end of file diff --git a/docs/EditBase.md b/docs/EditBase.md index 33c39947ce5..5a731679f04 100644 --- a/docs/EditBase.md +++ b/docs/EditBase.md @@ -14,26 +14,27 @@ It does that by calling [`useEditController`](./useEditController.md), and by pu Use `<EditBase>` to create a custom Edition view, with exactly the content you add as child and nothing else (no title, Card, or list of actions as in the `<Edit>` component). ```jsx -import * as React from "react"; -import { EditBase, SimpleForm, TextInput, SelectInput } from "react-admin"; -import { Card } from "@mui/material"; +import { EditBase, SelectInput, SimpleForm, TextInput, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; export const BookEdit = () => ( <EditBase> - <div> + <Container> <Title title="Book Edition" /> <Card> - <SimpleForm> - <TextInput source="title" /> - <TextInput source="author" /> - <SelectInput source="availability" choices={[ - { id: "in_stock", name: "In stock" }, - { id: "out_of_stock", name: "Out of stock" }, - { id: "out_of_print", name: "Out of print" }, - ]} /> - </SimpleForm> + <CardContent> + <SimpleForm> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </CardContent> </Card> - </div> + </Container> </EditBase> ); ``` diff --git a/docs/List.md b/docs/List.md index 855abcbd21f..08e0d25d9e4 100644 --- a/docs/List.md +++ b/docs/List.md @@ -1081,3 +1081,152 @@ const ProductList = () => ( </List> ) ``` + +## Controlled Mode + +`<List>` deduces the resource and the list parameters from the URL. This is fine for a page showing a single list of records, but if you need to display more than one list in a page, you probably want to define the list parameters yourself. + +In that case, use the [`resource`](#resource), [`sort`](#sort), [`filter`](#filter-permanent-filter), and [`perPage`](#perpage) props to set the list parameters. + +{% raw %} +```jsx +import { List, SimpleList } from 'react-admin'; +import { Container, Typography } from '@mui/material'; + +const Dashboard = () => ( + <Container> + <Typography>Latest posts</Typography> + <List + resource="posts" + sort={{ field: 'published_at', order: 'DESC' }} + filter={{ is_published: true }} + perPage={10} + > + <SimpleList + primaryText={record => record.title} + secondaryText={record => `${record.views} views`} + /> + </List> + <Typography>Latest comments</Typography> + <List + resource="comments" + sort={{ field: 'published_at', order: 'DESC' }} + perPage={10} + > + <SimpleList + primaryText={record => record.author.name} + secondaryText={record => record.body} + tertiaryText={record => new Date(record.published_at).toLocaleDateString()} + /> + </List> + </Container> +) +``` +{% endraw %} + +If the `<List>` children allow to *modify* the list state (i.e. if they let users change the sort order, the filters, the selection, or the pagination), then you should also use the [`disableSyncWithLocation`](#disablesyncwithlocation) prop to prevent react-admin from changing the URL. This is the case e.g. if you use a `<Datagrid>`, which lets users sort the list by clicking on column headers. + +{% raw %} +```jsx +import { List, Datagrid, TextField, NumberField, DateField } from 'react-admin'; +import { Container, Typography } from '@mui/material'; + +const Dashboard = () => ( + <Container> + <Typography>Latest posts</Typography> + <List + resource="posts" + sort={{ field: 'published_at', order: 'DESC' }} + filter={{ is_published: true }} + perPage={10} + disableSyncWithLocation + > + <Datagrid bulkActionButtons={false}> + <TextField source="title" /> + <NumberField source="views" /> + </Datagrid> + </List> + <Typography>Latest comments</Typography> + <List + resource="comments" + sort={{ field: 'published_at', order: 'DESC' }} + perPage={10} + disableSyncWithLocation + > + <Datagrid bulkActionButtons={false}> + <TextField source="author.name" /> + <TextField source="body" /> + <DateField source="published_at" /> + </Datagrid> + </List> + </Container> +) +``` +{% endraw %} + +**Note**: If you render more than one `<Datagrid>` for the same resource in the same page, they will share the selection state (i.e. the checked checkboxes). This is a design choice because if row selection is not tied to a resource, then when a user deletes a record it may remain selected without any ability to unselect it. You can get rid of the checkboxes by setting `<Datagrid bulkActionButtons={false}>`. + +## Headless Version + +Besides fetching a list of records from the data provider, `<List>` renders the default list page layout (title, buttons, filters, a Material-UI `<Card>`, pagination) and its children. If you need a custom list layout, you may prefer [the `<ListBase>` component](./ListBase.md), which only renders its children in a [`ListContext`](./useListContext.md). + +```jsx +import { ListBase } from 'react-admin'; +import { Card, CardContent, Container, Stack, Typography } from '@mui/material'; + +const ProductList = () => ( + <ListBase> + <Container> + <Typography variant="h4">All products</Typography> + <WithListContext render={({ isLoading, data }) => ( + !isLoading && ( + <Stack spacing={1}> + {data.map(product => ( + <Card key={product.id}> + <CardContent> + <Typography>{product.name}</Typography> + </CardContent> + </Card> + ))} + </Stack> + ) + )} /> + <WithListContext render={({ isLoading, total }) => ( + !isLoading && <Typography>{total} results</Typography> + )} /> + </Container> + </ListBase> +); +``` + +The previous example leverages [`<WithListContext>`](./WithListContext.md) to grab the data that `<ListBase>` stores in the `ListContext`. + +If you don't need the `ListContext`, you can use [the `useListController` hook](./useListController.md), which does the same data fetching as `<ListBase>` but lets you render the content. + +```jsx +import { useListController } from 'react-admin'; +import { Card, CardContent, Container, Stack, Typography } from '@mui/material'; + +const ProductList = () => { + const { isLoading, data, total } = useListController(); + return ( + <Container> + <Typography variant="h4">All products</Typography> + {!isLoading && ( + <Stack spacing={1}> + {data.map(product => ( + <Card key={product.id}> + <CardContent> + <Typography>{product.name}</Typography> + </CardContent> + </Card> + ))} + </Stack> + )} + {!isLoading && <Typography>{total} results</Typography>} + </Container> + ); +}; +``` + +`useListController` returns callbacks to sort, filter, and paginate the list, so you can build a complete List page. Check [the `useListController`hook documentation](./useListController.md) for details. \ No newline at end of file diff --git a/docs/Show.md b/docs/Show.md index 72232a130dc..930a5d0dd38 100644 --- a/docs/Show.md +++ b/docs/Show.md @@ -604,31 +604,87 @@ export const PostShow = () => ( **Tips:** If you want the `<PrevNextButtons>` to link to the `<Show>` view, you have to set the `linkType` to `show`. See [the `<PrevNextButtons linkType>` prop](./PrevNextButtons.md#linktype). -## Headless Version +## Controlled Mode -The root component of `<Show>` is a Material UI `<Card>`. Besides, `<Show>` renders an action toolbar, and sets the page title. This may be useless if you have a completely custom layout. +`<show>` deduces the resource and the record id from the URL. This is fine for a detail page, but if you need to embed the details of a record in another page, you probably want to define these parameters yourself. -In that case, opt for [the `<ShowBase>` component](./ShowBase.md), a headless version of `<Show>`. +In that case, use the [`resource`](#resource) and [`id`](#id) props to set the show parameters regardless of the URL. ```jsx -// in src/posts.jsx -import { ShowBase } from 'react-admin'; +import { Show, SelectField, SimpleShowLayout, TextField, Title } from "react-admin"; -export const PostShow = () => ( +export const BookShow = ({ id }) => ( + <Show resource="books" id={id}> + <SimpleShowLayout> + <TextField source="title" /> + <TextField source="author" /> + <SelectField source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleShowLayout> + </Show> +); +``` + +## Headless Version + +Besides fetching a record, `<Show>` renders the default detail page layout (title, actions, a Material UI `<Card>`) and its children. If you need a custom detail layout, you may prefer [the `<ShowBase>` component](./ShowBase.md), which only renders its children in a [`ShowContext`](./useShowContext.md). + +```jsx +import { ShowBase, SelectField, SimpleShowLayout, TextField, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; + +export const BookShow = () => ( <ShowBase> - <Grid container> - <Grid item xs={8}> - <SimpleShowLayout> - ... - </SimpleShowLayout> - </Grid> - <Grid item xs={4}> - Show instructions... - </Grid> - </Grid> - <div> - Post related links... - </div> + <Container> + <Title title="Book Detail" /> + <Card> + <CardContent> + <SimpleShowLayout> + <TextField source="title" /> + <TextField source="author" /> + <SelectField source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleShowLayout> + </CardContent> + </Card> + </Container> </ShowBase> ); +``` + +In the previous example, `<SimpleShowLayout>` grabs the record from the `ShowContext`. + +If you don't need the `ShowContext`, you can use [the `useShowController` hook](./useShowController.md), which does the same data fetching as `<ShowBase>` but lets you render the content. + +```tsx +import { useShowController, SelectField, SimpleShowLayout, TextField, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; + +export const BookShow = () => { + const { record } = useShowController(); + return ( + <Container> + <Title title={`Edit book ${record?.title}`} /> + <Card> + <CardContent> + <SimpleShowLayout record={record}> + <TextField source="title" /> + <TextField source="author" /> + <SelectField source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleShowLayout> + </CardContent> + </Card> + </Container> + ); +}; ``` \ No newline at end of file diff --git a/docs/SimpleForm.md b/docs/SimpleForm.md index 603ce3953c6..d08bd279e2f 100644 --- a/docs/SimpleForm.md +++ b/docs/SimpleForm.md @@ -738,3 +738,35 @@ export default OrderEdit; ``` **Tip:** If you'd like to avoid creating an intermediate component like `<CityInput>`, or are using an `<ArrayInput>`, you can use the [`<FormDataConsumer>`](./Inputs.md#linking-two-inputs) component as an alternative. + +## Headless Version + +`<SimpleForm>` renders its children in a Material UI `<Stack>`, and renders a toolbar with a `<SaveButton>`. If you want to build a custom form layout, you can use [the `<Form>` component](./Form.md) instead. + +```jsx +import { Create, Form, TextInput, RichTextInput, SaveButton } from 'react-admin'; +import { Grid } from '@mui/material'; + +export const PostCreate = () => ( + <Create> + <Form> + <Grid container> + <Grid item xs={6}> + <TextInput source="title" fullWidth /> + </Grid> + <Grid item xs={6}> + <TextInput source="author" fullWidth /> + </Grid> + <Grid item xs={12}> + <RichTextInput source="body" fullWidth /> + </Grid> + <Grid item xs={12}> + <SaveButton /> + </Grid> + </Grid> + </Form> + </Create> +); +``` + +React-admin forms leverage react-hook-form's [`useForm` hook](https://react-hook-form.com/docs/useform). \ No newline at end of file diff --git a/docs/useCreateController.md b/docs/useCreateController.md index eaca03499ce..ed5da639805 100644 --- a/docs/useCreateController.md +++ b/docs/useCreateController.md @@ -13,36 +13,37 @@ React-admin calls `useCreateController` internally, when you use the `<Create>`, Use `useCreateController` to create a custom creation view, with exactly the content you need. -{% raw %} -```jsx -import * as React from "react"; -import { useCreateController, CreateContextProvider, SimpleForm, TextInput, SelectInput } from "react-admin"; -import { Card } from "@mui/material"; +```tsx +import { useCreateController, SelectInput, SimpleForm, TextInput, Title } from "react-admin"; +import { Card, CardContent, Container } from "@mui/material"; export const BookCreate = () => { - const { save } = useCreateController({ resource: 'books' }); - return ( - <div> - <Title title="Book Creation" /> - <Card> - <SimpleForm onSubmit={save} record={{}} > - <TextInput source="title" /> - <TextInput source="author" /> - <SelectInput source="availability" choices={[ - { id: "in_stock", name: "In stock" }, - { id: "out_of_stock", name: "Out of stock" }, - { id: "out_of_print", name: "Out of print" }, - ]} /> - </SimpleForm> - </Card> - </div> - ); + const { save } = useCreateController(); + return ( + <Container> + <Title title="Create book" /> + <Card> + <CardContent> + <SimpleForm onSubmit={save}> + <TextInput source="title" /> + <TextInput source="author" /> + <SelectInput source="availability" choices={[ + { id: "in_stock", name: "In stock" }, + { id: "out_of_stock", name: "Out of stock" }, + { id: "out_of_print", name: "Out of print" }, + ]} /> + </SimpleForm> + </CardContent> + </Card> + </Container> + ); }; ``` -{% endraw %} **Tip**: If you just use the return value of `useCreateController` to put it in an `CreateContext`, use [the `<CreateBase>` component](./CreateBase.md) instead for simpler markup. +## Input Format + `useCreateController` accepts an options argument, with the following fields, all optional: * [`disableAuthentication`](./Create.md#disableauthentication): disable the authentication check @@ -52,6 +53,10 @@ export const BookCreate = () => { * [`resource`](./Create.md#resource): override the name of the resource to create * [`transform`](./Create.md#transform): transform the form data before calling `dataProvider.create()` +These fields are documented in [the `<Create>` component](./Create.md) documentation. + +## Return Value + `useCreateController` returns an object with the following fields: ```jsx diff --git a/docs/useEditController.md b/docs/useEditController.md index c8396e83dde..a091a208a3f 100644 --- a/docs/useEditController.md +++ b/docs/useEditController.md @@ -13,9 +13,7 @@ React-admin calls `useEditController` internally when you use the `<Edit>`, `<Ed Use `useEditController` to create a custom Edition view, with exactly the content you need. -{% raw %} ```jsx -import * as React from "react"; import { useParams } from "react-router-dom"; import { useEditController, EditContextProvider, SimpleForm, TextInput, SelectInput } from "react-admin"; import { Card } from "@mui/material"; @@ -42,10 +40,11 @@ export const BookEdit = () => { ); }; ``` -{% endraw %} **Tip**: If you just use the return value of `useEditController` to put it in an `EditContext`, use [the `<EditBase>` component](./EditBase.md) instead for simpler markup. +## Input Format + `useEditController` accepts an options argument, with the following fields, all optional: * [`disableAuthentication`](./Edit.md#disableauthentication): disable the authentication check @@ -57,6 +56,10 @@ export const BookEdit = () => { * [`resource`](./Edit.md#resource): override the name of the resource to create * [`transform`](./Edit.md#transform): transform the form data before calling `dataProvider.update()` +These fields are documented in [the `<Edit>` component](./Edit.md) documentation. + +## Return Value + `useEditController` returns an object with the following fields: ```jsx diff --git a/packages/ra-ui-materialui/src/form/SimpleForm.stories.tsx b/packages/ra-ui-materialui/src/form/SimpleForm.stories.tsx index d5905a8971d..ae06a3b24ee 100644 --- a/packages/ra-ui-materialui/src/form/SimpleForm.stories.tsx +++ b/packages/ra-ui-materialui/src/form/SimpleForm.stories.tsx @@ -5,12 +5,13 @@ import { ResourceContextProvider, testDataProvider, } from 'ra-core'; +import { Stack, ThemeProvider, createTheme } from '@mui/material'; +import { MemoryRouter } from 'react-router-dom'; import { AdminContext } from '../AdminContext'; import { Edit } from '../detail'; import { NumberInput, TextInput } from '../input'; import { SimpleForm } from './SimpleForm'; -import { Stack } from '@mui/material'; export default { title: 'ra-ui-materialui/forms/SimpleForm' }; @@ -33,7 +34,7 @@ const Wrapper = ({ i18nProvider={i18nProvider} dataProvider={testDataProvider({ getOne: () => Promise.resolve({ data }), - })} + } as any)} > <ResourceContextProvider value="books"> <Edit id={1} sx={{ width: 600 }}> @@ -169,3 +170,22 @@ export const InputBasedValidation = () => ( </SimpleForm> </Wrapper> ); + +export const Controlled = () => { + const [record, setRecord] = React.useState({} as any); + return ( + <MemoryRouter> + <ThemeProvider theme={createTheme()}> + <SimpleForm + resource="books" + onSubmit={values => setRecord(values)} + > + <TextInput source="title" fullWidth /> + <TextInput source="author" /> + <NumberInput source="year" /> + </SimpleForm> + <div>Record values: {JSON.stringify(record)}</div> + </ThemeProvider> + </MemoryRouter> + ); +}; From 8dbece9bed9dc1305cf0c607df8a7b1508fd675f Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Wed, 15 Nov 2023 18:33:30 +0100 Subject: [PATCH 02/10] Add controlled and headless mode to InfiniteList --- docs/InfiniteList.md | 109 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/docs/InfiniteList.md b/docs/InfiniteList.md index f76e24955d7..b367d8c95ff 100644 --- a/docs/InfiniteList.md +++ b/docs/InfiniteList.md @@ -161,4 +161,111 @@ export const BookList = () => ( </InfiniteList> ); ``` -{% endraw %} \ No newline at end of file +{% endraw %} + +## Controlled Mode + +`<InfiniteList>` deduces the resource and the list parameters from the URL. This is fine for a page showing a single list of records, but if you need to display more than one list in a page, you probably want to define the list parameters yourself. + +In that case, use the [`resource`](#resource), [`sort`](#sort), and [`filter`](#filter-permanent-filter) props to set the list parameters. + +{% raw %} +```jsx +import { InfiniteList, SimpleList } from 'react-admin'; +import { Container, Typography } from '@mui/material'; + +const Dashboard = () => ( + <Container> + <Typography>Latest posts</Typography> + <InfiniteList + resource="posts" + sort={{ field: 'published_at', order: 'DESC' }} + filter={{ is_published: true }} + disableSyncWithLocation + > + <SimpleList + primaryText={record => record.title} + secondaryText={record => `${record.views} views`} + /> + <InfinitePagination /> + </InfiniteList> + <Typography>Latest comments</Typography> + <InfiniteList + resource="comments" + sort={{ field: 'published_at', order: 'DESC' }} + perPage={10} + disableSyncWithLocation + > + <SimpleList + primaryText={record => record.author.name} + secondaryText={record => record.body} + tertiaryText={record => new Date(record.published_at).toLocaleDateString()} + /> + <InfinitePagination /> + </InfiniteList> + </Container> +) +``` +{% endraw %} + +## Headless Version + +Besides fetching a list of records from the data provider, `<InfiniteList>` renders the default list page layout (title, buttons, filters, a Material-UI `<Card>`, infinite pagination) and its children. If you need a custom list layout, you may prefer the `<InfiniteListBase>` component, which only renders its children in a [`ListContext`](./useListContext.md). + +```jsx +import { InfiniteListBase, InfinitePagination } from 'react-admin'; +import { Card, CardContent, Container, Stack, Typography } from '@mui/material'; + +const ProductList = () => ( + <InfiniteListBase> + <Container> + <Typography variant="h4">All products</Typography> + <WithListContext render={({ isLoading, data }) => ( + !isLoading && ( + <Stack spacing={1}> + {data.map(product => ( + <Card key={product.id}> + <CardContent> + <Typography>{product.name}</Typography> + </CardContent> + </Card> + ))} + </Stack> + ) + )} /> + <InfinitePagination /> + </Container> + </InfiniteListBase> +); +``` + +The previous example leverages [`<WithListContext>`](./WithListContext.md) to grab the data that `<ListBase>` stores in the `ListContext`. + +If you don't need the `ListContext`, you can use the `useInfiniteListController` hook, which does the same data fetching as `<InfiniteListBase>` but lets you render the content. + +```jsx +import { useInfiniteListController } from 'react-admin'; +import { Card, CardContent, Container, Stack, Typography } from '@mui/material'; + +const ProductList = () => { + const { isLoading, data } = useInfiniteListController(); + return ( + <Container> + <Typography variant="h4">All products</Typography> + {!isLoading && ( + <Stack spacing={1}> + {data.map(product => ( + <Card key={product.id}> + <CardContent> + <Typography>{product.name}</Typography> + </CardContent> + </Card> + ))} + </Stack> + )} + </Container> + ); +}; +``` + +`useInfiniteListController` returns callbacks to sort, filter, and paginate the list, so you can build a complete List page. \ No newline at end of file From 49dbbdbdda704d1cee7016a7af6fa08b8323cfcf Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Wed, 15 Nov 2023 18:34:01 +0100 Subject: [PATCH 03/10] Mention Fields for relationships --- docs/List.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/List.md b/docs/List.md index 08e0d25d9e4..f9fb8f33c48 100644 --- a/docs/List.md +++ b/docs/List.md @@ -1124,6 +1124,12 @@ const Dashboard = () => ( ``` {% endraw %} +**Note**: If you need to set the list parameters to render a list of records *related to another record*, there are better components than `<List>` for that. Check out the following components, specialized in fetching and displaying a list of related records: + +- [`<ReferenceArrayField>`](./ReferenceArrayField.md), +- [`<ReferenceManyField>`](./ReferenceManyField.md), +- [`<ReferenceManyToManyField>`](./ReferenceManyToManyField.md). + If the `<List>` children allow to *modify* the list state (i.e. if they let users change the sort order, the filters, the selection, or the pagination), then you should also use the [`disableSyncWithLocation`](#disablesyncwithlocation) prop to prevent react-admin from changing the URL. This is the case e.g. if you use a `<Datagrid>`, which lets users sort the list by clicking on column headers. {% raw %} From 8d4061dc40502b2e4aca8484d8fb7f9cb79e5054 Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Wed, 15 Nov 2023 18:34:23 +0100 Subject: [PATCH 04/10] Mention that headless components can be used without MUI --- docs/CreateBase.md | 6 ++++-- docs/EditBase.md | 8 ++++++-- docs/Form.md | 4 +++- docs/ListBase.md | 6 ++++-- docs/ShowBase.md | 9 +++------ 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/docs/CreateBase.md b/docs/CreateBase.md index 73e9d1ce7f5..342c5d61b39 100644 --- a/docs/CreateBase.md +++ b/docs/CreateBase.md @@ -5,9 +5,11 @@ title: "The CreateBase Component" # `<CreateBase>` -The `<CreateBase>` component is a headless version of `<Create>`: it prepares a form submit handler, and renders its children. +`<CreateBase>` is a headless variant of [`<Create>`](./Create.md). It prepares a form submit handler, and renders its children in a [`CreateContext`](./useCreateContext.md). Use it to build a custom creation page layout, or to use another UI kit than Material UI. -It does that by calling `useCreateController`, and by putting the result in an `CreateContext`. +Contrary to [`<Create>`](./Create.md), it does not render the page layout, so no title, no actions, and no `<Card>`. + +`<CreateBase>` relies on the [`useCreateController`](./useCreateController.md) hook. ## Usage diff --git a/docs/EditBase.md b/docs/EditBase.md index 5a731679f04..9cac0f0738b 100644 --- a/docs/EditBase.md +++ b/docs/EditBase.md @@ -5,9 +5,11 @@ title: "The EditBase Component" # `<EditBase>` -The `<EditBase>` component is a headless version of [`<Edit>`](./Edit.md): it fetches a record based on the URL, prepares a form submit handler, and renders its children. +`<EditBase>` is a headless variant of [`<Edit>`](./Edit.md): it fetches a record based on the URL, prepares a form submit handler, and renders its children inside an [`EditContext`](./useEditContext.md). Use it to build a custom edition page layout, or to use another UI kit than Material UI. -It does that by calling [`useEditController`](./useEditController.md), and by putting the result in an `EditContext`. +Contrary to [`<Edit>`](./Edit.md), it does not render the page layout, so no title, no actions, and no `<Card>`. + +`<EditBase>` relies on the [`useEditController`](./useEditController.md) hook. ## Usage @@ -39,6 +41,8 @@ export const BookEdit = () => ( ); ``` +## Props + You can customize the `<EditBase>` component using the following props, documented in the `<Edit>` component: * `children`: the components that renders the form diff --git a/docs/Form.md b/docs/Form.md index feda9012628..3d0fb9feab7 100644 --- a/docs/Form.md +++ b/docs/Form.md @@ -5,10 +5,12 @@ title: "Form" # `<Form>` -The `<Form>` component creates a `<form>` to edit a record, and renders its children. It is a headless component used internally by `<SimpleForm>`, `<TabbedForm>`, and other form components. +`<Form>` is a headless component that creates a `<form>` to edit a record, and renders its children. Use it to build a custom form layout, or to use another UI kit than Material UI. `<Form>` reads the `record` from the `RecordContext`, uses it to initialize the defaultValues of a react-hook-form via `useForm`, turns the `validate` function info a react-hook-form compatible form validator, notifies the user when the input validation fails, and creates a form context via `<FormProvider>`. +`<Form>` is used internally by `<SimpleForm>`, `<TabbedForm>`, and other form components. + ## Usage Use `<Form>` to build completely custom form layouts. Don't forget to include a submit button (or react-admin's [`<SaveButton>`](./SaveButton.md)) to actually save the record. diff --git a/docs/ListBase.md b/docs/ListBase.md index c8cfea8972e..29f3c16eadb 100644 --- a/docs/ListBase.md +++ b/docs/ListBase.md @@ -5,9 +5,11 @@ title: "The ListBase Component" # `<ListBase>` -`<ListBase>` is a headless variant of `<List>`, as it does not render anything. `<ListBase>` calls [`useListController`](./useListController.md), puts the result in a `ListContext`, then renders its child. +`<ListBase>` is a headless variant of [`<List>`](./List.md). It fetches a list of records from the data provider, puts it in a [`ListContext`](./useListContext.md), and renders its children. Use it to build a custom list layout, or to use another UI kit than Material UI. -If you want to display a record list in an entirely custom layout, i.e. use only the data fetching part of `<List>` and not the view layout, use `<ListBase>`. +Contrary to [`<List>`](./List.md), it does not render the page layout, so no title, no actions, no `<Card>`, and no pagination. + +`<ListBase>` relies on the [`useListController`](./useListController.md) hook. ## Usage diff --git a/docs/ShowBase.md b/docs/ShowBase.md index 4e129d87c3d..efd97caef20 100644 --- a/docs/ShowBase.md +++ b/docs/ShowBase.md @@ -5,15 +5,12 @@ title: "The ShowBase Component" # `<ShowBase>` -`<ShowBase>` is a headless component that lets you build custom Show pages. It handles the logic of the Show page: - -- it calls `useShowController` to fetch the record from the data provider via `dataProvider.getOne()`, -- it computes the default page title -- it creates a `ShowContext` and a `RecordContext`, -- it renders its child component +`<ShowBase>` is a headless variant of [`<Show>`](./Show.md). It fetches the record from the data provider via `dataProvider.getOne()`, puts it in a [`ShowContext`](./useShowContext.md), and renders its child. Use it to build a custom show page layout, or to use another UI kit than Material UI. Contrary to [`<Show>`](./Show.md), it does not render the page layout, so no title, no actions, and no `<Card>`. +`<ShowBase>` relies on the [`useShowController`](./useShowController.md) hook. + ## Usage Use `<ShowBase>` instead of `<Show>` when you want a completely custom page layout, without the default actions and title. From c911d196e6753ef28ee8bfd51c4b92f8db4db97f Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Thu, 16 Nov 2023 07:00:59 +0100 Subject: [PATCH 05/10] Update controllers introduction to mentino other ui kits --- docs/CreateBase.md | 2 +- docs/EditBase.md | 2 +- docs/ListBase.md | 2 +- docs/ShowBase.md | 2 +- docs/useCreateController.md | 7 +++++-- docs/useEditController.md | 6 ++++-- docs/useListController.md | 6 ++++-- docs/useShowController.md | 8 +++----- 8 files changed, 20 insertions(+), 15 deletions(-) diff --git a/docs/CreateBase.md b/docs/CreateBase.md index 342c5d61b39..c5c40d01bdf 100644 --- a/docs/CreateBase.md +++ b/docs/CreateBase.md @@ -5,7 +5,7 @@ title: "The CreateBase Component" # `<CreateBase>` -`<CreateBase>` is a headless variant of [`<Create>`](./Create.md). It prepares a form submit handler, and renders its children in a [`CreateContext`](./useCreateContext.md). Use it to build a custom creation page layout, or to use another UI kit than Material UI. +`<CreateBase>` is a headless variant of [`<Create>`](./Create.md). It prepares a form submit handler, and renders its children in a [`CreateContext`](./useCreateContext.md). Use it to build a custom creation page layout. Contrary to [`<Create>`](./Create.md), it does not render the page layout, so no title, no actions, and no `<Card>`. diff --git a/docs/EditBase.md b/docs/EditBase.md index 9cac0f0738b..e6965400ff8 100644 --- a/docs/EditBase.md +++ b/docs/EditBase.md @@ -5,7 +5,7 @@ title: "The EditBase Component" # `<EditBase>` -`<EditBase>` is a headless variant of [`<Edit>`](./Edit.md): it fetches a record based on the URL, prepares a form submit handler, and renders its children inside an [`EditContext`](./useEditContext.md). Use it to build a custom edition page layout, or to use another UI kit than Material UI. +`<EditBase>` is a headless variant of [`<Edit>`](./Edit.md): it fetches a record based on the URL, prepares a form submit handler, and renders its children inside an [`EditContext`](./useEditContext.md). Use it to build a custom edition page layout. Contrary to [`<Edit>`](./Edit.md), it does not render the page layout, so no title, no actions, and no `<Card>`. diff --git a/docs/ListBase.md b/docs/ListBase.md index 29f3c16eadb..4440b791a27 100644 --- a/docs/ListBase.md +++ b/docs/ListBase.md @@ -5,7 +5,7 @@ title: "The ListBase Component" # `<ListBase>` -`<ListBase>` is a headless variant of [`<List>`](./List.md). It fetches a list of records from the data provider, puts it in a [`ListContext`](./useListContext.md), and renders its children. Use it to build a custom list layout, or to use another UI kit than Material UI. +`<ListBase>` is a headless variant of [`<List>`](./List.md). It fetches a list of records from the data provider, puts it in a [`ListContext`](./useListContext.md), and renders its children. Use it to build a custom list layout. Contrary to [`<List>`](./List.md), it does not render the page layout, so no title, no actions, no `<Card>`, and no pagination. diff --git a/docs/ShowBase.md b/docs/ShowBase.md index efd97caef20..fc269411c55 100644 --- a/docs/ShowBase.md +++ b/docs/ShowBase.md @@ -5,7 +5,7 @@ title: "The ShowBase Component" # `<ShowBase>` -`<ShowBase>` is a headless variant of [`<Show>`](./Show.md). It fetches the record from the data provider via `dataProvider.getOne()`, puts it in a [`ShowContext`](./useShowContext.md), and renders its child. Use it to build a custom show page layout, or to use another UI kit than Material UI. +`<ShowBase>` is a headless variant of [`<Show>`](./Show.md). It fetches the record from the data provider via `dataProvider.getOne()`, puts it in a [`ShowContext`](./useShowContext.md), and renders its child. Use it to build a custom show page layout. Contrary to [`<Show>`](./Show.md), it does not render the page layout, so no title, no actions, and no `<Card>`. diff --git a/docs/useCreateController.md b/docs/useCreateController.md index ed5da639805..f1bdbee369a 100644 --- a/docs/useCreateController.md +++ b/docs/useCreateController.md @@ -5,9 +5,11 @@ title: "The useCreateController hook" # `useCreateController` -The `useCreateController` hook contains the logic of [the `<Create>` component](./Create.md): it prepares a form submit handler, and returns the data and callbacks necessary to render a Creation view. +`useCreateController` contains the headless logic of the [`<Create>`](./Create.md) component. It's useful to create a custom creation view. It's also the base hook when building a custom view with another UI kit than Material UI. -React-admin calls `useCreateController` internally, when you use the `<Create>`, or `<CreateBase>` component. +`useCreateController` reads the resource name from the resource context and browser location, computes the form default values, prepares a form submit handler based on `dataProvider.create()`, computes the default page title, and returns them. Its return value matches the [`CreateContext`](./useCreateContext.md) shape. + +`useCreateController` is used internally by [`<Create>`](./Create.md) and [`<CreateBase>`](./CreateBase.md). If your Create view uses react-admin components like `<SimpleForm>`, prefer [`<CreateBase>`](./CreateBase.md) to `useCreateController` as it takes care of creating a `<CreateContext>`. ## Usage @@ -62,6 +64,7 @@ These fields are documented in [the `<Create>` component](./Create.md) documenta ```jsx const { defaultTitle, // the translated title based on the resource, e.g. 'Create New Post' + record, // the default values of the creation form redirect, // the default redirection route. Defaults to 'list' resource, // the resource name, deduced from the location. e.g. 'posts' save, // the update callback, to be passed to the underlying form as submit handler diff --git a/docs/useEditController.md b/docs/useEditController.md index a091a208a3f..c2e7fc5cd62 100644 --- a/docs/useEditController.md +++ b/docs/useEditController.md @@ -5,9 +5,11 @@ title: "The useEditController hook" # `useEditController` -The `useEditController` hook contains the logic of [the `<Edit>` component](./Edit.md): it fetches a record based on the URL, prepares a form submit handler, and returns all the data and callbacks necessary to render an edition view. +`useEditController` contains the headless logic of the [`<Edit>`](./Edit.md) component. It's useful to create a custom edition view. It's also the base hook when building a custom view with another UI kit than Material UI. -React-admin calls `useEditController` internally when you use the `<Edit>`, `<EditBase>`, or `<EditGuesser>` component. +`useEditController` reads the resource name and id from the resource context and browser location, fetches the record via `dataProvider.getOne()` to initialize the form, prepares a form submit handler based on `dataProvider.update()`, computes the default page title, and returns them. Its return value matches the [`EditContext`](./useEditContext.md) shape. + +`useEditController` is used internally by [`<Edit>`](./Edit.md) and [`<EditBase>`](./EditBase.md). If your Edit view uses react-admin components like `<SimpleForm>`, prefer [`<EditBase>`](./EditBase.md) to `useEditController` as it takes care of creating a `<EditContext>`. ## Usage diff --git a/docs/useListController.md b/docs/useListController.md index 33d8a2a926a..57b9a227610 100644 --- a/docs/useListController.md +++ b/docs/useListController.md @@ -5,9 +5,11 @@ title: "useListController" # `useListController` -The `useListController` hook fetches the data, prepares callbacks for modifying the pagination, filters, sort and selection, and returns them. Its return value match the `ListContext` shape. `useListController` is used internally by the `<List>` and `<ListBase>` components. +`useListController` contains the headless logic of the [`<List>`](./List.md) component. It's useful to create a custom List view. It's also the base hook when building a custom view with another UI kit than Material UI. -You can use it to create a custom List view, although its component counterpart, [`<ListBase>`](./ListBase.md), is probably better in most cases. +`useListController` reads the list parameters from the URL, calls `dataProvider.getList()`, prepares callbacks for modifying the pagination, filters, sort and selection, and returns them together with the data. Its return value matches the [`ListContext`](./useListContext.md) shape. + +`useListController` is used internally by [`<List>`](./List.md) and [`<ListBase>`](./ListBase.md). If your list view uses react-admin components like `<Datagrid>`, prefer [`<ListBase>`](./ListBase.md) to `useListController` as it takes care of creating a `<ListContext>`. ## Usage diff --git a/docs/useShowController.md b/docs/useShowController.md index 5d5f183d858..3ec77114342 100644 --- a/docs/useShowController.md +++ b/docs/useShowController.md @@ -5,13 +5,11 @@ title: "useShowController" # `useShowController` -`useShowController` is the hook that handles all the controller logic for Show views. It's used by [`<Show>`](./Show.md) and [`<ShowBase>`](./ShowBase.md). +`useShowController` contains the headless logic of the [`<Show>`](./Show.md) component. It's useful to create a custom Show view. It's also the base hook when building a custom view with another UI kit than Material UI. -This hook takes care of three things: +`useShowController` reads the resource name and id from the resource context and browser location, fetches the record from the data provider via `dataProvider.getOne()`, computes the default page title, and returns them. Its return value matches the [`ShowContext`](./useShowContext.md) shape. -- it reads the resource name and id from the resource context and browser location -- it fetches the record from the data provider via `dataProvider.getOne()`, -- it computes the default page title +`useShowController` is used internally by [`<Show>`](./Show.md) and [`<ShowBase>`](./ShowBase.md). If your Show view uses react-admin components like `<TextField>`, prefer [`<ShowBase>`](./ShowBase.md) to `useShowController` as it takes care of creating a `<ShowContext>`. ## Usage From 5305cd18054e8d1d4c6008d925711bc2eb1d618b Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Thu, 16 Nov 2023 09:26:40 +0100 Subject: [PATCH 06/10] Add headless to features --- docs/Features.md | 87 +++++++++++++++++++++++++++++++++++ docs/img/list_ant_design.png | Bin 0 -> 82955 bytes 2 files changed, 87 insertions(+) create mode 100644 docs/img/list_ant_design.png diff --git a/docs/Features.md b/docs/Features.md index f15fac5dfd0..a3382906b1b 100644 --- a/docs/Features.md +++ b/docs/Features.md @@ -271,6 +271,93 @@ We have made many improvements to this default layout based on user feedback. In And for mobile users, react-admin renders a different layout with larger margins and less information density (see [Responsive](#responsive)). +## Headless + +React-admin components use Material UI components by default, which lets you scaffold a page in no time. However, the headless logic behind react-admin components is agnostic of the UI library, and is exposed via -Base components and controller hooks. + +This means you can use react-admin with any UI library you want - not only Material UI, but also [Ant Design](https://ant.design/), [Daisy UI](https://daisyui.com/), [Chakra UI](https://chakra-ui.com/), or even you own custom UI library. + +For instance, here a List view built [Ant Design](https://ant.design/): + +![List view built with Ant Design](./img/list_ant_design.png) + +It leverages the `useListController` hook: + +{% raw %} +```jsx +import { useListController } from 'react-admin'; +import { Card, Table, Button } from 'antd'; +import { + CheckCircleOutlined, + PlusOutlined, + EditOutlined, +} from '@ant-design/icons'; +import { Link } from 'react-router-dom'; + +const PostList = () => { + const { data, page, total, setPage, isLoading } = useListController({ + sort: { field: 'published_at', order: 'DESC' }, + perPage: 10, + }); + const handleTableChange = (pagination) => { + setPage(pagination.current); + }; + return ( + <> + <div style={{ margin: 10, textAlign: 'right' }}> + <Link to="/posts/create"> + <Button icon={<PlusOutlined />}>Create</Button> + </Link> + </div> + <Card bodyStyle={{ padding: '0' }} loading={isLoading}> + <Table + size="small" + dataSource={data} + columns={columns} + pagination={{ current: page, pageSize: 10, total }} + onChange={handleTableChange} + /> + </Card> + </> + ); +}; + +const columns = [ + { title: 'Id', dataIndex: 'id', key: 'id' }, + { title: 'Title', dataIndex: 'title', key: 'title' }, + { + title: 'Publication date', + dataIndex: 'published_at', + key: 'pub_at', + render: (value) => new Date(value).toLocaleDateString(), + }, + { + title: 'Commentable', + dataIndex: 'commentable', + key: 'commentable', + render: (value) => (value ? <CheckCircleOutlined /> : null), + }, + { + title: 'Actions', + render: (_, record) => ( + <Link to={`/posts/${record.id}`}> + <Button icon={<EditOutlined />}>Edit</Button> + </Link> + ), + }, +]; + +export default PostList; +``` +{% endraw %} + +Check the following hooks to learn more about headless controllers: + +- [`useListController`](./useListController.md) +- [`useEditController`](./useEditController.md) +- [`useCreateController`](./useCreateController.md) +- [`useShowController`](./useShowController.md) + ## Guessers & Scaffolding When mapping a new API route to a CRUD view, adding fields one by one can be tedious. React-admin provides a set of guessers that can automatically **generate a complete CRUD UI based on an API response**. diff --git a/docs/img/list_ant_design.png b/docs/img/list_ant_design.png new file mode 100644 index 0000000000000000000000000000000000000000..6812338722450d564babc565387f984125976975 GIT binary patch literal 82955 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%0Abb^hKVN<sNWMa+mW01#PnWx)mJ}=qLWi;c6Kr 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 literal 0 HcmV?d00001 From e256fab0ce15f62fb7d150b57566f18c941018a8 Mon Sep 17 00:00:00 2001 From: fzaninotto <fzaninotto@gmail.com> Date: Thu, 16 Nov 2023 09:33:12 +0100 Subject: [PATCH 07/10] better example for useListController --- docs/Features.md | 2 +- docs/useListController.md | 76 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/docs/Features.md b/docs/Features.md index a3382906b1b..1d89e8805ac 100644 --- a/docs/Features.md +++ b/docs/Features.md @@ -277,7 +277,7 @@ React-admin components use Material UI components by default, which lets you sca This means you can use react-admin with any UI library you want - not only Material UI, but also [Ant Design](https://ant.design/), [Daisy UI](https://daisyui.com/), [Chakra UI](https://chakra-ui.com/), or even you own custom UI library. -For instance, here a List view built [Ant Design](https://ant.design/): +For instance, here a List view built with [Ant Design](https://ant.design/): ![List view built with Ant Design](./img/list_ant_design.png) diff --git a/docs/useListController.md b/docs/useListController.md index 57b9a227610..d02b21a7475 100644 --- a/docs/useListController.md +++ b/docs/useListController.md @@ -7,13 +7,87 @@ title: "useListController" `useListController` contains the headless logic of the [`<List>`](./List.md) component. It's useful to create a custom List view. It's also the base hook when building a custom view with another UI kit than Material UI. +![List view built with Ant Design](./img/list_ant_design.png) + `useListController` reads the list parameters from the URL, calls `dataProvider.getList()`, prepares callbacks for modifying the pagination, filters, sort and selection, and returns them together with the data. Its return value matches the [`ListContext`](./useListContext.md) shape. `useListController` is used internally by [`<List>`](./List.md) and [`<ListBase>`](./ListBase.md). If your list view uses react-admin components like `<Datagrid>`, prefer [`<ListBase>`](./ListBase.md) to `useListController` as it takes care of creating a `<ListContext>`. ## Usage -It's common to call `useListController()` without parameters, and to put the result in a `ListContext` to make it available to the rest of the component tree. +`useListController` expects a parameters object defining the list sorting, pagination, and filters. It returns an object with the fetched data, and callbacks to modify the list parameters. + +Here the code for the post list view above, built with [Ant Design](https://ant.design/): + +{% raw %} +```jsx +import { useListController } from 'react-admin'; +import { Card, Table, Button } from 'antd'; +import { + CheckCircleOutlined, + PlusOutlined, + EditOutlined, +} from '@ant-design/icons'; +import { Link } from 'react-router-dom'; + +const PostList = () => { + const { data, page, total, setPage, isLoading } = useListController({ + sort: { field: 'published_at', order: 'DESC' }, + perPage: 10, + }); + const handleTableChange = (pagination) => { + setPage(pagination.current); + }; + return ( + <> + <div style={{ margin: 10, textAlign: 'right' }}> + <Link to="/posts/create"> + <Button icon={<PlusOutlined />}>Create</Button> + </Link> + </div> + <Card bodyStyle={{ padding: '0' }} loading={isLoading}> + <Table + size="small" + dataSource={data} + columns={columns} + pagination={{ current: page, pageSize: 10, total }} + onChange={handleTableChange} + /> + </Card> + </> + ); +}; + +const columns = [ + { title: 'Id', dataIndex: 'id', key: 'id' }, + { title: 'Title', dataIndex: 'title', key: 'title' }, + { + title: 'Publication date', + dataIndex: 'published_at', + key: 'pub_at', + render: (value) => new Date(value).toLocaleDateString(), + }, + { + title: 'Commentable', + dataIndex: 'commentable', + key: 'commentable', + render: (value) => (value ? <CheckCircleOutlined /> : null), + }, + { + title: 'Actions', + render: (_, record) => ( + <Link to={`/posts/${record.id}`}> + <Button icon={<EditOutlined />}>Edit</Button> + </Link> + ), + }, +]; + +export default PostList; +``` +{% endraw %} + +When using react-admin components, it's common to call `useListController()` without parameters, and to put the result in a `ListContext` to make it available to the rest of the component tree. ```jsx import { From 52adaebe1a4af9efc12f2287d7234dc59a76cd22 Mon Sep 17 00:00:00 2001 From: Francois Zaninotto <francois@marmelab.com> Date: Tue, 21 Nov 2023 10:50:51 +0100 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: adrien guernier <adrien@marmelab.com> --- docs/Features.md | 2 +- docs/InfiniteList.md | 4 ++-- docs/List.md | 2 +- docs/Show.md | 2 +- docs/useCreateController.md | 2 +- docs/useEditController.md | 2 +- docs/useListController.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/Features.md b/docs/Features.md index 1d89e8805ac..4c19e532481 100644 --- a/docs/Features.md +++ b/docs/Features.md @@ -273,7 +273,7 @@ And for mobile users, react-admin renders a different layout with larger margins ## Headless -React-admin components use Material UI components by default, which lets you scaffold a page in no time. However, the headless logic behind react-admin components is agnostic of the UI library, and is exposed via -Base components and controller hooks. +React-admin components use Material UI components by default, which lets you scaffold a page in no time. However, the headless logic behind react-admin components is agnostic of the UI library, and is exposed via `...Base` components and controller hooks. This means you can use react-admin with any UI library you want - not only Material UI, but also [Ant Design](https://ant.design/), [Daisy UI](https://daisyui.com/), [Chakra UI](https://chakra-ui.com/), or even you own custom UI library. diff --git a/docs/InfiniteList.md b/docs/InfiniteList.md index b367d8c95ff..4ab366fd77e 100644 --- a/docs/InfiniteList.md +++ b/docs/InfiniteList.md @@ -171,7 +171,7 @@ In that case, use the [`resource`](#resource), [`sort`](#sort), and [`filter`](# {% raw %} ```jsx -import { InfiniteList, SimpleList } from 'react-admin'; +import { InfiniteList, InfinitePagination, SimpleList } from 'react-admin'; import { Container, Typography } from '@mui/material'; const Dashboard = () => ( @@ -213,7 +213,7 @@ const Dashboard = () => ( Besides fetching a list of records from the data provider, `<InfiniteList>` renders the default list page layout (title, buttons, filters, a Material-UI `<Card>`, infinite pagination) and its children. If you need a custom list layout, you may prefer the `<InfiniteListBase>` component, which only renders its children in a [`ListContext`](./useListContext.md). ```jsx -import { InfiniteListBase, InfinitePagination } from 'react-admin'; +import { InfiniteListBase, InfinitePagination, WithListContext } from 'react-admin'; import { Card, CardContent, Container, Stack, Typography } from '@mui/material'; const ProductList = () => ( diff --git a/docs/List.md b/docs/List.md index f9fb8f33c48..0ba48ad8d2d 100644 --- a/docs/List.md +++ b/docs/List.md @@ -1177,7 +1177,7 @@ const Dashboard = () => ( Besides fetching a list of records from the data provider, `<List>` renders the default list page layout (title, buttons, filters, a Material-UI `<Card>`, pagination) and its children. If you need a custom list layout, you may prefer [the `<ListBase>` component](./ListBase.md), which only renders its children in a [`ListContext`](./useListContext.md). ```jsx -import { ListBase } from 'react-admin'; +import { ListBase, WithListContext } from 'react-admin'; import { Card, CardContent, Container, Stack, Typography } from '@mui/material'; const ProductList = () => ( diff --git a/docs/Show.md b/docs/Show.md index 930a5d0dd38..2e100a72705 100644 --- a/docs/Show.md +++ b/docs/Show.md @@ -611,7 +611,7 @@ export const PostShow = () => ( In that case, use the [`resource`](#resource) and [`id`](#id) props to set the show parameters regardless of the URL. ```jsx -import { Show, SelectField, SimpleShowLayout, TextField, Title } from "react-admin"; +import { Show, SelectField, SimpleShowLayout, TextField } from "react-admin"; export const BookShow = ({ id }) => ( <Show resource="books" id={id}> diff --git a/docs/useCreateController.md b/docs/useCreateController.md index f1bdbee369a..5ac114b80b7 100644 --- a/docs/useCreateController.md +++ b/docs/useCreateController.md @@ -9,7 +9,7 @@ title: "The useCreateController hook" `useCreateController` reads the resource name from the resource context and browser location, computes the form default values, prepares a form submit handler based on `dataProvider.create()`, computes the default page title, and returns them. Its return value matches the [`CreateContext`](./useCreateContext.md) shape. -`useCreateController` is used internally by [`<Create>`](./Create.md) and [`<CreateBase>`](./CreateBase.md). If your Create view uses react-admin components like `<SimpleForm>`, prefer [`<CreateBase>`](./CreateBase.md) to `useCreateController` as it takes care of creating a `<CreateContext>`. +`useCreateController` is used internally by [`<Create>`](./Create.md) and [`<CreateBase>`](./CreateBase.md). If your Create view uses react-admin components like [`<SimpleForm>`](./SimpleForm.md), prefer [`<CreateBase>`](./CreateBase.md) to `useCreateController` as it takes care of creating a `<CreateContext>`. ## Usage diff --git a/docs/useEditController.md b/docs/useEditController.md index c2e7fc5cd62..85b54cd8a27 100644 --- a/docs/useEditController.md +++ b/docs/useEditController.md @@ -9,7 +9,7 @@ title: "The useEditController hook" `useEditController` reads the resource name and id from the resource context and browser location, fetches the record via `dataProvider.getOne()` to initialize the form, prepares a form submit handler based on `dataProvider.update()`, computes the default page title, and returns them. Its return value matches the [`EditContext`](./useEditContext.md) shape. -`useEditController` is used internally by [`<Edit>`](./Edit.md) and [`<EditBase>`](./EditBase.md). If your Edit view uses react-admin components like `<SimpleForm>`, prefer [`<EditBase>`](./EditBase.md) to `useEditController` as it takes care of creating a `<EditContext>`. +`useEditController` is used internally by [`<Edit>`](./Edit.md) and [`<EditBase>`](./EditBase.md). If your Edit view uses react-admin components like [`<SimpleForm>`](./SimpleForm.md), prefer [`<EditBase>`](./EditBase.md) to `useEditController` as it takes care of creating a `<EditContext>`. ## Usage diff --git a/docs/useListController.md b/docs/useListController.md index d02b21a7475..f3eee4896d6 100644 --- a/docs/useListController.md +++ b/docs/useListController.md @@ -11,7 +11,7 @@ title: "useListController" `useListController` reads the list parameters from the URL, calls `dataProvider.getList()`, prepares callbacks for modifying the pagination, filters, sort and selection, and returns them together with the data. Its return value matches the [`ListContext`](./useListContext.md) shape. -`useListController` is used internally by [`<List>`](./List.md) and [`<ListBase>`](./ListBase.md). If your list view uses react-admin components like `<Datagrid>`, prefer [`<ListBase>`](./ListBase.md) to `useListController` as it takes care of creating a `<ListContext>`. +`useListController` is used internally by [`<List>`](./List.md) and [`<ListBase>`](./ListBase.md). If your list view uses react-admin components like [`<Datagrid>`](./Datagrid.md), prefer [`<ListBase>`](./ListBase.md) to `useListController` as it takes care of creating a `<ListContext>`. ## Usage From 6c7808c95dd797607f96c683f185d832972641be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Zaninotto?= <fzaninotto@gmail.com> Date: Tue, 21 Nov 2023 11:02:55 +0100 Subject: [PATCH 09/10] Fix ts warning --- docs/Create.md | 2 +- docs/Edit.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Create.md b/docs/Create.md index 80f2dac1ef6..6a96300b6fa 100644 --- a/docs/Create.md +++ b/docs/Create.md @@ -673,7 +673,7 @@ export const BookCreate = () => { <Title title="Create book" /> <Card> <CardContent> - <SimpleForm onSubmit={save}> + <SimpleForm onSubmit={values => save(values)}> <TextInput source="title" /> <TextInput source="author" /> <SelectInput source="availability" choices={[ diff --git a/docs/Edit.md b/docs/Edit.md index 436365b7b60..d6dfd00a239 100644 --- a/docs/Edit.md +++ b/docs/Edit.md @@ -844,7 +844,7 @@ export const BookEdit = () => { <Title title={`Edit book ${record?.title}`} /> <Card> <CardContent> - <SimpleForm record={record} onSubmit={save}> + <SimpleForm record={record} onSubmit={values => save(values)}> <TextInput source="title" /> <TextInput source="author" /> <SelectInput source="availability" choices={[ From fd7ded85e6a737ad1717486ae23157f37e5eeb7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Zaninotto?= <fzaninotto@gmail.com> Date: Tue, 21 Nov 2023 11:08:00 +0100 Subject: [PATCH 10/10] Improve headless feature introduction --- docs/Features.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Features.md b/docs/Features.md index 4c19e532481..e6a10c22572 100644 --- a/docs/Features.md +++ b/docs/Features.md @@ -273,9 +273,9 @@ And for mobile users, react-admin renders a different layout with larger margins ## Headless -React-admin components use Material UI components by default, which lets you scaffold a page in no time. However, the headless logic behind react-admin components is agnostic of the UI library, and is exposed via `...Base` components and controller hooks. +React-admin components use Material UI components by default, which lets you scaffold a page in no time. As material UI supports [theming](#theming), you can easily customize the look and feel of your app. But in some cases, this is not enough, and you need to use another UI library. -This means you can use react-admin with any UI library you want - not only Material UI, but also [Ant Design](https://ant.design/), [Daisy UI](https://daisyui.com/), [Chakra UI](https://chakra-ui.com/), or even you own custom UI library. +You can change the UI library you use with react-admin to use [Ant Design](https://ant.design/), [Daisy UI](https://daisyui.com/), [Chakra UI](https://chakra-ui.com/), or even you own custom UI library. The **headless logic** behind react-admin components is agnostic of the UI library, and is exposed via `...Base` components and controller hooks. For instance, here a List view built with [Ant Design](https://ant.design/):