class Para::Inputs::MultiSelectInput

Attributes

resource[R]

Public Instance Methods

attribute_field() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 57
def attribute_field
  @attribute_field ||= AttributeField::HasManyField.new(
    object.class, name: attribute_name
  )
end
collection() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 70
def collection
  @collection ||= options.fetch(:collection) do
    model.all
  end
end
foreign_key() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 53
def foreign_key
  :"#{ reflection.name.to_s.singularize }_ids"
end
input(wrapper_options = nil) click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 10
def input(wrapper_options = nil)
  input_html_options[:class] << "multi-select"

  # Load existing resources
  resources = input_html_options[:value] || object.send(attribute_name)
  # Order them if the list should be orderable
  resources = resources.sort_by(&method(:resource_position)) if orderable?

  template.render(
    partial: 'para/inputs/multi_select',
    locals: {
      form: @builder,
      model: model,
      attribute_name: foreign_key,
      orderable: orderable?,
      resources: resources,
      option_resources: option_resources,
      search_param: search_param,
      collection: collection
    }
  )
end
join_resources() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 106
def join_resources
  @join_resources ||= orderable_association.load_target
end
model() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 45
def model
  @model ||= reflection.klass
end
option_resources() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 33
def option_resources
  @option_resources ||= if model.orderable?
    collection.ordered
  else
    collection.sort_by { |resource| resource_name(resource) }
  end
end
orderable?() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 76
def orderable?
  @orderable ||= options.fetch(:orderable) do
    if attribute_field.through_reflection
      attribute_field.through_reflection.klass.orderable?
    else
      model.orderable?
    end
  end
end
orderable_association() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 98
def orderable_association
  @orderable_association ||= if attribute_field.through_reflection
    object.association(attribute_field.through_reflection.name)
  else
    object.association(attribute_name)
  end
end
parent_model() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 41
def parent_model
  @parent_model ||= @builder.object.class
end
reflection() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 49
def reflection
  @reflection ||= parent_model.reflect_on_association(attribute_name)
end
resource_position(resource) click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 86
def resource_position(resource)
  existing_resource = if attribute_field.through_reflection
    join_resources.find do |res|
      res.send(attribute_field.through_relation_source_foreign_key) == resource.id
    end
  else
    resource
  end

  existing_resource.position
end
search_param() click to toggle source
# File lib/para/inputs/multi_select_input.rb, line 63
def search_param
  @search_param ||= options.fetch(:search_param) do
    attributes = model_field_mappings(model).fields
    fulltext_search_param_for(attributes)
  end
end