UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

128 lines (107 loc) 3.61 kB
define(function (require, exports, module) {var React = require('react'); var joinClasses = require('./utils/joinClasses'); var classSet = require('./utils/classSet'); var cloneWithProps = require('./utils/cloneWithProps'); var createChainedFunction = require('./utils/createChainedFunction'); var BootstrapMixin = require('./BootstrapMixin'); var DropdownStateMixin = require('./DropdownStateMixin'); var Button = require('./Button'); var ButtonGroup = require('./ButtonGroup'); var DropdownMenu = require('./DropdownMenu'); var ValidComponentChildren = require('./utils/ValidComponentChildren'); var DropdownButton = React.createClass({displayName: "DropdownButton", mixins: [BootstrapMixin, DropdownStateMixin], propTypes: { pullRight: React.PropTypes.bool, dropup: React.PropTypes.bool, title: React.PropTypes.node, href: React.PropTypes.string, onClick: React.PropTypes.func, onSelect: React.PropTypes.func, navItem: React.PropTypes.bool, noCaret: React.PropTypes.bool }, render: function () { var renderMethod = this.props.navItem ? 'renderNavItem' : 'renderButtonGroup'; var caret = this.props.noCaret ? null : (React.createElement("span", {className: "caret"})); return this[renderMethod]([ React.createElement(Button, React.__spread({}, this.props, {ref: "dropdownButton", className: "dropdown-toggle", onClick: this.handleDropdownClick, key: 0, navDropdown: this.props.navItem, navItem: null, title: null, pullRight: null, dropup: null}), this.props.title, ' ', caret ), React.createElement(DropdownMenu, { ref: "menu", "aria-labelledby": this.props.id, pullRight: this.props.pullRight, key: 1}, ValidComponentChildren.map(this.props.children, this.renderMenuItem) ) ]); }, renderButtonGroup: function (children) { var groupClasses = { 'open': this.state.open, 'dropup': this.props.dropup }; return ( React.createElement(ButtonGroup, { bsSize: this.props.bsSize, className: joinClasses(this.props.className, classSet(groupClasses))}, children ) ); }, renderNavItem: function (children) { var classes = { 'dropdown': true, 'open': this.state.open, 'dropup': this.props.dropup }; return ( React.createElement("li", {className: joinClasses(this.props.className, classSet(classes))}, children ) ); }, renderMenuItem: function (child, index) { // Only handle the option selection if an onSelect prop has been set on the // component or it's child, this allows a user not to pass an onSelect // handler and have the browser preform the default action. var handleOptionSelect = this.props.onSelect || child.props.onSelect ? this.handleOptionSelect : null; return cloneWithProps( child, { // Capture onSelect events onSelect: createChainedFunction(child.props.onSelect, handleOptionSelect), // Force special props to be transferred key: child.key ? child.key : index, ref: child.ref } ); }, handleDropdownClick: function (e) { e.preventDefault(); this.setDropdownState(!this.state.open); }, handleOptionSelect: function (key) { if (this.props.onSelect) { this.props.onSelect(key); } this.setDropdownState(false); } }); module.exports = DropdownButton; });