UNPKG

4.67 kBJavaScriptView Raw
1import _Object$assign from 'babel-runtime/core-js/object/assign';
2import _Object$values from 'babel-runtime/core-js/object/values';
3import _extends from 'babel-runtime/helpers/extends';
4import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
5import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
6import _inherits from 'babel-runtime/helpers/inherits';
7import classNames from 'classnames';
8import PropTypes from 'prop-types';
9import React from 'react';
10import uncontrollable from 'uncontrollable';
11
12import { bsStyles, bsClass, getClassSet, splitBsPropsAndOmit } from './utils/bootstrapUtils';
13import { State, Style } from './utils/StyleConfig';
14import Body from './PanelBody';
15import Heading from './PanelHeading';
16import Title from './PanelTitle';
17import Footer from './PanelFooter';
18import Toggle from './PanelToggle';
19import Collapse from './PanelCollapse';
20
21var defaultGetId = function defaultGetId(id, type) {
22 return id ? id + '--' + type : null;
23};
24
25var propTypes = {
26 /**
27 * Controls the collapsed/expanded state ofthe Panel. Requires
28 * a `Panel.Collapse` or `<Panel.Body collapsible>` child component
29 * in order to actually animate out or in.
30 *
31 * @controllable onToggle
32 */
33 expanded: PropTypes.bool,
34 /**
35 * A callback fired when the collapse state changes.
36 *
37 * @controllable expanded
38 */
39 onToggle: PropTypes.func,
40 eventKey: PropTypes.any,
41
42 /**
43 * An HTML `id` attribute uniquely identifying the Panel component.
44 */
45 id: PropTypes.string
46};
47
48var contextTypes = {
49 $bs_panelGroup: PropTypes.shape({
50 getId: PropTypes.func,
51 activeKey: PropTypes.any,
52 onToggle: PropTypes.func
53 })
54};
55
56var childContextTypes = {
57 $bs_panel: PropTypes.shape({
58 headingId: PropTypes.string,
59 bodyId: PropTypes.string,
60 bsClass: PropTypes.string,
61 onToggle: PropTypes.func,
62 expanded: PropTypes.bool
63 })
64};
65
66var Panel = function (_React$Component) {
67 _inherits(Panel, _React$Component);
68
69 function Panel() {
70 _classCallCheck(this, Panel);
71
72 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
73 args[_key] = arguments[_key];
74 }
75
76 var _this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args)));
77
78 _this.handleToggle = _this.handleToggle.bind(_this);
79 return _this;
80 }
81
82 Panel.prototype.getChildContext = function getChildContext() {
83 var _props = this.props,
84 eventKey = _props.eventKey,
85 id = _props.id;
86
87 var _ref = this.context.$bs_panelGroup || {},
88 getId = _ref.getId;
89
90 var ids = void 0;
91 var idKey = eventKey == null ? id : eventKey;
92
93 if (idKey !== null) {
94 getId = getId || defaultGetId;
95 ids = {
96 headingId: getId(idKey, 'heading'),
97 bodyId: getId(idKey, 'body')
98 };
99 }
100
101 return {
102 $bs_panel: _extends({}, ids, {
103 bsClass: this.props.bsClass,
104 expanded: this.getExpanded(),
105 onToggle: this.handleToggle
106 })
107 };
108 };
109
110 Panel.prototype.getExpanded = function getExpanded() {
111 var eventKey = this.props.eventKey;
112
113 var _ref2 = this.context.$bs_panelGroup || {},
114 activeKey = _ref2.activeKey;
115
116 return this.props.expanded != null || activeKey === undefined ? this.props.expanded : activeKey === eventKey;
117 };
118
119 Panel.prototype.handleToggle = function handleToggle(e) {
120 var _ref3 = this.context.$bs_panelGroup || {},
121 onToggle = _ref3.onToggle;
122
123 var expanded = !this.getExpanded();
124
125 this.props.onToggle(expanded, e);
126 if (onToggle) {
127 onToggle(this.props.eventKey, expanded, e);
128 }
129 };
130
131 Panel.prototype.render = function render() {
132 var _props2 = this.props,
133 className = _props2.className,
134 children = _props2.children;
135
136 var _splitBsPropsAndOmit = splitBsPropsAndOmit(this.props, ['onToggle', 'eventKey', 'expanded']),
137 bsProps = _splitBsPropsAndOmit[0],
138 props = _splitBsPropsAndOmit[1];
139
140 return React.createElement(
141 'div',
142 _extends({}, props, { className: classNames(className, getClassSet(bsProps)) }),
143 children
144 );
145 };
146
147 return Panel;
148}(React.Component);
149
150Panel.propTypes = propTypes;
151
152Panel.contextTypes = contextTypes;
153Panel.childContextTypes = childContextTypes;
154
155var UncontrolledPanel = uncontrollable(bsClass('panel', bsStyles([].concat(_Object$values(State), [Style.DEFAULT, Style.PRIMARY]), Style.DEFAULT, Panel)), { expanded: 'onToggle' });
156
157_Object$assign(UncontrolledPanel, {
158 Heading: Heading,
159 Title: Title,
160 Body: Body,
161 Footer: Footer,
162 Toggle: Toggle,
163 Collapse: Collapse
164});
165
166export default UncontrolledPanel;
\No newline at end of file