diff --git a/packages/ra-ui-materialui/src/list/FilterForm.js b/packages/ra-ui-materialui/src/list/FilterForm.js index 0daf9f4e034..00ddf4da92e 100644 --- a/packages/ra-ui-materialui/src/list/FilterForm.js +++ b/packages/ra-ui-materialui/src/list/FilterForm.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import { Form, FormSpy } from 'react-final-form'; import classnames from 'classnames'; @@ -37,7 +37,10 @@ const sanitizeRestProps = ({ dirtySinceLastSubmit, dispatch, displayedFilters, + errors, + filters, filterValues, + form, handleSubmit, hasSubmitErrors, hasValidationErrors, @@ -46,6 +49,7 @@ const sanitizeRestProps = ({ initialized, initialValues, invalid, + modified, pristine, pure, reset, @@ -61,71 +65,79 @@ const sanitizeRestProps = ({ submitSucceeded, submitting, touch, + touched, triggerSubmit, untouch, valid, validate, validating, - _reduxForm, + values, + visited, + __versions, ...props }) => props; -export class FilterForm extends Component { - componentDidMount() { - this.props.filters.forEach(filter => { +export const FilterForm = ({ + classes = {}, + className, + resource, + margin, + variant, + filters, + displayedFilters, + hideFilter, + initialValues, + ...rest +}) => { + useEffect(() => { + filters.forEach(filter => { if (filter.props.alwaysOn && filter.props.defaultValue) { throw new Error( 'Cannot use alwaysOn and defaultValue on a filter input. Please set the filterDefaultValues props on the element instead.' ); } }); - } + }, [filters]); - getShownFilters() { - const { filters, displayedFilters, initialValues } = this.props; - - return filters.filter( + const getShownFilters = () => + filters.filter( filterElement => filterElement.props.alwaysOn || displayedFilters[filterElement.props.source] || typeof lodashGet(initialValues, filterElement.props.source) !== 'undefined' ); - } - - handleHide = event => - this.props.hideFilter(event.currentTarget.dataset.key); - - render() { - const { - classes = {}, - className, - resource, - margin, - variant, - ...rest - } = this.props; - - return ( -
- {this.getShownFilters().map(filterElement => ( - - ))} -
- - ); - } -} + + const handleHide = useCallback( + event => hideFilter(event.currentTarget.dataset.key), + [hideFilter] + ); + + return ( +
+ {getShownFilters().map(filterElement => ( + + ))} +
+ + ); +}; + +const handleSubmit = event => { + event.preventDefault(); + return false; +}; FilterForm.propTypes = { resource: PropTypes.string.isRequired, @@ -169,7 +181,7 @@ const EnhancedFilterForm = props => { return (
{}} + onSubmit={handleFinalFormSubmit} initialValues={mergedInitialValuesWithDefaultValues} render={formProps => ( <> @@ -189,6 +201,8 @@ const EnhancedFilterForm = props => { ); }; +const handleFinalFormSubmit = () => {}; + // Options to instruct the FormSpy that it should only listen to the values and pristine changes const FormSpySubscription = { values: true, pristine: true }; diff --git a/packages/ra-ui-materialui/src/list/FilterForm.spec.js b/packages/ra-ui-materialui/src/list/FilterForm.spec.js index 93a810d24bd..a1432073d97 100644 --- a/packages/ra-ui-materialui/src/list/FilterForm.spec.js +++ b/packages/ra-ui-materialui/src/list/FilterForm.spec.js @@ -20,7 +20,7 @@ describe('', () => { const filters = [ , , - ]; // eslint-disable-line react/jsx-key + ]; const displayedFilters = { title: true, 'customer.name': true,