blacklight_advanced_search 1.0.0pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/.gitignore +5 -0
  2. data/LICENSE +14 -0
  3. data/README.rdoc +172 -0
  4. data/Rakefile +6 -0
  5. data/VERSION +1 -0
  6. data/app/controllers/advanced_controller.rb +61 -0
  7. data/app/controllers/application_controller.rb +5 -0
  8. data/app/helpers/advanced_helper.rb +40 -0
  9. data/app/views/advanced/_advanced_search_facets.html.erb +16 -0
  10. data/app/views/advanced/_advanced_search_fields.html.erb +6 -0
  11. data/app/views/advanced/_advanced_search_form.html.erb +48 -0
  12. data/app/views/advanced/_advanced_search_help.html.erb +22 -0
  13. data/app/views/advanced/index.html.erb +10 -0
  14. data/app/views/blacklight_advanced_search/_facet_limit.html.erb +25 -0
  15. data/blacklight_advanced_search.gemspec +24 -0
  16. data/config/routes.rb +3 -0
  17. data/install.rb +0 -0
  18. data/lib/blacklight_advanced_search/advanced_query_parser.rb +61 -0
  19. data/lib/blacklight_advanced_search/catalog_helper_override.rb +53 -0
  20. data/lib/blacklight_advanced_search/controller.rb +101 -0
  21. data/lib/blacklight_advanced_search/engine.rb +47 -0
  22. data/lib/blacklight_advanced_search/filter_parser.rb +13 -0
  23. data/lib/blacklight_advanced_search/parsing_nesting_parser.rb +18 -0
  24. data/lib/blacklight_advanced_search/render_constraints_override.rb +96 -0
  25. data/lib/blacklight_advanced_search/version.rb +10 -0
  26. data/lib/blacklight_advanced_search.rb +74 -0
  27. data/lib/generators/blacklight_advanced_search/assets_generator.rb +25 -0
  28. data/lib/generators/blacklight_advanced_search/blacklight_advanced_search_generator.rb +11 -0
  29. data/lib/generators/blacklight_advanced_search/templates/_search_form.html.erb +13 -0
  30. data/lib/generators/blacklight_advanced_search/templates/blacklight_advanced_search_config.rb +86 -0
  31. data/lib/generators/blacklight_advanced_search/templates/public/javascripts/blacklight_advanced_search_javascript.js +62 -0
  32. data/lib/generators/blacklight_advanced_search/templates/public/stylesheets/advanced_results.css +41 -0
  33. data/lib/generators/blacklight_advanced_search/templates/public/stylesheets/blacklight_advanced_search_styles.css +129 -0
  34. data/lib/parsing_nesting/Readme.rdoc +160 -0
  35. data/lib/parsing_nesting/grammar.rb +78 -0
  36. data/lib/parsing_nesting/tree.rb +457 -0
  37. data/spec/lib/filter_parser_spec.rb +28 -0
  38. data/spec/parsing_nesting/build_tree_spec.rb +238 -0
  39. data/spec/parsing_nesting/consuming_spec.rb +49 -0
  40. data/spec/parsing_nesting/to_solr_spec.rb +360 -0
  41. data/spec/rcov.opts +3 -0
  42. data/spec/spec.opts +4 -0
  43. data/spec/spec_helper.rb +9 -0
  44. data/spec/support/blacklight_mock.rb +5 -0
  45. data/uninstall.rb +1 -0
  46. metadata +164 -0
@@ -0,0 +1,101 @@
1
+ require 'blacklight_advanced_search/parsing_nesting_parser'
2
+
3
+ # This module gets included into CatalogController, or another SolrHelper
4
+ # includer, to add behavior into solr_search_params_logic.
5
+ module BlacklightAdvancedSearch::Controller
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ if BlacklightAdvancedSearch.config[:advanced_parse_q]
10
+ # Only to parse AND/OR in ordinary 'q'
11
+ solr_search_params_logic << :add_advanced_parse_q_to_solr
12
+ end
13
+
14
+ # Always, to parse adv search form params.
15
+ solr_search_params_logic << :add_advanced_search_to_solr
16
+
17
+
18
+ helper BlacklightAdvancedSearch::RenderConstraintsOverride
19
+ helper BlacklightAdvancedSearch::CatalogHelperOverride
20
+ end
21
+
22
+
23
+ # this method should get added into the solr_search_params_logic
24
+ # list, in a position AFTER normal query handling (:add_query_to_solr),
25
+ # so it'll overwrite that if and only if it's an advanced search.
26
+ # adds a 'q' and 'fq's based on advanced search form input.
27
+ def add_advanced_search_to_solr(solr_parameters, req_params = params)
28
+ # If we've got the hint that we're doing an 'advanced' search, then
29
+ # map that to solr #q, over-riding whatever some other logic may have set, yeah.
30
+ # the hint right now is :search_field request param is set to a magic
31
+ # key.
32
+ if (req_params[:search_field] == BlacklightAdvancedSearch.config[:url_key] ||
33
+ req_params[:f_inclusive])
34
+ # Set this as a controller instance variable, not sure if some views/helpers depend on it. Better to leave it as a local variable
35
+ # if not, more investigation later.
36
+ @advanced_query = BlacklightAdvancedSearch::QueryParser.new(req_params, BlacklightAdvancedSearch.config )
37
+ deep_merge!(solr_parameters, @advanced_query.to_solr )
38
+ if @advanced_query.keyword_queries.length > 0
39
+ # force :qt if set
40
+ solr_parameters[:qt] = BlacklightAdvancedSearch.config[:qt] if BlacklightAdvancedSearch.config[:qt]
41
+ solr_parameters[:defType] = "lucene"
42
+ end
43
+
44
+ end
45
+ end
46
+
47
+ # This method can be included in solr_search_params_logic to have us
48
+ # parse an ordinary entered :q for AND/OR/NOT and produce appropriate
49
+ # Solr query. Note that it is NOT included in solr_search_params_logic
50
+ # by default when this module is included, because it is optional behavior.
51
+ # BlacklightAdvancedSearch init code will add it to CatalogController
52
+ # if it's configured to do so. You can of course add it yourself
53
+ # manually too.
54
+ def add_advanced_parse_q_to_solr(solr_parameters, req_params = params)
55
+ unless req_params[:q].blank?
56
+ field_def = Blacklight.search_field_def_for_key( req_params[:search_field]) ||
57
+ Blacklight.default_search_field
58
+ solr_direct_params = field_def[:solr_parameters] || {}
59
+ solr_local_params = field_def[:solr_local_parameters] || {}
60
+
61
+ deep_merge!(solr_parameters, solr_direct_params)
62
+
63
+ deep_merge!(
64
+ solr_parameters,
65
+ ParsingNesting::Tree.parse(req_params[:q]).to_single_query_params( solr_local_params )
66
+ )
67
+ end
68
+ end
69
+
70
+
71
+ protected
72
+ # Merges new_hash into source_hash, without modifying arguments, but
73
+ # will merge nested arrays and hashes too. Also will NOT merge nil or blank
74
+ # from new_hash into old_hash
75
+ def deep_merge!(source_hash, new_hash)
76
+ source_hash.merge!(new_hash) do |key, old, new|
77
+ if new.respond_to?(:blank) && new.blank?
78
+ old
79
+ elsif (old.kind_of?(Hash) and new.kind_of?(Hash))
80
+ deep_merge!(old, new)
81
+ elsif (old.kind_of?(Array) and new.kind_of?(Array))
82
+ old.concat(new).uniq
83
+ elsif new.nil?
84
+ # Allowing nil values to over-write on merge messes things up.
85
+ # don't set a nil value if you really want to force blank, set
86
+ # empty string.
87
+ old
88
+ else
89
+ new
90
+ end
91
+ end
92
+ end
93
+
94
+
95
+ end
96
+
97
+
98
+
99
+
100
+
101
+
@@ -0,0 +1,47 @@
1
+ require 'blacklight'
2
+ require 'blacklight_advanced_search'
3
+ require 'rails'
4
+
5
+ module BlacklightAdvancedSearch
6
+ class Engine < Rails::Engine
7
+
8
+ config.after_initialize do
9
+ # After local app initializers that may set some config, we
10
+ # finish it off with defaults and normalization.
11
+ BlacklightAdvancedSearch.init
12
+ end
13
+
14
+
15
+ # Do these things in a to_prepare block, to try and make them work
16
+ # in development mode with class-reloading. The trick is we can't
17
+ # be sure if the controllers we're modifying are being reloaded in
18
+ # dev mode, if they are in the BL plugin and haven't been copied to
19
+ # local, they won't be. But we do our best.
20
+ config.to_prepare do
21
+ # Ordinary module over-ride to CatalogController
22
+ CatalogController.send(:include,
23
+ BlacklightAdvancedSearch::Controller
24
+ ) unless
25
+ CatalogController.include?(
26
+ BlacklightAdvancedSearch::Controller
27
+ )
28
+
29
+
30
+
31
+ SearchHistoryController.send(:helper,
32
+ BlacklightAdvancedSearch::RenderConstraintsOverride
33
+ ) unless
34
+ SearchHistoryController.helpers.is_a?(
35
+ BlacklightAdvancedSearch::RenderConstraintsOverride
36
+ )
37
+
38
+ SavedSearchesController.send(:helper,
39
+ BlacklightAdvancedSearch::RenderConstraintsOverride
40
+ ) unless
41
+ SearchHistoryController.helpers.is_a?(
42
+ BlacklightAdvancedSearch::RenderConstraintsOverride
43
+ )
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,13 @@
1
+ module BlacklightAdvancedSearch::FilterParser
2
+ # Returns an array of solr :fq params. taking advanced search inclusive
3
+ # facet value lists out of params.
4
+ def generate_solr_fq
5
+ filter_queries = []
6
+ filters.each do |solr_field, value_list|
7
+ filter_queries << "#{solr_field}:(" +
8
+ value_list.collect {|v| '"' + v.gsub('"', '\"') +'"' }.join(" OR ") +
9
+ ")"
10
+ end
11
+ return filter_queries
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require 'parsing_nesting/tree'
2
+ module BlacklightAdvancedSearch::ParsingNestingParser
3
+
4
+ def process_query(params,config)
5
+ queries = []
6
+ keyword_queries.each do |field,query|
7
+ queries << ParsingNesting::Tree.parse(query).to_query( local_param_hash(field) )
8
+ end
9
+ queries.join( ' ' + keyword_op + ' ')
10
+ end
11
+
12
+ def local_param_hash(key)
13
+ field_def = BlacklightAdvancedSearch.search_field_def_for_key(key)
14
+
15
+ (field_def[:solr_parameters] || {}).merge(field_def[:solr_local_parameters] || {})
16
+ end
17
+
18
+ end
@@ -0,0 +1,96 @@
1
+ # Meant to be applied on top of Blacklight view helpers, to over-ride
2
+ # certain methods from RenderConstraintsHelper (newish in BL),
3
+ # to effect constraints rendering and search history rendering,
4
+ module BlacklightAdvancedSearch::RenderConstraintsOverride
5
+
6
+ #Over-ride of Blacklight method, provide advanced constraints if needed,
7
+ # otherwise call super. Existence of an @advanced_query instance variable
8
+ # is our trigger that we're in advanced mode.
9
+ def render_constraints_query(my_params = params)
10
+ if (@advanced_query.nil? || @advanced_query.keyword_queries.empty? )
11
+ return super(my_params)
12
+ else
13
+ content = ""
14
+ @advanced_query.keyword_queries.each_pair do |field, query|
15
+ label = BlacklightAdvancedSearch.search_field_def_for_key(field)[:display_label]
16
+ content << render_constraint_element(
17
+ label, query,
18
+ :remove =>
19
+ catalog_index_path(remove_advanced_keyword_query(field,my_params))
20
+ )
21
+ end
22
+ if (@advanced_query.keyword_op == "OR" &&
23
+ @advanced_query.keyword_queries.length > 1)
24
+ content = '<span class="inclusive_or appliedFilter">' + '<span class="operator">Any of:</span>' + content + '</span>'
25
+ end
26
+
27
+ return content
28
+ end
29
+ end
30
+
31
+ #Over-ride of Blacklight method, provide advanced constraints if needed,
32
+ # otherwise call super. Existence of an @advanced_query instance variable
33
+ # is our trigger that we're in advanced mode.
34
+ def render_constraints_filters(my_params = params)
35
+ content = super(my_params)
36
+
37
+ if (@advanced_query)
38
+ @advanced_query.filters.each_pair do |field, value_list|
39
+ label = Blacklight.config[:facet][:labels][field] or field.to_s.capitalize
40
+ content << render_constraint_element(label,
41
+ value_list.join(" OR "),
42
+ :remove => catalog_index_path( remove_advanced_filter_group(field, my_params) )
43
+ )
44
+ end
45
+ end
46
+
47
+ return content
48
+ end
49
+
50
+ def render_search_to_s_filters(my_params)
51
+ content = super(my_params)
52
+
53
+ advanced_query = BlacklightAdvancedSearch::QueryParser.new(my_params, BlacklightAdvancedSearch.config )
54
+
55
+ if (advanced_query.filters.length > 0)
56
+ advanced_query.filters.each_pair do |field, values|
57
+ label = Blacklight.config[:facet][:labels][field] or field.to_s.capitalize
58
+
59
+ content << render_search_to_s_element(
60
+ label,
61
+ values.join(" OR ")
62
+ )
63
+ end
64
+ end
65
+ return content
66
+ end
67
+
68
+ def render_search_to_s_q(my_params)
69
+ content = super(my_params)
70
+
71
+ advanced_query = BlacklightAdvancedSearch::QueryParser.new(my_params, BlacklightAdvancedSearch.config )
72
+
73
+ if (advanced_query.keyword_queries.length > 1 &&
74
+ advanced_query.keyword_op == "OR")
75
+ # Need to do something to make the inclusive-or search clear
76
+
77
+ display_as = advanced_query.keyword_queries.collect do |field, query|
78
+ h( BlacklightAdvancedSearch.search_field_def_for_key(field)[:display_label] + ": " + query )
79
+ end.join(" ; ")
80
+
81
+ content << render_search_to_s_element("Any of",
82
+ display_as,
83
+ :escape_value => false
84
+ )
85
+ elsif (advanced_query.keyword_queries.length > 0)
86
+ advanced_query.keyword_queries.each_pair do |field, query|
87
+ label = BlacklightAdvancedSearch.search_field_def_for_key(field)[:display_label]
88
+
89
+ content << render_search_to_s_element(label, query)
90
+ end
91
+ end
92
+
93
+ return content
94
+ end
95
+
96
+ end
@@ -0,0 +1,10 @@
1
+ module BlacklightAdvancedSearch
2
+ unless BlacklightAdvancedSearch.const_defined? :VERSION
3
+ def self.version
4
+ @version ||= File.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION')).chomp
5
+ end
6
+
7
+ VERSION = self.version
8
+ end
9
+ end
10
+
@@ -0,0 +1,74 @@
1
+ module BlacklightAdvancedSearch
2
+ autoload :Controller, 'blacklight_advanced_search/controller'
3
+ autoload :RenderConstraintsOverride, 'blacklight_advanced_search/render_constraints_override'
4
+ autoload :CatalogHelperOverride, 'blacklight_advanced_search/catalog_helper_override'
5
+ autoload :QueryParser, 'blacklight_advanced_search/advanced_query_parser'
6
+ autoload :ParsingNestingParser, 'blacklight_advanced_search/parsing_nesting_parser'
7
+ autoload :FilterParser, 'blacklight_advanced_search/filter_parser'
8
+
9
+ require 'blacklight_advanced_search/version'
10
+ require 'blacklight_advanced_search/engine'
11
+
12
+ extend Blacklight::SearchFields # for search field config, so we can use same format as BL, or use ones already set in BL even.
13
+
14
+ # Has to be called in an after_initialize block, to have access
15
+ # to Blacklight.config already configured, to look at it for defaults.
16
+ def self.init
17
+ # apply defaults to anything not set.
18
+ BlacklightAdvancedSearch.config.reverse_merge!( BlacklightAdvancedSearch.config_defaults )
19
+
20
+ logger.info("BlacklightAdvancedSearch.config: initialized with: #{ config.inspect }")
21
+ Blacklight.config[:search_fields] << {:display_label => 'Advanced', :key => BlacklightAdvancedSearch.config[:url_key], :include_in_simple_select => false, :include_in_advanced_search => false} unless Blacklight.config[:search_fields].map { |x| x[:key] }.include? BlacklightAdvancedSearch.config[:url_key]
22
+ end
23
+
24
+ def self.logger
25
+ RAILS_DEFAULT_LOGGER
26
+ end
27
+
28
+ # Hash of our config. The :search_fields key in hash is used by
29
+ # Blacklight::SearchFields module, must be an array of search field
30
+ # definitions compatible with that module, or if missing will
31
+ # inherit Blacklight.config[:search_fields]
32
+ def self.config
33
+ @config ||= {}
34
+ end
35
+
36
+ # Has to be called in an after_initialize, to make sure Blacklight.config
37
+ # is already defined.
38
+ def self.config_defaults
39
+ config = {}
40
+ config[:url_key] ||= "advanced"
41
+ config[:qt] ||= Blacklight.config[:default_qt] ||
42
+ (Blacklight.config[:default_solr_params] && Blacklight.config[:default_solr_params][:qt])
43
+ config[:form_solr_parameters] ||= {}
44
+
45
+
46
+ config[:search_fields] ||= Blacklight.config[:search_fields].find_all do |field_def|
47
+ (field_def[:qt].nil? || field_def[:qt] == config[:qt]) &&
48
+ field_def[:include_in_advanced_search] != false
49
+ end
50
+
51
+ config
52
+ end
53
+
54
+
55
+ def self.solr_local_params_for_search_field(key)
56
+
57
+ field_def = search_field_def_for_key(key)
58
+
59
+ solr_params = (field_def[:solr_parameters] || {}).merge(field_def[:solr_local_parameters] || {})
60
+
61
+ solr_params.collect do |key, val|
62
+ key.to_s + "=" + solr_param_quote(val)
63
+ end.join(" ")
64
+
65
+ end
66
+
67
+ def self.solr_param_quote(val)
68
+ unless val =~ /^[a-zA-Z$_\-\^]+$/
69
+ val = "'" + val.gsub("'", "\\\'").gsub('"', "\\\"") + "'"
70
+ end
71
+ return val
72
+ end
73
+
74
+ end
@@ -0,0 +1,25 @@
1
+ # Copy BlacklightAdvancedSearch assets to public folder in current app.
2
+ # If you want to do this on application startup, you can
3
+ # add this next line to your one of your environment files --
4
+ # generally you'd only want to do this in 'development', and can
5
+ # add it to environments/development.rb:
6
+ # require File.join(BlacklightAdvancedSearch.root, "lib", "generators", "blacklight", "assets_generator.rb")
7
+ # BlacklightAdvancedSearch::AssetsGenerator.start(["--force", "--quiet"])
8
+
9
+
10
+ # Need the requires here so we can call the generator from environment.rb
11
+ # as suggested above.
12
+ require 'rails/generators'
13
+ require 'rails/generators/base'
14
+ module BlacklightAdvancedSearch
15
+ class AssetsGenerator < Rails::Generators::Base
16
+ source_root File.expand_path('../templates', __FILE__)
17
+
18
+ def assets
19
+ directory("public/stylesheets")
20
+ directory("public/javascripts")
21
+ end
22
+
23
+ end
24
+ end
25
+
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+
3
+ class BlacklightAdvancedSearchGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ require File.expand_path('../assets_generator.rb', __FILE__)
7
+ def copy_public_assets
8
+ BlacklightAdvancedSearch::AssetsGenerator.start
9
+ end
10
+
11
+ end
@@ -0,0 +1,13 @@
1
+ <div id="search" class="search">
2
+ <% form_tag catalog_index_path, :method => :get do %>
3
+ <h2 class="search"><%= label_tag(:q, "Search ") %></h2>
4
+ <%= text_field_tag :q, params[:q], :class => "q" %>
5
+ <%= label_tag(:search_field, " in ") %>
6
+ <%= select_tag(:search_field, options_for_select(search_fields, h(params[:search_field])), :title => "Targeted search options", :class=>"search_field") %>
7
+
8
+ <%= search_as_hidden_fields(:omit_keys => [:q, :search_field, :qt, :page]) %>
9
+
10
+ <%= submit_tag 'search', :class=>'submit' %>
11
+ <% end %>
12
+ <%= link_to 'More options', params.merge(:controller=>"advanced", :action=>"index") , :class=>"advanced_search"%>
13
+ </div>
@@ -0,0 +1,86 @@
1
+ ##
2
+ # This example config file is set up to work using the Solr request handler
3
+ # called "advanced" in the example Blacklight solrconfig.xml:
4
+ # http://github.com/projectblacklight/blacklight-jetty/blob/master/solr/conf/solrconfig.xml
5
+ #
6
+ # NOTE WELL: Using a seperate request handler is just one option, in most cases
7
+ # it's simpler to use your default solr request handler set in Blacklight itself,
8
+ # in which case you would not want to set any of the configuration below!
9
+ # See README.
10
+
11
+ BlacklightAdvancedSearch.config.merge!(
12
+ # :search_field => "advanced", # name of key in Blacklight URL, no reason to change usually.
13
+
14
+ # Set advanced_parse_q to true to allow AND/OR/NOT in your basic/simple
15
+ # Blacklight search, parsed by Advanced Search Plugin.
16
+ #:advanced_parse_q => true,
17
+
18
+ :qt => "advanced" # name of Solr request handler, leave unset to use the same one as your Blacklight.config[:default_qt]
19
+
20
+ )
21
+
22
+
23
+ # You don't need to specify search_fields, if you leave :qt unspecified
24
+ # above, and have search field config in Blacklight already using that
25
+ # same qt, the plugin will simply use them. But if you'd like to use a
26
+ # different solr qt request handler, or have another reason for wanting
27
+ # to manually specify search fields, you can. Uses the hash format
28
+ # specified in Blacklight::SearchFields
29
+
30
+ BlacklightAdvancedSearch.config[:search_fields] = search_fields = []
31
+ search_fields << {
32
+ :key => 'author',
33
+ :solr_local_parameters => {
34
+ :pf => "$pf_author",
35
+ :qf => "$qf_author"
36
+ }
37
+ }
38
+
39
+ search_fields << {
40
+ :key => 'title',
41
+ :solr_local_parameters => {
42
+ :pf => "$pf_title",
43
+ :qf => "$qf_title"
44
+ }
45
+ }
46
+
47
+ search_fields << {
48
+ :key => 'subject',
49
+ :solr_local_parameters => {
50
+ :pf => "$pf_subject",
51
+ :qf => "$qf_subject"
52
+ }
53
+ }
54
+
55
+ search_fields << {
56
+ :key => 'keyword',
57
+ :solr_local_parameters => {
58
+ :pf => "$pf_keyword",
59
+ :qf => "$qf_keyword"
60
+ }
61
+ }
62
+
63
+ search_fields << {
64
+ :key => 'numbers',
65
+ :solr_local_parameters => {
66
+ :pf => "$pf_number",
67
+ :qf => "$qf_number"
68
+ }
69
+ }
70
+
71
+ ##
72
+ # The advanced search form displays facets as a limit option.
73
+ # By default it will use whatever facets, if any, are returned
74
+ # by the Solr qt request handler in use. However, you can use
75
+ # this config option to have it request other facet params than
76
+ # default in the Solr request handler, in desired.
77
+
78
+ # BlacklightAdvancedSearch.config[:form_solr_parameters] = {
79
+ # "facet.field" => [
80
+ # "format",
81
+ # "lc_1letter_facet",
82
+ # "language_facet"
83
+ # ],
84
+ # "facet.limit" => -1, # all facet values
85
+ # "facet.sort" => "index" # sort by index value (alphabetically, more or less)
86
+ # }
@@ -0,0 +1,62 @@
1
+ $(document).ready(function() {
2
+ $('.limit_column ul').each(function(){
3
+ var ul = $(this);
4
+ // find all ul's that don't have any span descendants with a class of "selected"
5
+ if($('span.selected', ul).length == 0){
6
+ // hide it
7
+ ul.hide();
8
+ // attach the toggle behavior to the h3 tag
9
+ $('h3', ul.parent()).click(function(){
10
+ // toggle the next ul sibling
11
+ $(this).next('ul').slideToggle();
12
+ });
13
+ }
14
+ });
15
+
16
+
17
+ /* Stuff for handling the checkboxes */
18
+ /* When you click a checkbox, update readout */
19
+
20
+
21
+ /* Pass in a jquery obj holding the "selected facet element" spans, get back
22
+ a string for display representing currently checked things. */
23
+ function checkboxesToString(checkbox_elements) {
24
+ var selectedLabels = new Array();
25
+ checkbox_elements.each(function() {
26
+ if ($(this).is(":checked")) {
27
+ selectedLabels.push( $(this).next('label').text());
28
+ }
29
+ });
30
+ return selectedLabels.join(" OR ");
31
+ }
32
+
33
+ //Pass in JQuery object of zero or more <div class="facet_item"> blocks,
34
+ //that contain an h3, some checkboxes, and a span.adv_facet_selections for
35
+ //display of current selections. Will update the span.
36
+ function updateSelectedDisplay(facet_item) {
37
+ var checkboxes = $(facet_item).find("input:checkbox");
38
+ var displaySpan = $(facet_item).find("span.adv_facet_selections");
39
+ var displayStr = checkboxesToString( checkboxes );
40
+
41
+ displaySpan.text( displayStr );
42
+ if (displayStr == "") {
43
+ displaySpan.hide();
44
+ } else {
45
+ displaySpan.show();
46
+ }
47
+
48
+
49
+ }
50
+
51
+ // on page load, set initial properly
52
+ $(".facet_item").each(function() {
53
+ updateSelectedDisplay(this);
54
+ });
55
+
56
+ //change on checkbox change
57
+ $(".facet_item input:checkbox").change( function() {
58
+ updateSelectedDisplay( $(this).closest(".facet_item"));
59
+ });
60
+
61
+
62
+ });
@@ -0,0 +1,41 @@
1
+ /* Classes used for styling our custom components on the search results page */
2
+
3
+ /* constraints */
4
+
5
+ .inclusive_or .operator {
6
+ margin-right: 1em;
7
+ }
8
+
9
+ .inclusive_or .appliedFilter {
10
+ background-color: #F0F0F0;
11
+ }
12
+
13
+ /* making it match an h3 */
14
+ #appliedParams .inclusive_or .operator {
15
+ font-weight: bold;
16
+ color: #555555;
17
+ font-size: 108%;
18
+ }
19
+
20
+ /* Facet limit */
21
+
22
+ /* over-ride BL */
23
+ #facets .advanced_facet_limit ul {
24
+ border-bottom: none;
25
+ padding-bottom: 0;
26
+ }
27
+
28
+
29
+ .facet_limit .inclusive_or h4 {
30
+ margin-bottom: 0.5em;
31
+ }
32
+
33
+ .facet_limit .inclusive_or li {
34
+ margin-left: 1em;
35
+ }
36
+
37
+ /* optional link to search form */
38
+ .search .advanced_search {
39
+ font-size: 83.33%;
40
+ }
41
+