Class: RailsAdmin::FormBuilder

Inherits:
ActionView::Helpers::FormBuilder
  • Object
show all
Includes:
NestedForm::BuilderMixin, ApplicationHelper
Defined in:
app/helpers/rails_admin/form_builder.rb

Instance Method Summary collapse

Methods included from ApplicationHelper

#action, #actions, #authorized?, #breadcrumb, #bulk_menu, #current_action?, #edit_user_link, #flash_alert_class, #handle_asset_dependency_error, #image_tag, #logout_method, #logout_path, #main_navigation, #menu_for, #navigation, #root_navigation, #static_navigation, #wording_for

Instance Method Details

#dom_id(field) ⇒ Object



97
98
99
100
101
102
103
104
# File 'app/helpers/rails_admin/form_builder.rb', line 97

def dom_id(field)
  (@dom_id ||= {})[field.name] ||=
    [
      @object_name.to_s.gsub(/\]\[|[^-a-zA-Z0-9:.]/, '_').sub(/_$/, ''),
      options[:index],
      field.method_name,
    ].reject(&:blank?).join('_')
end

#dom_name(field) ⇒ Object



106
107
108
# File 'app/helpers/rails_admin/form_builder.rb', line 106

def dom_name(field)
  (@dom_name ||= {})[field.name] ||= %(#{@object_name}#{options[:index] && "[#{options[:index]}]"}[#{field.method_name}]#{field.is_a?(Config::Fields::Association) && field.multiple? ? '[]' : ''})
end

#errors_for(field) ⇒ Object



68
69
70
# File 'app/helpers/rails_admin/form_builder.rb', line 68

def errors_for(field)
  field.errors.present? ? @template.(:span, field.errors.to_sentence, class: 'help-inline text-danger') : ''.html_safe
end

#field_for(field) ⇒ Object



76
77
78
# File 'app/helpers/rails_admin/form_builder.rb', line 76

def field_for(field)
  field.read_only? ? @template.(:div, field.pretty_value, class: 'form-control-static') : field.render
end

#field_wrapper_for(field, nested_in) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/helpers/rails_admin/form_builder.rb', line 44

def field_wrapper_for(field, nested_in)
  # do not show nested field if the target is the origin
  return if nested_field_association?(field, nested_in)

  @template.(:div, class: "control-group row mb-3 #{field.type_css_class} #{field.css_class} #{'error' if field.errors.present?}", id: "#{dom_id(field)}_field") do
    if field.label
      label(field.method_name, field.label, class: 'col-sm-2 col-form-label text-md-end') +
        (field.nested_form ? field_for(field) : input_for(field))
    else
      field.nested_form ? field_for(field) : input_for(field)
    end
  end
end

#fieldset_for(fieldset, nested_in) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'app/helpers/rails_admin/form_builder.rb', line 26

def fieldset_for(fieldset, nested_in)
  fields = fieldset.with(
    form: self,
    object: @object,
    view: @template,
    controller: @template.controller,
  ).visible_fields
  return if fields.empty?

  @template. :fieldset do
    contents = []
    contents << @template.(:legend, %(<i class="fas fa-chevron-#{fieldset.active? ? 'down' : 'right'}"></i> #{fieldset.label}).html_safe, style: fieldset.name == :default ? 'display:none' : '')
    contents << @template.(:p, fieldset.help) if fieldset.help.present?
    contents << fields.collect { |field| field_wrapper_for(field, nested_in) }.join
    contents.join.html_safe
  end
end

#generate(options = {}) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/helpers/rails_admin/form_builder.rb', line 10

def generate(options = {})
  without_field_error_proc_added_div do
    options.reverse_merge!(
      action: @template.controller.params[:action],
      model_config: @template.instance_variable_get(:@model_config),
      nested_in: false,
    )

    object_infos +
      visible_groups(options[:model_config], generator_action(options[:action], options[:nested_in])).collect do |fieldset|
        fieldset_for fieldset, options[:nested_in]
      end.join.html_safe +
      (options[:nested_in] ? '' : @template.render(partial: 'rails_admin/main/submit_buttons'))
  end
end

#generator_action(action, nested) ⇒ Object (protected)



120
121
122
123
124
125
126
127
128
# File 'app/helpers/rails_admin/form_builder.rb', line 120

def generator_action(action, nested)
  if nested
    action = :nested
  elsif @template.request.format == 'text/javascript'
    action = :modal
  end

  action
end

#help_for(field) ⇒ Object



72
73
74
# File 'app/helpers/rails_admin/form_builder.rb', line 72

def help_for(field)
  field.help.present? ? @template.(:div, field.help, class: 'form-text') : ''.html_safe
end

#hidden_field(method, options = {}) ⇒ Object



110
111
112
113
114
115
116
# File 'app/helpers/rails_admin/form_builder.rb', line 110

def hidden_field(method, options = {})
  if method == :id
    super method, {value: object.id.to_s}
  else
    super
  end
end

#input_for(field) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'app/helpers/rails_admin/form_builder.rb', line 58

def input_for(field)
  css = 'col-sm-10 controls'
  css += ' has-error' if field.errors.present?
  @template.(:div, class: css) do
    field_for(field) +
      errors_for(field) +
      help_for(field)
  end
end

#jquery_namespace(field) ⇒ Object



93
94
95
# File 'app/helpers/rails_admin/form_builder.rb', line 93

def jquery_namespace(field)
  %(#{'#modal ' if @template.controller.params[:modal]}##{dom_id(field)}_field)
end

#object_infosObject



80
81
82
83
84
85
86
87
88
89
90
91
# File 'app/helpers/rails_admin/form_builder.rb', line 80

def object_infos
  model_config = RailsAdmin.config(object)
  model_label = model_config.label
  object_label =
    if object.new_record?
      I18n.t('admin.form.new_model', name: model_label)
    else
      object.send(model_config.object_label_method).presence || "#{model_config.label} ##{object.id}"
    end

  %(<span style="display:none" class="object-infos" data-model-label="#{model_label}" data-object-label="#{CGI.escapeHTML(object_label.to_s)}"></span>).html_safe
end

#visible_groups(model_config, action) ⇒ Object (protected)



130
131
132
133
134
135
136
137
# File 'app/helpers/rails_admin/form_builder.rb', line 130

def visible_groups(model_config, action)
  model_config.send(action).with(
    form: self,
    object: @object,
    view: @template,
    controller: @template.controller,
  ).visible_groups
end

#without_field_error_proc_added_divObject (protected)



139
140
141
142
143
144
145
146
147
# File 'app/helpers/rails_admin/form_builder.rb', line 139

def without_field_error_proc_added_div
  default_field_error_proc = ::ActionView::Base.field_error_proc
  begin
    ::ActionView::Base.field_error_proc = proc { |html_tag, _instance| html_tag }
    yield
  ensure
    ::ActionView::Base.field_error_proc = default_field_error_proc
  end
end