63 lines
1.6 KiB
Ruby
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
|