diff --git a/app/components/blacklight/facet_field_filter_component.rb b/app/components/blacklight/facet_field_filter_component.rb index 91abe91953..664873e800 100644 --- a/app/components/blacklight/facet_field_filter_component.rb +++ b/app/components/blacklight/facet_field_filter_component.rb @@ -1,25 +1,6 @@ # frozen_string_literal: true module Blacklight - class FacetFieldFilterComponent < Blacklight::Component - def initialize(facet_field:) - @facet_field = facet_field - end - - def render? - @facet_field.facet_field.index_range.any? - end - - def prefix - @facet_field.paginator.prefix - end - - def clear_facet_prefix_url - @facet_field.paginator.params_for_resort_url('index', @facet_field.search_state.to_h.except(@facet_field.paginator.request_keys[:prefix])) - end - - def facet_prefix_url(letter) - @facet_field.paginator.params_for_resort_url('index', @facet_field.search_state.to_h.merge(@facet_field.paginator.request_keys[:prefix] => letter)) - end - end + class FacetFieldFilterComponent < Facets::IndexNavigationComponent; end + FacetFieldFilterComponent = ActiveSupport::Deprecation::DeprecatedConstantProxy.new("FacetFieldFilterComponent", "Blacklight::Facets::IndexNavigationComponent", ActiveSupport::Deprecation.new) end diff --git a/app/components/blacklight/facets/filters_component.html.erb b/app/components/blacklight/facets/filters_component.html.erb index a1a3763acf..244ffeeb6a 100644 --- a/app/components/blacklight/facets/filters_component.html.erb +++ b/app/components/blacklight/facets/filters_component.html.erb @@ -1,4 +1,4 @@
<%= render Blacklight::Facets::SuggestComponent.new(presenter: presenter) %> - <%= render 'facet_index_navigation' if render_index_navigation? %> + <%= render Blacklight::Facets::IndexNavigationComponent.new(presenter: presenter) %>
diff --git a/app/components/blacklight/facet_field_filter_component.html.erb b/app/components/blacklight/facets/index_navigation_component.html.erb similarity index 89% rename from app/components/blacklight/facet_field_filter_component.html.erb rename to app/components/blacklight/facets/index_navigation_component.html.erb index ae5735235c..d0dc195d1f 100644 --- a/app/components/blacklight/facet_field_filter_component.html.erb +++ b/app/components/blacklight/facets/index_navigation_component.html.erb @@ -3,7 +3,7 @@
  • <%= link_to t('blacklight.search.facets.all'), clear_facet_prefix_url, data: { blacklight_modal: "preserve" }, class: 'page-link' %>
  • - <% @facet_field.facet_field.index_range.each do |letter| %> + <% index_range.each do |letter| %>
  • <%= link_to(letter, facet_prefix_url(letter), class: 'page-link', data: { blacklight_modal: "preserve" }) %>
  • diff --git a/app/components/blacklight/facets/index_navigation_component.rb b/app/components/blacklight/facets/index_navigation_component.rb new file mode 100644 index 0000000000..5fe4e19ff0 --- /dev/null +++ b/app/components/blacklight/facets/index_navigation_component.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Blacklight + module Facets + class IndexNavigationComponent < Blacklight::Component + # @params [Blacklight::FacetFieldPresenter] presenter + def initialize(presenter:) + @presenter = presenter + end + + def render? + index_range && @presenter.display_facet.index? + end + + def index_range + @presenter.facet_field.index_range + end + + def prefix + @presenter.paginator.prefix + end + + def clear_facet_prefix_url + @presenter.paginator.params_for_resort_url('index', @presenter.search_state.to_h.except(@presenter.paginator.request_keys[:prefix])) + end + + def facet_prefix_url(letter) + @presenter.paginator.params_for_resort_url('index', @presenter.search_state.to_h.merge(@presenter.paginator.request_keys[:prefix] => letter)) + end + end + end +end diff --git a/app/controllers/concerns/blacklight/catalog.rb b/app/controllers/concerns/blacklight/catalog.rb index 0c435f8b76..cd5039e362 100644 --- a/app/controllers/concerns/blacklight/catalog.rb +++ b/app/controllers/concerns/blacklight/catalog.rb @@ -79,6 +79,7 @@ def track # displays values and pagination links for a single facet field def facet + # @facet is a Blacklight::Configuration::FacetField @facet = blacklight_config.facet_fields[params[:id]] raise ActionController::RoutingError, 'Not Found' unless @facet @@ -87,8 +88,10 @@ def facet else search_service.facet_field_response(@facet.key) end + # @display_facet is a Blacklight::Solr::Response::Facets::FacetField @display_facet = @response.aggregations[@facet.field] + # @presenter is a Blacklight::FacetFieldPresenter @presenter = @facet.presenter.new(@facet, @display_facet, view_context) @pagination = @presenter.paginator respond_to do |format| diff --git a/app/views/catalog/_facet_index_navigation.html.erb b/app/views/catalog/_facet_index_navigation.html.erb deleted file mode 100644 index 97f3447115..0000000000 --- a/app/views/catalog/_facet_index_navigation.html.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render(Blacklight::FacetFieldFilterComponent.new(facet_field: facet_field_presenter(@facet, @display_facet))) %> diff --git a/spec/components/blacklight/facets/index_navigation_component_spec.rb b/spec/components/blacklight/facets/index_navigation_component_spec.rb new file mode 100644 index 0000000000..0184936547 --- /dev/null +++ b/spec/components/blacklight/facets/index_navigation_component_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +RSpec.describe Blacklight::Facets::IndexNavigationComponent, type: :component do + let(:pagination) { Blacklight::Solr::FacetPaginator.new([]) } + let(:facet) { Blacklight::Configuration::FacetField.new(index_range: '0'..'9', presenter: Blacklight::FacetFieldPresenter) } + let(:display_facet) { instance_double(Blacklight::Solr::Response::Facets::FacetField, items: [], offset: 0, prefix: '', sort: 'index', index?: true) } + let(:blacklight_config) { Blacklight::Configuration.new } + + let(:presenter) { facet.presenter.new(facet, display_facet, vc_test_controller.view_context) } + + before do + with_request_url "/catalog/facet/language" do + render_inline(described_class.new(presenter: presenter)) + end + end + + it 'renders the facet index navigation range' do + expect(page).to have_css '.pagination' + expect(page).to have_link '0', href: '/catalog/facet/language.html?facet.prefix=0&facet.sort=index' + expect(page).to have_link '1' + expect(page).to have_link '8' + expect(page).to have_link '9' + end + + it 'renders an "all" button' do + expect(page).to have_css '.page-link', text: 'All' + end + + context 'with a selected index' do + let(:display_facet) { instance_double(Blacklight::Solr::Response::Facets::FacetField, items: [], offset: 0, prefix: '5', sort: 'index', index?: true) } + + it 'highlights the selected index' do + expect(page).to have_css '.active', text: '5' + end + + it 'enables the clear facets button' do + expect(page).to have_link 'All' + end + end +end diff --git a/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb b/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb deleted file mode 100644 index b9ec0f95ef..0000000000 --- a/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe 'catalog/_facet_index_navigation.html.erb' do - let(:pagination) { Blacklight::Solr::FacetPaginator.new([]) } - let(:facet) { Blacklight::Configuration::FacetField.new(index_range: '0'..'9', presenter: Blacklight::FacetFieldPresenter) } - let(:display_facet) { double(items: [], offset: 0, prefix: '', sort: 'index') } - let(:blacklight_config) { Blacklight::Configuration.new } - - before do - assign(:display_facet, display_facet) - assign(:facet, facet) - allow(view).to receive_messages(blacklight_config: blacklight_config, facet_limit_for: 10) - controller.request.path_parameters[:action] = 'index' - end - - it 'renders the facet index navigation range' do - render - expect(rendered).to have_css '.pagination' - expect(rendered).to have_link '0', href: '/?facet.prefix=0&facet.sort=index' - expect(rendered).to have_link '1' - expect(rendered).to have_link '8' - expect(rendered).to have_link '9' - end - - it 'renders an "all" button' do - render - expect(rendered).to have_css '.page-link', text: 'All' - end - - context 'with a selected index' do - let(:display_facet) { double(items: [], offset: 0, prefix: '5', sort: 'index') } - - it 'highlights the selected index' do - render - expect(rendered).to have_css '.active', text: '5' - end - - it 'enables the clear facets button' do - render - expect(rendered).to have_link 'All' - end - end -end