diff --git a/Gemfile b/Gemfile index 8c034c998..36519ed67 100644 --- a/Gemfile +++ b/Gemfile @@ -92,7 +92,6 @@ gem 'bootstrap_form', '~> 5.4' gem 'blacklight', '~> 8.0' gem 'blacklight-gallery', '~> 4.4' gem 'blacklight_heatmaps', '~> 1.3.0' -gem 'blacklight-hierarchy' gem 'blacklight-spotlight', '~> 4.4', '>= 4.4.0' gem 'twitter-typeahead-rails', '0.11.1.pre.corejavascript' gem 'blacklight_advanced_search' diff --git a/Gemfile.lock b/Gemfile.lock index 55163494a..8271c2dbb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -114,10 +114,6 @@ GEM blacklight-gallery (4.6.1) blacklight (>= 7.17, < 9) rails (>= 6.1, < 8) - blacklight-hierarchy (6.4.0) - blacklight (>= 7.18, < 9) - deprecation - rails (>= 6.1, < 7.3) blacklight-oembed (1.2.0) blacklight (>= 7.25, < 9) rails @@ -908,7 +904,6 @@ DEPENDENCIES bibtex-ruby blacklight (~> 8.0) blacklight-gallery (~> 4.4) - blacklight-hierarchy blacklight-oembed (~> 1.0) blacklight-spotlight (~> 4.4, >= 4.4.0) blacklight_advanced_search diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 43c28d4bb..517b1cd84 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -28,7 +28,6 @@ //= require cited_documents //= require blacklight_gallery //= require blacklight_heatmaps -//= require blacklight_hierarchy //= require blacklight_oembed //= require full_text_collapse //= require index_status_typeahead diff --git a/app/assets/javascripts/blacklight_hierarchy.js b/app/assets/javascripts/blacklight_hierarchy.js deleted file mode 100644 index 3cf7ca25d..000000000 --- a/app/assets/javascripts/blacklight_hierarchy.js +++ /dev/null @@ -1,9 +0,0 @@ -//= require blacklight/hierarchy/hierarchy - -// If you use Stimulus in your application you can remove the line above and require -// blacklight_hierarchy_controller instead: -// -// import BlacklightHierarchyController from 'blacklight-hierarchy/app/assets/javascripts/blacklight/hierarchy/blacklight_hierarchy_controller' -// import { Application } from '@hotwired/stimulus' -// const application = Application.start() -// application.register("b-h-collapsible", BlacklightHierarchyController) diff --git a/app/assets/stylesheets/base.scss b/app/assets/stylesheets/base.scss index a357f6006..c026eb044 100644 --- a/app/assets/stylesheets/base.scss +++ b/app/assets/stylesheets/base.scss @@ -9,7 +9,6 @@ @import "sir-trevor/main"; @import "openseadragon"; @import "blacklight"; -@import "blacklight/hierarchy/hierarchy"; @import "blacklight_gallery"; @import "spotlight"; @import "sul_theme"; diff --git a/app/components/name_roles_facet_hierarchy_component.rb b/app/components/name_roles_facet_hierarchy_component.rb new file mode 100644 index 000000000..e8ed8deb5 --- /dev/null +++ b/app/components/name_roles_facet_hierarchy_component.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +# Display the creators/contributors by role facet in a tree hierarchy +class NameRolesFacetHierarchyComponent < Blacklight::FacetFieldListComponent + def facet_item_presenters + facet_item_tree_hierarchy.map do |item| + facet_item_presenter(item) + end + end + + def facet_items(wrapping_element: :li, **item_args) + facet_item_component_class.with_collection( + facet_item_presenters, + wrapping_element:, + suppress_link: true, + **item_args + ) + end + + # Solr data is in the form of role|name. Either can be empty. + # E.g., ["Collector|", "Defendant|Becker, Friedrich", "|Wagner, Richard, 1813-1883"] + def facet_item_tree_hierarchy(delimiter: facet_config.delimiter || '|') + roles = {} + + @facet_field.paginator.items.each do |item| + role, name = item.value.split(delimiter) + next if role.blank? || name.blank? + + roles[role] ||= Blacklight::Solr::Response::Facets::FacetItem.new( + value: role, + hits: nil, + items: [] + ) + roles[role].items << item if name.present? + end + + roles.values + end +end diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb index 4d1ae70e8..474402b89 100644 --- a/app/controllers/catalog_controller.rb +++ b/app/controllers/catalog_controller.rb @@ -190,8 +190,10 @@ class CatalogController < ApplicationController config.add_facet_field 'pub_year_tisim', label: 'Date Range', range: { chart_js: false, slider_js: false } config.add_facet_field 'language', label: 'Language', limit: true config.add_facet_field 'name_ssim', label: 'Creators/Contributors', limit: true - config.add_facet_field 'name_roles_ssim', label: 'Creators/Contributors by role', limit: -1, - component: Blacklight::Hierarchy::FacetFieldListComponent, + config.add_facet_field 'name_roles_ssim', label: 'Creators/Contributors by role', limit: -1, sort: :index, + collapsing: true, multiple: true, + component: NameRolesFacetHierarchyComponent, + item_component: Blacklight::FacetItemPivotComponent, item_presenter: RoleFacetItemPresenter config.add_facet_field 'author_person_facet', label: 'Author', limit: true # includes Collectors config.add_facet_field 'author_no_collector_ssim', label: 'Author (no Collectors)', limit: true @@ -221,12 +223,6 @@ class CatalogController < ApplicationController # handler defaults, or have no facets. config.add_facet_fields_to_solr_request! - config.facet_display = { - hierarchy: { - 'name_roles' => [['ssim'], '|'] - } - } - # Solr fields to be displayed in the search results and the show (single result) views # The ordering of the field names is the order of the display diff --git a/app/presenters/role_facet_item_presenter.rb b/app/presenters/role_facet_item_presenter.rb index 7fb0dd07e..37d9ea733 100644 --- a/app/presenters/role_facet_item_presenter.rb +++ b/app/presenters/role_facet_item_presenter.rb @@ -1,8 +1,15 @@ # frozen_string_literal: true # Format role hierarchy for display -class RoleFacetItemPresenter < Blacklight::FacetItemPresenter +class RoleFacetItemPresenter < Blacklight::FacetItemPivotPresenter def label - super.split('|', 2).join(': ') + role, name = value.split('|', 2) + return role if name.blank? + + name + end + + def constraint_label + value.split('|', 2).join(': ') end end