-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMetricsCards.vue
121 lines (103 loc) · 4.47 KB
/
MetricsCards.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<template>
<div>
<!-- Exibe informações do eixo selecionado -->
<p>Eixo: {{ eixoSelecionado || 'Nenhum eixo selecionado' }}</p>
<!-- Exibe informações da localidade selecionada -->
<p>País: {{ paisNome || 'Não informado' }}</p>
<p>Estado: {{ estadoNome || 'Não informado' }}</p>
<p>Cidade: {{ cidadeNome || 'Não informado' }}</p>
<!-- Indicadores do País -->
<div v-if="indicadoresPais.length > 0">
<h4 class="text-lg font-semibold mt-4">Indicadores do País {{ paisNomeAPI }}</h4>
<div class="grid grid-cols-1 sm:grid-cols-4 gap-4">
<MetricsCard v-for="indicador in indicadoresPais" :key="indicador.nomeIndicador" :indicador="indicador"
:selectedLocalidade="paisNome" />
</div>
</div>
<!-- Indicadores do Estado -->
<div v-if="indicadoresEstado.length > 0">
<h4 class="text-lg font-semibold mt-4">Indicadores do Estado {{ estadoNomeAPI }}</h4>
<div class="grid grid-cols-1 sm:grid-cols-4 gap-4">
<MetricsCard v-for="indicador in indicadoresEstado" :key="indicador.nomeIndicador" :indicador="indicador"
:selectedLocalidade="estadoNome" />
</div>
</div>
<!-- Indicadores da Cidade -->
<div v-if="indicadoresCidade.length > 0">
<h4 class="text-lg font-semibold mt-4">Indicadores da Cidade {{ cidadeNomeAPI }}</h4>
<div class="grid grid-cols-1 sm:grid-cols-4 gap-4">
<MetricsCard v-for="indicador in indicadoresCidade" :key="indicador.nomeIndicador" :indicador="indicador"
:selectedLocalidade="cidadeNome" />
</div>
</div>
<!-- Mensagem se não houver indicadores -->
<p v-else>Nenhum indicador disponível para a localidade selecionada.</p>
</div>
</template>
<script setup lang="ts">
import { ref, computed, watch } from 'vue';
import { useNuxtApp } from '#app'; // Para acessar o axios
import { type AxiosInstance } from 'axios';
import { useInfoStore } from '~/stores/useInfoStore'; // Use o caminho correto da sua store
import MetricsCard from './MetricsCard.vue';
interface Valor {
data: string;
valor: number;
}
interface Indicador {
nomeIndicador: string; // ou 'nome' se for o caso
valores: Valor[];
}
// Usando a store Pinia
const store = useInfoStore();
// Computed para obter o nome do país, estado e cidade da store
const paisNome = computed(() => store.paisSelecionado?.nome || 'Não informado');
const estadoNome = computed(() => store.estadoSelecionado?.nome || 'Não informado');
const cidadeNome = computed(() => store.cidadeSelecionada?.nome || 'Não informado');
// Arrays para armazenar indicadores por localidade
const indicadoresPais = ref<Indicador[]>([]);
const indicadoresEstado = ref<Indicador[]>([]);
const indicadoresCidade = ref<Indicador[]>([]);
const paisNomeAPI = ref('Não informado');
const estadoNomeAPI = ref('Não informado');
const cidadeNomeAPI = ref('Não informado');
// Computed para obter o eixo selecionado
const eixoSelecionado = computed(() => store.eixoSelecionado);
// Função para carregar os indicadores
async function carregarIndicadores(cidadeId: number) {
const { $httpClient } = useNuxtApp(); // Acessa o axios
const httpClient = $httpClient as AxiosInstance;
try {
const response = await httpClient.get(`/indicadores/${cidadeId}`);
if (response.status === 200) {
console.log('Indicadores carregados com sucesso:', response.data);
const data = response.data;
// Computed para obter o nome do país, estado e cidade da API
paisNomeAPI.value = data.paisNome || 'Não informado';
estadoNomeAPI.value = data.estadoNome || 'Não informado';
cidadeNomeAPI.value = data.cidadeNome || 'Não informado';
// Preenche os arrays de indicadores (somente os indicadores)
indicadoresPais.value = (data.indicadoresPais || []) as Indicador[];
indicadoresEstado.value = (data.indicadoresEstado || []) as Indicador[];
indicadoresCidade.value = (data.indicadoresCidade || []) as Indicador[];
} else {
console.error('Erro na resposta ao carregar indicadores:', response.status);
}
} catch (error) {
console.error('Erro ao buscar os indicadores:', error);
}
}
// Watcher para detectar alterações na cidade selecionada
watch(
() => store.cidadeSelecionada,
(novaCidade) => {
if (novaCidade && novaCidade.codigo) {
carregarIndicadores(novaCidade.codigo);
}
},
{ immediate: true } // Dispara o watch ao montar o componente
);
</script>
<style scoped>
/* Estilos personalizados podem ser adicionados aqui */
</style>