UNPKG

9.85 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports.default = void 0;
7
8var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
9
10var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
12var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
13
14var _classnames = _interopRequireDefault(require("classnames"));
15
16var _events = _interopRequireDefault(require("dom-helpers/events"));
17
18var _ownerDocument = _interopRequireDefault(require("dom-helpers/ownerDocument"));
19
20var _inDOM = _interopRequireDefault(require("dom-helpers/util/inDOM"));
21
22var _scrollbarSize = _interopRequireDefault(require("dom-helpers/util/scrollbarSize"));
23
24var _react = _interopRequireDefault(require("react"));
25
26var _Modal = _interopRequireDefault(require("react-overlays/Modal"));
27
28var _Fade = _interopRequireDefault(require("./Fade"));
29
30var _ModalBody = _interopRequireDefault(require("./ModalBody"));
31
32var _ModalDialog = _interopRequireDefault(require("./ModalDialog"));
33
34var _ModalFooter = _interopRequireDefault(require("./ModalFooter"));
35
36var _ModalHeader = _interopRequireDefault(require("./ModalHeader"));
37
38var _ModalTitle = _interopRequireDefault(require("./ModalTitle"));
39
40var _BootstrapModalManager = _interopRequireDefault(require("./utils/BootstrapModalManager"));
41
42var _ThemeProvider = require("./ThemeProvider");
43
44var _ModalContext = _interopRequireDefault(require("./ModalContext"));
45
46var defaultProps = {
47 show: false,
48 backdrop: true,
49 keyboard: true,
50 autoFocus: true,
51 enforceFocus: true,
52 restoreFocus: true,
53 animation: true,
54 dialogAs: _ModalDialog.default,
55 manager: new _BootstrapModalManager.default()
56};
57/* eslint-disable no-use-before-define, react/no-multi-comp */
58
59function DialogTransition(props) {
60 return _react.default.createElement(_Fade.default, props);
61}
62
63function BackdropTransition(props) {
64 return _react.default.createElement(_Fade.default, props);
65}
66/* eslint-enable no-use-before-define */
67
68
69var Modal =
70/*#__PURE__*/
71function (_React$Component) {
72 (0, _inheritsLoose2.default)(Modal, _React$Component);
73
74 function Modal() {
75 var _this;
76
77 for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {
78 _args[_key] = arguments[_key];
79 }
80
81 _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;
82 _this.state = {
83 style: {}
84 };
85 _this.modalContext = {
86 onHide: function onHide() {
87 return _this.props.onHide();
88 }
89 };
90
91 _this.setModalRef = function (ref) {
92 _this._modal = ref;
93 };
94
95 _this.handleDialogMouseDown = function () {
96 _this._waitingForMouseUp = true;
97 };
98
99 _this.handleMouseUp = function (e) {
100 if (_this._waitingForMouseUp && e.target === _this._modal.dialog) {
101 _this._ignoreBackdropClick = true;
102 }
103
104 _this._waitingForMouseUp = false;
105 };
106
107 _this.handleClick = function (e) {
108 if (_this._ignoreBackdropClick || e.target !== e.currentTarget) {
109 _this._ignoreBackdropClick = false;
110 return;
111 }
112
113 _this.props.onHide();
114 };
115
116 _this.handleEnter = function (node) {
117 var _this$props;
118
119 if (node) {
120 node.style.display = 'block';
121
122 _this.updateDialogStyle(node);
123 }
124
125 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
126 args[_key2 - 1] = arguments[_key2];
127 }
128
129 if (_this.props.onEnter) (_this$props = _this.props).onEnter.apply(_this$props, [node].concat(args));
130 };
131
132 _this.handleEntering = function (node) {
133 var _this$props2;
134
135 for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
136 args[_key3 - 1] = arguments[_key3];
137 }
138
139 if (_this.props.onEntering) (_this$props2 = _this.props).onEntering.apply(_this$props2, [node].concat(args)); // FIXME: This should work even when animation is disabled.
140
141 _events.default.on(window, 'resize', _this.handleWindowResize);
142 };
143
144 _this.handleExited = function (node) {
145 var _this$props3;
146
147 if (node) node.style.display = ''; // RHL removes it sometimes
148
149 for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
150 args[_key4 - 1] = arguments[_key4];
151 }
152
153 if (_this.props.onExited) (_this$props3 = _this.props).onExited.apply(_this$props3, args); // FIXME: This should work even when animation is disabled.
154
155 _events.default.off(window, 'resize', _this.handleWindowResize);
156 };
157
158 _this.handleWindowResize = function () {
159 _this.updateDialogStyle(_this._modal.dialog);
160 };
161
162 _this.renderBackdrop = function (props) {
163 var _this$props4 = _this.props,
164 bsPrefix = _this$props4.bsPrefix,
165 backdropClassName = _this$props4.backdropClassName,
166 animation = _this$props4.animation;
167 return _react.default.createElement("div", (0, _extends2.default)({}, props, {
168 className: (0, _classnames.default)(bsPrefix + "-backdrop", backdropClassName, !animation && 'show')
169 }));
170 };
171
172 return _this;
173 }
174
175 var _proto = Modal.prototype;
176
177 _proto.componentWillUnmount = function componentWillUnmount() {
178 // Clean up the listener if we need to.
179 _events.default.off(window, 'resize', this.handleWindowResize);
180 };
181
182 _proto.updateDialogStyle = function updateDialogStyle(node) {
183 if (!_inDOM.default) return;
184 var manager = this.props.manager;
185 var containerIsOverflowing = manager.isContainerOverflowing(this._modal);
186 var modalIsOverflowing = node.scrollHeight > (0, _ownerDocument.default)(node).documentElement.clientHeight;
187 this.setState({
188 style: {
189 paddingRight: containerIsOverflowing && !modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined,
190 paddingLeft: !containerIsOverflowing && modalIsOverflowing ? (0, _scrollbarSize.default)() : undefined
191 }
192 });
193 };
194
195 _proto.render = function render() {
196 var _this$props5 = this.props,
197 bsPrefix = _this$props5.bsPrefix,
198 className = _this$props5.className,
199 style = _this$props5.style,
200 dialogClassName = _this$props5.dialogClassName,
201 children = _this$props5.children,
202 Dialog = _this$props5.dialogAs,
203 show = _this$props5.show,
204 animation = _this$props5.animation,
205 backdrop = _this$props5.backdrop,
206 keyboard = _this$props5.keyboard,
207 manager = _this$props5.manager,
208 onEscapeKeyDown = _this$props5.onEscapeKeyDown,
209 onShow = _this$props5.onShow,
210 onHide = _this$props5.onHide,
211 container = _this$props5.container,
212 autoFocus = _this$props5.autoFocus,
213 enforceFocus = _this$props5.enforceFocus,
214 restoreFocus = _this$props5.restoreFocus,
215 onEntered = _this$props5.onEntered,
216 onExit = _this$props5.onExit,
217 onExiting = _this$props5.onExiting,
218 _ = _this$props5.onExited,
219 _1 = _this$props5.onEntering,
220 _6 = _this$props5.onEnter,
221 _4 = _this$props5.onEntering,
222 _2 = _this$props5.backdropClassName,
223 props = (0, _objectWithoutPropertiesLoose2.default)(_this$props5, ["bsPrefix", "className", "style", "dialogClassName", "children", "dialogAs", "show", "animation", "backdrop", "keyboard", "manager", "onEscapeKeyDown", "onShow", "onHide", "container", "autoFocus", "enforceFocus", "restoreFocus", "onEntered", "onExit", "onExiting", "onExited", "onEntering", "onEnter", "onEntering", "backdropClassName"]);
224 var clickHandler = backdrop === true ? this.handleClick : null;
225 var baseModalStyle = (0, _extends2.default)({}, style, {}, this.state.style); // Sets `display` always block when `animation` is false
226
227 if (!animation) baseModalStyle.display = 'block';
228 return _react.default.createElement(_ModalContext.default.Provider, {
229 value: this.modalContext
230 }, _react.default.createElement(_Modal.default, {
231 show: show,
232 backdrop: backdrop,
233 container: container,
234 keyboard: keyboard,
235 autoFocus: autoFocus,
236 enforceFocus: enforceFocus,
237 restoreFocus: restoreFocus,
238 onEscapeKeyDown: onEscapeKeyDown,
239 onShow: onShow,
240 onHide: onHide,
241 onEntered: onEntered,
242 onExit: onExit,
243 onExiting: onExiting,
244 manager: manager,
245 ref: this.setModalRef,
246 style: baseModalStyle,
247 className: (0, _classnames.default)(className, bsPrefix),
248 containerClassName: bsPrefix + "-open",
249 transition: animation ? DialogTransition : undefined,
250 backdropTransition: animation ? BackdropTransition : undefined,
251 renderBackdrop: this.renderBackdrop,
252 onClick: clickHandler,
253 onMouseUp: this.handleMouseUp,
254 onEnter: this.handleEnter,
255 onEntering: this.handleEntering,
256 onExited: this.handleExited
257 }, _react.default.createElement(Dialog, (0, _extends2.default)({}, props, {
258 onMouseDown: this.handleDialogMouseDown,
259 className: dialogClassName
260 }), children)));
261 };
262
263 return Modal;
264}(_react.default.Component);
265
266Modal.defaultProps = defaultProps;
267var DecoratedModal = (0, _ThemeProvider.createBootstrapComponent)(Modal, 'modal');
268DecoratedModal.Body = _ModalBody.default;
269DecoratedModal.Header = _ModalHeader.default;
270DecoratedModal.Title = _ModalTitle.default;
271DecoratedModal.Footer = _ModalFooter.default;
272DecoratedModal.Dialog = _ModalDialog.default;
273DecoratedModal.TRANSITION_DURATION = 300;
274DecoratedModal.BACKDROP_TRANSITION_DURATION = 150;
275var _default = DecoratedModal;
276exports.default = _default;
277module.exports = exports["default"];
\No newline at end of file