Skip to content

Commit

Permalink
Partially move reading room sites into editable site framework
Browse files Browse the repository at this point in the history
- 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
  • Loading branch information
barmintor committed Oct 14, 2024
1 parent 8afb21f commit 562ac67
Show file tree
Hide file tree
Showing 22 changed files with 206 additions and 102 deletions.
42 changes: 24 additions & 18 deletions app/controllers/repositories/catalog_controller.rb
Original file line number Diff line number Diff line change
@@ -1,29 +1,19 @@
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)
self._prefixes.unshift 'repositories'
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] } }
Expand All @@ -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
Expand Down Expand Up @@ -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
37 changes: 15 additions & 22 deletions app/controllers/repositories_controller.rb
Original file line number Diff line number Diff line change
@@ -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]
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/sites/search_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions app/controllers/sites_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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')
Expand Down
23 changes: 16 additions & 7 deletions app/helpers/dcv/subsite_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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} <i class=\"fa fa-external-link\" aria-hidden=\"true\"></i>".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
"<i class=\"fa #{nav_link.icon_class}\" aria-hidden=\"true\"></i><i class=\"fa fa-external-link\" aria-hidden=\"true\"></i>".html_safe
end
else
return link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class) do
"#{nav_link.label} <i class=\"fa fa-external-link\" aria-hidden=\"true\"></i>".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
"<i class=\"fa #{nav_link.icon_class}\" aria-hidden=\"true\"></i>".html_safe
end
end

Expand Down
71 changes: 56 additions & 15 deletions app/models/site.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
12 changes: 5 additions & 7 deletions app/views/repositories/_header_navbar.html.erb
Original file line number Diff line number Diff line change
@@ -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))) %>
<nav class="navbar navbar-expand d-flex flex-column" id="site-banner">
Expand All @@ -12,14 +10,14 @@ template_key&.gsub!("-","")
<nav class="navbar navbar-expand d-flex flex-md-row flex-sm-column" id="site-banner">
<a href="<%= repository_path(repository_key) %>" id="site-title" class="navbar-brand text-lg-left"><%= repository_physical_location(repository_key) %></a>
<%= render Dcv::SearchBar::RepositoriesComponent.new(
url: search_repository_catalog_path(repository_id: params[:repository_id]),
advanced_search_url: search_repository_catalog_path(repository_id: params[:repository_id], action: 'advanced_search'),
url: search_repository_search_path(repository_id: repository_key),
advanced_search_url: search_repository_search_path(repository_id: repository_key, action: 'advanced_search'),
params: search_state.params_for_search.except(:qt),
autocomplete_path: search_action_path(action: :suggest),
content_availability: 'onsite'
) if params[:repository_id] -%>
) if repository_key -%>
</nav>
<% end %><%= render("reading_room/#{template_key}/secondary_nav") if template_key %>
<% end %><%= render("secondary_nav") if repository_key %>
<% if controller.reading_room_client? -%>
<div class="note">This workstation provides access to content that can only be viewed on-site in the reading room.</div>
<% end -%>
33 changes: 33 additions & 0 deletions app/views/repositories/_secondary_nav.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<nav id="secondary-nav" class="navbar d-flex px-0">
<%- cache @subsite do -%>
<ul class="nav nav-pills mr-auto">
<li class="nav-item">
<a href="<%= repository_reading_room_url(repository_id: @subsite.repository_id) %>" class="nav-link" title="Online Reading Room Home"><i class="fa fa-home"></i></a>
</li>
<%- @subsite.nav_menus.each do |nav_menu| -%>
<%- if nav_menu.length > 1 -%>
<li class="dropdown">
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><%=nav_menu.label %> <b class="caret"></b></a>
<ul class="dropdown-menu list-unstyled dropdown-menu-left">
<%- nav_menu.links.each do |nav_link| -%>
<li><%= link_to_nav(nav_link, link_class: "dropdown-item", site_slug: params[:repository_id]) %></li>
<%- end -%>
</ul>
</li>
<%- else -%>
<li class="nav-item"><%= link_to_nav(nav_menu.links[-1]) %></li>
<%- end -%>
<%- end -%>
</ul>
<%- end -%>
<%- if map_search_settings_for_subsite.present? -%>
<ul class="nav nav-pills">
<li class="nav-item"><a href="<%= '/' + @subsite.slug + '/map_search' %>" class="nav-link mx-auto px-md-1"><span class="fa fa-map-marker"></span> Map<span class="d-md-none d-lg-inline"> All Items</span></a></li>
</ul>
<%- end -%>
<ul class="nav nav-pills">
<li class="nav-item">
<a href="/restricted" class="nav-link" title="List Online Reading Rooms"><i class="fa fa-list-alt"></i></a>
</li>
</ul>
</nav>
6 changes: 2 additions & 4 deletions app/views/repositories/reading_room.html.erb
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
<%-
template_key = params[:repository_id].downcase
template_key.gsub!("-","")
digital_projects = controller.digital_projects
%>
<div id="portals" class="row">
Expand All @@ -15,8 +13,8 @@ digital_projects = controller.digital_projects
<div class="card-body">
<h3 class="card-title">Digital Collections</h3>
<%= render Dcv::SearchBar::RepositoriesComponent.new(
url: search_repository_catalog_path(repository_id: params[:repository_id]),
advanced_search_url: search_repository_catalog_path(repository_id: params[:repository_id], action: 'advanced_search'),
url: search_repository_search_path(repository_id: params[:repository_id]),
advanced_search_url: search_repository_search_path(repository_id: params[:repository_id], action: 'advanced_search'),
params: search_state.params_for_search.except(:qt),
autocomplete_path: search_action_path(action: :suggest),
content_availability: 'onsite'
Expand Down
4 changes: 2 additions & 2 deletions app/views/shared/_secondary_nav.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><%=nav_menu.label %> <b class="caret"></b></a>
<ul class="dropdown-menu list-unstyled dropdown-menu-left">
<%- nav_menu.links.each do |nav_link| -%>
<li><%= link_to_nav(nav_link, "dropdown-item") %></li>
<li><%= link_to_nav(nav_link, link_class: "dropdown-item") %></li>
<%- end -%>
</ul>
</li>
<%- else -%>
<li><%= link_to_nav(nav_menu.links[-1]) %></li>
<li class="nav-item"><%= link_to_nav(nav_menu.links[-1]) %></li>
<%- end -%>
<%- end -%>
</ul>
Expand Down
Loading

0 comments on commit 562ac67

Please sign in to comment.