Class: Blacklight::SearchState::FilterField
- Inherits:
 - 
      Object
      
        
- Object
 - Blacklight::SearchState::FilterField
 
 
- Defined in:
 - lib/blacklight/search_state/filter_field.rb
 
Overview
Modeling access to filter query parameters
Direct Known Subclasses
Constant Summary collapse
- MISSING =
 { missing: true }.freeze
Instance Attribute Summary collapse
- #config ⇒ Blacklight::Configuration::FacetField
 - 
  
    
      #filters_key  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Returns the value of attribute filters_key.
 - 
  
    
      #inclusive_filters_key  ⇒ Object 
    
    
  
  
  
  
    
      readonly
    
    
  
  
  
  
  
  
    
Returns the value of attribute inclusive_filters_key.
 - #inclusive_param ⇒ String, Symbol
 - #param ⇒ String, Symbol
 - #search_state ⇒ Blacklight::SearchState
 
Instance Method Summary collapse
- 
  
    
      #add(item)  ⇒ Blacklight::SearchState 
    
    
  
  
  
  
  
  
  
  
  
    
New state.
 - 
  
    
      #each_value(except: [], &block)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Appease rubocop rules by implementing #each_value.
 - 
  
    
      #include?(item)  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
Whether the provided filter is currently applied/selected.
 - 
  
    
      #initialize(config, search_state)  ⇒ FilterField 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    
A new instance of FilterField.
 - #key ⇒ String, Symbol
 - #permitted_params ⇒ Object
 - 
  
    
      #remove(item)  ⇒ Blacklight::SearchState 
    
    
  
  
  
  
  
  
  
  
  
    
New state.
 - 
  
    
      #values(except: [])  ⇒ Array 
    
    
  
  
  
  
  
  
  
  
  
    
An array of applied filters.
 
Constructor Details
#initialize(config, search_state) ⇒ FilterField
Returns a new instance of FilterField.
      24 25 26 27 28 29  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 24 def initialize(config, search_state) @config = config @search_state = search_state @filters_key = :f @inclusive_filters_key = :f_inclusive end  | 
  
Instance Attribute Details
#config ⇒ Blacklight::Configuration::FacetField
      17 18 19  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 17 def config @config end  | 
  
#filters_key ⇒ Object (readonly)
Returns the value of attribute filters_key.
      17 18 19  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 17 def filters_key @filters_key end  | 
  
#inclusive_filters_key ⇒ Object (readonly)
Returns the value of attribute inclusive_filters_key.
      17 18 19  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 17 def inclusive_filters_key @inclusive_filters_key end  | 
  
#inclusive_param ⇒ String, Symbol
      17  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 17 attr_reader :config, :search_state, :filters_key, :inclusive_filters_key  | 
  
#param ⇒ String, Symbol
      17  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 17 attr_reader :config, :search_state, :filters_key, :inclusive_filters_key  | 
  
#search_state ⇒ Blacklight::SearchState
      17  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 17 attr_reader :config, :search_state, :filters_key, :inclusive_filters_key  | 
  
Instance Method Details
#add(item) ⇒ Blacklight::SearchState
Returns new state.
      33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 33 def add(item) new_state = search_state.reset_search if item.try(:missing) # if this is a 'missing' facet value, the :fq is only for backwards compatibility elsif item.respond_to?(:fq) Array(item.fq).each do |f, v| new_state = new_state.filter(f).add(v) end end return new_state.filter(item.field).add(item) if item.respond_to?(:field) && item.field != key url_key = key params = new_state.params param = filters_key value = as_url_parameter(item) if value == Blacklight::SearchState::FilterField::MISSING url_key = "-#{key}" value = Blacklight::Engine.config.blacklight.facet_missing_param end param = inclusive_filters_key if value.is_a?(Array) # value could be a string params[param] = (params[param] || {}).dup if value.is_a? Array params[param][url_key] = value elsif config.single params[param][url_key] = [value] else params[param][url_key] = Array(params[param][url_key] || []).dup params[param][url_key].push(value) end new_state.reset(params) end  | 
  
#each_value(except: [], &block) ⇒ Object
Appease rubocop rules by implementing #each_value
      123 124 125  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 123 def each_value(except: [], &block) values(except: except).each(&block) end  | 
  
#include?(item) ⇒ Boolean
Returns whether the provided filter is currently applied/selected.
      129 130 131 132 133 134 135 136 137 138 139 140 141 142 143  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 129 def include?(item) return search_state.filter(item.field).selected?(item) if item.respond_to?(:field) && item.field != key value = as_url_parameter(item) params = search_state.params case value when Array (params.dig(inclusive_filters_key, key) || []).to_set == value.to_set when Blacklight::SearchState::FilterField::MISSING (params.dig(filters_key, "-#{key}") || []).include?(Blacklight::Engine.config.blacklight.facet_missing_param) else (params.dig(filters_key, key) || []).include?(value) end end  | 
  
#key ⇒ String, Symbol
      20  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 20 delegate :key, to: :config  | 
  
#permitted_params ⇒ Object
      145 146 147 148 149 150 151 152 153 154 155 156 157  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 145 def permitted_params if config.pivot { filters_key => config.pivot.each_with_object({}) { |key, filter| filter.merge(key => [], "-#{key}" => []) }, inclusive_filters_key => config.pivot.each_with_object({}) { |key, filter| filter.merge(key => []) } } else { filters_key => { config.key => [], "-#{config.key}" => [] }, inclusive_filters_key => { config.key => [] } } end end  | 
  
#remove(item) ⇒ Blacklight::SearchState
Returns new state.
      75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 75 def remove(item) new_state = search_state.reset_search return new_state.filter(item.field).remove(item) if item.respond_to?(:field) && item.field != key url_key = config.key params = new_state.params param = filters_key value = as_url_parameter(item) if value == Blacklight::SearchState::FilterField::MISSING url_key = "-#{key}" value = Blacklight::Engine.config.blacklight.facet_missing_param end param = inclusive_filters_key if value.is_a?(Array) # need to dup the facet values too, # if the values aren't dup'd, then the values # from the session will get remove in the show view... params[param] = (params[param] || {}).dup params[param][url_key] = (params[param][url_key] || []).dup collection = params[param][url_key] params[param][url_key] = collection - Array(value) params[param].delete(url_key) if params[param][url_key].empty? params.delete(param) if params[param].empty? new_state.reset(params) end  | 
  
#values(except: []) ⇒ Array
Returns an array of applied filters.
      109 110 111 112 113 114 115 116 117 118 119  | 
    
      # File 'lib/blacklight/search_state/filter_field.rb', line 109 def values(except: []) params = search_state.params return [] if params.blank? f = except.include?(:filters) ? [] : [params.dig(filters_key, key)].flatten.compact f_inclusive = [params.dig(:f_inclusive, key)] unless params.dig(inclusive_filters_key, key).blank? || except.include?(:inclusive_filters) f_missing = [Blacklight::SearchState::FilterField::MISSING] if params.dig(filters_key, "-#{key}")&.any? { |v| v == Blacklight::Engine.config.blacklight.facet_missing_param } f_missing = [] if except.include?(:missing) f + (f_inclusive || []) + (f_missing || []) end  |