UNPKG

@atis/react-bootstrap-modal

Version:

React Bootstrap Modal ===================================

384 lines (288 loc) 12.3 kB
'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _Modal = require('react-overlays/lib/Modal'); var _Modal2 = _interopRequireDefault(_Modal); var _isOverflowing = require('react-overlays/lib/utils/isOverflowing'); var _isOverflowing2 = _interopRequireDefault(_isOverflowing); var _componentOrElement = require('react-prop-types/lib/componentOrElement'); var _componentOrElement2 = _interopRequireDefault(_componentOrElement); var _Fade = require('./Fade'); var _Fade2 = _interopRequireDefault(_Fade); var _Body = require('./Body'); var _Body2 = _interopRequireDefault(_Body); var _Header = require('./Header'); var _Header2 = _interopRequireDefault(_Header); var _Title = require('./Title'); var _Title2 = _interopRequireDefault(_Title); var _Footer = require('./Footer'); var _Footer2 = _interopRequireDefault(_Footer); var _Dismiss = require('./Dismiss'); var _Dismiss2 = _interopRequireDefault(_Dismiss); var _ownerDocument = require('dom-helpers/ownerDocument'); var _ownerDocument2 = _interopRequireDefault(_ownerDocument); var _inDOM = require('dom-helpers/util/inDOM'); var _inDOM2 = _interopRequireDefault(_inDOM); var _scrollbarSize = require('dom-helpers/util/scrollbarSize'); var _scrollbarSize2 = _interopRequireDefault(_scrollbarSize); var _style = require('dom-helpers/style'); var _style2 = _interopRequireDefault(_style); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _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; } function _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; } var baseIndex = {}; var PREFIX = 'modal'; var getZIndex = void 0; var modalManager = _Modal2.default.getDefaultProps().manager; var omit = function omit(obj, keys) { return Object.keys(obj).reduce(function (o, key) { if (keys.indexOf(key) === -1) o[key] = obj[key]; return o; }, {}); }; var Modal = function (_React$Component) { _inherits(Modal, _React$Component); Modal.getDefaultPrefix = function getDefaultPrefix() { return PREFIX; }; Modal.prototype.getChildContext = function getChildContext() { return this._context || (this._context = { onModalHide: this.props.onHide }); }; function Modal() { _classCallCheck(this, Modal); var _this = _possibleConstructorReturn(this, _React$Component.call(this)); _this.handleEntering = _this.handleEntering.bind(_this); _this.handleExiting = _this.handleExiting.bind(_this); _this.state = { classes: '' }; return _this; } Modal.prototype.componentDidMount = function componentDidMount() { getZIndex = getZIndex || function () { var modal = document.createElement('div'), backdrop = document.createElement('div'), zIndexFactor = void 0; modal.className = 'modal hide'; backdrop.className = 'modal-backdrop hide'; document.body.appendChild(modal); document.body.appendChild(backdrop); baseIndex.modal = +(0, _style2.default)(modal, 'z-index'); baseIndex.backdrop = +(0, _style2.default)(backdrop, 'z-index'); zIndexFactor = baseIndex.modal - baseIndex.backdrop; document.body.removeChild(modal); document.body.removeChild(backdrop); return function (type) { return baseIndex[type] + zIndexFactor * (modalManager.modals.length - 1); }; }(); }; Modal.prototype.handleEntering = function handleEntering() { this._show.apply(this, arguments); if (this.props.onEntering) { this.props.onEntering(); } }; Modal.prototype.handleExiting = function handleExiting() { this._removeAttentionClasses(); if (this.props.onExiting) { this.props.onExiting(); } }; Modal.prototype._removeUnknownDivProps = function _removeUnknownDivProps(props) { var show = props.show; var animate = props.animate; var container = props.container; var attentionAnimation = props.attentionAnimation; var backdrop = props.backdrop; var small = props.small; var sm = props.sm; var large = props.large; var lg = props.lg; var onHide = props.onHide; var attrs = _objectWithoutProperties(props, ['show', 'animate', 'container', 'attentionAnimation', 'backdrop', 'small', 'sm', 'large', 'lg', 'onHide']); return attrs; }; Modal.prototype.render = function render() { var _this2 = this; var _props = this.props; var className = _props.className; var children = _props.children; var keyboard = _props.keyboard; var transition = _props.transition; var modalPrefix = _props.modalPrefix; var dialogClassName = _props.dialogClassName; var container = _props.container; var onEnter = _props.onEnter; var onEntered = _props.onEntered; var onExit = _props.onExit; var onExited = _props.onExited; var props = _objectWithoutProperties(_props, ['className', 'children', 'keyboard', 'transition', 'modalPrefix', 'dialogClassName', 'container', 'onEnter', 'onEntered', 'onExit', 'onExited']); var _state = this.state; var dialog = _state.dialog; var classes = _state.classes; var backdrop = _state.backdrop; var elementProps = omit(props, Object.keys(Modal.propTypes)); var prefix = modalPrefix || Modal.getDefaultPrefix(); var modalAttrs = this._removeUnknownDivProps(props); if (transition === true) transition = _Fade2.default; var modal = _react2.default.createElement( 'div', _extends({}, modalAttrs, { ref: function ref(r) { return _this2.dialog = r; }, style: dialog, className: (0, _classnames2.default)(className, prefix, { in: props.show && !transition }), onClick: this.props.backdrop ? function (e) { return _this2.handleBackdropClick(e); } : null }), _react2.default.createElement( 'div', { key: 'modal', ref: 'inner', className: (0, _classnames2.default)(prefix + '-dialog', dialogClassName, classes, (props.small || props.sm) && prefix + '-sm', (props.large || props.lg) && prefix + '-lg') }, _react2.default.createElement( 'div', { className: prefix + '-content' }, children ) ) ); return _react2.default.createElement( _Modal2.default, { keyboard: keyboard, ref: function ref(_ref) { _this2.modal = _ref && _ref.refs.modal; _this2.backdrop = _ref && _ref.refs.backdrop; }, container: container, backdrop: props.backdrop, show: props.show, onHide: this.props.onHide, onEnter: onEnter, onEntering: this.handleEntering, onEntered: onEntered, onExit: onExit, onExiting: this.handleExiting, onExited: onExited, backdropStyle: backdrop, backdropClassName: prefix + '-backdrop', containerClassName: prefix + '-open', transition: transition, dialogTransitionTimeout: Modal.TRANSITION_DURATION, backdropTransitionTimeout: Modal.BACKDROP_TRANSITION_DURATION }, modal ); }; Modal.prototype.attention = function attention() { var _this3 = this; var attentionClass = this.props.attentionClass; if (attentionClass) this.setState({ classes: '' }, function () { if (_this3.props.show) { // eslint-disable-next-line no-unused-expressions _this3.refs.inner.offsetWidth; _this3.setState({ classes: attentionClass + ' animated' }); } }); }; Modal.prototype.handleBackdropClick = function handleBackdropClick(e) { if (e.target !== e.currentTarget) return; if (this.props.backdrop === 'static') return this.attention(); this.props.onHide(); }; Modal.prototype._show = function _show() { if (this.props.show) this.setState(this._getStyles()); }; Modal.prototype._getStyles = function _getStyles() { if (!_inDOM2.default) return {}; var node = (0, _reactDom.findDOMNode)(this.dialog), doc = (0, _ownerDocument2.default)(node), scrollHt = node.scrollHeight, bodyIsOverflowing = (0, _isOverflowing2.default)(this.props.container || doc.body), modalIsOverflowing = scrollHt > doc.documentElement.clientHeight; return { dialog: { zIndex: getZIndex('modal'), paddingRight: bodyIsOverflowing && !modalIsOverflowing ? (0, _scrollbarSize2.default)() : void 0, paddingLeft: !bodyIsOverflowing && modalIsOverflowing ? (0, _scrollbarSize2.default)() : void 0 }, backdrop: { zIndex: getZIndex('backdrop') } }; }; Modal.prototype._removeAttentionClasses = function _removeAttentionClasses() { this.setState({ classes: '' }); }; return Modal; }(_react2.default.Component); Modal.propTypes = { show: _react2.default.PropTypes.bool, /** sizes **/ small: _react2.default.PropTypes.bool, sm: _react2.default.PropTypes.bool, large: _react2.default.PropTypes.bool, lg: _react2.default.PropTypes.bool, /** --- **/ backdrop: _react2.default.PropTypes.oneOf(['static', true, false]), keyboard: _react2.default.PropTypes.bool, animate: _react2.default.PropTypes.bool, transition: _react2.default.PropTypes.any, container: _react2.default.PropTypes.oneOfType([_componentOrElement2.default, _react2.default.PropTypes.func]), onHide: _react2.default.PropTypes.func, onEnter: _react2.default.PropTypes.func, onEntering: _react2.default.PropTypes.func, onEntered: _react2.default.PropTypes.func, onExit: _react2.default.PropTypes.func, onExiting: _react2.default.PropTypes.func, onExited: _react2.default.PropTypes.func, modalPrefix: _react2.default.PropTypes.string, dialogClassName: _react2.default.PropTypes.string, attentionClass: _react2.default.PropTypes.string }; Modal.defaultProps = { backdrop: true, keyboard: true, animate: true, transition: true, container: _inDOM2.default ? document.body : null, attentionClass: 'shake' }; Modal.childContextTypes = { onModalHide: _react2.default.PropTypes.func }; Modal.injectCSSPrefix = function (prefix) { PREFIX = prefix; }; function getDefaultPrefix() { return PREFIX; } _Body2.default.getDefaultPrefix = getDefaultPrefix; _Header2.default.getDefaultPrefix = getDefaultPrefix; _Title2.default.getDefaultPrefix = getDefaultPrefix; _Footer2.default.getDefaultPrefix = getDefaultPrefix; Modal.Body = _Body2.default; Modal.Header = _Header2.default; Modal.Title = _Title2.default; Modal.Footer = _Footer2.default; Modal.Dismiss = _Dismiss2.default; Modal.BaseModal = Modal; Modal.TRANSITION_DURATION = 300; Modal.BACKDROP_TRANSITION_DURATION = 150; exports.default = Modal; module.exports = exports['default'];