From deb31c7a1a933f9d9d3abdceab4d9e78b7bc027b Mon Sep 17 00:00:00 2001 From: hasanozacar <50142554+hasanozacar@users.noreply.github.com> Date: Sat, 22 Feb 2020 15:45:22 +0300 Subject: [PATCH] [Autocomplete] Fix stuck with open popup (#19794) --- .../src/Autocomplete/Autocomplete.test.js | 28 +++++++++++++++---- .../src/useAutocomplete/useAutocomplete.js | 16 +++++------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js b/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js index bd9dc472f94d34..bf6f017c9cd1ab 100644 --- a/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js +++ b/packages/material-ui-lab/src/Autocomplete/Autocomplete.test.js @@ -913,6 +913,25 @@ describe('', () => { expect(textbox.selectionStart).to.equal(0); expect(textbox.selectionEnd).to.equal(3); }); + + it('should focus the input when clicking on the open action', () => { + const { getByRole, queryByTitle } = render( + } + />, + ); + + const textbox = getByRole('textbox'); + fireEvent.click(textbox); + expect(textbox).to.have.focus; + textbox.blur(); + + fireEvent.click(queryByTitle('Open')); + expect(textbox).to.have.focus; + }); }); describe('controlled', () => { @@ -1141,8 +1160,7 @@ describe('', () => { fireEvent.click(firstOption); expect(textbox).to.not.have.focus; - const opener = queryByTitle('Open'); - fireEvent.click(opener); + fireEvent.click(queryByTitle('Open')); expect(textbox).to.have.focus; firstOption = getByRole('option'); fireEvent.touchStart(firstOption); @@ -1166,8 +1184,7 @@ describe('', () => { fireEvent.click(firstOption); expect(textbox).to.have.focus; - const opener = queryByTitle('Open'); - fireEvent.click(opener); + fireEvent.click(queryByTitle('Open')); firstOption = getByRole('option'); fireEvent.touchStart(firstOption); fireEvent.click(firstOption); @@ -1191,8 +1208,7 @@ describe('', () => { fireEvent.click(firstOption); expect(textbox).to.have.focus; - const opener = queryByTitle('Open'); - fireEvent.click(opener); + fireEvent.click(queryByTitle('Open')); firstOption = getByRole('option'); fireEvent.click(firstOption); expect(textbox).to.not.have.focus; diff --git a/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js b/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js index 9957ed76d7b23c..3c01bb4b3d7a5d 100644 --- a/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js +++ b/packages/material-ui-lab/src/useAutocomplete/useAutocomplete.js @@ -1,7 +1,7 @@ /* eslint-disable no-constant-condition */ import React from 'react'; import PropTypes from 'prop-types'; -import { setRef, useEventCallback, useControlled } from '@material-ui/core/utils'; +import { setRef, useEventCallback, useControlled, ownerDocument } from '@material-ui/core/utils'; // https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript // Give up on IE 11 support for this feature @@ -767,24 +767,24 @@ export default function useAutocomplete(props) { } }; - // Focus the input when first interacting with the combobox + // Focus the input when interacting with the combobox const handleClick = () => { + inputRef.current.focus(); + if ( + selectOnFocus && firstFocus.current && inputRef.current.selectionEnd - inputRef.current.selectionStart === 0 ) { - inputRef.current.focus(); - - if (selectOnFocus) { - inputRef.current.select(); - } + inputRef.current.select(); } firstFocus.current = false; }; const handleInputMouseDown = event => { - if (inputValue === '' && (!disableOpenOnFocus || inputRef.current === document.activeElement)) { + const doc = ownerDocument(inputRef.current); + if (inputValue === '' && (!disableOpenOnFocus || inputRef.current === doc.activeElement)) { handlePopupIndicator(event); } };