antd
Version:
An enterprise-class UI design language and React-based implementation
141 lines (132 loc) • 5.3 kB
JavaScript
import _defineProperty from 'babel-runtime/helpers/defineProperty';
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';
var __rest = this && this.__rest || function (s, e) {
var t = {};
for (var p in s) {
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
}if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0) t[p[i]] = s[p[i]];
}return t;
};
import * as React from 'react';
import Dialog from 'rc-dialog';
import * as PropTypes from 'prop-types';
import classNames from 'classnames';
import addEventListener from 'rc-util/es/Dom/addEventListener';
import Button from '../button';
import LocaleReceiver from '../locale-provider/LocaleReceiver';
import { getConfirmLocale } from './locale';
var mousePosition = void 0;
var mousePositionEventBinded = void 0;
var Modal = function (_React$Component) {
_inherits(Modal, _React$Component);
function Modal() {
_classCallCheck(this, Modal);
var _this = _possibleConstructorReturn(this, (Modal.__proto__ || Object.getPrototypeOf(Modal)).apply(this, arguments));
_this.handleCancel = function (e) {
var onCancel = _this.props.onCancel;
if (onCancel) {
onCancel(e);
}
};
_this.handleOk = function (e) {
var onOk = _this.props.onOk;
if (onOk) {
onOk(e);
}
};
_this.renderFooter = function (locale) {
var _this$props = _this.props,
okText = _this$props.okText,
okType = _this$props.okType,
cancelText = _this$props.cancelText,
confirmLoading = _this$props.confirmLoading;
return React.createElement(
'div',
null,
React.createElement(
Button,
_extends({ onClick: _this.handleCancel }, _this.props.cancelButtonProps),
cancelText || locale.cancelText
),
React.createElement(
Button,
_extends({ type: okType, loading: confirmLoading, onClick: _this.handleOk }, _this.props.okButtonProps),
okText || locale.okText
)
);
};
return _this;
}
_createClass(Modal, [{
key: 'componentDidMount',
value: function componentDidMount() {
if (mousePositionEventBinded) {
return;
}
// 只有点击事件支持从鼠标位置动画展开
addEventListener(document.documentElement, 'click', function (e) {
mousePosition = {
x: e.pageX,
y: e.pageY
};
// 100ms 内发生过点击事件,则从点击位置动画展示
// 否则直接 zoom 展示
// 这样可以兼容非点击方式展开
setTimeout(function () {
return mousePosition = null;
}, 100);
});
mousePositionEventBinded = true;
}
}, {
key: 'render',
value: function render() {
var _a = this.props,
footer = _a.footer,
visible = _a.visible,
wrapClassName = _a.wrapClassName,
centered = _a.centered,
prefixCls = _a.prefixCls,
restProps = __rest(_a, ["footer", "visible", "wrapClassName", "centered", "prefixCls"]);
var defaultFooter = React.createElement(
LocaleReceiver,
{ componentName: 'Modal', defaultLocale: getConfirmLocale() },
this.renderFooter
);
return React.createElement(Dialog, _extends({}, restProps, { prefixCls: prefixCls, wrapClassName: classNames(_defineProperty({}, prefixCls + '-centered', !!centered), wrapClassName), footer: footer === undefined ? defaultFooter : footer, visible: visible, mousePosition: mousePosition, onClose: this.handleCancel }));
}
}]);
return Modal;
}(React.Component);
export default Modal;
Modal.defaultProps = {
prefixCls: 'ant-modal',
width: 520,
transitionName: 'zoom',
maskTransitionName: 'fade',
confirmLoading: false,
visible: false,
okType: 'primary',
okButtonDisabled: false,
cancelButtonDisabled: false
};
Modal.propTypes = {
prefixCls: PropTypes.string,
onOk: PropTypes.func,
onCancel: PropTypes.func,
okText: PropTypes.node,
cancelText: PropTypes.node,
centered: PropTypes.bool,
width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
confirmLoading: PropTypes.bool,
visible: PropTypes.bool,
align: PropTypes.object,
footer: PropTypes.node,
title: PropTypes.node,
closable: PropTypes.bool
};