import * as React from 'react';
import { useCallback } from 'react';
import PropTypes from 'prop-types';
import DownloadIcon from '@mui/icons-material/GetApp';
import {
Exporter,
FilterPayload,
fetchRelatedRecords,
useDataProvider,
useListContext,
useNotify,
useResourceContext
} from 'ra-core';
import { Button, ButtonProps } from './Button';
/**
* Custom ExportButton that exports data.
*
*
* @example
* import { ExportButton } from '@applica-software-guru/react-admin';
* import { TopToolbar } from 'react-admin';
*
* const ListActions = () => (
*
*
*
* );
*/
function _ExportButton(props: ExportButtonProps) {
const {
maxResults = 1000,
onClick,
label = 'ra.action.export',
icon = defaultIcon,
exporter: customExporter,
meta,
sort,
...rest
} = props;
const { filter, filterValues, exporter: exportContext, total } = useListContext(props);
const resource = useResourceContext(props);
const exporter = customExporter || exportContext;
const dataProvider = useDataProvider();
const notify = useNotify();
const handleClick = useCallback(
(event: React.MouseEvent) => {
dataProvider
.getList(resource, {
sort: { field: '_id', order: 'ASC' },
filter: filter ? { ...filterValues, ...filter } : filterValues,
pagination: { page: 1, perPage: maxResults },
meta
})
.then(({ data }) => exporter && exporter(data, fetchRelatedRecords(dataProvider), dataProvider, resource))
.catch((error) => {
console.error(error);
notify('ra.notification.http_error', { type: 'error' });
});
if (typeof onClick === 'function') {
onClick(event as any);
}
},
[dataProvider, exporter, filter, filterValues, maxResults, notify, onClick, resource, meta]
);
return (
);
}
interface Props {
exporter?: Exporter;
filterValues?: FilterPayload;
icon?: JSX.Element;
label?: string;
maxResults?: number;
onClick?: (e: Event) => void;
resource?: string;
meta?: any;
sort?: any;
}
type ExportButtonProps = Props & ButtonProps;
_ExportButton.propTypes = {
exporter: PropTypes.func,
filterValues: PropTypes.object,
label: PropTypes.string,
maxResults: PropTypes.number,
resource: PropTypes.string,
icon: PropTypes.element,
meta: PropTypes.any
};
const defaultIcon = ;
const ExportButton = React.memo(_ExportButton);
export { ExportButton };
export type { ExportButtonProps };