framework7
Version:
Full featured mobile HTML framework for building iOS & Android apps
409 lines (330 loc) • 13.5 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _ssrWindow = require("ssr-window");
var _dom = _interopRequireDefault(require("../../shared/dom7"));
var _utils = require("../../shared/utils");
var _getSupport = require("../../shared/get-support");
var _class = _interopRequireDefault(require("../../shared/class"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
var Tooltip = /*#__PURE__*/function (_Framework7Class) {
_inheritsLoose(Tooltip, _Framework7Class);
function Tooltip(app, params) {
var _this;
if (params === void 0) {
params = {};
}
_this = _Framework7Class.call(this, params, [app]) || this;
var tooltip = _assertThisInitialized(_this);
var support = (0, _getSupport.getSupport)();
var defaults = (0, _utils.extend)({}, app.params.tooltip);
var document = (0, _ssrWindow.getDocument)(); // Extend defaults with modules params
tooltip.useModulesParams(defaults);
tooltip.params = (0, _utils.extend)(defaults, params);
if (typeof params.offset === 'undefined' && support.touch && tooltip.params.trigger === 'hover') {
tooltip.params.offset = 10;
}
var _tooltip$params = tooltip.params,
targetEl = _tooltip$params.targetEl,
containerEl = _tooltip$params.containerEl;
if (!targetEl && !tooltip.params.delegated) return tooltip || _assertThisInitialized(_this);
var $targetEl = (0, _dom.default)(targetEl);
if ($targetEl.length === 0 && !tooltip.params.delegated) return tooltip || _assertThisInitialized(_this);
if ($targetEl[0] && $targetEl[0].f7Tooltip && !tooltip.params.delegated) return $targetEl[0].f7Tooltip || _assertThisInitialized(_this);
var $containerEl = (0, _dom.default)(containerEl || app.$el).eq(0);
if ($containerEl.length === 0) {
$containerEl = app.$el;
}
var $el = (0, _dom.default)(tooltip.render()).eq(0);
(0, _utils.extend)(tooltip, {
app: app,
$targetEl: $targetEl,
targetEl: $targetEl && $targetEl[0],
$containerEl: $containerEl,
containerEl: $containerEl && $containerEl[0],
$el: $el,
el: $el && $el[0],
text: tooltip.params.text || '',
visible: false,
opened: false
});
if ($targetEl[0]) $targetEl[0].f7Tooltip = tooltip;
var touchesStart = {};
var isTouched;
function handleClick() {
if (tooltip.opened) tooltip.hide();else tooltip.show(this);
}
function handleClickOut(e) {
if (tooltip.opened && ((0, _dom.default)(e.target).closest($targetEl).length || (0, _dom.default)(e.target).closest(tooltip.$el).length)) return;
tooltip.hide();
}
function handleTouchStart(e) {
if (isTouched) return;
isTouched = true;
touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
tooltip.show(this);
}
function handleTouchMove(e) {
if (!isTouched) return;
var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
var distance = Math.pow(Math.pow(x - touchesStart.x, 2) + Math.pow(y - touchesStart.y, 2), 0.5);
if (distance > 50) {
isTouched = false;
tooltip.hide();
}
}
function handleTouchEnd() {
if (!isTouched) return;
isTouched = false;
tooltip.hide();
}
function handleMouseEnter() {
tooltip.show(this);
}
function handleMouseLeave() {
tooltip.hide();
}
function handleTransitionEnd() {
if (!$el.hasClass('tooltip-in')) {
$el.removeClass('tooltip-out').remove();
}
}
tooltip.attachEvents = function attachEvents() {
$el.on('transitionend', handleTransitionEnd);
if (tooltip.params.trigger === 'click') {
if (tooltip.params.delegated) {
(0, _dom.default)(document).on('click', tooltip.params.targetEl, handleClick);
} else {
tooltip.$targetEl.on('click', handleClick);
}
(0, _dom.default)('html').on('click', handleClickOut);
return;
}
if (tooltip.params.trigger === 'manual') return;
if (support.touch) {
var passive = support.passiveListener ? {
passive: true
} : false;
if (tooltip.params.delegated) {
(0, _dom.default)(document).on(app.touchEvents.start, tooltip.params.targetEl, handleTouchStart, passive);
} else {
tooltip.$targetEl.on(app.touchEvents.start, handleTouchStart, passive);
}
app.on('touchmove', handleTouchMove);
app.on('touchend:passive', handleTouchEnd);
} else {
// eslint-disable-next-line
if (tooltip.params.delegated) {
(0, _dom.default)(document).on(support.pointerEvents ? 'pointerenter' : 'mouseenter', tooltip.params.targetEl, handleMouseEnter, true);
(0, _dom.default)(document).on(support.pointerEvents ? 'pointerleave' : 'mouseleave', tooltip.params.targetEl, handleMouseLeave, true);
} else {
tooltip.$targetEl.on(support.pointerEvents ? 'pointerenter' : 'mouseenter', handleMouseEnter);
tooltip.$targetEl.on(support.pointerEvents ? 'pointerleave' : 'mouseleave', handleMouseLeave);
}
}
};
tooltip.detachEvents = function detachEvents() {
$el.off('transitionend', handleTransitionEnd);
if (tooltip.params.trigger === 'click') {
if (tooltip.params.delegated) {
(0, _dom.default)(document).on('click', tooltip.params.targetEl, handleClick);
} else {
tooltip.$targetEl.off('click', handleClick);
}
(0, _dom.default)('html').off('click', handleClickOut);
return;
}
if (tooltip.params.trigger === 'manual') return;
if (support.touch) {
var passive = support.passiveListener ? {
passive: true
} : false;
if (tooltip.params.delegated) {
(0, _dom.default)(document).off(app.touchEvents.start, tooltip.params.targetEl, handleTouchStart, passive);
} else {
tooltip.$targetEl.off(app.touchEvents.start, handleTouchStart, passive);
}
app.off('touchmove', handleTouchMove);
app.off('touchend:passive', handleTouchEnd);
} else {
// eslint-disable-next-line
if (tooltip.params.delegated) {
(0, _dom.default)(document).off(support.pointerEvents ? 'pointerenter' : 'mouseenter', tooltip.params.targetEl, handleMouseEnter, true);
(0, _dom.default)(document).off(support.pointerEvents ? 'pointerleave' : 'mouseleave', tooltip.params.targetEl, handleMouseLeave, true);
} else {
tooltip.$targetEl.off(support.pointerEvents ? 'pointerenter' : 'mouseenter', handleMouseEnter);
tooltip.$targetEl.off(support.pointerEvents ? 'pointerleave' : 'mouseleave', handleMouseLeave);
}
}
}; // Install Modules
tooltip.useModules();
tooltip.init();
return tooltip || _assertThisInitialized(_this);
}
var _proto = Tooltip.prototype;
_proto.setTargetEl = function setTargetEl(targetEl) {
var tooltip = this;
tooltip.detachEvents();
tooltip.$targetEl = (0, _dom.default)(targetEl);
tooltip.targetEl = tooltip.$targetEl[0];
tooltip.attachEvents();
return tooltip;
};
_proto.position = function position(targetEl) {
var tooltip = this;
var $el = tooltip.$el,
app = tooltip.app,
$containerEl = tooltip.$containerEl;
var hasContainerEl = !!tooltip.params.containerEl;
var tooltipOffset = tooltip.params.offset || 0;
$el.css({
left: '',
top: ''
});
var $targetEl = (0, _dom.default)(targetEl || tooltip.targetEl);
var _ref = [$el.width(), $el.height()],
width = _ref[0],
height = _ref[1];
$el.css({
left: '',
top: ''
});
var targetWidth;
var targetHeight;
var targetOffsetLeft;
var targetOffsetTop;
var boundaries = hasContainerEl && $containerEl.length ? $containerEl[0].getBoundingClientRect() : app;
if ($targetEl && $targetEl.length > 0) {
targetWidth = $targetEl.outerWidth();
targetHeight = $targetEl.outerHeight();
if (typeof targetWidth === 'undefined' && typeof targetHeight === 'undefined') {
var clientRect = $targetEl[0].getBoundingClientRect();
targetWidth = clientRect.width;
targetHeight = clientRect.height;
}
var targetOffset = $targetEl.offset();
targetOffsetLeft = targetOffset.left - boundaries.left;
targetOffsetTop = targetOffset.top - boundaries.top;
var targetParentPage = $targetEl.parents('.page');
if (targetParentPage.length > 0) {
targetOffsetTop -= targetParentPage[0].scrollTop;
}
}
var _ref2 = [0, 0, 0],
left = _ref2[0],
top = _ref2[1]; // Top Position
var position = 'top';
if (height + tooltipOffset < targetOffsetTop) {
// On top
top = targetOffsetTop - height - tooltipOffset;
} else if (height < boundaries.height - targetOffsetTop - targetHeight) {
// On bottom
position = 'bottom';
top = targetOffsetTop + targetHeight + tooltipOffset;
} else {
// On middle
position = 'middle';
top = targetHeight / 2 + targetOffsetTop - height / 2;
if (top <= 0) {
top = 8;
} else if (top + height >= boundaries.height) {
top = boundaries.height - height - 8;
}
} // Horizontal Position
if (position === 'top' || position === 'bottom') {
left = targetWidth / 2 + targetOffsetLeft - width / 2;
if (left < 8) left = 8;
if (left + width > boundaries.width) left = boundaries.width - width - 8;
if (left < 0) left = 0;
} else if (position === 'middle') {
left = targetOffsetLeft - width;
if (left < 8 || left + width > boundaries.width) {
if (left < 8) left = targetOffsetLeft + targetWidth;
if (left + width > boundaries.width) left = boundaries.width - width - 8;
}
} // Apply Styles
$el.css({
top: top + "px",
left: left + "px"
});
};
_proto.show = function show(aroundEl) {
var tooltip = this;
var $el = tooltip.$el,
$targetEl = tooltip.$targetEl,
$containerEl = tooltip.$containerEl;
if ($containerEl[0] && $el[0] && !$containerEl[0].contains($el[0])) {
$containerEl.append($el);
}
tooltip.position(aroundEl);
var $aroundEl = (0, _dom.default)(aroundEl);
tooltip.visible = true;
tooltip.opened = true;
$targetEl.trigger('tooltip:show');
$el.trigger('tooltip:show');
if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
$aroundEl.trigger('tooltip:show');
}
tooltip.emit('local::show tooltipShow', tooltip);
$el.removeClass('tooltip-out').addClass('tooltip-in');
return tooltip;
};
_proto.hide = function hide() {
var tooltip = this;
var $el = tooltip.$el,
$targetEl = tooltip.$targetEl;
tooltip.visible = false;
tooltip.opened = false;
$targetEl.trigger('tooltip:hide');
$el.trigger('tooltip:hide');
tooltip.emit('local::hide tooltipHide', tooltip);
$el.addClass('tooltip-out').removeClass('tooltip-in');
return tooltip;
};
_proto.render = function render() {
var tooltip = this;
if (tooltip.params.render) return tooltip.params.render.call(tooltip, tooltip);
var _tooltip$params2 = tooltip.params,
cssClass = _tooltip$params2.cssClass,
text = _tooltip$params2.text;
return ("\n <div class=\"tooltip " + (cssClass || '') + "\">\n <div class=\"tooltip-content\">" + (text || '') + "</div>\n </div>\n ").trim();
};
_proto.setText = function setText(newText) {
var tooltip = this;
if (typeof newText === 'undefined') {
return tooltip;
}
tooltip.params.text = newText;
tooltip.text = newText;
if (tooltip.$el) {
tooltip.$el.children('.tooltip-content').html(newText);
}
if (tooltip.opened) {
tooltip.position();
}
return tooltip;
};
_proto.init = function init() {
var tooltip = this;
tooltip.attachEvents();
};
_proto.destroy = function destroy() {
var tooltip = this;
if (!tooltip.$targetEl || tooltip.destroyed) return;
tooltip.$targetEl.trigger('tooltip:beforedestroy');
tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
tooltip.$el.remove();
if (tooltip.$targetEl[0]) delete tooltip.$targetEl[0].f7Tooltip;
tooltip.detachEvents();
(0, _utils.deleteProps)(tooltip);
tooltip.destroyed = true;
};
return Tooltip;
}(_class.default);
var _default = Tooltip;
exports.default = _default;