lib/administrate/search.rb in administrate-0.16.0 vs lib/administrate/search.rb in administrate-0.17.0

- old
+ new

@@ -2,18 +2,19 @@ require "active_support/core_ext/object/blank" module Administrate class Search class Query - attr_reader :filters + attr_reader :filters, :valid_filters def blank? terms.blank? && filters.empty? end - def initialize(original_query) + def initialize(original_query, valid_filters = nil) @original_query = original_query + @valid_filters = valid_filters @filters, @terms = parse_query(original_query) end def original @original_query @@ -28,31 +29,31 @@ end private def filter?(word) - word.match?(/^\w+:$/) + valid_filters&.any? { |filter| word.match?(/^#{filter}:\w*$/) } end def parse_query(query) filters = [] terms = [] query.to_s.split.each do |word| if filter?(word) - filters << word.split(":").first + filters << word else terms << word end end [filters, terms] end end - def initialize(scoped_resource, dashboard_class, term) - @dashboard_class = dashboard_class + def initialize(scoped_resource, dashboard, term) + @dashboard = dashboard @scoped_resource = scoped_resource - @query = Query.new(term) + @query = Query.new(term, valid_filters.keys) end def run if query.blank? @scoped_resource.all @@ -63,19 +64,24 @@ end end private - def apply_filter(filter, resources) + def apply_filter(filter, filter_param, resources) return resources unless filter - filter.call(resources) + if filter.parameters.size == 1 + filter.call(resources) + else + filter.call(resources, filter_param) + end end def filter_results(resources) - query.filters.each do |filter_name| + query.filters.each do |filter_query| + filter_name, filter_param = filter_query.split(":") filter = valid_filters[filter_name] - resources = apply_filter(filter, resources) + resources = apply_filter(filter, filter_param, resources) end resources end def query_template @@ -100,30 +106,28 @@ end ["%#{term.mb_chars.downcase}%"] * fields_count end def search_attributes - attribute_types.keys.select do |attribute| - attribute_types[attribute].searchable? - end + @dashboard.search_attributes end def search_results(resources) resources. left_joins(tables_to_join). where(query_template, *query_values) end def valid_filters - if @dashboard_class.const_defined?(:COLLECTION_FILTERS) - @dashboard_class.const_get(:COLLECTION_FILTERS).stringify_keys + if @dashboard.class.const_defined?(:COLLECTION_FILTERS) + @dashboard.class.const_get(:COLLECTION_FILTERS).stringify_keys else {} end end def attribute_types - @dashboard_class::ATTRIBUTE_TYPES + @dashboard.class.const_get(:ATTRIBUTE_TYPES) end def query_table_name(attr) if association_search?(attr) provided_class_name = attribute_types[attr].options[:class_name]