Module: Decidim::DecidimFormHelper
- Included in:
- ApplicationHelper, Initiatives::ScopesHelper, TaxonomiesHelper
- Defined in:
- decidim-core/app/helpers/decidim/decidim_form_helper.rb
Overview
A helper to expose an easy way to add authorization forms in a view.
Instance Method Summary collapse
-
#areas_for_select(organization) ⇒ Object
Handle which collection to pass to Decidim::FilterFormBuilder.areas_select.
- #base_error_messages(record) ⇒ Object
-
#decidim_form_for(record, options = {}) ⇒ Object
A custom form for that injects client side validations with Abide.
-
#decidim_form_slug_url(prepend_path = "", value = "") ⇒ Object
Helper method to show how slugs will look like.
-
#editor_field_tag(name, value, options = {}) ⇒ Object
A custom helper to include an editor field without requiring a form object.
- #form_field_has_error?(object, attribute) ⇒ Boolean
-
#form_required_explanation ⇒ Object
Helper method to show an explanation for the form’s required fields that are marked with an asterisk character.
-
#name_with_locale(name, locale) ⇒ Object
Helper method used by ‘translated_field_tag`.
-
#tab_element_class_for(type, index) ⇒ Object
Helper method used by ‘translated_field_tag`.
-
#translated_field_tag(type, object_name, name, value = {}, options = {}) ⇒ Object
A custom helper to include a translated field without requiring a form object.
Instance Method Details
#areas_for_select(organization) ⇒ Object
Handle which collection to pass to Decidim::FilterFormBuilder.areas_select
188 189 190 191 192 193 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 188 def areas_for_select(organization) return organization.areas if organization.area_types.blank? return organization.areas if organization.area_types.all? { |at| at.area_ids.empty? } organization.area_types end |
#base_error_messages(record) ⇒ Object
180 181 182 183 184 185 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 180 def (record) return unless record.respond_to?(:errors) return unless record.errors[:base].any? alert_box(record.errors.(:base).join(","), :alert, false) end |
#decidim_form_for(record, options = {}) ⇒ Object
A custom form for that injects client side validations with Abide.
record - The object to build the form for. options - A Hash of options to pass to the form builder. &block - The block to execute as content of the form.
Returns a String.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 13 def decidim_form_for(record, = {}, &) [:data] ||= {} [:data].update(:abide => true, "live-validate" => true, "validate-on-blur" => true) [:html] ||= {} [:html].update(novalidate: true) unless [:html].has_key?(:novalidate) # Generally called by form_for but we need the :url option generated # already before that. # # See: # https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/form_helper.rb#L459 if record.is_a?(ActiveRecord::Base) object = record.is_a?(Array) ? record.last : record format = [:format] (object, ) if object [:format] = format if format end output = "" output += (record).to_s output += form_for(record, , &).to_s output.html_safe end |
#decidim_form_slug_url(prepend_path = "", value = "") ⇒ Object
Helper method to show how slugs will look like. Intended to be used in forms together with some JavaScript code. More precisely, this will most probably show in help texts in forms. The space slug is surrounded with a ‘span` so the slug can be updated via JavaScript with the input value.
prepend_path - a path to prepend to the slug, without final slash value - the initial value of the slug field, so that edit forms have a value
Returns an HTML-safe String.
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 153 def decidim_form_slug_url(prepend_path = "", value = "") prepend_slug_path = if prepend_path.present? "/#{prepend_path}/" else "/" end content_tag(:span, class: "slug-url") do [ request.protocol, request.host_with_port, prepend_slug_path ].join.html_safe + content_tag(:span, value, class: "slug-url-value") end end |
#editor_field_tag(name, value, options = {}) ⇒ Object
A custom helper to include an editor field without requiring a form object
name - The input name value - The input value options - The set of options to send to the field
:label - The Boolean value to create or not the input label (optional) (default: true)
:toolbar - The String value to configure WYSIWYG . It should be 'basic' or
or 'full' (optional) (default: 'basic')
:lines - The Integer to indicate how many lines should editor have (optional)
Returns a rich editor to be included in an html template.
50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 50 def editor_field_tag(name, value, = {}) [:toolbar] ||= "basic" [:lines] ||= 10 content_tag(:div, class: "editor") do template = "" template += label_tag(name, [:label]) if [:label] != false template += hidden_field_tag(name, value, ) template += content_tag(:div, nil, class: "editor-container", data: { toolbar: [:toolbar] }, style: "height: #{options[:lines]}rem") template.html_safe end end |
#form_field_has_error?(object, attribute) ⇒ Boolean
140 141 142 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 140 def form_field_has_error?(object, attribute) object.respond_to?(:errors) && object.errors[attribute].present? end |
#form_required_explanation ⇒ Object
Helper method to show an explanation for the form’s required fields that are marked with an asterisk character. This improves the accessibility of the forms.
Returns an HTML-safe String.
174 175 176 177 178 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 174 def form_required_explanation content_tag(:div, class: "help-text") do I18n.t("forms.required_explanation") end end |
#name_with_locale(name, locale) ⇒ Object
Helper method used by ‘translated_field_tag`
136 137 138 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 136 def name_with_locale(name, locale) "#{name}_#{locale.to_s.gsub("-", "__")}" end |
#tab_element_class_for(type, index) ⇒ Object
Helper method used by ‘translated_field_tag`
129 130 131 132 133 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 129 def tab_element_class_for(type, index) element_class = "tabs-#{type}" element_class += " is-active" if index.zero? element_class end |
#translated_field_tag(type, object_name, name, value = {}, options = {}) ⇒ Object
A custom helper to include a translated field without requiring a form object.
type - The type of the translated input field. object_name - The object name used to identify the Foundation tabs. name - The name of the input which will be suffixed with the corresponding locales. value - A hash containing the value for each locale. options - An optional hash of options.
* enable_tabs: Adds the data-tabs attribute so Foundation picks up automatically.
* tabs_id: The id to identify the Foundation tabs element.
* label: The label used for the field.
Returns a Foundation tabs element with the translated input field.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'decidim-core/app/helpers/decidim/decidim_form_helper.rb', line 77 def translated_field_tag(type, object_name, name, value = {}, = {}) locales = available_locales field_label = label_tag(name, [:label]) if locales.count == 1 field_name = "#{name}_#{locales.first.to_s.gsub("-", "__")}" field_input = send( type, "#{object_name}[#{field_name}]", value[locales.first.to_s] ) return safe_join [field_label, field_input] end tabs_id = [:tabs_id] || "#{object_name}-#{name}-tabs".underscore enabled_tabs = [:enable_tabs].nil? ? true : [:enable_tabs] tabs_panels_data = enabled_tabs ? { tabs: true } : {} label_tabs = content_tag(:div, class: "label--tabs") do tabs_panels = "".html_safe if [:label] != false tabs_panels = content_tag(:ul, class: "tabs tabs--lang", id: tabs_id, data: tabs_panels_data) do locales.each_with_index.inject("".html_safe) do |string, (locale, index)| string + content_tag(:li, class: tab_element_class_for("title", index)) do title = I18n.with_locale(locale) { I18n.t("name", scope: "locale") } element_class = nil element_class = "is-tab-error" if form_field_has_error?([:object], name_with_locale(name, locale)) tab_content_id = "#{tabs_id}-#{name}-panel-#{index}" content_tag(:a, title, href: "##{tab_content_id}", class: element_class) end end end end safe_join [field_label, tabs_panels] end tabs_content = content_tag(:div, class: "tabs-content", data: { tabs_content: tabs_id }) do locales.each_with_index.inject("".html_safe) do |string, (locale, index)| tab_content_id = "#{tabs_id}-#{name}-panel-#{index}" string + content_tag(:div, class: tab_element_class_for("panel", index), id: tab_content_id) do send(type, "#{object_name}[#{name_with_locale(name, locale)}]", value[locale.to_s], .merge(id: "#{tabs_id}_#{name}_#{locale}", label: false)) end end end safe_join [label_tabs, tabs_content] end |