From ad67652b7dec23f90f29f60eb2984ef95b0b45e1 Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Thu, 28 May 2026 13:14:43 +0000 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20de=20filtros=20de=20A?= =?UTF-8?q?no=20Letivo=20e=20Turma=20na=20modal=20de=20emiss=C3=A3o=20e=20?= =?UTF-8?q?corre=C3=A7=C3=A3o=20da=20query=20de=20crian=C3=A7as=20=C3=BAni?= =?UTF-8?q?cas=20para=20evitar=20erro=20de=20scalar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/app.js | 74 +++++++++++++++++++++++++++++++++++++++----- public/index.html | 14 +++++++++ server.js | 78 +++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 152 insertions(+), 14 deletions(-) diff --git a/public/app.js b/public/app.js index 81a68ee..a8c867a 100644 --- a/public/app.js +++ b/public/app.js @@ -2672,6 +2672,8 @@ const initApp = () => { const btnEmitirRelatorio = document.getElementById('btnEmitirRelatorio'); const btnCloseEmitirModal = document.getElementById('btnCloseEmitirModal'); + const emitirFilterAno = document.getElementById('emitirFilterAno'); + const emitirFilterTurma = document.getElementById('emitirFilterTurma'); const emitirFilterCrianca = document.getElementById('emitirFilterCrianca'); const emitirFilterDataInicio = document.getElementById('emitirFilterDataInicio'); const emitirFilterDataFim = document.getElementById('emitirFilterDataFim'); @@ -2727,22 +2729,57 @@ const initApp = () => { }); } - // Carregar dados de filtros (crianças e templates) - async function loadFiltersData() { + // Buscar crianças com base nos filtros de Ano e Turma selecionados + async function loadChildrenList() { try { - const res = await fetch('/api/observacoes/criancas'); + const activeAno = emitirFilterAno ? emitirFilterAno.value : ''; + const activeTurma = emitirFilterTurma ? emitirFilterTurma.value : ''; + const activeCrianca = emitirFilterCrianca ? emitirFilterCrianca.value : ''; + + let url = '/api/observacoes/criancas'; + const params = []; + if (activeAno) params.push(`ano=${activeAno}`); + if (activeTurma) params.push(`turma=${encodeURIComponent(activeTurma)}`); + if (params.length > 0) url += '?' + params.join('&'); + + const res = await fetch(url); const criancas = await res.json(); emitirFilterCrianca.innerHTML = '' + - criancas.map(c => ``).join(''); + (Array.isArray(criancas) ? criancas : []).map(c => ``).join(''); } catch (err) { - console.error('Erro ao buscar crianças para filtros:', err); + console.error('Erro ao carregar lista de crianças:', err); + } + } + + // Carregar dados de filtros (anos, turmas, crianças e templates) + async function loadFiltersData() { + try { + const activeAno = emitirFilterAno ? emitirFilterAno.value : ''; + const activeTurma = emitirFilterTurma ? emitirFilterTurma.value : ''; + + const res = await fetch('/api/observacoes/metadata'); + const meta = await res.json(); + + if (emitirFilterAno) { + emitirFilterAno.innerHTML = '' + + (meta.anos || []).map(y => ``).join(''); + } + if (emitirFilterTurma) { + emitirFilterTurma.innerHTML = '' + + (meta.turmas || []).map(t => ``).join(''); + } + } catch (err) { + console.error('Erro ao buscar metadados de filtros:', err); } + await loadChildrenList(); + try { + const activeTemplate = emitirFilterTemplate ? emitirFilterTemplate.value : ''; const res = await fetch('/api/modelos'); const modelos = await res.json(); emitirFilterTemplate.innerHTML = '' + - modelos.map(m => ``).join(''); + (Array.isArray(modelos) ? modelos : []).map(m => ``).join(''); } catch (err) { console.error('Erro ao buscar modelos para filtros:', err); } @@ -2750,7 +2787,20 @@ const initApp = () => { updateObservationsCount(); } - // Ouvintes para atualizar contagem + // Ouvintes para atualizar contagem e filtros de criança + if (emitirFilterAno) { + emitirFilterAno.addEventListener('change', async () => { + await loadChildrenList(); + updateObservationsCount(); + }); + } + if (emitirFilterTurma) { + emitirFilterTurma.addEventListener('change', async () => { + await loadChildrenList(); + updateObservationsCount(); + }); + } + [emitirFilterCrianca, emitirFilterDataInicio, emitirFilterDataFim, emitirFilterTag, emitirFilterTemplate].forEach(el => { if (el) el.addEventListener('change', updateObservationsCount); }); @@ -2765,6 +2815,8 @@ const initApp = () => { const dataFim = emitirFilterDataFim ? emitirFilterDataFim.value : ''; const tag = emitirFilterTag ? emitirFilterTag.value : ''; const modeloId = emitirFilterTemplate ? emitirFilterTemplate.value : ''; + const ano = emitirFilterAno ? emitirFilterAno.value : ''; + const turma = emitirFilterTurma ? emitirFilterTurma.value : ''; if (!crianca || !modeloId) { emitirObsCountInfo.textContent = 'Escolha uma criança e um modelo para prosseguir.'; @@ -2779,6 +2831,8 @@ const initApp = () => { if (dataInicio) url += `&dataInicio=${dataInicio}`; if (dataFim) url += `&dataFim=${dataFim}`; if (tag) url += `&tags=${encodeURIComponent(tag)}`; + if (ano) url += `&ano=${ano}`; + if (turma) url += `&turma=${encodeURIComponent(turma)}`; const res = await fetch(url); const data = await res.json(); @@ -2808,6 +2862,8 @@ const initApp = () => { const dataFim = emitirFilterDataFim.value; const tag = emitirFilterTag.value; const modeloId = emitirFilterTemplate.value; + const ano = emitirFilterAno ? emitirFilterAno.value : ''; + const turma = emitirFilterTurma ? emitirFilterTurma.value : ''; if (!crianca || !modeloId) return; @@ -2829,7 +2885,9 @@ const initApp = () => { dataInicio, dataFim, tags: tag || undefined, - modeloId + modeloId, + ano, + turma }) }); diff --git a/public/index.html b/public/index.html index a82ba16..e1ea5e6 100644 --- a/public/index.html +++ b/public/index.html @@ -543,6 +543,20 @@
+
+ + +
+ +
+ + +
+