Implementação de filtros de Ano Letivo e Turma na modal de emissão e correção da query de crianças únicas para evitar erro de scalar

This commit is contained in:
2026-05-28 13:14:43 +00:00
parent 4beb018680
commit ad67652b7d
3 changed files with 152 additions and 14 deletions
+66 -8
View File
@@ -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 = '<option value="">Selecione a criança</option>' +
criancas.map(c => `<option value="${c}">${c}</option>`).join('');
(Array.isArray(criancas) ? criancas : []).map(c => `<option value="${c}" ${c === activeCrianca ? 'selected' : ''}>${c}</option>`).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 = '<option value="">Todos os anos</option>' +
(meta.anos || []).map(y => `<option value="${y}" ${y === activeAno ? 'selected' : ''}>${y}</option>`).join('');
}
if (emitirFilterTurma) {
emitirFilterTurma.innerHTML = '<option value="">Todas as turmas</option>' +
(meta.turmas || []).map(t => `<option value="${t}" ${t === activeTurma ? 'selected' : ''}>${t}</option>`).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 = '<option value="">Selecione o modelo</option>' +
modelos.map(m => `<option value="${m.id}">${m.nome}</option>`).join('');
(Array.isArray(modelos) ? modelos : []).map(m => `<option value="${m.id}" ${m.id == activeTemplate ? 'selected' : ''}>${m.nome}</option>`).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
})
});