require 'active_support/concern'
module Iord
class OutputHelper
def search_if_enabled
search_form if v.iord_features.include?(:search)
end
def search_form
v.form_tag(v.collection_url, method: :get, class: 'search') do
search_term +
search_operator +
search_value +
search_submit
end
end
def search_term
html = %q[]
return html.html_safe
end
def search_operator
html = %q[]
return html.html_safe
end
def search_value
v.text_field_tag('v', v.search_value, id: 'search_value')
end
def search_submit
v.submit_tag(v.t('iord.buttons.search'), name: '')
end
end
module Search
extend ActiveSupport::Concern
included do
alias_method_chain :create_collection, :search
iord_features << :search
helper_method :search_term
helper_method :search_value
helper_method :search_operator
helper_method :search_operators
end
def search_term
if @search_term.nil?
@search_term = params[:q]
@search_term = nil unless resource_attribute_names.include? @search_term
collection_url_defaults[:q] = @search_term if @search_term
end
return @search_term
end
def term_type(klass, term)
term = term.split('.') if term.is_a?(String)
if term.count == 1
klass.fields[term[0]].type
else
term_type(klass.relations[term[0]].klass, term[1..-1])
end
end
def search_value
if @search_value.nil?
return @search_value = nil if search_term.nil?
@search_value = params[:v]
collection_url_defaults[:v] = @search_value if @search_value
end
return @search_value
end
def search_operators
@search_operators ||= %i(eq lt lte gt gte like)
end
def search_operator
if @search_operator.nil? or (params[:op] ? @search_operator != params[:op].to_s : false)
return @search_operator = nil if search_term.nil?
@search_operator = (params[:op] || :eq).to_sym
@search_operator = :eq unless search_operators.include? @search_operator
collection_url_defaults[:op] = @search_operator if @search_operator
end
return @search_operator
end
def create_collection_with_search
collection = create_collection_without_search
if search_term
if search_operator == :like
collection = collection.where(search_term => {"$regex" => ".*#{search_value}.*", "$options" => "i"} )
elsif search_operator == :eq
if search_value.empty?
collection = collection.where(search_term.to_sym.in => [nil, ''])
else
type = term_type(resource_class, search_term)
collection = collection.where(search_term => type.evolve(search_value))
end
else
collection = collection.where(search_term => {"$#{search_operator}" => search_value})
end
end
return collection
end
end
end