{"version":3,"file":"Overlay.js","names":["Overlay","a","setters","Component","default","Event","on","animate","deepMerge","execute","constructor","element","options","arguments","length","preventClick","classNames","active","animationEnter","animationLeave","closeTimeout","initState","state","isClosed","isClosing","keepOpened","bindEvents","onClick","bind","open","close","once","onClose","closeCallback","classList","add","emit","contains","remove","then"],"sources":["components/global/Overlay.js"],"sourcesContent":["import Component from 'core/Component';\nimport { Event } from 'services/EventEmitter';\nimport { on } from 'toolbox/event';\nimport { animate } from 'toolbox/animate';\nimport { deepMerge } from 'toolbox/deepMerge';\n\n/**\n * This is a description of the Overlay constructor function.\n * @class\n * @classdesc This is a description of the Overlay class.\n * @extends Component\n */\nexport default class Overlay extends Component {\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 preventClick: false,\n classNames: {\n active: 'm-active',\n animationEnter: 'h-fade-in',\n animationLeave: 'h-fade-out',\n },\n }, options));\n this.closeTimeout = null;\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.isClosed = true;\n this.state.isClosing = false;\n this.state.keepOpened = false;\n this.state.preventClick = this.options.preventClick;\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 on('click', this.element, this.onClick.bind(this));\n\n Event.on('overlay.open', this.open, this);\n Event.on('overlay.close', this.close, this);\n }\n\n /**\n * Click on the overlay would close it.\n */\n onClick() {\n if (this.state.isClosing || this.state.isClosed || this.state.preventClick) {\n return;\n }\n\n this.close();\n }\n\n /**\n * Open overlay\n *\n * @param {Object} options - Options that can be passed when opening\n */\n open(options = {}) {\n // It happens that open and close methods are called at the same time.\n // In this case, we wait the close to happen and open back the overlay.\n if (this.state.isClosing) {\n Event.once('overlay.close.after', this.open.bind(this, options), this);\n }\n\n // When one component with overlay is calling another component with overlay we don't need to close the overlay\n // after the second component is closed to avoid the animation glitch.\n // We still need to trigger the overlay.close.before event on close so that the overlay owner component\n // can perform onClose actions if the close sequence is initiated by the click on the overlay.\n this.state.keepOpened = !!options.keepOpened;\n\n if (!this.state.isClosed) {\n return;\n }\n this.state.preventClick = !!options.preventClick;\n\n if (typeof options.onClose === 'function') {\n this.closeCallback = options.onClose;\n }\n\n const {\n active,\n animationEnter,\n } = this.options.classNames;\n\n this.state.isClosed = false;\n this.element.classList.add(active);\n\n animate(animationEnter, this.element);\n }\n\n /**\n * Close the modal\n *\n * @param {Object} options That belongs to the component\n */\n close(options) {\n if (this.state.isClosed || this.state.isClosing) {\n return;\n }\n if (this.state.keepOpened) {\n Event.emit('overlay.close.before');\n this.state.keepOpened = false;\n return;\n }\n this.state.isClosing = true;\n // reset initial prevenClick value coming from options\n this.state.preventClick = this.options.preventClick;\n // in case if open and close methods are called at the same time\n // we need remove animationEnter class from overlay\n if (this.element.classList.contains(this.options.classNames.animationEnter)) {\n this.element.classList.remove(this.options.classNames.animationEnter);\n }\n Event.emit('overlay.close.before');\n animate(this.options.classNames.animationLeave, this.element).then(this.onClose.bind(this, options));\n }\n\n /**\n * onClose handler\n *\n * @param {Object} options That belongs to the component\n */\n onClose(options) {\n this.element.classList.remove(this.options.classNames.active);\n\n if (options && typeof options.onClose === 'function') {\n options.onClose();\n }\n\n if (typeof this.closeCallback === 'function') {\n this.closeCallback();\n this.closeCallback = null;\n }\n\n this.state.isClosing = false;\n this.state.isClosed = true;\n Event.emit('overlay.close.after');\n }\n}\n"],"mappings":"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","ignoreList":[]}