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