choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
474 lines (385 loc) • 16.9 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _get3 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _tslib = require("tslib");
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _omit = _interopRequireDefault(require("lodash/omit"));
var _noop = _interopRequireDefault(require("lodash/noop"));
var _debounce = _interopRequireDefault(require("lodash/debounce"));
var _isString = _interopRequireDefault(require("lodash/isString"));
var _mobx = require("mobx");
var _mobxReact = require("mobx-react");
var _isPromise = _interopRequireDefault(require("is-promise"));
var _enum = require("../../../lib/progress/enum");
var _icon = _interopRequireDefault(require("../icon"));
var _FormContext = _interopRequireDefault(require("../form/FormContext"));
var _progress = _interopRequireDefault(require("../progress"));
var _ripple = _interopRequireDefault(require("../ripple"));
var _enum2 = require("./enum");
var _enum3 = require("../data-set/enum");
var _enum4 = require("../core/enum");
var _DataSetComponent2 = _interopRequireDefault(require("../data-set/DataSetComponent"));
var _autobind = _interopRequireDefault(require("../_util/autobind"));
var _singleton = require("../tooltip/singleton");
var _util = _interopRequireDefault(require("../overflow-tip/util"));
function _createSuper(Derived) {
function isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
if (Reflect.construct.sham) return false;
if (typeof Proxy === "function") return true;
try {
Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
return true;
} catch (e) {
return false;
}
}
return function () {
var Super = (0, _getPrototypeOf2["default"])(Derived),
result;
if (isNativeReflectConstruct()) {
var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return (0, _possibleConstructorReturn2["default"])(this, result);
};
}
var Button =
/*#__PURE__*/
function (_DataSetComponent) {
(0, _inherits2["default"])(Button, _DataSetComponent);
var _super = _createSuper(Button);
function Button(props, context) {
var _this;
(0, _classCallCheck2["default"])(this, Button);
_this = _super.call(this, props, context);
_this.handleClickWait = _this.getHandleClick(props);
return _this;
}
(0, _createClass2["default"])(Button, [{
key: "getObservableProps",
value: function getObservableProps(props, context) {
return (0, _objectSpread2["default"])({}, (0, _get3["default"])((0, _getPrototypeOf2["default"])(Button.prototype), "getObservableProps", this).call(this, props, context), {
dataSet: 'dataSet' in props ? props.dataSet : context.dataSet,
loading: 'loading' in props ? props.loading : this.observableProps ? this.loading : false,
type: props.type,
disabled: context.disabled || props.disabled
});
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps, nextContext) {
(0, _get3["default"])((0, _getPrototypeOf2["default"])(Button.prototype), "componentWillReceiveProps", this).call(this, nextProps, nextContext);
var _this$props = this.props,
wait = _this$props.wait,
waitType = _this$props.waitType;
if (wait !== nextProps.wait || waitType !== nextProps.waitType) {
this.handleClickWait = this.getHandleClick(nextProps);
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.handleClickWait.cancel();
if (this.isTooltipShown) {
(0, _singleton.hide)();
delete this.isTooltipShown;
}
}
}, {
key: "getHandleClick",
value: function getHandleClick(props) {
var wait = props.wait,
waitType = props.waitType;
if (wait && waitType) {
var options = {
leading: true,
trailing: true
};
if (waitType === _enum4.WaitType.throttle) {
options.trailing = false;
options.maxWait = wait;
} else if (waitType === _enum4.WaitType.debounce) {
options.leading = false;
}
return (0, _debounce["default"])(this.handleClick, wait, options);
}
return (0, _debounce["default"])(this.handleClick, 0);
}
}, {
key: "handleClickIfBubble",
value: function handleClickIfBubble(e) {
var _this$props2 = this.props,
wait = _this$props2.wait,
waitType = _this$props2.waitType;
if (wait && waitType) {
e.stopPropagation();
this.handleClickWait(e);
} else {
this.handleClick(e);
}
}
}, {
key: "handleClick",
value: function () {
var _handleClick = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee(e) {
var onClick, afterClick;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
onClick = this.props.onClick;
if (!onClick) {
_context.next = 12;
break;
}
afterClick = onClick(e);
if (!(0, _isPromise["default"])(afterClick)) {
_context.next = 12;
break;
}
_context.prev = 4;
this.loading = true;
_context.next = 8;
return afterClick;
case 8:
_context.prev = 8;
this.loading = false; // Fix asynchronous out of focus
this.focus();
return _context.finish(8);
case 12:
case "end":
return _context.stop();
}
}
}, _callee, this, [[4,, 8, 12]]);
}));
function handleClick(_x) {
return _handleClick.apply(this, arguments);
}
return handleClick;
}()
}, {
key: "handleMouseEnter",
value: function handleMouseEnter(e) {
var _this$context = this.context,
getTooltip = _this$context.getTooltip,
getTooltipTheme = _this$context.getTooltipTheme,
getTooltipPlacement = _this$context.getTooltipPlacement;
var _this$props3 = this.props,
_this$props3$tooltip = _this$props3.tooltip,
tooltip = _this$props3$tooltip === void 0 ? getTooltip('button') : _this$props3$tooltip,
children = _this$props3.children;
var element = this.element;
if (tooltip === _enum2.ButtonTooltip.always || tooltip === _enum2.ButtonTooltip.overflow && (0, _util["default"])(element)) {
(0, _singleton.show)(element, {
title: children,
theme: getTooltipTheme('button'),
placement: getTooltipPlacement('button')
});
this.isTooltipShown = true;
}
var _this$props$onMouseEn = this.props.onMouseEnter,
onMouseEnter = _this$props$onMouseEn === void 0 ? _noop["default"] : _this$props$onMouseEn;
onMouseEnter(e);
}
}, {
key: "handleMouseLeave",
value: function handleMouseLeave(e) {
(0, _singleton.hide)();
var _this$props$onMouseLe = this.props.onMouseLeave,
onMouseLeave = _this$props$onMouseLe === void 0 ? _noop["default"] : _this$props$onMouseLe;
onMouseLeave(e);
}
}, {
key: "isDisabled",
value: function isDisabled() {
return (0, _get3["default"])((0, _getPrototypeOf2["default"])(Button.prototype), "isDisabled", this).call(this) || this.loading;
}
}, {
key: "getOmitPropsKeys",
value: function getOmitPropsKeys() {
return (0, _get3["default"])((0, _getPrototypeOf2["default"])(Button.prototype), "getOmitPropsKeys", this).call(this).concat(['icon', 'funcType', 'color', 'loading', 'wait', 'waitType', 'tooltip', 'block']);
}
}, {
key: "getOtherProps",
value: function getOtherProps() {
var otherProps = (0, _get3["default"])((0, _getPrototypeOf2["default"])(Button.prototype), "getOtherProps", this).call(this);
var getTooltip = this.context.getTooltip;
var _this$props$tooltip = this.props.tooltip,
tooltip = _this$props$tooltip === void 0 ? getTooltip('button') : _this$props$tooltip;
if (!this.disabled) {
otherProps.onClick = this.handleClickIfBubble;
}
if (tooltip && [_enum2.ButtonTooltip.always, _enum2.ButtonTooltip.overflow].includes(tooltip)) {
otherProps.onMouseEnter = this.handleMouseEnter;
otherProps.onMouseLeave = this.handleMouseLeave;
}
return otherProps;
}
}, {
key: "getClassName",
value: function getClassName() {
var _get2, _ref;
var prefixCls = this.prefixCls,
_this$props4 = this.props,
_this$props4$color = _this$props4.color,
color = _this$props4$color === void 0 ? this.getContextConfig('buttonColor') : _this$props4$color,
_this$props4$funcType = _this$props4.funcType,
funcType = _this$props4$funcType === void 0 ? this.getContextConfig('buttonFuncType') : _this$props4$funcType,
children = _this$props4.children,
icon = _this$props4.icon,
block = _this$props4.block;
var childrenCount = _react.Children.count(children);
for (var _len = arguments.length, props = new Array(_len), _key = 0; _key < _len; _key++) {
props[_key] = arguments[_key];
}
return (_get2 = (0, _get3["default"])((0, _getPrototypeOf2["default"])(Button.prototype), "getClassName", this)).call.apply(_get2, [this, (_ref = {}, (0, _defineProperty2["default"])(_ref, "".concat(prefixCls, "-").concat(funcType), funcType), (0, _defineProperty2["default"])(_ref, "".concat(prefixCls, "-").concat(color), color), (0, _defineProperty2["default"])(_ref, "".concat(prefixCls, "-icon-only"), icon ? childrenCount === 0 || children === false : childrenCount === 1 && children.type && children.type.__C7N_ICON), (0, _defineProperty2["default"])(_ref, "".concat(prefixCls, "-block"), block), _ref)].concat(props));
}
}, {
key: "render",
value: function render() {
var _this$props5 = this.props,
children = _this$props5.children,
icon = _this$props5.icon,
href = _this$props5.href,
funcType = _this$props5.funcType;
var buttonIcon = this.loading ? _react["default"].createElement(_progress["default"], {
key: "loading",
type: _enum.ProgressType.loading,
size: _enum4.Size.small
}) : icon && _react["default"].createElement(_icon["default"], {
type: icon
});
var hasString = _react.Children.toArray(children).some(function (child) {
return (0, _isString["default"])(child);
});
var Cmp = href ? 'a' : 'button';
var props = this.getMergedProps();
var disabled = this.disabled;
var onMouseEnter = props.onMouseEnter,
onMouseLeave = props.onMouseLeave;
var tooltipWrapper = disabled && !href && (onMouseEnter || onMouseLeave);
var buttonProps = tooltipWrapper ? (0, _omit["default"])(props, ['className', 'style']) : props;
var hrefButtonProps = href ? (0, _omit["default"])(buttonProps, ['type']) : buttonProps;
var rippleDisabled = disabled || funcType === _enum2.FuncType.link;
var button = _react["default"].createElement(_ripple["default"], {
disabled: rippleDisabled
}, _react["default"].createElement(Cmp, (0, _extends2["default"])({}, disabled ? (0, _omit["default"])(hrefButtonProps, ['href']) : hrefButtonProps), buttonIcon, hasString ? _react["default"].createElement("span", null, children) : children));
return tooltipWrapper ? _react["default"].createElement("span", {
className: (0, _classnames["default"])(props.className, "".concat(this.prefixCls, "-disabled-wrapper")),
style: props.style,
onMouseEnter: onMouseEnter,
onMouseLeave: onMouseLeave
}, button) : button;
}
}, {
key: "loading",
get: function get() {
var _this$observableProps = this.observableProps,
type = _this$observableProps.type,
dataSet = _this$observableProps.dataSet,
loading = _this$observableProps.loading;
return loading || type === _enum2.ButtonType.submit && !!dataSet && dataSet.status === _enum3.DataSetStatus.submitting;
},
set: function set(loading) {
var _this2 = this;
(0, _mobx.runInAction)(function () {
_this2.observableProps.loading = loading;
});
}
}], [{
key: "contextType",
get: function get() {
return _FormContext["default"];
}
}]);
return Button;
}(_DataSetComponent2["default"]);
Button.displayName = 'Button'; // eslint-disable-next-line camelcase
Button.__PRO_BUTTON = true;
Button.propTypes = (0, _objectSpread2["default"])({
/**
* 按钮展现模式
* 可选值:'flat' | 'raised'
* @default raised
*/
funcType: _propTypes["default"].oneOf([_enum2.FuncType.flat, _enum2.FuncType.raised, _enum2.FuncType.link]),
/**
* 按钮颜色风格
* 可选值:'default' | 'primary' | 'gray' | 'blue' | 'red' | 'green' | 'yellow' | 'purple' | 'dark'
* @default 'default'
*/
color: _propTypes["default"].oneOf([_enum2.ButtonColor["default"], _enum2.ButtonColor.primary, _enum2.ButtonColor.gray, _enum2.ButtonColor.blue, _enum2.ButtonColor.red, _enum2.ButtonColor.green, _enum2.ButtonColor.yellow, _enum2.ButtonColor.purple, _enum2.ButtonColor.dark]),
/**
* 按钮类型
* 可选值:'button' | 'submit' | 'reset'
* @default 'button'
*/
type: _propTypes["default"].oneOf([_enum2.ButtonType.button, _enum2.ButtonType.submit, _enum2.ButtonType.reset]),
/**
* 按钮是否是加载状态
*/
loading: _propTypes["default"].bool,
/**
* 点击跳转的地址,指定此属性 button 的行为和 a 链接一致
*/
href: _propTypes["default"].string,
/**
* 相当于 a 链接的 target 属性,href 存在时生效
*/
target: _propTypes["default"].string,
/**
* 点击等待时间
*/
wait: _propTypes["default"].number,
/**
* 点击间隔类型,可选值:throttle | debounce
* @default throttle
*/
waitType: _propTypes["default"].oneOf([_enum4.WaitType.throttle, _enum4.WaitType.debounce]),
/**
* 用tooltip显示按钮内容
* 可选值:`none` `always` `overflow`
*/
tooltip: _propTypes["default"].string,
/**
* 将按钮宽度调整为其父宽度的选项
*/
block: _propTypes["default"].bool
}, _DataSetComponent2["default"].propTypes);
Button.defaultProps = {
suffixCls: 'btn',
type: _enum2.ButtonType.button,
waitType: _enum4.WaitType.throttle
};
(0, _tslib.__decorate)([_mobx.computed], Button.prototype, "loading", null);
(0, _tslib.__decorate)([_autobind["default"]], Button.prototype, "handleClickIfBubble", null);
(0, _tslib.__decorate)([_autobind["default"]], Button.prototype, "handleClick", null);
(0, _tslib.__decorate)([_autobind["default"]], Button.prototype, "handleMouseEnter", null);
(0, _tslib.__decorate)([_autobind["default"]], Button.prototype, "handleMouseLeave", null);
Button = (0, _tslib.__decorate)([_mobxReact.observer], Button);
var _default = Button;
exports["default"] = _default;
//# sourceMappingURL=Button.js.map