/* global $ */ const positionConfigurations = { left: { // Align the popover's right side to the target element. my: 'right', // Align the popover to the left side of the target element. at: 'left', // Force the popover to fit within the viewport. collision: 'fit', /** * Callback invoked by jQuery UI tooltip. * * @param {Object} position - The top and bottom position the popover * element should be set at. * @param {Object} element. - Additional size and position information * about the popover element and target. * @param {Object} elements.element - Has position and size related data * for the popover element itself. * @param {Object} elements.target - Has position and size related data * for the target element the popover displays from. */ using: function setPositionLeft(position, elements) { const { element, target } = elements; $('.jitsipopover').css({ display: 'table', left: position.left, top: position.top }); // Move additional padding to the right edge of the popover and // allow css to take care of width. The padding is used to maintain // a hover state between the target and the popover. $('.jitsipopover > .jitsipopover__menu-padding').css({ left: element.width }); // Find the distance from the top of the popover to the center of // the target and use that value to position the arrow to point to // it. const verticalCenterOfTarget = target.height / 2; const verticalDistanceFromTops = target.top - element.top; const verticalPositionOfTargetCenter = verticalDistanceFromTops + verticalCenterOfTarget; $('.jitsipopover > .arrow').css({ left: element.width, top: verticalPositionOfTargetCenter }); } }, top: { my: "bottom", at: "top", collision: "fit", using: function setPositionTop(position, elements) { var calcLeft = elements.target.left - elements.element.left + elements.target.width/2; $(".jitsipopover").css( {top: position.top, left: position.left, display: "table"}); $(".jitsipopover > .arrow").css({left: calcLeft}); $(".jitsipopover > .jitsipopover__menu-padding").css( {left: calcLeft - 50}); } } }; var JitsiPopover = (function () { /** * The default options */ const defaultOptions = { skin: 'white', content: '', hasArrow: true, onBeforePosition: undefined, position: 'top' }; /** * Constructs new JitsiPopover and attaches it to the element * @param element jquery selector * @param options the options for the popover. * - {Function} onBeforePosition - function executed just before * positioning the popover. Useful for translation. * @constructor */ function JitsiPopover(element, options) { this.options = Object.assign({}, defaultOptions, options); this.elementIsHovered = false; this.popoverIsHovered = false; this.popoverShown = false; element.data("jitsi_popover", this); this.element = element; this.template = this.getTemplate(); var self = this; this.element.on("mouseenter", function () { self.elementIsHovered = true; self.show(); }).on("mouseleave", function () { self.elementIsHovered = false; setTimeout(function () { self.hide(); }, 10); }); } /** * Returns template for popover */ JitsiPopover.prototype.getTemplate = function () { const { hasArrow, position, skin } = this.options; let arrow = ''; if (hasArrow) { arrow = '
'; } return ( `