Skip to content

Commit 1c24915

Browse files
authored
fix(Dropdown): fix handling of "Space" key (#4041)
* fix(Dropdown): fix handling of "Space" key * fix UTs, add a test
1 parent e8d07f9 commit 1c24915

File tree

3 files changed

+35
-7
lines changed

3 files changed

+35
-7
lines changed

.babel-preset.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const browsers = [
1717

1818
const plugins = [
1919
['@babel/plugin-proposal-class-properties', { loose: true }],
20+
['@babel/plugin-proposal-optional-chaining', { loose: true }],
2021
'@babel/plugin-proposal-export-default-from',
2122
'@babel/plugin-proposal-export-namespace-from',
2223
'@babel/plugin-syntax-dynamic-import',

src/modules/Dropdown/Dropdown.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,20 @@ export default class Dropdown extends Component {
239239
openOnSpace = (e) => {
240240
debug('openOnSpace()')
241241

242-
if (keyboardKey.getCode(e) !== keyboardKey.Spacebar) return
242+
const shouldHandleEvent =
243+
this.state.focus && !this.state.open && keyboardKey.getCode(e) === keyboardKey.Spacebar
244+
const shouldPreventDefault =
245+
e.target?.tagName !== 'INPUT' &&
246+
e.target?.tagName !== 'TEXTAREA' &&
247+
e.target?.isContentEditable !== true
248+
249+
if (shouldHandleEvent) {
250+
if (shouldPreventDefault) {
251+
e.preventDefault()
252+
}
243253

244-
e.preventDefault()
245-
this.open(e)
254+
this.open(e)
255+
}
246256
}
247257

248258
openOnArrow = (e) => {
@@ -549,6 +559,7 @@ export default class Dropdown extends Component {
549559
handleKeyDown = (e) => {
550560
this.moveSelectionOnKeyDown(e)
551561
this.openOnArrow(e)
562+
this.openOnSpace(e)
552563
this.selectItemOnEnter(e)
553564

554565
_.invoke(this.props, 'onKeyDown', e)
@@ -1089,7 +1100,6 @@ export default class Dropdown extends Component {
10891100
{open && <EventStack name='click' on={this.closeOnDocumentClick} />}
10901101

10911102
{focus && <EventStack name='keydown' on={this.removeItemOnBackspace} />}
1092-
{focus && !open && <EventStack name='keydown' on={this.openOnSpace} />}
10931103
</ElementType>
10941104
</Ref>
10951105
)

test/specs/modules/Dropdown/Dropdown-test.js

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ describe('Dropdown', () => {
530530
document.activeElement.blur()
531531

532532
// doesn't open on space
533-
domEvent.keyDown(document, { key: ' ' })
533+
wrapper.simulate('keydown', { key: 'Spacebar' })
534534
wrapper.update()
535535
dropdownMenuIsClosed()
536536
})
@@ -1263,6 +1263,7 @@ describe('Dropdown', () => {
12631263
})
12641264

12651265
it('opens on space when focused', () => {
1266+
const preventDefault = sandbox.spy()
12661267
wrapperMount(<Dropdown options={options} selection />)
12671268

12681269
// Note: This mousedown is necessary to get the Dropdown focused
@@ -1271,8 +1272,24 @@ describe('Dropdown', () => {
12711272
wrapper.simulate('focus')
12721273
dropdownMenuIsClosed()
12731274

1274-
domEvent.keyDown(document, { key: ' ' })
1275+
wrapper.simulate('keydown', { key: 'Spacebar', preventDefault })
12751276
dropdownMenuIsOpen()
1277+
preventDefault.should.have.been.calledOnce()
1278+
})
1279+
1280+
it('opens on space in search input when focused', () => {
1281+
const preventDefault = sandbox.spy()
1282+
wrapperMount(<Dropdown options={options} selection search />)
1283+
1284+
// Note: This mousedown is necessary to get the Dropdown focused
1285+
// without it being open.
1286+
wrapper.simulate('mousedown')
1287+
wrapper.simulate('focus')
1288+
dropdownMenuIsClosed()
1289+
1290+
wrapper.find('input.search').simulate('keydown', { key: 'Spacebar', preventDefault })
1291+
dropdownMenuIsOpen()
1292+
preventDefault.should.have.not.been.called()
12761293
})
12771294

12781295
it('does not open on arrow down when not focused', () => {
@@ -1287,7 +1304,7 @@ describe('Dropdown', () => {
12871304
wrapperMount(<Dropdown options={options} selection />)
12881305
dropdownMenuIsClosed()
12891306

1290-
domEvent.keyDown(document, { key: ' ' })
1307+
wrapper.simulate('keydown', { key: 'Spacebar' })
12911308
dropdownMenuIsClosed()
12921309
})
12931310

0 commit comments

Comments
 (0)