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
  | import * as React from "react"; 
 |  import { useCallback } from "react"; 
 |  import DownloadIcon from "@mui/icons-material/GetApp"; 
 |  import { 
 |    Button, 
 |    useDataProvider, 
 |    useNotify, 
 |    useListContext, 
 |    useUnselectAll, 
 |  } from "react-admin"; 
 |    
 |  const MyExportButton = (props) => { 
 |    const { 
 |      maxResults = 1000, 
 |      onClick, 
 |      ids, 
 |      label = "ra.action.export", 
 |      icon = defaultIcon, 
 |      exporter: customExporter, 
 |      meta, 
 |      ...rest 
 |    } = props; 
 |    
 |    const { filter, selectedIds, filterValues, resource, sort, total } = useListContext(); 
 |    const unSelect = useUnselectAll(resource); 
 |    const dataProvider = useDataProvider(); 
 |    const notify = useNotify(); 
 |    const handleClick =  
 |    // useCallback( 
 |      (event) => { 
 |        dataProvider 
 |          .export(resource, { 
 |            sort, 
 |            ids: selectedIds, 
 |            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(); 
 |            unSelect(); 
 |          }) 
 |          .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; 
 |  
  |