feat: implement template filtering for notifications based on channel type and enhance email rendering with HTML wrapper, ensuring chat messages are sent as plain text

This commit is contained in:
2025-12-01 09:50:53 -03:00
parent d9e78079c8
commit 4c2d12f443
7 changed files with 213 additions and 34 deletions

View File

@@ -95,6 +95,34 @@
return [];
});
function templateDisponivelParaCanal(
template: Doc<'templatesMensagens'>,
canalAtual: 'chat' | 'email' | 'ambos'
): boolean {
const categoria = template.categoria as 'email' | 'chat' | 'ambos' | undefined;
// Se não tiver categoria definida, considerar disponível para qualquer canal
if (!categoria) {
return true;
}
if (canalAtual === 'ambos') {
// No modo "ambos", aceitar templates marcados para qualquer canal ou ambos
return categoria === 'chat' || categoria === 'email' || categoria === 'ambos';
}
// Para canal específico, aceitar templates daquele canal ou "ambos"
if (categoria === 'ambos') {
return true;
}
return categoria === canalAtual;
}
const templatesParaCanal = $derived.by(() =>
templates.filter((t) => templateDisponivelParaCanal(t as Doc<'templatesMensagens'>, canal))
);
// Estados de carregamento e erro
const carregandoTemplates = $derived(templatesQuery === undefined || templatesQuery === null);
const carregandoUsuarios = $derived(usuariosQuery === undefined || usuariosQuery === null);
@@ -211,6 +239,17 @@
return resultado;
}
// Versão específica para CHAT: garante texto puro (sem HTML)
function renderizarTemplateChatLocal(
template: string,
variaveis: Record<string, string>
): string {
const textoComVariaveis = renderizarTemplate(template, variaveis);
// Remove quaisquer tags HTML que possam ter sido inseridas por engano
const textoPuro = textoComVariaveis.replace(/<[^>]*>/g, '');
return textoPuro;
}
// Função para mostrar mensagens
function mostrarMensagem(tipo: 'success' | 'error' | 'info', texto: string) {
mensagem = { tipo, texto };
@@ -885,10 +924,10 @@
});
if (conversaId) {
// Renderizar template com variáveis do destinatário
// Renderizar template com variáveis do destinatário (chat sempre em TEXTO PURO)
const mensagem =
usarTemplate && templateSelecionado
? renderizarTemplate(templateSelecionado.corpo, {
? renderizarTemplateChatLocal(templateSelecionado.corpo, {
nome: destinatario.nome,
matricula: destinatario.matricula || ''
})
@@ -1314,8 +1353,8 @@
<option value="">Selecione um template</option>
{#if carregandoTemplates}
<option disabled>Carregando templates...</option>
{:else if templates.length > 0}
{#each templates as template (template._id)}
{:else if templatesParaCanal.length > 0}
{#each templatesParaCanal as template (template._id)}
<option value={template._id}>
{template.nome}
</option>

View File

@@ -203,6 +203,13 @@
<option value="chat">Chat</option>
<option value="ambos">Ambos</option>
</select>
<label class="label">
<span class="label-text-alt">
<span class="font-semibold">Chat:</span> usa o texto puro do corpo. <span
class="font-semibold">Email:</span
> usa uma versão HTML profissional gerada automaticamente com cabeçalho e assinatura SGSE.
</span>
</label>
</div>
<div class="form-control">
@@ -213,8 +220,16 @@
id="corpo"
bind:value={corpo}
class="textarea textarea-bordered h-40"
placeholder="Digite o conteúdo da mensagem. Você pode usar &#123;&#123;variavel&#125;&#125; para valores dinâmicos."
placeholder="Digite o conteúdo em TEXTO. Você pode usar &#123;&#123;variavel&#125;&#125; para valores dinâmicos."
></textarea>
<label class="label">
<span class="label-text-alt">
Este texto será usado diretamente nas mensagens de
<span class="font-semibold">chat</span>. Para
<span class="font-semibold">email</span>, o sistema gera automaticamente um layout HTML
padronizado com logo e assinatura.
</span>
</label>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">

View File

@@ -180,6 +180,13 @@
<option value="chat">Chat</option>
<option value="ambos">Ambos</option>
</select>
<label class="label">
<span class="label-text-alt">
<span class="font-semibold">Chat:</span> usa o texto puro do corpo. <span class="font-semibold"
>Email:</span
> usa uma versão HTML profissional gerada automaticamente com cabeçalho e assinatura SGSE.
</span>
</label>
</div>
<div class="form-control">
@@ -190,8 +197,15 @@
id="corpo"
bind:value={corpo}
class="textarea textarea-bordered h-40"
placeholder="Digite o conteúdo da mensagem. Você pode usar &#123;&#123;variavel&#125;&#125; para valores dinâmicos."
placeholder="Digite o conteúdo em TEXTO. Você pode usar &#123;&#123;variavel&#125;&#125; para valores dinâmicos."
></textarea>
<label class="label">
<span class="label-text-alt">
Este texto será usado diretamente nas mensagens de <span class="font-semibold">chat</span>.
Para <span class="font-semibold">email</span>, o sistema gera automaticamente um layout HTML
padronizado com logo e assinatura.
</span>
</label>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2">