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
| import * as React from 'react';
| import { useCallback } from 'react';
| import DownloadIcon from '@mui/icons-material/GetApp';
| import {
| Button, useDataProvider, useNotify, useListContext
| } from 'react-admin';
|
| const MyExportButton = (props) => {
| const {
| maxResults = 1000,
| onClick,
| label = 'ra.action.export',
| icon = defaultIcon,
| exporter: customExporter,
| meta,
| ...rest
| } = props;
|
| const {
| filter,
| filterValues,
| resource,
| sort,
| total,
| } = useListContext();
|
| const dataProvider = useDataProvider();
| const notify = useNotify();
|
| const handleClick = useCallback(
| event => {
| dataProvider.export(resource, {
| sort,
| filter: filter
| ? { ...filterValues, ...filter }
| : filterValues,
| pagination: { page: 1, perPage: maxResults },
| meta,
| }).then((res) => {
| const url = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] }));
| const link = document.createElement('a');
| link.href = url;
| link.setAttribute('download', `${resource}.xlsx`);
| document.body.appendChild(link);
| link.click();
| link.remove();
| }).catch(error => {
| console.error(error);
| notify('ra.notification.http_error', { type: 'error' });
| });
| if (typeof onClick === 'function') {
| onClick(event);
| }
| },
| [
| dataProvider,
| filter,
| filterValues,
| maxResults,
| notify,
| onClick,
| resource,
| sort,
| meta,
| ]
| );
|
| return (
| <Button
| onClick={handleClick}
| label={label}
| disabled={total === 0}
| {...sanitizeRestProps(rest)}
| >
| {icon}
| </Button>
| );
| };
|
| const defaultIcon = <DownloadIcon />;
|
| const sanitizeRestProps = ({
| resource,
| ...rest
| }) => rest;
|
| export default MyExportButton;
|
|