blacklight_advanced_search 1.2.4 → 2.0.0
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.
- 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
|