diff --git a/packages/mui-base/src/AutocompleteUnstyled/useAutocomplete.js b/packages/mui-base/src/AutocompleteUnstyled/useAutocomplete.js index 235c201b880898..c41218e0648d4b 100644 --- a/packages/mui-base/src/AutocompleteUnstyled/useAutocomplete.js +++ b/packages/mui-base/src/AutocompleteUnstyled/useAutocomplete.js @@ -470,7 +470,8 @@ export default function useAutocomplete(props) { previousProps.filteredOptions && previousProps.filteredOptions.length !== filteredOptions.length && (multiple - ? previousProps.value.every((val, i) => getOptionLabel(value[i]) === getOptionLabel(val)) + ? value.length === previousProps.value.length && + previousProps.value.every((val, i) => getOptionLabel(value[i]) === getOptionLabel(val)) : getOptionLabel(previousProps.value ?? '') === getOptionLabel(value ?? '')) ) { const previousHighlightedOption = previousProps.filteredOptions[highlightedIndexRef.current]; diff --git a/packages/mui-material/src/Autocomplete/Autocomplete.test.js b/packages/mui-material/src/Autocomplete/Autocomplete.test.js index 64543292803ba1..8558f47410902c 100644 --- a/packages/mui-material/src/Autocomplete/Autocomplete.test.js +++ b/packages/mui-material/src/Autocomplete/Autocomplete.test.js @@ -2822,4 +2822,57 @@ describe('', () => { expect(container.querySelectorAll(`.${chipClasses.root}`)).to.have.length(2); }); }); + + // https://github.com/mui/material-ui/issues/36114 + describe('deleting a tag immediately after adding it while the listbox is still open', () => { + it('should allow it, given that options are primitive values', () => { + const { container } = render( + } + />, + ); + + const textbox = screen.getByRole('combobox'); + + fireEvent.keyDown(textbox, { key: 'ArrowDown' }); + fireEvent.keyDown(textbox, { key: 'ArrowDown' }); // highlight the first option... + fireEvent.keyDown(textbox, { key: 'Enter' }); // ...and select it + + fireEvent.keyDown(textbox, { key: 'ArrowDown' }); // highlight another option + + expect(container.querySelectorAll(`.${chipClasses.root}`)).to.have.length(1); + + fireEvent.keyDown(textbox, { key: 'Backspace' }); + expect(container.querySelectorAll(`.${chipClasses.root}`)).to.have.length(0); + }); + + it('should allow it, given that options are objects', () => { + const { container } = render( + } + />, + ); + + const textbox = screen.getByRole('combobox'); + + fireEvent.keyDown(textbox, { key: 'ArrowDown' }); + fireEvent.keyDown(textbox, { key: 'ArrowDown' }); // highlight the first option... + fireEvent.keyDown(textbox, { key: 'Enter' }); // ...and select it + + fireEvent.keyDown(textbox, { key: 'ArrowDown' }); // highlight another option + + expect(container.querySelectorAll(`.${chipClasses.root}`)).to.have.length(1); + + fireEvent.keyDown(textbox, { key: 'Backspace' }); + expect(container.querySelectorAll(`.${chipClasses.root}`)).to.have.length(0); + }); + }); });