wix-style-react
Version:
318 lines (267 loc) • 12.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _debounce = _interopRequireDefault(require("lodash/debounce"));
var _shallowequal = _interopRequireDefault(require("shallowequal"));
var _EllipsisSt = require("./Ellipsis.st.css");
var _Tooltip = _interopRequireDefault(require("../../Tooltip"));
var _ZIndex = require("../../ZIndex");
var _TooltipCommon = require("../PropTypes/TooltipCommon");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { 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); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var TextComponent = /*#__PURE__*/function (_React$PureComponent) {
(0, _inherits2["default"])(TextComponent, _React$PureComponent);
var _super = _createSuper(TextComponent);
function TextComponent() {
var _this;
(0, _classCallCheck2["default"])(this, TextComponent);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_getEllipsisClasses", function () {
var _this$props = _this.props,
ellipsis = _this$props.ellipsis,
maxLines = _this$props.maxLines;
var ellipsisLines = maxLines > 1 ? 'multiline' : 'singleLine';
return function (className) {
return ellipsis ? (0, _EllipsisSt.st)(_EllipsisSt.classes.text, {
ellipsisLines: ellipsisLines
}, className) : className;
};
});
return _this;
}
(0, _createClass2["default"])(TextComponent, [{
key: "componentDidMount",
value: function componentDidMount() {
if (!this.props.textRendered) {
this.props.onTextRendered();
}
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
if (!this.props.textRendered) {
this.props.onTextRendered();
}
}
}, {
key: "render",
value: function render() {
var _this$props2 = this.props,
render = _this$props2.render,
maxLines = _this$props2.maxLines,
textElementRef = _this$props2.textElementRef;
return render({
ref: textElementRef,
ellipsisClasses: this._getEllipsisClasses(),
ellipsisInlineStyle: (0, _defineProperty2["default"])({}, _EllipsisSt.vars.maxLines, maxLines)
});
}
}]);
return TextComponent;
}(_react["default"].PureComponent);
var Ellipsis = /*#__PURE__*/function (_React$PureComponent2) {
(0, _inherits2["default"])(Ellipsis, _React$PureComponent2);
var _super2 = _createSuper(Ellipsis);
function Ellipsis(props) {
var _this2;
(0, _classCallCheck2["default"])(this, Ellipsis);
_this2 = _super2.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_onTextRendered", function () {
var _this2$state = _this2.state,
isActive = _this2$state.isActive,
textContent = _this2$state.textContent;
var newState = {
textRendered: true
};
var newTextContent = _this2._getTextContent();
if (newTextContent !== textContent) {
newState.textContent = newTextContent;
}
var shouldBeActive = _this2._checkShouldBeActive();
if (shouldBeActive !== isActive) {
newState.isActive = shouldBeActive;
}
_this2.setState(newState);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_updateIsActive", function () {
var isActive = _this2.state.isActive;
var shouldBeActive = _this2._checkShouldBeActive();
if (shouldBeActive !== isActive) {
_this2.setState({
isActive: shouldBeActive
});
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_getTextContent", function () {
var textElement = _this2.ref.current;
return textElement && textElement.textContent;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_checkShouldBeActive", function () {
return _this2._isOverflowingHorizontally() || _this2._isOverflowingVertically();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_isOverflowingHorizontally", function () {
var textElement = _this2.ref.current;
var ellipsis = _this2.props.ellipsis;
return ellipsis && textElement && (textElement.scrollWidth - textElement.parentNode.offsetWidth > 1 || textElement.offsetWidth < textElement.scrollWidth);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_isOverflowingVertically", function () {
var textElement = _this2.ref.current;
var _this2$props = _this2.props,
ellipsis = _this2$props.ellipsis,
maxLines = _this2$props.maxLines;
return maxLines > 1 && ellipsis && textElement && (textElement.scrollHeight - textElement.parentNode.offsetHeight > 1 || textElement.offsetHeight < textElement.scrollHeight);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this2), "_debouncedUpdate", (0, _debounce["default"])(_this2._updateIsActive, 100));
_this2.state = {
isActive: false,
textContent: null,
textRendered: false
};
_this2.ref = /*#__PURE__*/_react["default"].createRef();
return _this2;
}
/**
* Once text component has rendered,
* Update text content and tooltip active state
* @private
*/
(0, _createClass2["default"])(Ellipsis, [{
key: "componentDidMount",
value: function componentDidMount() {
window.addEventListener('resize', this._debouncedUpdate);
}
}, {
key: "_renderText",
value: function _renderText() {
var _this$props3 = this.props,
render = _this$props3.render,
ellipsis = _this$props3.ellipsis,
maxLines = _this$props3.maxLines;
var textRendered = this.state.textRendered;
return /*#__PURE__*/_react["default"].createElement(TextComponent, {
render: render,
ellipsis: ellipsis,
maxLines: maxLines,
textRendered: textRendered,
onTextRendered: this._onTextRendered,
textElementRef: this.ref
});
}
}, {
key: "render",
value: function render() {
var _this$props4 = this.props,
appendTo = _this$props4.appendTo,
wrapperClassName = _this$props4.wrapperClassName,
disabled = _this$props4.disabled,
enterDelay = _this$props4.enterDelay,
exitDelay = _this$props4.exitDelay,
fixed = _this$props4.fixed,
flip = _this$props4.flip,
maxWidth = _this$props4.maxWidth,
moveArrowTo = _this$props4.moveArrowTo,
onHide = _this$props4.onHide,
onShow = _this$props4.onShow,
placement = _this$props4.placement,
showTooltip = _this$props4.showTooltip,
textAlign = _this$props4.textAlign,
zIndex = _this$props4.zIndex,
size = _this$props4.size;
var _this$state = this.state,
isActive = _this$state.isActive,
textContent = _this$state.textContent;
return showTooltip && isActive ? /*#__PURE__*/_react["default"].createElement(_Tooltip["default"], {
className: (0, _EllipsisSt.st)(_EllipsisSt.classes.tooltip, wrapperClassName),
content: textContent,
appendTo: appendTo,
disabled: disabled,
enterDelay: enterDelay,
exitDelay: exitDelay,
fixed: fixed,
flip: flip,
maxWidth: maxWidth,
moveArrowTo: moveArrowTo,
onHide: onHide,
onShow: onShow,
placement: placement,
textAlign: textAlign,
zIndex: zIndex,
size: size
}, this._renderText()) : this._renderText();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var textRendered = this.state.textRendered;
if (textRendered && !(0, _shallowequal["default"])(prevProps, this.props)) {
this._updateIsActive();
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._debouncedUpdate.cancel();
window.removeEventListener('resize', this._debouncedUpdate);
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(props, state) {
var render = props.render,
ellipsis = props.ellipsis,
maxLines = props.maxLines;
var textPropsChanged = state.prevRender !== render || state.prevEllipsis !== ellipsis || state.prevMaxLines !== maxLines;
if (!textPropsChanged) {
return null;
} // Text changed, initialize textRendered state
return {
textRendered: false,
prevRender: render,
prevEllipsis: ellipsis,
prevMaxLines: maxLines
};
}
}]);
return Ellipsis;
}(_react["default"].PureComponent);
(0, _defineProperty2["default"])(Ellipsis, "propTypes", _objectSpread({
/** When true, text that is longer than it's container will be truncated to a single line followed by ellipsis. Otherwise the text will break into several lines. */
ellipsis: _propTypes["default"].bool,
/** True by default, set it to false in order to show ellipsis without a tooltip. */
showTooltip: _propTypes["default"].bool,
/** A className to be applied to the Ellipsis wrapper. */
wrapperClassName: _propTypes["default"].string,
/** The render function, use it to render a text you want to truncate with ellipsis. */
render: _propTypes["default"].func,
/** maxLines truncates text at a specific number of lines. */
maxLines: _propTypes["default"].number
}, _TooltipCommon.TooltipCommonProps));
(0, _defineProperty2["default"])(Ellipsis, "defaultProps", {
ellipsis: false,
appendTo: 'window',
flip: false,
fixed: false,
placement: 'top',
zIndex: (0, _ZIndex.ZIndex)('Tooltip'),
enterDelay: 0,
exitDelay: 0,
showTooltip: true
});
var _default = Ellipsis;
exports["default"] = _default;