Skip to content

Commit

Permalink
feat(DropdownToggle): add nav prop to enable Nav specific functionali…
Browse files Browse the repository at this point in the history
…ty (#197)

* feat(DropdownToggle): add nav prop to enable nav functionality

* refactor(DropdownToggle): simplify tag
  • Loading branch information
eddywashere committed Oct 23, 2016
1 parent a450bb2 commit 9b28cbc
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 5 deletions.
3 changes: 2 additions & 1 deletion docs/lib/Components/DropdownsPage.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ DropdownToggle.propTypes = {
onClick: PropTypes.func,
'data-toggle': PropTypes.string,
'aria-haspopup': PropTypes.bool,
// For DropdownToggle usage inside a Nav
nav: PropTypes.bool,
// Defaults to Button component
tag: PropTypes.any
};`}
Expand Down
2 changes: 1 addition & 1 deletion docs/lib/examples/NavPills.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export default class Example extends React.Component {
<NavLink href="#" active>Link</NavLink>
</NavItem>
<NavDropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
<DropdownToggle tag={NavLink} href="#" onClick={(e) => e.preventDefault()} caret>
<DropdownToggle nav caret>
Dropdown
</DropdownToggle>
<DropdownMenu>
Expand Down
2 changes: 1 addition & 1 deletion docs/lib/examples/NavTabs.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export default class Example extends React.Component {
<NavLink href="#" active>Link</NavLink>
</NavItem>
<NavDropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
<DropdownToggle tag={NavLink} href="#" onClick={(e) => e.preventDefault()} caret>
<DropdownToggle nav caret>
Dropdown
</DropdownToggle>
<DropdownMenu>
Expand Down
15 changes: 13 additions & 2 deletions src/DropdownToggle.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ const propTypes = {
'data-toggle': PropTypes.string,
'aria-haspopup': PropTypes.bool,
split: PropTypes.bool,
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string])
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
nav: PropTypes.bool
};

const defaultProps = {
Expand Down Expand Up @@ -39,6 +40,10 @@ class DropdownToggle extends React.Component {
return;
}

if (this.props.nav) {
e.preventDefault();
}

if (this.props.onClick) {
this.props.onClick(e);
}
Expand All @@ -47,18 +52,24 @@ class DropdownToggle extends React.Component {
}

render() {
const { className, caret, split, tag: Tag, ...props } = this.props;
const { className, caret, split, nav, tag: Tag, ...props } = this.props;
const ariaLabel = props['aria-label'] || 'Toggle Dropdown';
const classes = classNames(
className,
{
'dropdown-toggle': caret || split,
'dropdown-toggle-split': split,
active: this.context.isOpen,
'nav-link': nav
}
);
const children = props.children || <span className="sr-only">{ariaLabel}</span>;

if (nav) {
props.tag = 'a';
props.href = '#';
}

return (
<Tag
{...props}
Expand Down
34 changes: 34 additions & 0 deletions src/__tests__/DropdownToggle.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,38 @@ describe('DropdownToggle', () => {
expect(e.preventDefault).toHaveBeenCalled();
});
});

describe('nav', () => {
it('should add .nav-link class', () => {
const wrapper = mount(
<DropdownToggle nav>Ello world</DropdownToggle>,
{
context: {
isOpen: isOpen,
toggle: toggle
}
}
);

expect(wrapper.find('a').length).toBe(1);
expect(wrapper.find('.nav-link').length).toBe(1);
});

it('should preventDefault', () => {
const e = { preventDefault: jasmine.createSpy('preventDefault') };
const wrapper = mount(
<DropdownToggle nav>Ello world</DropdownToggle>,
{
context: {
isOpen: isOpen,
toggle: toggle
}
}
);
const instance = wrapper.instance();

instance.onClick(e);
expect(e.preventDefault).toHaveBeenCalled();
});
});
});

0 comments on commit 9b28cbc

Please sign in to comment.