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
@@ -4,8 +4,34 @@ module Arclight
4
4
  ##
5
5
  # Extends Blacklight::Solr::Document to provide Arclight specific behavior
6
6
  module SolrDocument
7
- extend Blacklight::Solr::Document
8
- include Arclight::EadFormatHelpers
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
9
35
 
10
36
  def repository_config
11
37
  return unless repository
@@ -13,61 +39,51 @@ module Arclight
13
39
  @repository_config ||= Arclight::Repository.find_by(name: repository)
14
40
  end
15
41
 
16
- def parent_ids
17
- fetch('parent_ssim', [])
18
- end
19
-
20
- def parent_labels
21
- fetch('parent_unittitles_ssm', [])
22
- end
23
-
24
- def parent_levels
25
- fetch('parent_levels_ssm', [])
26
- end
27
-
28
- def parent_document
29
- self.class.new fetch('parent').fetch('docs', []).first
42
+ def parents
43
+ @parents ||= Arclight::Parents.from_solr_document(self).as_parents
30
44
  end
31
45
 
46
+ # Get this document's EAD ID, or fall back to the collection (especially
47
+ # for components that may not have their own.
32
48
  def eadid
33
- fetch('ead_ssi', nil)&.strip
49
+ first('ead_ssi')&.strip || collection&.first('ead_ssi')&.strip
34
50
  end
35
51
 
36
- def unitid
37
- first('unitid_ssm')
52
+ def normalized_eadid
53
+ Arclight::NormalizedId.new(eadid).to_s
38
54
  end
55
+ Arclight.deprecation.deprecate_methods(self, normalized_eadid: 'Use `root` instead')
39
56
 
40
57
  def repository
41
- first('repository_ssm')
58
+ first('repository_ssm') || collection&.first('repository_ssm')
42
59
  end
43
60
 
44
61
  def repository_and_unitid
45
62
  [repository, unitid].compact.join(': ')
46
63
  end
47
64
 
48
- def collection_name
49
- first('collection_ssm')
50
- end
65
+ # @return [SolrDocument] a SolrDocument representing the EAD collection
66
+ # that this document belongs to
67
+ def collection
68
+ return self if collection?
51
69
 
52
- def collection_unitid
53
- first('collection_unitid_ssm')
70
+ @collection ||= self.class.new(self['collection']&.dig('docs', 0), @response)
54
71
  end
55
72
 
56
- def extent
57
- first('extent_ssm')
73
+ def collection_name
74
+ collection&.normalized_title
58
75
  end
59
76
 
60
- def abstract_or_scope
61
- value = first('abstract_ssm') || first('scopecontent_ssm')
62
- render_html_tags(value: [value]) if value.present?
77
+ def collection_unitid
78
+ collection&.unitid
63
79
  end
64
80
 
65
- def creator
66
- first('creator_ssm')
81
+ def abstract_or_scope
82
+ abstract || scope
67
83
  end
68
84
 
69
85
  def collection_creator
70
- first('collection_creator_ssm')
86
+ collection&.creator
71
87
  end
72
88
 
73
89
  def online_content?
@@ -75,41 +91,19 @@ module Arclight
75
91
  end
76
92
 
77
93
  def number_of_children
78
- first('child_component_count_isim') || 0
94
+ first('child_component_count_isi') || 0
79
95
  end
80
96
 
81
97
  def children?
82
98
  number_of_children.positive?
83
99
  end
84
100
 
85
- def reference
86
- first('ref_ssm')
87
- end
88
-
89
101
  def component_level
90
102
  first('component_level_isim')
91
103
  end
92
104
 
93
- def level
94
- first('level_ssm')
95
- end
96
-
97
- def digital_object_viewer
98
- @digital_object_viewer ||= Arclight::Viewer.render(self)
99
- end
100
-
101
- def terms
102
- render_html_tags(value: [first('userestrict_ssm')])
103
- end
104
-
105
- # Restrictions for component sidebar
106
- def parent_restrictions
107
- render_html_tags(value: [first('parent_access_restrict_ssm')])
108
- end
109
-
110
- # Terms for component sidebar
111
- def parent_terms
112
- render_html_tags(value: [first('parent_access_terms_ssm')])
105
+ def collection?
106
+ level&.parameterize == 'collection'
113
107
  end
114
108
 
115
109
  def digital_objects
@@ -122,26 +116,18 @@ module Arclight
122
116
  end
123
117
 
124
118
  def containers
125
- # note that .titlecase strips punctuation, like hyphens, we want to keep
126
- fetch('containers_ssim', []).map(&:capitalize)
127
- end
128
-
129
- def normalized_title
130
- first('normalized_title_ssm')
131
- end
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?
132
122
 
133
- def normalized_date
134
- first('normalized_date_ssm')
123
+ containers_field.map do |container|
124
+ container.dup.sub!(/\A./, &:upcase)
125
+ end
135
126
  end
136
127
 
137
128
  # @return [Array<String>] with embedded highlights using <em>...</em>
138
129
  def highlights
139
- highlight_response = response[:highlighting]
140
- return if highlight_response.blank? ||
141
- highlight_response[id].blank? ||
142
- highlight_response[id][:text].blank?
143
-
144
- highlight_response[id][:text]
130
+ highlight_field(CatalogController.blacklight_config.highlight_field)
145
131
  end
146
132
 
147
133
  # Factory method for constructing the Object modeling downloads
@@ -149,5 +135,26 @@ module Arclight
149
135
  def downloads
150
136
  @downloads ||= DocumentDownloads.new(self)
151
137
  end
138
+
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?
158
+ end
152
159
  end
153
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
@@ -1,5 +1,5 @@
1
- <% if item_requestable?('', { document: document }) %>
2
- <div class='mr-4 al-show-actions-box-request flex-md-fill'>
1
+ <% if document.requestable? %>
2
+ <div class='al-request'>
3
3
  <% document.repository_config.available_request_types.each do |request_type| %>
4
4
  <%= render partial: "arclight/requests/#{request_type}", locals: { document: document } %>
5
5
  <% 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
- <%= content_tag(params[:id] == repository.slug ? :h1 : :h2, class: 'h5 repo-name') do %>
10
- <%= link_to_unless(params[:id] == repository.slug, repository.name, arclight_engine.repository_path(repository.slug)) %>
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
11
  <% end %>
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>
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,6 @@
1
- <h1 class="sr-only"><%= t('arclight.repositories') %></h1>
1
+ <% breadcrumb :repositories %>
2
+
3
+ <h1 class="sr-only visually-hidden"><%= t('arclight.repositories') %></h1>
2
4
 
3
5
  <div class="al-repositories">
4
6
  <% @page_title = t('arclight.views.repositories.title') %>
@@ -1,4 +1,5 @@
1
1
  <% @page_title = t(:'arclight.views.repositories.show', name: @repository.name) %>
2
+ <% breadcrumb :repository, @repository %>
2
3
  <%= render 'shared/breadcrumbs' %>
3
4
  <%= render @repository %>
4
5
  <div class="row al-repository-show-header">
@@ -16,16 +17,13 @@
16
17
 
17
18
  <div class="row">
18
19
  <% @collections.each do |document| %>
20
+ <% doc_presenter = Arclight::IndexPresenter.new(document, self, CatalogController.blacklight_config) %>
19
21
  <div class="col-md-12">
20
22
  <div class='al-document-title-bar'>
21
23
  <div class='row'>
22
24
  <div class='col-md-10 col-lg-9'>
23
- <h3 class="h5"><%= link_to document.normalized_title, solr_document_path(document.id) %></h3>
24
- <%= content_tag('div', class: 'al-document-abstract-or-scope') do %>
25
- <%= content_tag('div', 'data-arclight-truncate' => true) do %>
26
- <%= document.abstract_or_scope %>
27
- <% end %>
28
- <% 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 }) %>
29
27
  </div>
30
28
  <% if document.unitid %>
31
29
  <div class='col text-right al-collection-id'>
@@ -1,9 +1,8 @@
1
- <% document ||= @document %>
2
- <% aeon_external_request ||= Arclight::Requests::AeonExternalRequest.new(document, show_presenter(document)) %>
1
+ <% aeon_external_request ||= Arclight::Requests::AeonExternalRequest.new(document, document_presenter(document)) %>
3
2
 
4
- <%= form_tag aeon_external_request.url, method: :post, class: 'al-request-form' do |f| %>
5
- <%= render_hash_as_hidden_fields(aeon_external_request.form_mapping) %>
6
- <button type='submit' class='al-request-button btn-link'>
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'>
7
6
  <%= t('arclight.request.container') %>
8
7
  </button>
9
8
  <% end %>
@@ -1,7 +1,6 @@
1
- <% document ||= @document %>
2
- <% if parsed_files = ead_files(document) %>
1
+ <% if parsed_files = document.ead_file %>
3
2
  <% aeon_web_ead ||= Arclight::Requests::AeonWebEad.new(document, parsed_files.href) %>
4
- <% aeon_web_ead_url = aeon_web_ead.try(:url) %>
3
+ <% aeon_web_ead_url = aeon_web_ead&.url %>
5
4
 
6
- <%= link_to 'Request', aeon_web_ead_url, class: 'btn btn-secondary btn-sm' %>
5
+ <%= link_to 'Request', aeon_web_ead_url, class: 'al-request-button btn btn-primary btn-sm me-1' %>
7
6
  <% end %>
@@ -1,12 +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
- <!-- Note: previous button class was 'al-request-button btn-link' -->
9
- <button type='submit' class='btn btn-secondary btn-sm'>
7
+ <button type='submit' class='al-request-button btn btn-primary btn-sm me-1'>
10
8
  <%= t('arclight.request.container') %>
11
9
  </button>
12
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>
@@ -1,21 +1,4 @@
1
1
  <% # container for all groups in index view -%>
2
- <div class='al-grouped-results'>
3
- <% @response.groups.each do |g| %>
4
- <% parent_document = g.docs.first.parent_document %>
5
- <%= render_document_partial(parent_document, :group_header) %>
6
- <div class="grouped-documents">
7
- <div class="al-grouped-more">
8
- <% if g.total > 3 %>
9
- <%= t('arclight.views.index.top_group_results', count: 3) %>
10
- <%= link_to(
11
- t('arclight.views.index.all_group_results', count: g.total),
12
- search_catalog_path(search_within_collection(parent_document.collection_name, search_without_group)))
13
- %>
14
- <% else %>
15
- <%= t('arclight.views.index.group_results_count', count: g.total) %>
16
- <% end %>
17
- </div>
18
- <%= render_grouped_documents(g.docs) %>
19
- </div>
20
- <% end %>
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) %>
21
4
  </div>
@@ -1,4 +1,4 @@
1
- <div class="result-type-group mb-2 mb-lg-0 btn-group float-lg-left float-md-right" role="group" aria-label="<%= t('arclight.views.index.group_results') %>">
1
+ <div class="result-type-group btn-group" role="group" aria-label="<%= t('arclight.views.index.group_results') %>">
2
2
  <%= link_to t('arclight.views.index.all_results'),
3
3
  search_catalog_path(search_without_group),
4
4
  class: "btn btn-outline-secondary #{'active' unless grouped?}"
@@ -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
- <nav class='al-search-breadcrumb' role='navigation' aria-label=<%= t('arclight.breadcrumbs.aria_label') %> >
2
- <%= link_to t('arclight.routes.home'), root_path %>
3
- <span aria-hidden="true"><%= t('arclight.breadcrumb_separator') %></span>
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
- <span aria-hidden="true"><%= t('arclight.breadcrumb_separator') %></span>
11
- <%= @repository.name %>
12
- <% else %>
13
- <%= t('arclight.routes.search_results') %>
14
- <% end %>
1
+ <nav class='al-search-breadcrumb' role='navigation' aria-label="<%= t('arclight.breadcrumbs.aria_label') %>">
2
+ <%= breadcrumbs style: :bootstrap5, aria_current: 'page', autoroot: true %>
15
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
@@ -10,35 +10,37 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ['Darren Hardy', 'Jessie Keck', 'Gordon Leacock', 'Jack Reed']
11
11
  spec.email = ['drh@stanford.edu', 'jessie.keck@gmail.com', 'gordonl@umich.edu', 'phillipjreed@gmail.com']
12
12
 
13
- spec.summary = ''
13
+ spec.summary = 'A Blacklight-based environment to support discovery and delivery for archives and special collections'
14
14
  spec.description = ''
15
- spec.homepage = 'https://github.com/sul-dlss/arclight'
16
- 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'
17
18
 
18
- 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|
19
21
  f.match(%r{^(test|spec|features)/})
20
22
  end
21
23
  spec.bindir = 'exe'
22
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
25
  spec.require_paths = ['lib']
24
26
 
25
- spec.add_dependency 'blacklight', '~> 7.2'
26
- spec.add_dependency 'blacklight_range_limit', '~> 7.1'
27
- spec.add_dependency 'rails', '~> 5.0'
28
- spec.add_dependency 'sprockets-bumble_d'
27
+ spec.add_dependency 'blacklight', '>= 8.0.0', '< 9'
28
+ spec.add_dependency 'gretel'
29
+ spec.add_dependency 'rails', '>= 7.1', '< 9'
29
30
  spec.add_dependency 'traject', '~> 3.0'
30
- spec.add_dependency 'traject_plus', '~> 1.2'
31
+ spec.add_dependency 'traject_plus', '~> 2.0'
31
32
 
32
- spec.add_development_dependency 'bundler', '> 1.14'
33
+ spec.add_development_dependency 'bundler'
33
34
  spec.add_development_dependency 'capybara'
34
35
  spec.add_development_dependency 'engine_cart'
35
36
  spec.add_development_dependency 'i18n-tasks'
36
- spec.add_development_dependency 'rake', '~> 12.0'
37
- spec.add_development_dependency 'rspec-rails', '~> 3.0'
38
- spec.add_development_dependency 'rubocop', '~> 0.74.0'
39
- spec.add_development_dependency 'rubocop-rspec', '~> 1.35'
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'
40
43
  spec.add_development_dependency 'selenium-webdriver'
41
44
  spec.add_development_dependency 'simplecov'
42
45
  spec.add_development_dependency 'solr_wrapper'
43
- spec.add_development_dependency 'webdrivers'
44
46
  end