blacklight_advanced_search 1.2.4 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/README.rdoc +8 -4
- data/Rakefile +51 -0
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight_advanced_search/blacklight_advanced_search_javascript.js +12 -26
- data/app/assets/stylesheets/blacklight_advanced_search/blacklight_advanced_search_styles.css.scss +3 -85
- data/app/helpers/advanced_helper.rb +9 -9
- data/app/views/advanced/_advanced_search_facets.html.erb +3 -1
- data/app/views/advanced/_advanced_search_fields.html.erb +1 -1
- data/app/views/advanced/_advanced_search_form.html.erb +21 -17
- data/app/views/advanced/_facet_layout.html.erb +1 -1
- data/app/views/advanced/_facet_limit.html.erb +1 -1
- data/app/views/blacklight_advanced_search/_facet_limit.html.erb +3 -2
- data/blacklight_advanced_search.gemspec +2 -1
- data/lib/blacklight_advanced_search/render_constraints_override.rb +23 -19
- data/lib/generators/blacklight_advanced_search/templates/_search_form.html.erb +22 -12
- data/spec/acceptance/blacklight_advanced_search_form_spec.rb +65 -4
- data/spec/internal/app/controllers/application_controller.rb +2 -0
- data/spec/internal/config/solr.yml +1 -1
- data/spec/spec_helper.rb +2 -3
- metadata +142 -132
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -167,12 +167,16 @@ You may also find the rspecs for parsing a user-entered query and converting it
|
|
167
167
|
|
168
168
|
== Running tests
|
169
169
|
|
170
|
-
|
170
|
+
The Blacklight Advanced Search acceptance tests require a copy of the blacklight-jetty demo index. You can get a copy by running:
|
171
|
+
|
172
|
+
git submodule init
|
173
|
+
git submodule update
|
174
|
+
|
175
|
+
(Limited) test coverage is provided with rspec, run all tests (and start the jetty instance) by running:
|
176
|
+
rake ci
|
171
177
|
|
172
|
-
|
173
|
-
rspec
|
178
|
+
from the blacklight_advanced_search directory. Note: you may need to `bundle install` first.
|
174
179
|
|
175
|
-
from the blacklight_advanced_search directory. you may need to `bundle install` first.
|
176
180
|
|
177
181
|
== To Do
|
178
182
|
|
data/Rakefile
CHANGED
@@ -4,3 +4,54 @@ require 'rake/rdoctask'
|
|
4
4
|
|
5
5
|
require 'bundler'
|
6
6
|
Bundler::GemHelper.install_tasks
|
7
|
+
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
|
10
|
+
require 'blacklight'
|
11
|
+
import File.join(Blacklight.root, 'lib', 'railties', 'solr_marc.rake')
|
12
|
+
|
13
|
+
task :default => :spec
|
14
|
+
|
15
|
+
desc "Run specs"
|
16
|
+
RSpec::Core::RakeTask.new do |t|
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
desc "Execute Continuous Integration build"
|
22
|
+
task :ci do
|
23
|
+
|
24
|
+
require 'combustion'
|
25
|
+
require 'blacklight'
|
26
|
+
Combustion.initialize!
|
27
|
+
unless ENV['environment'] == 'test'
|
28
|
+
exec("rake ci environment=test")
|
29
|
+
end
|
30
|
+
|
31
|
+
require 'rails/generators'
|
32
|
+
require File.join(Blacklight.root, 'lib', 'generators', 'blacklight', 'jetty_generator.rb')
|
33
|
+
|
34
|
+
Blacklight::Jetty.start(["--save_location=jetty", "--force"])
|
35
|
+
|
36
|
+
ENV['RAILS_ENV'] = 'test'
|
37
|
+
ENV['CONFIG_PATH'] = File.expand_path(File.join(Blacklight.root, 'lib', 'generators', 'blacklight', 'templates', 'config', 'SolrMarc', 'config-test.properties'))
|
38
|
+
ENV['SOLRMARC_JAR_PATH'] = File.expand_path(File.join(Blacklight.root, 'lib', 'SolrMarc.jar'))
|
39
|
+
ENV['SOLR_PATH'] = File.expand_path(File.join('jetty', 'solr'))
|
40
|
+
ENV['SOLR_WAR_PATH'] = File.expand_path(File.join('jetty', 'webapps', 'solr.war'))
|
41
|
+
Rake::Task['solr:marc:index_test_data'].invoke
|
42
|
+
|
43
|
+
|
44
|
+
require 'jettywrapper'
|
45
|
+
jetty_params = {
|
46
|
+
:jetty_home => File.expand_path(File.dirname(__FILE__) + '/jetty'),
|
47
|
+
:quiet => false,
|
48
|
+
:jetty_port => 8888,
|
49
|
+
:solr_home => File.expand_path(File.dirname(__FILE__) + '/jetty/solr'),
|
50
|
+
:startup_wait => 30
|
51
|
+
}
|
52
|
+
|
53
|
+
error = Jettywrapper.wrap(jetty_params) do
|
54
|
+
Rake::Task['spec'].invoke
|
55
|
+
end
|
56
|
+
raise "test failures: #{error}" if error
|
57
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
2.0.0
|
data/app/assets/javascripts/blacklight_advanced_search/blacklight_advanced_search_javascript.js
CHANGED
@@ -1,53 +1,39 @@
|
|
1
1
|
$(document).ready(function() {
|
2
|
-
|
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
|
-
|
2
|
+
|
17
3
|
/* Stuff for handling the checkboxes */
|
18
4
|
/* When you click a checkbox, update readout */
|
19
|
-
|
20
|
-
|
5
|
+
|
6
|
+
|
21
7
|
/* Pass in a jquery obj holding the "selected facet element" spans, get back
|
22
8
|
a string for display representing currently checked things. */
|
23
9
|
function checkboxesToString(checkbox_elements) {
|
24
10
|
var selectedLabels = new Array();
|
25
11
|
checkbox_elements.each(function() {
|
26
12
|
if ($(this).is(":checked")) {
|
27
|
-
selectedLabels.push( $(this).next('
|
13
|
+
selectedLabels.push( $(this).next('.facet-value').text());
|
28
14
|
}
|
29
15
|
});
|
30
16
|
return selectedLabels.join(" OR ");
|
31
17
|
}
|
32
|
-
|
18
|
+
|
33
19
|
//Pass in JQuery object of zero or more <div class="facet_item"> blocks,
|
34
20
|
//that contain an h3, some checkboxes, and a span.adv_facet_selections for
|
35
|
-
//display of current selections. Will update the span.
|
21
|
+
//display of current selections. Will update the span.
|
36
22
|
function updateSelectedDisplay(facet_item) {
|
37
23
|
var checkboxes = $(facet_item).find("input:checkbox");
|
38
24
|
var displaySpan = $(facet_item).find("span.adv_facet_selections");
|
39
25
|
var displayStr = checkboxesToString( checkboxes );
|
40
|
-
|
26
|
+
|
41
27
|
displaySpan.text( displayStr );
|
42
28
|
if (displayStr == "") {
|
43
29
|
displaySpan.hide();
|
44
30
|
} else {
|
45
31
|
displaySpan.show();
|
46
32
|
}
|
47
|
-
|
48
|
-
|
33
|
+
|
34
|
+
|
49
35
|
}
|
50
|
-
|
36
|
+
|
51
37
|
// on page load, set initial properly
|
52
38
|
$(".facet_item").each(function() {
|
53
39
|
updateSelectedDisplay(this);
|
@@ -57,6 +43,6 @@ $(document).ready(function() {
|
|
57
43
|
$(".facet_item input:checkbox").change( function() {
|
58
44
|
updateSelectedDisplay( $(this).closest(".facet_item"));
|
59
45
|
});
|
60
|
-
|
61
|
-
|
46
|
+
|
47
|
+
|
62
48
|
});
|
data/app/assets/stylesheets/blacklight_advanced_search/blacklight_advanced_search_styles.css.scss
CHANGED
@@ -1,39 +1,12 @@
|
|
1
1
|
|
2
2
|
/* Random styles */
|
3
3
|
|
4
|
-
.
|
5
|
-
|
4
|
+
form.advanced h4 select {
|
5
|
+
height: auto;
|
6
|
+
margin: 0;
|
6
7
|
}
|
7
8
|
|
8
|
-
.advanced_search_field input {
|
9
|
-
margin-bottom: 0.666em;
|
10
|
-
width: 80%;
|
11
|
-
}
|
12
|
-
|
13
|
-
form.advanced label {
|
14
|
-
font-weight:normal;
|
15
|
-
}
|
16
|
-
|
17
|
-
form.advanced h2 {
|
18
|
-
font-weight: normal;
|
19
|
-
background-color: #EEEEEE;
|
20
|
-
height: 3em;
|
21
|
-
}
|
22
|
-
|
23
|
-
form.advanced .limit_column ul {
|
24
|
-
margin: 1em;
|
25
|
-
}
|
26
9
|
|
27
|
-
form.advanced .limit_column li {
|
28
|
-
list-style: none;
|
29
|
-
padding: 0.1em 0.4em;
|
30
|
-
font-size: 80%;
|
31
|
-
}
|
32
|
-
|
33
|
-
form.advanced .facet_item h3 {
|
34
|
-
cursor: pointer;
|
35
|
-
}
|
36
|
-
|
37
10
|
form.advanced .adv_facet_selections {
|
38
11
|
color:green;
|
39
12
|
font-size: 80%;
|
@@ -41,65 +14,10 @@ form.advanced .adv_facet_selections {
|
|
41
14
|
margin-top: 0.25em;
|
42
15
|
}
|
43
16
|
|
44
|
-
form.advanced .advanced_button {
|
45
|
-
-moz-border-radius: 4px 4px 4px 4px;
|
46
|
-
-webkit-border-radius: 4px 4px 4px 4px;
|
47
|
-
border-radius: 4px 4px 4px 4px;
|
48
|
-
background-color: #F6F6F6;
|
49
|
-
border: 1px solid #CCCCCC;
|
50
|
-
color: #2E4F81;
|
51
|
-
display: inline-block;
|
52
|
-
float: right;
|
53
|
-
margin-right: 1em;
|
54
|
-
padding: 0.4em 1em;
|
55
|
-
text-decoration: none;
|
56
|
-
}
|
57
|
-
|
58
|
-
form.advanced .reset {
|
59
|
-
}
|
60
|
-
|
61
|
-
|
62
17
|
|
63
18
|
.advanced_help li {
|
64
19
|
margin-top: 0.5em;
|
65
20
|
margin-bottom: 0.5em;
|
66
21
|
}
|
67
22
|
|
68
|
-
form.advanced .sort_submit_buttons {
|
69
|
-
background-color: #EEEEEE;
|
70
|
-
padding: 1em;
|
71
|
-
margin-top: 1em;
|
72
|
-
overflow: hidden; /* trick into containing floats please */
|
73
|
-
}
|
74
|
-
|
75
|
-
form.advanced .constraints {
|
76
|
-
padding: 1em;
|
77
|
-
margin-top: 1em;
|
78
|
-
background-color: #E2EDFE;
|
79
|
-
border: 1px solid #C4DAFE;
|
80
|
-
}
|
81
|
-
|
82
|
-
form.advanced .constraints h4 {
|
83
|
-
margin-bottom: 0.66em;
|
84
|
-
}
|
85
|
-
|
86
|
-
form.advanced .constraints .constraint {
|
87
|
-
display:block;
|
88
|
-
padding-left:2em;
|
89
|
-
text-indent:-2em;
|
90
|
-
}
|
91
|
-
|
92
|
-
form.advanced .constraints .constraint .filterName {
|
93
|
-
font-weight: bold;
|
94
|
-
margin-right: 0.66em;
|
95
|
-
}
|
96
|
-
|
97
|
-
form.advanced .column > h2 {
|
98
|
-
padding: 0.33em;
|
99
|
-
}
|
100
|
-
form.advanced .column > div {
|
101
|
-
padding-left: 0.33em;
|
102
|
-
padding-right: 0.33em;
|
103
|
-
}
|
104
|
-
|
105
23
|
|
@@ -4,7 +4,7 @@ module AdvancedHelper
|
|
4
4
|
# Fill in default from existing search, if present
|
5
5
|
# -- if you are using same search fields for basic
|
6
6
|
# search and advanced, will even fill in properly if existing
|
7
|
-
# search used basic search on same field present in advanced.
|
7
|
+
# search used basic search on same field present in advanced.
|
8
8
|
def label_tag_default_for(key)
|
9
9
|
if (! params[key].blank?)
|
10
10
|
return params[key]
|
@@ -12,7 +12,7 @@ module AdvancedHelper
|
|
12
12
|
return params["q"]
|
13
13
|
else
|
14
14
|
return nil
|
15
|
-
end
|
15
|
+
end
|
16
16
|
end
|
17
17
|
|
18
18
|
# Is facet value in adv facet search results?
|
@@ -21,7 +21,7 @@ module AdvancedHelper
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Current params without fields that will be over-written by adv. search,
|
24
|
-
# or other fields we don't want.
|
24
|
+
# or other fields we don't want.
|
25
25
|
def advanced_search_context
|
26
26
|
my_params = params.dup
|
27
27
|
[:page, :commit, :f_inclusive, :q, :search_field, :op, :action, :index, :sort, :controller].each do |bad_key|
|
@@ -33,20 +33,20 @@ module AdvancedHelper
|
|
33
33
|
my_params
|
34
34
|
end
|
35
35
|
|
36
|
-
def search_fields_for_advanced_search
|
36
|
+
def search_fields_for_advanced_search
|
37
37
|
# If we could count on 1.9.3 with ordered hashes and
|
38
|
-
# Hash#select that worked reasonably, this would be trivial.
|
39
|
-
# instead, a way compat with 1.8.7 and 1.9.x both.
|
38
|
+
# Hash#select that worked reasonably, this would be trivial.
|
39
|
+
# instead, a way compat with 1.8.7 and 1.9.x both.
|
40
40
|
@search_fields_for_advanced_search ||= begin
|
41
41
|
# make it an ActiveSupport::OrderedHash if it needs to be
|
42
42
|
hash = blacklight_config.search_fields.class.new
|
43
|
-
|
43
|
+
|
44
44
|
blacklight_config.search_fields.each_pair do |key, value|
|
45
45
|
hash[key] = value unless value.include_in_advanced_search == false
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
hash
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<%- search_fields_for_advanced_search.each do |key, field_def| -%>
|
2
2
|
<div class="advanced_search_field">
|
3
3
|
<%= label_tag key, "#{field_def.label }:" %>
|
4
|
-
<%= text_field_tag key, label_tag_default_for(key) %>
|
4
|
+
<%= text_field_tag key, label_tag_default_for(key), :class => 'input-block-level' %>
|
5
5
|
</div>
|
6
6
|
<%- end -%>
|
@@ -1,38 +1,42 @@
|
|
1
1
|
<%= form_tag catalog_index_path, :class => 'advanced', :method => :get do %>
|
2
2
|
|
3
|
-
<%= search_as_hidden_fields(:params => advanced_search_context ) %>
|
3
|
+
<%= search_as_hidden_fields(:params => advanced_search_context ) %>
|
4
|
+
|
5
|
+
<div class="input_columns row">
|
6
|
+
|
7
|
+
<div class="query_column span6">
|
8
|
+
<h4>Find items that match <%= select_tag(:op, options_for_select({'all'=>'AND','any'=>'OR'}.sort,'all'), :class => 'input-small') %> of the fields below:</h4>
|
4
9
|
|
5
|
-
<div class="input_columns yui-g">
|
6
|
-
|
7
|
-
<div class="query_column column">
|
8
|
-
<h2>Find items that match <%= select_tag(:op, options_for_select({'all'=>'AND','any'=>'OR'}.sort,'all')) %> of the fields below:</h2>
|
9
|
-
|
10
10
|
<div id="advanced_search">
|
11
11
|
<%= render 'advanced/advanced_search_fields' %>
|
12
|
-
</div>
|
12
|
+
</div>
|
13
13
|
</div>
|
14
|
-
<div class="limit_column
|
15
|
-
<
|
16
|
-
|
14
|
+
<div class="limit_column offset1 span4">
|
15
|
+
<h4><strong>AND</strong> have these attributes:</h4>
|
16
|
+
|
17
17
|
<div id="advanced_search_facets" class="limit_input">
|
18
18
|
<%= render 'advanced_search_facets' %>
|
19
19
|
</div>
|
20
20
|
</div>
|
21
21
|
</div>
|
22
|
-
|
22
|
+
|
23
23
|
<% unless (search_context_str = render_search_to_s( advanced_search_context)).blank? %>
|
24
24
|
<div class="constraints">
|
25
25
|
<h4>Within search:</h4>
|
26
26
|
<%= search_context_str %>
|
27
27
|
</div>
|
28
28
|
<% end %>
|
29
|
-
|
30
|
-
|
31
|
-
<div class="sort_submit_buttons">
|
32
|
-
|
29
|
+
|
30
|
+
|
31
|
+
<div class="sort_submit_buttons well clearfix">
|
32
|
+
<div class="pull-left">
|
33
|
+
<%= label_tag(:sort, "Sort results by") %>
|
33
34
|
<%= select_tag(:sort, options_for_select(sort_fields, h(params[:sort]))) %>
|
34
35
|
<%= hidden_field_tag(:search_field, blacklight_config.advanced_search[:url_key]) %>
|
35
|
-
|
36
|
-
|
36
|
+
</div>
|
37
|
+
<div class="pull-right">
|
38
|
+
<%= submit_tag 'Search', :class=>'btn btn-primary', :id=>'advanced_search' %>
|
39
|
+
<%= link_to "Start over", {:controller => "advanced", :action => "index"}, :class =>"reset btn" %>
|
40
|
+
</div>
|
37
41
|
</div>
|
38
42
|
<% end %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div class="facet_item blacklight-<%= facet_field.field.parameterize %>">
|
2
|
-
<
|
2
|
+
<h5 class="twiddle"><%= facet_field.label -%> <i class="icon-chevron"></i><span class="adv_facet_selections" style="display:none;"></span></h5>
|
3
3
|
|
4
4
|
<%= yield %>
|
5
5
|
</div>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<ul>
|
2
2
|
<% display_facet.items.each do |item| -%>
|
3
3
|
<li>
|
4
|
-
|
4
|
+
<%= label_tag "f_inclusive_#{solr_field}[#{item.value.to_sym}]", (check_box_tag "f_inclusive[#{solr_field}][#{item.value.to_sym}]", 1, facet_value_checked?(solr_field, item.value)) + content_tag(:span, item.value, :class => 'facet-value') + " (#{format_num item.hits})".html_safe, :class => 'checkbox' %>
|
5
5
|
</li>
|
6
6
|
<% end -%>
|
7
7
|
</ul>
|
@@ -3,9 +3,10 @@
|
|
3
3
|
<h4>Any of:</h4>
|
4
4
|
<ul>
|
5
5
|
<% @advanced_query.filters[solr_field].each do |value| %>
|
6
|
-
<li><span class="selected"><%= h(value) %></span> <%= link_to "[remove]
|
6
|
+
<li><span class="selected"><%= h(value) %></span> <%= link_to(content_tag(:i, '', :class => "icon-remove") + content_tag(:span, '[remove]', :class => 'hide-text'), remove_facet_params(solr_field, value, params), :class=>"remove") %></li>
|
7
7
|
<% end %>
|
8
8
|
</ul>
|
9
9
|
</div>
|
10
|
-
|
10
|
+
|
11
11
|
<%= render_facet_limit display_facet, :layout => nil, :partial => 'catalog/facet_limit' %>
|
12
|
+
</div>
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
|
20
20
|
|
21
21
|
s.add_dependency "rails", "~> 3.0"
|
22
|
-
s.add_dependency "blacklight", "
|
22
|
+
s.add_dependency "blacklight", "~> 4.0"
|
23
23
|
s.add_dependency "parslet"
|
24
24
|
|
25
25
|
s.add_development_dependency "rspec"
|
@@ -27,4 +27,5 @@ Gem::Specification.new do |s|
|
|
27
27
|
s.add_development_dependency "capybara"
|
28
28
|
s.add_development_dependency "sqlite3"
|
29
29
|
s.add_development_dependency 'launchy'
|
30
|
+
s.add_development_dependency 'jettywrapper'
|
30
31
|
end
|
@@ -1,11 +1,15 @@
|
|
1
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,
|
2
|
+
# certain methods from RenderConstraintsHelper (newish in BL),
|
3
|
+
# to effect constraints rendering and search history rendering,
|
4
4
|
module BlacklightAdvancedSearch::RenderConstraintsOverride
|
5
5
|
|
6
|
+
def query_has_constraints?(localized_params = params)
|
7
|
+
!(localized_params[:q].blank? and localized_params[:f].blank? and localized_params[:f_inclusive].blank?)
|
8
|
+
end
|
9
|
+
|
6
10
|
#Over-ride of Blacklight method, provide advanced constraints if needed,
|
7
11
|
# otherwise call super. Existence of an @advanced_query instance variable
|
8
|
-
# is our trigger that we're in advanced mode.
|
12
|
+
# is our trigger that we're in advanced mode.
|
9
13
|
def render_constraints_query(my_params = params)
|
10
14
|
if (@advanced_query.nil? || @advanced_query.keyword_queries.empty? )
|
11
15
|
return super(my_params)
|
@@ -19,53 +23,53 @@ module BlacklightAdvancedSearch::RenderConstraintsOverride
|
|
19
23
|
catalog_index_path(remove_advanced_keyword_query(field,my_params))
|
20
24
|
)
|
21
25
|
end
|
22
|
-
if (@advanced_query.keyword_op == "OR" &&
|
26
|
+
if (@advanced_query.keyword_op == "OR" &&
|
23
27
|
@advanced_query.keyword_queries.length > 1)
|
24
28
|
content = '<span class="inclusive_or appliedFilter">' + '<span class="operator">Any of:</span>' + content + '</span>'
|
25
29
|
end
|
26
|
-
|
30
|
+
|
27
31
|
return content
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
31
35
|
#Over-ride of Blacklight method, provide advanced constraints if needed,
|
32
36
|
# otherwise call super. Existence of an @advanced_query instance variable
|
33
|
-
# is our trigger that we're in advanced mode.
|
37
|
+
# is our trigger that we're in advanced mode.
|
34
38
|
def render_constraints_filters(my_params = params)
|
35
39
|
content = super(my_params)
|
36
40
|
|
37
41
|
if (@advanced_query)
|
38
42
|
@advanced_query.filters.each_pair do |field, value_list|
|
39
43
|
label = facet_field_labels[field]
|
40
|
-
content << render_constraint_element(label,
|
44
|
+
content << render_constraint_element(label,
|
41
45
|
value_list.join(" OR "),
|
42
46
|
:remove => catalog_index_path( remove_advanced_filter_group(field, my_params) )
|
43
47
|
)
|
44
48
|
end
|
45
49
|
end
|
46
|
-
|
50
|
+
|
47
51
|
return content
|
48
52
|
end
|
49
53
|
|
50
54
|
def render_search_to_s_filters(my_params)
|
51
55
|
content = super(my_params)
|
52
|
-
|
56
|
+
|
53
57
|
advanced_query = BlacklightAdvancedSearch::QueryParser.new(my_params, blacklight_config )
|
54
|
-
|
58
|
+
|
55
59
|
if (advanced_query.filters.length > 0)
|
56
60
|
advanced_query.filters.each_pair do |field, values|
|
57
61
|
label = facet_field_labels[field]
|
58
|
-
|
59
|
-
content << render_search_to_s_element(
|
62
|
+
|
63
|
+
content << render_search_to_s_element(
|
60
64
|
label,
|
61
65
|
values.join(" OR ")
|
62
66
|
)
|
63
|
-
end
|
67
|
+
end
|
64
68
|
end
|
65
69
|
return content
|
66
70
|
end
|
67
71
|
|
68
|
-
def render_search_to_s_q(my_params)
|
72
|
+
def render_search_to_s_q(my_params)
|
69
73
|
content = super(my_params)
|
70
74
|
|
71
75
|
advanced_query = BlacklightAdvancedSearch::QueryParser.new(my_params, blacklight_config )
|
@@ -77,20 +81,20 @@ module BlacklightAdvancedSearch::RenderConstraintsOverride
|
|
77
81
|
display_as = advanced_query.keyword_queries.collect do |field, query|
|
78
82
|
h( search_field_def_for_key(field)[:label] + ": " + query )
|
79
83
|
end.join(" ; ")
|
80
|
-
|
84
|
+
|
81
85
|
content << render_search_to_s_element("Any of",
|
82
86
|
display_as,
|
83
87
|
:escape_value => false
|
84
88
|
)
|
85
|
-
elsif (advanced_query.keyword_queries.length > 0)
|
89
|
+
elsif (advanced_query.keyword_queries.length > 0)
|
86
90
|
advanced_query.keyword_queries.each_pair do |field, query|
|
87
91
|
label = search_field_def_for_key(field)[:label]
|
88
92
|
|
89
93
|
content << render_search_to_s_element(label, query)
|
90
|
-
end
|
94
|
+
end
|
91
95
|
end
|
92
|
-
|
96
|
+
|
93
97
|
return content
|
94
98
|
end
|
95
|
-
|
99
|
+
|
96
100
|
end
|
@@ -1,13 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
1
|
+
<%= form_tag search_action_url, :method => :get, :class => 'search-query-form form-inline clearfix' do %>
|
2
|
+
<%= search_as_hidden_fields(:omit_keys => [:q, :search_field, :qt, :page]).html_safe %>
|
3
|
+
|
4
|
+
<% unless search_fields.empty? %>
|
5
|
+
<div class="pull-left">
|
6
|
+
<label for="search_field" class="hide-text"><%= t('blacklight.search.form.search_field.label') %></label>
|
7
|
+
<%= select_tag(:search_field, options_for_select(search_fields, h(params[:search_field])), :title => t('blacklight.search.form.search_field.title'), :class=>"search_field input-small") %>
|
8
|
+
<span class="hide-text"><%= t('blacklight.search.form.search_field.post_label') %></span>
|
9
|
+
</div>
|
10
|
+
<% end %>
|
11
|
+
<div class="input-append pull-left">
|
12
|
+
<label for="q" class="hide-text"><%= t('blacklight.search.form.q') %></label>
|
13
|
+
<%= text_field_tag :q, params[:q], :placeholder => t('blacklight.search.form.q'), :class => "search_q q", :id => "q"%>
|
14
|
+
<button type="submit" class="btn btn-primary search-btn" id="search">
|
15
|
+
<span class="submit-search-text"><%=t('blacklight.search.form.submit')%></span>
|
16
|
+
<i class="icon-search icon-white"></i>
|
17
|
+
</button>
|
18
|
+
|
19
|
+
</div>
|
20
|
+
|
11
21
|
<% end %>
|
12
|
-
|
13
|
-
|
22
|
+
|
23
|
+
<%= link_to 'More options', params.merge(:controller=>"advanced", :action=>"index") , :class=>"advanced_search"%>
|
@@ -1,19 +1,80 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "Blacklight Advanced Search Form" do
|
4
|
-
before do
|
5
|
-
|
6
|
-
|
4
|
+
before(:all) do
|
5
|
+
CatalogController.configure_blacklight do |config|
|
6
|
+
config.default_solr_params = {
|
7
|
+
:qt => 'search',
|
8
|
+
:rows => 10
|
9
|
+
}
|
10
|
+
|
11
|
+
config.add_facet_field 'language_facet'
|
7
12
|
|
8
13
|
config.add_search_field('title') do |field|
|
9
14
|
field.solr_local_parameters = { :qf => "title_t", :pf => "title_t"}
|
10
15
|
end
|
16
|
+
|
17
|
+
config.add_search_field('author') do |field|
|
18
|
+
field.solr_local_parameters = { :qf => "author_t", :pf => "author_t"}
|
19
|
+
end
|
20
|
+
|
21
|
+
config.add_search_field('dummy_field') do |field|
|
22
|
+
field.include_in_advanced_search = false
|
23
|
+
field.solr_local_parameters = { :qf => "author_t", :pf => "author_t"}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
AdvancedController.copy_blacklight_config_from(CatalogController)
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "advanced search form" do
|
30
|
+
before do
|
31
|
+
visit '/advanced'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should have field and facet blocks" do
|
35
|
+
page.should have_selector('.query_column')
|
36
|
+
page.should have_selector('.limit_column')
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "query column" do
|
40
|
+
it "should give the user a choice between and/or queries" do
|
41
|
+
page.should have_selector('#op')
|
42
|
+
within('#op') do
|
43
|
+
page.should have_selector('option[value="AND"]')
|
44
|
+
page.should have_selector('option[value="OR"]')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should list the configured search fields" do
|
49
|
+
page.should have_selector '.advanced_search_field #title'
|
50
|
+
page.should have_selector '.advanced_search_field #author'
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should not list the search fields listed as not to be included in adv search" do
|
54
|
+
page.should_not have_selector '.advanced_search_field #dummy_field'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "facet column" do
|
59
|
+
it "should list facets" do
|
60
|
+
page.should have_selector('.blacklight-language_facet')
|
61
|
+
|
62
|
+
within('.blacklight-language_facet') do
|
63
|
+
page.should have_content "Language Facet"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
it "scope searches to fields" do
|
69
|
+
fill_in "title", :with => "Medicine"
|
70
|
+
click_on "Search"
|
71
|
+
page.should have_content "Remove constraint Title: Medicine"
|
72
|
+
page.should have_content "2007020969"
|
11
73
|
end
|
12
74
|
end
|
13
75
|
|
14
76
|
it "should show the search fields" do
|
15
77
|
visit '/advanced'
|
16
78
|
page.should have_selector('input#title')
|
17
|
-
|
18
79
|
end
|
19
80
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,14 +3,13 @@ require 'bundler'
|
|
3
3
|
|
4
4
|
Bundler.require :default, :development
|
5
5
|
|
6
|
+
ENV["RAILS_ENV"] = "test"
|
7
|
+
|
6
8
|
require 'blacklight/engine'
|
7
9
|
require 'rsolr'
|
8
|
-
require 'rsolr-ext'
|
9
10
|
require 'capybara/rspec'
|
10
11
|
Combustion.initialize!
|
11
12
|
|
12
|
-
Blacklight.solr_config = { :url => 'http://127.0.0.1:8983/solr' }
|
13
|
-
|
14
13
|
class SolrDocument
|
15
14
|
include Blacklight::Solr::Document
|
16
15
|
end
|
metadata
CHANGED
@@ -1,155 +1,168 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: blacklight_advanced_search
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 2
|
9
|
-
- 4
|
10
|
-
version: 1.2.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Jonathan Rochkind
|
14
9
|
- Chris Beer
|
15
10
|
autorequire:
|
16
11
|
bindir: bin
|
17
12
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2012-11-30 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
22
16
|
name: rails
|
23
|
-
|
24
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
25
18
|
none: false
|
26
|
-
requirements:
|
19
|
+
requirements:
|
27
20
|
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 3
|
32
|
-
- 0
|
33
|
-
version: "3.0"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3.0'
|
34
23
|
type: :runtime
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: blacklight
|
38
24
|
prerelease: false
|
39
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
26
|
none: false
|
41
|
-
requirements:
|
42
|
-
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 13
|
45
|
-
segments:
|
46
|
-
- 3
|
47
|
-
- 2
|
48
|
-
- 1
|
49
|
-
version: 3.2.1
|
27
|
+
requirements:
|
50
28
|
- - ~>
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '3.0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: blacklight
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ~>
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '4.0'
|
57
39
|
type: :runtime
|
58
|
-
version_requirements: *id002
|
59
|
-
- !ruby/object:Gem::Dependency
|
60
|
-
name: parslet
|
61
40
|
prerelease: false
|
62
|
-
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '4.0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: parslet
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
63
50
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
segments:
|
69
|
-
- 0
|
70
|
-
version: "0"
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
71
55
|
type: :runtime
|
72
|
-
version_requirements: *id003
|
73
|
-
- !ruby/object:Gem::Dependency
|
74
|
-
name: rspec
|
75
56
|
prerelease: false
|
76
|
-
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
58
|
none: false
|
78
|
-
requirements:
|
79
|
-
- -
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
85
71
|
type: :development
|
86
|
-
version_requirements: *id004
|
87
|
-
- !ruby/object:Gem::Dependency
|
88
|
-
name: rspec-rails
|
89
72
|
prerelease: false
|
90
|
-
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: rspec-rails
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
91
82
|
none: false
|
92
|
-
requirements:
|
93
|
-
- -
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
|
96
|
-
segments:
|
97
|
-
- 0
|
98
|
-
version: "0"
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
99
87
|
type: :development
|
100
|
-
version_requirements: *id005
|
101
|
-
- !ruby/object:Gem::Dependency
|
102
|
-
name: capybara
|
103
88
|
prerelease: false
|
104
|
-
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: capybara
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
105
98
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
segments:
|
111
|
-
- 0
|
112
|
-
version: "0"
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
113
103
|
type: :development
|
114
|
-
version_requirements: *id006
|
115
|
-
- !ruby/object:Gem::Dependency
|
116
|
-
name: sqlite3
|
117
104
|
prerelease: false
|
118
|
-
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sqlite3
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
119
114
|
none: false
|
120
|
-
requirements:
|
121
|
-
- -
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
|
124
|
-
segments:
|
125
|
-
- 0
|
126
|
-
version: "0"
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
127
119
|
type: :development
|
128
|
-
|
129
|
-
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
130
128
|
name: launchy
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ! '>='
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
type: :development
|
131
136
|
prerelease: false
|
132
|
-
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
138
|
none: false
|
134
|
-
requirements:
|
135
|
-
- -
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: jettywrapper
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ! '>='
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
141
151
|
type: :development
|
142
|
-
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ! '>='
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
143
159
|
description:
|
144
|
-
email:
|
160
|
+
email:
|
145
161
|
- blacklight-development@googlegroups.com
|
146
162
|
executables: []
|
147
|
-
|
148
163
|
extensions: []
|
149
|
-
|
150
164
|
extra_rdoc_files: []
|
151
|
-
|
152
|
-
files:
|
165
|
+
files:
|
153
166
|
- .gitignore
|
154
167
|
- Gemfile
|
155
168
|
- LICENSE
|
@@ -213,38 +226,35 @@ files:
|
|
213
226
|
- uninstall.rb
|
214
227
|
homepage: http://projectblacklight.org/
|
215
228
|
licenses: []
|
216
|
-
|
217
229
|
post_install_message:
|
218
230
|
rdoc_options: []
|
219
|
-
|
220
|
-
require_paths:
|
231
|
+
require_paths:
|
221
232
|
- lib
|
222
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
233
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
223
234
|
none: false
|
224
|
-
requirements:
|
225
|
-
- -
|
226
|
-
- !ruby/object:Gem::Version
|
227
|
-
|
228
|
-
segments:
|
235
|
+
requirements:
|
236
|
+
- - ! '>='
|
237
|
+
- !ruby/object:Gem::Version
|
238
|
+
version: '0'
|
239
|
+
segments:
|
229
240
|
- 0
|
230
|
-
|
231
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
241
|
+
hash: -4136791477781994072
|
242
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
232
243
|
none: false
|
233
|
-
requirements:
|
234
|
-
- -
|
235
|
-
- !ruby/object:Gem::Version
|
236
|
-
|
237
|
-
segments:
|
244
|
+
requirements:
|
245
|
+
- - ! '>='
|
246
|
+
- !ruby/object:Gem::Version
|
247
|
+
version: '0'
|
248
|
+
segments:
|
238
249
|
- 0
|
239
|
-
|
250
|
+
hash: -4136791477781994072
|
240
251
|
requirements: []
|
241
|
-
|
242
252
|
rubyforge_project: blacklight
|
243
|
-
rubygems_version: 1.8.
|
253
|
+
rubygems_version: 1.8.23
|
244
254
|
signing_key:
|
245
255
|
specification_version: 3
|
246
256
|
summary: Blacklight Advanced Search plugin
|
247
|
-
test_files:
|
257
|
+
test_files:
|
248
258
|
- spec/acceptance/blacklight_advanced_search_form_spec.rb
|
249
259
|
- spec/integration/blacklight_stub_spec.rb
|
250
260
|
- spec/internal/app/controllers/application_controller.rb
|