forked from marmelab/react-admin
-
Notifications
You must be signed in to change notification settings - Fork 1
/
BulkExportButton.tsx
99 lines (90 loc) · 2.59 KB
/
BulkExportButton.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
99
import * as React from 'react';
import { useCallback, FunctionComponent } from 'react';
import PropTypes from 'prop-types';
import DownloadIcon from '@material-ui/icons/GetApp';
import {
fetchRelatedRecords,
useDataProvider,
useNotify,
Identifier,
Exporter,
useListContext,
} from 'ra-core';
import Button, { ButtonProps } from './Button';
const BulkExportButton: FunctionComponent<BulkExportButtonProps> = props => {
const {
onClick,
label = 'ra.action.export',
icon = defaultIcon,
exporter: customExporter,
...rest
} = props;
const {
exporter: exporterFromContext,
resource,
selectedIds,
} = useListContext(props);
const exporter = customExporter || exporterFromContext;
const dataProvider = useDataProvider();
const notify = useNotify();
const handleClick = useCallback(
event => {
exporter &&
dataProvider
.getMany(resource, { ids: selectedIds })
.then(({ data }) =>
exporter(
data,
fetchRelatedRecords(dataProvider),
dataProvider,
resource
)
)
.catch(error => {
console.error(error);
notify('ra.notification.http_error', 'warning');
});
if (typeof onClick === 'function') {
onClick(event);
}
},
[dataProvider, exporter, notify, onClick, resource, selectedIds]
);
return (
<Button
onClick={handleClick}
label={label}
{...sanitizeRestProps(rest)}
>
{icon}
</Button>
);
};
const defaultIcon = <DownloadIcon />;
const sanitizeRestProps = ({
basePath,
filterValues,
selectedIds,
resource,
...rest
}: Omit<BulkExportButtonProps, 'exporter' | 'label'>) => rest;
interface Props {
basePath?: string;
exporter?: Exporter;
filterValues?: any;
icon?: JSX.Element;
label?: string;
onClick?: (e: Event) => void;
selectedIds: Identifier[];
resource?: string;
}
export type BulkExportButtonProps = Props & ButtonProps;
BulkExportButton.propTypes = {
basePath: PropTypes.string,
exporter: PropTypes.func,
label: PropTypes.string,
resource: PropTypes.string,
selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,
icon: PropTypes.element,
};
export default BulkExportButton;