@flexis/ui
Version:
Styleless React Components
277 lines (225 loc) • 14.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
_Object$defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));
var _tslib = require("tslib");
var _react = _interopRequireDefault(require("react"));
var _reactDom = require("react-dom");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _helpers = require("../../helpers");
var _types = require("../common/types");
var _setOverflowOffset = _interopRequireDefault(require("../common/setOverflowOffset"));
var _TooltipSt = require("./Tooltip.st.css");
var _createElement = _react.default.createElement;
var PureComponent = _react.default.PureComponent;
var HALF = 2;
var Tooltip =
/** @class */
function () {
var Tooltip = /*#__PURE__*/function (_PureComponent) {
(0, _inherits2.default)(Tooltip, _PureComponent);
function Tooltip() {
var _this;
(0, _classCallCheck2.default)(this, Tooltip);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Tooltip).apply(this, arguments));
_this.state = {
active: false,
tooltipWithOffset: false
};
_this.elementRef = null;
_this.tooltipRef = null;
return _this;
}
(0, _createClass2.default)(Tooltip, [{
key: "render",
value: function render() {
var _style;
var _this$props = this.props,
className = _this$props.className,
id = _this$props.id,
tabIndex = _this$props.tabIndex,
content = _this$props.content,
placement = _this$props.placement,
align = _this$props.align,
children = _this$props.children,
props = (0, _objectWithoutProperties2.default)(_this$props, ["className", "id", "tabIndex", "content", "placement", "align", "children"]);
var _this$state = this.state,
active = _this$state.active,
tooltipWithOffset = _this$state.tooltipWithOffset;
return _createElement("span", {
ref: this.onElementRef,
className: (0, _TooltipSt.style)(_TooltipSt.classes.root, className),
onMouseEnter: this.onShow,
onFocus: this.onShow,
onMouseLeave: this.onHide,
onBlur: this.onHide,
tabIndex: tabIndex,
"aria-describedby": id
}, children, (0, _reactDom.createPortal)(_createElement("div", (0, _extends2.default)({
ref: this.onTooltipRef,
id: id,
role: "tooltip"
}, props, {
className: (0, _TooltipSt.style)(_TooltipSt.classes.tooltip, (_style = {}, (0, _defineProperty2.default)(_style, "".concat(placement, "Placement"), Boolean(placement)), (0, _defineProperty2.default)(_style, "".concat(align, "Align"), Boolean(align)), (0, _defineProperty2.default)(_style, "offset", tooltipWithOffset), (0, _defineProperty2.default)(_style, "active", active), _style)),
"aria-hidden": !active
}), content), document.body));
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(_, _ref) {
var prevActive = _ref.active;
var active = this.state.active;
if (!prevActive && active) {
this.setTooltipPosition();
}
}
}, {
key: "onElementRef",
value: function onElementRef(ref) {
this.elementRef = ref;
}
}, {
key: "onTooltipRef",
value: function onTooltipRef(ref) {
this.tooltipRef = ref;
}
}, {
key: "onShow",
value: function onShow() {
this.setState(function () {
return {
active: true
};
});
}
}, {
key: "onHide",
value: function onHide() {
this.setState(function () {
return {
active: false
};
});
}
}, {
key: "setTooltipPosition",
value: function setTooltipPosition() {
var elementRef = this.elementRef,
tooltipRef = this.tooltipRef;
if (!elementRef || !tooltipRef) {
return;
}
var _this$props2 = this.props,
placement = _this$props2.placement,
align = _this$props2.align;
var _elementRef$getBoundi = elementRef.getBoundingClientRect(),
elementTop = _elementRef$getBoundi.top,
elementLeft = _elementRef$getBoundi.left,
elementWidth = _elementRef$getBoundi.width,
elementHeight = _elementRef$getBoundi.height;
var tooltipWidth = tooltipRef.offsetWidth,
tooltipHeight = tooltipRef.offsetHeight,
style = tooltipRef.style;
var top = 0;
var left = 0;
switch (placement) {
case 'top':
top = elementTop;
break;
case 'right':
left = elementLeft + elementWidth - tooltipWidth;
break;
case 'bottom':
top = elementTop + elementHeight - tooltipHeight;
break;
case 'left':
left = elementLeft;
break;
default:
}
switch (align) {
case 'start':
switch (placement) {
case 'top':
case 'bottom':
left = elementLeft;
break;
case 'right':
case 'left':
top = elementTop;
break;
default:
}
break;
case 'center':
switch (placement) {
case 'top':
case 'bottom':
left = elementLeft + elementWidth / HALF;
break;
case 'right':
case 'left':
top = elementTop + elementHeight / HALF;
break;
default:
}
break;
case 'end':
switch (placement) {
case 'top':
case 'bottom':
left = elementLeft + elementWidth - tooltipWidth;
break;
case 'right':
case 'left':
top = elementTop + elementHeight - tooltipHeight;
break;
default:
}
break;
default:
}
style.top = "".concat(top, "px");
style.left = "".concat(left, "px");
var withOffset = (0, _setOverflowOffset.default)(tooltipRef, top, left);
this.setState(function () {
return {
tooltipWithOffset: withOffset
};
});
}
}]);
return Tooltip;
}(PureComponent);
process.env.NODE_ENV !== "production" ? Tooltip.propTypes = {
id: _propTypes.default.string,
tabIndex: _propTypes.default.number,
placement: _propTypes.default.oneOf(_types.PlacementValues).isRequired,
align: _propTypes.default.oneOf(_types.AlignValues),
content: _propTypes.default.node.isRequired,
children: _propTypes.default.node.isRequired
} : void 0;
Tooltip.defaultProps = {
tabIndex: 0,
align: _types.AlignVariant.Center
};
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Tooltip.prototype, "onElementRef", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Tooltip.prototype, "onTooltipRef", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Tooltip.prototype, "onShow", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Tooltip.prototype, "onHide", null);
return Tooltip;
}();
var _default = Tooltip;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL1Rvb2x0aXAvVG9vbHRpcC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBS0E7O0FBR0E7O0FBQ0E7O0FBSUE7O0FBT0E7O0FBQ0E7Ozs7QUF3QkEsSUFBTSxJQUFJLEdBQUcsQ0FBYjs7QUFFQSxJQUFBLE9BQUE7QUFBQTtBQUFBLFlBQUE7QUFBQSxNQUFxQixPQUFyQjtBQUFBOztBQUFBLHVCQUFBO0FBQUE7O0FBQUE7O0FBZ0JDLFlBQUEsS0FBQSxHQUFRO0FBQ1AsUUFBQSxNQUFNLEVBQWEsS0FEWjtBQUVQLFFBQUEsaUJBQWlCLEVBQUU7QUFGWixPQUFSO0FBS1EsWUFBQSxVQUFBLEdBQThCLElBQTlCO0FBQ0EsWUFBQSxVQUFBLEdBQTZCLElBQTdCO0FBdEJUO0FBc09DOztBQXRPRDtBQUFBO0FBQUEsK0JBd0JPO0FBQUE7O0FBQUEsMEJBV0QsS0FBSyxLQVhKO0FBQUEsWUFHSixTQUhJLGVBR0osU0FISTtBQUFBLFlBSUosRUFKSSxlQUlKLEVBSkk7QUFBQSxZQUtKLFFBTEksZUFLSixRQUxJO0FBQUEsWUFNSixPQU5JLGVBTUosT0FOSTtBQUFBLFlBT0osU0FQSSxlQU9KLFNBUEk7QUFBQSxZQVFKLEtBUkksZUFRSixLQVJJO0FBQUEsWUFTSixRQVRJLGVBU0osUUFUSTtBQUFBLFlBVUQsS0FWQztBQUFBLDBCQWVELEtBQUssS0FmSjtBQUFBLFlBYUosTUFiSSxlQWFKLE1BYkk7QUFBQSxZQWNKLGlCQWRJLGVBY0osaUJBZEk7QUFpQkwsZUFDQztBQUNDLFVBQUEsR0FBRyxFQUFFLEtBQUssWUFEWDtBQUVDLFVBQUEsU0FBUyxFQUFFLHNCQUFNLG1CQUFRLElBQWQsRUFBb0IsU0FBcEIsQ0FGWjtBQUdDLFVBQUEsWUFBWSxFQUFFLEtBQUssTUFIcEI7QUFJQyxVQUFBLE9BQU8sRUFBRSxLQUFLLE1BSmY7QUFLQyxVQUFBLFlBQVks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