@coreui/react
Version:
CoreUI React Bootstrap 4 components
251 lines (197 loc) • 8.53 kB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import { Badge, Nav, NavItem, NavLink as RsNavLink } from 'reactstrap';
import classNames from 'classnames';
import PropTypes from 'prop-types';
import PerfectScrollbar from 'react-perfect-scrollbar';
import 'react-perfect-scrollbar/dist/css/styles.css';
var propTypes = {
children: PropTypes.node,
className: PropTypes.string,
navConfig: PropTypes.any,
navFunc: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
isOpen: PropTypes.bool,
staticContext: PropTypes.any,
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string])
};
var defaultProps = {
tag: 'nav',
navConfig: {
items: [{
name: 'Dashboard',
url: '/dashboard',
icon: 'icon-speedometer',
badge: { variant: 'info', text: 'NEW' }
}]
},
isOpen: false
};
var AppSidebarNav = function (_Component) {
_inherits(AppSidebarNav, _Component);
function AppSidebarNav(props) {
_classCallCheck(this, AppSidebarNav);
var _this = _possibleConstructorReturn(this, _Component.call(this, props));
_this.handleClick = _this.handleClick.bind(_this);
_this.activeRoute = _this.activeRoute.bind(_this);
_this.hideMobile = _this.hideMobile.bind(_this);
return _this;
}
AppSidebarNav.prototype.handleClick = function handleClick(e) {
e.preventDefault();
e.currentTarget.parentElement.classList.toggle('open');
};
AppSidebarNav.prototype.activeRoute = function activeRoute(routeName, props) {
return props.location.pathname.indexOf(routeName) > -1 ? 'nav-item nav-dropdown open' : 'nav-item nav-dropdown';
};
AppSidebarNav.prototype.hideMobile = function hideMobile() {
if (document.body.classList.contains('sidebar-show')) {
document.body.classList.toggle('sidebar-show');
}
};
// nav list
AppSidebarNav.prototype.navList = function navList(items) {
var _this2 = this;
return items.map(function (item, index) {
return _this2.navType(item, index);
});
};
// nav type
AppSidebarNav.prototype.navType = function navType(item, idx) {
return item.title ? this.navTitle(item, idx) : item.divider ? this.navDivider(item, idx) : item.label ? this.navLabel(item, idx) : item.children ? this.navDropdown(item, idx) : this.navItem(item, idx);
};
// nav list section title
AppSidebarNav.prototype.navTitle = function navTitle(title, key) {
var classes = classNames('nav-title', title.class);
return React.createElement(
'li',
{ key: key, className: classes },
this.navWrapper(title),
' '
);
};
// simple wrapper for nav-title item
AppSidebarNav.prototype.navWrapper = function navWrapper(item) {
return item.wrapper && item.wrapper.element ? React.createElement(item.wrapper.element, item.wrapper.attributes, item.name) : item.name;
};
// nav list divider
AppSidebarNav.prototype.navDivider = function navDivider(divider, key) {
var classes = classNames('divider', divider.class);
return React.createElement('li', { key: key, className: classes });
};
// nav label with nav link
AppSidebarNav.prototype.navLabel = function navLabel(item, key) {
var classes = {
item: classNames('hidden-cn', item.class),
link: classNames('nav-label', item.class ? item.class : ''),
icon: classNames('nav-icon', !item.icon ? 'fa fa-circle' : item.icon, item.label.variant ? 'text-' + item.label.variant : '', item.label.class ? item.label.class : '')
};
return this.navLink(item, key, classes);
};
// nav dropdown
AppSidebarNav.prototype.navDropdown = function navDropdown(item, key) {
var classIcon = classNames('nav-icon', item.icon);
return React.createElement(
'li',
{ key: key, className: this.activeRoute(item.url, this.props) },
React.createElement(
'a',
{ className: 'nav-link nav-dropdown-toggle', href: '#', onClick: this.handleClick },
React.createElement('i', { className: classIcon }),
item.name,
this.navBadge(item.badge)
),
React.createElement(
'ul',
{ className: 'nav-dropdown-items' },
this.navList(item.children)
)
);
};
// nav item with nav link
AppSidebarNav.prototype.navItem = function navItem(item, key) {
var classes = {
item: classNames(item.class),
link: classNames('nav-link', item.variant ? 'nav-link-' + item.variant : ''),
icon: classNames('nav-icon', item.icon)
};
return this.navLink(item, key, classes);
};
// nav link
AppSidebarNav.prototype.navLink = function navLink(item, key, classes) {
var url = item.url ? item.url : '';
var itemIcon = React.createElement('i', { className: classes.icon });
var itemBadge = this.navBadge(item.badge);
var attributes = item.attributes || {};
return React.createElement(
NavItem,
{ key: key, className: classes.item },
attributes.disabled ? React.createElement(
RsNavLink,
_extends({ href: "", className: classes.link }, attributes),
itemIcon,
item.name,
itemBadge
) : this.isExternal(url) ? React.createElement(
RsNavLink,
_extends({ href: url, className: classes.link, active: true }, attributes),
itemIcon,
item.name,
itemBadge
) : React.createElement(
NavLink,
_extends({ to: url, className: classes.link, activeClassName: 'active', onClick: this.hideMobile }, attributes),
itemIcon,
item.name,
itemBadge
)
);
};
// badge addon to NavItem
AppSidebarNav.prototype.navBadge = function navBadge(badge) {
if (badge) {
var classes = classNames(badge.class);
return React.createElement(
Badge,
{ className: classes, color: badge.variant },
badge.text
);
}
return null;
};
AppSidebarNav.prototype.isExternal = function isExternal(url) {
var link = url ? url.substring(0, 4) : '';
return link === 'http';
};
AppSidebarNav.prototype.render = function render() {
var _props = this.props,
className = _props.className,
children = _props.children,
navConfig = _props.navConfig,
attributes = _objectWithoutProperties(_props, ['className', 'children', 'navConfig']);
delete attributes.isOpen;
delete attributes.staticContext;
delete attributes.Tag;
var navClasses = classNames(className, 'sidebar-nav');
// ToDo: find better rtl fix
var isRtl = getComputedStyle(document.querySelector('html')).direction === 'rtl';
// sidebar-nav root
return React.createElement(
PerfectScrollbar,
_extends({ className: navClasses }, attributes, { option: { suppressScrollX: !isRtl } }),
React.createElement(
Nav,
null,
children || this.navList(navConfig.items)
)
);
};
return AppSidebarNav;
}(Component);
AppSidebarNav.propTypes = process.env.NODE_ENV !== "production" ? propTypes : {};
AppSidebarNav.defaultProps = defaultProps;
export default AppSidebarNav;