/** * quick-add.js — Generic inline-form quick-add modal. * * Usage: add these attributes to any that triggered the modal let _submitBtn = null; // the submit button inside the loaded form let _saving = false; // ── Wire every matching select ──────────────────────────────────────────── function wireSelect(sel) { sel.addEventListener('change', function () { if (this.value !== '__new__') return; // Reset to blank so the select isn't stuck on __new__ if user cancels this.value = ''; openQuickAdd(this); }); } document.querySelectorAll('select[data-quick-add-url]').forEach(wireSelect); // Support selects injected after DOMContentLoaded (e.g. in modals) window.quickAddWire = wireSelect; // ── Open ───────────────────────────────────────────────────────────────── function openQuickAdd(selectEl) { _originSelect = selectEl; _saving = false; const url = selectEl.dataset.quickAddUrl; const title = selectEl.dataset.quickAddTitle || 'Add New'; modalTitle.textContent = title; modalBody.innerHTML = `
Loading\u2026
`; modalErrors.classList.add('d-none'); modalErrorList.innerHTML = ''; bsModal.show(); const inlineUrl = url.includes('?') ? url + '&inline=true' : url + '?inline=true'; fetch(inlineUrl, { headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(r => r.text()) .then(html => { modalBody.innerHTML = html; // Execute any