2020-05-19 11:43:42 +03:00

241 lines
7.0 KiB
JavaScript

import _extends from 'babel-runtime/helpers/extends';
import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
import _createClass from 'babel-runtime/helpers/createClass';
import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
import _inherits from 'babel-runtime/helpers/inherits';
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ReactDOM from 'react-dom';
import Align from 'rc-align';
import Animate from 'rc-animate';
import PopupInner from './PopupInner';
import LazyRenderBox from './LazyRenderBox';
import { saveRef } from './utils';
var Popup = function (_Component) {
_inherits(Popup, _Component);
function Popup(props) {
_classCallCheck(this, Popup);
var _this = _possibleConstructorReturn(this, (Popup.__proto__ || Object.getPrototypeOf(Popup)).call(this, props));
_initialiseProps.call(_this);
_this.savePopupRef = saveRef.bind(_this, 'popupInstance');
_this.saveAlignRef = saveRef.bind(_this, 'alignInstance');
return _this;
}
_createClass(Popup, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.rootNode = this.getPopupDomNode();
}
}, {
key: 'getPopupDomNode',
value: function getPopupDomNode() {
return ReactDOM.findDOMNode(this.popupInstance);
}
}, {
key: 'getMaskTransitionName',
value: function getMaskTransitionName() {
var props = this.props;
var transitionName = props.maskTransitionName;
var animation = props.maskAnimation;
if (!transitionName && animation) {
transitionName = props.prefixCls + '-' + animation;
}
return transitionName;
}
}, {
key: 'getTransitionName',
value: function getTransitionName() {
var props = this.props;
var transitionName = props.transitionName;
if (!transitionName && props.animation) {
transitionName = props.prefixCls + '-' + props.animation;
}
return transitionName;
}
}, {
key: 'getClassName',
value: function getClassName(currentAlignClassName) {
return this.props.prefixCls + ' ' + this.props.className + ' ' + currentAlignClassName;
}
}, {
key: 'getPopupElement',
value: function getPopupElement() {
var savePopupRef = this.savePopupRef,
props = this.props;
var align = props.align,
style = props.style,
visible = props.visible,
prefixCls = props.prefixCls,
destroyPopupOnHide = props.destroyPopupOnHide;
var className = this.getClassName(this.currentAlignClassName || props.getClassNameFromAlign(align));
var hiddenClassName = prefixCls + '-hidden';
if (!visible) {
this.currentAlignClassName = null;
}
var newStyle = _extends({}, style, this.getZIndexStyle());
var popupInnerProps = {
className: className,
prefixCls: prefixCls,
ref: savePopupRef,
onMouseEnter: props.onMouseEnter,
onMouseLeave: props.onMouseLeave,
style: newStyle
};
if (destroyPopupOnHide) {
return React.createElement(
Animate,
{
component: '',
exclusive: true,
transitionAppear: true,
transitionName: this.getTransitionName()
},
visible ? React.createElement(
Align,
{
target: this.getTarget,
key: 'popup',
ref: this.saveAlignRef,
monitorWindowResize: true,
align: align,
onAlign: this.onAlign
},
React.createElement(
PopupInner,
_extends({
visible: true
}, popupInnerProps),
props.children
)
) : null
);
}
return React.createElement(
Animate,
{
component: '',
exclusive: true,
transitionAppear: true,
transitionName: this.getTransitionName(),
showProp: 'xVisible'
},
React.createElement(
Align,
{
target: this.getTarget,
key: 'popup',
ref: this.saveAlignRef,
monitorWindowResize: true,
xVisible: visible,
childrenProps: { visible: 'xVisible' },
disabled: !visible,
align: align,
onAlign: this.onAlign
},
React.createElement(
PopupInner,
_extends({
hiddenClassName: hiddenClassName
}, popupInnerProps),
props.children
)
)
);
}
}, {
key: 'getZIndexStyle',
value: function getZIndexStyle() {
var style = {};
var props = this.props;
if (props.zIndex !== undefined) {
style.zIndex = props.zIndex;
}
return style;
}
}, {
key: 'getMaskElement',
value: function getMaskElement() {
var props = this.props;
var maskElement = void 0;
if (props.mask) {
var maskTransition = this.getMaskTransitionName();
maskElement = React.createElement(LazyRenderBox, {
style: this.getZIndexStyle(),
key: 'mask',
className: props.prefixCls + '-mask',
hiddenClassName: props.prefixCls + '-mask-hidden',
visible: props.visible
});
if (maskTransition) {
maskElement = React.createElement(
Animate,
{
key: 'mask',
showProp: 'visible',
transitionAppear: true,
component: '',
transitionName: maskTransition
},
maskElement
);
}
}
return maskElement;
}
}, {
key: 'render',
value: function render() {
return React.createElement(
'div',
null,
this.getMaskElement(),
this.getPopupElement()
);
}
}]);
return Popup;
}(Component);
Popup.propTypes = {
visible: PropTypes.bool,
style: PropTypes.object,
getClassNameFromAlign: PropTypes.func,
onAlign: PropTypes.func,
getRootDomNode: PropTypes.func,
onMouseEnter: PropTypes.func,
align: PropTypes.any,
destroyPopupOnHide: PropTypes.bool,
className: PropTypes.string,
prefixCls: PropTypes.string,
onMouseLeave: PropTypes.func
};
var _initialiseProps = function _initialiseProps() {
var _this2 = this;
this.onAlign = function (popupDomNode, align) {
var props = _this2.props;
var currentAlignClassName = props.getClassNameFromAlign(align);
// FIX: https://github.com/react-component/trigger/issues/56
// FIX: https://github.com/react-component/tooltip/issues/79
if (_this2.currentAlignClassName !== currentAlignClassName) {
_this2.currentAlignClassName = currentAlignClassName;
popupDomNode.className = _this2.getClassName(currentAlignClassName);
}
props.onAlign(popupDomNode, align);
};
this.getTarget = function () {
return _this2.props.getRootDomNode();
};
};
export default Popup;