Skip to content

Commit fa0b605

Browse files
apivlevithomason
authored andcommitted
feat(Dropdown): add closeOnChange prop (#1252)
1 parent 5735515 commit fa0b605

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react'
2+
import { Dropdown } from 'semantic-ui-react'
3+
4+
import { getOptions } from '../common'
5+
6+
const DropdownExampleCloseOnChange = () => (
7+
<div>
8+
<Dropdown multiple search selection closeOnChange options={getOptions(5)} placeholder='I close on change' />
9+
{' '}
10+
<Dropdown multiple search selection options={getOptions(5)} placeholder='I stay open on change' />
11+
</div>
12+
)
13+
14+
export default DropdownExampleCloseOnChange

Diff for: docs/app/Examples/modules/Dropdown/Usage/index.js

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ const DropdownUsageExamples = () => (
1616
examplePath='modules/Dropdown/Usage/DropdownExampleCloseOnBlur'
1717
/>
1818

19+
<ComponentExample
20+
title='Close On Change'
21+
description='A multiple selection dropdown can close when the user changes its value.'
22+
examplePath='modules/Dropdown/Usage/DropdownExampleCloseOnChange'
23+
/>
24+
1925
<ComponentExample
2026
title='Uncontrolled'
2127
description='A dropdown can behave like an uncontrolled input.'

Diff for: src/modules/Dropdown/Dropdown.js

+18-3
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ export default class Dropdown extends Component {
8585
/** Whether or not the menu should close when the dropdown is blurred. */
8686
closeOnBlur: PropTypes.bool,
8787

88+
/**
89+
* Whether or not the menu should close when a value is selected from the dropdown.
90+
* By default, multiple selection dropdowns will remain open on change, while single
91+
* selection dropdowns will close on change.
92+
*/
93+
closeOnChange: PropTypes.bool,
94+
8895
/** A compact dropdown has no minimum width. */
8996
compact: PropTypes.bool,
9097

@@ -480,6 +487,15 @@ export default class Dropdown extends Component {
480487
if (onChange) onChange(e, { ...this.props, value })
481488
}
482489

490+
closeOnChange = (e) => {
491+
const { closeOnChange, multiple } = this.props
492+
const shouldClose = _.isUndefined(closeOnChange)
493+
? !multiple
494+
: closeOnChange
495+
496+
if (shouldClose) this.close(e)
497+
}
498+
483499
closeOnEscape = (e) => {
484500
if (keyboardKey.getCode(e) !== keyboardKey.Escape) return
485501
e.preventDefault()
@@ -557,10 +573,9 @@ export default class Dropdown extends Component {
557573
debug(keyboardKey.getName(e))
558574
if (keyboardKey.getCode(e) !== keyboardKey.Enter) return
559575
e.preventDefault()
560-
const { multiple } = this.props
561576

562577
this.makeSelectedItemActive(e)
563-
if (!multiple) this.close()
578+
this.closeOnChange(e)
564579
}
565580

566581
removeItemOnBackspace = (e) => {
@@ -651,8 +666,8 @@ export default class Dropdown extends Component {
651666
} else {
652667
this.setValue(value)
653668
this.handleChange(e, value)
654-
this.close()
655669
}
670+
this.closeOnChange(e)
656671
}
657672

658673
handleFocus = (e) => {

Diff for: test/specs/modules/Dropdown/Dropdown-test.js

+28
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,34 @@ describe('Dropdown Component', () => {
371371
})
372372
})
373373

374+
describe('closeOnChange', () => {
375+
it('will close when defined and dropdown is multiple', () => {
376+
wrapperMount(<Dropdown selection multiple search closeOnChange options={options} />)
377+
.simulate('click')
378+
379+
dropdownMenuIsOpen()
380+
381+
wrapper.find('DropdownItem')
382+
.first()
383+
.simulate('click', nativeEvent)
384+
385+
dropdownMenuIsClosed()
386+
})
387+
388+
it('will remain open when undefined and dropdown is multiple', () => {
389+
wrapperMount(<Dropdown selection multiple search options={options} />)
390+
.simulate('click')
391+
392+
dropdownMenuIsOpen()
393+
394+
wrapper.find('DropdownItem')
395+
.first()
396+
.simulate('click', nativeEvent)
397+
398+
dropdownMenuIsOpen()
399+
})
400+
})
401+
374402
describe('isMouseDown', () => {
375403
it('tracks when the mouse is down', () => {
376404
wrapperShallow(<Dropdown />)

0 commit comments

Comments
 (0)