arclight 0.4.0 → 1.0.0.beta1

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc +11 -4
  3. data/.github/workflows/ruby.yml +24 -8
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +289 -3
  6. data/.rubocop_todo.yml +64 -76
  7. data/CONTRIBUTING.md +5 -5
  8. data/Gemfile +15 -10
  9. data/README.md +18 -12
  10. data/app/assets/javascripts/arclight/arclight.js +3 -7
  11. data/app/assets/javascripts/arclight/oembed_viewer.js +64 -39
  12. data/app/assets/javascripts/arclight/truncate_controller.js +27 -0
  13. data/app/assets/stylesheets/arclight/application.scss +1 -5
  14. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +104 -130
  15. data/app/assets/stylesheets/arclight/modules/icons.scss +14 -3
  16. data/app/assets/stylesheets/arclight/modules/layout.scss +121 -100
  17. data/app/assets/stylesheets/arclight/modules/mastheads.scss +15 -57
  18. data/app/assets/stylesheets/arclight/modules/repositories.scss +2 -2
  19. data/app/assets/stylesheets/arclight/modules/repository_card.scss +4 -48
  20. data/app/assets/stylesheets/arclight/modules/search_results.scss +86 -35
  21. data/app/assets/stylesheets/arclight/modules/show_collection.scss +5 -32
  22. data/app/assets/stylesheets/arclight/modules/truncator.scss +56 -0
  23. data/app/assets/stylesheets/arclight/variables.scss +7 -4
  24. data/app/components/arclight/access_component.html.erb +14 -0
  25. data/app/components/arclight/access_component.rb +25 -0
  26. data/app/components/arclight/bookmark_component.html.erb +25 -0
  27. data/app/components/arclight/bookmark_component.rb +9 -0
  28. data/app/components/arclight/breadcrumb_component.rb +40 -0
  29. data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +34 -0
  30. data/app/components/arclight/breadcrumbs_hierarchy_component.rb +25 -0
  31. data/app/components/arclight/collection_context_component.html.erb +12 -0
  32. data/app/components/arclight/collection_context_component.rb +27 -0
  33. data/app/components/arclight/collection_info_component.html.erb +28 -0
  34. data/app/components/arclight/collection_info_component.rb +26 -0
  35. data/app/components/arclight/collection_sidebar_component.html.erb +15 -0
  36. data/app/components/arclight/collection_sidebar_component.rb +41 -0
  37. data/app/{views/catalog/_search_results_repository.html.erb → components/arclight/constraints_component.html.erb} +2 -1
  38. data/app/components/arclight/constraints_component.rb +17 -0
  39. data/app/components/arclight/document_collection_context_component.html.erb +29 -0
  40. data/app/components/arclight/document_collection_context_component.rb +28 -0
  41. data/app/components/arclight/document_collection_hierarchy_component.html.erb +46 -0
  42. data/app/components/arclight/document_collection_hierarchy_component.rb +62 -0
  43. data/app/components/arclight/document_component.html.erb +39 -0
  44. data/app/components/arclight/document_component.rb +49 -0
  45. data/app/components/arclight/document_components_hierarchy_component.html.erb +32 -0
  46. data/app/components/arclight/document_components_hierarchy_component.rb +28 -0
  47. data/app/components/arclight/document_download_component.html.erb +24 -0
  48. data/app/components/arclight/document_download_component.rb +71 -0
  49. data/app/components/arclight/embed_component.html.erb +10 -0
  50. data/app/components/arclight/embed_component.rb +43 -0
  51. data/app/components/arclight/group_component.html.erb +30 -0
  52. data/app/components/arclight/group_component.rb +23 -0
  53. data/app/components/arclight/header_component.html.erb +5 -0
  54. data/app/components/arclight/header_component.rb +10 -0
  55. data/app/components/arclight/index_metadata_field_component.html.erb +17 -0
  56. data/app/components/arclight/index_metadata_field_component.rb +20 -0
  57. data/app/components/arclight/masthead_component.html.erb +15 -0
  58. data/app/components/arclight/masthead_component.rb +10 -0
  59. data/app/components/arclight/metadata_section_component.html.erb +13 -0
  60. data/app/components/arclight/metadata_section_component.rb +22 -0
  61. data/app/components/arclight/oembed_viewer_component.html.erb +5 -0
  62. data/app/components/arclight/oembed_viewer_component.rb +16 -0
  63. data/app/components/arclight/online_content_filter_component.html.erb +15 -0
  64. data/app/components/arclight/online_content_filter_component.rb +19 -0
  65. data/app/components/arclight/online_status_indicator_component.rb +19 -0
  66. data/app/components/arclight/repository_breadcrumb_component.html.erb +10 -0
  67. data/app/components/arclight/repository_breadcrumb_component.rb +17 -0
  68. data/app/components/arclight/repository_location_component.html.erb +20 -0
  69. data/app/components/arclight/repository_location_component.rb +10 -0
  70. data/app/components/arclight/search_bar_component.html.erb +25 -0
  71. data/app/components/arclight/search_bar_component.rb +32 -0
  72. data/app/components/arclight/search_result_breadcrumbs_component.html.erb +3 -0
  73. data/app/components/arclight/search_result_breadcrumbs_component.rb +37 -0
  74. data/app/components/arclight/search_result_component.html.erb +20 -0
  75. data/app/components/arclight/search_result_component.rb +24 -0
  76. data/app/components/arclight/search_result_title_component.html.erb +13 -0
  77. data/app/components/arclight/search_result_title_component.rb +15 -0
  78. data/app/components/arclight/sidebar_component.html.erb +9 -0
  79. data/app/components/arclight/sidebar_component.rb +19 -0
  80. data/app/components/arclight/upper_metadata_layout_component.rb +10 -0
  81. data/app/components/blacklight/icons/bookmark_component.rb +12 -0
  82. data/app/components/blacklight/icons/collection_component.rb +14 -0
  83. data/app/components/blacklight/icons/compact_component.rb +12 -0
  84. data/app/components/blacklight/icons/container_component.rb +14 -0
  85. data/app/components/blacklight/icons/ead_component.rb +12 -0
  86. data/app/components/blacklight/icons/file_component.rb +14 -0
  87. data/app/components/blacklight/icons/folder_component.rb +12 -0
  88. data/app/components/blacklight/icons/online_component.rb +15 -0
  89. data/app/components/blacklight/icons/pdf_component.rb +12 -0
  90. data/app/components/blacklight/icons/repository_component.rb +12 -0
  91. data/app/controllers/arclight/repositories_controller.rb +4 -4
  92. data/app/{controllers/concerns → helpers}/arclight/ead_format_helpers.rb +4 -7
  93. data/app/helpers/arclight/field_config_helpers.rb +26 -0
  94. data/app/helpers/arclight_helper.rb +16 -254
  95. data/app/models/arclight/document_downloads.rb +12 -15
  96. data/app/models/arclight/parent.rb +5 -0
  97. data/app/models/arclight/parents.rb +2 -1
  98. data/app/models/arclight/requests/aeon_external_request.rb +1 -1
  99. data/app/models/arclight/requests/aeon_web_ead.rb +8 -3
  100. data/app/models/arclight/requests/google_form.rb +8 -3
  101. data/app/models/concerns/arclight/catalog.rb +25 -15
  102. data/app/models/concerns/arclight/search_behavior.rb +12 -26
  103. data/app/models/concerns/arclight/solr_document.rb +70 -73
  104. data/app/presenters/arclight/show_presenter.rb +34 -7
  105. data/app/views/arclight/_requests.html.erb +2 -2
  106. data/app/views/arclight/repositories/_repository.html.erb +21 -40
  107. data/app/views/arclight/repositories/index.html.erb +3 -1
  108. data/app/views/arclight/repositories/show.html.erb +4 -6
  109. data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +4 -5
  110. data/app/views/arclight/requests/_aeon_web_ead.html.erb +3 -4
  111. data/app/views/arclight/requests/_google_form.html.erb +4 -6
  112. data/app/views/catalog/_group.html.erb +1 -18
  113. data/app/views/catalog/_group_toggle.html.erb +1 -1
  114. data/app/views/catalog/_search_results_header.html.erb +3 -0
  115. data/app/views/catalog/hierarchy.html.erb +19 -0
  116. data/app/views/catalog/index.html.erb +16 -7
  117. data/app/views/shared/_breadcrumbs.html.erb +2 -14
  118. data/app/views/shared/_main_menu_links.html.erb +1 -1
  119. data/arclight.gemspec +13 -11
  120. data/config/breadcrumbs.rb +24 -0
  121. data/config/i18n-tasks.yml +9 -8
  122. data/config/importmap.rb +3 -0
  123. data/config/locales/arclight.en.yml +31 -30
  124. data/config/routes.rb +1 -1
  125. data/docker-compose.yml +16 -0
  126. data/lib/arclight/digital_object.rb +2 -1
  127. data/lib/arclight/engine.rb +18 -37
  128. data/lib/arclight/exceptions.rb +1 -0
  129. data/lib/arclight/hash_absolute_xpath.rb +2 -1
  130. data/lib/arclight/normalized_id.rb +2 -0
  131. data/lib/arclight/normalized_title.rb +2 -0
  132. data/lib/arclight/repository.rb +45 -56
  133. data/lib/arclight/routes/hierarchy.rb +19 -0
  134. data/lib/arclight/routes.rb +8 -0
  135. data/lib/arclight/traject/ead2_component_config.rb +292 -0
  136. data/lib/arclight/traject/ead2_config.rb +66 -287
  137. data/lib/arclight/version.rb +1 -1
  138. data/lib/arclight/year_range.rb +4 -3
  139. data/lib/arclight.rb +6 -1
  140. data/lib/generators/arclight/install_generator.rb +59 -21
  141. data/lib/generators/arclight/templates/arclight.scss +4 -3
  142. data/lib/generators/arclight/templates/catalog_controller.rb +150 -165
  143. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +53 -0
  144. data/lib/generators/arclight/templates/config/repositories.yml +20 -27
  145. data/lib/tasks/index.rake +14 -17
  146. data/package.json +11 -13
  147. data/solr/conf/schema.xml +42 -38
  148. data/solr/conf/solrconfig.xml +34 -31
  149. data/tasks/arclight.rake +8 -7
  150. data/template.rb +1 -2
  151. metadata +147 -120
  152. data/.babelrc +0 -3
  153. data/app/assets/javascripts/arclight/collection_navigation.js +0 -100
  154. data/app/assets/javascripts/arclight/collection_scrollspy.js +0 -6
  155. data/app/assets/javascripts/arclight/context_navigation.js +0 -351
  156. data/app/assets/javascripts/arclight/truncator.js.erb +0 -29
  157. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -26
  158. data/app/assets/stylesheets/arclight/modules/context_navigation.scss +0 -75
  159. data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -102
  160. data/app/factories/blacklight_field_configuration_factory.rb +0 -30
  161. data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
  162. data/app/views/arclight/repositories/_repository_contact.html.erb +0 -9
  163. data/app/views/arclight/viewers/_oembed.html.erb +0 -8
  164. data/app/views/catalog/_access_contents.html.erb +0 -15
  165. data/app/views/catalog/_arclight_abstract_or_scope.html.erb +0 -5
  166. data/app/views/catalog/_arclight_bookmark_control.html.erb +0 -38
  167. data/app/views/catalog/_arclight_document_header_icon.html.erb +0 -1
  168. data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
  169. data/app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb +0 -0
  170. data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
  171. data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -22
  172. data/app/views/catalog/_arclight_index_default.html.erb +0 -45
  173. data/app/views/catalog/_arclight_index_group_document_compact_default.html.erb +0 -19
  174. data/app/views/catalog/_arclight_index_group_document_default.html.erb +0 -18
  175. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -3
  176. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  177. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  178. data/app/views/catalog/_collection_contents.html.erb +0 -4
  179. data/app/views/catalog/_collection_context.html.erb +0 -15
  180. data/app/views/catalog/_collection_context_nav.html.erb +0 -12
  181. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  182. data/app/views/catalog/_component_context.html.erb +0 -5
  183. data/app/views/catalog/_containers.html.erb +0 -3
  184. data/app/views/catalog/_context_card.html.erb +0 -27
  185. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  186. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  187. data/app/views/catalog/_document_downloads.html.erb +0 -14
  188. data/app/views/catalog/_group_header_compact_default.html.erb +0 -15
  189. data/app/views/catalog/_group_header_default.html.erb +0 -20
  190. data/app/views/catalog/_home.html.erb +0 -1
  191. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -6
  192. data/app/views/catalog/_index_collection_context_default.html.erb +0 -53
  193. data/app/views/catalog/_index_default.html.erb +0 -17
  194. data/app/views/catalog/_index_header.html.erb +0 -7
  195. data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
  196. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  197. data/app/views/catalog/_online_content_label.html.erb +0 -5
  198. data/app/views/catalog/_search_form.html.erb +0 -34
  199. data/app/views/catalog/_search_results.html.erb +0 -28
  200. data/app/views/catalog/_show_actions_box_default.html.erb +0 -27
  201. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -6
  202. data/app/views/catalog/_show_collection.html.erb +0 -66
  203. data/app/views/catalog/_show_default.html.erb +0 -70
  204. data/app/views/catalog/_show_upper_metadata_collection.html.erb +0 -1
  205. data/app/views/catalog/_show_upper_metadata_default.html.erb +0 -14
  206. data/app/views/catalog/_sort_and_per_page.html.erb +0 -8
  207. data/app/views/catalog/_within_collection_dropdown.html.erb +0 -26
  208. data/app/views/layouts/catalog_result.html.erb +0 -7
  209. data/app/views/shared/_context_sidebar.html.erb +0 -8
  210. data/app/views/shared/_header_navbar.html.erb +0 -61
  211. data/app/views/shared/_show_breadcrumbs.html.erb +0 -27
  212. data/lib/arclight/viewer.rb +0 -45
  213. data/lib/arclight/viewers/oembed.rb +0 -57
  214. data/solr/conf/scripts.conf +0 -24
  215. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  216. data/vendor/assets/javascripts/stickyfill.js +0 -480
@@ -4,8 +4,30 @@ 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 :parent_ids, :array, 'parent_ssim'
11
+ attribute :parent_labels, :array, 'parent_unittitles_ssm'
12
+ attribute :parent_levels, :array, 'parent_levels_ssm'
13
+ attribute :unitid, :string, 'unitid_ssm'
14
+ attribute :extent, :string, 'extent_ssm'
15
+ attribute :abstract, :string, 'abstract_html_tesm'
16
+ attribute :scope, :string, 'scopecontent_html_tesm'
17
+ attribute :creator, :string, 'creator_ssm'
18
+ attribute :level, :string, 'level_ssm'
19
+ attribute :terms, :string, 'userestrict_html_tesm'
20
+ # Restrictions for component sidebar
21
+ attribute :parent_restrictions, :string, 'parent_access_restrict_tesm'
22
+ # Terms for component sidebar
23
+ attribute :parent_terms, :string, 'parent_access_terms_tesm'
24
+ attribute :reference, :string, 'ref_ssm'
25
+ attribute :normalized_title, :string, 'normalized_title_ssm'
26
+ attribute :normalized_date, :string, 'normalized_date_ssm'
27
+ attribute :total_component_count, :string, 'total_component_count_is'
28
+ attribute :online_item_count, :string, 'online_item_count_is'
29
+ attribute :last_indexed, :date, 'timestamp'
30
+ end
9
31
 
10
32
  def repository_config
11
33
  return unless repository
@@ -13,61 +35,50 @@ module Arclight
13
35
  @repository_config ||= Arclight::Repository.find_by(name: repository)
14
36
  end
15
37
 
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
38
+ def parents
39
+ @parents ||= Arclight::Parents.from_solr_document(self).as_parents
30
40
  end
31
41
 
42
+ # Get this document's EAD ID, or fall back to the collection (especially
43
+ # for components that may not have their own.
32
44
  def eadid
33
- fetch('ead_ssi', nil)&.strip
45
+ first('ead_ssi')&.strip || collection&.first('ead_ssi')&.strip
34
46
  end
35
47
 
36
- def unitid
37
- first('unitid_ssm')
48
+ def normalized_eadid
49
+ Arclight::NormalizedId.new(eadid).to_s
38
50
  end
39
51
 
40
52
  def repository
41
- first('repository_ssm')
53
+ first('repository_ssm') || collection&.first('repository_ssm')
42
54
  end
43
55
 
44
56
  def repository_and_unitid
45
57
  [repository, unitid].compact.join(': ')
46
58
  end
47
59
 
48
- def collection_name
49
- first('collection_ssm')
50
- end
60
+ # @return [SolrDocument] a SolrDocument representing the EAD collection
61
+ # that this document belongs to
62
+ def collection
63
+ return self if collection?
51
64
 
52
- def collection_unitid
53
- first('collection_unitid_ssm')
65
+ @collection ||= self.class.new(self['collection']&.dig('docs', 0), @response)
54
66
  end
55
67
 
56
- def extent
57
- first('extent_ssm')
68
+ def collection_name
69
+ collection&.normalized_title
58
70
  end
59
71
 
60
- def abstract_or_scope
61
- value = first('abstract_ssm') || first('scopecontent_ssm')
62
- render_html_tags(value: [value]) if value.present?
72
+ def collection_unitid
73
+ collection&.unitid
63
74
  end
64
75
 
65
- def creator
66
- first('creator_ssm')
76
+ def abstract_or_scope
77
+ abstract || scope
67
78
  end
68
79
 
69
80
  def collection_creator
70
- first('collection_creator_ssm')
81
+ collection&.creator
71
82
  end
72
83
 
73
84
  def online_content?
@@ -75,41 +86,19 @@ module Arclight
75
86
  end
76
87
 
77
88
  def number_of_children
78
- first('child_component_count_isim') || 0
89
+ first('child_component_count_isi') || 0
79
90
  end
80
91
 
81
92
  def children?
82
93
  number_of_children.positive?
83
94
  end
84
95
 
85
- def reference
86
- first('ref_ssm')
87
- end
88
-
89
96
  def component_level
90
97
  first('component_level_isim')
91
98
  end
92
99
 
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')])
100
+ def collection?
101
+ level&.parameterize == 'collection'
113
102
  end
114
103
 
115
104
  def digital_objects
@@ -122,26 +111,13 @@ module Arclight
122
111
  end
123
112
 
124
113
  def containers
125
- # note that .titlecase strips punctuation, like hyphens, we want to keep
114
+ # NOTE: that .titlecase strips punctuation, like hyphens, we want to keep
126
115
  fetch('containers_ssim', []).map(&:capitalize)
127
116
  end
128
117
 
129
- def normalized_title
130
- first('normalized_title_ssm')
131
- end
132
-
133
- def normalized_date
134
- first('normalized_date_ssm')
135
- end
136
-
137
118
  # @return [Array<String>] with embedded highlights using <em>...</em>
138
119
  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]
120
+ highlight_field(CatalogController.blacklight_config.highlight_field)
145
121
  end
146
122
 
147
123
  # Factory method for constructing the Object modeling downloads
@@ -149,5 +125,26 @@ module Arclight
149
125
  def downloads
150
126
  @downloads ||= DocumentDownloads.new(self)
151
127
  end
128
+
129
+ def ead_file
130
+ @ead_file ||= begin
131
+ files = Arclight::DocumentDownloads.new(self, collection_unitid).files
132
+ files.find do |file|
133
+ file.type == 'ead'
134
+ end
135
+ end
136
+ end
137
+
138
+ def nest_path
139
+ self['_nest_path_']
140
+ end
141
+
142
+ def root
143
+ self['_root_'] || self['id']
144
+ end
145
+
146
+ def requestable?
147
+ repository_config&.request_types&.any?
148
+ end
152
149
  end
153
150
  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 %>
@@ -1,21 +1,4 @@
1
1
  <% # container for all groups in index view -%>
2
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 %>
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 ml-3 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
@@ -12,31 +12,33 @@ Gem::Specification.new do |spec|
12
12
 
13
13
  spec.summary = ''
14
14
  spec.description = ''
15
- spec.homepage = 'https://github.com/sul-dlss/arclight'
15
+ spec.homepage = 'https://github.com/projectblacklight/arclight'
16
16
  spec.license = 'Apache-2.0'
17
17
 
18
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ spec.required_ruby_version = '>= 3.0.0'
19
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
20
  f.match(%r{^(test|spec|features)/})
20
21
  end
21
22
  spec.bindir = 'exe'
22
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
24
  spec.require_paths = ['lib']
24
25
 
25
- spec.add_dependency 'blacklight', '~> 7.2'
26
- spec.add_dependency 'blacklight_range_limit', '~> 7.1'
27
- spec.add_dependency 'rails', '>= 5.2.3', '< 6.2'
28
- spec.add_dependency 'sprockets-bumble_d'
26
+ spec.add_dependency 'blacklight', '>= 8.0.0.beta', '< 9'
27
+ spec.add_dependency 'gretel'
28
+ spec.add_dependency 'rails', '~> 7.0'
29
29
  spec.add_dependency 'traject', '~> 3.0'
30
- spec.add_dependency 'traject_plus', '~> 1.2'
30
+ spec.add_dependency 'traject_plus', '~> 2.0'
31
31
 
32
- spec.add_development_dependency 'bundler', '> 1.14'
32
+ spec.add_development_dependency 'bundler'
33
33
  spec.add_development_dependency 'capybara'
34
34
  spec.add_development_dependency 'engine_cart'
35
35
  spec.add_development_dependency 'i18n-tasks'
36
- spec.add_development_dependency 'rake', '~> 12.0'
36
+ spec.add_development_dependency 'rake', '>= 12.0'
37
37
  spec.add_development_dependency 'rspec-rails'
38
- spec.add_development_dependency 'rubocop', '~> 0.74.0'
39
- spec.add_development_dependency 'rubocop-rspec', '~> 1.35'
38
+ spec.add_development_dependency 'rubocop', '~> 1.8'
39
+ spec.add_development_dependency 'rubocop-rails', '~> 2.8'
40
+ spec.add_development_dependency 'rubocop-rake'
41
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
40
42
  spec.add_development_dependency 'selenium-webdriver'
41
43
  spec.add_development_dependency 'simplecov'
42
44
  spec.add_development_dependency 'solr_wrapper'
@@ -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)