UNPKG

10.9 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports.default = void 0;
7
8var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutPropertiesLoose"));
9
10var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inheritsLoose"));
11
12var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
13
14var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends"));
15
16var _classnames = _interopRequireDefault(require("classnames"));
17
18var _events = _interopRequireDefault(require("dom-helpers/events"));
19
20var _ownerDocument = _interopRequireDefault(require("dom-helpers/ownerDocument"));
21
22var _inDOM = _interopRequireDefault(require("dom-helpers/util/inDOM"));
23
24var _scrollbarSize = _interopRequireDefault(require("dom-helpers/util/scrollbarSize"));
25
26var _react = _interopRequireDefault(require("react"));
27
28var _propTypes = _interopRequireDefault(require("prop-types"));
29
30var _reactDom = _interopRequireDefault(require("react-dom"));
31
32var _Modal = _interopRequireDefault(require("react-overlays/lib/Modal"));
33
34var _isOverflowing = _interopRequireDefault(require("react-overlays/lib/utils/isOverflowing"));
35
36var _elementType = _interopRequireDefault(require("prop-types-extra/lib/elementType"));
37
38var _Fade = _interopRequireDefault(require("./Fade"));
39
40var _ModalBody = _interopRequireDefault(require("./ModalBody"));
41
42var _ModalDialog = _interopRequireDefault(require("./ModalDialog"));
43
44var _ModalFooter = _interopRequireDefault(require("./ModalFooter"));
45
46var _ModalHeader = _interopRequireDefault(require("./ModalHeader"));
47
48var _ModalTitle = _interopRequireDefault(require("./ModalTitle"));
49
50var _bootstrapUtils = require("./utils/bootstrapUtils");
51
52var _createChainedFunction = _interopRequireDefault(require("./utils/createChainedFunction"));
53
54var _splitComponentProps2 = _interopRequireDefault(require("./utils/splitComponentProps"));
55
56var _StyleConfig = require("./utils/StyleConfig");
57
58var propTypes = (0, _extends2.default)({}, _Modal.default.propTypes, _ModalDialog.default.propTypes, {
59 /**
60 * Include a backdrop component. Specify 'static' for a backdrop that doesn't
61 * trigger an "onHide" when clicked.
62 */
63 backdrop: _propTypes.default.oneOf(['static', true, false]),
64
65 /**
66 * Add an optional extra class name to .modal-backdrop
67 * It could end up looking like class="modal-backdrop foo-modal-backdrop in".
68 */
69 backdropClassName: _propTypes.default.string,
70
71 /**
72 * Close the modal when escape key is pressed
73 */
74 keyboard: _propTypes.default.bool,
75
76 /**
77 * Open and close the Modal with a slide and fade animation.
78 */
79 animation: _propTypes.default.bool,
80
81 /**
82 * A Component type that provides the modal content Markup. This is a useful
83 * prop when you want to use your own styles and markup to create a custom
84 * modal component.
85 */
86 dialogComponentClass: _elementType.default,
87
88 /**
89 * When `true` The modal will automatically shift focus to itself when it
90 * opens, and replace it to the last focused element when it closes.
91 * Generally this should never be set to false as it makes the Modal less
92 * accessible to assistive technologies, like screen-readers.
93 */
94 autoFocus: _propTypes.default.bool,
95
96 /**
97 * When `true` The modal will prevent focus from leaving the Modal while
98 * open. Consider leaving the default value here, as it is necessary to make
99 * the Modal work well with assistive technologies, such as screen readers.
100 */
101 enforceFocus: _propTypes.default.bool,
102
103 /**
104 * When `true` The modal will restore focus to previously focused element once
105 * modal is hidden
106 */
107 restoreFocus: _propTypes.default.bool,
108
109 /**
110 * When `true` The modal will show itself.
111 */
112 show: _propTypes.default.bool,
113
114 /**
115 * A callback fired when the header closeButton or non-static backdrop is
116 * clicked. Required if either are specified.
117 */
118 onHide: _propTypes.default.func,
119
120 /**
121 * Callback fired before the Modal transitions in
122 */
123 onEnter: _propTypes.default.func,
124
125 /**
126 * Callback fired as the Modal begins to transition in
127 */
128 onEntering: _propTypes.default.func,
129
130 /**
131 * Callback fired after the Modal finishes transitioning in
132 */
133 onEntered: _propTypes.default.func,
134
135 /**
136 * Callback fired right before the Modal transitions out
137 */
138 onExit: _propTypes.default.func,
139
140 /**
141 * Callback fired as the Modal begins to transition out
142 */
143 onExiting: _propTypes.default.func,
144
145 /**
146 * Callback fired after the Modal finishes transitioning out
147 */
148 onExited: _propTypes.default.func,
149
150 /**
151 * @private
152 */
153 container: _Modal.default.propTypes.container
154});
155var defaultProps = (0, _extends2.default)({}, _Modal.default.defaultProps, {
156 animation: true,
157 dialogComponentClass: _ModalDialog.default
158});
159var childContextTypes = {
160 $bs_modal: _propTypes.default.shape({
161 onHide: _propTypes.default.func
162 })
163};
164/* eslint-disable no-use-before-define, react/no-multi-comp */
165
166function DialogTransition(props) {
167 return _react.default.createElement(_Fade.default, (0, _extends2.default)({}, props, {
168 timeout: Modal.TRANSITION_DURATION
169 }));
170}
171
172function BackdropTransition(props) {
173 return _react.default.createElement(_Fade.default, (0, _extends2.default)({}, props, {
174 timeout: Modal.BACKDROP_TRANSITION_DURATION
175 }));
176}
177/* eslint-enable no-use-before-define */
178
179
180var Modal =
181/*#__PURE__*/
182function (_React$Component) {
183 (0, _inheritsLoose2.default)(Modal, _React$Component);
184
185 function Modal(props, context) {
186 var _this;
187
188 _this = _React$Component.call(this, props, context) || this;
189 _this.handleEntering = _this.handleEntering.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
190 _this.handleExited = _this.handleExited.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
191 _this.handleWindowResize = _this.handleWindowResize.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
192 _this.handleDialogClick = _this.handleDialogClick.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
193 _this.setModalRef = _this.setModalRef.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
194 _this.state = {
195 style: {}
196 };
197 return _this;
198 }
199
200 var _proto = Modal.prototype;
201
202 _proto.getChildContext = function getChildContext() {
203 return {
204 $bs_modal: {
205 onHide: this.props.onHide
206 }
207 };
208 };
209
210 _proto.componentWillUnmount = function componentWillUnmount() {
211 // Clean up the listener if we need to.
212 this.handleExited();
213 };
214
215 _proto.setModalRef = function setModalRef(ref) {
216 this._modal = ref;
217 };
218
219 _proto.handleDialogClick = function handleDialogClick(e) {
220 if (e.target !== e.currentTarget) {
221 return;
222 }
223
224 this.props.onHide();
225 };
226
227 _proto.handleEntering = function handleEntering() {
228 // FIXME: This should work even when animation is disabled.
229 _events.default.on(window, 'resize', this.handleWindowResize);
230
231 this.updateStyle();
232 };
233
234 _proto.handleExited = function handleExited() {
235 // FIXME: This should work even when animation is disabled.
236 _events.default.off(window, 'resize', this.handleWindowResize);
237 };
238
239 _proto.handleWindowResize = function handleWindowResize() {
240 this.updateStyle();
241 };
242
243 _proto.updateStyle = function updateStyle() {
244 if (!_inDOM.default) {
245 return;
246 }
247
248 var dialogNode = this._modal.getDialogElement();
249
250 var dialogHeight = dialogNode.scrollHeight;
251 var document = (0, _ownerDocument.default)(dialogNode);
252 var bodyIsOverflowing = (0, _isOverflowing.default)(_reactDom.default.findDOMNode(this.props.container || document.body));
253 var modalIsOverflowing = dialogHeight > document.documentElement.clientHeight;
254 this.setState({
255 style: {
256 paddingRight: bodyIsOverflowing && !modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined,
257 paddingLeft: !bodyIsOverflowing && modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined
258 }
259 });
260 };
261
262 _proto.render = function render() {
263 var _this$props = this.props,
264 backdrop = _this$props.backdrop,
265 backdropClassName = _this$props.backdropClassName,
266 animation = _this$props.animation,
267 show = _this$props.show,
268 Dialog = _this$props.dialogComponentClass,
269 className = _this$props.className,
270 style = _this$props.style,
271 children = _this$props.children,
272 onEntering = _this$props.onEntering,
273 onExited = _this$props.onExited,
274 props = (0, _objectWithoutPropertiesLoose2.default)(_this$props, ["backdrop", "backdropClassName", "animation", "show", "dialogComponentClass", "className", "style", "children", "onEntering", "onExited"]);
275
276 var _splitComponentProps = (0, _splitComponentProps2.default)(props, _Modal.default),
277 baseModalProps = _splitComponentProps[0],
278 dialogProps = _splitComponentProps[1];
279
280 var inClassName = show && !animation && 'in';
281 return _react.default.createElement(_Modal.default, (0, _extends2.default)({}, baseModalProps, {
282 ref: this.setModalRef,
283 show: show,
284 containerClassName: (0, _bootstrapUtils.prefix)(props, 'open'),
285 transition: animation ? DialogTransition : undefined,
286 backdrop: backdrop,
287 backdropTransition: animation ? BackdropTransition : undefined,
288 backdropClassName: (0, _classnames.default)((0, _bootstrapUtils.prefix)(props, 'backdrop'), backdropClassName, inClassName),
289 onEntering: (0, _createChainedFunction.default)(onEntering, this.handleEntering),
290 onExited: (0, _createChainedFunction.default)(onExited, this.handleExited)
291 }), _react.default.createElement(Dialog, (0, _extends2.default)({}, dialogProps, {
292 style: (0, _extends2.default)({}, this.state.style, style),
293 className: (0, _classnames.default)(className, inClassName),
294 onClick: backdrop === true ? this.handleDialogClick : null
295 }), children));
296 };
297
298 return Modal;
299}(_react.default.Component);
300
301Modal.propTypes = propTypes;
302Modal.defaultProps = defaultProps;
303Modal.childContextTypes = childContextTypes;
304Modal.Body = _ModalBody.default;
305Modal.Header = _ModalHeader.default;
306Modal.Title = _ModalTitle.default;
307Modal.Footer = _ModalFooter.default;
308Modal.Dialog = _ModalDialog.default;
309Modal.TRANSITION_DURATION = 300;
310Modal.BACKDROP_TRANSITION_DURATION = 150;
311
312var _default = (0, _bootstrapUtils.bsClass)('modal', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL], Modal));
313
314exports.default = _default;
315module.exports = exports["default"];
\No newline at end of file