Skip to content

Commit c3d490e

Browse files
authored
Merge pull request #7652 from marmelab/7651-createbase-doesnt-set-the-resourcecontext-like-create-does
Make ShowBase, CreateBase and EditBase components support resource override via props
2 parents d6b1fda + 574285a commit c3d490e

File tree

8 files changed

+117
-63
lines changed

8 files changed

+117
-63
lines changed

packages/ra-core/src/controller/create/CreateBase.tsx

+17-5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
} from './useCreateController';
77
import { CreateContextProvider } from './CreateContextProvider';
88
import { RaRecord } from '../../types';
9+
import { ResourceContextProvider } from '../../core';
910

1011
/**
1112
* Call useCreateController and put the value in a CreateContext
@@ -39,8 +40,19 @@ import { RaRecord } from '../../types';
3940
export const CreateBase = <RecordType extends RaRecord = any>({
4041
children,
4142
...props
42-
}: CreateControllerProps<RecordType> & { children: ReactNode }) => (
43-
<CreateContextProvider value={useCreateController(props)}>
44-
{children}
45-
</CreateContextProvider>
46-
);
43+
}: CreateControllerProps<RecordType> & { children: ReactNode }) => {
44+
const controllerProps = useCreateController<RecordType>(props);
45+
const body = (
46+
<CreateContextProvider value={controllerProps}>
47+
{children}
48+
</CreateContextProvider>
49+
);
50+
return props.resource ? (
51+
// support resource override via props
52+
<ResourceContextProvider value={props.resource}>
53+
{body}
54+
</ResourceContextProvider>
55+
) : (
56+
body
57+
);
58+
};

packages/ra-core/src/controller/create/useCreateController.ts

+2
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ export const useCreateController = <RecordType extends RaRecord = RaRecord>(
157157

158158
export interface CreateControllerProps<RecordType extends RaRecord = RaRecord> {
159159
disableAuthentication?: boolean;
160+
hasEdit?: boolean;
161+
hasShow?: boolean;
160162
record?: Partial<RecordType>;
161163
redirect?: RedirectionSideEffect;
162164
resource?: string;

packages/ra-core/src/controller/edit/EditBase.tsx

+17-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ReactNode } from 'react';
44
import { RaRecord } from '../../types';
55
import { useEditController, EditControllerProps } from './useEditController';
66
import { EditContextProvider } from './EditContextProvider';
7+
import { ResourceContextProvider } from '../../core';
78

89
/**
910
* Call useEditController and put the value in a EditContext
@@ -37,8 +38,19 @@ import { EditContextProvider } from './EditContextProvider';
3738
export const EditBase = <RecordType extends RaRecord = any>({
3839
children,
3940
...props
40-
}: { children: ReactNode } & EditControllerProps<RecordType>) => (
41-
<EditContextProvider value={useEditController<RecordType>(props)}>
42-
{children}
43-
</EditContextProvider>
44-
);
41+
}: { children: ReactNode } & EditControllerProps<RecordType>) => {
42+
const controllerProps = useEditController<RecordType>(props);
43+
const body = (
44+
<EditContextProvider value={controllerProps}>
45+
{children}
46+
</EditContextProvider>
47+
);
48+
return props.resource ? (
49+
// support resource override via props
50+
<ResourceContextProvider value={props.resource}>
51+
{body}
52+
</ResourceContextProvider>
53+
) : (
54+
body
55+
);
56+
};

packages/ra-core/src/controller/show/ShowBase.tsx

+17-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ReactElement } from 'react';
44
import { RaRecord } from '../../types';
55
import { useShowController, ShowControllerProps } from './useShowController';
66
import { ShowContextProvider } from './ShowContextProvider';
7+
import { ResourceContextProvider } from '../../core';
78

89
/**
910
* Call useShowController and put the value in a ShowContext
@@ -37,8 +38,19 @@ import { ShowContextProvider } from './ShowContextProvider';
3738
export const ShowBase = <RecordType extends RaRecord = any>({
3839
children,
3940
...props
40-
}: { children: ReactElement } & ShowControllerProps<RecordType>) => (
41-
<ShowContextProvider value={useShowController<RecordType>(props)}>
42-
{children}
43-
</ShowContextProvider>
44-
);
41+
}: { children: ReactElement } & ShowControllerProps<RecordType>) => {
42+
const controllerProps = useShowController<RecordType>(props);
43+
const body = (
44+
<ShowContextProvider value={controllerProps}>
45+
{children}
46+
</ShowContextProvider>
47+
);
48+
return props.resource ? (
49+
// support resource override via props
50+
<ResourceContextProvider value={props.resource}>
51+
{body}
52+
</ResourceContextProvider>
53+
) : (
54+
body
55+
);
56+
};

packages/ra-ui-materialui/src/detail/Create.tsx

+26-22
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
import * as React from 'react';
22
import { ReactElement } from 'react';
33
import PropTypes from 'prop-types';
4-
import {
5-
CreateContextProvider,
6-
RaRecord,
7-
ResourceContextProvider,
8-
useCheckMinimumRequiredProps,
9-
useCreateController,
10-
} from 'ra-core';
4+
import { RaRecord, useCheckMinimumRequiredProps } from 'ra-core';
115

126
import { CreateProps } from '../types';
137
import { CreateView } from './CreateView';
8+
import { CreateBase } from 'ra-core';
149

1510
/**
1611
* Page component for the Create view
@@ -59,19 +54,30 @@ export const Create = <RecordType extends RaRecord = any>(
5954
props: CreateProps<RecordType> & { children: ReactElement }
6055
): ReactElement => {
6156
useCheckMinimumRequiredProps('Create', ['children'], props);
62-
const controllerProps = useCreateController<RecordType>(props);
63-
const body = (
64-
<CreateContextProvider value={controllerProps}>
65-
<CreateView {...props} {...controllerProps} />
66-
</CreateContextProvider>
67-
);
68-
return props.resource ? (
69-
// support resource override via props
70-
<ResourceContextProvider value={props.resource}>
71-
{body}
72-
</ResourceContextProvider>
73-
) : (
74-
body
57+
const {
58+
resource,
59+
record,
60+
redirect,
61+
transform,
62+
mutationOptions,
63+
disableAuthentication,
64+
hasEdit,
65+
hasShow,
66+
...rest
67+
} = props;
68+
return (
69+
<CreateBase
70+
resource={resource}
71+
record={record}
72+
redirect={redirect}
73+
transform={transform}
74+
mutationOptions={mutationOptions}
75+
disableAuthentication={disableAuthentication}
76+
hasEdit={hasEdit}
77+
hasShow={hasShow}
78+
>
79+
<CreateView {...rest} />
80+
</CreateBase>
7581
);
7682
};
7783

@@ -81,7 +87,6 @@ Create.propTypes = {
8187
children: PropTypes.element,
8288
className: PropTypes.string,
8389
disableAuthentication: PropTypes.bool,
84-
hasCreate: PropTypes.bool,
8590
hasEdit: PropTypes.bool,
8691
hasShow: PropTypes.bool,
8792
redirect: PropTypes.oneOfType([
@@ -92,7 +97,6 @@ Create.propTypes = {
9297
resource: PropTypes.string,
9398
title: PropTypes.node,
9499
record: PropTypes.object,
95-
hasList: PropTypes.bool,
96100
mutationOptions: PropTypes.object,
97101
transform: PropTypes.func,
98102
sx: PropTypes.any,

packages/ra-ui-materialui/src/detail/Edit.tsx

+26-20
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
import * as React from 'react';
22
import { ReactNode } from 'react';
33
import PropTypes from 'prop-types';
4-
import {
5-
EditContextProvider,
6-
ResourceContextProvider,
7-
useCheckMinimumRequiredProps,
8-
useEditController,
9-
RaRecord,
10-
} from 'ra-core';
4+
import { useCheckMinimumRequiredProps, RaRecord } from 'ra-core';
115
import { EditProps } from '../types';
126
import { EditView } from './EditView';
7+
import { EditBase } from 'ra-core';
138

149
/**
1510
* Page component for the Edit view
@@ -60,19 +55,30 @@ export const Edit = <RecordType extends RaRecord = any>(
6055
props: EditProps<RecordType> & { children: ReactNode }
6156
) => {
6257
useCheckMinimumRequiredProps('Edit', ['children'], props);
63-
const controllerProps = useEditController<RecordType>(props);
64-
const body = (
65-
<EditContextProvider value={controllerProps}>
66-
<EditView {...props} {...controllerProps} />
67-
</EditContextProvider>
68-
);
69-
return props.resource ? (
70-
// support resource override via props
71-
<ResourceContextProvider value={props.resource}>
72-
{body}
73-
</ResourceContextProvider>
74-
) : (
75-
body
58+
const {
59+
resource,
60+
id,
61+
mutationMode,
62+
mutationOptions,
63+
queryOptions,
64+
redirect,
65+
transform,
66+
disableAuthentication,
67+
...rest
68+
} = props;
69+
return (
70+
<EditBase
71+
resource={resource}
72+
id={id}
73+
mutationMode={mutationMode}
74+
mutationOptions={mutationOptions}
75+
queryOptions={queryOptions}
76+
redirect={redirect}
77+
transform={transform}
78+
disableAuthentication={disableAuthentication}
79+
>
80+
<EditView {...rest} />
81+
</EditBase>
7682
);
7783
};
7884

packages/ra-ui-materialui/src/detail/Show.tsx

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from 'react';
22
import { ReactElement } from 'react';
33
import PropTypes from 'prop-types';
4-
import { ShowBase, ResourceContextProvider, RaRecord } from 'ra-core';
4+
import { ShowBase, RaRecord } from 'ra-core';
55

66
import { ShowProps } from '../types';
77
import { ShowView } from './ShowView';
@@ -64,11 +64,13 @@ export const Show = <RecordType extends RaRecord = any>({
6464
queryOptions,
6565
...rest
6666
}: ShowProps<RecordType>): ReactElement => (
67-
<ResourceContextProvider value={resource}>
68-
<ShowBase<RecordType> id={id} queryOptions={queryOptions}>
69-
<ShowView {...rest} />
70-
</ShowBase>
71-
</ResourceContextProvider>
67+
<ShowBase<RecordType>
68+
id={id}
69+
queryOptions={queryOptions}
70+
resource={resource}
71+
>
72+
<ShowView {...rest} />
73+
</ShowBase>
7274
);
7375

7476
Show.propTypes = {

packages/ra-ui-materialui/src/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export interface EditProps<RecordType extends RaRecord = any> {
1616
aside?: ReactElement;
1717
className?: string;
1818
component?: ElementType;
19+
disableAuthentication?: boolean;
1920
id?: Identifier;
2021
mutationMode?: MutationMode;
2122
queryOptions?: UseQueryOptions<RecordType>;
@@ -36,6 +37,9 @@ export interface CreateProps<RecordType extends RaRecord = any> {
3637
aside?: ReactElement;
3738
className?: string;
3839
component?: ElementType;
40+
disableAuthentication?: boolean;
41+
hasEdit?: boolean;
42+
hasShow?: boolean;
3943
record?: Partial<RecordType>;
4044
redirect?: RedirectionSideEffect;
4145
resource?: string;

0 commit comments

Comments
 (0)