UNPKG

9.94 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
10
11var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
12
13var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
14
15var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
16
17var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
18
19var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
20
21var _inherits2 = require('babel-runtime/helpers/inherits');
22
23var _inherits3 = _interopRequireDefault(_inherits2);
24
25var _classnames = require('classnames');
26
27var _classnames2 = _interopRequireDefault(_classnames);
28
29var _react = require('react');
30
31var _react2 = _interopRequireDefault(_react);
32
33var _propTypes = require('prop-types');
34
35var _propTypes2 = _interopRequireDefault(_propTypes);
36
37var _elementType = require('prop-types-extra/lib/elementType');
38
39var _elementType2 = _interopRequireDefault(_elementType);
40
41var _warning = require('warning');
42
43var _warning2 = _interopRequireDefault(_warning);
44
45var _bootstrapUtils = require('./utils/bootstrapUtils');
46
47var _createChainedFunction = require('./utils/createChainedFunction');
48
49var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
50
51var _Fade = require('./Fade');
52
53var _Fade2 = _interopRequireDefault(_Fade);
54
55function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
56
57var propTypes = {
58 /**
59 * Uniquely identify the `<TabPane>` among its siblings.
60 */
61 eventKey: _propTypes2.default.any,
62
63 /**
64 * Use animation when showing or hiding `<TabPane>`s. Use `false` to disable,
65 * `true` to enable the default `<Fade>` animation or
66 * a react-transition-group v2 `<Transition/>` component.
67 */
68 animation: _propTypes2.default.oneOfType([_propTypes2.default.bool, _elementType2.default]),
69
70 /** @private * */
71 id: _propTypes2.default.string,
72
73 /** @private * */
74 'aria-labelledby': _propTypes2.default.string,
75
76 /**
77 * If not explicitly specified and rendered in the context of a
78 * `<TabContent>`, the `bsClass` of the `<TabContent>` suffixed by `-pane`.
79 * If otherwise not explicitly specified, `tab-pane`.
80 */
81 bsClass: _propTypes2.default.string,
82
83 /**
84 * Transition onEnter callback when animation is not `false`
85 */
86 onEnter: _propTypes2.default.func,
87
88 /**
89 * Transition onEntering callback when animation is not `false`
90 */
91 onEntering: _propTypes2.default.func,
92
93 /**
94 * Transition onEntered callback when animation is not `false`
95 */
96 onEntered: _propTypes2.default.func,
97
98 /**
99 * Transition onExit callback when animation is not `false`
100 */
101 onExit: _propTypes2.default.func,
102
103 /**
104 * Transition onExiting callback when animation is not `false`
105 */
106 onExiting: _propTypes2.default.func,
107
108 /**
109 * Transition onExited callback when animation is not `false`
110 */
111 onExited: _propTypes2.default.func,
112
113 /**
114 * Wait until the first "enter" transition to mount the tab (add it to the DOM)
115 */
116 mountOnEnter: _propTypes2.default.bool,
117
118 /**
119 * Unmount the tab (remove it from the DOM) when it is no longer visible
120 */
121 unmountOnExit: _propTypes2.default.bool
122};
123
124var contextTypes = {
125 $bs_tabContainer: _propTypes2.default.shape({
126 getTabId: _propTypes2.default.func,
127 getPaneId: _propTypes2.default.func
128 }),
129 $bs_tabContent: _propTypes2.default.shape({
130 bsClass: _propTypes2.default.string,
131 animation: _propTypes2.default.oneOfType([_propTypes2.default.bool, _elementType2.default]),
132 activeKey: _propTypes2.default.any,
133 mountOnEnter: _propTypes2.default.bool,
134 unmountOnExit: _propTypes2.default.bool,
135 onPaneEnter: _propTypes2.default.func.isRequired,
136 onPaneExited: _propTypes2.default.func.isRequired,
137 exiting: _propTypes2.default.bool.isRequired
138 })
139};
140
141/**
142 * We override the `<TabContainer>` context so `<Nav>`s in `<TabPane>`s don't
143 * conflict with the top level one.
144 */
145var childContextTypes = {
146 $bs_tabContainer: _propTypes2.default.oneOf([null])
147};
148
149var TabPane = function (_React$Component) {
150 (0, _inherits3.default)(TabPane, _React$Component);
151
152 function TabPane(props, context) {
153 (0, _classCallCheck3.default)(this, TabPane);
154
155 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props, context));
156
157 _this.handleEnter = _this.handleEnter.bind(_this);
158 _this.handleExited = _this.handleExited.bind(_this);
159
160 _this.in = false;
161 return _this;
162 }
163
164 TabPane.prototype.getChildContext = function getChildContext() {
165 return {
166 $bs_tabContainer: null
167 };
168 };
169
170 TabPane.prototype.componentDidMount = function componentDidMount() {
171 if (this.shouldBeIn()) {
172 // In lieu of the action event firing.
173 this.handleEnter();
174 }
175 };
176
177 TabPane.prototype.componentDidUpdate = function componentDidUpdate() {
178 if (this.in) {
179 if (!this.shouldBeIn()) {
180 // We shouldn't be active any more. Notify the parent.
181 this.handleExited();
182 }
183 } else if (this.shouldBeIn()) {
184 // We are the active child. Notify the parent.
185 this.handleEnter();
186 }
187 };
188
189 TabPane.prototype.componentWillUnmount = function componentWillUnmount() {
190 if (this.in) {
191 // In lieu of the action event firing.
192 this.handleExited();
193 }
194 };
195
196 TabPane.prototype.getAnimation = function getAnimation() {
197 if (this.props.animation != null) {
198 return this.props.animation;
199 }
200
201 var tabContent = this.context.$bs_tabContent;
202 return tabContent && tabContent.animation;
203 };
204
205 TabPane.prototype.handleEnter = function handleEnter() {
206 var tabContent = this.context.$bs_tabContent;
207 if (!tabContent) {
208 return;
209 }
210
211 this.in = tabContent.onPaneEnter(this, this.props.eventKey);
212 };
213
214 TabPane.prototype.handleExited = function handleExited() {
215 var tabContent = this.context.$bs_tabContent;
216 if (!tabContent) {
217 return;
218 }
219
220 tabContent.onPaneExited(this);
221 this.in = false;
222 };
223
224 TabPane.prototype.isActive = function isActive() {
225 var tabContent = this.context.$bs_tabContent;
226 var activeKey = tabContent && tabContent.activeKey;
227
228 return this.props.eventKey === activeKey;
229 };
230
231 TabPane.prototype.shouldBeIn = function shouldBeIn() {
232 return this.getAnimation() && this.isActive();
233 };
234
235 TabPane.prototype.render = function render() {
236 var _props = this.props,
237 eventKey = _props.eventKey,
238 className = _props.className,
239 onEnter = _props.onEnter,
240 onEntering = _props.onEntering,
241 onEntered = _props.onEntered,
242 onExit = _props.onExit,
243 onExiting = _props.onExiting,
244 onExited = _props.onExited,
245 propsMountOnEnter = _props.mountOnEnter,
246 propsUnmountOnExit = _props.unmountOnExit,
247 props = (0, _objectWithoutProperties3.default)(_props, ['eventKey', 'className', 'onEnter', 'onEntering', 'onEntered', 'onExit', 'onExiting', 'onExited', 'mountOnEnter', 'unmountOnExit']);
248 var _context = this.context,
249 tabContent = _context.$bs_tabContent,
250 tabContainer = _context.$bs_tabContainer;
251
252 var _splitBsPropsAndOmit = (0, _bootstrapUtils.splitBsPropsAndOmit)(props, ['animation']),
253 bsProps = _splitBsPropsAndOmit[0],
254 elementProps = _splitBsPropsAndOmit[1];
255
256 var active = this.isActive();
257 var animation = this.getAnimation();
258
259 var mountOnEnter = propsMountOnEnter != null ? propsMountOnEnter : tabContent && tabContent.mountOnEnter;
260 var unmountOnExit = propsUnmountOnExit != null ? propsUnmountOnExit : tabContent && tabContent.unmountOnExit;
261
262 if (!active && !animation && unmountOnExit) {
263 return null;
264 }
265
266 var Transition = animation === true ? _Fade2.default : animation || null;
267
268 if (tabContent) {
269 bsProps.bsClass = (0, _bootstrapUtils.prefix)(tabContent, 'pane');
270 }
271
272 var classes = (0, _extends3.default)({}, (0, _bootstrapUtils.getClassSet)(bsProps), {
273 active: active
274 });
275
276 if (tabContainer) {
277 process.env.NODE_ENV !== 'production' ? (0, _warning2.default)(!elementProps.id && !elementProps['aria-labelledby'], 'In the context of a `<TabContainer>`, `<TabPanes>` are given ' + 'generated `id` and `aria-labelledby` attributes for the sake of ' + 'proper component accessibility. Any provided ones will be ignored. ' + 'To control these attributes directly provide a `generateChildId` ' + 'prop to the parent `<TabContainer>`.') : void 0;
278
279 elementProps.id = tabContainer.getPaneId(eventKey);
280 elementProps['aria-labelledby'] = tabContainer.getTabId(eventKey);
281 }
282
283 var pane = _react2.default.createElement('div', (0, _extends3.default)({}, elementProps, {
284 role: 'tabpanel',
285 'aria-hidden': !active,
286 className: (0, _classnames2.default)(className, classes)
287 }));
288
289 if (Transition) {
290 var exiting = tabContent && tabContent.exiting;
291
292 return _react2.default.createElement(
293 Transition,
294 {
295 'in': active && !exiting,
296 onEnter: (0, _createChainedFunction2.default)(this.handleEnter, onEnter),
297 onEntering: onEntering,
298 onEntered: onEntered,
299 onExit: onExit,
300 onExiting: onExiting,
301 onExited: (0, _createChainedFunction2.default)(this.handleExited, onExited),
302 mountOnEnter: mountOnEnter,
303 unmountOnExit: unmountOnExit
304 },
305 pane
306 );
307 }
308
309 return pane;
310 };
311
312 return TabPane;
313}(_react2.default.Component);
314
315TabPane.propTypes = propTypes;
316TabPane.contextTypes = contextTypes;
317TabPane.childContextTypes = childContextTypes;
318
319exports.default = (0, _bootstrapUtils.bsClass)('tab-pane', TabPane);
320module.exports = exports['default'];
\No newline at end of file