UNPKG

@coreui/ajax

Version:

Open Source Bootstrap Admin Template

100 lines (82 loc) 3.07 kB
import React, {Component} from 'react'; import {NavLink} from 'react-router-dom'; import {Badge, Nav, NavItem} from 'reactstrap'; import classNames from 'classnames'; import nav from './_nav' class Sidebar extends Component { handleClick(e) { e.preventDefault(); e.target.parentElement.classList.toggle('open'); } activeRoute(routeName, props) { // return this.props.location.pathname.indexOf(routeName) > -1 ? 'nav-item nav-dropdown open' : 'nav-item nav-dropdown'; return props.location.pathname.indexOf(routeName) > -1 ? 'nav-item nav-dropdown open' : 'nav-item nav-dropdown'; } // todo Sidebar nav secondLevel // secondLevelActive(routeName) { // return this.props.location.pathname.indexOf(routeName) > -1 ? "nav nav-second-level collapse in" : "nav nav-second-level collapse"; // } render() { const props = this.props; const activeRoute = this.activeRoute; const handleClick = this.handleClick; // badge addon to NavItem const badge = (badge) => { if (badge) { const classes = classNames( badge.class ); return (<Badge className={ classes } color={ badge.variant }>{ badge.text }</Badge>) } }; // simple wrapper for nav-title item const wrapper = item => { return (!item.wrapper ? item.name : (React.createElement(item.wrapper.element, item.wrapper.attributes, item.name))) }; // nav list section title const title = (title, key) => { const classes = classNames( "nav-title", title.class); return (<li key={key} className={ classes }>{wrapper(title)} </li>); }; // nav list divider const divider = (divider, key) => (<li key={key} className="divider"></li>); // nav item with nav link const navItem = (item, key) => { const classes = classNames( "nav-link", item.class); return ( <NavItem key={key}> <NavLink to={item.url} className={ classes } activeClassName="active"> <i className={item.icon}></i>{item.name}{badge(item.badge)} </NavLink> </NavItem> ) }; // nav dropdown const navDropdown = (item, key) => { return ( <li key={key} className={activeRoute(item.url, props)}> <a className="nav-link nav-dropdown-toggle" href="#" onClick={handleClick.bind(this)}><i className={item.icon}></i> {item.name}</a> <ul className="nav-dropdown-items"> {navList(item.children)} </ul> </li>) }; // nav link const navLink = (item, idx) => item.title ? title(item, idx) : item.divider ? divider(item, idx) : item.children ? navDropdown(item, idx) : navItem(item, idx) ; // nav list const navList = (items) => { return items.map( (item, index) => navLink(item, index) ); }; // sidebar-nav root return ( <div className="sidebar"> <nav className="sidebar-nav"> <Nav> {navList(nav.items)} </Nav> </nav> </div> ) } } export default Sidebar;