Skip to content

Commit b10011a

Browse files
committed
Merge pull request #933 from projectblacklight/render_facet_limit_list
Move logic from view into a helper: render_facet_limit_list
2 parents 7ee2f79 + 64c373e commit b10011a

File tree

3 files changed

+77
-33
lines changed

3 files changed

+77
-33
lines changed

app/helpers/blacklight/facets_helper_behavior.rb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,27 @@ def render_facet_limit(display_facet, options = {})
5050
render(options)
5151
end
5252

53+
##
54+
# Renders the list of values
55+
# removes any elements where render_facet_item returns a nil value. This enables an application
56+
# to filter undesireable facet items so they don't appear in the UI
57+
def render_facet_limit_list(paginator, solr_field, wrapping_element=:li)
58+
safe_join(paginator.items.
59+
map { |item| render_facet_item(solr_field, item) }.compact.
60+
map { |item| content_tag(wrapping_element,item)}
61+
)
62+
end
63+
64+
##
65+
# Renders a single facet item
66+
def render_facet_item(solr_field, item)
67+
if facet_in_params?( solr_field, item.value )
68+
render_selected_facet_value(solr_field, item)
69+
else
70+
render_facet_value(solr_field, item)
71+
end
72+
end
73+
5374
##
5475
# Determine if Blacklight should render the display_facet or not
5576
#
@@ -77,7 +98,10 @@ def should_collapse_facet? facet_field
7798
end
7899

79100
##
80-
# the name of the partial to use to render a facet field.
101+
# The name of the partial to use to render a facet field.
102+
# uses the value of the "partial" field if set in the facet configuration
103+
# otherwise uses "facet_pivot" if this facet is a pivot facet
104+
# defaults to 'facet_limit'
81105
#
82106
# @return [String]
83107
def facet_partial_name(display_facet = nil)
Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
11
<ul class="facet-values list-unstyled">
2-
<% paginator = facet_paginator(facet_field, display_facet)
3-
%>
4-
<% paginator.items.each do |item| -%>
5-
<li>
6-
<% if facet_in_params?( solr_field, item.value ) %>
7-
<%= render_selected_facet_value(solr_field, item) %>
8-
<% else %>
9-
<%= render_facet_value(solr_field, item) %>
10-
<% end -%>
11-
</li>
12-
<% end %>
2+
<% paginator = facet_paginator(facet_field, display_facet) %>
3+
<%= render_facet_limit_list paginator, solr_field %>
134

145
<% unless paginator.last_page? || params[:action] == "facet" %>
15-
<li class="more_facets_link"><%= link_to(t('blacklight.search.facets.more'), params.merge(:id => solr_field, :action=>"facet", :page => nil), :class => "more_facets_link") %></li>
6+
<li class="more_facets_link"><%= link_to t('blacklight.search.facets.more'),
7+
params.merge(id: solr_field, action: "facet", page: nil), class: "more_facets_link" %></li>
168
<% end %>
17-
189
</ul>

spec/helpers/facets_helper_spec.rb

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@
1717
empty = double(:items => [])
1818

1919
fields = [a,b,empty]
20-
expect(helper.has_facet_values?(fields)).to be_true
20+
expect(helper.has_facet_values?(fields)).to be true
2121
end
2222

2323
it "should be false if all facets are empty" do
2424

2525
empty = double(:items => [])
2626

2727
fields = [empty]
28-
expect(helper.has_facet_values?(fields)).to be_false
28+
expect(helper.has_facet_values?(fields)).to be false
2929
end
3030
end
3131

@@ -45,37 +45,37 @@
4545

4646
it "should render facets with items" do
4747
a = double(:items => [1,2], :name=>'basic_field')
48-
expect(helper.should_render_facet?(a)).to be_true
48+
expect(helper.should_render_facet?(a)).to be true
4949
end
5050
it "should not render facets without items" do
5151
empty = double(:items => [], :name=>'basic_field')
52-
expect(helper.should_render_facet?(empty)).to be_false
52+
expect(helper.should_render_facet?(empty)).to be false
5353
end
5454

5555
it "should not render facets where show is set to false" do
5656
a = double(:items => [1,2], :name=>'no_show')
57-
expect(helper.should_render_facet?(a)).to be_false
57+
expect(helper.should_render_facet?(a)).to be false
5858
end
5959

6060
it "should call a helper to determine if it should render a field" do
6161
helper.stub(:my_helper => true)
6262
a = double(:items => [1,2], :name=>'helper_show')
63-
expect(helper.should_render_facet?(a)).to be_true
63+
expect(helper.should_render_facet?(a)).to be true
6464
end
6565

6666
it "should call a helper to determine if it should render a field" do
6767
a = double(:items => [1,2], :name=>'helper_with_an_arg_show')
6868
helper.should_receive(:my_helper_with_an_arg).with(@config.facet_fields['helper_with_an_arg_show'], a).and_return(true)
69-
expect(helper.should_render_facet?(a)).to be_true
69+
expect(helper.should_render_facet?(a)).to be true
7070
end
7171

7272

7373
it "should evaluate a Proc to determine if it should render a field" do
7474
a = double(:items => [1,2], :name=>'lambda_show')
75-
expect(helper.should_render_facet?(a)).to be_true
75+
expect(helper.should_render_facet?(a)).to be true
7676

7777
a = double(:items => [1,2], :name=>'lambda_no_show')
78-
expect(helper.should_render_facet?(a)).to be_false
78+
expect(helper.should_render_facet?(a)).to be false
7979
end
8080
end
8181

@@ -90,17 +90,17 @@
9090
end
9191

9292
it "should be collapsed by default" do
93-
expect(helper.should_collapse_facet?(@config.facet_fields['basic_field'])).to be_true
93+
expect(helper.should_collapse_facet?(@config.facet_fields['basic_field'])).to be true
9494
end
9595

9696
it "should not be collapsed if the configuration says so" do
97-
expect(helper.should_collapse_facet?(@config.facet_fields['no_collapse'])).to be_false
97+
expect(helper.should_collapse_facet?(@config.facet_fields['no_collapse'])).to be false
9898
end
9999

100100
it "should not be collapsed if it is in the params" do
101101
params[:f] = { basic_field: [1], no_collapse: [2] }.with_indifferent_access
102-
expect(helper.should_collapse_facet?(@config.facet_fields['basic_field'])).to be_false
103-
expect(helper.should_collapse_facet?(@config.facet_fields['no_collapse'])).to be_false
102+
expect(helper.should_collapse_facet?(@config.facet_fields['basic_field'])).to be false
103+
expect(helper.should_collapse_facet?(@config.facet_fields['no_collapse'])).to be false
104104
end
105105

106106
end
@@ -152,7 +152,7 @@
152152
field.should be_a_kind_of Blacklight::SolrResponse::Facets::FacetField
153153

154154
expect(field.name).to eq'my_query_facet_field'
155-
expect(field.items).to have(2).items
155+
expect(field.items.size).to eq 2
156156
expect(field.items.map { |x| x.value }).to_not include 'field:not_appearing_in_the_config'
157157

158158
facet_item = field.items.select { |x| x.value == 'a_simple_query' }.first
@@ -180,11 +180,11 @@
180180

181181
expect(field.name).to eq 'my_pivot_facet_field'
182182

183-
expect(field.items).to have(1).item
183+
expect(field.items.size).to eq 1
184184

185185
expect(field.items.first).to respond_to(:items)
186186

187-
expect(field.items.first.items).to have(1).item
187+
expect(field.items.first.items.size).to eq 1
188188
expect(field.items.first.items.first.fq).to eq({ 'field_a' => 'a' })
189189
end
190190
end
@@ -281,11 +281,40 @@
281281
end
282282
end
283283

284+
describe "render_facet_limit_list" do
285+
let(:f1) { Blacklight::SolrResponse::Facets::FacetItem.new(hits: '792', value: 'Book') }
286+
let(:f2) { Blacklight::SolrResponse::Facets::FacetItem.new(hits: '65', value: 'Musical Score') }
287+
let(:paginator) { Blacklight::Solr::FacetPaginator.new([f1, f2], limit: 10) }
288+
subject { helper.render_facet_limit_list(paginator, 'type_solr_field') }
289+
before do
290+
allow(helper).to receive(:search_action_path) do |*args|
291+
catalog_index_path *args
292+
end
293+
end
294+
it "should draw a list of elements" do
295+
expect(subject).to have_selector 'li', count: 2
296+
expect(subject).to have_selector 'li:first-child a.facet_select', text: 'Book'
297+
expect(subject).to have_selector 'li:nth-child(2) a.facet_select', text: 'Musical Score'
298+
end
299+
300+
context "when one of the facet items is rendered as nil" do
301+
# An app may override render_facet_item to filter out some undesired facet items by returning nil.
302+
303+
before { allow(helper).to receive(:render_facet_item).and_return("<a class=\"facet_select\">Book</a>".html_safe, nil) }
304+
305+
it "should draw a list of elements" do
306+
expect(subject).to have_selector 'li', count: 1
307+
expect(subject).to have_selector 'li:first-child a.facet_select', text: 'Book'
308+
end
309+
310+
end
311+
end
312+
284313
describe "facet_field_in_params?" do
285314
it "should check if the facet field is selected in the user params" do
286315
helper.stub(:params => { :f => { "some-field" => ["x"]}})
287-
expect(helper.facet_field_in_params?("some-field")).to be_true
288-
expect(helper.facet_field_in_params?("other-field")).to_not be_true
316+
expect(helper.facet_field_in_params?("some-field")).to be_truthy
317+
expect(helper.facet_field_in_params?("other-field")).to_not be true
289318
end
290319
end
291320

@@ -300,7 +329,7 @@
300329
helper.should_receive(:facet_display_value).and_return('Z')
301330
helper.should_receive(:add_facet_params_and_redirect).and_return({controller:'catalog'})
302331

303-
helper.stub(:search_action_path) do |*args|
332+
allow(helper).to receive(:search_action_path) do |*args|
304333
catalog_index_path *args
305334
end
306335
end

0 commit comments

Comments
 (0)