class Decidim::Initiatives::InitiativesFilterFormBuilder

This custom Form builder add the fields needed to deal with Initiative types.

Public Instance Methods

initiative_types_select(name, collection, options = {}) click to toggle source

Public: Generates a select field with the initiative types.

name - The name of the field (usually type_id) collection - A collection of initiative types. options - An optional Hash with options:

  • prompt - An optional String with the text to display as prompt.

Returns a String.

# File lib/decidim/initiatives/initiatives_filter_form_builder.rb, line 16
def initiative_types_select(name, collection, options = {})
  selected = object.send(name)

  types = types_for_options_for_select(selected, collection)

  prompt = options.delete(:prompt)
  remote_path = options.delete(:remote_path) || false
  multiple = options.delete(:multiple) || false
  html_options = {
    multiple: multiple,
    class: "select2",
    "data-remote-path" => remote_path,
    "data-placeholder" => prompt
  }

  select(name, @template.options_for_select(types, selected: selected), options, html_options)
end

Private Instance Methods

types_for_options_for_select(selected, collection) click to toggle source
# File lib/decidim/initiatives/initiatives_filter_form_builder.rb, line 36
def types_for_options_for_select(selected, collection)
  if selected.present?
    if selected == "all"
      types = collection.all.map do |type|
        [type.title[I18n.locale.to_s], type.id]
      end
    else
      selected = selected.values if selected.is_a?(Hash)
      selected = [selected] unless selected.is_a?(Array)
      types = collection.where(id: selected.map(&:to_i)).map do |type|
        [type.title[I18n.locale.to_s], type.id]
      end
    end
  else
    types = []
  end
  types
end