{"version":3,"file":"PopOver.js","names":["PopOver","a","setters","ToolTip","default","on","off","trigger","Event","ajax","debounce","deepMerge","isTouchDevice","execute","constructor","element","options","arguments","length","contentUrl","targetContent","autoCloseTimeout","showOnInit","showOnClick","enableAnalyticsOnShow","afterInit","showContent","initState","state","isContentHovered","isContentLoaded","wasContentShownOnce","closeTimer","isElementHovered","bindEvents","selectors","target","bind","concat","id","tooltip","onContentMouseEnter","onContentMouseLeave","close","onPopoverHide","getAttribute","hideContent","onClick","event","currentTarget","isActive","triggerAnalyticsOnClick","window","location","href","onMouseEnter","clearTimeout","onMouseLeave","keyBoardActions","obj","triggerAnalytics","analytics","emit","Object","keys","isForceContentLoad","isLoading","loadContent","loadTargetContent","isContentValid","text","url","addLoader","then","onLoadContent","catch","error","autoPosition","update","removeLoader","setContent","message","autoClose","Promise","reject","Error","targetElement","document","querySelector","innerHTML","onContentUpdated","parentNode","removeChild","response","initAccessibility","tooltipContent","hidePopOver","setTimeout","hideContentFromMouse","destroy"],"sources":["components/global/PopOver.js"],"sourcesContent":["import ToolTip from 'components/global/ToolTip';\nimport { on, off, trigger } from 'toolbox/event';\nimport { Event } from 'services/EventEmitter';\nimport { ajax } from 'toolbox/ajax';\nimport { debounce } from 'toolbox/debounce';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { isTouchDevice } from 'toolbox/device';\n\n/**\n * This is a description of the PopOver constructor function.\n * @class\n * @classdesc This is a description of the PopOver class.\n * @extends ToolTip\n */\nexport default class PopOver extends ToolTip {\n    /**\n     * Constructor of the class that mainly merge the options of the components\n     * @param {HTMLElement} element HTMLElement of the component\n     * @param {Object} options options that belongs to the component\n     */\n    constructor(element, options = {}) {\n        super(element, deepMerge({\n            contentUrl: null,\n            targetContent: null, // should be a unique selector\n            autoCloseTimeout: null,\n            showOnInit: false,\n            showOnClick: false, // show content on click (disable mouse enter/leave events)\n            enableAnalyticsOnShow: false,\n        }, options));\n    }\n\n    /**\n     * After init\n     * Run any script after the component is fully initialized\n     */\n    afterInit() {\n        super.afterInit();\n\n        if (this.options.showOnInit) {\n            this.showContent();\n        }\n    }\n\n    /**\n     * Init the different state of the component\n     * It helps to avoid heavy DOM manipulation\n     */\n    initState() {\n        super.initState();\n\n        this.state.isContentHovered = false;\n        this.state.isContentLoaded = false;\n        this.state.wasContentShownOnce = false;\n        this.state.closeTimer = null;\n        this.state.isElementHovered = true;\n    }\n\n    /**\n     * Should contain only event listeners and nothing else\n     * All the event handlers should be into a separated function. No usage of anonyous function\n     */\n    bindEvents() {\n        super.bindEvents();\n\n        on('popover.show', this.selectors.target, this.showContent.bind(this));\n        if (!isTouchDevice() && !this.options.showOnClick) {\n            on(`mouseenter.popover${this.id}`, this.tooltip, this.onContentMouseEnter.bind(this));\n            on(`mouseleave.popover${this.id}`, this.tooltip, debounce(this.onContentMouseLeave.bind(this), 100));\n        }\n\n        Event.on('modal.open', this.close, this);\n        Event.on('popover.hide.content', this.onPopoverHide, this);\n    }\n\n    /**\n     * Hide popover content event handler\n     * @param {String} id popover ID\n     */\n    onPopoverHide(id) {\n        if (!this.element || this.element.getAttribute('data-component-id') !== id) {\n            return;\n        }\n\n        this.hideContent();\n    }\n\n    /**\n     * Click event handler\n     * @param {Event} event - Event object\n     */\n    onClick(event) {\n        const currentTarget = this.selectors.target || event.target;\n\n        if (currentTarget.getAttribute('data-href') && this.state.isActive) {\n            this.triggerAnalyticsOnClick();\n\n            window.location.href = currentTarget.getAttribute('data-href');\n        }\n\n        super.onClick(event);\n    }\n\n    /**\n     * MouseEnter event handler\n     */\n    onMouseEnter() {\n        this.state.isElementHovered = true;\n\n        if (this.state.closeTimer) {\n            clearTimeout(this.state.closeTimer);\n            this.state.closeTimer = null;\n        }\n\n        super.onMouseEnter();\n    }\n\n    /**\n     * MouseLeave event handler\n     */\n    onMouseLeave() {\n        this.state.isElementHovered = false;\n        super.onMouseLeave();\n    }\n\n    /**\n     * ContentMouseEnter event handler\n     */\n    onContentMouseEnter() {\n        this.state.isContentHovered = true;\n    }\n\n    /**\n     * ContentMouseLeave event handler\n     */\n    onContentMouseLeave() {\n        this.close();\n    }\n\n    /**\n     * Shows/hides on keypress\n     * @param {Event} event - Event object\n     * @param {Object} obj - Code key object\n     */\n    keyBoardActions(event, obj) {\n        super.keyBoardActions(event, obj);\n    }\n\n    /**\n     * Trigger Analytics On ShowContent\n     */\n    triggerAnalytics() {\n        if (!this.analytics || !this.options.enableAnalyticsOnShow || this.state.wasContentShownOnce) {\n            return;\n        }\n\n        Event.emit('analytics.event', this.analytics);\n    }\n\n    /**\n     * Trigger Analytics On Click\n     */\n    triggerAnalyticsOnClick() {\n        if (this.analytics && Object.keys(this.analytics).length) {\n            Event.emit('analytics.event', this.analytics);\n        }\n    }\n\n    /**\n     * Shows a PopOver\n     *\n     * @param {Boolean} isForceContentLoad Indicates that content needs to force load from server despite the cached value\n     */\n    showContent(isForceContentLoad) {\n        if (this.state.isActive) {\n            return;\n        }\n\n        if (isForceContentLoad) {\n            this.state.isContentLoaded = false;\n        }\n\n        super.showContent();\n\n        this.triggerAnalytics();\n\n        this.state.wasContentShownOnce = true;\n\n        if (this.state.isContentLoaded || this.state.isLoading) {\n            return;\n        }\n\n        if (this.options.contentUrl) {\n            this.loadContent(this.options.contentUrl);\n        } else if (this.options.targetContent) {\n            this.loadTargetContent();\n        }\n    }\n\n    /**\n     * Content has to have at least text or text coming from a URL\n     *\n     * @returns {Boolean} True or False\n     */\n    isContentValid() {\n        const { text, contentUrl, targetContent } = this.options;\n        return text || contentUrl || targetContent;\n    }\n\n    /**\n     * Ajax request for the content\n     *\n     * @param {String} url - url to fetch content for a PopOver\n     * @returns {Promise} object\n     */\n    loadContent(url) {\n        if (!url) {\n            return Promise.reject(new Error('Popover has to have a URL set in order to load content'));\n        }\n\n        this.addLoader(this.tooltip);\n\n        return ajax(url)\n            .then(this.onLoadContent.bind(this))\n            .catch((error) => {\n                if (this.autoPosition) {\n                    this.autoPosition.update();\n                }\n                this.removeLoader(this.tooltip);\n                this.setContent(error.message);\n                this.autoClose();\n            });\n    }\n\n    /**\n     * Load content from a targetted element\n     */\n    loadTargetContent() {\n        if (this.state.isContentLoaded) {\n            return;\n        }\n\n        const targetElement = document.querySelector(this.options.targetContent);\n\n        if (!targetElement) {\n            return;\n        }\n\n        this.state.isContentLoaded = true;\n        this.setContent(targetElement.innerHTML);\n        this.onContentUpdated();\n        this.autoClose();\n\n        // remove original element\n        targetElement.parentNode.removeChild(targetElement);\n    }\n\n    /**\n     * Put a content to PopOver after request is resolved\n     * @param {string} response - HTML which inserts to PopOver\n     */\n    onLoadContent(response) {\n        this.state.isContentLoaded = true;\n        this.removeLoader(this.tooltip);\n        this.setContent(response);\n        this.onContentUpdated();\n        this.autoClose();\n        this.initAccessibility();\n        trigger('tooltip.checkcomponent', this.element);\n    }\n\n    /**\n     * Register children elements when content is updated\n     */\n    onContentUpdated() {\n        Event.emit('registry.registerChildren', this.selectors.tooltipContent);\n    }\n\n    /**\n     * Hides the PopOver if it is not in use.\n     * takes also account of the loading state and autoclose timer\n     */\n    hidePopOver() {\n        if (this.state.isElementHovered || this.state.isContentHovered || (this.state.isLoading && this.state.closeTimer)) {\n            return;\n        }\n        this.hideContent();\n    }\n\n    /**\n     * Hides a PopOver\n     */\n    close() {\n        this.state.isContentHovered = false;\n        if (this.options.autoCloseTimeout) {\n            this.autoClose();\n        } else {\n            this.hidePopOver();\n        }\n    }\n\n    /**\n     * Hides a PopOver after the specified delay\n     */\n    autoClose() {\n        if (this.options.autoCloseTimeout) {\n            this.state.closeTimer = setTimeout(() => {\n                this.state.closeTimer = null;\n                this.hidePopOver();\n            }, this.options.autoCloseTimeout);\n        }\n    }\n\n    /**\n     * Hide content on mouse iteraction\n     */\n    hideContentFromMouse() {\n        this.hidePopOver();\n    }\n\n    /**\n     * Destroy is called automatically after the component is being removed from the DOM\n     * You must always destroy the listeners attached to an element to avoid any memory leaks\n     */\n    destroy() {\n        super.destroy();\n        if (!isTouchDevice() && !this.options.showOnClick) {\n            off(this.tooltip);\n        }\n        Event.off('modal.open', this.close);\n        Event.off('popover.hide.content', this.onPopoverHide);\n    }\n}\n"],"mappings":"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","ignoreList":[]}