-
-
Notifications
You must be signed in to change notification settings - Fork 5.3k
/
Copy pathDeleteWithUndoButton.tsx
98 lines (89 loc) · 2.49 KB
/
DeleteWithUndoButton.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import * as React from 'react';
import { styled } from '@mui/material/styles';
import { ReactElement, ReactEventHandler } from 'react';
import PropTypes from 'prop-types';
import { alpha } from '@mui/material/styles';
import ActionDelete from '@mui/icons-material/Delete';
import clsx from 'clsx';
import { UseMutationOptions } from 'react-query';
import {
RaRecord,
useDeleteWithUndoController,
DeleteParams,
useRecordContext,
useResourceContext,
} from 'ra-core';
import { Button, ButtonProps } from './Button';
export const DeleteWithUndoButton = <RecordType extends RaRecord = any>(
props: DeleteWithUndoButtonProps<RecordType>
) => {
const {
label = 'ra.action.delete',
className,
icon = defaultIcon,
onClick,
redirect = 'list',
mutationOptions,
...rest
} = props;
const record = useRecordContext(props);
const resource = useResourceContext(props);
const { isLoading, handleDelete } = useDeleteWithUndoController({
record,
resource,
redirect,
onClick,
mutationOptions,
});
return (
<StyledButton
onClick={handleDelete}
disabled={isLoading}
label={label}
className={clsx('ra-delete-button', className)}
key="button"
{...rest}
>
{icon}
</StyledButton>
);
};
const defaultIcon = <ActionDelete />;
export interface DeleteWithUndoButtonProps<
RecordType extends RaRecord = any,
MutationOptionsError = unknown
> extends ButtonProps<RecordType> {
icon?: ReactElement;
onClick?: ReactEventHandler<any>;
mutationOptions?: UseMutationOptions<
RecordType,
MutationOptionsError,
DeleteParams<RecordType>
>;
}
DeleteWithUndoButton.propTypes = {
className: PropTypes.string,
label: PropTypes.string,
record: PropTypes.any,
redirect: PropTypes.oneOfType([
PropTypes.string,
PropTypes.bool,
PropTypes.func,
]),
resource: PropTypes.string,
icon: PropTypes.element,
};
const PREFIX = 'RaDeleteWithUndoButton';
const StyledButton = styled(Button, {
name: PREFIX,
overridesResolver: (props, styles) => styles.root,
})(({ theme }) => ({
color: theme.palette.error.main,
'&:hover': {
backgroundColor: alpha(theme.palette.error.main, 0.12),
// Reset on mouse devices
'@media (hover: none)': {
backgroundColor: 'transparent',
},
},
}));