{"version":3,"file":"EventCatcher.js","names":["Mixin","a","deepMerge","ajax","Event","getCSRF","execute","superclass","constructor","element","options","arguments","length","store","eventMap","bindEvents","Object","keys","forEach","eventName","addEventListener","onAjaxCall","bind","eventData","config","type","params","url","data","assign","detail","requestBody","JSON","stringify","csrf","name","token","method","body","then","response","fireEvents","emit","catch","destroy","removeEventListener"],"sources":["mixins/EventCatcher.js"],"sourcesContent":["import { Mixin } from 'core/mixwith';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { ajax } from 'toolbox/ajax';\nimport { Event } from 'services/EventEmitter';\nimport { getCSRF } from 'toolbox/csrf';\n\n/**\n * A mixin that catch the events, make an Ajax POST request and emit the events from the response.\n */\nexport default Mixin(superclass => class extends superclass {\n    /**\n     * @constructor\n     * @param {HTMLElement} element HTMLElement of the component\n     * @param {Object} options That belongs to the component\n     * @param {Object} store Store\n     */\n    constructor(element, options = {}, store) {\n        super(element, deepMerge({\n            eventMap: {},\n        }, options), store);\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        Object.keys(this.options.eventMap || {}).forEach((eventName) => {\n            this.element.addEventListener(eventName, this.onAjaxCall.bind(this));\n        });\n    }\n\n    /**\n     * Ajax call\n     * @param {Object} eventData - event data\n     */\n    onAjaxCall(eventData) {\n        const config = this.options.eventMap[eventData.type];\n        let params;\n        let url;\n\n        if (typeof config === 'string') {\n            url = config;\n        } else {\n            ({ params, url } = config);\n        }\n\n        const data = Object.assign(\n            {\n                eventName: eventData.type,\n            },\n            eventData.detail,\n            params,\n        );\n        const requestBody = {\n            data: JSON.stringify(data),\n        };\n        const csrf = getCSRF();\n\n        if (csrf) {\n            requestBody[csrf.name] = csrf.token;\n        }\n\n        ajax(url, {\n            method: 'POST',\n            body: requestBody,\n        })\n            .then((response) => {\n                (response.fireEvents || []).forEach((eventName) => {\n                    Event.emit(eventName);\n                });\n            })\n            .catch(() => {});\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        Object.keys(this.options.eventMap || {}).forEach((eventName) => {\n            this.element.removeEventListener(eventName, this.onAjaxCall.bind(this));\n        });\n    }\n});\n"],"mappings":"2LAASA,CAAK,CAAAC,CAAA,CAALD,KAAK,WAAAC,CAAA,EACLC,CAAS,CAAAD,CAAA,CAATC,SAAS,WAAAD,CAAA,EACTE,CAAI,CAAAF,CAAA,CAAJE,IAAI,WAAAF,CAAA,EACJG,CAAK,CAAAH,CAAA,CAALG,KAAK,WAAAH,CAAA,EACLI,CAAO,CAAAJ,CAAA,CAAPI,OAAO,GAAAC,OAAA,SAAAA,CAAA,EAAAL,CAAA,WAKDD,CAAK,CAACO,CAAU,EAAI,aAAc,CAAAA,CAAW,CAOxDC,WAAWA,CAACC,CAAO,CAAuB,IAArB,CAAAC,CAAO,GAAAC,SAAA,CAAAC,MAAA,EAAAD,SAAA,aAAAA,SAAA,IAAG,CAAC,CAAC,CAAEE,CAAK,GAAAF,SAAA,CAAAC,MAAA,CAAAD,SAAA,WACpC,KAAK,CAACF,CAAO,CAAEP,CAAS,CAAC,CACrBY,QAAQ,CAAE,CAAC,CACf,CAAC,CAAEJ,CAAO,CAAC,CAAEG,CAAK,CACtB,CAMAE,UAAUA,CAAA,CAAG,CACT,KAAK,CAACA,UAAU,CAAC,CAAC,CAElBC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACP,OAAO,CAACI,QAAQ,EAAI,CAAC,CAAC,CAAC,CAACI,OAAO,CAAEC,CAAS,EAAK,CAC5D,IAAI,CAACV,OAAO,CAACW,gBAAgB,CAACD,CAAS,CAAE,IAAI,CAACE,UAAU,CAACC,IAAI,CAAC,IAAI,CAAC,CACvE,CAAC,CACL,CAMAD,UAAUA,CAACE,CAAS,CAAE,CAClB,KAAM,CAAAC,CAAM,CAAG,IAAI,CAACd,OAAO,CAACI,QAAQ,CAACS,CAAS,CAACE,IAAI,CAAC,CAAC,GACjD,CAAAC,CAAM,CACNC,CAAG,CAEe,QAAQ,EAA1B,MAAO,CAAAH,CAAmB,CAC1BG,CAAG,CAAGH,CAAM,EAEX,CAAEE,MAAM,CAANA,CAAM,CAAEC,GAAG,CAAHA,CAAI,CAAC,CAAGH,CAAM,OAGvB,CAAAI,CAAI,CAAGZ,MAAM,CAACa,MAAM,CACtB,CACIV,SAAS,CAAEI,CAAS,CAACE,IACzB,CAAC,CACDF,CAAS,CAACO,MAAM,CAChBJ,CACJ,CAAC,CACKK,CAAW,CAAG,CAChBH,IAAI,CAAEI,IAAI,CAACC,SAAS,CAACL,CAAI,CAC7B,CAAC,CACKM,CAAI,CAAG7B,CAAO,CAAC,CAAC,CAElB6B,CAAI,GACJH,CAAW,CAACG,CAAI,CAACC,IAAI,CAAC,CAAGD,CAAI,CAACE,KAAK,EAGvCjC,CAAI,CAACwB,CAAG,CAAE,CACNU,MAAM,CAAE,MAAM,CACdC,IAAI,CAAEP,CACV,CAAC,CAAC,CACGQ,IAAI,CAAEC,CAAQ,EAAK,CAChB,CAACA,CAAQ,CAACC,UAAU,EAAI,EAAE,EAAEvB,OAAO,CAAEC,CAAS,EAAK,CAC/Cf,CAAK,CAACsC,IAAI,CAACvB,CAAS,CACxB,CAAC,CACL,CAAC,CAAC,CACDwB,KAAK,CAAC,IAAM,CAAC,CAAC,CACvB,CAMAC,OAAOA,CAAA,CAAG,CACN5B,MAAM,CAACC,IAAI,CAAC,IAAI,CAACP,OAAO,CAACI,QAAQ,EAAI,CAAC,CAAC,CAAC,CAACI,OAAO,CAAEC,CAAS,EAAK,CAC5D,IAAI,CAACV,OAAO,CAACoC,mBAAmB,CAAC1B,CAAS,CAAE,IAAI,CAACE,UAAU,CAACC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC,CACL,CACJ,CAAC,CAAC","ignoreList":[]}