From 852713db003d66398b89a868b663ba2e8d9f8fcc Mon Sep 17 00:00:00 2001 From: admtracksteel Date: Sat, 6 Jun 2026 21:07:19 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Auto-deploy:=20Camila=20atualiza?= =?UTF-8?q?do=20em=2006/06/2026=2021:07:19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/app.js | 405 ++++++++++++++++++++++++++++++++++++++++++++++ public/index.html | 161 +++++++++++++++++- server.js | 215 ++++++++++++++++++++++++ 3 files changed, 780 insertions(+), 1 deletion(-) diff --git a/public/app.js b/public/app.js index 5b6a7be..9fc369d 100644 --- a/public/app.js +++ b/public/app.js @@ -6785,5 +6785,410 @@ document.addEventListener('DOMContentLoaded', () => { btnCloseMindLabHistory.addEventListener('click', () => { mindLabHistoryModal.style.display = 'none'; }); + }); + } + + // ============================================================ + // CRIAR CARTAZES + // ============================================================ + const barBtnCartazes = document.getElementById('barBtnCartazes'); + const cartazesModal = document.getElementById('cartazesModal'); + const btnCloseCartazesModal = document.getElementById('btnCloseCartazesModal'); + + const tabCartazesCriar = document.getElementById('tabCartazesCriar'); + const tabCartazesHistorico = document.getElementById('tabCartazesHistorico'); + const panelCartazesCriar = document.getElementById('panelCartazesCriar'); + const panelCartazesHistorico = document.getElementById('panelCartazesHistorico'); + + const cartazTituloInput = document.getElementById('cartazTituloInput'); + const cartazTemaInput = document.getElementById('cartazTemaInput'); + const cartazLayoutSelect = document.getElementById('cartazLayoutSelect'); + const cartazBgColor = document.getElementById('cartazBgColor'); + const cartazTextColor = document.getElementById('cartazTextColor'); + const cartazFontSelect = document.getElementById('cartazFontSelect'); + const cartazBorderSelect = document.getElementById('cartazBorderSelect'); + const cartazPromptImagem = document.getElementById('cartazPromptImagem'); + const btnGenerateCartaz = document.getElementById('btnGenerateCartaz'); + const cartazGenerateLoader = document.getElementById('cartazGenerateLoader'); + + const btnEditCartazToggle = document.getElementById('btnEditCartazToggle'); + const btnPrintCartaz = document.getElementById('btnPrintCartaz'); + const cartazEditArea = document.getElementById('cartazEditArea'); + const cartazHtmlEditor = document.getElementById('cartazHtmlEditor'); + const btnUpdateCartazPreview = document.getElementById('btnUpdateCartazPreview'); + + const cartazPrintableArea = document.getElementById('cartazPrintableArea'); + const cartazPreviewTitle = document.getElementById('cartazPreviewTitle'); + const cartazPreviewContent = document.getElementById('cartazPreviewContent'); + const cartazPreviewImageContainer = document.getElementById('cartazPreviewImageContainer'); + const cartazPreviewImage = document.getElementById('cartazPreviewImage'); + + const cartazesHistoryContainer = document.getElementById('cartazesHistoryContainer'); + const cartazesNoData = document.getElementById('cartazesNoData'); + + let activeCartazData = null; + + // Toggle Modal + if (barBtnCartazes) { + barBtnCartazes.addEventListener('click', () => { + cartazesModal.style.display = 'flex'; + switchCartazTab('criar'); + }); + } + + if (btnCloseCartazesModal) { + btnCloseCartazesModal.addEventListener('click', () => { + cartazesModal.style.display = 'none'; + }); + } + + cartazesModal.addEventListener('click', (e) => { + if (e.target === cartazesModal) cartazesModal.style.display = 'none'; + }); + + // Switch Tab + function switchCartazTab(tab) { + if (tab === 'criar') { + tabCartazesCriar.classList.add('active'); + tabCartazesHistorico.classList.remove('active'); + panelCartazesCriar.style.display = 'flex'; + panelCartazesHistorico.style.display = 'none'; + + tabCartazesCriar.style.color = 'var(--text-primary)'; + tabCartazesHistorico.style.color = 'var(--text-secondary)'; + } else { + tabCartazesCriar.classList.remove('active'); + tabCartazesHistorico.classList.add('active'); + panelCartazesCriar.style.display = 'none'; + panelCartazesHistorico.style.display = 'flex'; + + tabCartazesCriar.style.color = 'var(--text-secondary)'; + tabCartazesHistorico.style.color = 'var(--text-primary)'; + loadCartazesHistory(); + } + } + + if (tabCartazesCriar) tabCartazesCriar.addEventListener('click', () => switchCartazTab('criar')); + if (tabCartazesHistorico) tabCartazesHistorico.addEventListener('click', () => switchCartazTab('historico')); + + // Live Style Updates + function updateLivePreview() { + const bg = cartazBgColor.value; + const text = cartazTextColor.value; + const font = cartazFontSelect.value; + const border = cartazBorderSelect.value; + const title = cartazTituloInput.value.trim() || 'Título do Cartaz'; + + cartazPrintableArea.style.backgroundColor = bg; + cartazPrintableArea.style.color = text; + cartazPrintableArea.style.fontFamily = font; + cartazPreviewTitle.textContent = title; + cartazPreviewTitle.style.borderColor = text; + + if (border === 'none') { + cartazPrintableArea.style.border = 'none'; + } else { + cartazPrintableArea.style.border = `${border} ${text}`; + } + } + + [cartazBgColor, cartazTextColor, cartazFontSelect, cartazBorderSelect, cartazTituloInput].forEach(elem => { + if (elem) elem.addEventListener('input', updateLivePreview); + }); + + // Preset Palettes + document.querySelectorAll('.btn-palette-preset').forEach(btn => { + btn.addEventListener('click', (e) => { + const bg = e.target.dataset.bg; + const text = e.target.dataset.text; + cartazBgColor.value = bg; + cartazTextColor.value = text; + updateLivePreview(); + }); + }); + + // Toggle HTML Editor + if (btnEditCartazToggle) { + btnEditCartazToggle.addEventListener('click', () => { + if (cartazEditArea.style.display === 'none') { + cartazEditArea.style.display = 'flex'; + btnEditCartazToggle.textContent = '👁️ Ocultar Editor'; + } else { + cartazEditArea.style.display = 'none'; + btnEditCartazToggle.textContent = '✏️ Editar Conteúdo'; + } + }); + } + + // Update from Editor + if (btnUpdateCartazPreview) { + btnUpdateCartazPreview.addEventListener('click', () => { + cartazPreviewContent.innerHTML = cartazHtmlEditor.value; + }); + } + + // Generate Poster + if (btnGenerateCartaz) { + btnGenerateCartaz.addEventListener('click', async () => { + const titulo = cartazTituloInput.value.trim(); + const tema = cartazTemaInput.value.trim(); + const layout = cartazLayoutSelect.value; + const promptImagem = cartazPromptImagem.value.trim(); + + if (!titulo || !tema) { + showToast('Por favor, defina o Título e o Tema do Cartaz.', 'error'); + return; + } + + btnGenerateCartaz.disabled = true; + cartazGenerateLoader.style.display = 'flex'; + + try { + const res = await fetch('/api/cartazes/generate', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${localStorage.getItem('token')}` + }, + body: JSON.stringify({ + titulo, + tema, + corFundo: cartazBgColor.value, + corTexto: cartazTextColor.value, + layout, + promptImagem + }) + }); + + const data = await res.json(); + if (res.ok) { + activeCartazData = data; + + // Preencher Preview + cartazPreviewContent.innerHTML = data.conteudo; + cartazHtmlEditor.value = data.conteudo; + + if (data.imagemUrl) { + cartazPreviewImage.src = data.imagemUrl; + cartazPreviewImageContainer.style.display = 'block'; + } else { + cartazPreviewImageContainer.style.display = 'none'; + } + + updateLivePreview(); + showToast('Cartaz criado e salvo com sucesso!', 'success'); + } else { + showToast(data.error || 'Erro ao gerar cartaz.', 'error'); + } + } catch (err) { + console.error(err); + showToast('Erro ao se conectar com o servidor.', 'error'); + } finally { + btnGenerateCartaz.disabled = false; + cartazGenerateLoader.style.display = 'none'; + } + }); + } + + // Print Poster + if (btnPrintCartaz) { + btnPrintCartaz.addEventListener('click', () => { + const title = cartazTituloInput.value.trim() || 'Cartaz Pedagógico'; + const bg = cartazBgColor.value; + const text = cartazTextColor.value; + const font = cartazFontSelect.value; + const border = cartazBorderSelect.value; + const imgContainerHtml = cartazPreviewImageContainer.style.display === 'block' + ? `
` + : ''; + + const printWindow = window.open('', '_blank'); + printWindow.document.write(` + + + ${title} - PedaGog + + + + + + +
+

${title}

+ ${imgContainerHtml} +
+ ${cartazPreviewContent.innerHTML} +
+
+ diff --git a/server.js b/server.js index 6e3c871..341f441 100644 --- a/server.js +++ b/server.js @@ -1335,6 +1335,207 @@ app.delete('/api/poesias/:id', requireAuth, async (req, res) => { } }); +// ============================================================ +// ROTAS DO CRIAR CARTAZES +// ============================================================ +app.post('/api/cartazes/generate', requireAuth, async (req, res) => { + const { titulo, tema, corFundo, corTexto, layout, promptImagem } = req.body; + const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000'; + + if (!titulo || !tema || !layout) { + return res.status(400).json({ error: 'Título, tema e layout são obrigatórios.' }); + } + + try { + const agentConfig = readAgentConfig(); + const agentName = agentConfig.agentName || "Kemily"; + + // 1. Gerar Conteúdo do Cartaz + const posterPrompt = `Você é a ${agentName}, assistente pedagógica da professora Camila Martella Gasparini Reifonas. +A professora Camila quer criar um Cartaz para sala de aula da Educação Infantil. + +Detalhes do Cartaz: +- Título: "${titulo}" +- Tema / Foco Pedagógico: "${tema}" +- Layout Selecionado: "${layout}" (Opções: regras, mural, calendario, livre) + +Por favor, gere o CONTEÚDO textual estruturado do cartaz. +REGRAS: +- Deve ser acolhedor, lúdico e muito bem estruturado. +- Use emojis apropriados para crianças. +- Se for layout "regras", crie uma lista de combinados da sala (max 5) de forma positiva (ex: "Cuidar dos nossos brinquedos" ao invés de "Não quebrar os brinquedos"). +- Se for "calendario", estruture áreas para o dia da semana, ajudante do dia e tempo (ensolarado, chuvoso). +- Se for "mural", crie seções de recados e novidades da semana. +- Se for "livre", crie um texto poético ou explicativo baseado no tema. +- Mantenha os textos curtos, visuais e fáceis de ler para crianças ou pais. +- Retorne apenas o conteúdo em formato HTML simples (use tags como

,

,