{"version":3,"file":"Loader.js","names":["Mixin","a","deepMerge","execute","superclass","constructor","element","options","arguments","length","store","classNames","loading","overlayLoading","loadTime","loadingStatusMessageDelay","initState","state","isLoading","overlay","loaderTimeout","addLoader","loadingClass","setTimeout","classList","add","addOverlayLoader","Object","assign","spinnerInContainer","overlayOptions","statusMessage","statusMessageTimeout","updateStatusMessage","removeLoader","clearTimeout","container","contains","removeChild","style","position","remove","target","className","document","createElement","appendChild","status","selectors","querySelector","getAttribute","statusMessageTimer","innerHTML"],"sources":["mixins/Loader.js"],"sourcesContent":["import { Mixin } from 'core/mixwith';\nimport { deepMerge } from 'toolbox/deepMerge';\n\n/**\n * A mixin that add loading feature to any component.\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 classNames: {\n loading: 'm-loading',\n overlayLoading: 'c-loader',\n },\n loadTime: 200, // Show loader after 'loadTime' value\n // if the loader is present for more than N ms the loading status will be announced to screen reader\n loadingStatusMessageDelay: 1000,\n }, options), store);\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 this.state.isLoading = false;\n this.state.overlay = null;\n this.state.loaderTimeout = null;\n }\n\n /**\n * Add the loader\n * @param {Object} element - HTML Node\n * @param {Object} options -loader options\n */\n addLoader(element, options) {\n if (this.state.isLoading) {\n return;\n }\n this.state.isLoading = true;\n const loadingClass = this.options.classNames.loading;\n\n this.state.loaderTimeout = setTimeout(() => {\n if (element) {\n element.classList.add(loadingClass);\n } else {\n this.element.classList.add(loadingClass);\n }\n }, this.options.loadTime);\n\n if (options && options.overlay) {\n this.addOverlayLoader(element, null, Object.assign({ spinnerInContainer: true }, options.overlayOptions || {}));\n }\n\n if (this.options.statusMessage) {\n this.state.statusMessageTimeout = setTimeout(() => {\n this.updateStatusMessage(this.options.statusMessage);\n }, this.options.loadingStatusMessageDelay);\n }\n }\n\n /**\n * Remove the loader\n * @param {Object} element - HTML Node\n */\n removeLoader(element) {\n if (!this.state) {\n return;\n }\n\n if (!this.state.isLoading) {\n return;\n }\n\n if (this.state.loaderTimeout) {\n clearTimeout(this.state.loaderTimeout);\n }\n if (this.state.statusMessageTimeout) {\n clearTimeout(this.state.statusMessageTimeout);\n }\n this.state.isLoading = false;\n const container = element || this.element;\n\n if (this.state.overlay) {\n if (container.contains(this.state.overlay)) {\n container.removeChild(this.state.overlay);\n }\n container.style.position = null;\n this.state.overlay = null;\n }\n container.classList.remove(this.options.classNames.loading);\n }\n\n /**\n * Add overlay with loader\n * @param {HTMLElement} target HTMLElement of the target, which should be covered with overlay,\n * if not provided, caller element is used\n * @param {String} className for overlay loader, if not provided default class names are used\n * @param {Object} options loader options spinnerInContainer to center it in the container not the in the full page\n */\n addOverlayLoader(target, className, options = {}) {\n if (!target) {\n target = this.element;\n }\n if (!this.state.overlay) {\n this.state.overlay = document.createElement('div');\n this.state.overlay.className = className || this.options.classNames.overlayLoading;\n if (!options.spinnerInContainer) {\n this.state.overlay.classList.add('m-icon-fixed');\n }\n }\n\n target.appendChild(this.state.overlay);\n target.style.position = 'relative';\n }\n\n /**\n * Update status message\n * @param {String|Boolean} status - new status, if a value is boolean then default processing or finished message uses\n */\n updateStatusMessage(status) {\n this.selectors.statusMessage = document.querySelector('[data-js-global-status-message]');\n\n if (this.selectors.statusMessage) {\n if (typeof status === 'boolean') {\n status = this.selectors.statusMessage.getAttribute(status ? 'data-processing-text' : 'data-finished-text');\n }\n\n if (this.statusMessageTimer) {\n clearTimeout(this.statusMessageTimer);\n }\n\n const { statusMessage } = this.selectors;\n statusMessage.innerHTML = status;\n this.statusMessageTimer = setTimeout(() => {\n statusMessage.innerHTML = '';\n }, 5000);\n }\n }\n});\n"],"mappings":"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","ignoreList":[]}