Files

66 lines
2.3 KiB
Ruby

# 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