# 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