Skip to content

Commit 9b28cbc

Browse files
authored
feat(DropdownToggle): add nav prop to enable Nav specific functionality (#197)
* feat(DropdownToggle): add nav prop to enable nav functionality * refactor(DropdownToggle): simplify tag
1 parent a450bb2 commit 9b28cbc

5 files changed

Lines changed: 51 additions & 5 deletions

File tree

docs/lib/Components/DropdownsPage.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ DropdownToggle.propTypes = {
6969
onClick: PropTypes.func,
7070
'data-toggle': PropTypes.string,
7171
'aria-haspopup': PropTypes.bool,
72-
72+
// For DropdownToggle usage inside a Nav
73+
nav: PropTypes.bool,
7374
// Defaults to Button component
7475
tag: PropTypes.any
7576
};`}

docs/lib/examples/NavPills.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default class Example extends React.Component {
2525
<NavLink href="#" active>Link</NavLink>
2626
</NavItem>
2727
<NavDropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
28-
<DropdownToggle tag={NavLink} href="#" onClick={(e) => e.preventDefault()} caret>
28+
<DropdownToggle nav caret>
2929
Dropdown
3030
</DropdownToggle>
3131
<DropdownMenu>

docs/lib/examples/NavTabs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export default class Example extends React.Component {
2525
<NavLink href="#" active>Link</NavLink>
2626
</NavItem>
2727
<NavDropdown isOpen={this.state.dropdownOpen} toggle={this.toggle}>
28-
<DropdownToggle tag={NavLink} href="#" onClick={(e) => e.preventDefault()} caret>
28+
<DropdownToggle nav caret>
2929
Dropdown
3030
</DropdownToggle>
3131
<DropdownMenu>

src/DropdownToggle.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ const propTypes = {
1111
'data-toggle': PropTypes.string,
1212
'aria-haspopup': PropTypes.bool,
1313
split: PropTypes.bool,
14-
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string])
14+
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
15+
nav: PropTypes.bool
1516
};
1617

1718
const defaultProps = {
@@ -39,6 +40,10 @@ class DropdownToggle extends React.Component {
3940
return;
4041
}
4142

43+
if (this.props.nav) {
44+
e.preventDefault();
45+
}
46+
4247
if (this.props.onClick) {
4348
this.props.onClick(e);
4449
}
@@ -47,18 +52,24 @@ class DropdownToggle extends React.Component {
4752
}
4853

4954
render() {
50-
const { className, caret, split, tag: Tag, ...props } = this.props;
55+
const { className, caret, split, nav, tag: Tag, ...props } = this.props;
5156
const ariaLabel = props['aria-label'] || 'Toggle Dropdown';
5257
const classes = classNames(
5358
className,
5459
{
5560
'dropdown-toggle': caret || split,
5661
'dropdown-toggle-split': split,
5762
active: this.context.isOpen,
63+
'nav-link': nav
5864
}
5965
);
6066
const children = props.children || <span className="sr-only">{ariaLabel}</span>;
6167

68+
if (nav) {
69+
props.tag = 'a';
70+
props.href = '#';
71+
}
72+
6273
return (
6374
<Tag
6475
{...props}

src/__tests__/DropdownToggle.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,38 @@ describe('DropdownToggle', () => {
153153
expect(e.preventDefault).toHaveBeenCalled();
154154
});
155155
});
156+
157+
describe('nav', () => {
158+
it('should add .nav-link class', () => {
159+
const wrapper = mount(
160+
<DropdownToggle nav>Ello world</DropdownToggle>,
161+
{
162+
context: {
163+
isOpen: isOpen,
164+
toggle: toggle
165+
}
166+
}
167+
);
168+
169+
expect(wrapper.find('a').length).toBe(1);
170+
expect(wrapper.find('.nav-link').length).toBe(1);
171+
});
172+
173+
it('should preventDefault', () => {
174+
const e = { preventDefault: jasmine.createSpy('preventDefault') };
175+
const wrapper = mount(
176+
<DropdownToggle nav>Ello world</DropdownToggle>,
177+
{
178+
context: {
179+
isOpen: isOpen,
180+
toggle: toggle
181+
}
182+
}
183+
);
184+
const instance = wrapper.instance();
185+
186+
instance.onClick(e);
187+
expect(e.preventDefault).toHaveBeenCalled();
188+
});
189+
});
156190
});

0 commit comments

Comments
 (0)