diff --git a/src/multiselect/__integ__/multiselect.test.ts b/src/multiselect/__integ__/multiselect.test.ts index a631434167..97c63d6407 100644 --- a/src/multiselect/__integ__/multiselect.test.ts +++ b/src/multiselect/__integ__/multiselect.test.ts @@ -231,7 +231,11 @@ describe(`Multiselect with group selection`, () => { 'group selection selects all enabled child options', setupTest(async page => { await page.clickSelect(); - await page.keys(['ArrowUp']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); await page.keys(['Enter']); await expect(page.getSelectedOptionLabels()).resolves.toEqual([ 'Second category', @@ -246,7 +250,11 @@ describe(`Multiselect with group selection`, () => { 'group selection deselects all enabled child options on double press', setupTest(async page => { await page.clickSelect(); - await page.keys(['ArrowUp']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); await page.keys(['Enter']); await page.keys(['Enter']); @@ -258,7 +266,11 @@ describe(`Multiselect with group selection`, () => { 'deselecting an element removes the parent from the selected options labels', setupTest(async page => { await page.clickSelect(); - await page.keys(['ArrowUp']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); await page.keys(['Enter']); await page.keys(['ArrowDown']); await page.keys(['Enter']); @@ -272,6 +284,12 @@ describe(`Multiselect with group selection`, () => { await page.clickSelect(); await page.keys(['ArrowDown']); await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); await page.keys(['Enter']); await expect(page.getSelectedOptionLabels()).resolves.toEqual([ 'Second category', @@ -300,9 +318,13 @@ describe(`Multiselect with group selection`, () => { await page.clickSelect(); await page.keys(['ArrowDown']); await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); await page.keys(['Enter']); await page.keys(['4']); await page.keys(['ArrowDown']); + await page.keys(['ArrowDown']); await page.keys(['Enter']); await expect(page.getSelectedOptionLabels()).resolves.toEqual([]); await expect(page.getTokenLabels()).resolves.toEqual(['option5', 'option6']); diff --git a/src/select/__tests__/use-select.test.ts b/src/select/__tests__/use-select.test.ts index 6ae71eed67..3ad81946a7 100644 --- a/src/select/__tests__/use-select.test.ts +++ b/src/select/__tests__/use-select.test.ts @@ -240,6 +240,34 @@ describe('useSelect', () => { expect(updateSelectedOption).not.toHaveBeenCalled(); }); + test('select without filter should open and navigate to selected option', () => { + const hook = renderHook(useSelect, { + initialProps: { ...initialProps, filteringType: 'none', selectedOptions: [{ value: 'child1' }] }, + }); + const { getTriggerProps } = hook.result.current; + const triggerProps = getTriggerProps(); + act(() => triggerProps.onKeyDown && triggerProps.onKeyDown(createTestEvent(KeyCode.space))); + expect(hook.result.current.isOpen).toBe(true); + expect(hook.result.current.highlightedOption).toEqual({ + type: 'child', + option: { + label: 'Child 1', + value: 'child1', + }, + }); + }); + + test('select with filter should open and NOT navigate to selected option', () => { + const hook = renderHook(useSelect, { + initialProps: { ...initialProps, selectedOptions: [{ value: 'child1' }] }, + }); + const { getTriggerProps } = hook.result.current; + const triggerProps = getTriggerProps(); + act(() => triggerProps.onKeyDown && triggerProps.onKeyDown(createTestEvent(KeyCode.space))); + expect(hook.result.current.isOpen).toBe(true); + expect(hook.result.current.highlightedOption).toBeFalsy(); + }); + describe('calculates if the highlighted option is selected', () => { test('highlighted option is selected', () => { const hook = renderHook(useSelect, { diff --git a/src/select/utils/use-select.ts b/src/select/utils/use-select.ts index 4c2e2d24fc..36c1efd903 100644 --- a/src/select/utils/use-select.ts +++ b/src/select/utils/use-select.ts @@ -249,11 +249,12 @@ export function useSelect({ const prevOpen = usePrevious(isOpen); useEffect(() => { - // highlight the first selected option, when opening the Select component - if (isOpen && !prevOpen && hasSelectedOption) { + // highlight the first selected option, when opening the Select component without filter input + // keep the focus in the filter input when opening, so that screenreader can recognize the combobox + if (isOpen && !prevOpen && hasSelectedOption && !hasFilter) { setHighlightedIndexWithMouse(options.indexOf(__selectedOptions[0])); } - }, [isOpen, __selectedOptions, hasSelectedOption, setHighlightedIndexWithMouse, options, prevOpen]); + }, [isOpen, __selectedOptions, hasSelectedOption, setHighlightedIndexWithMouse, options, prevOpen, hasFilter]); useEffect(() => { if (isOpen) {