UNPKG

7.83 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
5var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard");
6
7exports.__esModule = true;
8exports.default = void 0;
9
10var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends"));
11
12var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutPropertiesLoose"));
13
14var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inheritsLoose"));
15
16var _parseInt2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-int"));
17
18var _classnames = _interopRequireDefault(require("classnames"));
19
20var _style = _interopRequireDefault(require("dom-helpers/style"));
21
22var _react = _interopRequireDefault(require("react"));
23
24var _propTypes = _interopRequireDefault(require("prop-types"));
25
26var _Transition = _interopRequireWildcard(require("react-transition-group/Transition"));
27
28var _capitalize = _interopRequireDefault(require("./utils/capitalize"));
29
30var _createChainedFunction = _interopRequireDefault(require("./utils/createChainedFunction"));
31
32var _collapseStyles;
33
34var MARGINS = {
35 height: ['marginTop', 'marginBottom'],
36 width: ['marginLeft', 'marginRight']
37}; // reading a dimension prop will cause the browser to recalculate,
38// which will let our animations work
39
40function triggerBrowserReflow(node) {
41 node.offsetHeight; // eslint-disable-line no-unused-expressions
42}
43
44function getDimensionValue(dimension, elem) {
45 var value = elem["offset" + (0, _capitalize.default)(dimension)];
46 var margins = MARGINS[dimension];
47 return value + (0, _parseInt2.default)((0, _style.default)(elem, margins[0]), 10) + (0, _parseInt2.default)((0, _style.default)(elem, margins[1]), 10);
48}
49
50var collapseStyles = (_collapseStyles = {}, _collapseStyles[_Transition.EXITED] = 'collapse', _collapseStyles[_Transition.EXITING] = 'collapsing', _collapseStyles[_Transition.ENTERING] = 'collapsing', _collapseStyles[_Transition.ENTERED] = 'collapse in', _collapseStyles);
51var propTypes = {
52 /**
53 * Show the component; triggers the expand or collapse animation
54 */
55 in: _propTypes.default.bool,
56
57 /**
58 * Wait until the first "enter" transition to mount the component (add it to the DOM)
59 */
60 mountOnEnter: _propTypes.default.bool,
61
62 /**
63 * Unmount the component (remove it from the DOM) when it is collapsed
64 */
65 unmountOnExit: _propTypes.default.bool,
66
67 /**
68 * Run the expand animation when the component mounts, if it is initially
69 * shown
70 */
71 appear: _propTypes.default.bool,
72
73 /**
74 * Duration of the collapse animation in milliseconds, to ensure that
75 * finishing callbacks are fired even if the original browser transition end
76 * events are canceled
77 */
78 timeout: _propTypes.default.number,
79
80 /**
81 * Callback fired before the component expands
82 */
83 onEnter: _propTypes.default.func,
84
85 /**
86 * Callback fired after the component starts to expand
87 */
88 onEntering: _propTypes.default.func,
89
90 /**
91 * Callback fired after the component has expanded
92 */
93 onEntered: _propTypes.default.func,
94
95 /**
96 * Callback fired before the component collapses
97 */
98 onExit: _propTypes.default.func,
99
100 /**
101 * Callback fired after the component starts to collapse
102 */
103 onExiting: _propTypes.default.func,
104
105 /**
106 * Callback fired after the component has collapsed
107 */
108 onExited: _propTypes.default.func,
109
110 /**
111 * The dimension used when collapsing, or a function that returns the
112 * dimension
113 *
114 * _Note: Bootstrap only partially supports 'width'!
115 * You will need to supply your own CSS animation for the `.width` CSS class._
116 */
117 dimension: _propTypes.default.oneOfType([_propTypes.default.oneOf(['height', 'width']), _propTypes.default.func]),
118
119 /**
120 * Function that returns the height or width of the animating DOM node
121 *
122 * Allows for providing some custom logic for how much the Collapse component
123 * should animate in its specified dimension. Called with the current
124 * dimension prop value and the DOM node.
125 */
126 getDimensionValue: _propTypes.default.func,
127
128 /**
129 * ARIA role of collapsible element
130 */
131 role: _propTypes.default.string
132};
133var defaultProps = {
134 in: false,
135 timeout: 300,
136 mountOnEnter: false,
137 unmountOnExit: false,
138 appear: false,
139 dimension: 'height',
140 getDimensionValue: getDimensionValue
141};
142
143var Collapse =
144/*#__PURE__*/
145function (_React$Component) {
146 (0, _inheritsLoose2.default)(Collapse, _React$Component);
147
148 function Collapse() {
149 var _this;
150
151 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
152 args[_key] = arguments[_key];
153 }
154
155 _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
156
157 _this.handleEnter = function (elem) {
158 elem.style[_this.getDimension()] = '0';
159 };
160
161 _this.handleEntering = function (elem) {
162 var dimension = _this.getDimension();
163
164 elem.style[dimension] = _this._getScrollDimensionValue(elem, dimension);
165 };
166
167 _this.handleEntered = function (elem) {
168 elem.style[_this.getDimension()] = null;
169 };
170
171 _this.handleExit = function (elem) {
172 var dimension = _this.getDimension();
173
174 elem.style[dimension] = _this.props.getDimensionValue(dimension, elem) + "px";
175 triggerBrowserReflow(elem);
176 };
177
178 _this.handleExiting = function (elem) {
179 elem.style[_this.getDimension()] = '0';
180 };
181
182 return _this;
183 }
184
185 var _proto = Collapse.prototype;
186
187 _proto.getDimension = function getDimension() {
188 return typeof this.props.dimension === 'function' ? this.props.dimension() : this.props.dimension;
189 }; // for testing
190
191
192 _proto._getScrollDimensionValue = function _getScrollDimensionValue(elem, dimension) {
193 return elem["scroll" + (0, _capitalize.default)(dimension)] + "px";
194 };
195 /* -- Expanding -- */
196
197
198 _proto.render = function render() {
199 var _this2 = this;
200
201 var _this$props = this.props,
202 onEnter = _this$props.onEnter,
203 onEntering = _this$props.onEntering,
204 onEntered = _this$props.onEntered,
205 onExit = _this$props.onExit,
206 onExiting = _this$props.onExiting,
207 className = _this$props.className,
208 children = _this$props.children,
209 props = (0, _objectWithoutPropertiesLoose2.default)(_this$props, ["onEnter", "onEntering", "onEntered", "onExit", "onExiting", "className", "children"]);
210 delete props.dimension;
211 delete props.getDimensionValue;
212 var handleEnter = (0, _createChainedFunction.default)(this.handleEnter, onEnter);
213 var handleEntering = (0, _createChainedFunction.default)(this.handleEntering, onEntering);
214 var handleEntered = (0, _createChainedFunction.default)(this.handleEntered, onEntered);
215 var handleExit = (0, _createChainedFunction.default)(this.handleExit, onExit);
216 var handleExiting = (0, _createChainedFunction.default)(this.handleExiting, onExiting);
217 return _react.default.createElement(_Transition.default, (0, _extends2.default)({}, props, {
218 "aria-expanded": props.role ? props.in : null,
219 onEnter: handleEnter,
220 onEntering: handleEntering,
221 onEntered: handleEntered,
222 onExit: handleExit,
223 onExiting: handleExiting
224 }), function (state, innerProps) {
225 return _react.default.cloneElement(children, (0, _extends2.default)({}, innerProps, {
226 className: (0, _classnames.default)(className, children.props.className, collapseStyles[state], _this2.getDimension() === 'width' && 'width')
227 }));
228 });
229 };
230
231 return Collapse;
232}(_react.default.Component);
233
234Collapse.propTypes = propTypes;
235Collapse.defaultProps = defaultProps;
236var _default = Collapse;
237exports.default = _default;
238module.exports = exports["default"];
\No newline at end of file