From 45274d9dff49b49b2b6b2acfe890821b74667fbc Mon Sep 17 00:00:00 2001 From: Mathias Jakobsen Date: Fri, 5 Jan 2024 09:18:30 +0000 Subject: [PATCH] Merge pull request #16380 from overleaf/mj-select-keyboard [web] Allow keyboard interactions with custom select component GitOrigin-RevId: 81adea8e456bd6ce2483dfa17a352c24c36e5768 --- .../frontend/js/shared/components/select.tsx | 21 +++++++++++++++++-- .../components/shared/select.spec.tsx | 9 ++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/services/web/frontend/js/shared/components/select.tsx b/services/web/frontend/js/shared/components/select.tsx index eb7c453099..271896a34e 100644 --- a/services/web/frontend/js/shared/components/select.tsx +++ b/services/web/frontend/js/shared/components/select.tsx @@ -1,6 +1,6 @@ /* eslint-disable jsx-a11y/label-has-for */ /* eslint-disable jsx-a11y/label-has-associated-control */ -import { useRef, useEffect } from 'react' +import { useRef, useEffect, KeyboardEventHandler, useCallback } from 'react' import classNames from 'classnames' import { useSelect } from 'downshift' import Icon from './icon' @@ -59,6 +59,7 @@ export const Select = ({ getMenuProps, getItemProps, highlightedIndex, + openMenu, } = useSelect({ items: items ?? [], itemToString, @@ -91,6 +92,17 @@ export const Select = ({ } }, [name, itemToString, selectedItem, defaultItem]) + const onKeyDown: KeyboardEventHandler = useCallback( + event => { + if (event.key === 'Enter' && !isOpen) { + event.preventDefault() + ;(event.nativeEvent as any).preventDownshiftDefault = true + openMenu() + } + }, + [isOpen, openMenu] + ) + let value: string | undefined if (selectedItem || defaultItem) { value = itemToString(selectedItem || defaultItem) @@ -113,7 +125,12 @@ export const Select = ({ ) : null}
{value}
diff --git a/services/web/test/frontend/components/shared/select.spec.tsx b/services/web/test/frontend/components/shared/select.spec.tsx index 15fa53590d..7231a1bd11 100644 --- a/services/web/test/frontend/components/shared/select.spec.tsx +++ b/services/web/test/frontend/components/shared/select.spec.tsx @@ -266,4 +266,13 @@ describe('