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
76
77
# 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, :sortable_start
  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(' ')
  sortable_column = builder_options[:sortable]
  sortable_start  = builder_options.fetch(:sortable_start, 0)

  if sortable_column
    options[:for] = [assoc, sorted_children(assoc, sortable_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) } || "".html_safe

    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' => sortable_column, 'data-sortable-start' => sortable_start)
  template.concat(html) if template.output_buffer
  html
end

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


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

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
      "MOVE"
    end
  end

  contents
end

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


103
104
105
106
107
108
# File 'lib/active_admin/form_builder.rb', line 103

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