diff --git a/apps/web/src/lib/components/Sidebar.svelte b/apps/web/src/lib/components/Sidebar.svelte index 22805e1..c290ba7 100644 --- a/apps/web/src/lib/components/Sidebar.svelte +++ b/apps/web/src/lib/components/Sidebar.svelte @@ -330,6 +330,12 @@
{#if currentUser.data} + + + - - {#if avatarUrlDoUsuario()} - {currentUser.data?.nome - {:else} - - - {/if} + + {#if avatarUrlDoUsuario()} + {currentUser.data?.nome + {:else} + + + {/if} - -
- - +
+ + +
- -
diff --git a/apps/web/src/routes/(dashboard)/ti/+page.svelte b/apps/web/src/routes/(dashboard)/ti/+page.svelte index ff1113a..23902f3 100644 --- a/apps/web/src/routes/(dashboard)/ti/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/+page.svelte @@ -424,15 +424,16 @@
{#each featureCards as card (card.title)} - + {/if} {/each}
diff --git a/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte b/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte index c78b1cc..02672b5 100644 --- a/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte @@ -21,6 +21,7 @@ enviadoPor: Id<'usuarios'>; criadoEm: number; enviadoEm: number | undefined; + erroDetalhes?: string; destinatarioInfo: Doc<'usuarios'> | null; templateInfo: Doc<'templatesMensagens'> | null; } @@ -55,10 +56,11 @@ const emailIdsArray = $derived( Array.from(emailIdsRastreados).map((id) => id as Id<'notificacoesEmail'>) ); - // Usar função para evitar execução quando array está vazio - const emailsStatusQuery = useQuery(api.email.buscarEmailsPorIds, () => + // Usar $derived para calcular argumentos da query condicionalmente + const emailsStatusArgs = $derived( emailIdsArray.length === 0 ? 'skip' : { emailIds: emailIdsArray } ); + const emailsStatusQuery = useQuery(api.email.buscarEmailsPorIds, emailsStatusArgs); // Queries para agendamentos const agendamentosEmailQuery = useQuery(api.email.listarAgendamentosEmail, {}); @@ -248,9 +250,21 @@ variaveis: Record ): string { const textoComVariaveis = renderizarTemplate(template, variaveis); - // Remove quaisquer tags HTML que possam ter sido inseridas por engano - const textoPuro = textoComVariaveis.replace(/<[^>]*>/g, ''); - return textoPuro; + // Remove todas as tags HTML (incluindo quebras de linha HTML) + let textoPuro = textoComVariaveis.replace(/<[^>]*>/g, ''); + // Converte entidades HTML comuns para texto normal + textoPuro = textoPuro + .replace(/ /g, ' ') + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/"/g, '"') + .replace(/'/g, "'") + .replace(/'/g, "'") + .replace(/&[a-zA-Z0-9#]+;/g, ''); // Remove outras entidades HTML + // Normaliza espaços múltiplos (mas preserva quebras de linha reais) + textoPuro = textoPuro.replace(/[ \t]+/g, ' ').replace(/[ \t]*\n[ \t]*/g, '\n'); + return textoPuro.trim(); } // Função para mostrar mensagens @@ -726,9 +740,10 @@ }); if (conversaId) { + // Para chat, sempre remover HTML dos templates const mensagem = usarTemplate && templateSelecionado - ? renderizarTemplate(templateSelecionado.corpo, { + ? renderizarTemplateChatLocal(templateSelecionado.corpo, { nome: destinatario.nome, matricula: destinatario.matricula || '' }) @@ -1999,6 +2014,7 @@ Para enviar emails, certifique-se de configurar o SMTP em Configurações de Email.
+ diff --git a/packages/backend/convex/email.ts b/packages/backend/convex/email.ts index dee978b..eaed2b3 100644 --- a/packages/backend/convex/email.ts +++ b/packages/backend/convex/email.ts @@ -402,18 +402,13 @@ export const buscarEmailsPorIds = query({ export const listarAgendamentosEmail = query({ args: {}, handler: async (ctx) => { - // Buscar todos os emails agendados (pendentes ou enviando) + // Buscar todos os emails agendados (pendentes, enviando ou já enviados que tinham agendamento) const emailsAgendados = await ctx.db .query("notificacoesEmail") .filter((q) => { - const temAgendamento = q.neq(q.field("agendadaPara"), undefined); - const statusValido = q.or( - q.eq(q.field("status"), "pendente"), - q.eq(q.field("status"), "enviando") - ); - return q.and(temAgendamento, statusValido); + // Apenas emails que têm agendadaPara definido + return q.neq(q.field("agendadaPara"), undefined); }) - .order("asc") .collect(); // Enriquecer com informações de destinatário e template