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 dc1afd7
Show file tree
Hide file tree
Showing 21 changed files with 199 additions and 95 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>
2 changes: 0 additions & 2 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 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
3 changes: 2 additions & 1 deletion app/views/sites/edit.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
</div>
<div class="form-group">
<label for="site_layout">Site Layout <span class="fa fa-question-circle" data-tooltip="tooltip-layout"></span></label>
<%= site_form.select(:layout, options_for_select([['DLC Default', 'default'], ['Portrait', 'portrait'], ['Gallery', 'gallery'], ['Signature', 'signature']], @subsite.layout), {class: ['form-control']}) %>
<%= site_form.select(:layout, options_for_select([['DLC Default', 'default'], ['Portrait', 'portrait'], ['Gallery', 'gallery'], ['Repositories', 'repositories'], ['Signature', 'signature']], @subsite.layout), {class: ['form-control']}) %>
</div>
<div class="form-group">
<label for="site_search_type">Search Type <span class="fa fa-question-circle" data-tooltip="tooltip-search-type"></span></label>
Expand Down Expand Up @@ -175,6 +175,7 @@
<span id="tooltip-subtitle" title="Alternative Title">The subtitle of the site. If blank and the Hyacinth data for the site includes a Library Location, that library's name will be used in some layouts.</span>
<span id="tooltip-nav-menu-label" title="Link Group Label">The label for this group of links, which will be presented as a drop-down menu if there are multiple links. If the group has only one link, the group label will not be displayed and the link will be presented directly in the site navigation bar.</span>
<span id="tooltip-nav-link-label" title="Link Label">The label used for a link in a drop-down menu or, if it is the only link in a group, the site navigation bar.</span>
<span id="tooltip-nav-link-icon-class" title="Icon Class">The fontawesome class to use to iconify this link. The link label will be help text/title for the icon button.</span>
<span id="tooltip-nav-link" title="Link To">The URL associated with this link. Full URLs will indicate that they are links to external resources. If a page slug is given and the link is marked as internal, a link to the named page will be built.</span>
<span id="tooltip-layout" title="Site Layout">The overall layout of markup for the site, governing the homepage and any configured site pages. "DLC default" defers to the design team's default configurations. See the <a href="https://resolver.library.columbia.edu/dlc-editor-docs" target="_blank">site editor documentation</a> for details.</span>
<span id="tooltip-palette" title="Site Palette">The color scheme for the site, governing the homepage and any configured site pages. "DLC default" defers to the design team's default configurations. See the <a href="https://resolver.library.columbia.edu/dlc-editor-docs" target="_blank">site editor documentation</a> for details.</span>
Expand Down
Loading

0 comments on commit dc1afd7

Please sign in to comment.