diff --git a/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx b/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx index adf059f46d5..8425c6659a4 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx @@ -85,6 +85,16 @@ export const FilterButton = (props: FilterButtonProps): JSX.Element => { const handleShow = useCallback( ({ source, defaultValue }) => { showFilter(source, defaultValue === '' ? undefined : defaultValue); + // We have to fallback to imperative code because the new FilterFormInput + // has no way of knowing it has just been displayed (and thus that it should focus its input) + setTimeout(() => { + const inputElement = document.querySelector( + `input[name='${source}']` + ) as HTMLInputElement; + if (inputElement) { + inputElement.focus(); + } + }, 50); setOpen(false); }, [showFilter, setOpen] diff --git a/packages/ra-ui-materialui/src/list/filter/FilterFormInput.tsx b/packages/ra-ui-materialui/src/list/filter/FilterFormInput.tsx index 8d1f8c3ba17..9b20c324812 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterFormInput.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterFormInput.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { styled } from '@mui/material/styles'; import PropTypes from 'prop-types'; import { IconButton } from '@mui/material'; -import ActionHide from '@mui/icons-material/HighlightOff'; +import ActionHide from '@mui/icons-material/RemoveCircleOutline'; import clsx from 'clsx'; import { useResourceContext, useTranslate } from 'ra-core'; @@ -16,6 +16,14 @@ export const FilterFormInput = props => { data-source={filterElement.props.source} className={clsx('filter-field', className)} > + {React.cloneElement(filterElement, { + resource, + record: emptyRecord, + size: filterElement.props.size ?? 'small', + helperText: false, + // ignore defaultValue in Field because it was already set in Form (via mergedInitialValuesWithDefaultValues) + defaultValue: undefined, + })} {!filterElement.props.alwaysOn && ( { )} - {React.cloneElement(filterElement, { - resource, - record: emptyRecord, - size: filterElement.props.size ?? 'small', - helperText: false, - // ignore defaultValue in Field because it was already set in Form (via mergedInitialValuesWithDefaultValues) - defaultValue: undefined, - })} +
 
);