arclight 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.all-contributorsrc +450 -0
  3. data/.babelrc +3 -0
  4. data/.codeclimate.yml +5 -0
  5. data/.eslintrc +3 -0
  6. data/.rubocop.yml +19 -0
  7. data/.rubocop_todo.yml +15 -135
  8. data/.travis.yml +2 -2
  9. data/CONTRIBUTORS.md +79 -0
  10. data/README.md +21 -24
  11. data/Rakefile +0 -1
  12. data/app/assets/images/blacklight/bookmark.svg +1 -0
  13. data/app/assets/images/blacklight/collection.svg +5 -0
  14. data/app/assets/images/blacklight/compact.svg +1 -25
  15. data/app/assets/images/blacklight/container.svg +5 -0
  16. data/app/assets/images/blacklight/ead.svg +1 -0
  17. data/app/assets/images/blacklight/file.svg +5 -0
  18. data/app/assets/images/blacklight/folder.svg +1 -0
  19. data/app/assets/images/blacklight/list.svg +1 -0
  20. data/app/assets/images/blacklight/minus.svg +1 -0
  21. data/app/assets/images/blacklight/online.svg +5 -0
  22. data/app/assets/images/blacklight/pdf.svg +1 -0
  23. data/app/assets/images/blacklight/plus.svg +1 -0
  24. data/app/assets/images/blacklight/repository.svg +1 -0
  25. data/app/assets/javascripts/arclight/arclight.js +1 -3
  26. data/app/assets/javascripts/arclight/collection_navigation.js +36 -53
  27. data/app/assets/javascripts/arclight/collection_scrollspy.js +1 -1
  28. data/app/assets/javascripts/arclight/context_navigation.js +374 -0
  29. data/app/assets/javascripts/arclight/truncator.js.erb +8 -2
  30. data/app/assets/stylesheets/arclight/application.scss +3 -1
  31. data/app/assets/stylesheets/arclight/bootstrap_overrides.scss +23 -0
  32. data/app/assets/stylesheets/arclight/modules/context_navigation.scss +75 -0
  33. data/app/assets/stylesheets/arclight/modules/hierarchy_and_online_contents.scss +28 -35
  34. data/app/assets/stylesheets/arclight/modules/highlights.scss +2 -1
  35. data/app/assets/stylesheets/arclight/modules/layout.scss +128 -14
  36. data/app/assets/stylesheets/arclight/modules/mastheads.scss +27 -5
  37. data/app/assets/stylesheets/arclight/modules/repositories.scss +1 -5
  38. data/app/assets/stylesheets/arclight/modules/repository_card.scss +6 -7
  39. data/app/assets/stylesheets/arclight/modules/search_results.scss +145 -24
  40. data/app/assets/stylesheets/arclight/modules/show_collection.scss +38 -59
  41. data/app/assets/stylesheets/arclight/responsive.scss +13 -0
  42. data/app/assets/stylesheets/arclight/variables.scss +21 -1
  43. data/app/controllers/concerns/arclight/ead_format_helpers.rb +225 -0
  44. data/app/controllers/concerns/arclight/field_config_helpers.rb +23 -7
  45. data/app/factories/blacklight_field_configuration_factory.rb +1 -0
  46. data/app/helpers/arclight_helper.rb +197 -35
  47. data/app/models/arclight/document_downloads.rb +125 -0
  48. data/app/models/arclight/parent.rb +4 -2
  49. data/app/models/arclight/parents.rb +6 -4
  50. data/app/models/arclight/requests/aeon_external_request.rb +42 -0
  51. data/app/models/arclight/requests/aeon_web_ead.rb +47 -0
  52. data/app/models/arclight/requests/google_form.rb +2 -2
  53. data/app/models/concerns/arclight/catalog.rb +14 -2
  54. data/app/models/concerns/arclight/search_behavior.rb +27 -12
  55. data/app/models/concerns/arclight/solr_document.rb +29 -7
  56. data/app/views/arclight/_requests.html.erb +7 -0
  57. data/app/views/arclight/repositories/_in_person_repository.html.erb +1 -1
  58. data/app/views/arclight/repositories/_repository.html.erb +2 -2
  59. data/app/views/arclight/repositories/_repository_contact.html.erb +9 -0
  60. data/app/views/arclight/repositories/index.html.erb +3 -0
  61. data/app/views/arclight/repositories/show.html.erb +5 -4
  62. data/app/views/arclight/requests/_aeon_external_request_endpoint.html.erb +9 -0
  63. data/app/views/arclight/requests/_aeon_web_ead.html.erb +7 -0
  64. data/app/views/arclight/requests/_google_form.html.erb +2 -1
  65. data/app/views/arclight/viewers/_oembed.html.erb +2 -1
  66. data/app/views/catalog/_access_contents.html.erb +15 -0
  67. data/app/views/catalog/_arclight_abstract_or_scope.html.erb +5 -0
  68. data/app/views/catalog/_arclight_bookmark_control.html.erb +38 -0
  69. data/app/views/catalog/_arclight_document_header_icon.html.erb +1 -0
  70. data/app/views/catalog/_arclight_index_compact_default.html.erb +18 -11
  71. data/app/views/catalog/_arclight_index_default.html.erb +45 -0
  72. data/app/views/catalog/_arclight_index_group_document_compact_default.html.erb +19 -0
  73. data/app/views/catalog/_arclight_index_group_document_default.html.erb +18 -0
  74. data/app/views/catalog/_arclight_online_content_indicator.html.erb +1 -3
  75. data/app/views/catalog/_collection_contents.html.erb +2 -10
  76. data/app/views/catalog/_collection_context.html.erb +15 -0
  77. data/app/views/catalog/_collection_context_nav.html.erb +12 -0
  78. data/app/views/catalog/_collection_online_contents.html.erb +3 -3
  79. data/app/views/catalog/_component_context.html.erb +5 -0
  80. data/app/views/catalog/_containers.html.erb +3 -0
  81. data/app/views/catalog/_context_sidebar.html.erb +2 -2
  82. data/app/views/catalog/_document_downloads.html.erb +14 -0
  83. data/app/views/catalog/_group.html.erb +21 -0
  84. data/app/views/catalog/_group_header_compact_default.html.erb +15 -0
  85. data/app/views/catalog/_group_header_default.html.erb +20 -0
  86. data/app/views/catalog/_group_toggle.html.erb +10 -0
  87. data/app/views/catalog/_home.html.erb +1 -1
  88. data/app/views/catalog/_index_breadcrumb_default.html.erb +5 -2
  89. data/app/views/catalog/_index_collection_context_default.html.erb +53 -0
  90. data/app/views/catalog/_index_header.html.erb +3 -3
  91. data/app/views/catalog/_index_online_contents_default.html.erb +1 -1
  92. data/app/views/catalog/_online_content_label.html.erb +5 -0
  93. data/app/views/catalog/_search_form.html.erb +34 -0
  94. data/app/views/catalog/_search_results.html.erb +1 -4
  95. data/app/views/catalog/_show_actions_box_default.html.erb +27 -0
  96. data/app/views/catalog/_show_breadcrumbs_default.html.erb +5 -20
  97. data/app/views/catalog/_show_collection.html.erb +42 -24
  98. data/app/views/catalog/_show_default.html.erb +63 -35
  99. data/app/views/catalog/_show_upper_metadata_default.html.erb +1 -1
  100. data/app/views/catalog/_sort_and_per_page.html.erb +8 -0
  101. data/app/views/catalog/_within_collection_dropdown.html.erb +26 -0
  102. data/app/views/shared/_breadcrumbs.html.erb +4 -4
  103. data/app/views/shared/_context_sidebar.html.erb +2 -2
  104. data/app/views/shared/_header_navbar.html.erb +13 -17
  105. data/app/views/shared/_show_breadcrumbs.html.erb +27 -0
  106. data/arclight.gemspec +5 -6
  107. data/config/i18n-tasks.yml +2 -1
  108. data/config/locales/arclight.en.yml +54 -21
  109. data/config/repositories.yml +0 -0
  110. data/lib/arclight/engine.rb +22 -12
  111. data/lib/arclight/hash_absolute_xpath.rb +11 -7
  112. data/lib/arclight/level_label.rb +46 -0
  113. data/lib/arclight/normalized_date.rb +2 -2
  114. data/lib/arclight/normalized_id.rb +1 -0
  115. data/lib/arclight/normalized_title.rb +1 -0
  116. data/lib/arclight/repository.rb +58 -5
  117. data/lib/arclight/traject/ead2_config.rb +178 -159
  118. data/lib/arclight/traject/nokogiri_namespaceless_reader.rb +22 -0
  119. data/lib/arclight/version.rb +1 -1
  120. data/lib/arclight/viewers/oembed.rb +1 -0
  121. data/lib/arclight/year_range.rb +9 -1
  122. data/lib/generators/arclight/install_generator.rb +5 -1
  123. data/lib/generators/arclight/templates/catalog_controller.rb +128 -100
  124. data/lib/generators/arclight/templates/config/downloads.yml +12 -0
  125. data/lib/generators/arclight/templates/config/repositories.yml +20 -2
  126. data/lib/generators/arclight/update_generator.rb +1 -1
  127. data/lib/tasks/index.rake +18 -20
  128. data/package.json +8 -1
  129. data/solr/conf/schema.xml +51 -292
  130. data/solr/conf/solrconfig.xml +40 -125
  131. data/tasks/arclight.rake +1 -0
  132. data/vendor/assets/javascripts/responsiveTruncator.js +2 -2
  133. metadata +71 -44
  134. data/app/assets/javascripts/arclight/collection_context.js +0 -18
  135. data/app/assets/javascripts/arclight/component_ancestors.js +0 -56
  136. data/app/assets/javascripts/arclight/search_results.js +0 -15
  137. data/app/assets/stylesheets/arclight/modules/sidebar.scss +0 -21
  138. data/app/views/catalog/_collection_count.html.erb +0 -7
  139. data/app/views/catalog/_collection_downloads.html.erb +0 -15
  140. data/app/views/catalog/_collection_overview.html.erb +0 -7
  141. data/app/views/catalog/_component_contents.html.erb +0 -16
  142. data/app/views/catalog/_component_overview.html.erb +0 -40
  143. data/app/views/catalog/_index_header_hierarchy_default.html.erb +0 -42
  144. data/app/views/catalog/_index_hierarchy_default.html.erb +0 -28
  145. data/app/views/catalog/_results_histogram.html.erb +0 -15
  146. data/app/views/catalog/_show_component_sidebar.html.erb +0 -12
  147. data/app/views/catalog/_show_sidebar.html.erb +0 -22
  148. data/lib/arclight/custom_component.rb +0 -99
  149. data/lib/arclight/custom_document.rb +0 -93
  150. data/lib/arclight/indexer.rb +0 -9
  151. data/lib/arclight/shared_indexing_behavior.rb +0 -97
  152. data/lib/arclight/shared_terminology_behavior.rb +0 -65
  153. data/lib/arclight/solr_ead_indexer_ext.rb +0 -155
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ ##
5
+ # Model the Download links that can be configured (via YAML) for a collection
6
+ # or container
7
+ class DocumentDownloads
8
+ attr_reader :document
9
+
10
+ def initialize(document, id = nil)
11
+ @document = document
12
+ @id = id
13
+ end
14
+
15
+ # Accessor for the ID
16
+ # @return [String]
17
+ def id
18
+ @id || document.unitid
19
+ end
20
+
21
+ # Factory method for the File objects
22
+ # @return [Array<Arclight::DocumentDownloads::File>]
23
+ def files
24
+ data = self.class.config[id] || self.class.config['default']
25
+ disabled = data.delete('disabled')
26
+ return [] if disabled
27
+
28
+ @files ||= data.map do |file_type, file_data|
29
+ self.class.file_class.new(type: file_type, data: file_data, document: document)
30
+ end.compact
31
+ end
32
+
33
+ def to_partial_path
34
+ 'catalog/document_downloads'
35
+ end
36
+
37
+ class << self
38
+ def config
39
+ @config ||= begin
40
+ YAML.safe_load(::File.read(config_filename))
41
+ rescue Errno::ENOENT
42
+ {}
43
+ end
44
+ end
45
+
46
+ def config_filename
47
+ Rails.root.join('config', 'downloads.yml')
48
+ end
49
+
50
+ # Accessor for the File Class
51
+ # @return [Class]
52
+ def file_class
53
+ File
54
+ end
55
+ end
56
+
57
+ ##
58
+ # Model a single file configured in downloads.yml
59
+ class File
60
+ attr_reader :type, :document
61
+ def initialize(type:, data:, document:)
62
+ @type = type
63
+ @data = data
64
+ @document = document
65
+ end
66
+
67
+ def href
68
+ return data['href'] if data['href']
69
+
70
+ format_template
71
+ end
72
+
73
+ def size
74
+ return data['size'] if data['size']
75
+
76
+ document.send(data['size_accessor'].to_sym) if data['size_accessor']
77
+ end
78
+
79
+ private
80
+
81
+ attr_reader :data
82
+
83
+ def format_template
84
+ return unless template
85
+
86
+ template % template_interpolations
87
+ end
88
+
89
+ def template
90
+ data['template']
91
+ end
92
+
93
+ def template_interpolations
94
+ escaped_document_interpolations.merge(custom_interpolations).symbolize_keys
95
+ end
96
+
97
+ def custom_interpolations
98
+ { 'repository_id' => document.repository_config&.slug }
99
+ end
100
+
101
+ def template_variables
102
+ data['template'].scan(/%{(\w+)}/).flatten.uniq
103
+ end
104
+
105
+ def escaped_document_interpolations
106
+ non_custom_template_variables.map do |method_name|
107
+ [method_name, escape_non_url_doc_value(document.send(method_name))]
108
+ end.to_h
109
+ end
110
+
111
+ def escape_non_url_doc_value(value)
112
+ value = Array.wrap(value).first || '' # Handle single values/arrays and nil
113
+ return value if value.start_with?(/https?:/)
114
+
115
+ CGI.escape(value)
116
+ end
117
+
118
+ def non_custom_template_variables
119
+ template_variables.reject do |v|
120
+ custom_interpolations.keys.include?(v)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -5,11 +5,12 @@ module Arclight
5
5
  # Logic containing information about Solr_Ead "Parent"
6
6
  # https://github.com/awead/solr_ead/blob/8cf7ffaa66e0e4c9c0b12f5646d6c2e20984cd99/lib/solr_ead/behaviors.rb#L54-L57
7
7
  class Parent
8
- attr_reader :id, :label, :eadid
9
- def initialize(id:, label:, eadid:)
8
+ attr_reader :id, :label, :eadid, :level
9
+ def initialize(id:, label:, eadid:, level:)
10
10
  @id = id
11
11
  @label = label
12
12
  @eadid = eadid
13
+ @level = level
13
14
  end
14
15
 
15
16
  ##
@@ -18,6 +19,7 @@ module Arclight
18
19
  # @return [String]
19
20
  def global_id
20
21
  return id if eadid == id
22
+
21
23
  "#{eadid}#{id}"
22
24
  end
23
25
  end
@@ -5,11 +5,12 @@ module Arclight
5
5
  # Object for parsing and formalizing Solr_Ead "Parents"
6
6
  # https://github.com/awead/solr_ead/blob/8cf7ffaa66e0e4c9c0b12f5646d6c2e20984cd99/lib/solr_ead/behaviors.rb#L54-L57
7
7
  class Parents
8
- attr_reader :ids, :labels
9
- def initialize(ids:, labels:, eadid:)
8
+ attr_reader :ids, :labels, :levels
9
+ def initialize(ids:, labels:, eadid:, levels:)
10
10
  @ids = ids
11
11
  @labels = labels
12
12
  @eadid = eadid
13
+ @levels = levels
13
14
  end
14
15
 
15
16
  def eadid
@@ -19,7 +20,7 @@ module Arclight
19
20
  ##
20
21
  # @return [Array[Arclight::Parent]]
21
22
  def as_parents
22
- Hash[ids.zip(labels)].map { |k, v| Arclight::Parent.new(id: k, label: v, eadid: eadid) }
23
+ ids.map.with_index { |_id, idx| Arclight::Parent.new(id: ids[idx], label: labels[idx], eadid: eadid, level: levels[idx]) }
23
24
  end
24
25
 
25
26
  ##
@@ -28,7 +29,8 @@ module Arclight
28
29
  ids = document.parent_ids
29
30
  labels = document.parent_labels
30
31
  eadid = document.eadid
31
- new(ids: ids, labels: labels, eadid: eadid)
32
+ levels = document.parent_levels
33
+ new(ids: ids, labels: labels, eadid: eadid, levels: levels)
32
34
  end
33
35
  end
34
36
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ module Requests
5
+ ##
6
+ # This class should be used to turn configuration into a URL and
7
+ # POST form specifically aimed at Aeon's external request
8
+ # endpoint (https://support.atlas-sys.com/hc/en-us/articles/360011820054-External-Request-Endpoint)
9
+ class AeonExternalRequest
10
+ def initialize(document, presenter)
11
+ @document = document
12
+ @presenter = presenter
13
+ end
14
+
15
+ def config
16
+ @config ||= @document.repository_config.request_config_for_type('aeon_external_request_endpoint')
17
+ end
18
+
19
+ def url
20
+ "#{config['request_url']}?#{url_params}"
21
+ end
22
+
23
+ def form_mapping
24
+ static_mappings.merge(dynamic_mappings)
25
+ end
26
+
27
+ def static_mappings
28
+ config['request_mappings']['static']
29
+ end
30
+
31
+ def dynamic_mappings
32
+ config['request_mappings']['accessor'].transform_values do |v|
33
+ @document.send(v.to_sym)
34
+ end
35
+ end
36
+
37
+ def url_params
38
+ config['request_mappings']['url_params'].to_query
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arclight
4
+ module Requests
5
+ ##
6
+ # This object relies on the ability to respond to attributes passed in as
7
+ # query parameters from the form mapping configuration
8
+ class AeonWebEad
9
+ attr_reader :document, :ead_url
10
+ ##
11
+ # @param [Blacklight::SolrDocument] document
12
+ # @param [String] ead_url
13
+ def initialize(document, ead_url)
14
+ @document = document
15
+ @ead_url = ead_url
16
+ end
17
+
18
+ ##
19
+ # Url target for Aeon request params
20
+ def request_url
21
+ document.repository_config.request_url_for_type('aeon_web_ead')
22
+ end
23
+
24
+ ##
25
+ # Constructed request URL
26
+ def url
27
+ "#{request_url}?#{form_mapping.to_query}"
28
+ end
29
+
30
+ ##
31
+ # Converts mappings as a query url param into a Hash used for sending
32
+ # messages
33
+ # If a defined method is provided as a value, that method will be invoked
34
+ # "collection_name=entry.123" => { "collection_name" => "entry.123" }
35
+ # @return [Hash]
36
+ def form_mapping
37
+ form_hash = Rack::Utils.parse_nested_query(
38
+ document.repository_config.request_mappings_for_type('aeon_web_ead')
39
+ )
40
+ form_hash.each do |key, value|
41
+ respond_to?(value) && form_hash[key] = send(value)
42
+ end
43
+ form_hash
44
+ end
45
+ end
46
+ end
47
+ end
@@ -22,7 +22,7 @@ module Arclight
22
22
  ##
23
23
  # Url of form to fill
24
24
  def url
25
- document.repository_config.google_request_url
25
+ document.repository_config&.request_url_for_type('google_form')
26
26
  end
27
27
 
28
28
  ##
@@ -32,7 +32,7 @@ module Arclight
32
32
  # @return [Hash]
33
33
  def form_mapping
34
34
  Rack::Utils.parse_nested_query(
35
- document.repository_config.google_request_mappings
35
+ document.repository_config&.request_mappings_for_type('google_form')
36
36
  )
37
37
  end
38
38
 
@@ -4,18 +4,30 @@ module Arclight
4
4
  ##
5
5
  # Arclight specific methods for the Catalog
6
6
  module Catalog
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+ before_action only: :index do
11
+ if (params.dig(:f, :collection_sim) || []).any?(&:blank?)
12
+ params[:f][:collection_sim].delete_if(&:blank?)
13
+ params[:f].delete(:collection_sim) if params[:f][:collection_sim].blank?
14
+ end
15
+ end
16
+ end
17
+
7
18
  ##
8
19
  # Overriding the Blacklight method so that the hierarchy view does not start
9
20
  # a new search session
10
21
  def start_new_search_session?
11
- !%w[hierarchy online_contents].include?(params[:view]) && super
22
+ !%w[online_contents collection_context].include?(params[:view]) && super
12
23
  end
13
24
 
14
25
  ##
15
26
  # Overriding the Blacklight method so that hierarchy does not get stored as
16
27
  # the preferred view
17
28
  def store_preferred_view
18
- return if %w[hierarchy online_contents].include?(params[:view])
29
+ return if %w[online_contents collection_context].include?(params[:view])
30
+
19
31
  super
20
32
  end
21
33
  end
@@ -11,35 +11,50 @@ module Arclight
11
11
  add_hierarchy_max_rows
12
12
  add_hierarchy_sort
13
13
  add_highlighting
14
+ add_grouping
14
15
  ]
15
16
  end
16
17
 
17
18
  ##
18
- # For the hierarchy view, set a higher (unlimited) maximum document return
19
+ # Override Blacklight's method so that some views don't add Solr facets into the request.
20
+ def add_facetting_to_solr(solr_params)
21
+ if %w[collection_context online_contents].include? blacklight_params[:view]
22
+ return solr_params
23
+ end
24
+
25
+ super(solr_params)
26
+ end
27
+
28
+ ##
29
+ # For the collection_context views, set a higher (unlimited) maximum document return
19
30
  def add_hierarchy_max_rows(solr_params)
20
- if blacklight_params[:view] == 'hierarchy'
31
+ if %w[collection_context].include? blacklight_params[:view]
21
32
  solr_params[:rows] = 999_999_999
22
33
  end
23
34
  solr_params
24
35
  end
25
36
 
26
37
  ##
27
- # For the hierarchy view, set the sort order to preserve the order of components
38
+ # For the asynch views, set the sort order to preserve the order of components
28
39
  def add_hierarchy_sort(solr_params)
29
- solr_params[:sort] = 'sort_ii asc' if %w[hierarchy online_contents].include? blacklight_params[:view]
40
+ solr_params[:sort] = 'sort_ii asc' if %w[online_contents collection_context].include? blacklight_params[:view]
30
41
  solr_params
31
42
  end
32
43
 
33
44
  ##
34
- # Disable highlighting for hiearchy, and enable it for all other searches
45
+ # Add highlighting
35
46
  def add_highlighting(solr_params)
36
- if blacklight_params[:view] == 'hierarchy'
37
- solr_params['hl'] = false
38
- else
39
- solr_params['hl'] = true
40
- solr_params['hl.fl'] = 'text'
41
- solr_params['hl.snippets'] = 3
42
- end
47
+ solr_params['hl'] = true
48
+ solr_params['hl.fl'] = 'text'
49
+ solr_params['hl.snippets'] = 3
50
+ solr_params
51
+ end
52
+
53
+ ##
54
+ # Adds grouping parameters for Solr if enabled
55
+ def add_grouping(solr_params)
56
+ solr_params.merge!(Arclight::Engine.config.catalog_controller_group_query_params) if blacklight_params[:group] == 'true'
57
+
43
58
  solr_params
44
59
  end
45
60
  end
@@ -5,22 +5,32 @@ module Arclight
5
5
  # Extends Blacklight::Solr::Document to provide Arclight specific behavior
6
6
  module SolrDocument
7
7
  extend Blacklight::Solr::Document
8
+ include Arclight::EadFormatHelpers
8
9
 
9
10
  def repository_config
10
11
  return unless repository
12
+
11
13
  @repository_config ||= Arclight::Repository.find_by(name: repository)
12
14
  end
13
15
 
14
16
  def parent_ids
15
- fetch('parent_ssm', [])
17
+ fetch('parent_ssim', [])
16
18
  end
17
19
 
18
20
  def parent_labels
19
21
  fetch('parent_unittitles_ssm', [])
20
22
  end
21
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
30
+ end
31
+
22
32
  def eadid
23
- fetch('ead_ssi', nil)
33
+ fetch('ead_ssi', nil)&.strip
24
34
  end
25
35
 
26
36
  def unitid
@@ -39,12 +49,17 @@ module Arclight
39
49
  first('collection_ssm')
40
50
  end
41
51
 
52
+ def collection_unitid
53
+ first('collection_unitid_ssm')
54
+ end
55
+
42
56
  def extent
43
57
  first('extent_ssm')
44
58
  end
45
59
 
46
60
  def abstract_or_scope
47
- first('abstract_ssm') || first('scopecontent_ssm')
61
+ value = first('abstract_ssm') || first('scopecontent_ssm')
62
+ render_html_tags(value: [value]) if value.present?
48
63
  end
49
64
 
50
65
  def creator
@@ -84,21 +99,21 @@ module Arclight
84
99
  end
85
100
 
86
101
  def terms
87
- first('userestrict_ssm')
102
+ render_html_tags(value: [first('userestrict_ssm')])
88
103
  end
89
104
 
90
105
  # Restrictions for component sidebar
91
106
  def parent_restrictions
92
- first('parent_access_restrict_ssm')
107
+ render_html_tags(value: [first('parent_access_restrict_ssm')])
93
108
  end
94
109
 
95
110
  # Terms for component sidebar
96
111
  def parent_terms
97
- first('parent_access_terms_ssm')
112
+ render_html_tags(value: [first('parent_access_terms_ssm')])
98
113
  end
99
114
 
100
115
  def digital_objects
101
- digital_objects_field = fetch('digital_objects_ssm', [])
116
+ digital_objects_field = fetch('digital_objects_ssm', []).reject(&:empty?)
102
117
  return [] if digital_objects_field.blank?
103
118
 
104
119
  digital_objects_field.map do |object|
@@ -125,7 +140,14 @@ module Arclight
125
140
  return if highlight_response.blank? ||
126
141
  highlight_response[id].blank? ||
127
142
  highlight_response[id][:text].blank?
143
+
128
144
  highlight_response[id][:text]
129
145
  end
146
+
147
+ # Factory method for constructing the Object modeling downloads
148
+ # @return [DocumentDownloads]
149
+ def downloads
150
+ @downloads ||= DocumentDownloads.new(self)
151
+ end
130
152
  end
131
153
  end