{"version":3,"file":"EventTrigger.js","names":["EventTrigger","a","setters","Component","default","mix","Event","on","off","trigger","deepMerge","AnalyticsMixin","Accessibility","EventCatcherMixin","execute","with","constructor","element","options","arguments","length","reloadEvent","reloadData","keyTriggerCode","event","data","isDelegate","isLocalEvent","skipEnablingAfterInit","trackFocusedElements","triggerAfterInit","afterOpenEventName","reloadDataValueKey","confirmationModal","displayAnalytics","updateEvent","arrayMerge","target","source","bindEvents","onTriggerEvent","bind","onKeyDown","isCustomReloadEvent","onCustomReloadEvent","onReloadEvent","onUpdateEvent","onTrigger","getTargetElement","saveLastFocusState","afterOpen","emit","skipPreventDefault","preventDefault","stopPropagation","setTimeout","analyticsData","analytics","getAnalyticsAttributeData","sendAnalytics","afterConfirm","type","afterInit","restoreLastFocusState","enableElement","_lazyload","dynamic","bubbles","cancelable","classList","remove","removeAttribute","includes","key","detail","reload","closest","e","model","dataModelId","render","destroy"],"sources":["components/global/EventTrigger.js"],"sourcesContent":["/* eslint complexity: off */\nimport Component from 'core/Component';\nimport { mix } from 'core/mixwith';\nimport { Event } from 'services/EventEmitter';\nimport { on, off, trigger } from 'toolbox/event';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport AnalyticsMixin from 'mixins/Analytics';\nimport Accessibility from 'mixins/Accessibility';\nimport EventCatcherMixin from 'mixins/EventCatcher';\n\n/**\n * This is a description of the EventTrigger constructor function.\n * @class\n * @classdesc This is a description of the EventTrigger class.\n * @extends Component\n */\nexport default class EventTrigger extends mix(Component).with(AnalyticsMixin, Accessibility, EventCatcherMixin) {\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 trigger: 'click',\n reloadEvent: null,\n reloadData: null,\n keyTriggerCode: ['Enter', ' '],\n event: null,\n data: {},\n isDelegate: false,\n isLocalEvent: false,\n skipEnablingAfterInit: false,\n trackFocusedElements: false, // if true, tracks focused elements\n triggerAfterInit: false, // if true, triggers the event after the component is initialized\n afterOpenEventName: null, // the name of the event to be triggered after the triggered element is open\n reloadDataValueKey: null, // key for reload event data attribute which will be sent as \"data\" during reload\n confirmationModal: null, // confirmation modal\n displayAnalytics: null, // display analytics\n updateEvent: null, // the event name during which the component will be updated\n }, options, {\n arrayMerge: (target, source) => source,\n }));\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(this.options.trigger, this.element, this.onTriggerEvent.bind(this));\n\n if (this.options.keyTriggerCode.length > 0) {\n on('keydown', this.element, this.onKeyDown.bind(this));\n }\n\n if (this.options.isCustomReloadEvent) {\n Event.on(this.options.reloadEvent, this.onCustomReloadEvent, this);\n } else if (this.options.reloadEvent && this.options.reloadData) {\n on(this.options.reloadEvent, this.element, this.onReloadEvent.bind(this));\n }\n\n if (this.options.updateEvent) {\n on(this.options.updateEvent, this.element, this.onUpdateEvent.bind(this));\n }\n }\n\n /**\n * @description Function handler called after the designated trigger event is fired.\n * @param {Object} event - handler event\n */\n onTrigger(event) {\n const target = this.getTargetElement(event.target);\n\n if (target) {\n if (this.options.trackFocusedElements) {\n this.saveLastFocusState();\n }\n\n if (this.options.event) {\n if (this.options.afterOpenEventName && this.options.data && this.options.data.options) {\n this.options.data.options.afterOpen = () => {\n Event.emit(this.options.afterOpenEventName);\n };\n }\n\n if (this.options.isLocalEvent) {\n trigger(this.options.event, this.element, this.options.data);\n } else {\n Event.emit(this.options.event, this.options.data);\n }\n }\n\n if (!this.options.skipPreventDefault) {\n event.preventDefault();\n }\n\n if (this.options.stopPropagation) {\n event.stopPropagation();\n }\n\n setTimeout(() => {\n // Get data-analytics object from the target element\n let analyticsData;\n\n if (this.options.isDelegate) {\n // In case of delegation, we merge the root component analytics with the target analytics to\n // prevent duplicating the same object many times\n analyticsData = deepMerge(this.analytics || {}, this.getAnalyticsAttributeData(target) || {});\n } else if (this.analytics) {\n analyticsData = this.analytics;\n }\n\n this.sendAnalytics(analyticsData);\n }, 0);\n }\n }\n\n /**\n * @description Function handler calls the trigger event directly or via a confirmation modal.\n * @param {Object} event - handler event\n */\n onTriggerEvent(event) {\n const { confirmationModal } = this.options;\n if (!confirmationModal) {\n this.onTrigger(event);\n } else {\n confirmationModal.afterConfirm = this.onTrigger.bind(this, event);\n Event.emit('modal.open', { type: 'Confirm', options: confirmationModal });\n }\n }\n\n /**\n * After init\n * Run any script after the component is fully initialized\n */\n afterInit() {\n if (this.options.trackFocusedElements) {\n this.restoreLastFocusState();\n }\n\n if (!this.options.skipEnablingAfterInit) {\n this.enableElement();\n }\n\n if (this.options.displayAnalytics && !this.options._lazyload) {\n this.sendAnalytics(this.options.displayAnalytics);\n }\n\n if (this.analytics && this.analytics.dynamic) {\n trigger('analytics.dynamic.update', this.element, { bubbles: true, analytics: this.analytics.dynamic });\n }\n\n if (this.options.triggerAfterInit) {\n trigger(this.options.trigger, this.element, { cancelable: true });\n }\n }\n\n /**\n * Enable Element\n * Remove loading class and disabled attribute once EventTrigger is fully initialized\n */\n enableElement() {\n this.element.classList.remove('m-loading');\n this.element.removeAttribute('disabled');\n }\n\n /**\n * KeyDown event handler\n *\n * @param {Object} event Event object\n */\n onKeyDown(event) {\n if (this.options.keyTriggerCode.includes(event.key)) {\n this.onTrigger(event);\n }\n }\n\n /**\n * Update event handler\n * @param {Object} event event object\n */\n onReloadEvent(event) {\n if (!this.options.reloadDataValueKey) {\n return;\n }\n\n const data = event.detail[this.options.reloadDataValueKey];\n\n if (data !== undefined) {\n this.reload({ data });\n }\n }\n\n /**\n * Update event handler for custom reload of component\n */\n onCustomReloadEvent() {\n this.reload();\n }\n\n /**\n * @description Method to get event target comparing to required selector\n * @param {HTMLElement} target Event target element\n * @returns {Object} correct target element\n */\n getTargetElement(target) {\n return this.options.isDelegate ? target.closest('[data-js-trigger]') : this.element;\n }\n\n /**\n * Update component when update event triggered\n * @param {Object} e - event data\n */\n onUpdateEvent(e) {\n const model = e.detail.data && e.detail.data[this.options.dataModelId];\n\n if (model) {\n this.render(model);\n }\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(this.options.trigger, this.element);\n if (this.options.keyTriggerCode.length > 0) {\n off('keydown', this.element);\n }\n\n if (this.options.isCustomReloadEvent) {\n Event.off(this.options.reloadEvent, this.onCustomReloadEvent, this);\n }\n\n if (this.options.reloadEvent && this.options.reloadData) {\n off(this.options.reloadEvent, this.element);\n }\n\n if (this.options.updateEvent) {\n off(this.options.updateEvent, this.element);\n }\n\n super.destroy();\n }\n}\n"],"mappings":"4OAgBqBA,CAAY,QAAAC,CAAA,oBAAAC,OAAA,WAAAD,CAAA,EAf1BE,CAAS,CAAAF,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACPI,CAAG,CAAAJ,CAAA,CAAHI,GAAG,WAAAJ,CAAA,EACHK,CAAK,CAAAL,CAAA,CAALK,KAAK,WAAAL,CAAA,EACLM,CAAE,CAAAN,CAAA,CAAFM,EAAE,CAAEC,CAAG,CAAAP,CAAA,CAAHO,GAAG,CAAEC,CAAO,CAAAR,CAAA,CAAPQ,OAAO,WAAAR,CAAA,EAChBS,CAAS,CAAAT,CAAA,CAATS,SAAS,WAAAT,CAAA,EACXU,CAAc,CAAAV,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACdW,CAAa,CAAAX,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACbY,CAAiB,CAAAZ,CAAA,CAAAG,OAAA,GAAAU,OAAA,SAAAA,CAAA,EAAAb,CAAA,WAQHD,CAAY,CAAlB,aAA2B,CAAAK,CAAG,CAACF,CAAS,CAAC,CAACY,IAAI,CAACJ,CAAc,CAAEC,CAAa,CAAEC,CAAiB,CAAE,CAM5GG,WAAWA,CAACC,CAAO,CAAgB,IAAd,CAAAC,CAAO,GAAAC,SAAA,CAAAC,MAAA,WAAAD,SAAA,IAAAA,SAAA,IAAG,CAAC,CAAC,CAC7B,KAAK,CAACF,CAAO,CAAEP,CAAS,CAAC,CACrBD,OAAO,CAAE,OAAO,CAChBY,WAAW,CAAE,IAAI,CACjBC,UAAU,CAAE,IAAI,CAChBC,cAAc,CAAE,CAAC,OAAO,CAAE,GAAG,CAAC,CAC9BC,KAAK,CAAE,IAAI,CACXC,IAAI,CAAE,CAAC,CAAC,CACRC,UAAU,GAAO,CACjBC,YAAY,GAAO,CACnBC,qBAAqB,GAAO,CAC5BC,oBAAoB,GAAO,CAC3BC,gBAAgB,GAAO,CACvBC,kBAAkB,CAAE,IAAI,CACxBC,kBAAkB,CAAE,IAAI,CACxBC,iBAAiB,CAAE,IAAI,CACvBC,gBAAgB,CAAE,IAAI,CACtBC,WAAW,CAAE,IACjB,CAAC,CAAEjB,CAAO,CAAE,CACRkB,UAAU,CAAEA,CAACC,CAAM,CAAEC,CAAM,GAAKA,CACpC,CAAC,CAAC,CACN,CAMAC,UAAUA,CAAA,CAAG,CACT,KAAK,CAACA,UAAU,CAAC,CAAC,CAElBhC,CAAE,CAAC,IAAI,CAACW,OAAO,CAACT,OAAO,CAAE,IAAI,CAACQ,OAAO,CAAE,IAAI,CAACuB,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CAE7B,CAAC,CAAtC,IAAI,CAACvB,OAAO,CAACK,cAAc,CAACH,MAAU,EACtCb,CAAE,CAAC,SAAS,CAAE,IAAI,CAACU,OAAO,CAAE,IAAI,CAACyB,SAAS,CAACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAGtD,IAAI,CAACvB,OAAO,CAACyB,mBAAmB,CAChCrC,CAAK,CAACC,EAAE,CAAC,IAAI,CAACW,OAAO,CAACG,WAAW,CAAE,IAAI,CAACuB,mBAAmB,CAAE,IAAI,CAAC,CAC3D,IAAI,CAAC1B,OAAO,CAACG,WAAW,EAAI,IAAI,CAACH,OAAO,CAACI,UAAU,EAC1Df,CAAE,CAAC,IAAI,CAACW,OAAO,CAACG,WAAW,CAAE,IAAI,CAACJ,OAAO,CAAE,IAAI,CAAC4B,aAAa,CAACJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAGzE,IAAI,CAACvB,OAAO,CAACiB,WAAW,EACxB5B,CAAE,CAAC,IAAI,CAACW,OAAO,CAACiB,WAAW,CAAE,IAAI,CAAClB,OAAO,CAAE,IAAI,CAAC6B,aAAa,CAACL,IAAI,CAAC,IAAI,CAAC,CAEhF,CAMAM,SAASA,CAACvB,CAAK,CAAE,CACb,KAAM,CAAAa,CAAM,CAAG,IAAI,CAACW,gBAAgB,CAACxB,CAAK,CAACa,MAAM,CAAC,CAE9CA,CAAM,GACF,IAAI,CAACnB,OAAO,CAACW,oBAAoB,EACjC,IAAI,CAACoB,kBAAkB,CAAC,CAAC,CAGzB,IAAI,CAAC/B,OAAO,CAACM,KAAK,GACd,IAAI,CAACN,OAAO,CAACa,kBAAkB,EAAI,IAAI,CAACb,OAAO,CAACO,IAAI,EAAI,IAAI,CAACP,OAAO,CAACO,IAAI,CAACP,OAAO,GACjF,IAAI,CAACA,OAAO,CAACO,IAAI,CAACP,OAAO,CAACgC,SAAS,CAAG,IAAM,CACxC5C,CAAK,CAAC6C,IAAI,CAAC,IAAI,CAACjC,OAAO,CAACa,kBAAkB,CAC9C,CAAC,EAGD,IAAI,CAACb,OAAO,CAACS,YAAY,CACzBlB,CAAO,CAAC,IAAI,CAACS,OAAO,CAACM,KAAK,CAAE,IAAI,CAACP,OAAO,CAAE,IAAI,CAACC,OAAO,CAACO,IAAI,CAAC,CAE5DnB,CAAK,CAAC6C,IAAI,CAAC,IAAI,CAACjC,OAAO,CAACM,KAAK,CAAE,IAAI,CAACN,OAAO,CAACO,IAAI,CAAC,EAIrD,CAAC,IAAI,CAACP,OAAO,CAACkC,kBAAkB,EAChC5B,CAAK,CAAC6B,cAAc,CAAC,CAAC,CAGtB,IAAI,CAACnC,OAAO,CAACoC,eAAe,EAC5B9B,CAAK,CAAC8B,eAAe,CAAC,CAAC,CAG3BC,UAAU,CAAC,IAAM,CAEb,GAAI,CAAAC,CAAa,CAEb,IAAI,CAACtC,OAAO,CAACQ,UAAU,CAGvB8B,CAAa,CAAG9C,CAAS,CAAC,IAAI,CAAC+C,SAAS,EAAI,CAAC,CAAC,CAAE,IAAI,CAACC,yBAAyB,CAACrB,CAAM,CAAC,EAAI,CAAC,CAAC,CAAC,CACtF,IAAI,CAACoB,SAAS,GACrBD,CAAa,CAAG,IAAI,CAACC,SAAS,EAGlC,IAAI,CAACE,aAAa,CAACH,CAAa,CACpC,CAAC,CAAE,CAAC,CAAC,CAEb,CAMAhB,cAAcA,CAAChB,CAAK,CAAE,CAClB,KAAM,CAAES,iBAAiB,CAAjBA,CAAkB,CAAC,CAAG,IAAI,CAACf,OAAO,CACrCe,CAAiB,EAGlBA,CAAiB,CAAC2B,YAAY,CAAG,IAAI,CAACb,SAAS,CAACN,IAAI,CAAC,IAAI,CAAEjB,CAAK,CAAC,CACjElB,CAAK,CAAC6C,IAAI,CAAC,YAAY,CAAE,CAAEU,IAAI,CAAE,SAAS,CAAE3C,OAAO,CAAEe,CAAkB,CAAC,CAAC,EAHzE,IAAI,CAACc,SAAS,CAACvB,CAAK,CAK5B,CAMAsC,SAASA,CAAA,CAAG,CACJ,IAAI,CAAC5C,OAAO,CAACW,oBAAoB,EACjC,IAAI,CAACkC,qBAAqB,CAAC,CAAC,CAG3B,IAAI,CAAC7C,OAAO,CAACU,qBAAqB,EACnC,IAAI,CAACoC,aAAa,CAAC,CAAC,CAGpB,IAAI,CAAC9C,OAAO,CAACgB,gBAAgB,EAAI,CAAC,IAAI,CAAChB,OAAO,CAAC+C,SAAS,EACxD,IAAI,CAACN,aAAa,CAAC,IAAI,CAACzC,OAAO,CAACgB,gBAAgB,CAAC,CAGjD,IAAI,CAACuB,SAAS,EAAI,IAAI,CAACA,SAAS,CAACS,OAAO,EACxCzD,CAAO,CAAC,0BAA0B,CAAE,IAAI,CAACQ,OAAO,CAAE,CAAEkD,OAAO,GAAM,CAAEV,SAAS,CAAE,IAAI,CAACA,SAAS,CAACS,OAAQ,CAAC,CAAC,CAGvG,IAAI,CAAChD,OAAO,CAACY,gBAAgB,EAC7BrB,CAAO,CAAC,IAAI,CAACS,OAAO,CAACT,OAAO,CAAE,IAAI,CAACQ,OAAO,CAAE,CAAEmD,UAAU,GAAO,CAAC,CAExE,CAMAJ,aAAaA,CAAA,CAAG,CACZ,IAAI,CAAC/C,OAAO,CAACoD,SAAS,CAACC,MAAM,CAAC,WAAW,CAAC,CAC1C,IAAI,CAACrD,OAAO,CAACsD,eAAe,CAAC,UAAU,CAC3C,CAOA7B,SAASA,CAAClB,CAAK,CAAE,CACT,IAAI,CAACN,OAAO,CAACK,cAAc,CAACiD,QAAQ,CAAChD,CAAK,CAACiD,GAAG,CAAC,EAC/C,IAAI,CAAC1B,SAAS,CAACvB,CAAK,CAE5B,CAMAqB,aAAaA,CAACrB,CAAK,CAAE,CACjB,GAAK,IAAI,CAACN,OAAO,CAACc,kBAAkB,EAIpC,KAAM,CAAAP,CAAI,CAAGD,CAAK,CAACkD,MAAM,CAAC,IAAI,CAACxD,OAAO,CAACc,kBAAkB,CAAC,CAEtD,SAAAP,CAAkB,EAClB,IAAI,CAACkD,MAAM,CAAC,CAAElD,IAAI,CAAJA,CAAK,CAAC,CAAC,CAE7B,CAKAmB,mBAAmBA,CAAA,CAAG,CAClB,IAAI,CAAC+B,MAAM,CAAC,CAChB,CAOA3B,gBAAgBA,CAACX,CAAM,CAAE,CACrB,MAAO,KAAI,CAACnB,OAAO,CAACQ,UAAU,CAAGW,CAAM,CAACuC,OAAO,CAAC,mBAAmB,CAAC,CAAG,IAAI,CAAC3D,OAChF,CAMA6B,aAAaA,CAAC+B,CAAC,CAAE,CACb,KAAM,CAAAC,CAAK,CAAGD,CAAC,CAACH,MAAM,CAACjD,IAAI,EAAIoD,CAAC,CAACH,MAAM,CAACjD,IAAI,CAAC,IAAI,CAACP,OAAO,CAAC6D,WAAW,CAAC,CAElED,CAAK,EACL,IAAI,CAACE,MAAM,CAACF,CAAK,CAEzB,CAMAG,OAAOA,CAAA,CAAG,CACNzE,CAAG,CAAC,IAAI,CAACU,OAAO,CAACT,OAAO,CAAE,IAAI,CAACQ,OAAO,CAAC,CACE,CAAC,CAAtC,IAAI,CAACC,OAAO,CAACK,cAAc,CAACH,MAAU,EACtCZ,CAAG,CAAC,SAAS,CAAE,IAAI,CAACS,OAAO,CAAC,CAG5B,IAAI,CAACC,OAAO,CAACyB,mBAAmB,EAChCrC,CAAK,CAACE,GAAG,CAAC,IAAI,CAACU,OAAO,CAACG,WAAW,CAAE,IAAI,CAACuB,mBAAmB,CAAE,IAAI,CAAC,CAGnE,IAAI,CAAC1B,OAAO,CAACG,WAAW,EAAI,IAAI,CAACH,OAAO,CAACI,UAAU,EACnDd,CAAG,CAAC,IAAI,CAACU,OAAO,CAACG,WAAW,CAAE,IAAI,CAACJ,OAAO,CAAC,CAG3C,IAAI,CAACC,OAAO,CAACiB,WAAW,EACxB3B,CAAG,CAAC,IAAI,CAACU,OAAO,CAACiB,WAAW,CAAE,IAAI,CAAClB,OAAO,CAAC,CAG/C,KAAK,CAACgE,OAAO,CAAC,CAClB,CACJ,CAAC","ignoreList":[]}