-
Notifications
You must be signed in to change notification settings - Fork 256
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2296 from projectblacklight/pivot-component-and-c…
…ollapse Convert pivot facets to a component and add hierarchy expand/collapse
- Loading branch information
Showing
20 changed files
with
241 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# frozen_string_literal: true | ||
|
||
module Blacklight | ||
# Render facet items and any subtree | ||
class FacetItemPivotComponent < ::ViewComponent::Base | ||
# Somewhat arbitrary number; the only important thing is that | ||
# it is bigger than the number of leaf nodes in any collapsing | ||
# pivot facet on the page. | ||
ID_COUNTER_MAX = 2**20 - 1 | ||
|
||
# Mint a (sufficiently) unique identifier, so we can associate | ||
# the expand/collapse control with labels | ||
def self.mint_id | ||
@id_counter = ((@id_counter || 0) + 1) % ID_COUNTER_MAX | ||
|
||
# We convert the ID to hex for markup compactness | ||
@id_counter.to_s(16) | ||
end | ||
|
||
with_collection_parameter :facet_item | ||
|
||
def initialize(facet_item:, wrapping_element: 'li', suppress_link: false, collapsing: nil) | ||
@facet_item = facet_item | ||
@wrapping_element = wrapping_element | ||
@suppress_link = suppress_link | ||
@collapsing = collapsing.nil? ? facet_item.facet_config.collapsing : collapsing | ||
@icons = { show: '⊞', hide: '⊟' }.merge(facet_item.facet_config.icons || {}) | ||
end | ||
|
||
def call | ||
facet = Blacklight::FacetItemComponent.new(facet_item: @facet_item, wrapping_element: nil, suppress_link: @suppress_link) | ||
|
||
id = "h-#{self.class.mint_id}" if @collapsing && has_items? | ||
|
||
content_tag @wrapping_element, role: 'treeitem' do | ||
concat facet_toggle_button(id) if has_items? && @collapsing | ||
concat content_tag('span', render_component(facet), class: "facet-values #{'facet-leaf-node' if has_items? && @collapsing}", id: id && "#{id}_label") | ||
|
||
if has_items? | ||
concat(content_tag('ul', class: "pivot-facet list-unstyled #{'collapse' if @collapsing}", id: id, role: 'group') do | ||
render_component( | ||
self.class.with_collection( | ||
@facet_item.items.map { |i| facet_item_presenter(i) } | ||
) | ||
) | ||
end) | ||
end | ||
end | ||
end | ||
|
||
private | ||
|
||
def has_items? | ||
@facet_item.items.present? | ||
end | ||
|
||
def facet_toggle_button(id) | ||
content_tag 'button', class: 'btn facet-toggle-handle collapsed', | ||
data: { toggle: 'collapse', target: "##{id}" }, | ||
aria: { expanded: false, controls: id, describedby: "#{id}_label" } do | ||
concat toggle_icon(:show) | ||
concat toggle_icon(:hide) | ||
end | ||
end | ||
|
||
def toggle_icon(type) | ||
content_tag 'span', class: type do | ||
concat @icons[type] | ||
concat content_tag('span', t(type, scope: 'blacklight.search.facets.pivot'), class: 'sr-only') | ||
end | ||
end | ||
|
||
# This is a little convoluted in Blacklight 7 in order to maintain backwards-compat | ||
# with overrides of deprecated helpers. In 8.x, we can just call Component#render_in | ||
# and call it a day | ||
def render_component(component) | ||
@view_context.render(component) | ||
end | ||
|
||
def facet_item_presenter(facet_item) | ||
Blacklight::FacetItemPresenter.new(facet_item, @facet_item.facet_config, @view_context, @facet_item.facet_field, @facet_item.search_state) | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,3 @@ | ||
<ul class="pivot-facet list-unstyled"> | ||
<% display_facet.items.each do |item| -%> | ||
<li> | ||
<span class="facet-values"> | ||
<% if facet_in_params?(field_name, item) %> | ||
<%= render_selected_facet_value(field_name, item) %> | ||
<% else %> | ||
<%= render_facet_value(field_name, item) %> | ||
<% end -%> | ||
</span> | ||
|
||
<% unless item.items.blank? %> | ||
<%= render 'facet_pivot', display_facet: item, field_name: field_name %> | ||
<% end %> | ||
</li> | ||
<% end %> | ||
|
||
</ul> | ||
<%= render(Blacklight::FacetFieldListComponent.new( | ||
facet_field: facet_field_presenter(facet_field.merge(item_component: Blacklight::FacetItemPivotComponent), display_facet), | ||
layout: false)) %> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
66 changes: 66 additions & 0 deletions
66
spec/components/blacklight/facet_item_pivot_component_spec.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper' | ||
|
||
RSpec.describe Blacklight::FacetItemPivotComponent, type: :component do | ||
subject(:render) do | ||
render_inline(described_class.new(facet_item: facet_item)) | ||
end | ||
|
||
let(:rendered) do | ||
Capybara::Node::Simple.new(render) | ||
end | ||
|
||
let(:search_state) do | ||
Blacklight::SearchState.new({}, Blacklight::Configuration.new) | ||
end | ||
|
||
let(:facet_item) do | ||
instance_double( | ||
Blacklight::FacetItemPresenter, | ||
facet_config: Blacklight::Configuration::FacetField.new(key: 'z'), | ||
facet_field: 'z', | ||
label: 'x', | ||
hits: 10, | ||
href: '/catalog?f[z]=x', | ||
selected?: false, | ||
search_state: search_state, | ||
items: [OpenStruct.new(value: 'x:1', hits: 5)] | ||
) | ||
end | ||
|
||
it 'links to the facet and shows the number of hits' do | ||
expect(rendered).to have_selector 'li' | ||
expect(rendered).to have_link 'x', href: '/catalog?f[z]=x' | ||
expect(rendered).to have_selector '.facet-count', text: '10' | ||
end | ||
|
||
it 'has the facet hierarchy' do | ||
puts render | ||
expect(rendered).to have_selector 'li ul.pivot-facet' | ||
expect(rendered).to have_link 'x:1', href: /f%5Bz%5D%5B%5D=x%3A1/ | ||
end | ||
|
||
context 'with a selected facet' do | ||
let(:facet_item) do | ||
instance_double( | ||
Blacklight::FacetItemPresenter, | ||
facet_config: Blacklight::Configuration::FacetField.new, | ||
facet_field: 'z', | ||
label: 'x', | ||
hits: 10, | ||
href: '/catalog', | ||
selected?: true, | ||
search_state: search_state, | ||
items: [] | ||
) | ||
end | ||
|
||
it 'links to the facet and shows the number of hits' do | ||
expect(rendered).to have_selector 'li' | ||
expect(rendered).to have_selector '.selected', text: 'x' | ||
expect(rendered).to have_link '[remove]', href: '/catalog' | ||
expect(rendered).to have_selector '.selected.facet-count', text: '10' | ||
end | ||
end | ||
end |
Oops, something went wrong.