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