rsuite
Version:
A suite of react components
323 lines (263 loc) • 11.6 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var React = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _lodash = _interopRequireDefault(require("lodash"));
var _setDisplayName = _interopRequireDefault(require("recompose/setDisplayName"));
var _setStatic = _interopRequireDefault(require("recompose/setStatic"));
var _elementResizeEvent = _interopRequireWildcard(require("element-resize-event"));
var _Modal = _interopRequireDefault(require("rsuite-utils/lib/Overlay/Modal"));
var _Bounce = _interopRequireDefault(require("rsuite-utils/lib/Animation/Bounce"));
var _domLib = require("dom-lib");
var _utils = require("../utils");
var _ModalDialog = _interopRequireDefault(require("./ModalDialog"));
var _ModalBody = _interopRequireDefault(require("./ModalBody"));
var _ModalHeader = _interopRequireDefault(require("./ModalHeader"));
var _ModalTitle = _interopRequireDefault(require("./ModalTitle"));
var _ModalFooter = _interopRequireDefault(require("./ModalFooter"));
var _constants = require("../constants");
var _ModalContext = _interopRequireDefault(require("./ModalContext"));
var BACKDROP_TRANSITION_DURATION = 150;
var Modal =
/*#__PURE__*/
function (_React$Component) {
(0, _inheritsLoose2.default)(Modal, _React$Component);
function Modal(props) {
var _this;
_this = _React$Component.call(this, props) || this;
_this.dialogRef = void 0;
_this.modalRef = void 0;
_this.windowResizeListener = null;
_this.contentElement = null;
_this.handleShow = function () {
var dialogElement = _this.dialogRef.current;
_this.updateModalStyles(dialogElement);
_this.contentElement = dialogElement.querySelector("." + _this.addPrefix('content'));
_this.windowResizeListener = (0, _domLib.on)(window, 'resize', _this.handleResize);
(0, _elementResizeEvent.default)(_this.contentElement, _this.handleResize);
};
_this.handleHide = function () {
_this.destroyEvent();
};
_this.handleDialogClick = function (event) {
if (event.target !== event.currentTarget) {
return;
}
var onHide = _this.props.onHide;
onHide && onHide(event);
};
_this.handleResize = function () {
_this.updateModalStyles(_this.dialogRef.current);
};
_this.addPrefix = function (name) {
return (0, _utils.prefix)(_this.props.classPrefix)(name);
};
_this.state = {
modalStyles: {},
bodyStyles: {}
};
_this.dialogRef = React.createRef();
_this.modalRef = React.createRef();
return _this;
}
var _proto = Modal.prototype;
_proto.componentWillUnmount = function componentWillUnmount() {
this.destroyEvent();
};
_proto.getStyles = function getStyles(dialogElement) {
var _this$props = this.props,
container = _this$props.container,
overflow = _this$props.overflow,
drawer = _this$props.drawer;
var node = dialogElement || this.dialogRef.current;
var doc = (0, _domLib.ownerDocument)(node);
var scrollHeight = node ? node.scrollHeight : 0;
var bodyIsOverflowing = (0, _domLib.isOverflowing)(container || doc.body);
var modalIsOverflowing = scrollHeight > doc.documentElement.clientHeight;
var styles = {
modalStyles: {
paddingRight: bodyIsOverflowing && !modalIsOverflowing ? (0, _domLib.getScrollbarSize)() : 0,
paddingLeft: !bodyIsOverflowing && modalIsOverflowing ? (0, _domLib.getScrollbarSize)() : 0
},
bodyStyles: {}
};
if (!overflow) {
return styles;
}
var bodyStyles = {
overflow: 'auto'
};
if (node) {
// default margin
var headerHeight = 46;
var footerHeight = 46;
var contentHeight = 30;
var headerDOM = node.querySelector("." + this.addPrefix('header'));
var footerDOM = node.querySelector("." + this.addPrefix('footer'));
var contentDOM = node.querySelector("." + this.addPrefix('content'));
headerHeight = headerDOM ? (0, _domLib.getHeight)(headerDOM) + headerHeight : headerHeight;
footerHeight = footerDOM ? (0, _domLib.getHeight)(footerDOM) + headerHeight : headerHeight;
contentHeight = contentDOM ? (0, _domLib.getHeight)(contentDOM) + contentHeight : contentHeight;
if (drawer) {
bodyStyles.height = contentHeight - (headerHeight + footerHeight);
} else {
/**
* Header height + Footer height + Dialog margin
*/
var excludeHeight = headerHeight + footerHeight + 60;
var bodyHeight = (0, _domLib.getHeight)(window) - excludeHeight;
var maxHeight = scrollHeight >= bodyHeight ? bodyHeight : scrollHeight;
bodyStyles.maxHeight = maxHeight;
}
}
styles.bodyStyles = bodyStyles;
return styles;
};
_proto.destroyEvent = function destroyEvent() {
if (this.windowResizeListener) {
this.windowResizeListener.off();
}
if (this.contentElement) {
(0, _elementResizeEvent.unbind)(this.contentElement);
}
};
_proto.updateModalStyles = function updateModalStyles(dialogElement) {
this.setState(this.getStyles(dialogElement));
};
_proto.render = function render() {
var _classNames, _classNames2;
var _this$props2 = this.props,
className = _this$props2.className,
children = _this$props2.children,
dialogClassName = _this$props2.dialogClassName,
backdropClassName = _this$props2.backdropClassName,
dialogStyle = _this$props2.dialogStyle,
animation = _this$props2.animation,
classPrefix = _this$props2.classPrefix,
style = _this$props2.style,
show = _this$props2.show,
size = _this$props2.size,
full = _this$props2.full,
dialogComponentClass = _this$props2.dialogComponentClass,
animationProps = _this$props2.animationProps,
animationTimeout = _this$props2.animationTimeout,
onHide = _this$props2.onHide,
rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props2, ["className", "children", "dialogClassName", "backdropClassName", "dialogStyle", "animation", "classPrefix", "style", "show", "size", "full", "dialogComponentClass", "animationProps", "animationTimeout", "onHide"]);
var _this$state = this.state,
modalStyles = _this$state.modalStyles,
bodyStyles = _this$state.bodyStyles;
var inClass = {
in: show && !animation
};
var Dialog = dialogComponentClass;
var parentProps = _lodash.default.pick(rest, _lodash.default.get(_Modal.default, 'handledProps'));
var items = null;
if (children) {
items = _utils.ReactChildren.mapCloneElement(children, function (child) {
var displayName = child.type.displayName;
if (displayName && displayName.indexOf('Body') !== -1) {
return {
style: bodyStyles
};
}
return null;
});
}
var classes = (0, _classnames.default)(this.addPrefix(size), className, (_classNames = {}, _classNames[this.addPrefix('full')] = full, _classNames));
var modal = React.createElement(Dialog, (0, _extends2.default)({}, _lodash.default.pick(rest, Object.keys(_ModalDialog.default.propTypes || {})), {
style: (0, _extends2.default)({}, modalStyles, {}, style),
classPrefix: classPrefix,
className: classes,
dialogClassName: dialogClassName,
dialogStyle: dialogStyle,
onClick: rest.backdrop === true ? this.handleDialogClick : null,
dialogRef: this.dialogRef
}), items);
return React.createElement(_ModalContext.default.Provider, {
value: {
onModalHide: onHide
}
}, React.createElement(_Modal.default, (0, _extends2.default)({
ref: this.modalRef,
show: show,
onHide: onHide,
className: this.addPrefix('wrapper'),
onEntering: (0, _utils.createChainedFunction)(this.handleShow, this.props.onEntering),
onExited: (0, _utils.createChainedFunction)(this.handleHide, this.props.onExited),
backdropClassName: (0, _classnames.default)(this.addPrefix('backdrop'), backdropClassName, inClass),
containerClassName: (0, _classnames.default)(this.addPrefix('open'), (_classNames2 = {}, _classNames2[this.addPrefix('has-backdrop')] = rest.backdrop, _classNames2)),
transition: animation ? animation : undefined,
animationProps: animationProps,
dialogTransitionTimeout: animationTimeout,
backdropTransitionTimeout: BACKDROP_TRANSITION_DURATION
}, parentProps), modal));
};
return Modal;
}(React.Component);
Modal.propTypes = {
classPrefix: _propTypes.default.string,
size: _propTypes.default.oneOf(_constants.SIZE),
container: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.func]),
onRendered: _propTypes.default.func,
className: _propTypes.default.string,
children: _propTypes.default.node,
dialogClassName: _propTypes.default.string,
backdropClassName: _propTypes.default.string,
style: _propTypes.default.object,
dialogStyle: _propTypes.default.object,
backdropStyle: _propTypes.default.object,
show: _propTypes.default.bool,
full: _propTypes.default.bool,
backdrop: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.string]),
keyboard: _propTypes.default.bool,
transition: _propTypes.default.elementType,
dialogTransitionTimeout: _propTypes.default.number,
backdropTransitionTimeout: _propTypes.default.number,
autoFocus: _propTypes.default.bool,
enforceFocus: _propTypes.default.bool,
overflow: _propTypes.default.bool,
drawer: _propTypes.default.bool,
dialogComponentClass: _propTypes.default.elementType,
animation: _propTypes.default.any,
animationProps: _propTypes.default.object,
animationTimeout: _propTypes.default.number,
onEscapeKeyUp: _propTypes.default.func,
onBackdropClick: _propTypes.default.func,
onShow: _propTypes.default.func,
onHide: _propTypes.default.func,
onEnter: _propTypes.default.func,
onEntering: _propTypes.default.func,
onEntered: _propTypes.default.func,
onExit: _propTypes.default.func,
onExiting: _propTypes.default.func,
onExited: _propTypes.default.func
};
Modal.defaultProps = {
size: 'sm',
backdrop: true,
keyboard: true,
autoFocus: true,
enforceFocus: true,
animation: _Bounce.default,
animationTimeout: 300,
dialogComponentClass: _ModalDialog.default,
overflow: true
};
var EnhancedModal = (0, _utils.defaultProps)({
classPrefix: 'modal'
})(Modal);
(0, _setStatic.default)('Body', _ModalBody.default)(EnhancedModal);
(0, _setStatic.default)('Header', _ModalHeader.default)(EnhancedModal);
(0, _setStatic.default)('Title', _ModalTitle.default)(EnhancedModal);
(0, _setStatic.default)('Footer', _ModalFooter.default)(EnhancedModal);
(0, _setStatic.default)('Dialog', _ModalDialog.default)(EnhancedModal);
var _default = (0, _setDisplayName.default)('Modal')(EnhancedModal);
exports.default = _default;
module.exports = exports.default;