// Ajax Modal Load Script document.addEventListener('click', function (e) { const trigger = e.target.closest('.ajax-modal'); if (!trigger) { return; } e.preventDefault(); // Prefer data-modal-url, fallback to href const modalUrl = trigger.dataset.modalUrl || trigger.getAttribute('href') || '#'; const modalSize = trigger.dataset.modalSize || 'md'; const modalId = 'ajaxModal_' + Date.now(); // If no usable URL, bail if (!modalUrl || modalUrl === '#') { console.warn('ajax-modal: No modal URL found on trigger:', trigger); return; } const host = document.querySelector('.app-main') || document.body; // Show loading spinner while fetching content const spinner = document.createElement('div'); spinner.id = 'modal-loading-spinner'; spinner.className = 'text-center p-5'; spinner.innerHTML = ''; host.appendChild(spinner); function clearSpinner() { const el = document.getElementById('modal-loading-spinner'); if (el) { el.remove(); } } fetch(modalUrl, { method: 'GET', headers: { 'Accept': 'application/json' }, credentials: 'same-origin' }) .then(function (res) { if (!res.ok) { throw new Error('HTTP ' + res.status); } return res.json(); }) .then(function (response) { clearSpinner(); if (response.error) { alert(response.error); return; } const wrapper = document.createElement('div'); wrapper.className = 'modal fade'; wrapper.id = modalId; wrapper.tabIndex = -1; wrapper.innerHTML = '