zent
Version:
一套前端设计语言和基于React的实现
435 lines (348 loc) • 13.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _popover = require('../popover');
var _popover2 = _interopRequireDefault(_popover);
var _withPopover = require('../popover/withPopover');
var _button = require('../button');
var _button2 = _interopRequireDefault(_button);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _noop = require('lodash/noop');
var _noop2 = _interopRequireDefault(_noop);
var _isFunction = require('lodash/isFunction');
var _isFunction2 = _interopRequireDefault(_isFunction);
var _isPromise = require('../utils/isPromise');
var _isPromise2 = _interopRequireDefault(_isPromise);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _NoneTrigger = require('./NoneTrigger');
var _NoneTrigger2 = _interopRequireDefault(_NoneTrigger);
var _position = require('./position');
var _position2 = _interopRequireDefault(_position);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var Trigger = _popover2['default'].Trigger,
withPopover = _popover2['default'].withPopover;
var stateMap = {
onConfirm: 'confirmPending',
onCancel: 'cancelPending'
};
var PopAction = function (_ref) {
(0, _inherits3['default'])(PopAction, _ref);
function PopAction() {
var _ref2;
var _temp, _this, _ret;
(0, _classCallCheck3['default'])(this, PopAction);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = (0, _possibleConstructorReturn3['default'])(this, (_ref2 = PopAction.__proto__ || Object.getPrototypeOf(PopAction)).call.apply(_ref2, [this].concat(args))), _this), _this.handleConfirm = function () {
_this.handleClick('onConfirm');
}, _this.handleCancel = function () {
_this.handleClick('onCancel');
}, _temp), (0, _possibleConstructorReturn3['default'])(_this, _ret);
}
(0, _createClass3['default'])(PopAction, [{
key: 'handleClick',
// 支持异步的回调函数
// onConfirm/onCancel异步等待的时候要禁用用户关闭
value: function handleClick(callbackName) {
var callback = this.props[callbackName];
var popover = this.props.popover;
if (!(0, _isFunction2['default'])(callback)) {
return popover.close();
}
var changePending = this.props.changePending;
var stateKey = stateMap[callbackName];
var startClose = function startClose() {
changePending(stateKey, true);
};
var finishClose = function finishClose() {
changePending(stateKey, false, popover.close);
};
if (callback.length >= 1) {
startClose();
return callback(finishClose);
}
var maybePromise = callback();
if ((0, _isPromise2['default'])(maybePromise)) {
startClose();
maybePromise.then(finishClose)['catch'](function () {
return changePending(stateKey, false);
});
} else {
popover.close();
}
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
prefix = _props.prefix,
type = _props.type,
onConfirm = _props.onConfirm,
onCancel = _props.onCancel,
confirmText = _props.confirmText,
cancelText = _props.cancelText,
confirmPending = _props.confirmPending,
cancelPending = _props.cancelPending;
if (!onConfirm && !onCancel) {
return null;
}
return _react2['default'].createElement(
'div',
{ className: prefix + '-pop-buttons' },
_react2['default'].createElement(
_button2['default'],
{
loading: confirmPending,
disabled: cancelPending,
size: 'small',
type: type,
onClick: this.handleConfirm
},
confirmText
),
_react2['default'].createElement(
_button2['default'],
{
loading: cancelPending,
disabled: confirmPending,
size: 'small',
onClick: this.handleCancel
},
cancelText
)
);
}
}]);
return PopAction;
}(_react.PureComponent || _react.Component);
var BoundPopAction = withPopover(PopAction);
var Pop = function (_ref3) {
(0, _inherits3['default'])(Pop, _ref3);
function Pop() {
var _ref4;
var _temp2, _this2, _ret2;
(0, _classCallCheck3['default'])(this, Pop);
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
return _ret2 = (_temp2 = (_this2 = (0, _possibleConstructorReturn3['default'])(this, (_ref4 = Pop.__proto__ || Object.getPrototypeOf(Pop)).call.apply(_ref4, [this].concat(args))), _this2), _this2.state = {
confirmPending: false,
cancelPending: false
}, _this2.changePending = function (key, pending, callback) {
if (_this2.isUnmounted) {
return;
}
_this2.setState((0, _defineProperty3['default'])({}, key, pending), callback);
}, _temp2), (0, _possibleConstructorReturn3['default'])(_this2, _ret2);
}
(0, _createClass3['default'])(Pop, [{
key: 'renderContent',
value: function renderContent() {
var _props2 = this.props,
prefix = _props2.prefix,
content = _props2.content,
header = _props2.header,
onConfirm = _props2.onConfirm,
onCancel = _props2.onCancel,
confirmText = _props2.confirmText,
cancelText = _props2.cancelText,
type = _props2.type;
var _state = this.state,
confirmPending = _state.confirmPending,
cancelPending = _state.cancelPending;
return _react2['default'].createElement(
_popover2['default'].Content,
null,
header && _react2['default'].createElement(
'div',
{ className: prefix + '-pop-header' },
header
),
_react2['default'].createElement(
'div',
{ className: prefix + '-pop-inner' },
content,
_react2['default'].createElement(BoundPopAction, {
prefix: prefix,
onConfirm: onConfirm,
onCancel: onCancel,
confirmText: confirmText,
cancelText: cancelText,
confirmPending: confirmPending,
cancelPending: cancelPending,
changePending: this.changePending,
type: type
})
),
_react2['default'].createElement('i', { className: prefix + '-pop-arrow' })
);
}
}, {
key: 'renderTrigger',
value: function renderTrigger() {
var _props3 = this.props,
trigger = _props3.trigger,
visible = _props3.visible,
onVisibleChange = _props3.onVisibleChange,
closeOnClickOutside = _props3.closeOnClickOutside,
isOutside = _props3.isOutside,
mouseLeaveDelay = _props3.mouseLeaveDelay,
mouseEnterDelay = _props3.mouseEnterDelay,
children = _props3.children,
quirk = _props3.quirk;
if (trigger === 'click') {
return _react2['default'].createElement(
Trigger.Click,
{ autoClose: closeOnClickOutside, isOutside: isOutside },
children
);
}
if (trigger === 'hover') {
return _react2['default'].createElement(
Trigger.Hover,
{
showDelay: mouseEnterDelay,
hideDelay: mouseLeaveDelay,
isOutside: isOutside,
quirk: quirk
},
children
);
}
if (trigger === 'focus') {
return _react2['default'].createElement(
Trigger.Focus,
null,
children
);
}
if (trigger === 'none') {
return _react2['default'].createElement(
_NoneTrigger2['default'],
{ visible: visible, onVisibleChange: onVisibleChange },
children
);
}
return null;
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.isUnmounted = true;
}
}, {
key: 'render',
value: function render() {
var _props4 = this.props,
className = _props4.className,
wrapperClassName = _props4.wrapperClassName,
trigger = _props4.trigger,
visible = _props4.visible,
prefix = _props4.prefix,
block = _props4.block,
onShow = _props4.onShow,
onClose = _props4.onClose,
position = _props4.position,
centerArrow = _props4.centerArrow,
onBeforeClose = _props4.onBeforeClose,
onBeforeShow = _props4.onBeforeShow;
var onVisibleChange = this.props.onVisibleChange;
if (trigger === 'none') {
onVisibleChange = onVisibleChange || _noop2['default'];
}
var _state2 = this.state,
confirmPending = _state2.confirmPending,
cancelPending = _state2.cancelPending;
var closePending = confirmPending || cancelPending;
return _react2['default'].createElement(
_popover2['default'],
{
visible: closePending ? true : visible,
onVisibleChange: closePending ? _noop2['default'] : onVisibleChange,
prefix: prefix,
wrapperClassName: (0, _classnames2['default'])(prefix + '-pop-wrapper', wrapperClassName),
className: (0, _classnames2['default'])(prefix + '-pop', className),
cushion: 10,
position: (0, _position2['default'])(position, centerArrow),
display: block ? 'block' : 'inline-block',
onShow: onShow,
onClose: onClose,
onBeforeClose: onBeforeClose,
onBeforeShow: onBeforeShow
},
this.renderTrigger(),
this.renderContent()
);
}
}]);
return Pop;
}(_react.PureComponent || _react.Component);
Pop.propTypes = {
trigger: _propTypes2['default'].oneOf(['click', 'hover', 'focus', 'none']),
position: _propTypes2['default'].oneOf(['left-top', 'left-center', 'left-bottom', 'right-top', 'right-center', 'right-bottom', 'top-left', 'top-center', 'top-right', 'bottom-left', 'bottom-center', 'bottom-right']),
// 是否按小箭头居中对齐trigger来定位
centerArrow: _propTypes2['default'].bool,
// trigger是否块级显示
block: _propTypes2['default'].bool,
content: _propTypes2['default'].node,
header: _propTypes2['default'].node,
// confirm形式相关
onConfirm: _propTypes2['default'].func,
onCancel: _propTypes2['default'].func,
confirmText: _propTypes2['default'].string,
cancelText: _propTypes2['default'].string,
type: _propTypes2['default'].oneOf(['primary', 'default', 'danger', 'success']),
// 打开之后的回调函数
onShow: _propTypes2['default'].func,
// 关闭之后的回调函数
onClose: _propTypes2['default'].func,
// 打开/关闭前的回调函数,只有用户触发的操作才会调用;通过外部改变`visible`不会触发
onBeforeShow: _propTypes2['default'].func,
onBeforeClose: _propTypes2['default'].func,
visible: _propTypes2['default'].bool,
onVisibleChange: _propTypes2['default'].func,
// 只有trigger为hover时才有效
mouseLeaveDelay: _propTypes2['default'].number,
mouseEnterDelay: _propTypes2['default'].number,
quirk: _propTypes2['default'].bool,
// 只有trigger为click时才有效
closeOnClickOutside: _propTypes2['default'].bool,
isClickOutside: _propTypes2['default'].func,
prefix: _propTypes2['default'].string,
className: _propTypes2['default'].string,
wrapperClassName: _propTypes2['default'].string
};
Pop.defaultProps = {
trigger: 'none',
position: 'top-center',
centerArrow: false,
block: false,
confirmText: '确定',
cancelText: '取消',
type: 'primary',
closeOnClickOutside: true,
mouseLeaveDelay: 200,
mouseEnterDelay: 200,
className: '',
wrapperClassName: '',
prefix: 'zent',
quirk: true
};
Pop.withPop = (0, _withPopover.exposePopover)('pop');
exports['default'] = Pop;