// ── Shared caliber picker utilities ─────────────────────────────────────────── // Requires api.js loaded first. function esc(s) { if (s == null) return ''; return String(s) .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"'); } async function loadCalibersIntoSelect(selectEl) { selectEl.innerHTML = ''; try { const items = await apiGetAll('/calibers/?status=VERIFIED&page_size=1000'); selectEl.innerHTML = '' + items.map(c => ``).join(''); } catch(e) { selectEl.innerHTML = ''; } } // Returns HTML for a caliber // suggestId: id prefix for the suggest sub-form elements function buildCaliberPickerHtml(selectId, suggestId) { return `
Suggest new caliber
`; } async function addCaliberSuggestion(suggestId, selectId) { const alertEl = document.getElementById(suggestId + 'Alert'); alertEl.classList.add('d-none'); const name = document.getElementById(suggestId + 'Name')?.value?.trim(); const short = document.getElementById(suggestId + 'Short')?.value?.trim(); if (!name) { alertEl.textContent = 'Caliber name is required.'; alertEl.classList.remove('d-none'); return; } try { const payload = { name }; if (short) payload.short_name = short; const created = await apiPost('/calibers/', payload); const sel = document.getElementById(selectId); if (sel) { const opt = new Option(created.name, created.id, true, true); sel.appendChild(opt); } document.getElementById(suggestId).classList.add('d-none'); document.getElementById(suggestId + 'Name').value = ''; document.getElementById(suggestId + 'Short').value = ''; } catch(e) { alertEl.textContent = (e.data && formatErrors(e.data)) || 'Submission failed.'; alertEl.classList.remove('d-none'); } }