Module: Decidim::DecidimFormHelper
- Defined in:
- app/helpers/decidim/decidim_form_helper.rb
Overview
A heper to expose an easy way to add authorization forms in a view.
Instance Method Summary collapse
- #base_error_messages(record) ⇒ Object
-
#decidim_form_for(record, options = {}, &block) ⇒ 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
-
#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
#base_error_messages(record) ⇒ Object
157 158 159 160 161 162 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 157 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 = {}, &block) ⇒ 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 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 13 def decidim_form_for(record, = {}, &block) [:data] ||= {} [:data].update(abide: true, "live-validate" => true, "validate-on-blur" => true) [:html] ||= {} [:html].update(novalidate: true) output = "" output += (record).to_s output += form_for(record, , &block).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.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 141 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 a html template.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 38 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
128 129 130 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 128 def form_field_has_error?(object, attribute) object.respond_to?(:errors) && object.errors[attribute].present? end |
#name_with_locale(name, locale) ⇒ Object
Helper method used by ‘translated_field_tag`
124 125 126 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 124 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`
117 118 119 120 121 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 117 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.
65 66 67 68 69 70 71 72 73 74 75 76 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 |
# File 'app/helpers/decidim/decidim_form_helper.rb', line 65 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" 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 |