document.getElementById('uploadForm').addEventListener('submit', async (e) => { e.preventDefault(); const fileEl = document.getElementById('csvfile'); if (!fileEl.files.length) return; const fd = new FormData(); fd.append('csvfile', fileEl.files[0]); const resEl = document.getElementById('uploadResult'); resEl.innerText = 'Enviando...'; try { const resp = await fetch('/upload', { method: 'POST', body: fd }); const data = await resp.json(); if (data.jobId) { // show progress bar document.getElementById('progressWrap').style.display = 'block'; pollJob(data.jobId); resEl.innerText = `Consultando viabilidade...`; } else if (data.error) { resEl.innerText = 'Erro: ' + data.error; } } catch (e) { resEl.innerText = 'Erro no upload'; } }); async function pollJob(jobId) { const resEl = document.getElementById('uploadResult'); const bar = document.getElementById('progressBar'); try { const resp = await fetch(`/status/${jobId}`); const j = await resp.json(); if (j.total && j.total > 0) { const pct = Math.round((j.processed / j.total) * 100); bar.style.width = pct + '%'; bar.innerText = `${pct}%`; } if (j.status === 'done') { bar.style.width = '100%'; bar.innerText = '100%'; resEl.innerHTML = `Concluído. Baixar arquivo processado`; return; } if (j.status === 'error') { resEl.innerText = 'Erro no processamento: ' + j.error; return; } // ainda processando setTimeout(() => pollJob(jobId), 1000); } catch (e) { resEl.innerText = 'Erro ao consultar status do job'; } } // consulta viabilidade por CEP e número document.getElementById('btnConsultaCep').addEventListener('click', async () => { const cep = document.getElementById('cep').value; const numero = document.getElementById('numero').value; const el = document.getElementById('consultaResult'); el.innerText = 'Consultando...'; try { // usar fetch ao invés de axios para evitar dependência no cliente const resp = await fetch('/viabilidade', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cep, numero }) }); if (!resp.ok) { const text = await resp.text().catch(() => ''); throw new Error(`Status ${resp.status} ${text}`); } const data = await resp.json(); if (data.distancia) { el.innerText = `Endereço: ${data.logradouro}, ${data.bairro}, ${data.cidade}/${data.estado}, ${data.cep}\nDistância: ${data.distancia}`; } else if (data.error) { el.innerText = 'Erro: ' + data.error; } else { el.innerText = 'Resposta inesperada da API'; console.log('Resposta completa:', data); } } catch (e) { console.error(e); el.innerText = 'Erro na consulta: ' + (e.message || e); } }); // baixar modelos // botão que inicia download dos dois modelos simultaneamente via endpoints document.addEventListener("DOMContentLoaded", () => { const btn = document.getElementById("card__button-download"); if (!btn) return; btn.addEventListener("click", (e) => { e.preventDefault(); // Baixar modelo de CEP const link1 = document.createElement('a'); link1.href = '/download-model/cep'; link1.download = 'modelo.viabilidade-cep.csv'; document.body.appendChild(link1); link1.click(); link1.remove(); // Baixar modelo de geolocalização const link2 = document.createElement('a'); link2.href = '/download-model/geo'; link2.download = 'modelo.viabilidade-geolocalizacao.csv'; document.body.appendChild(link2); link2.click(); link2.remove(); }); });