UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

86 lines (70 loc) 2.06 kB
var React = require('react'); var joinClasses = require('./utils/joinClasses'); var classSet = require('./utils/classSet'); var cloneWithProps = require('./utils/cloneWithProps'); var BootstrapMixin = require('./BootstrapMixin'); var ValidComponentChildren = require('./utils/ValidComponentChildren'); var PanelGroup = React.createClass({ mixins: [BootstrapMixin], propTypes: { collapsable: React.PropTypes.bool, activeKey: React.PropTypes.any, defaultActiveKey: React.PropTypes.any, onSelect: React.PropTypes.func }, getDefaultProps: function () { return { bsClass: 'panel-group' }; }, getInitialState: function () { var defaultActiveKey = this.props.defaultActiveKey; return { activeKey: defaultActiveKey }; }, render: function () { var classes = this.getBsClassSet(); return ( <div {...this.props} className={joinClasses(this.props.className, classSet(classes))} onSelect={null}> {ValidComponentChildren.map(this.props.children, this.renderPanel)} </div> ); }, renderPanel: function (child, index) { var activeKey = this.props.activeKey != null ? this.props.activeKey : this.state.activeKey; var props = { bsStyle: child.props.bsStyle || this.props.bsStyle, key: child.key ? child.key : index, ref: child.ref }; if (this.props.accordion) { props.collapsable = true; props.expanded = (child.props.eventKey === activeKey); props.onSelect = this.handleSelect; } return cloneWithProps( child, props ); }, shouldComponentUpdate: function() { // Defer any updates to this component during the `onSelect` handler. return !this._isChanging; }, handleSelect: function (key) { if (this.props.onSelect) { this._isChanging = true; this.props.onSelect(key); this._isChanging = false; } if (this.state.activeKey === key) { key = null; } this.setState({ activeKey: key }); } }); module.exports = PanelGroup;