1
1
<script setup lang="ts">
2
- import { ref , watch , computed , onMounted } from ' vue'
2
+ import { computed , onMounted , ref , watch } from ' vue'
3
3
4
4
const estados = ref ([])
5
5
const municipios = ref ([])
@@ -8,6 +8,40 @@ const votosEsperados = ref({})
8
8
const selectedUF = ref (' ' )
9
9
const selectedMunicipio = ref (' ' )
10
10
const loading = ref (false )
11
+ const arquivosPorEstado = {
12
+ AC: [' eleitorado_local_votacao_2024_AC_part1.json' ],
13
+ AL: [' eleitorado_local_votacao_2024_AL_part1.json' ],
14
+ AM: [' eleitorado_local_votacao_2024_AM_part1.json' ],
15
+ AP: [' eleitorado_local_votacao_2024_AP_part1.json' ],
16
+ BA: [' eleitorado_local_votacao_2024_BA_part1.json' , ' eleitorado_local_votacao_2024_BA_part2.json' ],
17
+ CE: [' eleitorado_local_votacao_2024_CE_part1.json' ],
18
+ ES: [' eleitorado_local_votacao_2024_ES_part1.json' ],
19
+ GO: [' eleitorado_local_votacao_2024_GO_part1.json' ],
20
+ MA: [' eleitorado_local_votacao_2024_MA_part1.json' ],
21
+ MG: [' eleitorado_local_votacao_2024_MG_part1.json' , ' eleitorado_local_votacao_2024_MG_part2.json' ],
22
+ MS: [' eleitorado_local_votacao_2024_MS_part1.json' ],
23
+ MT: [' eleitorado_local_votacao_2024_MT_part1.json' ],
24
+ PA: [' eleitorado_local_votacao_2024_PA_part1.json' ],
25
+ PB: [' eleitorado_local_votacao_2024_PB_part1.json' ],
26
+ PE: [' eleitorado_local_votacao_2024_PE_part1.json' ],
27
+ PI: [' eleitorado_local_votacao_2024_PI_part1.json' ],
28
+ PR: [' eleitorado_local_votacao_2024_PR_part1.json' ],
29
+ RJ: [' eleitorado_local_votacao_2024_RJ_part1.json' , ' eleitorado_local_votacao_2024_RJ_part2.json' ],
30
+ RN: [' eleitorado_local_votacao_2024_RN_part1.json' ],
31
+ RO: [' eleitorado_local_votacao_2024_RO_part1.json' ],
32
+ RR: [' eleitorado_local_votacao_2024_RR_part1.json' ],
33
+ RS: [' eleitorado_local_votacao_2024_RS_part1.json' ],
34
+ SC: [' eleitorado_local_votacao_2024_SC_part1.json' ],
35
+ SE: [' eleitorado_local_votacao_2024_SE_part1.json' ],
36
+ SP: [
37
+ ' eleitorado_local_votacao_2024_SP_part1.json' ,
38
+ ' eleitorado_local_votacao_2024_SP_part2.json' ,
39
+ ' eleitorado_local_votacao_2024_SP_part3.json' ,
40
+ ' eleitorado_local_votacao_2024_SP_part4.json' ,
41
+ ],
42
+ TO: [' eleitorado_local_votacao_2024_TO_part1.json' ],
43
+ undefined: [' eleitorado_local_votacao_2024_undefined_part1.json' ],
44
+ }
11
45
12
46
// Função para buscar dados com cache no localStorage, mas evita cache se o tamanho for muito grande
13
47
async function fetchWithLocalStorage(key , url ) {
@@ -26,15 +60,18 @@ async function fetchWithLocalStorage(key, url) {
26
60
if (dataSize < maxLocalStorageSize ) {
27
61
try {
28
62
localStorage .setItem (key , JSON .stringify (data ))
29
- } catch (storageError ) {
63
+ }
64
+ catch (storageError ) {
30
65
console .warn (' Dados muito grandes para armazenar no localStorage:' , storageError )
31
66
}
32
- } else {
67
+ }
68
+ else {
33
69
console .warn (' Dados excedem o limite de 4MB. Não serão armazenados no localStorage.' )
34
70
}
35
71
36
72
return data
37
- } catch (error ) {
73
+ }
74
+ catch (error ) {
38
75
console .error (' Erro ao buscar os dados:' , error )
39
76
throw error
40
77
}
@@ -49,32 +86,38 @@ async function carregarEstados() {
49
86
sigla: estado .sigla ,
50
87
nome: estado .nome ,
51
88
}))
52
- } else {
89
+ }
90
+ else {
53
91
console .error (' Dados de estados não encontrados' )
54
92
}
55
- } catch (error ) {
93
+ }
94
+ catch (error ) {
56
95
console .error (' Erro ao carregar estados:' , error )
57
96
}
58
97
}
59
98
60
99
// Função para carregar os municípios com base no UF selecionado
61
- async function carregarMunicipios(siglaUF : string ) {
100
+ async function carregarMunicipios(siglaUF ) {
62
101
try {
63
- const data = await fetchWithLocalStorage (municipios_$ {siglaUF }, / municipios_$ {siglaUF }.json )
102
+ const data = await fetchWithLocalStorage (` municipios_${siglaUF } ` , ` /municipios_${siglaUF }.json ` )
64
103
if (data && data .municipios ) {
65
104
municipios .value = data .municipios .map (municipio => ({
66
105
nome: municipio .nome ,
67
106
codigo: municipio .codigo ,
68
107
}))
69
- } else {
70
- console .error (Nenhum munic ípio encontrado para $ {siglaUF })
108
+ }
109
+ else {
110
+ console .error (` Nenhum município encontrado para ${siglaUF } ` )
71
111
municipios .value = []
72
112
}
73
- } catch (error ) {
74
- console .error (Erro ao carregar munic ípios para $ {siglaUF }:, error )
113
+ }
114
+ catch (error ) {
115
+ console .error (` Erro ao carregar municípios para ${siglaUF }: ` , error )
75
116
}
76
117
}
77
- async function carregarLocaisVotacao(siglaUF : string ) {
118
+
119
+ // Função para carregar locais de votação de um estado, buscando múltiplos arquivos se necessário
120
+ async function carregarLocaisVotacao(siglaUF ) {
78
121
const cacheKey = ` locais_votacao_${siglaUF }_${selectedMunicipio .value } `
79
122
const votosCacheKey = ` votos_esperados_${selectedMunicipio .value } `
80
123
const cachedData = localStorage .getItem (cacheKey )
@@ -86,7 +129,7 @@ async function carregarLocaisVotacao(siglaUF: string) {
86
129
87
130
if (cachedData ) {
88
131
locaisVotacao .value = JSON .parse (cachedData )
89
- locaisVotacao .value .forEach (local => {
132
+ locaisVotacao .value .forEach (( local ) => {
90
133
if (! votosEsperados .value [local .nome ]) {
91
134
votosEsperados .value [local .nome ] = 0
92
135
}
@@ -96,54 +139,62 @@ async function carregarLocaisVotacao(siglaUF: string) {
96
139
97
140
loading .value = true
98
141
try {
99
- const data = await fetchWithLocalStorage (` locais_votacao_${siglaUF } ` , ` /locais/eleitorado_local_votacao_2024_${siglaUF }.json ` )
100
- if (data ) {
101
- const locaisAgrupados = data
102
- .filter (local => local .CD_MUNICIPIO === selectedMunicipio .value )
103
- .reduce ((acc , local ) => {
104
- const { NM_LOCAL_VOTACAO, DS_ENDERECO, NR_SECAO, QT_ELEITOR_SECAO } = local
105
- if (! acc [NM_LOCAL_VOTACAO ]) {
106
- acc [NM_LOCAL_VOTACAO ] = {
107
- nome: NM_LOCAL_VOTACAO ,
108
- endereco: DS_ENDERECO ,
109
- secoes: [],
110
- totalEleitores: 0 ,
111
- }
112
- }
113
- acc [NM_LOCAL_VOTACAO ].secoes .push (NR_SECAO )
114
- acc [NM_LOCAL_VOTACAO ].totalEleitores += Number (QT_ELEITOR_SECAO ) || 0
115
- return acc
116
- }, {})
142
+ // Verifica os arquivos associados ao estado selecionado
143
+ const arquivosEstado = arquivosPorEstado [siglaUF ] || []
144
+ const data = []
117
145
118
- const locaisArray = Object .values (locaisAgrupados )
119
- locaisVotacao .value = locaisArray
146
+ // Busca e concatena os dados de todos os arquivos de um estado
147
+ for (const arquivo of arquivosEstado ) {
148
+ const partialData = await fetchWithLocalStorage (` locais_votacao_${siglaUF }_${arquivo } ` , ` /locais/${arquivo } ` )
149
+ data .push (... partialData )
150
+ }
120
151
121
- // Inicializa votosEsperados para garantir que o objeto esteja preenchido
122
- locaisArray .forEach (local => {
123
- if (! votosEsperados .value [local .nome ]) {
124
- votosEsperados .value [local .nome ] = 0
152
+ const locaisAgrupados = data
153
+ .filter (local => local .CD_MUNICIPIO === selectedMunicipio .value )
154
+ .reduce ((acc , local ) => {
155
+ const { NM_LOCAL_VOTACAO, DS_ENDERECO, NM_BAIRRO, NR_SECAO, QT_ELEITOR_SECAO } = local
156
+ if (! acc [NM_LOCAL_VOTACAO ]) {
157
+ acc [NM_LOCAL_VOTACAO ] = {
158
+ nome: NM_LOCAL_VOTACAO ,
159
+ endereco: ` ${DS_ENDERECO }, ${NM_BAIRRO } ` ,
160
+ secoes: [],
161
+ totalEleitores: 0 ,
162
+ }
125
163
}
126
- })
164
+ acc [NM_LOCAL_VOTACAO ].secoes .push (NR_SECAO )
165
+ acc [NM_LOCAL_VOTACAO ].totalEleitores += Number (QT_ELEITOR_SECAO ) || 0
166
+ return acc
167
+ }, {})
127
168
128
- localStorage .setItem (cacheKey , JSON .stringify (locaisArray ))
129
- } else {
130
- console .error (' Nenhum local de votação encontrado para o município selecionado' )
131
- locaisVotacao .value = []
132
- }
133
- } catch (error ) {
169
+ const locaisArray = Object .values (locaisAgrupados )
170
+ locaisVotacao .value = locaisArray
171
+
172
+ // Inicializa votosEsperados para garantir que o objeto esteja preenchido
173
+ locaisArray .forEach ((local ) => {
174
+ if (! votosEsperados .value [local .nome ]) {
175
+ votosEsperados .value [local .nome ] = 0
176
+ }
177
+ })
178
+
179
+ localStorage .setItem (cacheKey , JSON .stringify (locaisArray ))
180
+ }
181
+ catch (error ) {
134
182
console .error (' Erro ao carregar locais de votação:' , error )
135
183
locaisVotacao .value = []
136
- } finally {
184
+ }
185
+ finally {
137
186
loading .value = false
138
187
}
139
188
}
140
189
190
+ // Função para validar a quantidade de votos esperados
141
191
function validarVotos(local , valor ) {
142
192
const votos = Number (valor )
143
193
144
194
if (votos > local .totalEleitores ) {
145
195
votosEsperados .value [local .nome ] = local .totalEleitores
146
- } else {
196
+ }
197
+ else {
147
198
votosEsperados .value [local .nome ] = votos
148
199
}
149
200
@@ -160,7 +211,6 @@ function validarVotos(local, valor) {
160
211
localStorage .setItem (cacheKey , JSON .stringify (votosCache ))
161
212
}
162
213
163
-
164
214
// Computed para somar os votos esperados
165
215
const somaVotosEsperados = computed (() => {
166
216
return Object .values (votosEsperados .value ).reduce ((acc , val ) => acc + Number (val ), 0 )
@@ -171,7 +221,8 @@ watch(selectedUF, (novoUF) => {
171
221
if (novoUF ) {
172
222
selectedMunicipio .value = ' '
173
223
carregarMunicipios (novoUF )
174
- } else {
224
+ }
225
+ else {
175
226
selectedMunicipio .value = ' '
176
227
municipios .value = []
177
228
}
@@ -218,34 +269,36 @@ onMounted(() => {
218
269
219
270
<!-- Lista de Locais de Votação agrupados -->
220
271
<v-card v-if =" !loading && locaisVotacao.length > 0" >
221
- <v-card-title >
222
- Locais de Votação - Total de Votos Esperados: {{ somaVotosEsperados.toLocaleString('pt-BR') }}
272
+ <v-card-title class =" d-flex justify-space-between align-center" >
273
+ <span >Locais de Votação</span >
274
+ <v-chip color =" green" text-color =" white" label >
275
+ Soma de votos: {{ somaVotosEsperados.toLocaleString('pt-BR') }}
276
+ </v-chip >
223
277
</v-card-title >
224
278
225
279
<v-list >
226
280
<v-row v-for =" (local, index) in locaisVotacao" :key =" index" class =" mb-4" >
227
- <!-- Coluna 1 : Detalhes do local -->
228
- <v-col cols =" 6 " >
281
+ <!-- Coluna Única : Detalhes do local e input para votos esperados -->
282
+ <v-col cols =" 12 " >
229
283
<v-list-item >
230
284
<v-list-item-title >{{ local.nome }}</v-list-item-title >
231
285
<v-list-item-subtitle >{{ local.endereco }}</v-list-item-subtitle >
232
286
<v-list-item-subtitle >Seções: {{ local.secoes.join(', ') }}</v-list-item-subtitle >
233
287
<v-list-item-subtitle >Total de Eleitores: {{ local.totalEleitores }}</v-list-item-subtitle >
288
+ <br >
289
+ <!-- Input para votos esperados -->
290
+ <v-text-field
291
+ v-model =" votosEsperados[local.nome]"
292
+ label =" Votos Esperados"
293
+ type =" number"
294
+ :error =" votosEsperados[local.nome] > local.totalEleitores"
295
+ :error-messages =" votosEsperados[local.nome] > local.totalEleitores ? 'Quantidade excede total de eleitores' : ''"
296
+ :max =" local.totalEleitores"
297
+ outlined
298
+ @input =" validarVotos(local, $event.target.value)"
299
+ />
234
300
</v-list-item >
235
- </v-col >
236
-
237
- <!-- Coluna 2: Input para votos esperados -->
238
- <v-col cols =" 6" >
239
- <v-text-field
240
- v-model =" votosEsperados[local.nome]"
241
- label =" Votos Esperados"
242
- type =" number"
243
- :error =" votosEsperados[local.nome] > local.totalEleitores"
244
- :error-messages =" votosEsperados[local.nome] > local.totalEleitores ? 'Quantidade excede total de eleitores' : ''"
245
- @input =" validarVotos(local, $event.target.value)"
246
- :max =" local.totalEleitores"
247
- outlined
248
- />
301
+ <v-divider /> <!-- Separador entre os locais -->
249
302
</v-col >
250
303
</v-row >
251
304
</v-list >
@@ -256,4 +309,4 @@ onMounted(() => {
256
309
Nenhum local de votação encontrado para o município selecionado.
257
310
</v-alert >
258
311
</v-container >
259
- </template >
312
+ </template >
0 commit comments