{"version":3,"file":"QuickViewButton.js","names":["QuickViewButton","a","setters","Component","default","Event","on","off","deepMerge","getData","mix","AnalyticsMixin","LoaderMixin","execute","with","constructor","element","options","arguments","length","contentUrl","cssPath","ariaLabel","classNames","container","initCache","selectors","focusReturnElement","closest","querySelector","initState","state","isActive","bindEvents","onClick","bind","onKeyDown","e","preventDefault","sendProductClickToAnalytics","openModal","indexOf","key","pageID","page","id","url","emit","afterClose","afterOpen","isStackable","analytics","virtualPageURL","virtualPageTitle","removeLoader","destroy"],"sources":["components/product/QuickViewButton.js"],"sourcesContent":["import Component from 'core/Component';\nimport { Event } from 'services/EventEmitter';\nimport { on, off } from 'toolbox/event';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { getData } from 'services/DataLayer';\nimport { mix } from 'core/mixwith';\nimport AnalyticsMixin from 'mixins/Analytics';\nimport LoaderMixin from 'mixins/Loader';\n\n/**\n * This is a description of the QuickViewButton constructor function.\n * @class\n * @classdesc This is a description of the QuickViewButton class.\n * @extends Component\n */\nexport default class QuickViewButton extends mix(Component).with(AnalyticsMixin, LoaderMixin) {\n /**\n * Constructor of the class that mainly merge the options of the components\n *\n * @param {HTMLElement} element HTMLElement of the component\n * @param {Object} options That belongs to the component\n */\n constructor(element, options = {}) {\n super(element, deepMerge({\n contentUrl: null,\n cssPath: 'quickview.css',\n ariaLabel: null, // If defined, this copy will be used as the aria-label of a Modal\n classNames: {\n container: null,\n },\n }, options));\n }\n\n /**\n * All selectors must be cached. Never cache elements that are out of the component scope\n */\n initCache() {\n this.selectors.focusReturnElement = this.element.closest('[data-js-tile]').querySelector('[data-js-product-name]');\n }\n\n /**\n * Init the different state of the component\n * It helps to avoid heavy DOM manipulation\n */\n initState() {\n this.state.isActive = false;\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 anonymous function\n */\n bindEvents() {\n on('click', this.element, this.onClick.bind(this));\n on('keydown', this.element, this.onKeyDown.bind(this));\n }\n\n /**\n * Click event handler\n *\n * @param {Object} e - Event object\n */\n onClick(e) {\n e.preventDefault();\n\n if (this.state.isActive) {\n return;\n }\n\n this.sendProductClickToAnalytics(e);\n this.openModal(this.selectors.focusReturnElement);\n }\n\n /**\n * Function which is 'keydown' handler for Tab keydown\n * @param {EventObject} e - event object\n */\n onKeyDown(e) {\n if (['Enter', ' '].indexOf(e.key) !== -1) {\n this.sendProductClickToAnalytics(e);\n this.openModal(this.element);\n }\n }\n\n /**\n * Open modal pop-up with the content\n * @param {String} focusReturnElement - HTML\n */\n openModal(focusReturnElement) {\n const pageID = getData().page.id;\n let url = this.options.contentUrl;\n this.state.isActive = true;\n\n if (pageID === 'cart') {\n url = `${this.options.contentUrl}&cartPage=true`;\n }\n\n Event.emit('modal.open', {\n options: {\n cssPath: this.options.cssPath,\n contentUrl: url,\n classNames: {\n container: this.options.classNames.container,\n },\n ariaLabel: this.options.ariaLabel,\n afterClose: this.afterClose.bind(this),\n afterOpen: this.afterOpen.bind(this),\n isStackable: true,\n analytics: {\n virtualPageURL: this.analytics.virtualPageURL,\n virtualPageTitle: this.analytics.virtualPageTitle,\n },\n focusReturnElement,\n },\n });\n }\n\n /**\n * On Quick View modal 'closed' event handler\n */\n afterClose() {\n // need to check is element exist, because it can be removed in quickview modal,\n // after \"Add to cart\" button click is same modal\n if (this.element) {\n this.state.isActive = false;\n }\n }\n\n /**\n * On Quick View modal 'afterOpen' event handler\n */\n afterOpen() {\n this.removeLoader();\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 off('click', this.element);\n off('keydown', this.element);\n }\n}\n"],"mappings":"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","ignoreList":[]}