react-bootstrap
Version:
Bootstrap 3 components build with React
153 lines (118 loc) • 4.15 kB
JavaScript
'use strict';
var _extends = require('babel-runtime/helpers/extends')['default'];
var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default'];
exports.__esModule = true;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _utilsValidComponentChildren = require('./utils/ValidComponentChildren');
var _utilsValidComponentChildren2 = _interopRequireDefault(_utilsValidComponentChildren);
var _utilsCreateChainedFunction = require('./utils/createChainedFunction');
var _utilsCreateChainedFunction2 = _interopRequireDefault(_utilsCreateChainedFunction);
var _BootstrapMixin = require('./BootstrapMixin');
var _BootstrapMixin2 = _interopRequireDefault(_BootstrapMixin);
var _SafeAnchor = require('./SafeAnchor');
var _SafeAnchor2 = _interopRequireDefault(_SafeAnchor);
var SubNav = _react2['default'].createClass({
displayName: 'SubNav',
mixins: [_BootstrapMixin2['default']],
propTypes: {
onSelect: _react2['default'].PropTypes.func,
active: _react2['default'].PropTypes.bool,
activeHref: _react2['default'].PropTypes.string,
activeKey: _react2['default'].PropTypes.any,
disabled: _react2['default'].PropTypes.bool,
eventKey: _react2['default'].PropTypes.any,
href: _react2['default'].PropTypes.string,
title: _react2['default'].PropTypes.string,
text: _react2['default'].PropTypes.node,
target: _react2['default'].PropTypes.string
},
getDefaultProps: function getDefaultProps() {
return {
bsClass: 'nav'
};
},
handleClick: function handleClick(e) {
if (this.props.onSelect) {
e.preventDefault();
if (!this.props.disabled) {
this.props.onSelect(this.props.eventKey, this.props.href, this.props.target);
}
}
},
isActive: function isActive() {
return this.isChildActive(this);
},
isChildActive: function isChildActive(child) {
if (child.props.active) {
return true;
}
if (this.props.activeKey != null && this.props.activeKey === child.props.eventKey) {
return true;
}
if (this.props.activeHref != null && this.props.activeHref === child.props.href) {
return true;
}
if (child.props.children) {
var isActive = false;
_utilsValidComponentChildren2['default'].forEach(child.props.children, function (grandchild) {
if (this.isChildActive(grandchild)) {
isActive = true;
}
}, this);
return isActive;
}
return false;
},
getChildActiveProp: function getChildActiveProp(child) {
if (child.props.active) {
return true;
}
if (this.props.activeKey != null) {
if (child.props.eventKey === this.props.activeKey) {
return true;
}
}
if (this.props.activeHref != null) {
if (child.props.href === this.props.activeHref) {
return true;
}
}
return child.props.active;
},
render: function render() {
var classes = {
'active': this.isActive(),
'disabled': this.props.disabled
};
return _react2['default'].createElement(
'li',
_extends({}, this.props, { className: _classnames2['default'](this.props.className, classes) }),
_react2['default'].createElement(
_SafeAnchor2['default'],
{
href: this.props.href,
title: this.props.title,
target: this.props.target,
onClick: this.handleClick },
this.props.text
),
_react2['default'].createElement(
'ul',
{ className: "nav" },
_utilsValidComponentChildren2['default'].map(this.props.children, this.renderNavItem)
)
);
},
renderNavItem: function renderNavItem(child, index) {
return _react.cloneElement(child, {
active: this.getChildActiveProp(child),
onSelect: _utilsCreateChainedFunction2['default'](child.props.onSelect, this.props.onSelect),
key: child.key ? child.key : index
});
}
});
exports['default'] = SubNav;
module.exports = exports['default'];