From 562ac67256d2f81ca29910ba6f3de3fdc0c79a27 Mon Sep 17 00:00:00 2001 From: Benjamin Armintor Date: Thu, 10 Oct 2024 17:31:00 -0400 Subject: [PATCH] Partially move reading room sites into editable site framework - move repositories controller blacklight config into Site model - reading room site searches use same URL semantics as editable sites - secondary nav is editable for reading room sites - secondary nav links can configure icon_class to be icon buttons - RepositoriesController subclasses SitesController - Repositories::CatalogController subclasses Sites::SearchController - DLC-1157 --- .../repositories/catalog_controller.rb | 42 ++++++----- app/controllers/repositories_controller.rb | 37 ++++------ app/controllers/sites/search_controller.rb | 2 +- app/controllers/sites_controller.rb | 4 +- app/helpers/dcv/subsite_helper.rb | 23 ++++-- app/models/site.rb | 71 +++++++++++++++---- .../repositories/_header_navbar.html.erb | 12 ++-- .../repositories/_secondary_nav.html.erb | 33 +++++++++ app/views/repositories/reading_room.html.erb | 6 +- app/views/shared/_secondary_nav.html.erb | 4 +- app/views/sites/edit.html.erb | 3 +- .../sites/edit/_navigation_link_form.html.erb | 4 ++ config/routes.rb | 6 +- ...40925215831_add_repository_site_records.rb | 10 ++- ...241014175733_add_nav_link_icon_property.rb | 5 ++ db/schema.rb | 3 +- .../repositories/catalog_controller_spec.rb | 2 +- .../repositories_controller_spec.rb | 7 -- .../sites/import/directory/properties.yml | 5 ++ spec/helpers/dcv/subsite_helper_spec.rb | 13 +++- .../repositories/catalog_controller_spec.rb | 10 +-- spec/routing/repositories_controller_spec.rb | 6 +- 22 files changed, 206 insertions(+), 102 deletions(-) create mode 100644 app/views/repositories/_secondary_nav.html.erb create mode 100644 db/migrate/20241014175733_add_nav_link_icon_property.rb diff --git a/app/controllers/repositories/catalog_controller.rb b/app/controllers/repositories/catalog_controller.rb index ecb390134..83d5f2eff 100644 --- a/app/controllers/repositories/catalog_controller.rb +++ b/app/controllers/repositories/catalog_controller.rb @@ -1,21 +1,11 @@ module Repositories - class CatalogController < ::SubsitesController + class CatalogController < Sites::SearchController include Dcv::MapDataController include Dcv::Sites::ReadingRooms before_action :set_map_data_json, only: [:map_search] - configure_blacklight do |config| - Dcv::Configurators::DcvBlacklightConfigurator.configure(config) - config.search_state_fields << :repository_id # allow repository id for routing - config.add_facet_field 'content_availability', label: 'Limit by Availability', - query: { - onsite: { label: 'Reading Room', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}!access_control_levels_ssim:Public*" }, - public: { label: 'Public', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}access_control_levels_ssim:Public*" }, - } - Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config, search_bar: Dcv::SearchBar::RepositoriesComponent) - - end + delegate :blacklight_config, to: :@subsite def initialize(*args) super(*args) @@ -23,7 +13,7 @@ def initialize(*args) self._prefixes.unshift 'repositories/catalog' end - + before_action :load_subsite! def search_service_context { builder: { addl_processor_chain: [:constrain_to_repository_context, :hide_concepts_when_query_blank_filter] } } @@ -32,15 +22,27 @@ def search_service_context prepend_view_path('app/views/repositories') prepend_view_path('app/views/repositories/catalog') - # SubsiteController Overrides - def self.subsite_config - {} + def load_subsite + @subsite ||= begin + site_slug = params[:repository_id] + s = Site.includes(:nav_links).find_by(slug: site_slug) + s&.configure_blacklight! + s + end end - def subsite_config - return self.class.subsite_config + def load_subsite! + _subsite = load_subsite + return _subsite if _subsite + raise ActiveRecord::RecordNotFound end + def subsite_key + params[:repository_id] || load_subsite&.slug + end + + alias_method :site_slug, :subsite_key + def default_search_mode subsite_config.fetch('default_search_mode',:grid) end @@ -79,5 +81,9 @@ def show_digital_project? true end helper_method :show_digital_project? + + def tracking_method + "track_#{controller_name}_path" + end end end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index a1283dc96..3ed250fc3 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -1,33 +1,13 @@ require 'redcarpet' -class RepositoriesController < ApplicationController - include Dcv::CatalogIncludes - include Dcv::CdnHelper +class RepositoriesController < SitesController include Dcv::Sites::ReadingRooms - include Dcv::Sites::SearchableController layout Proc.new { |controller| 'gallery' } configure_blacklight do |config| config.search_state_fields << :repository_id # allow repository id for routing - config.default_solr_params = { - :fq => [ - 'object_state_ssi:A', # Active items only - 'active_fedora_model_ssi:Concept', - 'dc_type_sim:"Publish Target"', - '-slug_ssim:sites', # Do not include sites publish targets in this list - ], - :sort => "title_si asc", - :qt => 'search' - } - config.add_search_field 'all_text_teim' do |field| - field.label = 'All Fields' - field.default = true - field.solr_parameters = { - :qf => ['all_text_teim'], - :pf => ['all_text_teim'] - } - end + Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config, search_bar: Dcv::SearchBar::RepositoriesComponent) end before_action :set_repository_id, only:[:show] @@ -40,6 +20,19 @@ def initialize(*args) self._prefixes.unshift 'repositories' end + def load_subsite + @subsite ||= begin + site_slug = params[:repository_id] + s = Site.includes(:nav_links).find_by(slug: site_slug) + s&.configure_blacklight! + s + end + end + + def subsite_key + params[:repository_id] || load_subsite&.slug + end + def search_service_context { builder: { addl_processor_chain: [:constrain_to_repository_context] } } end diff --git a/app/controllers/sites/search_controller.rb b/app/controllers/sites/search_controller.rb index a6b64c7f4..122c8f4b1 100644 --- a/app/controllers/sites/search_controller.rb +++ b/app/controllers/sites/search_controller.rb @@ -36,7 +36,7 @@ def search_url_service end def redirect_unless_local - unless load_subsite.search_type == 'local' + unless load_subsite.search_type == Site::SEARCH_LOCAL || load_subsite.search_type == Site::SEARCH_REPOSITORIES redirect_to search_url_service.search_action_url(load_subsite, self, {}) end end diff --git a/app/controllers/sites_controller.rb b/app/controllers/sites_controller.rb index 6d00c98e3..93bb51f54 100644 --- a/app/controllers/sites_controller.rb +++ b/app/controllers/sites_controller.rb @@ -327,7 +327,7 @@ def unroll_nav_link_params sort_group = "#{sprintf("%02d", group_index.to_i)}:#{group_data['label']}" group_data.fetch('links_attributes', {}).each do |link_index, link_data| sort_label = "#{sprintf("%02d", link_index.to_i)}:#{link_data['label']}" - nav_links << {sort_group: sort_group, sort_label: sort_label, link: link_data['link'], external: link_data['external']} + nav_links << {sort_group: sort_group, sort_label: sort_label, link: link_data['link'], external: link_data['external'], icon_class: link_data['icon_class']} end end params['site']['nav_links_attributes'] = nav_links @@ -336,7 +336,7 @@ def unroll_nav_link_params def site_params unroll_nav_link_params params.require(:site).permit(:palette, :layout, :show_facets, :alternative_title, :search_type, :editor_uids, :image_uris, :nav_links_attributes, - image_uris: [], nav_links_attributes: [:sort_group, :sort_label, :link, :external]) + image_uris: [], nav_links_attributes: [:sort_group, :sort_label, :link, :external, :icon_class]) .to_h.tap do |p| p.delete('banner') p.delete('watermark') diff --git a/app/helpers/dcv/subsite_helper.rb b/app/helpers/dcv/subsite_helper.rb index 397dbd78b..a9076b9b7 100644 --- a/app/helpers/dcv/subsite_helper.rb +++ b/app/helpers/dcv/subsite_helper.rb @@ -22,24 +22,33 @@ def subsite_has_scope_constraints? @subsite.scope_filters.present? end - def link_to_nav(nav_link, link_class = "nav-link") + def link_to_nav(nav_link, link_class: "nav-link", site_slug: nil) + link_url = nav_link.link if nav_link.external if Addressable::URI.parse(nav_link.link).absolute? - link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class) do - "#{nav_link.label} ".html_safe + if nav_link.icon_class.present? + return link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class, title: nav_link.label) do + "".html_safe + end + else + return link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class) do + "#{nav_link.label} ".html_safe + end end - else - link_to(nav_link.label, nav_link.link, class: link_class) end else - site_slug = controller.load_subsite.slug + site_slug ||= controller.load_subsite.slug link_params = {site_slug: site_slug} if nav_link.link.include?('#') nav_link.link.split('#').tap { |segs| link_params.merge!(slug: segs[0], anchor: segs[1]) } else link_params[:slug] = nav_link.link end - link_to(nav_link.label, site_page_path(link_params), class: link_class) + link_url = site_page_path(link_params) + end + return link_to(nav_link.label, link_url, class: link_class) unless nav_link.icon_class.present? + link_to(link_url, class: link_class, title: nav_link.label) do + "".html_safe end end diff --git a/app/models/site.rb b/app/models/site.rb index 7eae6f82e..f21022737 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -55,38 +55,79 @@ def routing_params(args = {}) end end - def self.configure_local_blacklight(config, default_fq:, routing_params:, search_configuration:, search_type:) - config.default_solr_params[:fq] += default_fq - config.show.route = routing_params - config.track_search_session = search_type != SEARCH_CATALOG - if search_type == SEARCH_LOCAL - config.document_unique_id_param = :ezid_doi_ssim - config.document_pagination_params[:fl] = "id,#{config.document_unique_id_param},format" - config.search_state_class = Dcv::Sites::LocalSearchState + def self.configure_blacklight_search_local(config, search_configuration:, **_args) + config.document_unique_id_param = :ezid_doi_ssim + config.document_pagination_params[:fl] = "id,#{config.document_unique_id_param},format" + config.search_state_class = Dcv::Sites::LocalSearchState + Dcv::Configurators::DcvBlacklightConfigurator.default_faceting_configuration(config, geo: search_configuration.map_configuration.enabled) + if search_configuration.facets.present? + search_configuration.facets.each do |facet| + facet.configure(config) + end else - config.show.route = routing_params + Dcv::Configurators::DcvBlacklightConfigurator.configure_facet_fields(config) end - if search_type == SEARCH_LOCAL && search_configuration.facets.present? + if search_configuration.search_fields.present? + search_configuration.search_fields.each do |search_field| + search_field.configure(config) + end + else + Dcv::Configurators::DcvBlacklightConfigurator.configure_keyword_search_field(config) + end + Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config) + config + end + + def self.configure_blacklight_search_repositories(config, search_configuration:, **_args) + config.document_unique_id_param = :ezid_doi_ssim + config.document_pagination_params[:fl] = "id,#{config.document_unique_id_param},format" + config.search_state_class = Dcv::SearchState + Dcv::Configurators::DcvBlacklightConfigurator.default_faceting_configuration(config, geo: search_configuration.map_configuration.enabled) + if search_configuration.facets.present? search_configuration.facets.each do |facet| facet.configure(config) end else Dcv::Configurators::DcvBlacklightConfigurator.configure_facet_fields(config) end - Dcv::Configurators::DcvBlacklightConfigurator.default_faceting_configuration(config, geo: search_configuration.map_configuration.enabled) - if search_type == SEARCH_LOCAL && search_configuration.search_fields.present? + config.add_facet_field('content_availability', + label: 'Limit by Availability', + query: { + onsite: { label: 'Reading Room', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}!access_control_levels_ssim:Public*" }, + public: { label: 'Public', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}access_control_levels_ssim:Public*" }, + } + ) + if search_configuration.search_fields.present? search_configuration.search_fields.each do |search_field| search_field.configure(config) end else Dcv::Configurators::DcvBlacklightConfigurator.configure_keyword_search_field(config) end - Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config) - end + config.search_state_fields << :repository_id # allow repository id for routing + Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config, search_bar: Dcv::SearchBar::RepositoriesComponent) + config + end + + def self.configure_site_blacklight(config, default_fq:, routing_params:, search_configuration:, search_type:) + config.default_solr_params[:fq] += default_fq + config.show.route = routing_params + config.track_search_session = search_type != SEARCH_CATALOG + if search_type == SEARCH_LOCAL + configure_blacklight_search_local(config, search_configuration: search_configuration) + elsif search_type == SEARCH_REPOSITORIES + configure_blacklight_search_repositories(config, search_configuration: search_configuration) + else + Dcv::Configurators::DcvBlacklightConfigurator.configure_facet_fields(config) + Dcv::Configurators::DcvBlacklightConfigurator.configure_keyword_search_field(config) + Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config) + config + end + end def configure_blacklight! configure_blacklight do |config| - Site.configure_local_blacklight(config, default_fq: default_fq, routing_params: routing_params, search_configuration: search_configuration, search_type: search_type) + Site.configure_site_blacklight(config, default_fq: default_fq, routing_params: routing_params, search_configuration: search_configuration, search_type: search_type) end end diff --git a/app/views/repositories/_header_navbar.html.erb b/app/views/repositories/_header_navbar.html.erb index 36034787a..7079a7ce2 100644 --- a/app/views/repositories/_header_navbar.html.erb +++ b/app/views/repositories/_header_navbar.html.erb @@ -1,7 +1,5 @@ <% -repository_key = params[:repository_id] -template_key = repository_key&.downcase -template_key&.gsub!("-","") +repository_key = params[:repository_id] || params[:site_slug] || controller.subsite_key %> <% if repository_key && (current_page?(repository_url(repository_key)) or current_page?(repository_reading_room_url(repository_id: repository_key))) %>