import * as React from 'react' ; import { useCallback } from 'react' ; import PropTypes from 'prop-types' ; import DownloadIcon from '@material-ui/icons/GetApp' ; import { fetchRelatedRecords , useDataProvider , useNotify , useListContext , SortPayload , Exporter , FilterPayload , useResourceContext , } from 'ra-core' ; import Button , { ButtonProps } from './Button' ; const ExportButton = ( props ) => { const { maxResults = 1000 , onClick , label = 'ra.action.export' , icon = defaultIcon , exporter : customExporter , sort , ... rest } = props ; const { filter , filterValues , currentSort , exporter : exporterFromContext , total , } = useListContext ( props ) ; const resource = useResourceContext ( props ) ; const exporter = customExporter || exporterFromContext ; const dataProvider = useDataProvider ( ) ; const notify = useNotify ( ) ; const handleClick = useCallback ( event => { dataProvider . getList ( resource , { sort : currentSort || sort , filter : filter ? { ... filterValues , ... filter } : filterValues , pagination : { page : 1 , perPage : maxResults } , } ) . then ( ( { data } ) => exporter && exporter ( data , fetchRelatedRecords ( dataProvider ) , dataProvider , resource ) ) . catch ( error => { console . error ( error ) ; notify ( 'ra.notification.http_error' , { type : 'warning' } ) ; } ) ; if ( typeof onClick === 'function' ) { onClick ( event ) ; } } , [ currentSort , dataProvider , exporter , filter , filterValues , maxResults , notify , onClick , resource , sort , ] ) ; return ( < Button onClick = { handleClick } label = { label } disabled = { total === 0 } { ... sanitizeRestProps ( rest ) } > { icon } < /Button>); } ; const defaultIcon = < DownloadIcon />; const sanitizeRestProps = ( { basePath , filterValues , resource , ... rest } ) => rest ; interface Props { basePath ? : string ; exporter ? : Exporter ; filterValues ? : FilterPayload ; icon ? : JSX . Element ; label ? : string ; maxResults ? : number ; onClick ? : ( e : Event ) => void ; resource ? : string ; sort ? : SortPayload ; } export type ExportButtonProps = Props & ButtonProps ; ExportButton . propTypes = { basePath : PropTypes . string , exporter : PropTypes . func , filterValues : PropTypes . object , label : PropTypes . string , maxResults : PropTypes . number , resource : PropTypes . string , sort : PropTypes . exact ( { field : PropTypes . string , order : PropTypes . string , } ) , icon : PropTypes . element , } ; export default ExportButton ;