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:
@@ -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>
|
||||
|
||||
@@ -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 {{variavel}} para valores dinâmicos."
|
||||
placeholder="Digite o conteúdo em TEXTO. Você pode usar {{variavel}} 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">
|
||||
|
||||
@@ -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 {{variavel}} para valores dinâmicos."
|
||||
placeholder="Digite o conteúdo em TEXTO. Você pode usar {{variavel}} 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">
|
||||
|
||||
Reference in New Issue
Block a user