Implantação da geração de mensagem de forma livre e mudança na engine de mensagem
This commit is contained in:
65
app/services/notificacao/blocos.rb
Normal file
65
app/services/notificacao/blocos.rb
Normal file
@@ -0,0 +1,65 @@
|
||||
# app/services/notificacao/blocos.rb
|
||||
#
|
||||
# Catálogo dos blocos que o ADM pode empilhar no editor. É a ÚNICA fonte da
|
||||
# verdade sobre quais tipos existem e quais campos cada um tem — o editor monta
|
||||
# a paleta a partir daqui, o model valida a partir daqui e o renderizador
|
||||
# desenha a partir daqui.
|
||||
#
|
||||
# Bloco desconhecido é DESCARTADO na gravação (ver MensagemTemplate): sem isso,
|
||||
# um JSON adulterado no form viraria conteúdo renderizado sem passar por
|
||||
# validação nenhuma.
|
||||
module Notificacao
|
||||
module Blocos
|
||||
# tipo => { rotulo:, campos: { chave => tipo_do_campo } }
|
||||
# tipo_do_campo: :texto (uma linha) | :multilinha | :lista (tabela)
|
||||
CATALOGO = {
|
||||
'cabecalho' => {
|
||||
rotulo: 'Cabeçalho',
|
||||
dica: 'Título da mensagem, em destaque.',
|
||||
campos: { 'titulo' => :texto, 'subtitulo' => :texto }
|
||||
},
|
||||
'texto' => {
|
||||
rotulo: 'Texto',
|
||||
dica: 'Parágrafo livre. Use as variáveis para personalizar.',
|
||||
campos: { 'texto' => :multilinha }
|
||||
},
|
||||
'tabela' => {
|
||||
rotulo: 'Tabela de valores',
|
||||
dica: 'Pares rótulo/valor — entregas, valor, período…',
|
||||
campos: { 'linhas' => :lista }
|
||||
},
|
||||
'aviso' => {
|
||||
rotulo: 'Aviso de mudança',
|
||||
dica: 'Destaque em amarelo. Bom para "o que foi alterado".',
|
||||
campos: { 'texto' => :multilinha }
|
||||
},
|
||||
'botao' => {
|
||||
rotulo: 'Botão / link',
|
||||
dica: 'No e-mail vira botão; no WhatsApp, o link em texto.',
|
||||
campos: { 'rotulo' => :texto, 'url' => :texto }
|
||||
},
|
||||
'divisor' => {
|
||||
rotulo: 'Divisor',
|
||||
dica: 'Linha separando seções.',
|
||||
campos: {}
|
||||
},
|
||||
'rodape' => {
|
||||
rotulo: 'Rodapé',
|
||||
dica: 'Texto pequeno no fim (assinatura, aviso legal).',
|
||||
campos: { 'texto' => :multilinha }
|
||||
}
|
||||
}.freeze
|
||||
|
||||
TIPOS = CATALOGO.keys.freeze
|
||||
|
||||
def self.valido?(tipo) = TIPOS.include?(tipo.to_s)
|
||||
def self.campos(tipo) = CATALOGO.dig(tipo.to_s, :campos) || {}
|
||||
def self.rotulo(tipo) = CATALOGO.dig(tipo.to_s, :rotulo) || tipo.to_s
|
||||
|
||||
# Bloco novo com os campos vazios — usado pelo editor ao arrastar da paleta.
|
||||
def self.vazio(tipo)
|
||||
campos(tipo).to_h { |chave, especie| [chave, especie == :lista ? [] : ''] }
|
||||
.merge('tipo' => tipo.to_s)
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user