From 71c6ec8860e8470e15714212aee3dcc075d0d2f9 Mon Sep 17 00:00:00 2001 From: Chris Colvard Date: Tue, 4 Feb 2014 22:04:51 -0500 Subject: [PATCH] Group facets into separate blocks based upon group specified on facet field in config --- app/views/catalog/_facet_group.html.erb | 22 +++++++ app/views/catalog/_facets.html.erb | 25 +------- lib/blacklight/facet.rb | 8 ++- spec/views/catalog/_facets.html.erb_spec.rb | 67 +++++++++++++++------ 4 files changed, 81 insertions(+), 41 deletions(-) create mode 100644 app/views/catalog/_facet_group.html.erb diff --git a/app/views/catalog/_facet_group.html.erb b/app/views/catalog/_facet_group.html.erb new file mode 100644 index 0000000000..6588109b33 --- /dev/null +++ b/app/views/catalog/_facet_group.html.erb @@ -0,0 +1,22 @@ +<% # main container for facets/limits menu -%> +<% if has_facet_values? facet_field_names(groupname) %> +
" class="facets sidenav"> + +
+ + +

+ <%= groupname.blank? ? t('blacklight.search.facets.title') : t("blacklight.search.facets-#{groupname}.title") %> +

+
+ +
-collapse" class="collapse panel-group"> + <%= render_facet_partials facet_field_names(groupname) %> +
+
+<% end %> diff --git a/app/views/catalog/_facets.html.erb b/app/views/catalog/_facets.html.erb index b986b6ca14..66beb757d9 100644 --- a/app/views/catalog/_facets.html.erb +++ b/app/views/catalog/_facets.html.erb @@ -1,22 +1,3 @@ -<% # main container for facets/limits menu -%> -<% if has_facet_values? %> -
- -
- - -

- <%= t('blacklight.search.facets.title') %> -

-
- -
- <%= render_facet_partials %> -
-
-<% end %> \ No newline at end of file +<% facet_group_names.each do |groupname| %> + <%= render partial: "facet_group", locals: {groupname: groupname} %> +<% end %> diff --git a/lib/blacklight/facet.rb b/lib/blacklight/facet.rb index bbd83c0391..e769f136bb 100644 --- a/lib/blacklight/facet.rb +++ b/lib/blacklight/facet.rb @@ -7,8 +7,12 @@ def facets_from_request(fields = facet_field_names) fields.map { |solr_field| facet_by_field_name(solr_field) }.compact end - def facet_field_names - blacklight_config.facet_fields.keys + def facet_field_names group=nil + blacklight_config.facet_fields.select {|facet,opts| group == opts[:group]}.keys + end + + def facet_group_names + blacklight_config.facet_fields.map {|facet,opts| opts[:group]}.uniq end def facet_configuration_for_field(field) diff --git a/spec/views/catalog/_facets.html.erb_spec.rb b/spec/views/catalog/_facets.html.erb_spec.rb index ffe1d707a4..b33571cfc8 100644 --- a/spec/views/catalog/_facets.html.erb_spec.rb +++ b/spec/views/catalog/_facets.html.erb_spec.rb @@ -5,34 +5,67 @@ @mock_config = Blacklight::Configuration.new view.stub(:blacklight_config => @mock_config) end - it "should not have a header if no facets are displayed" do - view.stub(:render_facet_partials => '') - render - expect(rendered).to_not have_selector('h4') - end - it "should have a header" do + describe "facet groups" do + describe "default facet group" do + it "should not have a header if no facets are displayed" do + view.stub(:render_facet_partials => '') + render + expect(rendered).to_not have_selector('h4') + end - @mock_field_1 = double(:field => 'facet_field_1', - :label => 'label') - @mock_display_facet_1 = double(:name => 'facet_field_1', :items => [Blacklight::SolrResponse::Facets::FacetItem.new(:value => 'Value', :hits => 1234)]) - view.stub(:facet_field_names => [:facet_field_1], + it "should have a header" do + + @mock_field_1 = double(:field => 'facet_field_1', + :label => 'label', :group => nil) + @mock_display_facet_1 = double(:name => 'facet_field_1', :items => [Blacklight::SolrResponse::Facets::FacetItem.new(:value => 'Value', :hits => 1234)]) + view.stub(:facet_group_names => [nil], :facet_field_names => [:facet_field_1], :facet_limit_for => 10 ) - @response = double() - @response.stub(:facet_by_field_name).with(:facet_field_1) { @mock_display_facet_1 } + @response = double() + @response.stub(:facet_by_field_name).with(:facet_field_1) { @mock_display_facet_1 } + + view.stub(:render_facet_partials => '') + render + expect(rendered).to have_selector('h4') + end + end - view.stub(:render_facet_partials => '') - render - expect(rendered).to have_selector('h4') + describe "named facet group" do + it "should not have a header if no facets are displayed" do + view.stub(:render_facet_partials => '') + render + expect(rendered).to_not have_selector('h4') + expect(rendered).to_not have_selector('#facets-group_1') + end + + it "should have a header" do + + @mock_field_1 = double(:field => 'facet_field_1', + :label => 'label', :group => 'group_1') + @mock_display_facet_1 = double(:name => 'facet_field_1', :items => [Blacklight::SolrResponse::Facets::FacetItem.new(:value => 'Value', :hits => 1234)]) + view.stub(:facet_group_names => [nil, 'group_1'], + :facet_limit_for => 10 ) + view.stub(:facet_field_names).with('group_1').and_return([:facet_field_1]) + + @response = double() + @response.stub(:facet_by_field_name).with(:facet_field_1) { @mock_display_facet_1 } + + view.stub(:render_facet_partials => '') + render + expect(rendered).to have_selector('h4') + expect(rendered).to have_selector('#facets-group_1') + end + + end end describe "facet display" do before do @mock_field_1 = double(:field => 'facet_field_1', - :label => 'label') + :label => 'label', :group => nil) @mock_display_facet_1 = double(:name => 'facet_field_1', :items => [Blacklight::SolrResponse::Facets::FacetItem.new(:value => 'Value', :hits => 1234)]) - view.stub(:facet_field_names => [:facet_field_1], + view.stub(:facet_group_names => [nil], :facet_field_names => [:facet_field_1], :facet_limit_for => 10 ) @response = double()