Skip to content

Commit ba0b20e

Browse files
authored
fix(Dropdown): handle "onClick" on options (#4322)
1 parent 0b62dea commit ba0b20e

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

src/modules/Dropdown/Dropdown.js

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -975,15 +975,25 @@ export default class Dropdown extends Component {
975975
: (optValue) => optValue === value
976976

977977
return _.map(options, (opt, i) =>
978-
DropdownItem.create({
979-
active: isActive(opt.value),
980-
onClick: this.handleItemClick,
981-
selected: selectedIndex === i,
982-
...opt,
983-
key: getKeyOrValue(opt.key, opt.value),
984-
// Needed for handling click events on disabled items
985-
style: { ...opt.style, pointerEvents: 'all' },
986-
}),
978+
DropdownItem.create(
979+
{
980+
active: isActive(opt.value),
981+
selected: selectedIndex === i,
982+
...opt,
983+
key: getKeyOrValue(opt.key, opt.value),
984+
// Needed for handling click events on disabled items
985+
style: { ...opt.style, pointerEvents: 'all' },
986+
},
987+
{
988+
generateKey: false,
989+
overrideProps: (predefinedProps) => ({
990+
onClick: (e, item) => {
991+
predefinedProps.onClick?.(e, item)
992+
this.handleItemClick(e, item)
993+
},
994+
}),
995+
},
996+
),
987997
)
988998
}
989999

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,6 +2037,28 @@ describe('Dropdown', () => {
20372037
items.at(1).key().should.equal('bar')
20382038
items.at(2).key().should.equal('baz')
20392039
})
2040+
2041+
it('invokes "onClick" on item and handles', () => {
2042+
const onItemClick = sandbox.spy()
2043+
const customOptions = [
2044+
{ key: 'foo', text: 'foo', value: 'foo' },
2045+
{ key: 'bar', text: 'bar', value: 'bar', onClick: onItemClick },
2046+
]
2047+
2048+
wrapperMount(<Dropdown options={customOptions} />)
2049+
dropdownMenuIsClosed()
2050+
2051+
wrapper.simulate('click')
2052+
wrapper.simulate('focus')
2053+
dropdownMenuIsOpen()
2054+
2055+
wrapper.find('.item').at(1).simulate('click')
2056+
dropdownMenuIsClosed()
2057+
wrapper.find('.item').at(1).should.have.className('selected')
2058+
2059+
onItemClick.should.have.been.calledOnce()
2060+
onItemClick.should.have.been.calledWithMatch({ type: 'click' }, { value: 'bar' })
2061+
})
20402062
})
20412063

20422064
describe('search', () => {

0 commit comments

Comments
 (0)