// ═══════════════════════════════════════════════════════ // JSON ↔ CSV Converter // ═══════════════════════════════════════════════════════ let lastJsoncsvType = 'csv'; // track last conversion type for download async function jsonToCsv() { const input = document.getElementById('jsoncsvJsonInput').value.trim(); if (!input) return setStatus('jsoncsvStatus', 'error', 'Paste some JSON first.'); const d = await apiPost('/api/convert/json-to-csv', { json: input }); if (d.success) { document.getElementById('jsoncsvOutput').value = d.result; lastJsoncsvType = 'csv'; setStatus('jsoncsvStatus', 'success', `Converted ✓ — ${d.rows} rows, ${d.columns} columns`); } else setStatus('jsoncsvStatus', 'error', d.error); } async function csvToJson() { const input = document.getElementById('jsoncsvCsvInput').value.trim(); if (!input) return setStatus('jsoncsvStatus', 'error', 'Paste some CSV first.'); const d = await apiPost('/api/convert/csv-to-json', { csv: input }); if (d.success) { document.getElementById('jsoncsvOutput').value = JSON.stringify(d.result, null, 2); lastJsoncsvType = 'json'; setStatus('jsoncsvStatus', 'success', `Converted ✓ — ${d.result.length} records`); } else setStatus('jsoncsvStatus', 'error', d.error); } function downloadJsoncsvOutput() { const output = document.getElementById('jsoncsvOutput').value; if (!output) return setStatus('jsoncsvStatus', 'error', 'Nothing to download.'); const ext = lastJsoncsvType === 'csv' ? 'csv' : 'json'; const mime = lastJsoncsvType === 'csv' ? 'text/csv' : 'application/json'; const blob = new Blob([output], { type: mime }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = `converted.${ext}`; a.click(); URL.revokeObjectURL(a.href); setStatus('jsoncsvStatus', 'success', 'Downloaded ✓'); }