Skip to content

Commit 665c58d

Browse files
committed
remove unneeded renderPagination prop from ReferenceManyFieldBase
1 parent a78f838 commit 665c58d

File tree

4 files changed

+20
-95
lines changed

4 files changed

+20
-95
lines changed

docs/ReferenceManyFieldBase.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ export const PostList = () => (
108108
| `empty` | Optional | `ReactNode` | - | Element to display when there are no related records. |
109109
| `filter` | Optional | `Object` | - | Filters to use when fetching the related records, passed to `getManyReference()` |
110110
| `pagination` | Optional | `Element` | - | Pagination element to display pagination controls. empty by default (no pagination) |
111-
| `renderPagination` | Optional | `(listContext) => Element` | - | Pagination function that receives a `ListContext` and render pagination controls. |
112111
| `perPage` | Optional | `number` | 25 | Maximum number of referenced records to fetch |
113112
| `queryOptions` | Optional | [`UseQuery Options`](https://tanstack.com/query/v3/docs/react/reference/useQuery) | `{}` | `react-query` options for the `getMany` query |
114113
| `reference` | Required | `string` | - | The name of the resource for the referenced records, e.g. 'books' |
@@ -153,7 +152,8 @@ export const AuthorShow = () => (
153152
154153
## `render`
155154
156-
Alternatively to children you can pass a render prop to `<ReferenceManyFieldBase>`. The render prop will receive the list context as its argument, allowing to inline the render logic.
155+
Alternatively to children you can pass a render prop to `<ReferenceManyFieldBase>`. The render prop will receive the list context as its argument, allowing to inline the render logic for both the list and the pagination.
156+
When receiving a render prop the `<ReferenceManyFieldBase>` component will ignore the children and the pagination property.
157157
158158
```jsx
159159
import { Show, SimpleShowLayout, ReferenceManyFieldBase, DataTable, TextField, DateField } from 'react-admin';
@@ -329,6 +329,8 @@ import { Pagination } from 'react-admin';
329329
</ReferenceManyFieldBase>
330330
```
331331
332+
***Note:*** The pagination prop will be ignored if a render prop is specified
333+
332334
## `perPage`
333335
334336
By default, react-admin restricts the possible values to 25 and displays no pagination control. You can change the limit by setting the `perPage` prop:

packages/ra-core/src/controller/field/ReferenceManyFieldBase.spec.tsx

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ describe('ReferenceManyFieldBase', () => {
4141
return <div>{resource}</div>;
4242
};
4343
const dataProvider = testDataProvider({
44-
// @ts-ignore
4544
getList: () =>
45+
// @ts-ignore
4646
Promise.resolve({ data: [{ id: 1 }, { id: 2 }], total: 2 }),
4747
});
4848
render(
@@ -156,23 +156,13 @@ describe('ReferenceManyFieldBase', () => {
156156
).not.toBeNull();
157157
});
158158
});
159-
});
160-
161-
it('should render pagination using renderPagination prop', async () => {
162-
render(<WithPagination />);
163-
await waitFor(() => {
164-
expect(screen.queryByText('1 - 2 of 3')).not.toBeNull();
165-
expect(screen.queryByText('Next Page')).not.toBeNull();
166-
expect(screen.queryByText('Previous Page')).not.toBeNull();
167-
});
168-
screen.getByText('Next Page').click();
169-
await waitFor(() => {
170-
expect(screen.queryByText('3 - 3 of 3')).not.toBeNull();
171-
});
172-
screen.getByText('Previous Page').click();
173159

174-
await waitFor(() => {
175-
expect(screen.queryByText('1 - 2 of 3')).not.toBeNull();
160+
it('should not render pagination when receiving a render prop', async () => {
161+
render(<WithRenderProp pagination={<p>Custom Pagination</p>} />);
162+
await waitFor(() => {
163+
expect(screen.queryByText('War and Peace')).not.toBeNull();
164+
});
165+
expect(screen.queryByText('Custom Pagination')).toBeNull();
176166
});
177167
});
178168
});

packages/ra-core/src/controller/field/ReferenceManyFieldBase.stories.tsx

Lines changed: 8 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,13 @@ export const WithPagination = ({ dataProvider = dataProviderWithAuthors }) => (
239239
</TestMemoryRouter>
240240
);
241241

242-
export const WithRenderProp = ({ dataProvider = dataProviderWithAuthors }) => (
242+
export const WithRenderProp = ({
243+
dataProvider = dataProviderWithAuthors,
244+
pagination,
245+
}: {
246+
dataProvider?: any;
247+
pagination?: React.ReactNode;
248+
}) => (
243249
<TestMemoryRouter initialEntries={['/books/1/show']}>
244250
<CoreAdmin
245251
dataProvider={dataProvider}
@@ -262,6 +268,7 @@ export const WithRenderProp = ({ dataProvider = dataProviderWithAuthors }) => (
262268
reference="books"
263269
target="author"
264270
source="id"
271+
pagination={pagination}
265272
render={({ error, isPending, data }) => {
266273
if (isPending) {
267274
return <p>Loading...</p>;
@@ -290,74 +297,6 @@ export const WithRenderProp = ({ dataProvider = dataProviderWithAuthors }) => (
290297
</TestMemoryRouter>
291298
);
292299

293-
export const WithRenderPagination = ({
294-
dataProvider = dataProviderWithAuthors,
295-
}) => (
296-
<TestMemoryRouter initialEntries={['/authors/1/show']}>
297-
<CoreAdmin
298-
dataProvider={dataProvider}
299-
queryClient={
300-
new QueryClient({
301-
defaultOptions: {
302-
queries: {
303-
retry: false,
304-
},
305-
},
306-
})
307-
}
308-
>
309-
<Resource name="books" />
310-
<Resource
311-
name="authors"
312-
show={
313-
<ShowBase>
314-
<ReferenceManyFieldBase
315-
target="author"
316-
source="id"
317-
reference="books"
318-
perPage={2}
319-
renderPagination={({
320-
page = 0,
321-
setPage,
322-
total = 0,
323-
perPage,
324-
}) => {
325-
const nextPage = () => {
326-
setPage(page + 1);
327-
};
328-
const previousPage = () => {
329-
setPage(page - 1);
330-
};
331-
return (
332-
<div>
333-
<button
334-
disabled={page <= 1}
335-
onClick={previousPage}
336-
>
337-
previous page
338-
</button>
339-
{`${(page - 1) * perPage + 1} - ${Math.min(page * perPage, total)} of ${total}`}
340-
<button
341-
disabled={page >= total / perPage}
342-
onClick={nextPage}
343-
>
344-
next page
345-
</button>
346-
</div>
347-
);
348-
}}
349-
>
350-
<MyReferenceManyField>
351-
<List source="title" />
352-
</MyReferenceManyField>
353-
</ReferenceManyFieldBase>
354-
</ShowBase>
355-
}
356-
/>
357-
</CoreAdmin>
358-
</TestMemoryRouter>
359-
);
360-
361300
const MyReferenceManyField = ({ children }: { children: React.ReactNode }) => {
362301
const context = useListContext();
363302

packages/ra-core/src/controller/field/ReferenceManyFieldBase.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ export const ReferenceManyFieldBase = <
6868
filter = defaultFilter,
6969
page = 1,
7070
pagination = null,
71-
renderPagination = null,
7271
perPage = 25,
7372
record,
7473
reference,
@@ -130,9 +129,7 @@ export const ReferenceManyFieldBase = <
130129
<ResourceContextProvider value={reference}>
131130
<ListContextProvider value={controllerProps}>
132131
{render ? render(controllerProps) : children}
133-
{renderPagination
134-
? renderPagination(controllerProps)
135-
: pagination}
132+
{!render && pagination}
136133
</ListContextProvider>
137134
</ResourceContextProvider>
138135
);
@@ -147,9 +144,6 @@ export interface ReferenceManyFieldBaseProps<
147144
> {
148145
children?: ReactNode;
149146
render?: (props: ListControllerResult<ReferenceRecordType>) => ReactNode;
150-
renderPagination?: (
151-
props: ListControllerResult<ReferenceRecordType>
152-
) => ReactNode;
153147
empty?: ReactNode;
154148
pagination?: ReactNode;
155149
}

0 commit comments

Comments
 (0)