arclight 0.3.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 (240) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc +11 -4
  3. data/.github/workflows/ruby.yml +51 -0
  4. data/.gitignore +1 -0
  5. data/.rspec +0 -1
  6. data/.rubocop.yml +498 -21
  7. data/.rubocop_todo.yml +69 -86
  8. data/.solr_wrapper +2 -1
  9. data/CONTRIBUTING.md +5 -5
  10. data/CONTRIBUTORS.md +1 -1
  11. data/Gemfile +15 -10
  12. data/README.md +22 -17
  13. data/app/assets/images/blacklight/bookmark.svg +1 -1
  14. data/app/assets/images/blacklight/collection.svg +1 -1
  15. data/app/assets/images/blacklight/compact.svg +1 -1
  16. data/app/assets/images/blacklight/container.svg +1 -1
  17. data/app/assets/images/blacklight/ead.svg +1 -1
  18. data/app/assets/images/blacklight/file.svg +1 -1
  19. data/app/assets/images/blacklight/folder.svg +1 -1
  20. data/app/assets/images/blacklight/list.svg +1 -1
  21. data/app/assets/images/blacklight/online.svg +1 -1
  22. data/app/assets/images/blacklight/pdf.svg +1 -1
  23. data/app/assets/images/blacklight/repository.svg +1 -1
  24. data/app/assets/javascripts/arclight/arclight.js +4 -8
  25. data/app/assets/javascripts/arclight/oembed_controller.js +58 -0
  26. data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
  27. data/app/assets/stylesheets/arclight/application.scss +3 -5
  28. data/app/assets/stylesheets/arclight/build.scss +4 -0
  29. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +108 -130
  30. data/app/assets/stylesheets/arclight/modules/icons.scss +20 -0
  31. data/app/assets/stylesheets/arclight/modules/layout.scss +129 -100
  32. data/app/assets/stylesheets/arclight/modules/mastheads.scss +23 -96
  33. data/app/assets/stylesheets/arclight/modules/repositories.scss +2 -2
  34. data/app/assets/stylesheets/arclight/modules/repository_card.scss +4 -48
  35. data/app/assets/stylesheets/arclight/modules/search_form.scss +9 -0
  36. data/app/assets/stylesheets/arclight/modules/search_results.scss +95 -45
  37. data/app/assets/stylesheets/arclight/modules/show_collection.scss +5 -32
  38. data/app/assets/stylesheets/arclight/modules/truncator.scss +58 -0
  39. data/app/assets/stylesheets/arclight/variables.scss +7 -4
  40. data/app/components/arclight/access_component.html.erb +14 -0
  41. data/app/components/arclight/access_component.rb +25 -0
  42. data/app/components/arclight/bookmark_component.html.erb +25 -0
  43. data/app/components/arclight/bookmark_component.rb +9 -0
  44. data/app/components/arclight/breadcrumb_component.rb +50 -0
  45. data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
  46. data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
  47. data/app/components/arclight/collection_context_component.html.erb +12 -0
  48. data/app/components/arclight/collection_context_component.rb +27 -0
  49. data/app/components/arclight/collection_info_component.html.erb +28 -0
  50. data/app/components/arclight/collection_info_component.rb +26 -0
  51. data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
  52. data/app/components/arclight/collection_sidebar_component.rb +39 -0
  53. data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
  54. data/app/components/arclight/constraints_component.rb +17 -0
  55. data/app/components/arclight/document_collection_context_component.html.erb +29 -0
  56. data/app/components/arclight/document_collection_context_component.rb +28 -0
  57. data/app/components/arclight/document_collection_hierarchy_component.html.erb +50 -0
  58. data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
  59. data/app/components/arclight/document_component.html.erb +39 -0
  60. data/app/components/arclight/document_component.rb +49 -0
  61. data/app/components/arclight/document_components_hierarchy_component.html.erb +20 -0
  62. data/app/components/arclight/document_components_hierarchy_component.rb +34 -0
  63. data/app/components/arclight/document_download_component.html.erb +24 -0
  64. data/app/components/arclight/document_download_component.rb +71 -0
  65. data/app/components/arclight/embed_component.html.erb +10 -0
  66. data/app/components/arclight/embed_component.rb +43 -0
  67. data/app/components/arclight/expand_hierarchy_button_component.html.erb +5 -0
  68. data/app/components/arclight/expand_hierarchy_button_component.rb +16 -0
  69. data/app/components/arclight/group_component.html.erb +34 -0
  70. data/app/components/arclight/group_component.rb +23 -0
  71. data/app/components/arclight/header_component.html.erb +5 -0
  72. data/app/components/arclight/header_component.rb +10 -0
  73. data/app/components/arclight/index_metadata_field_component.html.erb +16 -0
  74. data/app/components/arclight/index_metadata_field_component.rb +20 -0
  75. data/app/components/arclight/masthead_component.html.erb +17 -0
  76. data/app/components/arclight/masthead_component.rb +10 -0
  77. data/app/components/arclight/metadata_section_component.html.erb +13 -0
  78. data/app/components/arclight/metadata_section_component.rb +22 -0
  79. data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
  80. data/app/components/arclight/oembed_viewer_component.rb +16 -0
  81. data/app/components/arclight/online_content_filter_component.html.erb +15 -0
  82. data/app/components/arclight/online_content_filter_component.rb +17 -0
  83. data/app/components/arclight/online_status_indicator_component.rb +19 -0
  84. data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
  85. data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
  86. data/app/components/arclight/repository_location_component.html.erb +20 -0
  87. data/app/components/arclight/repository_location_component.rb +10 -0
  88. data/app/components/arclight/search_bar_component.html.erb +27 -0
  89. data/app/components/arclight/search_bar_component.rb +32 -0
  90. data/app/components/arclight/search_result_breadcrumbs_component.html.erb +6 -0
  91. data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
  92. data/app/components/arclight/search_result_component.html.erb +20 -0
  93. data/app/components/arclight/search_result_component.rb +18 -0
  94. data/app/components/arclight/search_result_title_component.html.erb +15 -0
  95. data/app/components/arclight/search_result_title_component.rb +15 -0
  96. data/app/components/arclight/sidebar_component.html.erb +9 -0
  97. data/app/components/arclight/sidebar_component.rb +19 -0
  98. data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
  99. data/app/components/blacklight/icons/bookmark_component.rb +12 -0
  100. data/app/components/blacklight/icons/collection_component.rb +14 -0
  101. data/app/components/blacklight/icons/compact_component.rb +12 -0
  102. data/app/components/blacklight/icons/container_component.rb +14 -0
  103. data/app/components/blacklight/icons/ead_component.rb +12 -0
  104. data/app/components/blacklight/icons/file_component.rb +14 -0
  105. data/app/components/blacklight/icons/folder_component.rb +12 -0
  106. data/app/components/blacklight/icons/online_component.rb +15 -0
  107. data/app/components/blacklight/icons/pdf_component.rb +12 -0
  108. data/app/components/blacklight/icons/repository_component.rb +12 -0
  109. data/app/controllers/arclight/repositories_controller.rb +4 -4
  110. data/app/{controllers/concerns → helpers}/arclight/ead_format_helpers.rb +91 -7
  111. data/app/helpers/arclight/field_config_helpers.rb +26 -0
  112. data/app/helpers/arclight_helper.rb +24 -251
  113. data/app/models/arclight/document_downloads.rb +12 -15
  114. data/app/models/arclight/parent.rb +6 -8
  115. data/app/models/arclight/parents.rb +7 -4
  116. data/app/models/arclight/requests/aeon_external_request.rb +1 -1
  117. data/app/models/arclight/requests/aeon_web_ead.rb +8 -3
  118. data/app/models/arclight/requests/google_form.rb +8 -3
  119. data/app/models/concerns/arclight/catalog.rb +25 -15
  120. data/app/models/concerns/arclight/search_behavior.rb +12 -26
  121. data/app/models/concerns/arclight/solr_document.rb +80 -73
  122. data/app/presenters/arclight/show_presenter.rb +34 -7
  123. data/app/views/arclight/_requests.html.erb +2 -2
  124. data/app/views/arclight/repositories/_repository.html.erb +21 -40
  125. data/app/views/arclight/repositories/index.html.erb +3 -1
  126. data/app/views/arclight/repositories/show.html.erb +4 -6
  127. data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +4 -5
  128. data/app/views/arclight/requests/_aeon_web_ead.html.erb +3 -4
  129. data/app/views/arclight/requests/_google_form.html.erb +4 -6
  130. data/app/views/catalog/_document_list.html.erb +8 -0
  131. data/app/views/catalog/_group.html.erb +2 -19
  132. data/app/views/catalog/_group_toggle.html.erb +1 -1
  133. data/app/views/catalog/_search_results_header.html.erb +3 -0
  134. data/app/views/catalog/hierarchy.html.erb +19 -0
  135. data/app/views/catalog/index.html.erb +16 -7
  136. data/app/views/shared/_breadcrumbs.html.erb +2 -14
  137. data/app/views/shared/_main_menu_links.html.erb +1 -1
  138. data/arclight.gemspec +17 -15
  139. data/config/breadcrumbs.rb +24 -0
  140. data/config/i18n-tasks.yml +9 -8
  141. data/config/importmap.rb +3 -0
  142. data/config/locales/arclight.en.yml +31 -30
  143. data/config/routes.rb +1 -1
  144. data/docker-compose.yml +16 -0
  145. data/lib/arclight/digital_object.rb +2 -1
  146. data/lib/arclight/engine.rb +18 -37
  147. data/lib/arclight/exceptions.rb +1 -0
  148. data/lib/arclight/hash_absolute_xpath.rb +2 -1
  149. data/lib/arclight/normalized_date.rb +5 -10
  150. data/lib/arclight/normalized_id.rb +6 -2
  151. data/lib/arclight/normalized_title.rb +2 -0
  152. data/lib/arclight/repository.rb +46 -57
  153. data/lib/arclight/routes/hierarchy.rb +19 -0
  154. data/lib/arclight/routes.rb +8 -0
  155. data/lib/arclight/traject/ead2_component_config.rb +335 -0
  156. data/lib/arclight/traject/ead2_config.rb +120 -298
  157. data/lib/arclight/version.rb +1 -1
  158. data/lib/arclight/year_range.rb +4 -3
  159. data/lib/arclight.rb +6 -1
  160. data/lib/generators/arclight/install_generator.rb +97 -11
  161. data/lib/generators/arclight/templates/arclight.scss +6 -3
  162. data/lib/generators/arclight/templates/catalog_controller.rb +193 -163
  163. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +61 -0
  164. data/lib/generators/arclight/templates/config/repositories.yml +22 -29
  165. data/lib/tasks/index.rake +14 -17
  166. data/package.json +13 -14
  167. data/solr/conf/schema.xml +49 -39
  168. data/solr/conf/solrconfig.xml +78 -58
  169. data/tasks/arclight.rake +17 -9
  170. data/template.rb +6 -7
  171. metadata +159 -127
  172. data/.babelrc +0 -3
  173. data/.travis.yml +0 -28
  174. data/app/assets/javascripts/arclight/collection_navigation.js +0 -100
  175. data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
  176. data/app/assets/javascripts/arclight/context_navigation.js +0 -374
  177. data/app/assets/javascripts/arclight/oembed_viewer.js +0 -46
  178. data/app/assets/javascripts/arclight/truncator.js.erb +0 -29
  179. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -26
  180. data/app/assets/stylesheets/arclight/modules/context_navigation.scss +0 -75
  181. data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -102
  182. data/app/factories/blacklight_field_configuration_factory.rb +0 -30
  183. data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
  184. data/app/views/arclight/repositories/_repository_contact.html.erb +0 -9
  185. data/app/views/arclight/viewers/_oembed.html.erb +0 -8
  186. data/app/views/catalog/_access_contents.html.erb +0 -15
  187. data/app/views/catalog/_arclight_abstract_or_scope.html.erb +0 -5
  188. data/app/views/catalog/_arclight_bookmark_control.html.erb +0 -38
  189. data/app/views/catalog/_arclight_document_header_icon.html.erb +0 -1
  190. data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
  191. data/app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb +0 -0
  192. data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
  193. data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -22
  194. data/app/views/catalog/_arclight_index_default.html.erb +0 -45
  195. data/app/views/catalog/_arclight_index_group_document_compact_default.html.erb +0 -19
  196. data/app/views/catalog/_arclight_index_group_document_default.html.erb +0 -18
  197. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -3
  198. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  199. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  200. data/app/views/catalog/_collection_contents.html.erb +0 -4
  201. data/app/views/catalog/_collection_context.html.erb +0 -15
  202. data/app/views/catalog/_collection_context_nav.html.erb +0 -12
  203. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  204. data/app/views/catalog/_component_context.html.erb +0 -5
  205. data/app/views/catalog/_containers.html.erb +0 -3
  206. data/app/views/catalog/_context_card.html.erb +0 -27
  207. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  208. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  209. data/app/views/catalog/_document_downloads.html.erb +0 -14
  210. data/app/views/catalog/_group_header_compact_default.html.erb +0 -15
  211. data/app/views/catalog/_group_header_default.html.erb +0 -20
  212. data/app/views/catalog/_home.html.erb +0 -1
  213. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -6
  214. data/app/views/catalog/_index_collection_context_default.html.erb +0 -53
  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_online_contents_default.html.erb +0 -1
  218. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  219. data/app/views/catalog/_online_content_label.html.erb +0 -5
  220. data/app/views/catalog/_search_form.html.erb +0 -34
  221. data/app/views/catalog/_search_results.html.erb +0 -28
  222. data/app/views/catalog/_show_actions_box_default.html.erb +0 -27
  223. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -6
  224. data/app/views/catalog/_show_collection.html.erb +0 -66
  225. data/app/views/catalog/_show_default.html.erb +0 -70
  226. data/app/views/catalog/_show_upper_metadata_collection.html.erb +0 -1
  227. data/app/views/catalog/_show_upper_metadata_default.html.erb +0 -14
  228. data/app/views/catalog/_sort_and_per_page.html.erb +0 -8
  229. data/app/views/catalog/_within_collection_dropdown.html.erb +0 -26
  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 -61
  233. data/app/views/shared/_show_breadcrumbs.html.erb +0 -27
  234. data/lib/arclight/viewer.rb +0 -45
  235. data/lib/arclight/viewers/oembed.rb +0 -57
  236. data/lib/generators/arclight/templates/arclight.js +0 -2
  237. data/solr/conf/scripts.conf +0 -24
  238. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  239. data/vendor/assets/javascripts/stickyfill.js +0 -480
  240. /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Root crumb
4
+ crumb :root do
5
+ link t('arclight.routes.home'), root_path
6
+ end
7
+
8
+ crumb :repositories do
9
+ link t('arclight.routes.repositories'), arclight_engine.repositories_path
10
+ end
11
+
12
+ crumb :repository do |repository|
13
+ link repository.name, arclight_engine.repository_path(repository.slug)
14
+
15
+ parent :repositories
16
+ end
17
+
18
+ crumb :search_results do |search_state|
19
+ if search_state.filter('level').values == ['Collection']
20
+ link t('arclight.routes.collections')
21
+ else
22
+ link t('arclight.routes.search_results')
23
+ end
24
+ end
@@ -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)
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ pin_all_from File.expand_path('../app/assets/javascript', __dir__)
@@ -1,14 +1,17 @@
1
1
  ---
2
2
  en:
3
3
  arclight:
4
- breadcrumb_separator: " » "
5
4
  breadcrumbs:
6
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
7
12
  hierarchy:
8
- scope_and_contents: Scope and Contents
9
- scope_note: 'Scope note: '
10
13
  view_all: View
11
- masthead_heading: Archival Collections at Institution
14
+ masthead_heading_html: Archival Collections at Institution
12
15
  repositories: Repositories
13
16
  request:
14
17
  container: Request
@@ -22,11 +25,9 @@ en:
22
25
  repository_header: 'Collections : [%{repository}]'
23
26
  show_breadcrumb_label: Repository
24
27
  truncation:
25
- view_less: view less
26
- view_more: view more
28
+ view_less: view less
29
+ view_more: view more
27
30
  views:
28
- home:
29
- title: Archival Collections at Institution - Arclight
30
31
  index:
31
32
  all_group_results: view all %{count}
32
33
  all_results: All results
@@ -52,46 +53,46 @@ en:
52
53
  view_all_collections: View all of our collections
53
54
  view_more: View more
54
55
  show:
55
- access: Access
56
- collapse: Collapse
57
56
  collection_id: 'Collection ID: %{id}'
57
+ contents: Contents
58
58
  context: Collection context
59
59
  context_nav:
60
- title: Collection context navigation
60
+ title: Collection overview
61
61
  download:
62
62
  default: Download
63
- ead: Download EAD
64
- pdf: Download finding aid
65
- download_with_size:
66
- default: Download (%{size})
67
- ead: Download EAD (%{size})
68
- pdf: Download finding aid (%{size})
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
69
70
  expand: Expand
70
- has_content: Contents
71
- no_contents: No content inventory
72
- online_content: Online content
73
- online_content_upper: ONLINE CONTENT
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
74
76
  our_collections: Our Collections
75
- overview: Overview
76
77
  sections:
77
- access_field: Access and Use
78
+ access_field: Access and use
78
79
  background_field: Background
79
- collection_context_field: Collection Context
80
+ collection_context_field: Collection context
80
81
  component_field: About this %{level}
81
- component_indexed_terms_field: Indexed Terms
82
- indexed_terms_field: Indexed Terms
82
+ component_indexed_terms_field: Indexed terms
83
+ indexed_terms_field: Indexed terms
83
84
  related_field: Related
84
- scope_and_arrangement_field: Scope and Arrangement
85
+ scope_and_arrangement_field: Scope and arrangement
85
86
  summary_field: Summary
86
- tablist_nav: Context
87
+ toggle_sidebar: Navigate the collection
87
88
  within_collection_dropdown:
88
89
  all_collections: all collections
89
- label_html: Search<span class="sr-only"> within</span>
90
+ label_html: Search<span class="sr-only visually-hidden"> within</span>
90
91
  this_collection: this collection
91
92
  blacklight:
92
93
  entry_name:
93
94
  grouped:
94
- collection_ssi: collection
95
+ _root_: collections
95
96
  search:
96
97
  pagination_info:
97
98
  pages:
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,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sprockets/bumble_d'
4
3
  require 'blacklight'
5
4
  require 'traject'
6
5
  require 'active_model'
@@ -9,58 +8,40 @@ require 'arclight/normalized_date'
9
8
  require 'arclight/normalized_id'
10
9
  require 'arclight/normalized_title'
11
10
  require 'arclight/digital_object'
12
- require 'arclight/viewer'
11
+ require 'gretel'
13
12
 
14
13
  module Arclight
15
14
  ##
16
15
  # This is the defining class for the Arclight Rails Engine
17
16
  class Engine < ::Rails::Engine
18
- extend ::Sprockets::BumbleD::DSL
19
-
20
- # We're not sure this is right, but we aren't doing module imports
21
- # at the moment anyway
22
- register_umd_globals :arclight,
23
- 'blacklight' => 'Blacklight'
24
-
25
- config.viewer_class = Arclight::Viewers::OEmbed
26
17
  config.oembed_resource_exclude_patterns = [/\.pdf$/, /\.ppt$/]
27
18
 
28
- Arclight::Engine.config.catalog_controller_field_accessors = %i[
29
- summary_field
30
- access_field
31
- contact_field
32
- background_field
33
- related_field
34
- terms_field
35
- cite_field
36
- indexed_terms_field
37
- in_person_field
38
- component_field
39
- online_field
40
- component_terms_field
41
- component_indexed_terms_field
42
- ]
43
-
44
19
  Arclight::Engine.config.catalog_controller_group_query_params = {
45
20
  group: true,
46
- 'group.field': 'collection_ssi',
21
+ 'group.field': '_root_',
47
22
  'group.ngroups': true,
48
23
  'group.limit': 3,
49
- fl: '*,parent:[subquery]',
50
- 'parent.fl': '*',
51
- 'parent.q': '{!term f=collection_sim v=$row.collection_ssi}',
52
- 'parent.fq': '{!term f=level_sim v="Collection"}',
53
- 'parent.defType': 'lucene'
24
+ fl: '*,collection:[subquery]',
25
+ 'collection.q': '{!terms f=id v=$row._root_}',
26
+ 'collection.defType': 'lucene',
27
+ 'collection.fl': '*',
28
+ 'collection.rows': 1
54
29
  }
55
30
 
56
- initializer 'arclight.fields' do
57
- Arclight::Engine.config.catalog_controller_field_accessors.each do |field|
58
- Blacklight::Configuration.define_field_access field
31
+ initializer 'arclight.helpers' do
32
+ config.after_initialize do
33
+ ActiveSupport.on_load(:action_view) { include ArclightHelper }
59
34
  end
60
35
  end
61
36
 
62
- initializer 'arclight.helpers' do
63
- 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'
41
+ end
42
+
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)
64
45
  end
65
46
  end
66
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,8 +17,9 @@ 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
@@ -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
-
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
 
@@ -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
@@ -1,74 +1,63 @@
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
9
-
10
- attr_accessor :slug, :collection_count
11
-
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
11
+ include ActiveModel::Model
12
+ DEFAULTS = {
13
+ request_types: {},
14
+ contact_html: '',
15
+ location_html: '',
16
+ visit_note: nil
17
+ }.freeze
18
+
19
+ def initialize(attributes = {})
20
+ @attributes = DEFAULTS.merge(attributes).with_indifferent_access
20
21
  end
21
22
 
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(', ')
27
- end
23
+ attr_reader :attributes
24
+ attr_accessor :collection_count
28
25
 
29
- # Why are we using self#respond_to? below?
30
- #
31
- # All the keys in the config hash from `repositories.yml` are
32
- # on-the-fly added as attr_accessors up in #initialize. If the
33
- # request_types key isn't present, the method won't be created.
34
- #
35
- # Since the original data is thrown away, this is the best way
36
- # to see if that key was present.
37
- def request_config_present?
38
- return false unless respond_to? :request_types
39
- return false if request_types.nil? || request_types.empty?
26
+ def method_missing(field, *args, &block)
27
+ return attributes[field] if attributes.include?(field)
40
28
 
41
- request_configs = request_types.map { |_k, v| v }
42
- request_configs[0]&.fetch('request_url').present? &&
43
- request_configs[0]&.fetch('request_mappings').present?
29
+ super
44
30
  end
45
31
 
46
- def request_config_present_for_type?(type)
47
- return false unless type && request_config_present?
48
-
49
- config = request_types[type]
50
- config&.fetch('request_url').present? &&
51
- config&.fetch('request_mappings').present?
32
+ def respond_to_missing?(field, *args)
33
+ attributes.include?(field) || super
52
34
  end
53
35
 
54
- def request_config_for_type(type)
55
- return nil unless type && request_config_present_for_type?(type)
36
+ # rubocop:disable Rails/OutputSafety
37
+ def contact
38
+ contact_html.html_safe
39
+ end
56
40
 
57
- request_types[type]
41
+ def location
42
+ location_html.html_safe
58
43
  end
44
+ # rubocop:enable Rails/OutputSafety
59
45
 
60
- def request_url_for_type(type)
61
- return nil unless type && request_config_present_for_type?(type)
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
62
51
 
52
+ def request_config_present_for_type?(type)
63
53
  config = request_config_for_type(type)
64
- config.fetch('request_url')
65
- end
66
54
 
67
- def request_mappings_for_type(type)
68
- return nil unless type && request_config_present_for_type?(type)
55
+ config['request_url'].present? &&
56
+ config['request_mappings'].present?
57
+ end
69
58
 
70
- config = request_config_for_type(type)
71
- config.fetch('request_mappings')
59
+ def request_config_for_type(type)
60
+ request_types.fetch(type, {})
72
61
  end
73
62
 
74
63
  def available_request_types
@@ -83,9 +72,9 @@ module Arclight
83
72
  # @return [Hash<Slug,Repository>]
84
73
  def self.from_yaml(file)
85
74
  repos = {}
86
- data = YAML.safe_load(File.read(file))
87
- data.keys.each do |slug|
88
- 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))
89
78
  end
90
79
  repos
91
80
  end
@@ -117,8 +106,8 @@ module Arclight
117
106
  # @param [String] `slug` or `name` -- same as `find_by`
118
107
  # @return [Repository]
119
108
  # @raise [ActiveRecord::RecordNotFound] if cannot find repository
120
- def self.find_by!(*args)
121
- repository = find_by(*args)
109
+ def self.find_by!(**kwargs)
110
+ repository = find_by(**kwargs)
122
111
  raise ActiveRecord::RecordNotFound if repository.blank?
123
112
 
124
113
  repository
@@ -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