Skip to content

Commit b7a287a

Browse files
authored
Merge pull request #5884 from marmelab/fix-delete-hooks-resource
Fix DeleteWithConfirmButton Does Not Allow to Override resource
2 parents eb63c7a + 0e3e471 commit b7a287a

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

packages/ra-ui-materialui/src/button/DeleteWithConfirmButton.spec.tsx

+43
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,49 @@ describe('<DeleteWithConfirmButton />', () => {
7474
undoable: false,
7575
};
7676

77+
it('should allow to override the resource', async () => {
78+
const dataProvider = ({
79+
getOne: () =>
80+
Promise.resolve({
81+
data: { id: 123, title: 'lorem' },
82+
}),
83+
delete: jest.fn().mockResolvedValueOnce({ data: { id: 123 } }),
84+
} as unknown) as DataProvider;
85+
const EditToolbar = props => (
86+
<Toolbar {...props}>
87+
<DeleteWithConfirmButton resource="comments" />
88+
</Toolbar>
89+
);
90+
const {
91+
queryByDisplayValue,
92+
getByLabelText,
93+
getByText,
94+
} = renderWithRedux(
95+
<ThemeProvider theme={theme}>
96+
<DataProviderContext.Provider value={dataProvider}>
97+
<Edit {...defaultEditProps}>
98+
<SimpleForm toolbar={<EditToolbar />}>
99+
<TextInput source="title" />
100+
</SimpleForm>
101+
</Edit>
102+
</DataProviderContext.Provider>
103+
</ThemeProvider>,
104+
{ admin: { resources: { posts: { data: {} } } } }
105+
);
106+
// waitFor for the dataProvider.getOne() return
107+
await waitFor(() => {
108+
expect(queryByDisplayValue('lorem')).not.toBeNull();
109+
});
110+
fireEvent.click(getByLabelText('ra.action.delete'));
111+
fireEvent.click(getByText('ra.action.confirm'));
112+
await waitFor(() => {
113+
expect(dataProvider.delete).toHaveBeenCalledWith('comments', {
114+
id: 123,
115+
previousData: { id: 123, title: 'lorem' },
116+
});
117+
});
118+
});
119+
77120
it('should allow to override the onSuccess side effects', async () => {
78121
const dataProvider = ({
79122
getOne: () =>

packages/ra-ui-materialui/src/button/DeleteWithConfirmButton.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const DeleteWithConfirmButton: FC<DeleteWithConfirmButtonProps> = props => {
4444
} = props;
4545
const translate = useTranslate();
4646
const classes = useStyles(props);
47+
const resource = useResourceContext(props);
4748
const {
4849
open,
4950
loading,
@@ -58,8 +59,8 @@ const DeleteWithConfirmButton: FC<DeleteWithConfirmButtonProps> = props => {
5859
onClick,
5960
onSuccess,
6061
onFailure,
62+
resource,
6163
});
62-
const resource = useResourceContext(props);
6364

6465
return (
6566
<Fragment>

packages/ra-ui-materialui/src/form/Toolbar.tsx

+12-3
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,10 @@ const Toolbar: FC<ToolbarProps> = props => {
161161
Children.map(children, (button: ReactElement) =>
162162
button && isValidElement<any>(button)
163163
? React.cloneElement(button, {
164-
basePath,
164+
basePath: valueOrDefault(
165+
button.props.basePath,
166+
basePath
167+
),
165168
handleSubmit: valueOrDefault(
166169
button.props.handleSubmit,
167170
handleSubmit
@@ -173,8 +176,14 @@ const Toolbar: FC<ToolbarProps> = props => {
173176
onSave: button.props.onSave,
174177
invalid,
175178
pristine,
176-
record,
177-
resource,
179+
record: valueOrDefault(
180+
button.props.record,
181+
record
182+
),
183+
resource: valueOrDefault(
184+
button.props.resource,
185+
resource
186+
),
178187
saving,
179188
submitOnEnter: valueOrDefault(
180189
button.props.submitOnEnter,

0 commit comments

Comments
 (0)