diff --git a/jslib/src/helpers/keyboard.ts b/jslib/src/helpers/keyboard.ts index 8b58f5e2..b8e7d37f 100644 --- a/jslib/src/helpers/keyboard.ts +++ b/jslib/src/helpers/keyboard.ts @@ -24,3 +24,8 @@ export const KEYCODE_TAB = 9; // alphabet export const KEYCODE_LOWERCASE_B = 66; + +// isPrintableKey returns if the key represented in the given event is printable. +export function isPrintableKey(e: KeyboardEvent) { + return e.key.length === 1; +} diff --git a/web/src/components/Common/Editor/BookSelector/index.tsx b/web/src/components/Common/Editor/BookSelector/index.tsx index 6f59d238..dbd525f3 100644 --- a/web/src/components/Common/Editor/BookSelector/index.tsx +++ b/web/src/components/Common/Editor/BookSelector/index.tsx @@ -20,6 +20,7 @@ import React, { useState, useEffect } from 'react'; import classnames from 'classnames'; import { booksToOptions } from 'jslib/helpers/select'; +import { isPrintableKey } from 'jslib/helpers/keyboard'; import Popover from '../../Popover'; import SearchableMenu from '../../SearchableMenu'; import BookIcon from '../../../Icons/Book'; @@ -117,6 +118,14 @@ const BookSelector: React.SFC = ({ onClick={() => { setIsOpen(!isOpen); }} + onKeyDown={e => { + if (isPrintableKey(e.nativeEvent)) { + e.preventDefault(); + + setTextboxValue(e.key); + setIsOpen(true); + } + }} aria-haspopup="menu" aria-expanded={ariaExpanded} aria-controls="book-filter"