42 lines
2.0 KiB
JavaScript
42 lines
2.0 KiB
JavaScript
// ═══════════════════════════════════════════════════════
|
|
// 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 ✓');
|
|
}
|
|
|