arclight 0.1.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. checksums.yaml +5 -5
  2. data/.all-contributorsrc +450 -0
  3. data/.codeclimate.yml +5 -0
  4. data/.eslintrc +14 -4
  5. data/.github/workflows/ruby.yml +51 -0
  6. data/.gitignore +2 -0
  7. data/.rspec +0 -1
  8. data/.rubocop.yml +503 -48
  9. data/.rubocop_todo.yml +122 -0
  10. data/.solr_wrapper +2 -1
  11. data/CONTRIBUTING.md +5 -5
  12. data/CONTRIBUTORS.md +79 -0
  13. data/Gemfile +15 -10
  14. data/README.md +47 -32
  15. data/Rakefile +0 -1
  16. data/app/assets/images/blacklight/bookmark.svg +1 -0
  17. data/app/assets/images/blacklight/collection.svg +5 -0
  18. data/app/assets/images/blacklight/compact.svg +1 -25
  19. data/app/assets/images/blacklight/container.svg +5 -0
  20. data/app/assets/images/blacklight/ead.svg +1 -0
  21. data/app/assets/images/blacklight/file.svg +5 -0
  22. data/app/assets/images/blacklight/folder.svg +1 -0
  23. data/app/assets/images/blacklight/list.svg +1 -0
  24. data/app/assets/images/blacklight/minus.svg +1 -0
  25. data/app/assets/images/blacklight/online.svg +5 -0
  26. data/app/assets/images/blacklight/pdf.svg +1 -0
  27. data/app/assets/images/blacklight/plus.svg +1 -0
  28. data/app/assets/images/blacklight/repository.svg +1 -0
  29. data/app/assets/javascripts/arclight/arclight.js +4 -9
  30. data/app/assets/javascripts/arclight/oembed_controller.js +58 -0
  31. data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
  32. data/app/assets/stylesheets/arclight/application.scss +4 -3
  33. data/app/assets/stylesheets/arclight/build.scss +4 -0
  34. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +117 -136
  35. data/app/assets/stylesheets/arclight/modules/highlights.scss +3 -2
  36. data/app/assets/stylesheets/arclight/modules/icons.scss +20 -0
  37. data/app/assets/stylesheets/arclight/modules/layout.scss +203 -16
  38. data/app/assets/stylesheets/arclight/modules/mastheads.scss +27 -45
  39. data/app/assets/stylesheets/arclight/modules/repositories.scss +3 -7
  40. data/app/assets/stylesheets/arclight/modules/repository_card.scss +5 -50
  41. data/app/assets/stylesheets/arclight/modules/search_form.scss +9 -0
  42. data/app/assets/stylesheets/arclight/modules/search_results.scss +200 -25
  43. data/app/assets/stylesheets/arclight/modules/show_collection.scss +21 -61
  44. data/app/assets/stylesheets/arclight/modules/truncator.scss +58 -0
  45. data/app/assets/stylesheets/arclight/responsive.scss +13 -0
  46. data/app/assets/stylesheets/arclight/variables.scss +25 -2
  47. data/app/components/arclight/access_component.html.erb +14 -0
  48. data/app/components/arclight/access_component.rb +25 -0
  49. data/app/components/arclight/bookmark_component.html.erb +25 -0
  50. data/app/components/arclight/bookmark_component.rb +9 -0
  51. data/app/components/arclight/breadcrumb_component.rb +50 -0
  52. data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
  53. data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
  54. data/app/components/arclight/collection_context_component.html.erb +12 -0
  55. data/app/components/arclight/collection_context_component.rb +27 -0
  56. data/app/components/arclight/collection_info_component.html.erb +28 -0
  57. data/app/components/arclight/collection_info_component.rb +26 -0
  58. data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
  59. data/app/components/arclight/collection_sidebar_component.rb +39 -0
  60. data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
  61. data/app/components/arclight/constraints_component.rb +17 -0
  62. data/app/components/arclight/document_collection_context_component.html.erb +29 -0
  63. data/app/components/arclight/document_collection_context_component.rb +28 -0
  64. data/app/components/arclight/document_collection_hierarchy_component.html.erb +50 -0
  65. data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
  66. data/app/components/arclight/document_component.html.erb +39 -0
  67. data/app/components/arclight/document_component.rb +49 -0
  68. data/app/components/arclight/document_components_hierarchy_component.html.erb +20 -0
  69. data/app/components/arclight/document_components_hierarchy_component.rb +34 -0
  70. data/app/components/arclight/document_download_component.html.erb +24 -0
  71. data/app/components/arclight/document_download_component.rb +71 -0
  72. data/app/components/arclight/embed_component.html.erb +10 -0
  73. data/app/components/arclight/embed_component.rb +43 -0
  74. data/app/components/arclight/expand_hierarchy_button_component.html.erb +5 -0
  75. data/app/components/arclight/expand_hierarchy_button_component.rb +16 -0
  76. data/app/components/arclight/group_component.html.erb +34 -0
  77. data/app/components/arclight/group_component.rb +23 -0
  78. data/app/components/arclight/header_component.html.erb +5 -0
  79. data/app/components/arclight/header_component.rb +10 -0
  80. data/app/components/arclight/index_metadata_field_component.html.erb +16 -0
  81. data/app/components/arclight/index_metadata_field_component.rb +20 -0
  82. data/app/components/arclight/masthead_component.html.erb +17 -0
  83. data/app/components/arclight/masthead_component.rb +10 -0
  84. data/app/components/arclight/metadata_section_component.html.erb +13 -0
  85. data/app/components/arclight/metadata_section_component.rb +22 -0
  86. data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
  87. data/app/components/arclight/oembed_viewer_component.rb +16 -0
  88. data/app/components/arclight/online_content_filter_component.html.erb +15 -0
  89. data/app/components/arclight/online_content_filter_component.rb +17 -0
  90. data/app/components/arclight/online_status_indicator_component.rb +19 -0
  91. data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
  92. data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
  93. data/app/components/arclight/repository_location_component.html.erb +20 -0
  94. data/app/components/arclight/repository_location_component.rb +10 -0
  95. data/app/components/arclight/search_bar_component.html.erb +27 -0
  96. data/app/components/arclight/search_bar_component.rb +32 -0
  97. data/app/components/arclight/search_result_breadcrumbs_component.html.erb +6 -0
  98. data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
  99. data/app/components/arclight/search_result_component.html.erb +20 -0
  100. data/app/components/arclight/search_result_component.rb +18 -0
  101. data/app/components/arclight/search_result_title_component.html.erb +15 -0
  102. data/app/components/arclight/search_result_title_component.rb +15 -0
  103. data/app/components/arclight/sidebar_component.html.erb +9 -0
  104. data/app/components/arclight/sidebar_component.rb +19 -0
  105. data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
  106. data/app/components/blacklight/icons/bookmark_component.rb +12 -0
  107. data/app/components/blacklight/icons/collection_component.rb +14 -0
  108. data/app/components/blacklight/icons/compact_component.rb +12 -0
  109. data/app/components/blacklight/icons/container_component.rb +14 -0
  110. data/app/components/blacklight/icons/ead_component.rb +12 -0
  111. data/app/components/blacklight/icons/file_component.rb +14 -0
  112. data/app/components/blacklight/icons/folder_component.rb +12 -0
  113. data/app/components/blacklight/icons/online_component.rb +15 -0
  114. data/app/components/blacklight/icons/pdf_component.rb +12 -0
  115. data/app/components/blacklight/icons/repository_component.rb +12 -0
  116. data/app/controllers/arclight/repositories_controller.rb +4 -4
  117. data/app/helpers/arclight/ead_format_helpers.rb +309 -0
  118. data/app/helpers/arclight/field_config_helpers.rb +26 -0
  119. data/app/helpers/arclight_helper.rb +55 -120
  120. data/app/models/arclight/document_downloads.rb +122 -0
  121. data/app/models/arclight/parent.rb +9 -9
  122. data/app/models/arclight/parents.rb +9 -4
  123. data/app/models/arclight/requests/aeon_external_request.rb +42 -0
  124. data/app/models/arclight/requests/aeon_web_ead.rb +52 -0
  125. data/app/models/arclight/requests/google_form.rb +8 -3
  126. data/app/models/concerns/arclight/catalog.rb +33 -11
  127. data/app/models/concerns/arclight/search_behavior.rb +22 -21
  128. data/app/models/concerns/arclight/solr_document.rb +88 -59
  129. data/app/presenters/arclight/show_presenter.rb +34 -7
  130. data/app/views/arclight/_requests.html.erb +7 -0
  131. data/app/views/arclight/repositories/_repository.html.erb +22 -41
  132. data/app/views/arclight/repositories/index.html.erb +5 -0
  133. data/app/views/arclight/repositories/show.html.erb +7 -8
  134. data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +8 -0
  135. data/app/views/arclight/requests/_aeon_web_ead.html.erb +6 -0
  136. data/app/views/arclight/requests/_google_form.html.erb +4 -5
  137. data/app/views/catalog/_document_list.html.erb +8 -0
  138. data/app/views/catalog/_group.html.erb +4 -0
  139. data/app/views/catalog/_group_toggle.html.erb +10 -0
  140. data/app/views/catalog/_search_results_header.html.erb +3 -0
  141. data/app/views/catalog/hierarchy.html.erb +19 -0
  142. data/app/views/catalog/index.html.erb +16 -7
  143. data/app/views/shared/_breadcrumbs.html.erb +3 -15
  144. data/app/views/shared/_main_menu_links.html.erb +1 -1
  145. data/arclight.gemspec +22 -17
  146. data/config/breadcrumbs.rb +24 -0
  147. data/config/i18n-tasks.yml +134 -0
  148. data/config/importmap.rb +3 -0
  149. data/config/locales/arclight.en.yml +90 -55
  150. data/config/routes.rb +1 -1
  151. data/docker-compose.yml +16 -0
  152. data/lib/arclight/digital_object.rb +2 -1
  153. data/lib/arclight/engine.rb +23 -31
  154. data/lib/arclight/exceptions.rb +1 -0
  155. data/lib/arclight/hash_absolute_xpath.rb +62 -0
  156. data/lib/arclight/level_label.rb +46 -0
  157. data/lib/arclight/missing_id_strategy.rb +21 -0
  158. data/lib/arclight/normalized_date.rb +24 -20
  159. data/lib/arclight/normalized_id.rb +7 -2
  160. data/lib/arclight/normalized_title.rb +3 -0
  161. data/lib/arclight/repository.rb +72 -47
  162. data/lib/arclight/routes/hierarchy.rb +19 -0
  163. data/lib/arclight/routes.rb +8 -0
  164. data/lib/arclight/traject/ead2_component_config.rb +335 -0
  165. data/lib/arclight/traject/ead2_config.rb +316 -0
  166. data/lib/arclight/traject/nokogiri_namespaceless_reader.rb +22 -0
  167. data/lib/arclight/version.rb +1 -1
  168. data/lib/arclight/year_range.rb +13 -4
  169. data/lib/arclight.rb +6 -1
  170. data/lib/generators/arclight/install_generator.rb +110 -10
  171. data/lib/generators/arclight/templates/arclight.scss +6 -3
  172. data/lib/generators/arclight/templates/catalog_controller.rb +249 -173
  173. data/lib/generators/arclight/templates/config/downloads.yml +12 -0
  174. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +61 -0
  175. data/lib/generators/arclight/templates/config/repositories.yml +42 -31
  176. data/lib/generators/arclight/update_generator.rb +1 -1
  177. data/lib/tasks/index.rake +25 -28
  178. data/package.json +15 -9
  179. data/solr/conf/schema.xml +101 -332
  180. data/solr/conf/solrconfig.xml +99 -164
  181. data/tasks/arclight.rake +22 -11
  182. data/template.rb +6 -11
  183. metadata +230 -105
  184. data/.travis.yml +0 -33
  185. data/app/assets/javascripts/arclight/collection_context.js +0 -18
  186. data/app/assets/javascripts/arclight/collection_navigation.js +0 -114
  187. data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
  188. data/app/assets/javascripts/arclight/component_ancestors.js +0 -56
  189. data/app/assets/javascripts/arclight/oembed_viewer.js +0 -39
  190. data/app/assets/javascripts/arclight/truncator.js.erb +0 -23
  191. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -3
  192. data/app/assets/stylesheets/arclight/modules/sidebar.scss +0 -16
  193. data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -86
  194. data/app/factories/blacklight_field_configuration_factory.rb +0 -29
  195. data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
  196. data/app/views/arclight/viewers/_oembed.html.erb +0 -7
  197. data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
  198. data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
  199. data/app/views/catalog/_arclight_document_show_header.html.erb +0 -15
  200. data/app/views/catalog/_arclight_document_show_header_collection.html.erb +0 -12
  201. data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -15
  202. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -5
  203. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  204. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  205. data/app/views/catalog/_collection_contents.html.erb +0 -12
  206. data/app/views/catalog/_collection_count.html.erb +0 -7
  207. data/app/views/catalog/_collection_downloads.html.erb +0 -17
  208. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  209. data/app/views/catalog/_collection_overview.html.erb +0 -7
  210. data/app/views/catalog/_component_overview.html.erb +0 -46
  211. data/app/views/catalog/_context_card.html.erb +0 -27
  212. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  213. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  214. data/app/views/catalog/_home.html.erb +0 -1
  215. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -3
  216. data/app/views/catalog/_index_default.html.erb +0 -17
  217. data/app/views/catalog/_index_header.html.erb +0 -7
  218. data/app/views/catalog/_index_header_hierarchy_default.html.erb +0 -42
  219. data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
  220. data/app/views/catalog/_index_hierarchy_default.html.erb +0 -28
  221. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  222. data/app/views/catalog/_results_histogram.html.erb +0 -10
  223. data/app/views/catalog/_search_results.html.erb +0 -31
  224. data/app/views/catalog/_search_within_form.html.erb +0 -16
  225. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -7
  226. data/app/views/catalog/_show_collection.html.erb +0 -40
  227. data/app/views/catalog/_show_component_sidebar.html.erb +0 -12
  228. data/app/views/catalog/_show_default.html.erb +0 -32
  229. data/app/views/catalog/_show_header.html.erb +0 -5
  230. data/app/views/catalog/_show_sidebar.html.erb +0 -30
  231. data/app/views/layouts/catalog_result.html.erb +0 -7
  232. data/app/views/shared/_context_sidebar.html.erb +0 -8
  233. data/app/views/shared/_header_navbar.html.erb +0 -54
  234. data/lib/arclight/custom_component.rb +0 -98
  235. data/lib/arclight/custom_document.rb +0 -93
  236. data/lib/arclight/indexer.rb +0 -9
  237. data/lib/arclight/shared_indexing_behavior.rb +0 -97
  238. data/lib/arclight/shared_terminology_behavior.rb +0 -65
  239. data/lib/arclight/solr_ead_indexer_ext.rb +0 -159
  240. data/lib/arclight/viewer.rb +0 -45
  241. data/lib/arclight/viewers/oembed.rb +0 -56
  242. data/lib/generators/arclight/templates/arclight.js +0 -2
  243. data/solr/conf/scripts.conf +0 -24
  244. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  245. data/vendor/assets/javascripts/stickyfill.js +0 -480
  246. /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
  247. /data/{app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb → config/repositories.yml} +0 -0
@@ -0,0 +1,10 @@
1
+ <div id="embed" class="mb-2">
2
+ <h2 class="al-show-sub-heading"><%= t('arclight.views.show.embedded_content') %></h2>
3
+ <%= render Arclight::OembedViewerComponent.with_collection(embeddable_resources, document: @document) %>
4
+
5
+ <% linked_resources.each do |resource| %>
6
+ <div class="al-digital-object">
7
+ <%= link_to(resource.label, resource.href) %>
8
+ </div>
9
+ <% end %>
10
+ </div>
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render digital object links for a document
5
+ class EmbedComponent < ViewComponent::Base
6
+ def initialize(document:, presenter:, **kwargs) # rubocop:disable Lint/UnusedMethodArgument
7
+ super()
8
+
9
+ @document = document
10
+ @presenter = presenter
11
+ end
12
+
13
+ def render?
14
+ resources.any?
15
+ end
16
+
17
+ def embeddable_resources
18
+ resources.first(1).select { |object| embeddable?(object) }
19
+ end
20
+
21
+ def linked_resources
22
+ resources - embeddable_resources
23
+ end
24
+
25
+ def resources
26
+ @resources ||= @document.digital_objects || []
27
+ end
28
+
29
+ def depth
30
+ @document.parents.length || 0
31
+ end
32
+
33
+ def embeddable?(object)
34
+ exclude_patterns.none? do |pattern|
35
+ object.href =~ pattern
36
+ end
37
+ end
38
+
39
+ def exclude_patterns
40
+ Arclight::Engine.config.oembed_resource_exclude_patterns
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ <ul>
2
+ <li>
3
+ <%= expand_link %>
4
+ </li>
5
+ </ul>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Component for rendering an expand button in the hierarchy view
5
+ class ExpandHierarchyButtonComponent < Blacklight::Component
6
+ def initialize(path:, classes: 'btn btn-secondary btn-sm')
7
+ super()
8
+ @path = path
9
+ @classes = classes
10
+ end
11
+
12
+ def expand_link
13
+ link_to t('arclight.views.show.expand'), @path, class: @classes
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,34 @@
1
+ <div class='al-grouped-title-bar'>
2
+ <div class='row'>
3
+ <div class='col-md-12'>
4
+ <% if document.repository_config.present? %>
5
+ <div class='al-grouped-repository breadcrumb-links'>
6
+ <%= link_to(document.repository_config.name, helpers.arclight_engine.repository_path(document.repository_config.slug)) %>
7
+ </div>
8
+ <% end %>
9
+ <h3><%= helpers.link_to_document document %></h3>
10
+ <% document.extent.each do |extent| %>
11
+ <%= tag.span extent, class: 'al-document-extent badge' unless compact? %>
12
+ <% end %>
13
+ <dl>
14
+ <%= render Arclight::IndexMetadataFieldComponent.with_collection(presenter.field_presenters.select { |field| !compact? || field.field_config.compact }) %>
15
+ </dl>
16
+ </div>
17
+ </div>
18
+ </div>
19
+
20
+ <div class="grouped-documents">
21
+ <div class="al-grouped-more">
22
+ <% if @group.total > 3 %>
23
+ <%= t('arclight.views.index.top_group_results', count: 3) %>
24
+ <%= link_to(
25
+ t('arclight.views.index.all_group_results', count: @group.total),
26
+ search_within_collection_url)
27
+ %>
28
+ <% else %>
29
+ <%= t('arclight.views.index.group_results_count', count: @group.total) %>
30
+ <% end %>
31
+ </div>
32
+
33
+ <%= helpers.render_document_index @group.docs %>
34
+ </div>
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render a collection document for a
5
+ # grouped search result view
6
+ class GroupComponent < Blacklight::Document::GroupComponent
7
+ def compact?
8
+ helpers.document_index_view_type.to_s == 'compact'
9
+ end
10
+
11
+ def document
12
+ @document ||= @group.docs.first.collection
13
+ end
14
+
15
+ def presenter
16
+ @presenter ||= Arclight::ShowPresenter.new(document, helpers).with_field_group('group_header_field')
17
+ end
18
+
19
+ def search_within_collection_url
20
+ search_catalog_path(helpers.search_without_group.deep_merge(f: { collection: [document.collection_name] }))
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ <header>
2
+ <%= top_bar %>
3
+ <%= masthead %>
4
+ <%= search_bar %>
5
+ </header>
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Provides a header with a masthead
5
+ class HeaderComponent < Blacklight::HeaderComponent
6
+ def masthead
7
+ render Arclight::MastheadComponent.new
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ <div class="row">
2
+ <%= tag.dt @field.label, class: 'visually-hidden' %>
3
+ <% if truncate? %>
4
+ <%= tag.dd(class: @classes + ['truncator'], data: { controller: 'arclight-truncate' }) do %>
5
+ <%= tag.div @field.render, class: 'content', data: { arclight_truncate_target: 'content' } %>
6
+ <%= button_tag(type: :button, class: 'btn btn-sm btn-link px-0',
7
+ data: { action: 'click->arclight-truncate#trigger' }) do %>
8
+ <%= tag.span t('arclight.truncation.view_more'), class: 'view-more' %>
9
+ <%= tag.span t('arclight.truncation.view_less'), class: 'view-less' %>
10
+ <%= tag.span(class: 'icon') %>
11
+ <% end %>
12
+ <% end %>
13
+ <% else %>
14
+ <%= tag.dd @field.render, class: @classes %>
15
+ <% end %>
16
+ </div>
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render a simple metadata field (e.g. without labels) in a .row div
5
+ class IndexMetadataFieldComponent < Blacklight::MetadataFieldComponent
6
+ def initialize(field:, classes: ['col'], **kwargs)
7
+ super(field: field, **kwargs)
8
+
9
+ @classes = classes + ["al-document-#{@field.key.dasherize}"]
10
+ end
11
+
12
+ def render?
13
+ helpers.document_index_view_type != :compact || @field.field_config.compact
14
+ end
15
+
16
+ def truncate?
17
+ !!@field.field_config.truncate
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ <div class='al-masthead bg-light'>
2
+ <div class="container">
3
+ <div class="row align-items-center">
4
+ <div class="col-md-8" >
5
+ <div class="h1 my-4 text-center text-md-start"><%= heading %></div>
6
+ </div>
7
+
8
+ <div class="col-md-4">
9
+ <nav class="navbar navbar-expand d-flex justify-content-md-end justify-content-center" aria-label="browse">
10
+ <ul class="navbar-nav">
11
+ <%= render 'shared/main_menu_links' %>
12
+ </ul>
13
+ </nav>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </div>
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render the masthead
5
+ class MastheadComponent < Blacklight::Component
6
+ def heading
7
+ t('arclight.masthead_heading_html')
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ <%= tag.div id: t("arclight.views.show.sections.#{@section}").parameterize do %>
2
+ <% if @heading %>
3
+ <h3 class='al-show-sub-heading'>
4
+ <%= t("arclight.views.show.sections.#{@section}", level: @presenter.document.level) %>
5
+ </h3>
6
+ <% end %>
7
+
8
+ <%= tag.dl class: @classes do %>
9
+ <% @presenter.field_presenters.each do |field_presenter| %>
10
+ <%= render (field_presenter.component || Blacklight::MetadataFieldComponent).new(field: field_presenter, show: true, **@metadata_attr) %>
11
+ <% end %>
12
+ <% end %>
13
+ <% end %>
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render a simple metadata field (e.g. without labels) in a .row div
5
+ class MetadataSectionComponent < ViewComponent::Base
6
+ with_collection_parameter :section
7
+
8
+ def initialize(section:, presenter:, metadata_attr: {}, classes: %w[row dl-invert], heading: false)
9
+ super()
10
+
11
+ @classes = classes
12
+ @section = section
13
+ @presenter = presenter.with_field_group(section)
14
+ @heading = heading
15
+ @metadata_attr = metadata_attr
16
+ end
17
+
18
+ def render?
19
+ @presenter.fields_to_render.any?
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ <%= tag.div(class: 'al-oembed-viewer', data: { controller: 'arclight-oembed', arclight_oembed_url_value: @resource.href }) do %>
2
+ <div class="al-digital-object">
3
+ <%= link_to(@resource.label, @resource.href) %>
4
+ </div>
5
+ <% end %>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render an oembed viewer for a document
5
+ class OembedViewerComponent < ViewComponent::Base
6
+ with_collection_parameter :resource
7
+
8
+ def initialize(resource:, document:, depth: 0)
9
+ super()
10
+
11
+ @resource = resource
12
+ @document = document
13
+ @depth = depth
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ <div class="card online-contents">
2
+ <div class="card-body d-flex align-items-center">
3
+ <div class="d-flex">
4
+ <span class="al-online-content-icon mr-2 me-2" aria-hidden="true"><%= helpers.blacklight_icon :online %></span>
5
+ <h2 class="d-none d-lg-inline">
6
+ <span class="visually-hidden">Filter</span>
7
+ <%= t('arclight.views.show.online_content.title') %>
8
+ </h2>
9
+ </div>
10
+ <div class="ms-3 ms-xl-5">
11
+ <div><%= t('arclight.views.show.online_content.description') %></div>
12
+ <%= link_to t('arclight.views.show.online_content.link_text'), helpers.search_action_path(f: { collection: [collection_name], access: ['online'] }) %>
13
+ </div>
14
+ </div>
15
+ </div>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render the box that displays a link to filter only for online content
5
+ class OnlineContentFilterComponent < Blacklight::Component
6
+ def initialize(document:)
7
+ @document = document
8
+ super()
9
+ end
10
+
11
+ def render?
12
+ @document.collection? && @document.online_content?
13
+ end
14
+
15
+ delegate :collection_name, to: :@document
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render an online status indicator for a document
5
+ class OnlineStatusIndicatorComponent < Blacklight::Component
6
+ def initialize(document:, **)
7
+ @document = document
8
+ super()
9
+ end
10
+
11
+ def render?
12
+ @document.online_content?
13
+ end
14
+
15
+ def call
16
+ tag.span helpers.blacklight_icon(:online), class: 'al-online-content-icon'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ <li class='breadcrumb-item'>
2
+ <span class="ms-3" aria-hidden="true">
3
+ <%= blacklight_icon(:repository, classes: 'al-repository-content-icon') %>
4
+ </span>
5
+ <% if repository_path %>
6
+ <%= link_to(@document.repository, helpers.arclight_engine.repository_path(repository_path)) %>
7
+ <% else %>
8
+ <%= @document.repository %>
9
+ <% end %>
10
+ </li>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Draws the repository breadcrumb item for a search result
5
+ class RepositoryBreadcrumbComponent < ViewComponent::Base
6
+ def initialize(document:)
7
+ super()
8
+ @document = document
9
+ end
10
+
11
+ delegate :blacklight_icon, to: :helpers
12
+
13
+ def repository_path
14
+ @document.repository_config&.slug
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ <%= render(@layout.new(field: @field)) do |component| %>
2
+ <% component.with_label do %>
3
+ <%= label %>
4
+ <% end %>
5
+ <% component.with_value do %>
6
+ <div class='al-in-person-repository-name'>
7
+ <% if repository.thumbnail_url %>
8
+ <%= image_tag repository.thumbnail_url, alt: '', class: 'img-fluid float-left' %>
9
+ <% end %>
10
+ <div>
11
+ <%= link_to(repository.name, helpers.arclight_engine.repository_path(repository.slug)) %>
12
+ </div>
13
+ </div>
14
+ <div class='al-in-person-repository-location'>
15
+ <address>
16
+ <%= repository.location %>
17
+ </address>
18
+ </div>
19
+ <% end %>
20
+ <% end %>
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render the repository location card as a metadata field
5
+ class RepositoryLocationComponent < Blacklight::MetadataFieldComponent
6
+ def repository
7
+ @field.values.first
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ <%= render(Blacklight::SearchBarComponent.new(
2
+ **@kwargs,
3
+ params: @params.merge(f: (@params[:f] || {}).except(:collection)),
4
+ q: @q,
5
+ search_field: @search_field)) do |c| %>
6
+
7
+ <% c.with_before_input_group do %>
8
+ <div class="input-group within-collection-dropdown">
9
+ <label class="input-group-text" for="within_collection">
10
+ <%= t('arclight.within_collection_dropdown.label_html') %>
11
+ </label>
12
+ <%= select_tag ('f[collection][]' if collection_name.present?), within_collection_options, id: 'within_collection', class: 'form-select search-field rounded-end' %>
13
+ </div>
14
+ <% end %>
15
+
16
+ <% c.with_prepend do %>
17
+ <%= prepend %>
18
+ <% end %>
19
+
20
+ <% c.with_append do %>
21
+ <%= append %>
22
+ <% end if append? %>
23
+
24
+ <% c.with_search_button do %>
25
+ <%= search_button %>
26
+ <% end if respond_to?(:search_button?) && search_button? # only BL8 has this option %>
27
+ <% end %>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Override Blacklight's SearchBarComponent to add a dropdown for choosing
5
+ # the context of the search (within "this collection" or "all collections").
6
+ # If a collection has not been chosen, it displays a dropdown with only "all collections"
7
+ # as the only selectable option.
8
+ class SearchBarComponent < Blacklight::SearchBarComponent
9
+ def initialize(**kwargs)
10
+ super
11
+
12
+ @kwargs = kwargs
13
+ end
14
+
15
+ def within_collection_options
16
+ value = collection_name || 'none-selected'
17
+ options_for_select(
18
+ [
19
+ [t('arclight.within_collection_dropdown.all_collections'), ''],
20
+ [t('arclight.within_collection_dropdown.this_collection'), value]
21
+ ],
22
+ selected: collection_name,
23
+ disabled: 'none-selected'
24
+ )
25
+ end
26
+
27
+ def collection_name
28
+ @collection_name ||= Array(@params.dig(:f, :collection)).reject(&:empty?).first ||
29
+ helpers.current_context_document&.collection_name
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,6 @@
1
+ <dt class="visually-hidden">Collection Context</dt>
2
+ <dd>
3
+ <div class='breadcrumb-links'>
4
+ <%= rendered_breadcrumbs %>
5
+ </div>
6
+ </dd>
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render the breadcrumbs for a search result document
5
+ class SearchResultBreadcrumbsComponent < Blacklight::MetadataFieldComponent
6
+ delegate :document, to: :@field
7
+
8
+ def initialize(field:, **kwargs)
9
+ @field = field
10
+ super
11
+ end
12
+
13
+ def breadcrumbs
14
+ offset = grouped? ? 2 : 0
15
+
16
+ Arclight::BreadcrumbComponent.new(document: document, count: breadcrumb_count, offset: offset)
17
+ end
18
+
19
+ def rendered_breadcrumbs
20
+ @rendered_breadcrumbs ||= capture { render breadcrumbs }
21
+ end
22
+
23
+ def render?
24
+ rendered_breadcrumbs.present?
25
+ end
26
+
27
+ def breadcrumb_count
28
+ @field.field_config.compact&.dig(:count) if compact?
29
+ end
30
+
31
+ delegate :grouped?, to: :helpers
32
+
33
+ def compact?
34
+ helpers.document_index_view_type == :compact
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ <%= content_tag @component,
2
+ id: @id,
3
+ data: {
4
+ 'document-id': @document.id.to_s.parameterize,
5
+ 'document-counter': @counter,
6
+ },
7
+ itemscope: true,
8
+ itemtype: @document.itemtype,
9
+ class: classes.flatten.join(' ') do %>
10
+ <div class="px-2 document-type-icon">
11
+ <%= icon %>
12
+ </div>
13
+ <div class="container">
14
+ <%= render Arclight::SearchResultTitleComponent.new(document: document, compact: compact?) %>
15
+
16
+ <div class="row">
17
+ <%= metadata %>
18
+ </div>
19
+ </div>
20
+ <% end %>
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render a document for a search result; this works with
5
+ # both the compact and list views for grouped or ungrouped
6
+ # results.
7
+ class SearchResultComponent < Blacklight::DocumentComponent
8
+ attr_reader :document
9
+
10
+ def compact?
11
+ presenter.view_config.key.to_s == 'compact'
12
+ end
13
+
14
+ def icon
15
+ helpers.blacklight_icon helpers.document_or_parent_icon(@document)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ <header class="documentHeader row" data-document-id="<%= @document.id %>">
2
+ <h3 class="index_title document-title-heading col">
3
+ <%= helpers.link_to_document @document, counter: @counter %>
4
+ <% @document.extent.each do |extent| %>
5
+ <%= tag.span extent, class: 'al-document-extent badge' unless compact? %>
6
+ <% end %>
7
+ <%= tag.span class: 'al-document-container text-muted' do %>
8
+ <%= @document.containers.join(', ') %>
9
+ <% end if @document.containers.present? %>
10
+ </h3>
11
+
12
+ <% actions.each do |action| %>
13
+ <%= action %>
14
+ <% end %>
15
+ </header>
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Render a document title for a search result
5
+ class SearchResultTitleComponent < Blacklight::DocumentTitleComponent
6
+ def initialize(compact:, **args)
7
+ @compact = compact
8
+ super(**args)
9
+ end
10
+
11
+ def compact?
12
+ @compact
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ <div class="offcanvas-lg offcanvas-start p-3 p-lg-1" tabindex="-1" id="sidebar">
2
+ <%= collection_context %>
3
+ <%= render 'show_tools', document: document %>
4
+ <%= collection_sidebar %>
5
+ <div id="collection-context" class="sidebar-section">
6
+ <h2><%= t('arclight.views.show.has_content') %></h2>
7
+ <%= turbo_frame_tag "al-hierarchy-#{document.root}", loading: 'lazy', src: hierarchy_solr_document_path(id: document.root, nest_path: @document.nest_path, hierarchy: true) %>
8
+ </div>
9
+ </div>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # A sidebar with collection context widget and tools
5
+ class SidebarComponent < Blacklight::Document::SidebarComponent
6
+ delegate :blacklight_config, :document_presenter, :should_render_field?,
7
+ :turbo_frame_tag, to: :helpers
8
+
9
+ def collection_context
10
+ render Arclight::CollectionContextComponent.new(presenter: document_presenter(document), download_component: Arclight::DocumentDownloadComponent)
11
+ end
12
+
13
+ def collection_sidebar
14
+ render Arclight::CollectionSidebarComponent.new(document: document,
15
+ collection_presenter: document_presenter(document.collection),
16
+ partials: blacklight_config.show.metadata_partials)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Override upstream to add an offset bootstrap column class
5
+ class UpperMetadataLayoutComponent < Blacklight::MetadataFieldLayoutComponent
6
+ def initialize(field:, label_class: 'col-md-3 offset-md-1', value_class: 'col-md-8')
7
+ super
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The bookmark icon
6
+ class BookmarkComponent < Blacklight::Icons::IconComponent
7
+ self.svg = <<~SVG
8
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 384 512"><path d="M0 512V48C0 21.49 21.49 0 48 0h288c26.51 0 48 21.49 48 48v464L192 400 0 512z"/></svg>
9
+ SVG
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The collection icon
6
+ class CollectionComponent < Blacklight::Icons::IconComponent
7
+ # Used unmodified from https://fontawesome.com
8
+ # CC BY 4.0 https://creativecommons.org/licenses/by/4.0/
9
+ self.svg = <<~SVG
10
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 512 512"><path d="M32 448c0 17.7 14.3 32 32 32h384c17.7 0 32-14.3 32-32V160H32v288zm160-212c0-6.6 5.4-12 12-12h104c6.6 0 12 5.4 12 12v8c0 6.6-5.4 12-12 12H204c-6.6 0-12-5.4-12-12v-8zM480 32H32C14.3 32 0 46.3 0 64v48c0 8.8 7.2 16 16 16h480c8.8 0 16-7.2 16-16V64c0-17.7-14.3-32-32-32z"/></svg>
11
+ SVG
12
+ end
13
+ end
14
+ end