sutty/app/models/site/forms.rb
2020-10-03 21:46:24 -03:00

63 lines
1.6 KiB
Ruby

# frozen_string_literal: true
class Site
# Gestor de formularios del sitio
module Forms
# Esta clase es un Hash que es capaz de convertirse a strong params
# según la definición del formulario en el sitio.
class Form < Hash
# Convierte el formulario a strong params
#
# @return Array
def params
map do |field, definition|
if ARRAY_FIELDS.include? definition['type']
{ field.to_sym => [] }
else
field.to_sym
end
end.compact
end
# Obtiene la traducción del campo
#
# @return String
def t(field)
dig(field.to_s, 'label', I18n.locale.to_s) || field.to_s
end
end
# Campos del formulario que no son necesarios
EXCLUDED_FIELDS = %w[separator redirect].freeze
# Campos que aceptan valores múltiples (checkboxes, input-map,
# input-tag)
ARRAY_FIELDS = %w[array].freeze
# Obtiene todos los formularios disponibles
#
# @return Array Formularios disponibles para este sitio
def forms
@forms ||= data.dig('forms')&.keys || []
end
# El nombre del formulario está disponible
#
# @param [String|Symbol] El nombre del formulario
def form?(name)
forms.include? name.to_s
end
# Obtiene un formulario con los campos definitivos
#
# @return Site::Forms::Form
def form(name)
@cached_forms ||= {}
@cached_forms[name] ||= Form[data.dig('forms', name).reject { |k, _| excluded? k }]
end
# Detecta si el campo está excluido del formulario final
def excluded?(field)
EXCLUDED_FIELDS.include? field.to_s
end
end
end