import Singleton from '../abstracts/Singleton'; /** * Allows attaching a loading class on elements that an AJAX request is targeting. * * @copyright 2021 Winter. * @author Ben Thomson */ export default class AttachLoading extends Singleton { /** * Defines dependenices. * * @returns {string[]} */ dependencies() { return ['request']; } /** * Defines listeners. * * @returns {Object} */ listens() { return { ajaxStart: 'ajaxStart', ajaxDone: 'ajaxDone', }; } ajaxStart(promise, request) { if (!request.element) { return; } if (request.element.tagName === 'FORM') { const loadElements = request.element.querySelectorAll('[data-attach-loading]'); if (loadElements.length > 0) { loadElements.forEach((element) => { element.classList.add(this.getLoadingClass(element)); }); } } else if (request.element.dataset.attachLoading !== undefined) { request.element.classList.add(this.getLoadingClass(request.element)); } } ajaxDone(data, request) { if (!request.element) { return; } if (request.element.tagName === 'FORM') { const loadElements = request.element.querySelectorAll('[data-attach-loading]'); if (loadElements.length > 0) { loadElements.forEach((element) => { element.classList.remove(this.getLoadingClass(element)); }); } } else if (request.element.dataset.attachLoading !== undefined) { request.element.classList.remove(this.getLoadingClass(request.element)); } } getLoadingClass(element) { return (element.dataset.attachLoading !== undefined && element.dataset.attachLoading !== '') ? element.dataset.attachLoading : 'wn-loading'; } }