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);
}
};