react-bootstrap
Version:
Bootstrap 3 components build with React
147 lines (118 loc) • 4.4 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 _BootstrapMixin = require('./BootstrapMixin');
var _BootstrapMixin2 = _interopRequireDefault(_BootstrapMixin);
var _Collapse = require('./Collapse');
var _Collapse2 = _interopRequireDefault(_Collapse);
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 Nav = _react2['default'].createClass({
displayName: 'Nav',
mixins: [_BootstrapMixin2['default']],
propTypes: {
activeHref: _react2['default'].PropTypes.string,
activeKey: _react2['default'].PropTypes.any,
bsStyle: _react2['default'].PropTypes.oneOf(['tabs', 'pills']),
stacked: _react2['default'].PropTypes.bool,
justified: _react2['default'].PropTypes.bool,
onSelect: _react2['default'].PropTypes.func,
collapsible: _react2['default'].PropTypes.bool,
/**
* CSS classes for the wrapper `nav` element
*/
className: _react2['default'].PropTypes.string,
/**
* HTML id for the wrapper `nav` element
*/
id: _react2['default'].PropTypes.string,
/**
* CSS classes for the inner `ul` element
*/
ulClassName: _react2['default'].PropTypes.string,
/**
* HTML id for the inner `ul` element
*/
ulId: _react2['default'].PropTypes.string,
expanded: _react2['default'].PropTypes.bool,
navbar: _react2['default'].PropTypes.bool,
eventKey: _react2['default'].PropTypes.any,
pullRight: _react2['default'].PropTypes.bool,
right: _react2['default'].PropTypes.bool
},
getDefaultProps: function getDefaultProps() {
return {
bsClass: 'nav',
expanded: true
};
},
render: function render() {
var classes = this.props.collapsible ? 'navbar-collapse' : null;
if (this.props.navbar && !this.props.collapsible) {
return this.renderUl();
}
return _react2['default'].createElement(
_Collapse2['default'],
{ 'in': this.props.expanded },
_react2['default'].createElement(
'nav',
_extends({}, this.props, { className: _classnames2['default'](this.props.className, classes) }),
this.renderUl()
)
);
},
renderUl: function renderUl() {
var classes = this.getBsClassSet();
classes['nav-stacked'] = this.props.stacked;
classes['nav-justified'] = this.props.justified;
classes['navbar-nav'] = this.props.navbar;
classes['pull-right'] = this.props.pullRight;
classes['navbar-right'] = this.props.right;
return _react2['default'].createElement(
'ul',
_extends({}, this.props, {
role: this.props.bsStyle === 'tabs' ? 'tablist' : null,
className: _classnames2['default'](this.props.ulClassName, classes),
id: this.props.ulId,
ref: "ul"
}),
_utilsValidComponentChildren2['default'].map(this.props.children, this.renderNavItem)
);
},
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;
},
renderNavItem: function renderNavItem(child, index) {
return _react.cloneElement(child, {
role: this.props.bsStyle === 'tabs' ? 'tab' : null,
active: this.getChildActiveProp(child),
activeKey: this.props.activeKey,
activeHref: this.props.activeHref,
onSelect: _utilsCreateChainedFunction2['default'](child.props.onSelect, this.props.onSelect),
key: child.key ? child.key : index,
navItem: true
});
}
});
exports['default'] = Nav;
module.exports = exports['default'];