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
@@ -4,55 +4,86 @@ module Arclight
4
4
  ##
5
5
  # Extends Blacklight::Solr::Document to provide Arclight specific behavior
6
6
  module SolrDocument
7
- extend Blacklight::Solr::Document
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ attribute :collection_id, :string, '_root_'
11
+ Arclight.deprecation.deprecate_methods(self, collection_id: 'Use `root` instead')
12
+ attribute :parent_ids, :array, 'parent_ids_ssim'
13
+ attribute :legacy_parent_ids, :array, 'parent_ssim'
14
+ Arclight.deprecation.deprecate_methods(self, legacy_parent_ids: 'Use `parent_ids` instead')
15
+ attribute :parent_labels, :array, 'parent_unittitles_ssm'
16
+ attribute :parent_levels, :array, 'parent_levels_ssm'
17
+ attribute :unitid, :string, 'unitid_ssm'
18
+ attribute :extent, :array, 'extent_ssm'
19
+ attribute :abstract, :string, 'abstract_html_tesm'
20
+ attribute :scope, :string, 'scopecontent_html_tesm'
21
+ attribute :creator, :string, 'creator_ssm'
22
+ attribute :level, :string, 'level_ssm'
23
+ attribute :terms, :string, 'userestrict_html_tesm'
24
+ # Restrictions for component sidebar
25
+ attribute :parent_restrictions, :string, 'parent_access_restrict_tesm'
26
+ # Terms for component sidebar
27
+ attribute :parent_terms, :string, 'parent_access_terms_tesm'
28
+ attribute :reference, :string, 'ref_ssm'
29
+ attribute :normalized_title, :string, 'normalized_title_ssm'
30
+ attribute :normalized_date, :string, 'normalized_date_ssm'
31
+ attribute :total_component_count, :string, 'total_component_count_is'
32
+ attribute :online_item_count, :string, 'online_item_count_is'
33
+ attribute :last_indexed, :date, 'timestamp'
34
+ end
8
35
 
9
36
  def repository_config
10
37
  return unless repository
11
- @repository_config ||= Arclight::Repository.find_by(name: repository)
12
- end
13
38
 
14
- def parent_ids
15
- fetch('parent_ssm', [])
39
+ @repository_config ||= Arclight::Repository.find_by(name: repository)
16
40
  end
17
41
 
18
- def parent_labels
19
- fetch('parent_unittitles_ssm', [])
42
+ def parents
43
+ @parents ||= Arclight::Parents.from_solr_document(self).as_parents
20
44
  end
21
45
 
46
+ # Get this document's EAD ID, or fall back to the collection (especially
47
+ # for components that may not have their own.
22
48
  def eadid
23
- fetch('ead_ssi', nil)
49
+ first('ead_ssi')&.strip || collection&.first('ead_ssi')&.strip
24
50
  end
25
51
 
26
- def unitid
27
- first('unitid_ssm')
52
+ def normalized_eadid
53
+ Arclight::NormalizedId.new(eadid).to_s
28
54
  end
55
+ Arclight.deprecation.deprecate_methods(self, normalized_eadid: 'Use `root` instead')
29
56
 
30
57
  def repository
31
- first('repository_ssm')
58
+ first('repository_ssm') || collection&.first('repository_ssm')
32
59
  end
33
60
 
34
61
  def repository_and_unitid
35
62
  [repository, unitid].compact.join(': ')
36
63
  end
37
64
 
38
- def collection_name
39
- first('collection_ssm')
65
+ # @return [SolrDocument] a SolrDocument representing the EAD collection
66
+ # that this document belongs to
67
+ def collection
68
+ return self if collection?
69
+
70
+ @collection ||= self.class.new(self['collection']&.dig('docs', 0), @response)
40
71
  end
41
72
 
42
- def extent
43
- first('extent_ssm')
73
+ def collection_name
74
+ collection&.normalized_title
44
75
  end
45
76
 
46
- def abstract_or_scope
47
- first('abstract_ssm') || first('scopecontent_ssm')
77
+ def collection_unitid
78
+ collection&.unitid
48
79
  end
49
80
 
50
- def creator
51
- first('creator_ssm')
81
+ def abstract_or_scope
82
+ abstract || scope
52
83
  end
53
84
 
54
85
  def collection_creator
55
- first('collection_creator_ssm')
86
+ collection&.creator
56
87
  end
57
88
 
58
89
  def online_content?
@@ -60,45 +91,23 @@ module Arclight
60
91
  end
61
92
 
62
93
  def number_of_children
63
- first('child_component_count_isim') || 0
94
+ first('child_component_count_isi') || 0
64
95
  end
65
96
 
66
97
  def children?
67
98
  number_of_children.positive?
68
99
  end
69
100
 
70
- def reference
71
- first('ref_ssm')
72
- end
73
-
74
101
  def component_level
75
102
  first('component_level_isim')
76
103
  end
77
104
 
78
- def level
79
- first('level_ssm')
80
- end
81
-
82
- def digital_object_viewer
83
- @digital_object_viewer ||= Arclight::Viewer.render(self)
84
- end
85
-
86
- def terms
87
- first('userestrict_ssm')
88
- end
89
-
90
- # Restrictions for component sidebar
91
- def parent_restrictions
92
- first('parent_access_restrict_ssm')
93
- end
94
-
95
- # Terms for component sidebar
96
- def parent_terms
97
- first('parent_access_terms_ssm')
105
+ def collection?
106
+ level&.parameterize == 'collection'
98
107
  end
99
108
 
100
109
  def digital_objects
101
- digital_objects_field = fetch('digital_objects_ssm', [])
110
+ digital_objects_field = fetch('digital_objects_ssm', []).reject(&:empty?)
102
111
  return [] if digital_objects_field.blank?
103
112
 
104
113
  digital_objects_field.map do |object|
@@ -107,25 +116,45 @@ module Arclight
107
116
  end
108
117
 
109
118
  def containers
110
- # note that .titlecase strips punctuation, like hyphens, we want to keep
111
- fetch('containers_ssim', []).map(&:capitalize)
119
+ # NOTE: Keep uppercase characters if present, but upcase the first if not already
120
+ containers_field = fetch('containers_ssim', []).reject(&:empty?)
121
+ return [] if containers_field.blank?
122
+
123
+ containers_field.map do |container|
124
+ container.dup.sub!(/\A./, &:upcase)
125
+ end
112
126
  end
113
127
 
114
- def normalized_title
115
- first('normalized_title_ssm')
128
+ # @return [Array<String>] with embedded highlights using <em>...</em>
129
+ def highlights
130
+ highlight_field(CatalogController.blacklight_config.highlight_field)
116
131
  end
117
132
 
118
- def normalized_date
119
- first('normalized_date_ssm')
133
+ # Factory method for constructing the Object modeling downloads
134
+ # @return [DocumentDownloads]
135
+ def downloads
136
+ @downloads ||= DocumentDownloads.new(self)
120
137
  end
121
138
 
122
- # @return [Array<String>] with embedded highlights using <em>...</em>
123
- def highlights
124
- highlight_response = response[:highlighting]
125
- return if highlight_response.blank? ||
126
- highlight_response[id].blank? ||
127
- highlight_response[id][:text].blank?
128
- highlight_response[id][:text]
139
+ def ead_file
140
+ @ead_file ||= begin
141
+ files = Arclight::DocumentDownloads.new(self, collection_unitid).files
142
+ files.find do |file|
143
+ file.type == 'ead'
144
+ end
145
+ end
146
+ end
147
+
148
+ def nest_path
149
+ self['_nest_path_']
150
+ end
151
+
152
+ def root
153
+ self['_root_'] || self['id']
154
+ end
155
+
156
+ def requestable?
157
+ repository_config&.request_types&.any?
129
158
  end
130
159
  end
131
160
  end
@@ -3,25 +3,52 @@
3
3
  module Arclight
4
4
  # Custom presentation methods for show partial
5
5
  class ShowPresenter < Blacklight::ShowPresenter
6
+ attr_accessor :field_group
7
+
8
+ delegate :collection?, to: :document
9
+
6
10
  def heading
7
11
  document.normalized_title
8
12
  end
9
13
 
10
14
  def with_field_group(group)
11
- self.field_group = group
12
- self
15
+ if block_given?
16
+ old_group = field_group
17
+
18
+ begin
19
+ self.field_group = group
20
+ yield(self)
21
+ ensure
22
+ self.field_group = old_group if block_given?
23
+ end
24
+ else
25
+ dup.tap { |x| x.field_group = group }
26
+ end
13
27
  end
14
28
 
15
29
  private
16
30
 
17
- def field_group
18
- @field_group || 'show_field'
31
+ # @return [Hash<String,Configuration::Field>] all the fields for this index view
32
+ def fields
33
+ if field_group
34
+ configuration["#{field_group}s"] || []
35
+ else
36
+ super
37
+ end
19
38
  end
20
39
 
21
- attr_writer :field_group
22
-
23
40
  def field_config(field)
24
- BlacklightFieldConfigurationFactory.for(config: configuration, field: field, field_group: field_group)
41
+ return super unless field_group
42
+
43
+ fields.fetch(field) do
44
+ if defined?(Blacklight::Configuration::NullDisplayField)
45
+ # For Blacklight 8:
46
+ Blacklight::Configuration::NullDisplayField.new(field)
47
+ else
48
+ # Blacklight 7
49
+ Blacklight::Configuration::NullField.new(field)
50
+ end
51
+ end
25
52
  end
26
53
  end
27
54
  end
@@ -0,0 +1,7 @@
1
+ <% if document.requestable? %>
2
+ <div class='al-request'>
3
+ <% document.repository_config.available_request_types.each do |request_type| %>
4
+ <%= render partial: "arclight/requests/#{request_type}", locals: { document: document } %>
5
+ <% end %>
6
+ </div>
7
+ <% end %>
@@ -1,59 +1,40 @@
1
- <div class="al-repository">
1
+ <div class="mb-3 mx-auto al-repository">
2
2
  <div class="container">
3
3
  <div class='row'>
4
- <div class='col-2 align-self-center al-repository-thumbnail hidden-md-down'>
5
- <%= image_tag repository.thumbnail_url, alt: repository.name, class: 'img-fluid' %>
4
+ <div class='col-2 align-self-center d-none d-lg-block al-repository-thumbnail'>
5
+ <%= image_tag repository.thumbnail_url, alt: repository.name, class: 'img-fluid d-block mx-auto' %>
6
6
  </div>
7
7
 
8
- <div class="col-sm-12 col-lg-10 al-repository-information">
9
- <h2>
10
- <%= link_to_unless(params[:id] == repository.slug, repository.name, arclight_engine.repository_path(repository.slug)) %>
11
- </h2>
12
- <div class='row no-gutters justify-content-md-center'>
13
- <div class='col-4 col-md-3 al-repository-contact'>
14
- <address>
15
- <div class="al-repository-street-address">
16
- <% %i[building address1 address2 city_state_zip_country].each do |f| %>
17
- <% if repository.send(f).present? %>
18
- <div class='al-repository-street-address-<%= f %>'>
19
- <%= repository.send(f) %>
20
- </div>
21
- <% end %>
22
- <% end %>
23
- </div>
8
+ <div class="col-sm-12 col-lg-10 py-3 al-repository-information">
9
+ <%= content_tag(params[:id] == repository.slug ? :h1 : :h2, class: 'h5 mb-3 repo-name') do %>
10
+ <%= link_to_unless(params[:id] == repository.slug, repository.name, arclight_engine.repository_path(repository.slug)) %>
11
+ <% end %>
12
+ <div class='row no-gutters justify-content-center'>
13
+ <div class='col-12 col-sm-4 col-md-3 fw-light al-repository-contact'>
14
+ <address class="text-break">
15
+ <div class="mb-3 al-repository-street-address">
16
+ <%= repository.location %>
17
+ </div>
24
18
 
25
19
  <div class="al-repository-contact-info">
26
- <% if repository.phone.present? %>
27
- <div class='al-repository-contact-info-phone'>
28
- <%= repository.phone %>
29
- </div>
30
- <% end %>
31
- <% if repository.contact_info.present? %>
32
- <div class='al-repository-contact-info-contact_info'>
33
- <% if repository.contact_info.include?('@') %>
34
- <%= mail_to repository.contact_info %>
35
- <% else %>
36
- <%= repository.contact_info %>
37
- <% end %>
38
- </div>
39
- <% end %>
20
+ <%= repository.contact %>
40
21
  </div>
41
22
  </address>
42
23
  </div>
43
24
 
44
- <div class='col al-repository-description'>
25
+ <div class='col-12 col-sm mt-3 mt-sm-0 al-repository-description'>
45
26
  <%= repository.description %>
46
27
  </div>
47
28
 
48
29
  <% if on_repositories_index? %>
49
- <div class='col col-lg-2 al-repository-extra align-self-center hidden-md-down'>
50
- <div class='al-repository-extra-collection-count'>
51
- <span class="al-repository-collection-count">
52
- <%= t(:'arclight.views.repositories.number_of_collections', count: repository.collection_count) %>
53
- </span>
54
- </div>
55
- <%= link_to(t(:'arclight.views.repositories.view_more'), arclight_engine.repository_path(repository.slug), class: 'btn btn-secondary btn-sm') %>
30
+ <div class='col-12 col-lg-2 mt-3 mt-lg-0 text-center al-repository-extra'>
31
+ <div class='mb-1 fst-italic fw-bold'>
32
+ <%= t(:'arclight.views.repositories.number_of_collections', count: repository.collection_count) %>
56
33
  </div>
34
+ <% if repository.collection_count&.positive? %>
35
+ <%= link_to(t(:'arclight.views.repositories.view_more'), arclight_engine.repository_path(repository.slug), class: 'btn btn-secondary btn-sm') %>
36
+ <% end %>
37
+ </div>
57
38
  <% end %>
58
39
  </div>
59
40
  </div>
@@ -1,4 +1,9 @@
1
+ <% breadcrumb :repositories %>
2
+
3
+ <h1 class="sr-only visually-hidden"><%= t('arclight.repositories') %></h1>
4
+
1
5
  <div class="al-repositories">
6
+ <% @page_title = t('arclight.views.repositories.title') %>
2
7
  <%= render 'shared/breadcrumbs' %>
3
8
  <%= render @repositories %>
4
9
  </div>
@@ -1,10 +1,12 @@
1
+ <% @page_title = t(:'arclight.views.repositories.show', name: @repository.name) %>
2
+ <% breadcrumb :repository, @repository %>
1
3
  <%= render 'shared/breadcrumbs' %>
2
4
  <%= render @repository %>
3
5
  <div class="row al-repository-show-header">
4
6
  <div class="col col-md-8 col-lg-9">
5
- <h3>
7
+ <h2 class="h4">
6
8
  <%= t('arclight.views.show.our_collections') %>
7
- </h3>
9
+ </h2>
8
10
  </div>
9
11
  <div class="col text-right">
10
12
  <span class="al-repository-collections">
@@ -15,16 +17,13 @@
15
17
 
16
18
  <div class="row">
17
19
  <% @collections.each do |document| %>
20
+ <% doc_presenter = Arclight::IndexPresenter.new(document, self, CatalogController.blacklight_config) %>
18
21
  <div class="col-md-12">
19
22
  <div class='al-document-title-bar'>
20
23
  <div class='row'>
21
24
  <div class='col-md-10 col-lg-9'>
22
- <h5><%= link_to document.normalized_title, solr_document_path(document.id) %></h5>
23
- <%= content_tag('div', class: 'al-document-abstract-or-scope', title: document.abstract_or_scope) do %>
24
- <%= content_tag('div', 'data-arclight-truncate' => true) do %>
25
- <%= document.abstract_or_scope %>
26
- <% end %>
27
- <% end if document.abstract_or_scope %>
25
+ <h3 class="h5"><%= link_to doc_presenter.label, solr_document_path(document.id) %></h3>
26
+ <%= render Arclight::IndexMetadataFieldComponent.with_collection(doc_presenter.field_presenters.select { |p| p.field_config.repository_context }) %>
28
27
  </div>
29
28
  <% if document.unitid %>
30
29
  <div class='col text-right al-collection-id'>
@@ -0,0 +1,8 @@
1
+ <% aeon_external_request ||= Arclight::Requests::AeonExternalRequest.new(document, document_presenter(document)) %>
2
+
3
+ <%= form_tag aeon_external_request.url, method: :post, class: 'd-inline-block al-request-form' do |f| %>
4
+ <%= render(Blacklight::HiddenSearchStateComponent.new(params: aeon_external_request.form_mapping)) %>
5
+ <button type='submit' class='al-request-button btn btn-primary btn-sm me-1'>
6
+ <%= t('arclight.request.container') %>
7
+ </button>
8
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <% if parsed_files = document.ead_file %>
2
+ <% aeon_web_ead ||= Arclight::Requests::AeonWebEad.new(document, parsed_files.href) %>
3
+ <% aeon_web_ead_url = aeon_web_ead&.url %>
4
+
5
+ <%= link_to 'Request', aeon_web_ead_url, class: 'al-request-button btn btn-primary btn-sm me-1' %>
6
+ <% end %>
@@ -1,11 +1,10 @@
1
- <% document ||= @document %>
2
- <% google_form ||= Arclight::Requests::GoogleForm.new(document, show_presenter(document), solr_document_path(document)) %>
1
+ <% google_form ||= Arclight::Requests::GoogleForm.new(document, document_presenter(document), solr_document_path(document)) %>
3
2
 
4
- <%= form_tag google_form.url, method: :get, class: 'al-request-form' do |f| %>
3
+ <%= form_tag google_form.url, method: :get, class: 'd-inline-block al-request-form' do |f| %>
5
4
  <% google_form.form_mapping.each do |key, value| %>
6
- <%= hidden_field_tag value, google_form.send(key) %>
5
+ <%= hidden_field_tag value, google_form.public_send(key) %>
7
6
  <% end %>
8
- <button type='submit' class='al-request-button btn-link'>
7
+ <button type='submit' class='al-request-button btn btn-primary btn-sm me-1'>
9
8
  <%= t('arclight.request.container') %>
10
9
  </button>
11
10
  <% end %>
@@ -0,0 +1,8 @@
1
+ <% # Override to conditionally add id="documents" on div. When documents are grouped it causes duplicate id issues %>
2
+ <% # https://github.com/projectblacklight/blacklight/blob/v8.1.0/app/views/catalog/_document_list.html.erb %>
3
+ <% # container for all documents in index list view -%>
4
+ <% view_config = local_assigns[:view_config] || blacklight_config&.view_config(document_index_view_type) %>
5
+ <div <%= 'id="documents"'.html_safe unless grouped? %> class="al-document-listings documents-<%= view_config&.key || document_index_view_type %>">
6
+ <% document_presenters = documents.map { |doc| document_presenter(doc) } -%>
7
+ <%= render view_config.document_component.with_collection(document_presenters, partials: view_config.partials, counter_offset: @response&.start || 0) %>
8
+ </div>
@@ -0,0 +1,4 @@
1
+ <% # container for all groups in index view -%>
2
+ <div id="documents" class='al-grouped-results'>
3
+ <%= render (blacklight_config.view_config(document_index_view_type).group_component || Arclight::GroupComponent).with_collection(@response.groups) %>
4
+ </div>
@@ -0,0 +1,10 @@
1
+ <div class="result-type-group btn-group" role="group" aria-label="<%= t('arclight.views.index.group_results') %>">
2
+ <%= link_to t('arclight.views.index.all_results'),
3
+ search_catalog_path(search_without_group),
4
+ class: "btn btn-outline-secondary #{'active' unless grouped?}"
5
+ %>
6
+ <%= link_to t('arclight.views.index.group_by_collection'),
7
+ search_catalog_path(search_with_group),
8
+ class: "btn btn-outline-secondary #{'active' if grouped?}"
9
+ %>
10
+ </div>
@@ -0,0 +1,3 @@
1
+ <%= render 'shared/breadcrumbs' %>
2
+
3
+ <h1 class="sr-only visually-hidden top-content-title"><%= search_results_header_text %></h1>
@@ -0,0 +1,19 @@
1
+ <p><%= params[:id] %></p>
2
+ <%= turbo_frame_tag "al-hierarchy-#{params[:id]}#{params[:key]}" do %>
3
+ <%= render partial: "paginate_compact", object: @response if show_pagination? && params[:paginate] %>
4
+ <% presenters = @response.documents.map{ | document | document_presenter(document) } %>
5
+ <% if params[:hierarchy].present? %>
6
+ <ul class="documents">
7
+ <%= render Arclight::DocumentCollectionHierarchyComponent.with_collection(presenters,
8
+ blacklight_config: blacklight_config,
9
+ nest_path: params[:nest_path]) %>
10
+ </ul>
11
+ <% else %>
12
+ <table class="table table-striped">
13
+ <%= render Arclight::DocumentCollectionContextComponent.with_collection(presenters,
14
+ blacklight_config: blacklight_config) %>
15
+ </table>
16
+ <% end %>
17
+
18
+ <%= render 'results_pagination' if params[:paginate] %>
19
+ <% end %>
@@ -1,8 +1,17 @@
1
- <% unless has_search_parameters? %>
2
- <%= render 'home' %>
3
- <% else %>
4
- <% content_for(:sidebar) do %>
5
- <%= render 'search_sidebar' %>
6
- <% end %>
7
- <%= render 'search_results' %>
1
+ <% content_for(:sidebar) do %>
2
+ <% conf = blacklight_config.view_config(document_index_view_type) %>
3
+ <%= render conf.sidebar_component.new(blacklight_config: blacklight_config,
4
+ response: @response,
5
+ view_config: conf) %>
6
+ <% end %>
7
+
8
+ <% breadcrumb :search_results, search_state %>
9
+
10
+ <%= render 'search_results' %>
11
+
12
+ <%# override upstream to override the search results header, similar to https://github.com/projectblacklight/blacklight/pull/2831 %>
13
+ <%# This section can be omitted in Blacklight 8 %>
14
+ <% content_for(:container_header, flush: true) do -%>
15
+ <%= render 'search_results_header' %>
16
+ <%= render 'constraints' %>
8
17
  <% end %>
@@ -1,15 +1,3 @@
1
- <div class='al-search-breadcrumb'>
2
- <%= link_to t('arclight.routes.home'), root_path %>
3
- <%= t('arclight.breadcrumb_separator') %>
4
- <% if collection_active? %>
5
- <%= t('arclight.routes.collections') %>
6
- <% elsif on_repositories_index? %>
7
- <%= t('arclight.routes.repositories') %>
8
- <% elsif on_repositories_show? %>
9
- <%= link_to t('arclight.routes.repositories'), arclight_engine.repositories_path %>
10
- <%= t('arclight.breadcrumb_separator') %>
11
- <%= @repository.name %>
12
- <% else %>
13
- <%= t('arclight.routes.search_results') %>
14
- <% end %>
15
- </div>
1
+ <nav class='al-search-breadcrumb' role='navigation' aria-label="<%= t('arclight.breadcrumbs.aria_label') %>">
2
+ <%= breadcrumbs style: :bootstrap5, aria_current: 'page', autoroot: true %>
3
+ </nav>
@@ -1,6 +1,6 @@
1
1
  <li class="nav-item <%= repositories_active_class %>">
2
2
  <%= link_to t('arclight.routes.repositories'), arclight_engine.repositories_path, class: 'nav-link' %>
3
3
  </li>
4
- <li class="nav-item ml-3 <%= collection_active_class %>">
4
+ <li class="nav-item ms-3 <%= collection_active_class %>">
5
5
  <%= link_to t('arclight.routes.collections'), arclight_engine.collections_path, class: 'nav-link' %>
6
6
  </li>
data/arclight.gemspec CHANGED
@@ -1,7 +1,6 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
5
  require 'arclight/version'
7
6
 
@@ -11,35 +10,37 @@ Gem::Specification.new do |spec|
11
10
  spec.authors = ['Darren Hardy', 'Jessie Keck', 'Gordon Leacock', 'Jack Reed']
12
11
  spec.email = ['drh@stanford.edu', 'jessie.keck@gmail.com', 'gordonl@umich.edu', 'phillipjreed@gmail.com']
13
12
 
14
- spec.summary = ''
13
+ spec.summary = 'A Blacklight-based environment to support discovery and delivery for archives and special collections'
15
14
  spec.description = ''
16
- spec.homepage = 'https://github.com/sul-dlss/arclight'
17
- spec.license = 'Apache-2.0'
15
+ spec.homepage = 'https://library.stanford.edu/projects/arclight'
16
+ spec.metadata = { 'source_code_uri' => 'https://github.com/projectblacklight/arclight' }
17
+ spec.license = 'Apache-2.0'
18
18
 
19
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ spec.required_ruby_version = '>= 3.0.0'
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
21
  f.match(%r{^(test|spec|features)/})
21
22
  end
22
23
  spec.bindir = 'exe'
23
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
25
  spec.require_paths = ['lib']
25
26
 
26
- spec.add_dependency 'blacklight', '~> 7.0', '>= 7.0.1'
27
- spec.add_dependency 'blacklight_range_limit', '~> 7.1'
28
- spec.add_dependency 'rails', '~> 5.0'
29
- spec.add_dependency 'solr_ead'
27
+ spec.add_dependency 'blacklight', '>= 8.0.0', '< 9'
28
+ spec.add_dependency 'gretel'
29
+ spec.add_dependency 'rails', '>= 7.1', '< 9'
30
30
  spec.add_dependency 'traject', '~> 3.0'
31
- spec.add_dependency 'traject_plus'
31
+ spec.add_dependency 'traject_plus', '~> 2.0'
32
32
 
33
- spec.add_development_dependency 'bundler', '> 1.14'
33
+ spec.add_development_dependency 'bundler'
34
34
  spec.add_development_dependency 'capybara'
35
35
  spec.add_development_dependency 'engine_cart'
36
36
  spec.add_development_dependency 'i18n-tasks'
37
- spec.add_development_dependency 'rake', '~> 12.0'
38
- spec.add_development_dependency 'rubocop', '~> 0.74.0'
39
- spec.add_development_dependency 'rubocop-rspec', '~> 1.35'
40
- spec.add_development_dependency 'rspec-rails', '~> 3.0'
37
+ spec.add_development_dependency 'rake', '>= 12.0'
38
+ spec.add_development_dependency 'rspec-rails'
39
+ spec.add_development_dependency 'rubocop', '~> 1.8'
40
+ spec.add_development_dependency 'rubocop-rails', '~> 2.8'
41
+ spec.add_development_dependency 'rubocop-rake'
42
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
41
43
  spec.add_development_dependency 'selenium-webdriver'
42
44
  spec.add_development_dependency 'simplecov'
43
45
  spec.add_development_dependency 'solr_wrapper'
44
- spec.add_development_dependency 'webdrivers'
45
46
  end
@@ -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