diff --git a/public/app.js b/public/app.js index ffa036f..3bdd70c 100644 --- a/public/app.js +++ b/public/app.js @@ -4983,13 +4983,39 @@ const initApp = () => { div.style.padding = '12px'; div.innerHTML = ` -
+
+
${escapeHtml(item.alunoName)}
${new Date(item.createdAt).toLocaleDateString('pt-BR')}
`; + const deleteBtn = div.querySelector('.delete-btn'); + deleteBtn.addEventListener('click', async (e) => { + e.stopPropagation(); + if (confirm(`Deseja realmente excluir a análise de desenho do aluno "${item.alunoName}"?`)) { + try { + const delResp = await fetch(`/api/garatujas/${item.id}`, { method: 'DELETE' }); + if (!delResp.ok) throw new Error('Falha ao deletar'); + alert('Análise deletada com sucesso.'); + loadGaratujasHistory(); + if (activeGaratujaReport && activeGaratujaReport.id === item.id) { + activeGaratujaReport = null; + garatujasAlunoInput.value = ''; + garatujaImgPreview.src = ''; + garatujaPreviewContainer.style.display = 'none'; + garatujaReportArea.innerHTML = ''; + garatujaResultArea.style.display = 'none'; + } + } catch (err) { + alert('Erro ao excluir análise: ' + err.message); + } + } + }); + div.addEventListener('click', async () => { try { const detailResp = await fetch(`/api/garatujas/${item.id}`); @@ -5242,13 +5268,38 @@ const initApp = () => { const previewText = lines.length > 60 ? lines.substring(0, 60) + '...' : lines; div.innerHTML = ` -
- 🏃‍♂️ ${escapeHtml(item.faixaEtaria.split(' ')[0])} (${item.faixaEtaria.includes('bem pequenas') ? 'Bem Pequenas' : (item.faixaEtaria.includes('pequenas') ? 'Pequenas' : 'Bebês')}) +
+ 🏃‍♂️ ${escapeHtml(item.faixaEtaria.split(' ')[0])} (${item.faixaEtaria.includes('bem pequenas') ? 'Bem Pequenas' : (item.faixaEtaria.includes('pequenas') ? 'Pequenas' : 'Bebês')}) +
Recursos: ${escapeHtml(previewText)}
${new Date(item.createdAt).toLocaleDateString('pt-BR')}
`; + const deleteBtn = div.querySelector('.delete-btn'); + deleteBtn.addEventListener('click', async (e) => { + e.stopPropagation(); + if (confirm(`Deseja realmente excluir esta atividade psicomotora do histórico?`)) { + try { + const delResp = await fetch(`/api/brincar-ativo/${item.id}`, { method: 'DELETE' }); + if (!delResp.ok) throw new Error('Falha ao deletar'); + alert('Atividade deletada com sucesso.'); + loadBrincarAtivoHistory(); + if (activeBrincarAtivoReport && activeBrincarAtivoReport.id === item.id) { + activeBrincarAtivoReport = null; + brincarAtivoFaixaSelect.value = ''; + brincarAtivoRecursosInput.value = ''; + brincarAtivoReportArea.innerHTML = ''; + brincarAtivoResultArea.style.display = 'none'; + } + } catch (err) { + alert('Erro ao excluir atividade: ' + err.message); + } + } + }); + div.addEventListener('click', async () => { try { const detailResp = await fetch(`/api/brincar-ativo/${item.id}`); diff --git a/server.js b/server.js index 573cdbb..516c44d 100644 --- a/server.js +++ b/server.js @@ -970,6 +970,47 @@ app.get('/api/garatujas/:id', requireAuth, async (req, res) => { } }); +app.delete('/api/garatujas/:id', requireAuth, async (req, res) => { + const { id } = req.params; + const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000'; + try { + const imageRes = await dbPool.query( + `SELECT image_url FROM escola.garatujas WHERE id = $1 AND usuario_id = $2`, + [id, usuarioId] + ); + + const dbRes = await dbPool.query( + `DELETE FROM escola.garatujas WHERE id = $1 AND usuario_id = $2`, + [id, usuarioId] + ); + if (dbRes.rowCount === 0) { + return res.status(404).json({ error: 'Análise não encontrada ou não pertence ao usuário.' }); + } + + if (imageRes.rows.length > 0 && imageRes.rows[0].image_url) { + const imgUrl = imageRes.rows[0].image_url; + if (imgUrl.startsWith('/generated-media/')) { + const fs = require('fs'); + const filename = imgUrl.replace('/generated-media/', ''); + const filepath = path.join(__dirname, 'public', 'generated-media', filename); + if (fs.existsSync(filepath)) { + try { + fs.unlinkSync(filepath); + } catch (unlinkErr) { + console.error('Erro ao deletar arquivo de imagem fisicamente:', unlinkErr); + } + } + } + } + + res.json({ success: true, message: 'Análise de desenho deletada com sucesso.' }); + } catch (err) { + console.error('Erro ao deletar garatuja:', err); + res.status(500).json({ error: 'Erro ao deletar análise.' }); + } +}); + + // ============================================================ // ROTAS DO BRINCARATIVO (CIRCUITOS PSICOMOTORES E BRINCADEIRAS) // ============================================================ @@ -1077,6 +1118,25 @@ app.get('/api/brincar-ativo/:id', requireAuth, async (req, res) => { } }); +app.delete('/api/brincar-ativo/:id', requireAuth, async (req, res) => { + const { id } = req.params; + const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000'; + try { + const dbRes = await dbPool.query( + `DELETE FROM escola.brincar_ativo WHERE id = $1 AND usuario_id = $2`, + [id, usuarioId] + ); + if (dbRes.rowCount === 0) { + return res.status(404).json({ error: 'Atividade não encontrada ou não pertence ao usuário.' }); + } + res.json({ success: true, message: 'Atividade deletada com sucesso.' }); + } catch (err) { + console.error('Erro ao deletar brincar-ativo:', err); + res.status(500).json({ error: 'Erro ao deletar atividade.' }); + } +}); + + // Rota GET para obter configurações do agente app.get('/api/agent-config', requireAuth, (req, res) => { const config = readAgentConfig();