Skip to content

Commit 3dd58e8

Browse files
committed
fix(SidebarNav): navigate to route on SidebarNav parent menu click - closes coreui#98
1 parent 569a93d commit 3dd58e8

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/SidebarNav.md

+23
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,29 @@ __React Router NavLink props to pass in `attributes` object:__
120120
]
121121
}
122122
```
123+
To override default behavior of `nav-dropdown toggle` and navigate to `url` use custom `onClick` method:
124+
```json5
125+
{
126+
name: 'Base',
127+
url: '/base',
128+
icon: 'icon-puzzle',
129+
attributes: {onClick: (e, item)=>{ console.log(e, item) }}, // (v2.5.6 up) optional
130+
children: []
131+
}
132+
```
133+
For active route consistency, you can set redirect on partial routes in `src/routes.js`:
134+
```js
135+
import { Redirect } from 'react-router-dom';
136+
...
137+
const routes = [
138+
...
139+
{ path: '/base', exact: true, name: 'Base', component: () => <Redirect to={'/base/cards'}/> },
140+
{ path: '/base/cards', name: 'Cards', component: Cards },
141+
{ path: '/base/forms', name: 'Forms', component: Forms },
142+
...
143+
]
144+
```
145+
123146
- divider:
124147
```json5
125148
{

src/SidebarNav2.js

+18-7
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,12 @@ class AppSidebarNav2 extends Component {
4949

5050
_scrollBarRef = null;
5151

52-
handleClick(e) {
53-
e.preventDefault();
52+
handleClick(e, item) {
53+
if (item.attributes && typeof item.attributes.onClick === 'function' && !this.isActiveRoute(item.url, this.props)) {
54+
item.attributes.onClick(e, item)
55+
} else {
56+
e.preventDefault();
57+
}
5458
e.currentTarget.parentElement.classList.toggle('open');
5559
}
5660

@@ -71,7 +75,7 @@ class AppSidebarNav2 extends Component {
7175
}
7276

7377
getAttribs(attributes) {
74-
return JSON.parse(JSON.stringify(attributes || {}));
78+
return {...attributes};
7579
}
7680

7781
// nav list
@@ -132,14 +136,21 @@ class AppSidebarNav2 extends Component {
132136
delete attributes.class;
133137
delete attributes.className;
134138
const itemAttr = this.getAttribs(item.itemAttr);
135-
const liClasses = classNames(this.activeRoute(item.url, this.props), itemAttr.class, itemAttr.className)
139+
const liClasses = classNames('nav-item', 'nav-dropdown', itemAttr.class, itemAttr.className);
136140
delete itemAttr.class;
137141
delete itemAttr.className;
142+
const NavLink = this.props.router.NavLink || RsNavLink;
143+
138144
return (
139-
<li key={key} className={liClasses} {...itemAttr}>
140-
<a className={classes} href="#" onClick={this.handleClick} {...attributes}><i className={classIcon}/>
145+
<li key={key} className={classNames(liClasses, {'open': this.isActiveRoute(item.url, this.props)})} {...itemAttr}>
146+
<NavLink activeClassName='open'
147+
className={classes}
148+
to={item.url || ''}
149+
{...attributes}
150+
onClick={(e) => this.handleClick(e, item)}>
151+
<i className={classIcon}/>
141152
{item.name}{this.navBadge(item.badge)}
142-
</a>
153+
</NavLink>
143154
<ul className="nav-dropdown-items">
144155
{this.navList(item.children)}
145156
</ul>

0 commit comments

Comments
 (0)