Skip to content

Commit 3d4d59e

Browse files
cweeiimergify[bot]
authored andcommitted
feat(dropdown-menu): allow esc to propagate if dropdown is closed (#1686)
* feat(dropdown-menu): allow esc to propagate if dropdown is closed * feat(dropdown-menu): added positive test case * feat(dropdown-menu): use key constants from constantsjs * feat(dropdown-menu): allow esc to propagate if dropdown is closed * feat(dropdown-menu): added positive test case * feat(dropdown-menu): use key constants from constantsjs
1 parent 29a1220 commit 3d4d59e

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

src/components/dropdown-menu/DropdownMenu.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as React from 'react';
33
import TetherComponent from 'react-tether';
44
import uniqueId from 'lodash/uniqueId';
55

6+
import { KEYS } from '../../constants';
67
import './DropdownMenu.scss';
78

89
type Props = {
@@ -107,25 +108,30 @@ class DropdownMenu extends React.Component<Props, State> {
107108
};
108109

109110
handleButtonKeyDown = (event: SyntheticKeyboardEvent<>) => {
111+
const { isOpen } = this.state;
112+
110113
switch (event.key) {
111-
case ' ': // Spacebar
112-
case 'Enter':
113-
case 'ArrowDown':
114+
case KEYS.space:
115+
case KEYS.enter:
116+
case KEYS.arrowDown:
114117
event.stopPropagation();
115118
event.preventDefault();
116119

117120
this.openMenuAndSetFocusIndex(0);
118121
break;
119122

120-
case 'ArrowUp':
123+
case KEYS.arrowUp:
121124
event.stopPropagation();
122125
event.preventDefault();
123126

124127
this.openMenuAndSetFocusIndex(-1);
125128
break;
126129

127-
case 'Escape':
128-
event.stopPropagation();
130+
case KEYS.escape:
131+
if (isOpen) {
132+
event.stopPropagation();
133+
}
134+
129135
event.preventDefault();
130136
this.closeMenu();
131137
break;

src/components/dropdown-menu/__tests__/DropdownMenu.test.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { mount, shallow } from 'enzyme';
33
import sinon from 'sinon';
44

55
import DropdownMenu from '../DropdownMenu';
6+
import { KEYS } from '../../../constants';
67

78
const sandbox = sinon.sandbox.create();
89

@@ -357,13 +358,13 @@ describe('components/dropdown-menu/DropdownMenu', () => {
357358
describe('handleButtonKeyDown()', () => {
358359
[
359360
{
360-
key: ' ',
361+
key: KEYS.space,
361362
},
362363
{
363-
key: 'Enter',
364+
key: KEYS.enter,
364365
},
365366
{
366-
key: 'ArrowDown',
367+
key: KEYS.arrowDown,
367368
},
368369
].forEach(({ key }) => {
369370
test('should call openMenuAndSetFocus(0) when an open keystroke is pressed', () => {
@@ -388,6 +389,28 @@ describe('components/dropdown-menu/DropdownMenu', () => {
388389
});
389390
});
390391

392+
test('shoud not stop esc propagation if dropdown is closed', () => {
393+
const wrapper = getWrapper();
394+
wrapper.setState({ isOpen: false });
395+
396+
wrapper.find(FakeButton).simulate('keydown', {
397+
key: KEYS.escape,
398+
preventDefault: sandbox.mock(),
399+
stopPropagation: sandbox.mock().never(),
400+
});
401+
});
402+
403+
test('should stop esc propagation if dropdown is open', () => {
404+
const wrapper = getWrapper();
405+
wrapper.setState({ isOpen: true });
406+
407+
wrapper.find(FakeButton).simulate('keydown', {
408+
key: KEYS.escape,
409+
preventDefault: sandbox.mock(),
410+
stopPropagation: sandbox.mock(),
411+
});
412+
});
413+
391414
test('should call openMenuAndSetFocus(-1) to last item when "up" is pressed', () => {
392415
const wrapper = shallow(
393416
<DropdownMenu>

0 commit comments

Comments
 (0)