arclight 0.5.0 → 1.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc +11 -4
  3. data/.github/workflows/ruby.yml +24 -11
  4. data/.rspec +0 -1
  5. data/.rubocop.yml +286 -2
  6. data/.rubocop_todo.yml +18 -195
  7. data/CONTRIBUTING.md +5 -5
  8. data/Gemfile +12 -12
  9. data/README.md +18 -12
  10. data/app/assets/javascripts/arclight/arclight.js +4 -8
  11. data/app/assets/javascripts/arclight/oembed_controller.js +64 -0
  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 +120 -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 +18 -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 +15 -253
  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 +2 -3
  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 +7 -6
  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 -31
  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 +43 -54
  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 +57 -21
  141. data/lib/generators/arclight/templates/arclight.scss +5 -3
  142. data/lib/generators/arclight/templates/catalog_controller.rb +150 -169
  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 +40 -36
  148. data/solr/conf/solrconfig.xml +33 -31
  149. data/tasks/arclight.rake +8 -7
  150. data/template.rb +0 -1
  151. metadata +113 -106
  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/oembed_viewer.js +0 -46
  157. data/app/assets/javascripts/arclight/truncator.js.erb +0 -29
  158. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +0 -26
  159. data/app/assets/stylesheets/arclight/modules/context_navigation.scss +0 -75
  160. data/app/controllers/concerns/arclight/field_config_helpers.rb +0 -102
  161. data/app/factories/blacklight_field_configuration_factory.rb +0 -30
  162. data/app/views/arclight/repositories/_in_person_repository.html.erb +0 -19
  163. data/app/views/arclight/repositories/_repository_contact.html.erb +0 -9
  164. data/app/views/arclight/viewers/_oembed.html.erb +0 -8
  165. data/app/views/catalog/_access_contents.html.erb +0 -15
  166. data/app/views/catalog/_arclight_abstract_or_scope.html.erb +0 -5
  167. data/app/views/catalog/_arclight_bookmark_control.html.erb +0 -38
  168. data/app/views/catalog/_arclight_document_header_icon.html.erb +0 -1
  169. data/app/views/catalog/_arclight_document_index_header.html.erb +0 -13
  170. data/app/views/catalog/_arclight_document_index_header_hierarchy_default.html.erb +0 -0
  171. data/app/views/catalog/_arclight_document_index_header_online_contents_default.html.erb +0 -0
  172. data/app/views/catalog/_arclight_index_compact_default.html.erb +0 -22
  173. data/app/views/catalog/_arclight_index_default.html.erb +0 -45
  174. data/app/views/catalog/_arclight_index_group_document_compact_default.html.erb +0 -19
  175. data/app/views/catalog/_arclight_index_group_document_default.html.erb +0 -18
  176. data/app/views/catalog/_arclight_online_content_indicator.html.erb +0 -3
  177. data/app/views/catalog/_arclight_rangelimit.html.erb +0 -24
  178. data/app/views/catalog/_arclight_viewer_default.html.erb +0 -1
  179. data/app/views/catalog/_collection_contents.html.erb +0 -4
  180. data/app/views/catalog/_collection_context.html.erb +0 -15
  181. data/app/views/catalog/_collection_context_nav.html.erb +0 -12
  182. data/app/views/catalog/_collection_online_contents.html.erb +0 -17
  183. data/app/views/catalog/_component_context.html.erb +0 -5
  184. data/app/views/catalog/_containers.html.erb +0 -3
  185. data/app/views/catalog/_context_card.html.erb +0 -27
  186. data/app/views/catalog/_context_sidebar.html.erb +0 -8
  187. data/app/views/catalog/_custom_metadata.html.erb +0 -16
  188. data/app/views/catalog/_document_downloads.html.erb +0 -14
  189. data/app/views/catalog/_group_header_compact_default.html.erb +0 -15
  190. data/app/views/catalog/_group_header_default.html.erb +0 -20
  191. data/app/views/catalog/_home.html.erb +0 -1
  192. data/app/views/catalog/_index_breadcrumb_default.html.erb +0 -6
  193. data/app/views/catalog/_index_collection_context_default.html.erb +0 -53
  194. data/app/views/catalog/_index_default.html.erb +0 -17
  195. data/app/views/catalog/_index_header.html.erb +0 -7
  196. data/app/views/catalog/_index_header_online_contents_default.html.erb +0 -1
  197. data/app/views/catalog/_index_online_contents_default.html.erb +0 -6
  198. data/app/views/catalog/_online_content_label.html.erb +0 -5
  199. data/app/views/catalog/_search_form.html.erb +0 -38
  200. data/app/views/catalog/_search_results.html.erb +0 -28
  201. data/app/views/catalog/_show_actions_box_default.html.erb +0 -27
  202. data/app/views/catalog/_show_breadcrumbs_default.html.erb +0 -6
  203. data/app/views/catalog/_show_collection.html.erb +0 -66
  204. data/app/views/catalog/_show_default.html.erb +0 -70
  205. data/app/views/catalog/_show_upper_metadata_collection.html.erb +0 -1
  206. data/app/views/catalog/_show_upper_metadata_default.html.erb +0 -14
  207. data/app/views/catalog/_sort_and_per_page.html.erb +0 -8
  208. data/app/views/catalog/_within_collection_dropdown.html.erb +0 -26
  209. data/app/views/layouts/catalog_result.html.erb +0 -7
  210. data/app/views/shared/_context_sidebar.html.erb +0 -8
  211. data/app/views/shared/_header_navbar.html.erb +0 -61
  212. data/app/views/shared/_show_breadcrumbs.html.erb +0 -27
  213. data/lib/arclight/viewer.rb +0 -45
  214. data/lib/arclight/viewers/oembed.rb +0 -57
  215. data/solr/conf/scripts.conf +0 -24
  216. data/vendor/assets/javascripts/responsiveTruncator.js +0 -69
  217. data/vendor/assets/javascripts/stickyfill.js +0 -480
  218. /data/app/assets/images/{blacklight → arclight}/logo.png +0 -0
@@ -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
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,20 +12,20 @@ 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', '< 9'
27
- spec.add_dependency 'rails', '>= 6', '< 7.1'
28
- spec.add_dependency 'rexml'
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
30
  spec.add_dependency 'traject_plus', '~> 2.0'
31
31
 
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'rspec-rails'
38
38
  spec.add_development_dependency 'rubocop', '~> 1.8'
39
39
  spec.add_development_dependency 'rubocop-rails', '~> 2.8'
40
+ spec.add_development_dependency 'rubocop-rake'
40
41
  spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
41
42
  spec.add_development_dependency 'selenium-webdriver'
42
43
  spec.add_development_dependency 'simplecov'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Root crumb
4
+ crumb :root do
5
+ link t('arclight.routes.home'), root_path
6
+ end
7
+
8
+ crumb :repositories do
9
+ link t('arclight.routes.repositories'), arclight_engine.repositories_path
10
+ end
11
+
12
+ crumb :repository do |repository|
13
+ link repository.name, arclight_engine.repository_path(repository.slug)
14
+
15
+ parent :repositories
16
+ end
17
+
18
+ crumb :search_results do |search_state|
19
+ if search_state.filter('level').values == ['Collection']
20
+ link t('arclight.routes.collections')
21
+ else
22
+ link t('arclight.routes.search_results')
23
+ end
24
+ end
@@ -53,16 +53,17 @@ data:
53
53
  # Find translate calls
54
54
  search:
55
55
  ## Paths or `File.find` patterns to search in:
56
- # paths:
57
- # - app/
56
+ paths:
57
+ - app/
58
+ - config/breadcrumbs.rb
58
59
 
59
60
  ## Root directories for relative keys resolution.
60
- # relative_roots:
61
- # - app/controllers
62
- # - app/helpers
63
- # - app/mailers
64
- # - app/presenters
65
- # - app/views
61
+ relative_roots:
62
+ - app/components
63
+ - app/controllers
64
+ - app/helpers
65
+ - app/presenters
66
+ - app/views
66
67
 
67
68
  ## Files or `File.fnmatch` patterns to exclude from search. Some files are always excluded regardless of this setting:
68
69
  ## %w(*.jpg *.png *.gif *.svg *.ico *.eot *.otf *.ttf *.woff *.woff2 *.pdf *.css *.sass *.scss *.less *.yml *.json)
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ pin_all_from File.expand_path('../app/assets/javascript', __dir__)