From eb7b3c7bad3233fd7fae3af30316410659f1a41f Mon Sep 17 00:00:00 2001 From: Gildas Garcia Date: Wed, 25 Sep 2019 10:59:42 +0200 Subject: [PATCH 1/2] Fix FilterForm Submit Fixes #3731 --- .../ra-ui-materialui/src/list/FilterForm.js | 103 ++++++++++-------- .../src/list/FilterForm.spec.js | 2 +- 2 files changed, 58 insertions(+), 47 deletions(-) diff --git a/packages/ra-ui-materialui/src/list/FilterForm.js b/packages/ra-ui-materialui/src/list/FilterForm.js index 0daf9f4e034..245a3bf0557 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 } 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,76 @@ 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.' ); } }); - } - - getShownFilters() { - const { filters, displayedFilters, initialValues } = this.props; + }, [filters]); - 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 = event => hideFilter(event.currentTarget.dataset.key); + + return ( +
+ {getShownFilters().map(filterElement => ( + + ))} +
+ + ); +}; + +const handleSubmit = event => { + event.preventDefault(); + return false; +}; FilterForm.propTypes = { resource: PropTypes.string.isRequired, @@ -169,7 +178,7 @@ const EnhancedFilterForm = props => { return (
{}} + onSubmit={handleFinalFormSubmit} initialValues={mergedInitialValuesWithDefaultValues} render={formProps => ( <> @@ -189,6 +198,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, From 28146cd8213f592a6ce4c384ea06f5621acc9c28 Mon Sep 17 00:00:00 2001 From: Gildas Garcia Date: Wed, 25 Sep 2019 17:07:42 +0200 Subject: [PATCH 2/2] Review --- packages/ra-ui-materialui/src/list/FilterForm.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/ra-ui-materialui/src/list/FilterForm.js b/packages/ra-ui-materialui/src/list/FilterForm.js index 245a3bf0557..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, { useEffect } from 'react'; +import React, { useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; import { Form, FormSpy } from 'react-final-form'; import classnames from 'classnames'; @@ -108,7 +108,10 @@ export const FilterForm = ({ 'undefined' ); - const handleHide = event => hideFilter(event.currentTarget.dataset.key); + const handleHide = useCallback( + event => hideFilter(event.currentTarget.dataset.key), + [hideFilter] + ); return (