class ActiveAdmin::SearchableSelect::OptionCollection

@api private

Attributes

per_page[R]

Public Class Methods

new(name, options) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 5
def initialize(name, options)
  @name = name
  @scope = extract_scope_option(options)
  @display_text = extract_display_text_option(options)
  @filter = extract_filter_option(options)
  @per_page = options.fetch(:per_page, 10)
  @additional_payload = options.fetch(:additional_payload, {})
end

Public Instance Methods

as_json(template, params) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 35
def as_json(template, params)
  records, more = fetch_records(template, params)

  results = records.map do |record|
    {
      id: record.id,
      text: display_text(record)
    }.merge(hash_of_additional_payload(record) || {})
  end

  { results: results, pagination: { more: more } }
end
collection_action_name() click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 31
def collection_action_name
  "#{@name}_options"
end
display_text(record) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 27
def display_text(record)
  @display_text.call(record)
end
scope(template, params) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 14
def scope(template, params)
  case @scope
  when Proc
    if @scope.arity.zero?
      template.instance_exec(&@scope)
    else
      template.instance_exec(params, &@scope)
    end
  else
    @scope
  end
end

Private Instance Methods

build_additional_payload(record) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 103
def build_additional_payload(record)
  case @additional_payload
  when Proc
    @additional_payload.call(record).to_h
  else
    {}
  end
end
extract_display_text_option(options) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 79
def extract_display_text_option(options)
  options.fetch(:display_text) do
    text_attribute = options.fetch(:text_attribute) do
      raise('Missing option: display_text or text_attribute. ' \
            'Either pass a proc to determine the display text for a record ' \
            'or set the text_attribute option.')
    end

    ->(record) { record.send(text_attribute) }
  end
end
extract_filter_option(options) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 91
def extract_filter_option(options)
  options.fetch(:filter) do
    text_attribute = options.fetch(:text_attribute) do
      raise('Missing option: filter or text_attribute. ' \
            'Either pass a proc which filters the scope according to a given ' \
            'or set the text_attribute option to apply a default Ransack filter.')
    end

    ->(term, scope) { scope.ransack("#{text_attribute}_cont" => term).result }
  end
end
extract_scope_option(options) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 72
def extract_scope_option(options)
  options.fetch(:scope) do
    raise('Missing option: scope. ' \
          'Pass the collection of items to render options for.')
  end
end
fetch_records(template, params) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 52
def fetch_records(template, params)
  paginate(filter(scope(template, params), params[:term]),
           params[:page])
end
filter(scope, term) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 57
def filter(scope, term)
  term ? @filter.call(term, scope) : scope
end
hash_of_additional_payload(record) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 112
def hash_of_additional_payload(record)
  return nil if @additional_payload.nil? && @additional_payload.empty?

  build_additional_payload(record)
end
paginate(scope, page_index) click to toggle source
# File lib/activeadmin/searchable_select/option_collection.rb, line 61
def paginate(scope, page_index)
  page_index = page_index.to_i

  records = scope.limit(per_page + 1).offset(page_index * per_page).to_a

  [
    records.slice(0, per_page),
    records.size > per_page
  ]
end