arclight 0.2.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 (246) hide show
  1. checksums.yaml +4 -4
  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 +1 -0
  7. data/.rspec +0 -1
  8. data/.rubocop.yml +504 -8
  9. data/.rubocop_todo.yml +62 -199
  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 +36 -34
  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 -10
  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 -4
  33. data/app/assets/stylesheets/arclight/build.scss +4 -0
  34. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +117 -146
  35. data/app/assets/stylesheets/arclight/modules/highlights.scss +2 -1
  36. data/app/assets/stylesheets/arclight/modules/icons.scss +20 -0
  37. data/app/assets/stylesheets/arclight/modules/layout.scss +183 -40
  38. data/app/assets/stylesheets/arclight/modules/mastheads.scss +24 -75
  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 +197 -26
  43. data/app/assets/stylesheets/arclight/modules/show_collection.scss +21 -69
  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 +18 -17
  146. data/config/breadcrumbs.rb +24 -0
  147. data/config/i18n-tasks.yml +11 -9
  148. data/config/importmap.rb +3 -0
  149. data/config/locales/arclight.en.yml +68 -34
  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 +22 -31
  154. data/lib/arclight/exceptions.rb +1 -0
  155. data/lib/arclight/hash_absolute_xpath.rb +13 -8
  156. data/lib/arclight/level_label.rb +46 -0
  157. data/lib/arclight/normalized_date.rb +5 -10
  158. data/lib/arclight/normalized_id.rb +7 -2
  159. data/lib/arclight/normalized_title.rb +3 -0
  160. data/lib/arclight/repository.rb +70 -28
  161. data/lib/arclight/routes/hierarchy.rb +19 -0
  162. data/lib/arclight/routes.rb +8 -0
  163. data/lib/arclight/traject/ead2_component_config.rb +335 -0
  164. data/lib/arclight/traject/ead2_config.rb +172 -331
  165. data/lib/arclight/traject/nokogiri_namespaceless_reader.rb +22 -0
  166. data/lib/arclight/version.rb +1 -1
  167. data/lib/arclight/year_range.rb +13 -4
  168. data/lib/arclight.rb +6 -1
  169. data/lib/generators/arclight/install_generator.rb +100 -10
  170. data/lib/generators/arclight/templates/arclight.scss +6 -3
  171. data/lib/generators/arclight/templates/catalog_controller.rb +237 -179
  172. data/lib/generators/arclight/templates/config/downloads.yml +12 -0
  173. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +61 -0
  174. data/lib/generators/arclight/templates/config/repositories.yml +42 -31
  175. data/lib/generators/arclight/update_generator.rb +1 -1
  176. data/lib/tasks/index.rake +25 -30
  177. data/package.json +15 -9
  178. data/solr/conf/schema.xml +97 -328
  179. data/solr/conf/solrconfig.xml +99 -164
  180. data/tasks/arclight.rake +18 -9
  181. data/template.rb +6 -7
  182. metadata +188 -129
  183. data/.travis.yml +0 -28
  184. data/app/assets/javascripts/arclight/collection_context.js +0 -18
  185. data/app/assets/javascripts/arclight/collection_navigation.js +0 -117
  186. data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
  187. data/app/assets/javascripts/arclight/component_ancestors.js +0 -56
  188. data/app/assets/javascripts/arclight/oembed_viewer.js +0 -46
  189. data/app/assets/javascripts/arclight/search_results.js +0 -15
  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 -21
  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_index_compact_default.html.erb +0 -15
  200. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -5
  201. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  202. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  203. data/app/views/catalog/_collection_contents.html.erb +0 -12
  204. data/app/views/catalog/_collection_count.html.erb +0 -7
  205. data/app/views/catalog/_collection_downloads.html.erb +0 -15
  206. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  207. data/app/views/catalog/_collection_overview.html.erb +0 -7
  208. data/app/views/catalog/_component_contents.html.erb +0 -16
  209. data/app/views/catalog/_component_overview.html.erb +0 -40
  210. data/app/views/catalog/_context_card.html.erb +0 -27
  211. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  212. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  213. data/app/views/catalog/_home.html.erb +0 -1
  214. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -3
  215. data/app/views/catalog/_index_default.html.erb +0 -17
  216. data/app/views/catalog/_index_header.html.erb +0 -7
  217. data/app/views/catalog/_index_header_hierarchy_default.html.erb +0 -42
  218. data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
  219. data/app/views/catalog/_index_hierarchy_default.html.erb +0 -28
  220. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  221. data/app/views/catalog/_results_histogram.html.erb +0 -15
  222. data/app/views/catalog/_search_results.html.erb +0 -31
  223. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -21
  224. data/app/views/catalog/_show_collection.html.erb +0 -48
  225. data/app/views/catalog/_show_component_sidebar.html.erb +0 -12
  226. data/app/views/catalog/_show_default.html.erb +0 -42
  227. data/app/views/catalog/_show_sidebar.html.erb +0 -22
  228. data/app/views/catalog/_show_upper_metadata_collection.html.erb +0 -1
  229. data/app/views/catalog/_show_upper_metadata_default.html.erb +0 -14
  230. data/app/views/layouts/catalog_result.html.erb +0 -7
  231. data/app/views/shared/_context_sidebar.html.erb +0 -8
  232. data/app/views/shared/_header_navbar.html.erb +0 -65
  233. data/lib/arclight/custom_component.rb +0 -99
  234. data/lib/arclight/custom_document.rb +0 -93
  235. data/lib/arclight/indexer.rb +0 -9
  236. data/lib/arclight/shared_indexing_behavior.rb +0 -97
  237. data/lib/arclight/shared_terminology_behavior.rb +0 -65
  238. data/lib/arclight/solr_ead_indexer_ext.rb +0 -155
  239. data/lib/arclight/viewer.rb +0 -45
  240. data/lib/arclight/viewers/oembed.rb +0 -56
  241. data/lib/generators/arclight/templates/arclight.js +0 -2
  242. data/solr/conf/scripts.conf +0 -24
  243. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  244. data/vendor/assets/javascripts/stickyfill.js +0 -480
  245. /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
  246. /data/{app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb → config/repositories.yml} +0 -0
@@ -53,16 +53,17 @@ data:
53
53
  # Find translate calls
54
54
  search:
55
55
  ## Paths or `File.find` patterns to search in:
56
- # paths:
57
- # - app/
56
+ paths:
57
+ - app/
58
+ - config/breadcrumbs.rb
58
59
 
59
60
  ## Root directories for relative keys resolution.
60
- # relative_roots:
61
- # - app/controllers
62
- # - app/helpers
63
- # - app/mailers
64
- # - app/presenters
65
- # - app/views
61
+ relative_roots:
62
+ - app/components
63
+ - app/controllers
64
+ - app/helpers
65
+ - app/presenters
66
+ - app/views
66
67
 
67
68
  ## Files or `File.fnmatch` patterns to exclude from search. Some files are always excluded regardless of this setting:
68
69
  ## %w(*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less *.yml *.json)
@@ -96,7 +97,8 @@ ignore_missing:
96
97
  - '{blacklight}.*'
97
98
 
98
99
  ## Consider these keys used:
99
- # ignore_unused:
100
+ ignore_unused:
101
+ - '{blacklight}.*'
100
102
  # - 'activerecord.attributes.*'
101
103
  # - '{devise,kaminari,will_paginate}.*'
102
104
  # - 'simple_form.{yes,no}'
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ pin_all_from File.expand_path('../app/assets/javascript', __dir__)
@@ -1,14 +1,18 @@
1
1
  ---
2
2
  en:
3
3
  arclight:
4
- breadcrumb_separator: " » "
5
- date_range_histogram:
6
- hide: Hide date distribution
7
- show: Show date distribution
4
+ breadcrumbs:
5
+ aria_label: breadcrumb
6
+ collection_info_component:
7
+ collection_id: Collection ID
8
+ last_indexed: Last indexed
9
+ more_info: More info
10
+ online_items: Items available online
11
+ total_components: Total components
8
12
  hierarchy:
9
- scope_and_contents: Scope and Contents
10
13
  view_all: View
11
- masthead_heading: Archival Collections at Institution
14
+ masthead_heading_html: Archival Collections at Institution
15
+ repositories: Repositories
12
16
  request:
13
17
  container: Request
14
18
  routes:
@@ -16,51 +20,81 @@ en:
16
20
  home: Home
17
21
  repositories: Repositories
18
22
  search_results: Search results
23
+ search:
24
+ collections_header: Collections
25
+ repository_header: 'Collections : [%{repository}]'
26
+ show_breadcrumb_label: Repository
19
27
  truncation:
20
- view_less: view less
21
- view_more: view more
28
+ view_less: view less
29
+ view_more: view more
22
30
  views:
23
31
  index:
24
- collection_search:
25
- count: collection
26
- number_of_children:
27
- one: 1 child
28
- other: "%{count} children"
29
- zero: No children
30
- online_content_indicator: online content
32
+ all_group_results: view all %{count}
33
+ all_results: All results
34
+ group_by_collection: Grouped by collection
35
+ group_results: Group results
36
+ group_results_count:
37
+ one: 1 result
38
+ other: "%{count} results"
39
+ zero: 0 results
40
+ number_of_components:
41
+ one: component
42
+ other: components
43
+ top_group_results:
44
+ one: Top %{count} result
45
+ other: Top %{count} results
31
46
  repositories:
32
47
  number_of_collections:
33
48
  one: 1 collection
34
49
  other: "%{count} collections"
35
50
  zero: No collections
51
+ show: "%{name} - Arclight"
52
+ title: Repositories - Arclight
36
53
  view_all_collections: View all of our collections
37
54
  view_more: View more
38
55
  show:
39
56
  collection_id: 'Collection ID: %{id}'
40
- context_sidebar:
41
- cite_field: How to cite this collection
42
- component_terms_field: Terms & Conditions
43
- in_person_field: In person
44
- terms_field: Terms & Conditions
57
+ contents: Contents
58
+ context: Collection context
59
+ context_nav:
60
+ title: Collection overview
45
61
  download:
46
62
  default: Download
47
- ead: Collection EAD (%{size})
48
- pdf: Collection PDF (%{size})
49
- navigation_sidebar:
50
- title: Navigation overview
51
- no_contents: No content inventory
52
- no_online_content: No online content
53
- online_content: Online content
63
+ multiple:
64
+ ead: EAD
65
+ pdf: Finding aid
66
+ single:
67
+ ead: Download EAD
68
+ pdf: Download finding aid
69
+ embedded_content: Online content
70
+ expand: Expand
71
+ has_content: Collection contents
72
+ online_content:
73
+ description: Some materials from this collection are available online.
74
+ link_text: Show only online content
75
+ title: Online content
54
76
  our_collections: Our Collections
55
- overview: Overview
56
77
  sections:
57
- access_field: Access and Use
58
- admin_info_field: Administrative Information
78
+ access_field: Access and use
59
79
  background_field: Background
60
- collection_context_field: Collection Context
80
+ collection_context_field: Collection context
61
81
  component_field: About this %{level}
62
- component_indexed_terms_field: Indexed Terms
63
- indexed_terms_field: Indexed Terms
82
+ component_indexed_terms_field: Indexed terms
83
+ indexed_terms_field: Indexed terms
64
84
  related_field: Related
65
- scope_and_arrangement_field: Scope and Arrangement
85
+ scope_and_arrangement_field: Scope and arrangement
66
86
  summary_field: Summary
87
+ toggle_sidebar: Navigate the collection
88
+ within_collection_dropdown:
89
+ all_collections: all collections
90
+ label_html: Search<span class="sr-only visually-hidden"> within</span>
91
+ this_collection: this collection
92
+ blacklight:
93
+ entry_name:
94
+ grouped:
95
+ _root_: collections
96
+ search:
97
+ pagination_info:
98
+ pages:
99
+ one: "<strong>%{start_num}</strong> - <strong>%{end_num}</strong> of <strong>%{total_num} %{entry_name}</strong>"
100
+ other: "<strong>%{start_num}</strong> - <strong>%{end_num}</strong> of <strong>%{total_num} %{entry_name}</strong>"
data/config/routes.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Arclight::Engine.routes.draw do
4
- get 'collections' => 'catalog#index', defaults: { f: { level_sim: ['Collection'] } }, as: :collections
4
+ get 'collections' => 'catalog#index', defaults: { f: { level: ['Collection'] } }, as: :collections
5
5
  resources :repositories, only: %i[index show], controller: 'arclight/repositories'
6
6
  end
@@ -0,0 +1,16 @@
1
+ version: "3.7"
2
+
3
+ services:
4
+ solr:
5
+ image: solr:latest
6
+ volumes:
7
+ - $PWD/solr/conf:/opt/solr/conf
8
+ ports:
9
+ - 8983:8983
10
+ entrypoint:
11
+ - docker-entrypoint.sh
12
+ - solr-precreate
13
+ - blacklight-core
14
+ - /opt/solr/conf
15
+ - "-Xms256m"
16
+ - "-Xmx512m"
@@ -5,8 +5,9 @@ module Arclight
5
5
  # Plain ruby class to model serializing/deserializing digital object data
6
6
  class DigitalObject
7
7
  attr_reader :label, :href
8
+
8
9
  def initialize(label:, href:)
9
- @label = label.present? ? label : href
10
+ @label = label.presence || href
10
11
  @href = href
11
12
  end
12
13
 
@@ -1,56 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'blacklight'
4
- require 'solr_ead'
5
4
  require 'traject'
5
+ require 'active_model'
6
6
  require 'arclight/exceptions'
7
7
  require 'arclight/normalized_date'
8
8
  require 'arclight/normalized_id'
9
9
  require 'arclight/normalized_title'
10
10
  require 'arclight/digital_object'
11
- require 'arclight/shared_indexing_behavior'
12
- require 'arclight/shared_terminology_behavior'
13
- require 'arclight/custom_document'
14
- require 'arclight/custom_component'
15
- require 'arclight/solr_ead_indexer_ext'
16
- require 'arclight/indexer'
17
- require 'arclight/viewer'
11
+ require 'gretel'
18
12
 
19
13
  module Arclight
20
14
  ##
21
15
  # This is the defining class for the Arclight Rails Engine
22
16
  class Engine < ::Rails::Engine
23
- config.viewer_class = Arclight::Viewers::OEmbed
24
17
  config.oembed_resource_exclude_patterns = [/\.pdf$/, /\.ppt$/]
25
18
 
26
- Arclight::Engine.config.catalog_controller_field_accessors = %i[
27
- summary_field
28
- access_field
29
- background_field
30
- related_field
31
- admin_info_field
32
- terms_field
33
- cite_field
34
- indexed_terms_field
35
- in_person_field
36
- component_field
37
- online_field
38
- component_terms_field
39
- component_indexed_terms_field
40
- ]
19
+ Arclight::Engine.config.catalog_controller_group_query_params = {
20
+ group: true,
21
+ 'group.field': '_root_',
22
+ 'group.ngroups': true,
23
+ 'group.limit': 3,
24
+ fl: '*,collection:[subquery]',
25
+ 'collection.q': '{!terms f=id v=$row._root_}',
26
+ 'collection.defType': 'lucene',
27
+ 'collection.fl': '*',
28
+ 'collection.rows': 1
29
+ }
41
30
 
42
- initializer 'arclight.fields' do
43
- Arclight::Engine.config.catalog_controller_field_accessors.each do |field|
44
- Blacklight::Configuration.define_field_access field
31
+ initializer 'arclight.helpers' do
32
+ config.after_initialize do
33
+ ActiveSupport.on_load(:action_view) { include ArclightHelper }
45
34
  end
46
35
  end
47
36
 
48
- initializer 'arclight.helpers' do
49
- ActionView::Base.send :include, ArclightHelper
37
+ initializer 'arclight.assets', before: 'assets' do |app|
38
+ app.config.assets.precompile << 'arclight/arclight.js'
39
+ app.config.assets.precompile << 'arclight/oembed_controller.js'
40
+ app.config.assets.precompile << 'arclight/truncate_controller.js'
50
41
  end
51
42
 
52
- initializer 'arclight.views' do
53
- Blacklight::Configuration.default_values[:view].hierarchy
43
+ initializer 'arclight.importmap', before: 'importmap' do |app|
44
+ app.config.importmap.paths << Engine.root.join('config/importmap.rb') if app.config.respond_to?(:importmap)
54
45
  end
55
46
  end
56
47
  end
@@ -8,6 +8,7 @@ module Arclight
8
8
  'id must be present for all documents and components'
9
9
  end
10
10
  end
11
+
11
12
  # Unittitle or unitdate must be present on all documents and components
12
13
  class TitleNotFound < StandardError
13
14
  def message
@@ -17,24 +17,20 @@ module Arclight
17
17
  end
18
18
  end
19
19
 
20
- COMPONENT_NODE_NAME_REGEX = /^c\d{,2}$/.freeze
20
+ COMPONENT_NODE_NAME_REGEX = /^c\d{,2}$/
21
21
  attr_reader :node
22
+
22
23
  def initialize(node)
23
24
  @node = node
24
25
  end
25
26
 
26
27
  def to_hexdigest
27
- self.class.hash_algorithm.hexdigest(absolute_xpath)
28
+ self.class.hash_algorithm.hexdigest(absolute_xpath).prepend('al_')
28
29
  end
29
30
 
30
31
  def absolute_xpath
31
32
  ancestor_tree = node.ancestors.map do |ancestor|
32
- if ancestor.name =~ COMPONENT_NODE_NAME_REGEX
33
- index = component_siblings_for_node(ancestor).index(ancestor)
34
- "#{ancestor.name}#{index}"
35
- else
36
- ancestor.name
37
- end
33
+ ancestor_name_and_index(ancestor)
38
34
  end
39
35
 
40
36
  "#{[ancestor_tree.reverse, node.name].flatten.join('/')}#{current_index}"
@@ -53,5 +49,14 @@ module Arclight
53
49
  def siblings
54
50
  @siblings ||= component_siblings_for_node(node)
55
51
  end
52
+
53
+ def ancestor_name_and_index(ancestor)
54
+ if ancestor.name =~ COMPONENT_NODE_NAME_REGEX
55
+ index = component_siblings_for_node(ancestor).index(ancestor)
56
+ "#{ancestor.name}#{index}"
57
+ else
58
+ ancestor.name
59
+ end
60
+ end
56
61
  end
57
62
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ ##
5
+ # A utility class to return a human-readable label for an EAD @level code.
6
+ # Can use the value from @otherlevel if provided.
7
+ # Examples from @level: recordgrp = "Record Group"
8
+ # collection = "Collection"
9
+ # subseries = "Subseries"
10
+ # otherlevel = (text provided in @otherlevel)
11
+ class LevelLabel
12
+ # @param [String] `level` from the collection or component @level
13
+ # @param [String] `other_level` from the collection or component @otherlevel
14
+ def initialize(level, other_level = nil)
15
+ @level = level
16
+ @other_level = other_level if other_level.present?
17
+ end
18
+
19
+ # @return [String] the human-readable label
20
+ def to_s
21
+ human_readable_level
22
+ end
23
+
24
+ private
25
+
26
+ attr_reader :level, :other_level
27
+
28
+ CUSTOM_LEVEL_LABELS = {
29
+ recordgrp: 'Record Group',
30
+ subgrp: 'Subgroup'
31
+ }.freeze
32
+
33
+ def human_readable_level
34
+ if level == 'otherlevel'
35
+ alternative_level
36
+ elsif level.present?
37
+ CUSTOM_LEVEL_LABELS.fetch(level.to_sym, level.capitalize).to_s
38
+ end
39
+ end
40
+
41
+ def alternative_level
42
+ alternative_level = other_level if other_level
43
+ alternative_level.present? ? alternative_level.capitalize : 'Other'
44
+ end
45
+ end
46
+ end
@@ -39,16 +39,11 @@ module Arclight
39
39
 
40
40
  # @see http://www2.archivists.org/standards/DACS/part_I/chapter_2/4_date for rules
41
41
  def normalize
42
- if inclusive.present?
43
- result = inclusive.to_s
44
- result << ", bulk #{bulk}" if bulk.present?
45
- elsif other.present?
46
- result = other.to_s
47
- else
48
- result = nil
49
- end
50
- return if result.blank?
51
- result.strip
42
+ result = []
43
+ result << inclusive if inclusive.present?
44
+ result << other if other.present?
45
+ result << "bulk #{bulk}" if bulk.present?
46
+ result.compact.map(&:strip).join(', ').presence
52
47
  end
53
48
  end
54
49
  end
@@ -1,11 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'arclight/exceptions'
4
+
3
5
  module Arclight
4
6
  ##
5
7
  # A simple utility class to normalize identifiers
6
- # to be used around the application for linking
7
8
  class NormalizedId
8
- def initialize(id)
9
+ # Accepts unused kwargs from the ead2_config.rb id to_field directive
10
+ # (:title and :repository) so that applications can provide a custom
11
+ # id_normalizer class to traject to form the collection id from these attributes.
12
+ def initialize(id, **_kwargs)
9
13
  @id = id
10
14
  end
11
15
 
@@ -19,6 +23,7 @@ module Arclight
19
23
 
20
24
  def normalize
21
25
  raise Arclight::Exceptions::IDNotFound if id.blank?
26
+
22
27
  id.strip.tr('.', '-')
23
28
  end
24
29
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'arclight/exceptions'
4
+
3
5
  module Arclight
4
6
  ##
5
7
  # A utility class to normalize titles, typically by joining
@@ -24,6 +26,7 @@ module Arclight
24
26
  def normalize
25
27
  result = [title, date].compact.join(', ')
26
28
  raise Arclight::Exceptions::TitleNotFound if result.blank?
29
+
27
30
  result
28
31
  end
29
32
  end
@@ -1,29 +1,69 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_model'
4
+ require 'active_support'
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+
3
7
  module Arclight
4
- #
5
- # Static information about a given repository identified by a unique `slug`
6
- #
8
+ # Static information about a given repository identified by a unique `slug`.
9
+ # These data are loaded from config/repositories.yml
7
10
  class Repository
8
- include ActiveModel::Conversion # for to_partial_path
11
+ include ActiveModel::Model
12
+ DEFAULTS = {
13
+ request_types: {},
14
+ contact_html: '',
15
+ location_html: '',
16
+ visit_note: nil
17
+ }.freeze
9
18
 
10
- attr_accessor :slug, :collection_count
19
+ def initialize(attributes = {})
20
+ @attributes = DEFAULTS.merge(attributes).with_indifferent_access
21
+ end
11
22
 
12
- # @param [String] `slug` the unique identifier for the repository
13
- # @param [Hash] `data`
14
- def initialize(slug, data = {})
15
- @slug = slug
16
- data.each do |field, value|
17
- self.class.attr_accessor field.to_sym
18
- send("#{field}=", value) if value.present?
19
- end
23
+ attr_reader :attributes
24
+ attr_accessor :collection_count
25
+
26
+ def method_missing(field, *args, &block)
27
+ return attributes[field] if attributes.include?(field)
28
+
29
+ super
30
+ end
31
+
32
+ def respond_to_missing?(field, *args)
33
+ attributes.include?(field) || super
34
+ end
35
+
36
+ # rubocop:disable Rails/OutputSafety
37
+ def contact
38
+ contact_html.html_safe
39
+ end
40
+
41
+ def location
42
+ location_html.html_safe
43
+ end
44
+ # rubocop:enable Rails/OutputSafety
45
+
46
+ def request_config_present?
47
+ request_configs = request_types.values || []
48
+ request_configs.dig(0, 'request_url').present? &&
49
+ request_configs.dig(0, 'request_mappings').present?
50
+ end
51
+
52
+ def request_config_present_for_type?(type)
53
+ config = request_config_for_type(type)
54
+
55
+ config['request_url'].present? &&
56
+ config['request_mappings'].present?
20
57
  end
21
58
 
22
- # @return [String] handles the formatting of "city, state zip, country"
23
- def city_state_zip_country
24
- state_zip = state
25
- state_zip += " #{zip}" if zip
26
- [city, state_zip, country].compact.join(', ')
59
+ def request_config_for_type(type)
60
+ request_types.fetch(type, {})
61
+ end
62
+
63
+ def available_request_types
64
+ return [] unless request_types.present?
65
+
66
+ request_types.keys
27
67
  end
28
68
 
29
69
  # Load repository information from a YAML file
@@ -32,9 +72,9 @@ module Arclight
32
72
  # @return [Hash<Slug,Repository>]
33
73
  def self.from_yaml(file)
34
74
  repos = {}
35
- data = YAML.safe_load(File.read(file))
36
- data.keys.each do |slug|
37
- repos[slug] = new(slug, data[slug])
75
+ data = YAML.safe_load_file(file)
76
+ data.each_key do |slug|
77
+ repos[slug] = new(data[slug].merge(slug: slug))
38
78
  end
39
79
  repos
40
80
  end
@@ -42,19 +82,20 @@ module Arclight
42
82
  # Mimics ActiveRecord's `all` behavior
43
83
  #
44
84
  # @return [Array<Repository>]
45
- def self.all
46
- from_yaml(ENV['REPOSITORY_FILE'] || 'config/repositories.yml').values
85
+ def self.all(yaml_file = nil)
86
+ yaml_file = ENV['REPOSITORY_FILE'] || 'config/repositories.yml' if yaml_file.nil?
87
+ from_yaml(yaml_file).values
47
88
  end
48
89
 
49
90
  # Mimics ActiveRecord dynamic `find_by` behavior for the slug or name
50
91
  #
51
92
  # @param [String] `slug` or `name`
52
93
  # @return [Repository]
53
- def self.find_by(slug: nil, name: nil)
94
+ def self.find_by(slug: nil, name: nil, yaml_file: nil)
54
95
  if slug
55
- all.find { |repo| repo.slug == slug }
96
+ all(yaml_file).find { |repo| repo.slug == slug }
56
97
  elsif name
57
- all.find { |repo| repo.name == name }
98
+ all(yaml_file).find { |repo| repo.name == name }
58
99
  else
59
100
  raise ArgumentError, 'Requires either slug or name parameters to find_by'
60
101
  end
@@ -65,9 +106,10 @@ module Arclight
65
106
  # @param [String] `slug` or `name` -- same as `find_by`
66
107
  # @return [Repository]
67
108
  # @raise [ActiveRecord::RecordNotFound] if cannot find repository
68
- def self.find_by!(*args)
69
- repository = find_by(*args)
109
+ def self.find_by!(**kwargs)
110
+ repository = find_by(**kwargs)
70
111
  raise ActiveRecord::RecordNotFound if repository.blank?
112
+
71
113
  repository
72
114
  end
73
115
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ module Routes
5
+ # Inject a hierarchy route for displaying the
6
+ # components in the collection context
7
+ class Hierarchy
8
+ def initialize(defaults = {})
9
+ @defaults = defaults
10
+ end
11
+
12
+ def call(mapper, _options = {})
13
+ mapper.member do
14
+ mapper.get 'hierarchy'
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ # Custom routes for Arclight
5
+ module Routes
6
+ require 'arclight/routes/hierarchy'
7
+ end
8
+ end