lib/rails_admin/config/fields/group.rb
# frozen_string_literal: true
require 'active_support/core_ext/string/inflections'
require 'rails_admin/config/proxyable'
require 'rails_admin/config/configurable'
require 'rails_admin/config/hideable'
module RailsAdmin
module Config
module Fields
# A container for groups of fields in edit views
class Group
include RailsAdmin::Config::Proxyable
include RailsAdmin::Config::Configurable
include RailsAdmin::Config::Hideable
attr_reader :name, :abstract_model, :parent, :root
attr_accessor :section
def initialize(parent, name)
@parent = parent
@root = parent.root
@abstract_model = parent.abstract_model
@section = parent
@name = name.to_s.tr(' ', '_').downcase.to_sym
end
# Defines a configuration for a field by proxying parent's field method
# and setting the field's group as self
#
# @see RailsAdmin::Config::Fields.field
def field(name, type = nil, &block)
field = section.field(name, type, &block)
# Directly manipulate the variable instead of using the accessor
# as group probably is not yet registered to the parent object.
field.instance_variable_set('@group', self)
field
end
# Reader for fields attached to this group
def fields
section.fields.select { |f| f.group == self }
end
# Defines configuration for fields by their type
#
# @see RailsAdmin::Config::Fields.fields_of_type
def fields_of_type(type, &block)
selected = section.fields.select { |f| type == f.type }
selected.each { |f| f.instance_eval(&block) } if block
selected
end
# Reader for fields that are marked as visible
def visible_fields
section.with(bindings).visible_fields.select { |f| f.group == self }
end
# Should it open by default
register_instance_option :active? do
true
end
# Configurable group label which by default is group's name humanized.
register_instance_option :label do
(@label ||= {})[::I18n.locale] ||= (parent.fields.detect { |f| f.name == name }.try(:label) || name.to_s.humanize)
end
# Configurable help text
register_instance_option :help do
nil
end
end
end
end
end