114 lines
3.8 KiB
JavaScript
114 lines
3.8 KiB
JavaScript
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. <a href="/download/${jobId}">Baixar arquivo processado</a>`;
|
|
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();
|
|
});
|
|
});
|