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,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The compact icon
6
+ class CompactComponent < Blacklight::Icons::IconComponent
7
+ self.svg = <<~SVG
8
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"><path d="M3,15H21V13H3Zm0,4H21V17H3Zm0-8H21V9H3ZM3,5V7H21V5Z"/></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 container icon
6
+ class ContainerComponent < 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" height="24" width="24" viewBox="0 0 512 512"><path d="M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z"/></svg>
11
+ SVG
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The ead icon
6
+ class EadComponent < Blacklight::Icons::IconComponent
7
+ self.svg = <<~SVG
8
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 384 512"><path d="M149.9 349.1l-.2-.2-32.8-28.9 32.8-28.9c3.6-3.2 4-8.8.8-12.4l-.2-.2-17.4-18.6c-3.4-3.6-9-3.7-12.4-.4l-57.7 54.1c-3.7 3.5-3.7 9.4 0 12.8l57.7 54.1c1.6 1.5 3.8 2.4 6 2.4 2.4 0 4.8-1 6.4-2.8l17.4-18.6c3.3-3.5 3.1-9.1-.4-12.4zm220-251.2L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM256 51.9l76.1 76.1H256zM336 464H48V48h160v104c0 13.3 10.7 24 24 24h104zM209.6 214c-4.7-1.4-9.5 1.3-10.9 6L144 408.1c-1.4 4.7 1.3 9.6 6 10.9l24.4 7.1c4.7 1.4 9.6-1.4 10.9-6L240 231.9c1.4-4.7-1.3-9.6-6-10.9zm24.5 76.9l.2.2 32.8 28.9-32.8 28.9c-3.6 3.2-4 8.8-.8 12.4l.2.2 17.4 18.6c3.3 3.5 8.9 3.7 12.4.4l57.7-54.1c3.7-3.5 3.7-9.4 0-12.8l-57.7-54.1c-3.5-3.3-9.1-3.2-12.4.4l-17.4 18.6c-3.3 3.5-3.1 9.1.4 12.4z"/></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 file icon
6
+ class FileComponent < 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 384 512"><path d="M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm160-14.1v6.1H256V0h6.1c6.4 0 12.5 2.5 17 7l97.9 98c4.5 4.5 7 10.6 7 16.9z"/></svg>
11
+ SVG
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The folder icon
6
+ class FolderComponent < Blacklight::Icons::IconComponent
7
+ self.svg = <<~SVG
8
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 512 512"><path d="M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z"/></svg>
9
+ SVG
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The online icon
6
+ class OnlineComponent < 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
+
11
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 640 512"><path d="M608 0H160a32 32 0 0 0-32 32v96h160V64h192v320h128a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zM232 103a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm352 208a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9v-30a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm0-104a9 9 0 0 1-9 9h-30a9 9 0 0 1-9-9V73a9 9 0 0 1 9-9h30a9 9 0 0 1 9 9zm-168 57H32a32 32 0 0 0-32 32v288a32 32 0 0 0 32 32h384a32 32 0 0 0 32-32V192a32 32 0 0 0-32-32zM96 224a32 32 0 1 1-32 32 32 32 0 0 1 32-32zm288 224H64v-32l64-64 32 32 128-128 96 96z"/></svg>
12
+ SVG
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The pdf icon
6
+ class PdfComponent < Blacklight::Icons::IconComponent
7
+ self.svg = <<~SVG
8
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 384 512"><path d="M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm250.2-143.7c-12.2-12-47-8.7-64.4-6.5-17.2-10.5-28.7-25-36.8-46.3 3.9-16.1 10.1-40.6 5.4-56-4.2-26.2-37.8-23.6-42.6-5.9-4.4 16.1-.4 38.5 7 67.1-10 23.9-24.9 56-35.4 74.4-20 10.3-47 26.2-51 46.2-3.3 15.8 26 55.2 76.1-31.2 22.4-7.4 46.8-16.5 68.4-20.1 18.9 10.2 41 17 55.8 17 25.5 0 28-28.2 17.5-38.7zm-198.1 77.8c5.1-13.7 24.5-29.5 30.4-35-19 30.3-30.4 35.7-30.4 35zm81.6-190.6c7.4 0 6.7 32.1 1.8 40.8-4.4-13.9-4.3-40.8-1.8-40.8zm-24.4 136.6c9.7-16.9 18-37 24.7-54.7 8.3 15.1 18.9 27.2 30.1 35.5-20.8 4.3-38.9 13.1-54.8 19.2zm131.6-5s-5 6-37.3-7.8c35.1-2.6 40.9 5.4 37.3 7.8z"/></svg>
9
+ SVG
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # The repository icon
6
+ class RepositoryComponent < Blacklight::Icons::IconComponent
7
+ self.svg = <<~SVG
8
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M4 10v7h3v-7H4zm6 0v7h3v-7h-3zM2 22h19v-3H2v3zm14-12v7h3v-7h-3zm-4.5-9L2 6v2h19V6l-9.5-5z"/></svg>
9
+ SVG
10
+ end
11
+ end
12
+ end
@@ -12,7 +12,7 @@ module Arclight
12
12
  @repository = Arclight::Repository.find_by!(slug: params[:id])
13
13
  search_service = Blacklight.repository_class.new(blacklight_config)
14
14
  @response = search_service.search(
15
- q: "level_sim:Collection repository_sim:\"#{@repository.name}\"",
15
+ q: "level_ssim:Collection repository_ssim:\"#{@repository.name}\"",
16
16
  rows: 100
17
17
  )
18
18
  @collections = @response.documents
@@ -30,11 +30,11 @@ module Arclight
30
30
  def fetch_collection_counts
31
31
  search_service = Blacklight.repository_class.new(blacklight_config)
32
32
  results = search_service.search(
33
- q: 'level_sim:Collection',
34
- 'facet.field': 'repository_sim',
33
+ q: 'level_ssim:Collection',
34
+ 'facet.field': 'repository_ssim',
35
35
  rows: 0
36
36
  )
37
- Hash[*results.facet_fields['repository_sim']]
37
+ Hash[*results.facet_fields['repository_ssim']]
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,309 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ ##
5
+ # A module to add EAD to HTML transformation rules for Arclight
6
+ module EadFormatHelpers # rubocop:disable Metrics/ModuleLength
7
+ extend ActiveSupport::Concern
8
+
9
+ def render_html_tags(args)
10
+ values = Array(args[:value])
11
+ values.map! do |value|
12
+ transform_ead_to_html(value)
13
+ end
14
+ values.map! { |value| wrap_in_paragraph(value) } if values.count > 1
15
+ safe_join(values.map(&:html_safe))
16
+ end
17
+
18
+ private
19
+
20
+ def transform_ead_to_html(value)
21
+ Loofah.xml_fragment(condense_whitespace(value))
22
+ .scrub!(ead_to_html_scrubber)
23
+ .scrub!(:strip).to_html
24
+ end
25
+
26
+ # rubocop:disable Metrics/AbcSize
27
+ def ead_to_html_scrubber
28
+ Loofah::Scrubber.new do |node|
29
+ format_render_attributes(node) if node.attr('render').present?
30
+ convert_to_span(node) if CONVERT_TO_SPAN_TAGS.include? node.name
31
+ convert_to_br(node) if CONVERT_TO_BR_TAG.include? node.name
32
+ format_links(node) if %w[extptr extref extrefloc ptr ref].include? node.name
33
+ format_lists(node) if %w[list chronlist].include? node.name
34
+ format_indexes(node) if node.name == 'index'
35
+ format_tables(node) if node.name == 'table'
36
+ node
37
+ end
38
+ end
39
+ # rubocop:enable Metrics/AbcSize
40
+
41
+ # Tags that should be converted to <span> tags because of formatting conflicts between XML and HTML
42
+ CONVERT_TO_SPAN_TAGS = ['title'].freeze
43
+
44
+ # Tags that should be converted to HTML <br/> tags
45
+ CONVERT_TO_BR_TAG = ['lb'].freeze
46
+
47
+ def convert_to_span(node)
48
+ node.name = 'span'
49
+ end
50
+
51
+ def convert_to_br(node)
52
+ node.name = 'br'
53
+ end
54
+
55
+ def condense_whitespace(str)
56
+ str.squish.strip.gsub(/>[\n\s]+</, '><')
57
+ end
58
+
59
+ def wrap_in_paragraph(value)
60
+ if value.start_with?('<')
61
+ value
62
+ else
63
+ content_tag(:p, value)
64
+ end
65
+ end
66
+
67
+ def format_render_attributes(node) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
68
+ case node.attr('render')
69
+ when 'altrender'
70
+ node.name = 'span'
71
+ node['class'] = node['altrender']
72
+ when 'bold'
73
+ node.name = 'strong'
74
+ when 'bolddoublequote'
75
+ node.name = 'strong'
76
+ node.prepend_child '"'
77
+ node.add_child '"'
78
+ when 'bolditalic'
79
+ node.name = 'strong'
80
+ node.wrap('<em/>')
81
+ when 'boldsinglequote'
82
+ node.name = 'strong'
83
+ node.prepend_child '\''
84
+ node.add_child '\''
85
+ when 'boldsmcaps'
86
+ node.name = 'strong'
87
+ node.wrap('<small/>')
88
+ node['class'] = 'text-uppercase'
89
+ when 'boldunderline'
90
+ node.name = 'strong'
91
+ node['class'] = 'text-underline'
92
+ when 'doublequote'
93
+ node.name = 'span'
94
+ node.prepend_child '"'
95
+ node.add_child '"'
96
+ when 'italic', 'nonproport'
97
+ node.name = 'em'
98
+ when 'singlequote'
99
+ node.name = 'span'
100
+ node.prepend_child '\''
101
+ node.add_child '\''
102
+ when 'smcaps'
103
+ node.name = 'small'
104
+ node['class'] = 'text-uppercase'
105
+ when 'sub'
106
+ node.name = 'sub'
107
+ when 'super'
108
+ node.name = 'sup'
109
+ when 'underline'
110
+ node.name = 'span'
111
+ node['class'] = 'text-underline'
112
+ end
113
+ end
114
+
115
+ def format_links(node)
116
+ node.remove_attribute('target')
117
+ node.remove_attribute('type')
118
+ if %w[extptr extref extrefloc].include? node.name
119
+ node['target'] = '_blank'
120
+ node['class'] = 'external-link'
121
+ end
122
+ node.content = node['title'] if (%w[extptr ptr].include? node.name) && node['title'].present?
123
+ node.name = 'a' if node['href'].present?
124
+ end
125
+
126
+ def format_lists(node)
127
+ format_simple_lists(node) if node.name == 'list' && node['type'] != 'deflist'
128
+ format_deflists(node) if node.name == 'list' && node['type'] == 'deflist'
129
+ format_chronlists(node) if node.name == 'chronlist'
130
+ end
131
+
132
+ def format_simple_lists(node)
133
+ node.name = 'ul' if (%w[simple marked].include? node['type']) || node['type'].blank?
134
+ node.name = 'ol' if node['type'] == 'ordered'
135
+ node.remove_attribute('type')
136
+ head_node = node.at_css('head')
137
+ format_list_head(head_node) if head_node.present?
138
+ items = node.css('item')
139
+ items.each { |item_node| item_node.name = 'li' }
140
+ end
141
+
142
+ def format_list_head(node)
143
+ node['class'] = 'list-head'
144
+ node.name = 'div'
145
+ node.parent.previous = node # move it from within the list to above it
146
+ end
147
+
148
+ def format_deflists(node)
149
+ listhead_node = node.at_css('listhead')
150
+ labels = node.css('label')
151
+ items = node.css('item')
152
+ defitems = node.css('defitem')
153
+ node.remove_attribute('type')
154
+
155
+ if listhead_node.present?
156
+ format_deflist_as_table(node, labels, items, defitems)
157
+ else
158
+ format_deflist_as_dl(node, labels, items, defitems)
159
+ end
160
+ end
161
+
162
+ def format_deflist_as_table(node, labels, items, defitems)
163
+ node.name = 'table'
164
+ node['class'] = 'table deflist'
165
+ listhead_node = node.at_css('listhead')
166
+ format_deflist_table_head(listhead_node)
167
+ node.at_css('thead').next = '<tbody/>'
168
+ labels.each { |label_node| label_node.name = 'td' }
169
+ items.each { |item_node| item_node.name = 'td' }
170
+ defitems.each do |defitem_node|
171
+ defitem_node.name = 'tr'
172
+ defitem_node.parent = node.at_css('tbody')
173
+ end
174
+ end
175
+
176
+ def format_deflist_table_head(listhead_node)
177
+ listhead_node.at_css('head01').name = 'th'
178
+ listhead_node.at_css('head02').name = 'th'
179
+ listhead_node.name = 'tr'
180
+ listhead_node.wrap('<thead/>')
181
+ end
182
+
183
+ def format_deflist_as_dl(node, labels, items, defitems)
184
+ node.name = 'dl'
185
+ node['class'] = 'deflist'
186
+ labels.each { |label_node| label_node.name = 'dt' }
187
+ items.each { |item_node| item_node.name = 'dd' }
188
+ defitems.each { |defitem_node| defitem_node.swap(defitem_node.children) } # unwrap
189
+ end
190
+
191
+ def format_chronlists(node)
192
+ node.name = 'table'
193
+ node['class'] = 'table chronlist'
194
+ eventgrps = node.css('eventgrp')
195
+ single_events = node.css('chronitem > event')
196
+ multi_events = node.css('eventgrp > event')
197
+ format_chronlist_header(node)
198
+ node.at_css('thead').next = '<tbody/>'
199
+ format_chronlist_caption(node)
200
+ format_chronlist_chronitems(node)
201
+ format_chronlist_dates(node)
202
+ format_chronlist_events(eventgrps, single_events, multi_events)
203
+ end
204
+
205
+ def format_chronlist_header(node)
206
+ node.add_child('<thead><tr><th>Date</th><th>Event</th></tr></thead>')
207
+ table_head = node.at_css('thead')
208
+ node.children.first.add_previous_sibling(table_head)
209
+ listhead_node = node.at_css('listhead')
210
+ return if listhead_node.blank?
211
+
212
+ node.at_css('thead tr th:nth-of-type(1)').content = node.at_css('listhead/head01').content
213
+ node.at_css('thead tr th:nth-of-type(2)').content = node.at_css('listhead/head02').content
214
+ listhead_node.remove
215
+ end
216
+
217
+ def format_chronlist_caption(node)
218
+ head_node = node.at_css('head')
219
+ return if head_node.blank?
220
+
221
+ head_node.name = 'caption'
222
+ head_node['class'] = 'chronlist-head'
223
+ node.children.first.add_previous_sibling(head_node) # make the caption first
224
+ end
225
+
226
+ def format_chronlist_chronitems(node)
227
+ chronitems = node.css('chronitem')
228
+ chronitems.each do |chronitem_node|
229
+ chronitem_node.name = 'tr'
230
+ chronitem_node.parent = node.at_css('tbody')
231
+ end
232
+ end
233
+
234
+ def format_chronlist_dates(node)
235
+ dates = node.css('date')
236
+ dates.each do |date_node|
237
+ date_node.name = 'td'
238
+ date_node['class'] = 'chronlist-item-date'
239
+ end
240
+ end
241
+
242
+ def format_chronlist_events(eventgrps, single_events, multi_events)
243
+ eventgrps.each do |eventgrp_node|
244
+ eventgrp_node.name = 'td'
245
+ eventgrp_node['class'] = 'chronlist-item-event'
246
+ end
247
+ single_events.each do |event_node|
248
+ event_node.name = 'td'
249
+ event_node['class'] = 'chronlist-item-event'
250
+ end
251
+ multi_events.each { |event_node| event_node.name = 'div' }
252
+ end
253
+
254
+ # Format EAD <index> elements
255
+ def format_indexes(node)
256
+ index_head = node.at_css('head')
257
+ index_head&.name = 'h3'
258
+ index_head&.add_class('index-head')
259
+ index_head['id'] = ['index-', index_head.text].join.parameterize if index_head.present?
260
+ format_indexentries(node)
261
+ node.name = 'div'
262
+ end
263
+
264
+ # Grab all of the <indexentry> children as a nodeset, move them into
265
+ # a <table>, wrap each entry in a <tr> & each value in a <td>.
266
+ def format_indexentries(node)
267
+ indexentries = node.css('indexentry')
268
+ return if indexentries.blank?
269
+
270
+ indexentries.first.previous = '<table class="table indexentries" />'
271
+ indexentries.map do |i|
272
+ i.parent = node.at_css('table.table.indexentries')
273
+ i.wrap('<tr/>')
274
+ i.element_children.map { |c| c.wrap('<td/>') }
275
+ # Assuming two columns in an index, create a blank cell for entries
276
+ # with a missing value.
277
+ i.add_child('<td/>') if i.element_children.count == 1
278
+ end
279
+ end
280
+
281
+ # Format EAD <table> elements, converting <tgroup> to HTML <table>.
282
+ # Ignoring <colspec>, @colname, @colwidth complex rendering
283
+ # logic for now.
284
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
285
+ def format_tables(node)
286
+ node.remove_attribute('frame')
287
+ node.name = 'div' if node.css('tgroup').present?
288
+ format_table_head(node)
289
+ tgroups = node.css('tgroup')
290
+ tgroups&.map do |t|
291
+ t.name = 'table'
292
+ t.remove_attribute('cols')
293
+ t.add_class('table')
294
+ t.css('row').map { |r| r.name = 'tr' }
295
+ t.css('thead entry').map { |e| e.name = 'th' }
296
+ t.css('tbody entry').map { |e| e.name = 'td' }
297
+ end
298
+ end
299
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
300
+
301
+ def format_table_head(node)
302
+ table_head = node.at_css('head')
303
+ return if table_head.blank?
304
+
305
+ table_head.name = 'h3'
306
+ table_head.add_class('table-head')
307
+ end
308
+ end
309
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ ##
5
+ # A module to add configuration helpers for certain fields used by Arclight
6
+ module FieldConfigHelpers
7
+ include Arclight::EadFormatHelpers
8
+
9
+ def item_requestable?(document)
10
+ document.requestable?
11
+ end
12
+ Arclight.deprecation.deprecate_methods(self, item_requestable?: 'Call e.g. `document.requestable?` instead')
13
+
14
+ def link_to_name_facet(args)
15
+ options = args[:config]&.separator_options || {}
16
+ values = args[:value] || []
17
+
18
+ values.map do |value|
19
+ link_to(
20
+ value,
21
+ search_action_path(f: { names: [value] })
22
+ )
23
+ end.to_sentence(options).html_safe
24
+ end
25
+ end
26
+ end