import { memo, useCallback } from 'react'; import { useToggle } from 'react-use'; import noop from 'lodash/noop'; import MuiCollapse from '@mui/material/Collapse'; import MuiGrid from '@mui/material/Grid'; import { Autocomplete } from '../@forms/autocomplete'; import { ButtonsWithMenu } from '../buttons-with-menu'; import { SearchField } from '../@forms/search-field'; import { ActionFiltersButtons, SaveField, ToggleFiltersButton } from './partials'; import { useRenderFilterComponent } from './hooks'; import createClasses from './styles'; import type { FiltersProps } from './types'; const Filters = (props: FiltersProps) => { const { autocompleteProps, searchFieldProps = {}, filters, values = {}, onValuesChange = noop, buttonsWithMenuProps, showSaveField, saveFiltersFieldText, saveFieldProps, handleCloseSaveField, handleFieldSaveFilters } = props; const clearFiltersButtonProps = { children: props.clearFiltersText, hidden: !props.showClear, onClick: props.handleClearFilters, ...props.clearFiltersButtonProps }; const saveFiltersButtonProps = { children: props.saveFiltersText, hidden: !props.showSave, onClick: props.handleSaveFilters, ...props.saveFiltersButtonProps }; const updateFiltersButtonProps = { children: props.updateFiltersText, hidden: !props.showUpdate, onClick: props.handleUpdateFilters, ...props.updateFiltersButtonProps }; const styles = createClasses(); const [open, toggleOpen] = useToggle(false); const filtersButtonProps = typeof props.filtersButtonProps === 'function' ? props.filtersButtonProps(open) : props.filtersButtonProps; const onFiltersButtonClick = useCallback( event => { filtersButtonProps?.onClick?.(event); toggleOpen(); }, [filtersButtonProps, toggleOpen] ); const renderFilterComponent = useRenderFilterComponent(values, onValuesChange); return ( {autocompleteProps ? ( ) : ( searchFieldProps && )} {buttonsWithMenuProps && } {filters.map(filter => ( {renderFilterComponent(filter)} ))} {showSaveField && ( )} ); }; const m = memo(Filters); export { m as Filters };