UNPKG

choerodon-ui

Version:

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

267 lines (234 loc) 8.38 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _inherits from "@babel/runtime/helpers/inherits"; import _createSuper from "@babel/runtime/helpers/createSuper"; import _objectSpread from "@babel/runtime/helpers/objectSpread2"; var _excluded = ["children", "placement", "onHiddenChange", "onHiddenBeforeChange", "trigger", "defaultHidden", "hidden", "getRootDomNode"]; import { __decorate } from "tslib"; import React, { Children, Component, isValidElement } from 'react'; import isNil from 'lodash/isNil'; import { toJS } from 'mobx'; import ConfigContext from '../../../es/config-provider/ConfigContext'; import Trigger from '../../../es/trigger/Trigger'; import { Action } from '../../../es/trigger/enum'; import getPlacements from './placements'; import autobind from '../_util/autobind'; var splitObject = function splitObject(obj, keys) { var picked = {}; var ommitted = _objectSpread({}, obj); keys.forEach(function (key) { if (obj && key in obj) { picked[key] = obj[key]; delete ommitted[key]; } }); return { picked: picked, ommitted: ommitted }; }; /** * Fix the tooltip won't hide when child element is button * @param element ReactElement */ function getDisabledCompatableChildren(element) { var elementType = element.type; var props = element.props; if (elementType === 'button' && props.disabled) { var style = props.style, block = props.block, className = props.className; var _splitObject = splitObject(style, ['position', 'left', 'right', 'top', 'bottom', 'float', 'display', 'zIndex']), picked = _splitObject.picked, ommitted = _splitObject.ommitted; var spanStyle = _objectSpread(_objectSpread({ display: 'inline-block' }, picked), {}, { cursor: 'not-allowed', width: block ? '100%' : null }); var buttonStyle = _objectSpread(_objectSpread({}, ommitted), {}, { pointerEvents: 'none' }); var child = /*#__PURE__*/React.cloneElement(element, { style: buttonStyle, className: null }); return /*#__PURE__*/React.createElement("span", { style: spanStyle, className: className }, child); } return element; } var PopupContent = function PopupContent(props) { var content = props.content, prefixCls = props.prefixCls, theme = props.theme, _props$translate = props.translate, x = _props$translate.x, y = _props$translate.y, popupInnerStyle = props.popupInnerStyle; var arrowCls = "".concat(prefixCls, "-popup-arrow"); var contentCls = "".concat(prefixCls, "-popup-inner"); var arrowStyle = x || y ? { marginLeft: -x, marginTop: -y } : undefined; return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", { className: "".concat(arrowCls, " ").concat(arrowCls, "-").concat(theme), style: arrowStyle }), /*#__PURE__*/React.createElement("div", { className: "".concat(contentCls, " ").concat(contentCls, "-").concat(theme), style: popupInnerStyle }, toJS(content))); }; var Tooltip = /*#__PURE__*/function (_Component) { _inherits(Tooltip, _Component); var _super = _createSuper(Tooltip); function Tooltip() { var _this; _classCallCheck(this, Tooltip); _this = _super.apply(this, arguments); _this.state = { translate: { x: 0, y: 0 } }; return _this; } _createClass(Tooltip, [{ key: "prefixCls", get: function get() { var _this$props = this.props, suffixCls = _this$props.suffixCls, prefixCls = _this$props.prefixCls; var context = this.context; return context.getProPrefixCls(suffixCls, prefixCls); } }, { key: "placements", get: function get() { var _this$props2 = this.props, builtinPlacements = _this$props2.builtinPlacements, arrowPointAtCenter = _this$props2.arrowPointAtCenter, autoAdjustOverflow = _this$props2.autoAdjustOverflow; return builtinPlacements || getPlacements({ arrowPointAtCenter: arrowPointAtCenter, verticalArrowShift: 8, autoAdjustOverflow: autoAdjustOverflow }); } }, { key: "getContent", value: function getContent() { var _this$props3 = this.props, title = _this$props3.title, overlay = _this$props3.overlay; if (typeof overlay === 'function') { return overlay.apply(void 0, arguments); } if (overlay) { return overlay; } if (typeof title === 'function') { return title.apply(void 0, arguments); } return title; } }, { key: "handlePopupAlign", value: function handlePopupAlign(_source, _align, _target, translate) { var _this$state$translate = this.state.translate, x = _this$state$translate.x, y = _this$state$translate.y; if (x !== translate.x || y !== translate.y) { this.setState({ translate: translate }); } } }, { key: "renderPopupContent", value: function renderPopupContent() { var translate = this.state.translate; var getTooltipTheme = this.context.getTooltipTheme; var _this$props4 = this.props, _this$props4$theme = _this$props4.theme, theme = _this$props4$theme === void 0 ? getTooltipTheme() : _this$props4$theme, popupInnerStyle = _this$props4.popupInnerStyle; var content = this.getContent.apply(this, arguments); if (content) { return /*#__PURE__*/React.createElement(PopupContent, { content: content, theme: theme, prefixCls: this.prefixCls, translate: translate, popupInnerStyle: popupInnerStyle }); } } }, { key: "render", value: function render() { var prefixCls = this.prefixCls, _this$props5 = this.props, children = _this$props5.children, placement = _this$props5.placement, onHiddenChange = _this$props5.onHiddenChange, onHiddenBeforeChange = _this$props5.onHiddenBeforeChange, trigger = _this$props5.trigger, defaultHidden = _this$props5.defaultHidden, hidden = _this$props5.hidden, getRootDomNode = _this$props5.getRootDomNode, restProps = _objectWithoutProperties(_this$props5, _excluded); // 修复特殊情况为0,以及 undefined 出现的报错情况 var child = Children.count(children) ? Children.map(children, function (node) { return !isNil(node) && ( /*#__PURE__*/isValidElement(node) ? getDisabledCompatableChildren(node) : /*#__PURE__*/React.createElement("span", { key: "text-".concat(node) }, node)); }) : null; var hasHiddenProp = ('hidden' in this.props); if (hasHiddenProp) { restProps.popupHidden = hidden; } delete restProps.theme; return !isNil(child) || getRootDomNode && hasHiddenProp ? /*#__PURE__*/React.createElement(Trigger, _extends({ prefixCls: prefixCls, action: trigger, builtinPlacements: this.placements, popupPlacement: placement, popupContent: this.renderPopupContent, onPopupHiddenBeforeChange: onHiddenBeforeChange, onPopupHiddenChange: onHiddenChange, onPopupAlign: this.handlePopupAlign, defaultPopupHidden: defaultHidden, getRootDomNode: getRootDomNode }, restProps), child) : child; } }], [{ key: "contextType", get: function get() { return ConfigContext; } }]); return Tooltip; }(Component); export { Tooltip as default }; Tooltip.displayName = 'Tooltip'; Tooltip.defaultProps = { suffixCls: 'tooltip', placement: 'top', transitionName: 'zoom-big-fast', mouseEnterDelay: 100, mouseLeaveDelay: 100, arrowPointAtCenter: false, autoAdjustOverflow: true, defaultHidden: true, trigger: [Action.hover] }; __decorate([autobind], Tooltip.prototype, "handlePopupAlign", null); __decorate([autobind], Tooltip.prototype, "renderPopupContent", null); //# sourceMappingURL=Tooltip.js.map