|
|
@@ -63,6 +63,14 @@ const progresso = computed(() => {
|
|
|
return { total: totalAt, feitos, pct: Math.round((feitos / totalAt) * 100) };
|
|
|
});
|
|
|
|
|
|
+
|
|
|
+const resolvidoParaApi = computed(() =>
|
|
|
+ ["sim", "parcial", "nao", "indefinido"].includes(filtroResolvido.value) ? filtroResolvido.value : undefined
|
|
|
+);
|
|
|
+const statusCancelamentoParaApi = computed(() =>
|
|
|
+ filtroResolvido.value === "cancelou" || filtroResolvido.value === "ameacou" ? filtroResolvido.value : undefined
|
|
|
+);
|
|
|
+
|
|
|
function formatData(value) {
|
|
|
if (!value) return "";
|
|
|
const d = new Date(value);
|
|
|
@@ -75,16 +83,22 @@ function pct(parte, todo) {
|
|
|
return `${Math.round((parte / todo) * 100)}%`;
|
|
|
}
|
|
|
|
|
|
+let statsRequestId = 0;
|
|
|
+
|
|
|
async function carregarStats() {
|
|
|
+ const requestId = ++statsRequestId;
|
|
|
try {
|
|
|
- stats.value = await estatisticasAvaliacoes({
|
|
|
+ const resultado = await estatisticasAvaliacoes({
|
|
|
setor: filtroSetor.value || undefined,
|
|
|
- resolvido: filtroResolvido.value || undefined,
|
|
|
- sentimento: filtroSentimento.value === "cancelados" ? undefined : filtroSentimento.value || undefined,
|
|
|
- statusCancelamento: filtroSentimento.value === "cancelados" ? "cancelou" : undefined,
|
|
|
+ resolvido: resolvidoParaApi.value,
|
|
|
+ sentimento: filtroSentimento.value || undefined,
|
|
|
+ statusCancelamento: statusCancelamentoParaApi.value,
|
|
|
busca: filtroBusca.value.trim() || undefined
|
|
|
});
|
|
|
+ if (requestId !== statsRequestId) return;
|
|
|
+ stats.value = resultado;
|
|
|
} catch {
|
|
|
+ if (requestId !== statsRequestId) return;
|
|
|
stats.value = null;
|
|
|
}
|
|
|
}
|
|
|
@@ -98,7 +112,10 @@ async function carregarSetores() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+let listaRequestId = 0;
|
|
|
+
|
|
|
async function carregarLista() {
|
|
|
+ const requestId = ++listaRequestId;
|
|
|
carregando.value = true;
|
|
|
erro.value = "";
|
|
|
try {
|
|
|
@@ -106,18 +123,20 @@ async function carregarLista() {
|
|
|
page: page.value,
|
|
|
pageSize,
|
|
|
setor: filtroSetor.value || undefined,
|
|
|
- resolvido: filtroResolvido.value || undefined,
|
|
|
- sentimento: filtroSentimento.value === "cancelados" ? undefined : filtroSentimento.value || undefined,
|
|
|
- statusCancelamento: filtroSentimento.value === "cancelados" ? "cancelou" : undefined,
|
|
|
+ resolvido: resolvidoParaApi.value,
|
|
|
+ sentimento: filtroSentimento.value || undefined,
|
|
|
+ statusCancelamento: statusCancelamentoParaApi.value,
|
|
|
busca: filtroBusca.value.trim() || undefined,
|
|
|
ordenacao: filtroOrdenacao.value
|
|
|
});
|
|
|
+ if (requestId !== listaRequestId) return;
|
|
|
avaliacoes.value = r.results ?? [];
|
|
|
total.value = r.total ?? 0;
|
|
|
} catch (err) {
|
|
|
+ if (requestId !== listaRequestId) return;
|
|
|
erro.value = err?.message ?? "Falha ao carregar avaliações";
|
|
|
} finally {
|
|
|
- carregando.value = false;
|
|
|
+ if (requestId === listaRequestId) carregando.value = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -357,6 +376,8 @@ onBeforeUnmount(() => {
|
|
|
<option value="parcial">Parcial</option>
|
|
|
<option value="nao">Não resolvido</option>
|
|
|
<option value="indefinido">Indefinido</option>
|
|
|
+ <option value="cancelou">Cancelou</option>
|
|
|
+ <option value="ameacou">Quer cancelar</option>
|
|
|
</select>
|
|
|
<select
|
|
|
v-model="filtroSentimento"
|
|
|
@@ -368,7 +389,6 @@ onBeforeUnmount(() => {
|
|
|
<option value="neutro">Neutro</option>
|
|
|
<option value="negativo">Negativo</option>
|
|
|
<option value="indefinido">Indefinido</option>
|
|
|
- <option value="cancelados">Cancelados</option>
|
|
|
</select>
|
|
|
<BaseButton
|
|
|
variant="secondary"
|