Skip to content

Commit dc1afd7

Browse files
committed
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
1 parent 8afb21f commit dc1afd7

21 files changed

+199
-95
lines changed

app/controllers/repositories/catalog_controller.rb

+24-18
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
module Repositories
2-
class CatalogController < ::SubsitesController
2+
class CatalogController < Sites::SearchController
33
include Dcv::MapDataController
44
include Dcv::Sites::ReadingRooms
55

66
before_action :set_map_data_json, only: [:map_search]
77

8-
configure_blacklight do |config|
9-
Dcv::Configurators::DcvBlacklightConfigurator.configure(config)
10-
config.search_state_fields << :repository_id # allow repository id for routing
11-
config.add_facet_field 'content_availability', label: 'Limit by Availability',
12-
query: {
13-
onsite: { label: 'Reading Room', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}!access_control_levels_ssim:Public*" },
14-
public: { label: 'Public', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}access_control_levels_ssim:Public*" },
15-
}
16-
Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config, search_bar: Dcv::SearchBar::RepositoriesComponent)
17-
18-
end
8+
delegate :blacklight_config, to: :@subsite
199

2010
def initialize(*args)
2111
super(*args)
2212
self._prefixes.unshift 'repositories'
2313
self._prefixes.unshift 'repositories/catalog'
2414
end
2515

26-
16+
before_action :load_subsite!
2717

2818
def search_service_context
2919
{ builder: { addl_processor_chain: [:constrain_to_repository_context, :hide_concepts_when_query_blank_filter] } }
@@ -32,15 +22,27 @@ def search_service_context
3222
prepend_view_path('app/views/repositories')
3323
prepend_view_path('app/views/repositories/catalog')
3424

35-
# SubsiteController Overrides
36-
def self.subsite_config
37-
{}
25+
def load_subsite
26+
@subsite ||= begin
27+
site_slug = params[:repository_id]
28+
s = Site.includes(:nav_links).find_by(slug: site_slug)
29+
s&.configure_blacklight!
30+
s
31+
end
3832
end
3933

40-
def subsite_config
41-
return self.class.subsite_config
34+
def load_subsite!
35+
_subsite = load_subsite
36+
return _subsite if _subsite
37+
raise ActiveRecord::RecordNotFound
4238
end
4339

40+
def subsite_key
41+
params[:repository_id] || load_subsite&.slug
42+
end
43+
44+
alias_method :site_slug, :subsite_key
45+
4446
def default_search_mode
4547
subsite_config.fetch('default_search_mode',:grid)
4648
end
@@ -79,5 +81,9 @@ def show_digital_project?
7981
true
8082
end
8183
helper_method :show_digital_project?
84+
85+
def tracking_method
86+
"track_#{controller_name}_path"
87+
end
8288
end
8389
end

app/controllers/repositories_controller.rb

+15-22
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,13 @@
11
require 'redcarpet'
22

3-
class RepositoriesController < ApplicationController
4-
include Dcv::CatalogIncludes
5-
include Dcv::CdnHelper
3+
class RepositoriesController < SitesController
64
include Dcv::Sites::ReadingRooms
7-
include Dcv::Sites::SearchableController
85

96
layout Proc.new { |controller| 'gallery' }
107

118
configure_blacklight do |config|
129
config.search_state_fields << :repository_id # allow repository id for routing
13-
config.default_solr_params = {
14-
:fq => [
15-
'object_state_ssi:A', # Active items only
16-
'active_fedora_model_ssi:Concept',
17-
'dc_type_sim:"Publish Target"',
18-
'-slug_ssim:sites', # Do not include sites publish targets in this list
19-
],
20-
:sort => "title_si asc",
21-
:qt => 'search'
22-
}
23-
config.add_search_field 'all_text_teim' do |field|
24-
field.label = 'All Fields'
25-
field.default = true
26-
field.solr_parameters = {
27-
:qf => ['all_text_teim'],
28-
:pf => ['all_text_teim']
29-
}
30-
end
10+
Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config, search_bar: Dcv::SearchBar::RepositoriesComponent)
3111
end
3212

3313
before_action :set_repository_id, only:[:show]
@@ -40,6 +20,19 @@ def initialize(*args)
4020
self._prefixes.unshift 'repositories'
4121
end
4222

23+
def load_subsite
24+
@subsite ||= begin
25+
site_slug = params[:repository_id]
26+
s = Site.includes(:nav_links).find_by(slug: site_slug)
27+
s&.configure_blacklight!
28+
s
29+
end
30+
end
31+
32+
def subsite_key
33+
params[:repository_id] || load_subsite&.slug
34+
end
35+
4336
def search_service_context
4437
{ builder: { addl_processor_chain: [:constrain_to_repository_context] } }
4538
end

app/controllers/sites/search_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def search_url_service
3636
end
3737

3838
def redirect_unless_local
39-
unless load_subsite.search_type == 'local'
39+
unless load_subsite.search_type == Site::SEARCH_LOCAL || load_subsite.search_type == Site::SEARCH_REPOSITORIES
4040
redirect_to search_url_service.search_action_url(load_subsite, self, {})
4141
end
4242
end

app/controllers/sites_controller.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ def unroll_nav_link_params
327327
sort_group = "#{sprintf("%02d", group_index.to_i)}:#{group_data['label']}"
328328
group_data.fetch('links_attributes', {}).each do |link_index, link_data|
329329
sort_label = "#{sprintf("%02d", link_index.to_i)}:#{link_data['label']}"
330-
nav_links << {sort_group: sort_group, sort_label: sort_label, link: link_data['link'], external: link_data['external']}
330+
nav_links << {sort_group: sort_group, sort_label: sort_label, link: link_data['link'], external: link_data['external'], icon_class: link_data['icon_class']}
331331
end
332332
end
333333
params['site']['nav_links_attributes'] = nav_links
@@ -336,7 +336,7 @@ def unroll_nav_link_params
336336
def site_params
337337
unroll_nav_link_params
338338
params.require(:site).permit(:palette, :layout, :show_facets, :alternative_title, :search_type, :editor_uids, :image_uris, :nav_links_attributes,
339-
image_uris: [], nav_links_attributes: [:sort_group, :sort_label, :link, :external])
339+
image_uris: [], nav_links_attributes: [:sort_group, :sort_label, :link, :external, :icon_class])
340340
.to_h.tap do |p|
341341
p.delete('banner')
342342
p.delete('watermark')

app/helpers/dcv/subsite_helper.rb

+16-7
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,33 @@ def subsite_has_scope_constraints?
2222
@subsite.scope_filters.present?
2323
end
2424

25-
def link_to_nav(nav_link, link_class = "nav-link")
25+
def link_to_nav(nav_link, link_class: "nav-link", site_slug: nil)
26+
link_url = nav_link.link
2627
if nav_link.external
2728
if Addressable::URI.parse(nav_link.link).absolute?
28-
link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class) do
29-
"#{nav_link.label} <i class=\"fa fa-external-link\" aria-hidden=\"true\"></i>".html_safe
29+
if nav_link.icon_class.present?
30+
return link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class, title: nav_link.label) do
31+
"<i class=\"fa #{nav_link.icon_class}\" aria-hidden=\"true\"></i><i class=\"fa fa-external-link\" aria-hidden=\"true\"></i>".html_safe
32+
end
33+
else
34+
return link_to(nav_link.link, target: "_blank", rel: "noopener noreferrer", class: link_class) do
35+
"#{nav_link.label} <i class=\"fa fa-external-link\" aria-hidden=\"true\"></i>".html_safe
36+
end
3037
end
31-
else
32-
link_to(nav_link.label, nav_link.link, class: link_class)
3338
end
3439
else
35-
site_slug = controller.load_subsite.slug
40+
site_slug ||= controller.load_subsite.slug
3641
link_params = {site_slug: site_slug}
3742
if nav_link.link.include?('#')
3843
nav_link.link.split('#').tap { |segs| link_params.merge!(slug: segs[0], anchor: segs[1]) }
3944
else
4045
link_params[:slug] = nav_link.link
4146
end
42-
link_to(nav_link.label, site_page_path(link_params), class: link_class)
47+
link_url = site_page_path(link_params)
48+
end
49+
return link_to(nav_link.label, link_url, class: link_class) unless nav_link.icon_class.present?
50+
link_to(link_url, class: link_class, title: nav_link.label) do
51+
"<i class=\"fa #{nav_link.icon_class}\" aria-hidden=\"true\"></i>".html_safe
4352
end
4453
end
4554

app/models/site.rb

+56-15
Original file line numberDiff line numberDiff line change
@@ -55,38 +55,79 @@ def routing_params(args = {})
5555
end
5656
end
5757

58-
def self.configure_local_blacklight(config, default_fq:, routing_params:, search_configuration:, search_type:)
59-
config.default_solr_params[:fq] += default_fq
60-
config.show.route = routing_params
61-
config.track_search_session = search_type != SEARCH_CATALOG
62-
if search_type == SEARCH_LOCAL
63-
config.document_unique_id_param = :ezid_doi_ssim
64-
config.document_pagination_params[:fl] = "id,#{config.document_unique_id_param},format"
65-
config.search_state_class = Dcv::Sites::LocalSearchState
58+
def self.configure_blacklight_search_local(config, search_configuration:, **_args)
59+
config.document_unique_id_param = :ezid_doi_ssim
60+
config.document_pagination_params[:fl] = "id,#{config.document_unique_id_param},format"
61+
config.search_state_class = Dcv::Sites::LocalSearchState
62+
Dcv::Configurators::DcvBlacklightConfigurator.default_faceting_configuration(config, geo: search_configuration.map_configuration.enabled)
63+
if search_configuration.facets.present?
64+
search_configuration.facets.each do |facet|
65+
facet.configure(config)
66+
end
6667
else
67-
config.show.route = routing_params
68+
Dcv::Configurators::DcvBlacklightConfigurator.configure_facet_fields(config)
6869
end
69-
if search_type == SEARCH_LOCAL && search_configuration.facets.present?
70+
if search_configuration.search_fields.present?
71+
search_configuration.search_fields.each do |search_field|
72+
search_field.configure(config)
73+
end
74+
else
75+
Dcv::Configurators::DcvBlacklightConfigurator.configure_keyword_search_field(config)
76+
end
77+
Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config)
78+
config
79+
end
80+
81+
def self.configure_blacklight_search_repositories(config, search_configuration:, **_args)
82+
config.document_unique_id_param = :ezid_doi_ssim
83+
config.document_pagination_params[:fl] = "id,#{config.document_unique_id_param},format"
84+
config.search_state_class = Dcv::SearchState
85+
Dcv::Configurators::DcvBlacklightConfigurator.default_faceting_configuration(config, geo: search_configuration.map_configuration.enabled)
86+
if search_configuration.facets.present?
7087
search_configuration.facets.each do |facet|
7188
facet.configure(config)
7289
end
7390
else
7491
Dcv::Configurators::DcvBlacklightConfigurator.configure_facet_fields(config)
7592
end
76-
Dcv::Configurators::DcvBlacklightConfigurator.default_faceting_configuration(config, geo: search_configuration.map_configuration.enabled)
77-
if search_type == SEARCH_LOCAL && search_configuration.search_fields.present?
93+
config.add_facet_field('content_availability',
94+
label: 'Limit by Availability',
95+
query: {
96+
onsite: { label: 'Reading Room', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}!access_control_levels_ssim:Public*" },
97+
public: { label: 'Public', fq: "{!join from=cul_member_of_ssim to=fedora_pid_uri_ssi}access_control_levels_ssim:Public*" },
98+
}
99+
)
100+
if search_configuration.search_fields.present?
78101
search_configuration.search_fields.each do |search_field|
79102
search_field.configure(config)
80103
end
81104
else
82105
Dcv::Configurators::DcvBlacklightConfigurator.configure_keyword_search_field(config)
83106
end
84-
Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config)
85-
end
107+
config.search_state_fields << :repository_id # allow repository id for routing
108+
Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config, search_bar: Dcv::SearchBar::RepositoriesComponent)
109+
config
110+
end
111+
112+
def self.configure_site_blacklight(config, default_fq:, routing_params:, search_configuration:, search_type:)
113+
config.default_solr_params[:fq] += default_fq
114+
config.show.route = routing_params
115+
config.track_search_session = search_type != SEARCH_CATALOG
116+
if search_type == SEARCH_LOCAL
117+
configure_blacklight_search_local(config, search_configuration: search_configuration)
118+
elsif search_type == SEARCH_REPOSITORIES
119+
configure_blacklight_search_repositories(config, search_configuration: search_configuration)
120+
else
121+
Dcv::Configurators::DcvBlacklightConfigurator.configure_facet_fields(config)
122+
Dcv::Configurators::DcvBlacklightConfigurator.configure_keyword_search_field(config)
123+
Dcv::Configurators::DcvBlacklightConfigurator.default_component_configuration(config)
124+
config
125+
end
126+
end
86127

87128
def configure_blacklight!
88129
configure_blacklight do |config|
89-
Site.configure_local_blacklight(config, default_fq: default_fq, routing_params: routing_params, search_configuration: search_configuration, search_type: search_type)
130+
Site.configure_site_blacklight(config, default_fq: default_fq, routing_params: routing_params, search_configuration: search_configuration, search_type: search_type)
90131
end
91132
end
92133

Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<%
2-
repository_key = params[:repository_id]
3-
template_key = repository_key&.downcase
4-
template_key&.gsub!("-","")
2+
repository_key = params[:repository_id] || params[:site_slug] || controller.subsite_key
53
%>
64
<% if repository_key && (current_page?(repository_url(repository_key)) or current_page?(repository_reading_room_url(repository_id: repository_key))) %>
75
<nav class="navbar navbar-expand d-flex flex-column" id="site-banner">
@@ -12,14 +10,14 @@ template_key&.gsub!("-","")
1210
<nav class="navbar navbar-expand d-flex flex-md-row flex-sm-column" id="site-banner">
1311
<a href="<%= repository_path(repository_key) %>" id="site-title" class="navbar-brand text-lg-left"><%= repository_physical_location(repository_key) %></a>
1412
<%= render Dcv::SearchBar::RepositoriesComponent.new(
15-
url: search_repository_catalog_path(repository_id: params[:repository_id]),
16-
advanced_search_url: search_repository_catalog_path(repository_id: params[:repository_id], action: 'advanced_search'),
13+
url: search_repository_search_path(repository_id: repository_key),
14+
advanced_search_url: search_repository_search_path(repository_id: repository_key, action: 'advanced_search'),
1715
params: search_state.params_for_search.except(:qt),
1816
autocomplete_path: search_action_path(action: :suggest),
1917
content_availability: 'onsite'
20-
) if params[:repository_id] -%>
18+
) if repository_key -%>
2119
</nav>
22-
<% end %><%= render("reading_room/#{template_key}/secondary_nav") if template_key %>
20+
<% end %><%= render("secondary_nav") if repository_key %>
2321
<% if controller.reading_room_client? -%>
2422
<div class="note">This workstation provides access to content that can only be viewed on-site in the reading room.</div>
2523
<% end -%>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<nav id="secondary-nav" class="navbar d-flex px-0">
2+
<%- cache @subsite do -%>
3+
<ul class="nav nav-pills mr-auto">
4+
<li class="nav-item">
5+
<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>
6+
</li>
7+
<%- @subsite.nav_menus.each do |nav_menu| -%>
8+
<%- if nav_menu.length > 1 -%>
9+
<li class="dropdown">
10+
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><%=nav_menu.label %> <b class="caret"></b></a>
11+
<ul class="dropdown-menu list-unstyled dropdown-menu-left">
12+
<%- nav_menu.links.each do |nav_link| -%>
13+
<li><%= link_to_nav(nav_link, link_class: "dropdown-item", site_slug: params[:repository_id]) %></li>
14+
<%- end -%>
15+
</ul>
16+
</li>
17+
<%- else -%>
18+
<li class="nav-item"><%= link_to_nav(nav_menu.links[-1]) %></li>
19+
<%- end -%>
20+
<%- end -%>
21+
</ul>
22+
<%- end -%>
23+
<%- if map_search_settings_for_subsite.present? -%>
24+
<ul class="nav nav-pills">
25+
<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>
26+
</ul>
27+
<%- end -%>
28+
<ul class="nav nav-pills">
29+
<li class="nav-item">
30+
<a href="/restricted" class="nav-link" title="List Online Reading Rooms"><i class="fa fa-list-alt"></i></a>
31+
</li>
32+
</ul>
33+
</nav>

app/views/repositories/reading_room.html.erb

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
<%-
2-
template_key = params[:repository_id].downcase
3-
template_key.gsub!("-","")
42
digital_projects = controller.digital_projects
53
%>
64
<div id="portals" class="row">

app/views/shared/_secondary_nav.html.erb

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown"><%=nav_menu.label %> <b class="caret"></b></a>
88
<ul class="dropdown-menu list-unstyled dropdown-menu-left">
99
<%- nav_menu.links.each do |nav_link| -%>
10-
<li><%= link_to_nav(nav_link, "dropdown-item") %></li>
10+
<li><%= link_to_nav(nav_link, link_class: "dropdown-item") %></li>
1111
<%- end -%>
1212
</ul>
1313
</li>
1414
<%- else -%>
15-
<li><%= link_to_nav(nav_menu.links[-1]) %></li>
15+
<li class="nav-item"><%= link_to_nav(nav_menu.links[-1]) %></li>
1616
<%- end -%>
1717
<%- end -%>
1818
</ul>

app/views/sites/edit.html.erb

+2-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
</div>
3838
<div class="form-group">
3939
<label for="site_layout">Site Layout <span class="fa fa-question-circle" data-tooltip="tooltip-layout"></span></label>
40-
<%= site_form.select(:layout, options_for_select([['DLC Default', 'default'], ['Portrait', 'portrait'], ['Gallery', 'gallery'], ['Signature', 'signature']], @subsite.layout), {class: ['form-control']}) %>
40+
<%= site_form.select(:layout, options_for_select([['DLC Default', 'default'], ['Portrait', 'portrait'], ['Gallery', 'gallery'], ['Repositories', 'repositories'], ['Signature', 'signature']], @subsite.layout), {class: ['form-control']}) %>
4141
</div>
4242
<div class="form-group">
4343
<label for="site_search_type">Search Type <span class="fa fa-question-circle" data-tooltip="tooltip-search-type"></span></label>
@@ -175,6 +175,7 @@
175175
<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>
176176
<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>
177177
<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>
178+
<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>
178179
<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>
179180
<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>
180181
<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>

0 commit comments

Comments
 (0)