class AjaxForm { /** * @param {Event} event * @param {string} modalId * @return {Promise|boolean} */ static handleAjaxFormModal(event, modalId) { event.stopImmediatePropagation(); event.preventDefault(); if (app.getOperationInProgress()) { return false; } app.setRefreshingState(true); return this.handleModal(modalId); } static handleModal(modalId, additionalData = {}, callback = null) { let modal = document.getElementById(modalId); let form = modal.querySelector('form'); let reload = form.dataset.reload ?? true; let dismiss = form.dataset.bsDismiss ?? true; return AjaxForm.handleForm(form, additionalData, callback ? callback : (data) => { if ("success" === data.type) { if (dismiss) { Commons.hideModal(modalId) } if (reload) { location.reload(); } return; } let result = modal.querySelector('[data-result-ajax]'); result.textContent = data.message result.classList.remove('d-none'); }); } static handleForm(form, additionalData = {}, callback = null) { AjaxForm.convertDate(form); let json = this.toJSON(form, additionalData) return Commons.postBody(form.getAttribute('action'), json, callback); } static toJSON(form, additionalData = {}) { let formData = new FormData(form); let object = {}; formData.forEach((value, key) => { // Reflect.has in favor of: object.hasOwnProperty(key) if (!Reflect.has(object, key)) { object[key] = value; return; } if (!Array.isArray(object[key])) { object[key] = [object[key]]; } object[key].push(value); }); for (const [key, value] of Object.entries(additionalData)) { object[key] = value; } return JSON.stringify(object); } static convertDate(form) { form.querySelectorAll('input[type=datetime-local]') .forEach((el) => { el.nextElementSibling.value = Commons.toStandardDate(el.value) }) form.querySelectorAll('input[type=date]') .forEach((el) => { el.nextElementSibling.value = Commons.toStandardDate(el.value) }) } static post(rootNode, url, data, successCallback = null) { let enableSelectors = 'input:enabled, select:enabled, button:enabled'; let enabled = rootNode === null ? document.querySelectorAll(enableSelectors) : rootNode.querySelectorAll(enableSelectors); enabled.forEach(el => el.disabled = true); if (rootNode !== null) { rootNode.querySelector('.is-invalid')?.classList?.remove('is-invalid'); } fetch(`${url}?${data}`, Commons.getPostOptions('')) .then(response => response.json()) .then((json) => { if (successCallback) { successCallback(json, enabled); } else { Commons.handleAjaxResponse(json, enabled); } enabled.forEach(el => el.disabled = false); }) ; return false; } }