Class: ActiveAdmin::FormBuilder

Inherits:
Formtastic::FormBuilder
  • Object
show all
Defined in:
lib/active_admin/form_builder.rb

Direct Known Subclasses

ActiveAdmin::Filters::FormBuilder

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#already_in_an_inputs_blockObject

Returns the value of attribute already_in_an_inputs_block



28
29
30
# File 'lib/active_admin/form_builder.rb', line 28

def already_in_an_inputs_block
  @already_in_an_inputs_block
end

Instance Method Details

#assoc_heading(assoc) ⇒ Object



30
31
32
33
# File 'lib/active_admin/form_builder.rb', line 30

def assoc_heading(assoc)
  object.class.reflect_on_association(assoc).klass.model_name.
    human(count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT)
end


22
23
24
25
26
# File 'lib/active_admin/form_builder.rb', line 22

def cancel_link(url = {action: "index"}, html_options = {}, li_attrs = {})
  li_attrs[:class] ||= "cancel"
  li_content = template.link_to I18n.t('active_admin.cancel'), url, html_options
  template.(:li, li_content, li_attrs)
end

#has_many(assoc, options = {}, &block) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/active_admin/form_builder.rb', line 35

def has_many(assoc, options = {}, &block)
  # remove options that should not render as attributes
  custom_settings = :new_record, :allow_destroy, :heading, :sortable
  builder_options = {new_record: true}.merge! options.slice  *custom_settings
  options         = {for: assoc      }.merge! options.except *custom_settings
  options[:class] = [options[:class], "inputs has_many_fields"].compact.join(' ')

  if (column = builder_options[:sortable])
    options[:for] = [assoc, sorted_children(assoc, column)]
  end

  html = "".html_safe
  unless builder_options.key?(:heading) && !builder_options[:heading]
    html << template.(:h3) do
      builder_options[:heading] || assoc_heading(assoc)
    end
  end

  html << template.capture do
    contents = "".html_safe
    form_block = proc do |has_many_form|
      index    = parent_child_index options[:parent] if options[:parent]
      block.call has_many_form, index
      template.concat has_many_actions(has_many_form, builder_options, "".html_safe)
    end
    
    template.assign('has_many_block'=> true)
    contents = without_wrapper { inputs(options, &form_block) }

    if builder_options[:new_record]
      contents << js_for_has_many(assoc, form_block, template, builder_options[:new_record], options[:class])
    else
      contents
    end
  end

  tag = @already_in_an_inputs_block ? :li : :div
  html = template.(tag, html, class: "has_many_container #{assoc}", 'data-sortable' => builder_options[:sortable])
  template.concat(html) if template.output_buffer
  html
end

#has_many_actions(has_many_form, builder_options, contents) ⇒ Object (protected)



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/active_admin/form_builder.rb', line 79

def has_many_actions(has_many_form, builder_options, contents)
  if has_many_form.object.new_record?
    contents << template.(:li) do
      template.link_to I18n.t('active_admin.has_many_remove'), "#", class: 'button has_many_remove'
    end
  elsif builder_options[:allow_destroy]
    has_many_form.input(:_destroy, as: :boolean,
                        wrapper_html: {class: 'has_many_delete'},
                        label: I18n.t('active_admin.has_many_delete'))
  end

  if builder_options[:sortable]
    has_many_form.input builder_options[:sortable], as: :hidden

    contents << template.(:li, class: 'handle') do
      Iconic.icon :move_vertical
    end
  end

  contents
end

#sorted_children(assoc, column) ⇒ Object (protected)



101
102
103
104
105
106
# File 'lib/active_admin/form_builder.rb', line 101

def sorted_children(assoc, column)
  object.public_send(assoc).sort_by do |o|
    attribute = o.public_send column
    [attribute.nil? ? Float::INFINITY : attribute, o.id || Float::INFINITY]
  end
end