// Ajax Modal Load Script $(document).on('click', '.ajax-modal', function (e) { e.preventDefault(); const $trigger = $(this); let modalUrl = $trigger.data('modal-url'); const modalSize = $trigger.data('modal-size') || 'md'; const modalId = 'ajaxModal_' + new Date().getTime(); // -------- Optional bulk mode (activated via data-bulk="true") -------- if ($trigger.data('bulk') === true || $trigger.data('bulk') === 'true') { const selector = $trigger.data('bulk-selector') || '.bulk-select:checked'; const param = $trigger.data('bulk-param') || 'selected_ids[]'; const ids = Array.from(document.querySelectorAll(selector)).map(cb => cb.value); if (!ids.length) { alert('Please select at least one item.'); return; // abort opening modal } // Merge ids into existing query string safely const urlObj = new URL(modalUrl, window.location.href); ids.forEach(id => urlObj.searchParams.append(param, id)); // Preserve path + updated query (avoid absolute origin for relative AJAX) modalUrl = urlObj.pathname + (urlObj.search ? '?' + urlObj.searchParams.toString() : ''); } // -------------------------------------------------------------------- // Show loading spinner while fetching content const loadingSpinner = `