// 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 };