UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

474 lines (385 loc) 16.9 kB
"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