UNPKG

7.97 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
8
9var _react = require('react');
10
11var _react2 = _interopRequireDefault(_react);
12
13var _propTypes = require('prop-types');
14
15var _propTypes2 = _interopRequireDefault(_propTypes);
16
17var _bind = require('classnames/bind');
18
19var _bind2 = _interopRequireDefault(_bind);
20
21var _style = require('./style.scss');
22
23var _style2 = _interopRequireDefault(_style);
24
25var _themes = require('./Themes/themes.scss');
26
27var _themes2 = _interopRequireDefault(_themes);
28
29var _Overlay = require('./Overlay');
30
31var _Overlay2 = _interopRequireDefault(_Overlay);
32
33var _RenderToLayer = require('../internal/RenderToLayer');
34
35var _RenderToLayer2 = _interopRequireDefault(_RenderToLayer);
36
37var _Icon = require('../Icon');
38
39var _Icon2 = _interopRequireDefault(_Icon);
40
41function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
43function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
44
45function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
46
47function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
48
49/**
50 * The Modal component.
51 */
52var Modal = function (_React$Component) {
53 _inherits(Modal, _React$Component);
54
55 function Modal(props) {
56 _classCallCheck(this, Modal);
57
58 var _this = _possibleConstructorReturn(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).call(this, props));
59
60 _this.handleKeyUp = function (event) {
61 // When Esc is pressed
62 if (event.keyCode === 27) {
63 _this.requestClose(false);
64 }
65 };
66
67 _this.handleClick = function (event) {
68 event.persist();
69 if (typeof event.target.className === 'string' && event.target.className.indexOf('modal-scroll-container') !== -1) {
70 _this.handleCloseClick();
71 }
72 };
73
74 _this.handleCloseClick = function () {
75 _this.requestClose(false);
76 };
77
78 _this.requestClose = function (buttonClicked) {
79 if (!buttonClicked && _this.props.closeOnAction) {
80 return;
81 }
82
83 if (_this.props.onRequestClose) {
84 _this.props.onRequestClose(!!buttonClicked);
85 }
86 };
87
88 _this.setKeyupListener = function () {
89 if (_this.props.open) {
90 window.addEventListener('keyup', _this.handleKeyUp);
91 } else {
92 window.removeEventListener('keyup', _this.handleKeyUp);
93 }
94 };
95
96 _this.renderModal = function () {
97 var cx = _bind2.default.bind(_style2.default);
98 var theme = _themes2.default[_this.props.theme];
99 var modalOpenClass = _this.props.open ? _style2.default['modal-open'] : '';
100 var modalSizeClass = _this.props.size ? _style2.default['modal-' + _this.props.size] : '';
101 var modalClass = cx(_style2.default['modal-component'], _this.props.optClass, modalOpenClass, theme);
102 var modalContentClass = cx(_style2.default['modal-content'], modalSizeClass);
103 var modalTitleIsElement = !(typeof _this.props.title === 'string');
104 var modalTitle = modalTitleIsElement ? _this.props.title : _react2.default.createElement(
105 'h1',
106 null,
107 _this.props.title
108 );
109
110 var actionsContainer = _react2.default.Children.count(_this.props.actions) > 0 && _react2.default.createElement(
111 'div',
112 { className: _style2.default['modal-actions'] },
113 _react2.default.Children.toArray(_this.props.actions)
114 );
115
116 _this.setKeyupListener();
117
118 return _react2.default.createElement(
119 'div',
120 { className: modalClass },
121 _react2.default.createElement(
122 'div',
123 { className: _style2.default['modal-scroll-container'], onClick: _this.handleClick },
124 _react2.default.createElement(_Overlay2.default, {
125 show: _this.props.open,
126 onClick: _this.handleCloseClick
127 }),
128 _react2.default.createElement(
129 'div',
130 { className: modalContentClass },
131 _react2.default.createElement(
132 'div',
133 { className: _style2.default['modal-header'] },
134
135 // render close button if closeOnAction is false and modalTitle is not an element
136 !_this.props.closeOnAction && !modalTitleIsElement ? _react2.default.createElement(
137 'div',
138 { className: _style2.default['modal-close'] },
139 _react2.default.createElement(_Icon2.default, {
140 name: 'md-close',
141 width: '15',
142 height: '15',
143 onClick: _this.handleCloseClick
144 })
145 ) : null,
146 modalTitle
147 ),
148 _react2.default.createElement(
149 'div',
150 { className: _style2.default['modal-body'] },
151 _this.props.children
152 ),
153 _react2.default.createElement(
154 'div',
155 { className: _style2.default['modal-footer'] },
156 actionsContainer
157 )
158 )
159 )
160 );
161 };
162
163 return _this;
164 }
165
166 _createClass(Modal, [{
167 key: 'render',
168 value: function render() {
169 return (
170 // Render the modal inside a div at the bottom of the document body
171 _react2.default.createElement(_RenderToLayer2.default, { render: this.renderModal, open: true })
172 );
173 }
174 }]);
175
176 return Modal;
177}(_react2.default.Component);
178
179Modal.defaultProps = {
180 open: false,
181 closeOnAction: false
182};
183Modal.propTypes = {
184 /**
185 * Action buttons to display below the Modal content (`children`).
186 * This property accepts either a React element, or an array of React elements.
187 */
188 actions: _propTypes2.default.node,
189 /**
190 * Controls whether the Modal is opened or not.
191 */
192 open: _propTypes2.default.bool.isRequired,
193 /**
194 * When set to true it will force the user to use one of the actions in the `Modal`.
195 * Clicking outside the `Modal` will not trigger the `onRequestClose` in that case.
196 */
197 closeOnAction: _propTypes2.default.bool,
198 /**
199 * Fired when the `Modal` is requested to be closed by a click outside the `Modal` or on the buttons.
200 *
201 * @param {bool} buttonClicked Determines whether a button click triggered this request.
202 */
203 onRequestClose: _propTypes2.default.func,
204 /**
205 * The title to display on the `Modal`. Could be number, string, element or an array containing these types.
206 */
207 title: _propTypes2.default.node,
208 /**
209 * Optional styles to add to the modal.
210 */
211 optClass: _propTypes2.default.string,
212 /**
213 * The size of the modal.
214 */
215 size: _propTypes2.default.oneOf(['sm', 'md', 'lg']),
216 /**
217 * Optional theme to apply.
218 */
219 theme: _propTypes2.default.oneOf(['color-splash'])
220};
221exports.default = Modal;
\No newline at end of file