// ─── Savuki Drilling — Reports Module ───────────────────────────────────── import { apiFetch } from '../api.js'; import { navigate } from '../app.js'; const _sd = (id, v) => { const e = document.getElementById(id); if (e) e.disabled = v; }; const esc = v => (v || '').toString().replace(/&/g, '&').replace(//g, '>'); const fmt = n => (+n || 0).toLocaleString('en-ZA', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); const fmtD = d => { if (!d) return '—'; return new Date(d).toLocaleDateString('en-ZA', { day: '2-digit', month: 'short', year: 'numeric' }); }; const today = () => new Date().toISOString().slice(0, 10); const mStart = () => { const n = new Date(); return `${n.getFullYear()}-${String(n.getMonth() + 1).padStart(2, '0')}-01`; }; function pageShell(t, b) { return `${b}`; } function statCard(l, v, i, c = 'var(--navy)') { return `
${i}
${v}
${l}
`; } function spinner() { return `

Loading…

`; } function empty(m) { return `

${m}

`; } function pStat(l, v) { return `
${v}
${l}
`; } async function loadTeams(sel) { try { const t = await apiFetch('teams/list.php'); (t || []).forEach(x => { const o = document.createElement('option'); o.value = x.record_id; o.textContent = x.name; document.getElementById(sel)?.appendChild(o); }); } catch { } } function filterBar(id, extra = '') { return `
${extra}
`; } function printPage(title, summaryHtml, tableHtml) { const w = window.open('', '_blank'); w.document.write(`Savuki — ${esc(title)}

Savuki Drilling — ${esc(title)}

Generated: ${new Date().toLocaleString('en-ZA')}

${summaryHtml}
${tableHtml}