From b4edeb8c417aaa7e8d6370e3fd242612c2eae73c Mon Sep 17 00:00:00 2001 From: Brady Pascoe <18705892+bpas247@users.noreply.github.com> Date: Fri, 12 Jul 2019 14:54:36 -0700 Subject: [PATCH] fix(Dropdown): disabled toggle (#1571) * fix: Dropdown disabled toggle issue This fix addresses the issue where Dropdown will be passed a `disabled` prop, yet it is still clickable. This is due to context being passed the user-defined `toggle` prop directly, rather than our defined `this.toggle` function that includes a check for `disabled`. Fixes #1542 * fix: incorrect test assertion In the previous implementation, Dropdown wasn't properly firing the toggle function within Dropdown, so the assertion was written down wrong to compensate for that. --- src/Dropdown.js | 3 ++- src/DropdownContext.js | 1 + src/DropdownToggle.js | 2 +- src/__tests__/Dropdown.spec.js | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Dropdown.js b/src/Dropdown.js index 112a7c650..8f35a915b 100644 --- a/src/Dropdown.js +++ b/src/Dropdown.js @@ -52,10 +52,11 @@ class Dropdown extends React.Component { getContextValue() { return { - toggle: this.props.toggle, + toggle: this.toggle, isOpen: this.props.isOpen, direction: (this.props.direction === 'down' && this.props.dropup) ? 'up' : this.props.direction, inNavbar: this.props.inNavbar, + disabled: this.props.disabled }; } diff --git a/src/DropdownContext.js b/src/DropdownContext.js index 80a021164..8426a24cd 100644 --- a/src/DropdownContext.js +++ b/src/DropdownContext.js @@ -7,6 +7,7 @@ import React from 'react'; * isOpen: PropTypes.bool.isRequired, * direction: PropTypes.oneOf(['up', 'down', 'left', 'right']).isRequired, * inNavbar: PropTypes.bool.isRequired, + * disabled: PropTypes.bool * } */ export const DropdownContext = React.createContext({}); \ No newline at end of file diff --git a/src/DropdownToggle.js b/src/DropdownToggle.js index a8cd30464..6fcb6eeee 100644 --- a/src/DropdownToggle.js +++ b/src/DropdownToggle.js @@ -33,7 +33,7 @@ class DropdownToggle extends React.Component { } onClick(e) { - if (this.props.disabled) { + if (this.props.disabled || this.context.disabled) { e.preventDefault(); return; } diff --git a/src/__tests__/Dropdown.spec.js b/src/__tests__/Dropdown.spec.js index 565c840ff..b34b02a98 100644 --- a/src/__tests__/Dropdown.spec.js +++ b/src/__tests__/Dropdown.spec.js @@ -735,7 +735,7 @@ describe('Dropdown', () => { wrapper.find('#first').hostNodes().simulate('keydown', { which: keyCodes.space }); - expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); expect(click.mock.calls.length).toBe(1); wrapper.detach(); @@ -761,7 +761,7 @@ describe('Dropdown', () => { wrapper.find('#first').hostNodes().simulate('keydown', { which: keyCodes.space }); - expect(Dropdown.prototype.toggle.mock.calls.length).toBe(0); + expect(Dropdown.prototype.toggle.mock.calls.length).toBe(1); expect(click.mock.calls.length).toBe(1); wrapper.detach();