// ListToolbar.tsx
import React, { ReactElement, memo } from 'react';
import { styled, useTheme } from '@mui/material/styles';
import PropTypes from 'prop-types';
import { Box, Divider, ToolbarProps, useMediaQuery } from '@mui/material';
import { Exporter, useListContext } from 'ra-core';
import { FilterContext, FilterForm } from 'react-admin';
import { ActiveFiltersChips, FilterSidebarContext } from './FilterSidebar';
import { isEmpty } from 'lodash';
import { ListTabToolbarConfig, ListTabsToolbar } from './ListTabsToolbar';
interface ListToolbarPropsExtended extends ListToolbarProps {
hasFilterSidebar?: boolean;
tabs?: ListTabToolbarConfig[];
}
function ListToolbarComp(props: ListToolbarPropsExtended): ReactElement | null {
const { filters, actions, className, hasFilterSidebar, tabs, ...rest } = props;
const theme = useTheme() as any;
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
const Actions = actions ? React.cloneElement(actions, { ...rest, filters, ...actions.props }) : null;
const { filterValues, data, isLoading } = useListContext();
const shouldRenderEmptyList = !isLoading && data && data.length === 0;
const hasTabs = tabs && tabs.length > 0;
return Array.isArray(filters) ? (
{tabs ? : null}
{isMobile && hasFilterSidebar ? (
{Actions}
{!isEmpty(filterValues) ? (
) : null}
) : (
{hasFilterSidebar ? : }
{!isMobile ? : null}
{Actions}
)}
) : (
{tabs ? : null}
{filters
? React.cloneElement(filters, {
...rest,
context: 'form'
})
: null}
{actions
? React.cloneElement(actions, {
...rest,
filters,
...actions.props
})
: null}
);
}
ListToolbarComp.propTypes = {
filters: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element)]),
// @ts-ignore
actions: PropTypes.oneOfType([PropTypes.bool, PropTypes.element]),
// @ts-ignore
exporter: PropTypes.oneOfType([PropTypes.func, PropTypes.bool])
};
interface ListToolbarProps extends Omit {
actions?: ReactElement | false;
exporter?: Exporter | false;
filters?: ReactElement | ReactElement[];
hasCreate?: boolean;
}
const PREFIX = 'RaListToolbar';
const Root = styled('div', {
name: PREFIX,
overridesResolver: (styles) => styles.root
})(({ theme }) => ({
display: 'flex',
position: 'relative',
justifyContent: 'space-between',
alignItems: 'flex-end',
width: '100%',
padding: 0,
// [theme.breakpoints.down('md')]: {
// flexWrap: 'wrap'
// },
[theme.breakpoints.down('sm')]: {
backgroundColor: theme.palette.background.paper,
flexWrap: 'inherit',
flexDirection: 'column-reverse'
}
}));
const ListToolbar = memo(ListToolbarComp);
export { ListToolbar };
export type { ListToolbarProps };