arclight 1.0.1 → 1.1.0

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/.solr_wrapper +0 -3
  3. data/app/assets/stylesheets/arclight/application.scss +1 -0
  4. data/app/assets/stylesheets/arclight/modules/layout.scss +5 -5
  5. data/app/assets/stylesheets/arclight/modules/search_form.scss +9 -0
  6. data/app/assets/stylesheets/arclight/modules/truncator.scss +2 -0
  7. data/app/components/arclight/bookmark_component.html.erb +1 -1
  8. data/app/components/arclight/breadcrumb_component.rb +1 -1
  9. data/app/components/arclight/breadcrumbs_hierarchy_component.html.erb +2 -2
  10. data/app/components/arclight/document_collection_hierarchy_component.html.erb +8 -4
  11. data/app/components/arclight/document_component.html.erb +1 -1
  12. data/app/components/arclight/document_components_hierarchy_component.html.erb +2 -2
  13. data/app/components/arclight/group_component.html.erb +6 -2
  14. data/app/components/arclight/index_metadata_field_component.html.erb +1 -2
  15. data/app/components/arclight/search_bar_component.html.erb +3 -1
  16. data/app/components/arclight/search_bar_component.rb +1 -1
  17. data/app/components/arclight/search_result_breadcrumbs_component.html.erb +6 -3
  18. data/app/components/arclight/search_result_title_component.html.erb +3 -1
  19. data/app/helpers/arclight/ead_format_helpers.rb +87 -0
  20. data/app/helpers/arclight_helper.rb +11 -0
  21. data/app/models/arclight/parent.rb +0 -10
  22. data/app/models/concerns/arclight/solr_document.rb +9 -4
  23. data/app/views/catalog/_document_list.html.erb +8 -0
  24. data/app/views/catalog/_group.html.erb +1 -1
  25. data/arclight.gemspec +0 -1
  26. data/lib/arclight/normalized_date.rb +5 -10
  27. data/lib/arclight/traject/ead2_component_config.rb +54 -13
  28. data/lib/arclight/traject/ead2_config.rb +46 -14
  29. data/lib/arclight/version.rb +1 -1
  30. data/lib/generators/arclight/install_generator.rb +1 -1
  31. data/lib/generators/arclight/templates/catalog_controller.rb +47 -5
  32. data/lib/generators/arclight/templates/config/locales/arclight.en.yml +9 -0
  33. data/lib/generators/arclight/templates/config/repositories.yml +2 -2
  34. data/package.json +1 -1
  35. data/solr/conf/schema.xml +7 -1
  36. data/solr/conf/solrconfig.xml +59 -44
  37. data/template.rb +5 -5
  38. metadata +5 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 535ab37ef2a400b6159b501ec20d2e70bb69aafafdbbaf3091ed8b3198abb889
4
- data.tar.gz: 86a06cba86c02986f5089c2885550dc51a0d64f7dadd40fe85692f45c88f1649
3
+ metadata.gz: '0060929ca8a027d2a87b11cafdde627b697a89bf74f730afa56df065b306888a'
4
+ data.tar.gz: 0b563a21799214597af797f4a4cfb64ad2d2e4ea30143a99450cea4f53560db4
5
5
  SHA512:
6
- metadata.gz: 238e0a1a27a4b5e7219a473f99030634a811eb4504465dea0844bc8f4a4ac79fb5db941a148f61be01652e158d647d6e6bc5fee5e6b1b31814d105512126167d
7
- data.tar.gz: fb6d3a35fa8d4bea31af2e572ab56e58687a5d39d876c47f009c3782febe7eac0f07f12364e3ba94f78fbf2f01101fefdf3bc717a695fee18b9bc55668262df8
6
+ metadata.gz: fc7cea71a4cf57660c9d1779a90fa45cb1f38073e477a81f43782dd236028f4a5f536ae699ecec3b5a07048466c1ab738d96d6e5fdbb236c5e877816cc3c5878
7
+ data.tar.gz: 837319216ebcf25d60170bf9066bb6f7c6ce8a0b2459e128e763ff51b733e708285900cc2f4966d09ceb4cfa73f20c020a9b552b7b33da9613a28bcd0492c135
data/.solr_wrapper CHANGED
@@ -3,6 +3,3 @@
3
3
  collection:
4
4
  dir: solr/conf/
5
5
  name: blacklight-core
6
-
7
- # Added as workaround for https://github.com/cbeer/solr_wrapper/issues/150
8
- checksum: 1ff1bd22255b0ae5a1ade1d03596c1f35d4fa69fa1a16e823eaa554b30ba1311f031af6e1f95a94dbdd3a1dbf308eeb068e7303b74f83584a8bb443505078cbb
@@ -11,3 +11,4 @@
11
11
  @import 'modules/search_results';
12
12
  @import 'modules/show_collection';
13
13
  @import 'modules/truncator';
14
+ @import 'modules/search_form';
@@ -9,7 +9,7 @@
9
9
  padding-bottom: $spacer;
10
10
  margin-bottom: $spacer * .75;
11
11
  width: 100%;
12
-
12
+
13
13
  $bent-arrow: "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='20' height='15'><path fill-rule='evenodd' d='M1.5 1.5A.5.5 0 0 0 1 2v4.8a2.5 2.5 0 0 0 2.5 2.5h9.793l-3.347 3.346a.5.5 0 0 0 .708.708l4.2-4.2a.5.5 0 0 0 0-.708l-4-4a.5.5 0 0 0-.708.708L13.293 8.3H3.5A1.5 1.5 0 0 1 2 6.8V2a.5.5 0 0 0-.5-.5z'></path></svg>";
14
14
 
15
15
  .breadcrumb {
@@ -131,11 +131,11 @@
131
131
  }
132
132
  }
133
133
 
134
- svg.bi {
134
+ svg.bi {
135
135
  vertical-align: text-bottom;
136
136
  color: $light-icon-color;
137
137
  }
138
-
138
+
139
139
  .dropdown-item svg.bi {
140
140
  color: $dark-icon-color;
141
141
  }
@@ -144,7 +144,7 @@
144
144
  .bookmark-toggle {
145
145
  display: inline;
146
146
  margin-left: 1em;
147
-
147
+
148
148
  .toggle-bookmark {
149
149
  display: inline;
150
150
  margin-bottom: 0;
@@ -177,7 +177,7 @@ dl.deflist dt {
177
177
  text-align: left;
178
178
  }
179
179
 
180
- .chronlist-head, .list-head {
180
+ .chronlist-head, .list-head, .index-head, .table-head {
181
181
  caption-side: top;
182
182
  font-size: 1.25rem;
183
183
  font-weight: 500;
@@ -0,0 +1,9 @@
1
+ // Original style comes from https://github.com/twbs/bootstrap/blob/v5.3.2/scss/_dropdown.scss#L184
2
+ // via https://github.com/projectblacklight/blacklight/blob/v8.1.0/app/assets/stylesheets/blacklight/_search_form.scss#L25
3
+ .input-group > .search-autocomplete-wrapper {
4
+ ul {
5
+ li {
6
+ white-space: normal;
7
+ }
8
+ }
9
+ }
@@ -28,10 +28,12 @@
28
28
 
29
29
  // "view more"/"view less" text swaps when content is expanded
30
30
  .view-more {
31
+ color: shade-color($link-color, 20%);
31
32
  display: inline;
32
33
  }
33
34
 
34
35
  .view-less {
36
+ color: shade-color($link-color, 20%);
35
37
  display: none;
36
38
  }
37
39
 
@@ -11,7 +11,7 @@
11
11
  }) do %>
12
12
  <div class="checkbox toggle-bookmark">
13
13
  <label class="toggle-bookmark" data-checkboxsubmit-target="label">
14
- <input type="checkbox" class="toggle-bookmark" data-checkboxsubmit-target="checkbox">
14
+ <input type="checkbox" class="toggle-bookmark" data-checkboxsubmit-target="checkbox" <%= 'checked="checked"' if bookmarked? %>>
15
15
  <span data-checkboxsubmit-target="span"><%= bookmarked? ? "#{blacklight_icon(:bookmark).html_safe}<span class=\"sr-only visually-hidden\">#{t('blacklight.search.bookmarks.present')}</span>".html_safe : "#{blacklight_icon(:bookmark).html_safe}<span class=\"sr-only visually-hidden\">#{t('blacklight.search.bookmarks.absent')}</span>".html_safe %></span>
16
16
  </label>
17
17
  </div>
@@ -29,7 +29,7 @@ module Arclight
29
29
  yield build_repository_link
30
30
 
31
31
  @document.parents.each do |parent|
32
- yield tag.li(class: 'breadcrumb-item') { link_to(parent.label, solr_document_path(parent.global_id)) }
32
+ yield tag.li(class: 'breadcrumb-item') { link_to(parent.label, solr_document_path(parent.id)) }
33
33
  end
34
34
  end
35
35
 
@@ -9,12 +9,12 @@
9
9
  <% if collection %>
10
10
  <li class="breadcrumb-item breadcrumb-item-2">
11
11
  <span aria-hidden="true"><%= blacklight_icon :collection, classes: 'al-collection-content-icon' %></span>
12
- <span class="breadcrumb-text"><%= link_to collection.label, solr_document_path(collection.global_id) %></span>
12
+ <span class="breadcrumb-text"><%= link_to collection.label, solr_document_path(collection.id) %></span>
13
13
 
14
14
  <ol class="breadcrumb">
15
15
  <% parents_under_collection.each do |parent| %>
16
16
  <li class="breadcrumb-item breadcrumb-item-3">
17
- <span class="breadcrumb-text"><%= link_to parent.label, solr_document_path(parent.global_id) %></span>
17
+ <span class="breadcrumb-text"><%= link_to parent.label, solr_document_path(parent.id) %></span>
18
18
  </li>
19
19
  <% end %>
20
20
 
@@ -1,5 +1,5 @@
1
1
  <%= content_tag :li,
2
- id: @document.id,
2
+ id: "#{@document.id}-hierarchy-item",
3
3
  data: {
4
4
  'document-id': @document.id.to_s.parameterize,
5
5
  'document-counter': @counter,
@@ -10,7 +10,7 @@
10
10
  <div class="documentHeader" data-document-id="<%= document.id %>">
11
11
  <% if document.children? %>
12
12
  <%= link_to('',
13
- "##{document.id}-collapsible-hierarchy",
13
+ "#collapsible-hierarchy-#{document.id}",
14
14
  class: "al-toggle-view-children#{ ' collapsed' unless show_expanded?}",
15
15
  aria: {
16
16
  label: t('arclight.hierarchy.view_all'),
@@ -24,7 +24,11 @@
24
24
  %>
25
25
  <% end %>
26
26
  <div class="index_title document-title-heading" data-turbo="false">
27
- <%= helpers.link_to_document document, counter: @counter %>
27
+ <% if current_target? %>
28
+ <%= document.normalized_title %>
29
+ <% else %>
30
+ <%= helpers.link_to_document document, counter: @counter %>
31
+ <% end %>
28
32
  <% if document.children? %>
29
33
  <span class="badge badge-pill bg-secondary badge-secondary al-number-of-children-badge"><%= document.number_of_children %><span class="sr-only visually-hidden"><%= t(:'arclight.views.index.number_of_components', count: document.number_of_children) %></span></span>
30
34
  <% end %>
@@ -37,7 +41,7 @@
37
41
 
38
42
  <%= render Arclight::IndexMetadataFieldComponent.with_collection(@presenter&.field_presenters.select { |field| field.field_config.collection_context }, classes: ['col pl-0 my-0']) %>
39
43
  <% if document.number_of_children > 0 %>
40
- <%= content_tag(:div, id: "#{document.id}-collapsible-hierarchy",
44
+ <%= content_tag(:div, id: "collapsible-hierarchy-#{document.id}",
41
45
  class: "collapse al-collection-context-collapsible al-hierarchy-level-#{document.component_level} #{'show' if show_expanded?}"
42
46
  ) do %>
43
47
  <%= render Arclight::DocumentComponentsHierarchyComponent.new(document: @document, target_index: target_index) %>
@@ -32,7 +32,7 @@
32
32
  <% elsif document.children? %>
33
33
  <div id="contents">
34
34
  <h2 class="al-show-sub-heading"><%= t 'arclight.views.show.contents' %></h2>
35
- <%= helpers.turbo_frame_tag "al-hierarchy-#{document.id}", loading: 'lazy', src: helpers.hierarchy_solr_document_path(id: document.id, paginate: true, per_page: 50) %>
35
+ <%= helpers.turbo_frame_tag "al-hierarchy-#{document.id}-document", loading: 'lazy', src: helpers.hierarchy_solr_document_path(id: document.id, paginate: true, key: '-document', per_page: 50) %>
36
36
  </div>
37
37
  <% end %>
38
38
 
@@ -18,7 +18,7 @@
18
18
  <% end %>
19
19
  <% elsif paginate? %>
20
20
  <%# render the first N documents, and let the user expand the remaining if desired %>
21
- <%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}", loading: ('lazy' unless @target_index >= 0), src: hierarchy_path(limit: @maximum_left_gap) %>
21
+ <%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}-sidebar", loading: ('lazy' unless @target_index >= 0), src: hierarchy_path(limit: @maximum_left_gap, key: '-sidebar') %>
22
22
  <%= tag.turbo_frame id: "al-hierarchy-#{@document.id}-right" do %>
23
23
  <ul>
24
24
  <li>
@@ -28,5 +28,5 @@
28
28
  <% end %>
29
29
  <% else %>
30
30
  <%# there aren't enough to bother paginating, so load them all at once %>
31
- <%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}", loading: ('lazy' unless @target_index >= 0), src: hierarchy_path %>
31
+ <%= helpers.turbo_frame_tag "al-hierarchy-#{@document.id}-sidebar", loading: ('lazy' unless @target_index >= 0), src: hierarchy_path(key: '-sidebar') %>
32
32
  <% end %>
@@ -7,8 +7,12 @@
7
7
  </div>
8
8
  <% end %>
9
9
  <h3><%= helpers.link_to_document document %></h3>
10
- <%= tag.span(document.extent, class: 'al-document-extent badge') if document.extent %>
11
- <%= render Arclight::IndexMetadataFieldComponent.with_collection(presenter.field_presenters.select { |field| !compact? || field.field_config.compact }) %>
10
+ <% document.extent.each do |extent| %>
11
+ <%= tag.span extent, class: 'al-document-extent badge' unless compact? %>
12
+ <% end %>
13
+ <dl>
14
+ <%= render Arclight::IndexMetadataFieldComponent.with_collection(presenter.field_presenters.select { |field| !compact? || field.field_config.compact }) %>
15
+ </dl>
12
16
  </div>
13
17
  </div>
14
18
  </div>
@@ -4,8 +4,7 @@
4
4
  <%= tag.dd(class: @classes + ['truncator'], data: { controller: 'arclight-truncate' }) do %>
5
5
  <%= tag.div @field.render, class: 'content', data: { arclight_truncate_target: 'content' } %>
6
6
  <%= button_tag(type: :button, class: 'btn btn-sm btn-link px-0',
7
- data: { action: 'click->arclight-truncate#trigger' },
8
- aria: { hidden: true }) do %>
7
+ data: { action: 'click->arclight-truncate#trigger' }) do %>
9
8
  <%= tag.span t('arclight.truncation.view_more'), class: 'view-more' %>
10
9
  <%= tag.span t('arclight.truncation.view_less'), class: 'view-less' %>
11
10
  <%= tag.span(class: 'icon') %>
@@ -1,6 +1,8 @@
1
1
  <%= render(Blacklight::SearchBarComponent.new(
2
2
  **@kwargs,
3
- params: @params.merge(f: (@params[:f] || {}).except(:collection)))) do |c| %>
3
+ params: @params.merge(f: (@params[:f] || {}).except(:collection)),
4
+ q: @q,
5
+ search_field: @search_field)) do |c| %>
4
6
 
5
7
  <% c.with_before_input_group do %>
6
8
  <div class="input-group within-collection-dropdown">
@@ -25,7 +25,7 @@ module Arclight
25
25
  end
26
26
 
27
27
  def collection_name
28
- @collection_name ||= Array(@params.dig(:f, :collection)).first ||
28
+ @collection_name ||= Array(@params.dig(:f, :collection)).reject(&:empty?).first ||
29
29
  helpers.current_context_document&.collection_name
30
30
  end
31
31
  end
@@ -1,3 +1,6 @@
1
- <div class='breadcrumb-links'>
2
- <%= rendered_breadcrumbs %>
3
- </div>
1
+ <dt class="visually-hidden">Collection Context</dt>
2
+ <dd>
3
+ <div class='breadcrumb-links'>
4
+ <%= rendered_breadcrumbs %>
5
+ </div>
6
+ </dd>
@@ -1,7 +1,9 @@
1
1
  <header class="documentHeader row" data-document-id="<%= @document.id %>">
2
2
  <h3 class="index_title document-title-heading col">
3
3
  <%= helpers.link_to_document @document, counter: @counter %>
4
- <%= tag.span @document.extent, class: 'al-document-extent badge' if @document.extent && !compact? %>
4
+ <% @document.extent.each do |extent| %>
5
+ <%= tag.span extent, class: 'al-document-extent badge' unless compact? %>
6
+ <% end %>
5
7
  <%= tag.span class: 'al-document-container text-muted ml-auto' do %>
6
8
  <%= @document.containers.join(', ') %>
7
9
  <% end if @document.containers.present? %>
@@ -23,13 +23,34 @@ module Arclight
23
23
  .scrub!(:strip).to_html
24
24
  end
25
25
 
26
+ # rubocop:disable Metrics/AbcSize
26
27
  def ead_to_html_scrubber
27
28
  Loofah::Scrubber.new do |node|
28
29
  format_render_attributes(node) if node.attr('render').present?
30
+ convert_to_span(node) if CONVERT_TO_SPAN_TAGS.include? node.name
31
+ convert_to_br(node) if CONVERT_TO_BR_TAG.include? node.name
32
+ format_links(node) if %w[extptr extref extrefloc ptr ref].include? node.name
29
33
  format_lists(node) if %w[list chronlist].include? node.name
34
+ format_indexes(node) if node.name == 'index'
35
+ format_tables(node) if node.name == 'table'
30
36
  node
31
37
  end
32
38
  end
39
+ # rubocop:enable Metrics/AbcSize
40
+
41
+ # Tags that should be converted to <span> tags because of formatting conflicts between XML and HTML
42
+ CONVERT_TO_SPAN_TAGS = ['title'].freeze
43
+
44
+ # Tags that should be converted to HTML <br/> tags
45
+ CONVERT_TO_BR_TAG = ['lb'].freeze
46
+
47
+ def convert_to_span(node)
48
+ node.name = 'span'
49
+ end
50
+
51
+ def convert_to_br(node)
52
+ node.name = 'br'
53
+ end
33
54
 
34
55
  def condense_whitespace(str)
35
56
  str.squish.strip.gsub(/>[\n\s]+</, '><')
@@ -91,6 +112,17 @@ module Arclight
91
112
  end
92
113
  end
93
114
 
115
+ def format_links(node)
116
+ node.remove_attribute('target')
117
+ node.remove_attribute('type')
118
+ if %w[extptr extref extrefloc].include? node.name
119
+ node['target'] = '_blank'
120
+ node['class'] = 'external-link'
121
+ end
122
+ node.content = node['title'] if (%w[extptr ptr].include? node.name) && node['title'].present?
123
+ node.name = 'a' if node['href'].present?
124
+ end
125
+
94
126
  def format_lists(node)
95
127
  format_simple_lists(node) if node.name == 'list' && node['type'] != 'deflist'
96
128
  format_deflists(node) if node.name == 'list' && node['type'] == 'deflist'
@@ -218,5 +250,60 @@ module Arclight
218
250
  end
219
251
  multi_events.each { |event_node| event_node.name = 'div' }
220
252
  end
253
+
254
+ # Format EAD <index> elements
255
+ def format_indexes(node)
256
+ index_head = node.at_css('head')
257
+ index_head&.name = 'h3'
258
+ index_head&.add_class('index-head')
259
+ index_head['id'] = ['index-', index_head.text].join.parameterize if index_head.present?
260
+ format_indexentries(node)
261
+ node.name = 'div'
262
+ end
263
+
264
+ # Grab all of the <indexentry> children as a nodeset, move them into
265
+ # a <table>, wrap each entry in a <tr> & each value in a <td>.
266
+ def format_indexentries(node)
267
+ indexentries = node.css('indexentry')
268
+ return if indexentries.blank?
269
+
270
+ indexentries.first.previous = '<table class="table indexentries" />'
271
+ indexentries.map do |i|
272
+ i.parent = node.at_css('table.table.indexentries')
273
+ i.wrap('<tr/>')
274
+ i.element_children.map { |c| c.wrap('<td/>') }
275
+ # Assuming two columns in an index, create a blank cell for entries
276
+ # with a missing value.
277
+ i.add_child('<td/>') if i.element_children.count == 1
278
+ end
279
+ end
280
+
281
+ # Format EAD <table> elements, converting <tgroup> to HTML <table>.
282
+ # Ignoring <colspec>, @colname, @colwidth complex rendering
283
+ # logic for now.
284
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
285
+ def format_tables(node)
286
+ node.remove_attribute('frame')
287
+ node.name = 'div' if node.css('tgroup').present?
288
+ format_table_head(node)
289
+ tgroups = node.css('tgroup')
290
+ tgroups&.map do |t|
291
+ t.name = 'table'
292
+ t.remove_attribute('cols')
293
+ t.add_class('table')
294
+ t.css('row').map { |r| r.name = 'tr' }
295
+ t.css('thead entry').map { |e| e.name = 'th' }
296
+ t.css('tbody entry').map { |e| e.name = 'td' }
297
+ end
298
+ end
299
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
300
+
301
+ def format_table_head(node)
302
+ table_head = node.at_css('head')
303
+ return if table_head.blank?
304
+
305
+ table_head.name = 'h3'
306
+ table_head.add_class('table-head')
307
+ end
221
308
  end
222
309
  end
@@ -5,6 +5,7 @@
5
5
  module ArclightHelper
6
6
  include Arclight::EadFormatHelpers
7
7
  include Arclight::FieldConfigHelpers
8
+ include Blacklight::DocumentHelperBehavior
8
9
  include Blacklight::LayoutHelperBehavior
9
10
 
10
11
  def repository_collections_path(repository)
@@ -91,6 +92,16 @@ module ArclightHelper
91
92
  end
92
93
  end
93
94
 
95
+ ##
96
+ # Override of BL core https://github.com/projectblacklight/blacklight/blob/v8.1.0/app/helpers/blacklight/document_helper_behavior.rb#L55
97
+ # Remove document_type check. It isn't a method on arclight documents
98
+ # Check if the document is in the user's bookmarks
99
+ # @param [Blacklight::Document] document
100
+ # @return [Boolean]
101
+ def bookmarked?(document)
102
+ current_bookmarks.any? { |x| x.document_id == document.id }
103
+ end
104
+
94
105
  def current_context_document
95
106
  @document
96
107
  end
@@ -17,15 +17,5 @@ module Arclight
17
17
  def collection?
18
18
  level == 'collection'
19
19
  end
20
-
21
- ##
22
- # Concatenates the eadid and the id, to return an "id" in the context of
23
- # Blacklight and Solr
24
- # @return [String]
25
- def global_id
26
- return id if eadid == id
27
-
28
- "#{eadid}#{id}"
29
- end
30
20
  end
31
21
  end
@@ -7,11 +7,11 @@ module Arclight
7
7
  extend ActiveSupport::Concern
8
8
 
9
9
  included do
10
- attribute :parent_ids, :array, 'parent_ssim'
10
+ attribute :parent_ids, :array, 'parent_ids_ssim'
11
11
  attribute :parent_labels, :array, 'parent_unittitles_ssm'
12
12
  attribute :parent_levels, :array, 'parent_levels_ssm'
13
13
  attribute :unitid, :string, 'unitid_ssm'
14
- attribute :extent, :string, 'extent_ssm'
14
+ attribute :extent, :array, 'extent_ssm'
15
15
  attribute :abstract, :string, 'abstract_html_tesm'
16
16
  attribute :scope, :string, 'scopecontent_html_tesm'
17
17
  attribute :creator, :string, 'creator_ssm'
@@ -111,8 +111,13 @@ module Arclight
111
111
  end
112
112
 
113
113
  def containers
114
- # NOTE: that .titlecase strips punctuation, like hyphens, we want to keep
115
- fetch('containers_ssim', []).map(&:capitalize)
114
+ # NOTE: Keep uppercase characters if present, but upcase the first if not already
115
+ containers_field = fetch('containers_ssim', []).reject(&:empty?)
116
+ return [] if containers_field.blank?
117
+
118
+ containers_field.map do |container|
119
+ container.dup.sub!(/\A./, &:upcase)
120
+ end
116
121
  end
117
122
 
118
123
  # @return [Array<String>] with embedded highlights using <em>...</em>
@@ -0,0 +1,8 @@
1
+ <% # Override to conditionally add id="documents" on div. When documents are grouped it causes duplicate id issues %>
2
+ <% # https://github.com/projectblacklight/blacklight/blob/v8.1.0/app/views/catalog/_document_list.html.erb %>
3
+ <% # container for all documents in index list view -%>
4
+ <% view_config = local_assigns[:view_config] || blacklight_config&.view_config(document_index_view_type) %>
5
+ <div <%= 'id="documents"'.html_safe unless grouped? %> class="al-document-listings documents-<%= view_config&.key || document_index_view_type %>">
6
+ <% document_presenters = documents.map { |doc| document_presenter(doc) } -%>
7
+ <%= render view_config.document_component.with_collection(document_presenters, partials: view_config.partials, counter_offset: @response&.start || 0) %>
8
+ </div>
@@ -1,4 +1,4 @@
1
1
  <% # container for all groups in index view -%>
2
- <div class='al-grouped-results'>
2
+ <div id="documents" class='al-grouped-results'>
3
3
  <%= render (blacklight_config.view_config(document_index_view_type).group_component || Arclight::GroupComponent).with_collection(@response.groups) %>
4
4
  </div>
data/arclight.gemspec CHANGED
@@ -43,5 +43,4 @@ Gem::Specification.new do |spec|
43
43
  spec.add_development_dependency 'selenium-webdriver'
44
44
  spec.add_development_dependency 'simplecov'
45
45
  spec.add_development_dependency 'solr_wrapper'
46
- spec.add_development_dependency 'webdrivers'
47
46
  end
@@ -39,16 +39,11 @@ module Arclight
39
39
 
40
40
  # @see http://www2.archivists.org/standards/DACS/part_I/chapter_2/4_date for rules
41
41
  def normalize
42
- if inclusive.present?
43
- result = inclusive.to_s
44
- result << ", bulk #{bulk}" if bulk.present?
45
- elsif other.present?
46
- result = other.to_s
47
- else
48
- result = nil
49
- end
50
-
51
- result&.strip
42
+ result = []
43
+ result << inclusive if inclusive.present?
44
+ result << other if other.present?
45
+ result << "bulk #{bulk}" if bulk.present?
46
+ result.compact.map(&:strip).join(', ')
52
47
  end
53
48
  end
54
49
  end
@@ -29,6 +29,7 @@ settings do
29
29
  provide 'title_normalizer', 'Arclight::NormalizedTitle'
30
30
  provide 'reader_class_name', 'Arclight::Traject::NokogiriNamespacelessReader'
31
31
  provide 'logger', Logger.new($stderr)
32
+ provide 'component_identifier_format', '%<root_id>s_%<ref_id>s'
32
33
  end
33
34
 
34
35
  NAME_ELEMENTS = %w[corpname famname name persname].freeze
@@ -60,6 +61,7 @@ DID_SEARCHABLE_NOTES_FIELDS = %w[
60
61
  abstract
61
62
  materialspec
62
63
  physloc
64
+ note
63
65
  ].freeze
64
66
 
65
67
  # ==================
@@ -67,7 +69,9 @@ DID_SEARCHABLE_NOTES_FIELDS = %w[
67
69
  #
68
70
  # NOTE: All fields should be stored in Solr
69
71
  # ==================
70
- to_field 'ref_ssi' do |record, accumulator, _context|
72
+ to_field 'ref_ssi' do |record, accumulator, context|
73
+ next if context.output_hash['ref_ssi']
74
+
71
75
  accumulator << if record.attribute('id').blank?
72
76
  strategy = Arclight::MissingIdStrategy.selected
73
77
  hexdigest = strategy.new(record).to_hexdigest
@@ -90,10 +94,14 @@ to_field 'ref_ssm' do |_record, accumulator, context|
90
94
  end
91
95
 
92
96
  to_field 'id' do |_record, accumulator, context|
93
- accumulator << [
94
- settings[:root].output_hash['id'],
95
- context.output_hash['ref_ssi']
96
- ].join
97
+ next if context.output_hash['id']
98
+
99
+ data = {
100
+ root_id: settings[:root].output_hash['id']&.first,
101
+ ref_id: context.output_hash['ref_ssi']&.first
102
+ }
103
+
104
+ accumulator << (settings[:component_identifier_format] % data)
97
105
  end
98
106
 
99
107
  to_field 'title_filing_ssi', extract_xpath('./did/unittitle'), first_only
@@ -131,6 +139,11 @@ to_field 'parent_ssi' do |_record, accumulator, _context|
131
139
  accumulator.concat settings[:parent].output_hash['ref_ssi'] || settings[:parent].output_hash['id']
132
140
  end
133
141
 
142
+ to_field 'parent_ids_ssim' do |_record, accumulator, _context|
143
+ accumulator.concat(settings[:parent].output_hash['parent_ids_ssim'] || [])
144
+ accumulator.concat settings[:parent].output_hash['id']
145
+ end
146
+
134
147
  to_field 'parent_unittitles_ssm' do |_rec, accumulator, _context|
135
148
  accumulator.concat(settings[:parent].output_hash['parent_unittitles_ssm'] || [])
136
149
  accumulator.concat settings[:parent].output_hash['normalized_title_ssm'] || []
@@ -155,12 +168,42 @@ to_field 'collection_ssim' do |_record, accumulator, _context|
155
168
  accumulator.concat settings[:root].output_hash['normalized_title_ssm']
156
169
  end
157
170
 
158
- to_field 'extent_ssm', extract_xpath('./did/physdesc/extent')
159
- to_field 'extent_tesim', extract_xpath('./did/physdesc/extent')
171
+ # This accumulates direct text from a physdesc, ignoring child elements handled elsewhere
172
+ to_field 'physdesc_tesim', extract_xpath('./did/physdesc', to_text: false) do |_record, accumulator|
173
+ accumulator.map! do |element|
174
+ physdesc = []
175
+ element.children.map do |child|
176
+ next if child.instance_of?(Nokogiri::XML::Element)
177
+
178
+ physdesc << child.text&.strip unless child.text&.strip&.empty?
179
+ end.flatten
180
+ physdesc.join(' ') unless physdesc.empty?
181
+ end
182
+ end
183
+
184
+ to_field 'extent_ssm' do |record, accumulator|
185
+ physdescs = record.xpath('./did/physdesc')
186
+ extents_per_physdesc = physdescs.map do |physdesc|
187
+ extents = physdesc.xpath('./extent').map { |e| e.text.strip }
188
+ # Join extents within the same physdesc with an empty string
189
+ extents.join(' ') unless extents.empty?
190
+ end
191
+
192
+ # Add each physdesc separately to the accumulator
193
+ accumulator.concat(extents_per_physdesc)
194
+ end
195
+
196
+ to_field 'extent_tesim' do |_record, accumulator, context|
197
+ accumulator.concat context.output_hash['extent_ssm'] || []
198
+ end
199
+
200
+ to_field 'physfacet_tesim', extract_xpath('./did/physdesc/physfacet')
201
+ to_field 'dimensions_tesim', extract_xpath('./did/physdesc/dimensions')
202
+
203
+ to_field 'indexes_html_tesm', extract_xpath('./index', to_text: false)
204
+ to_field 'indexes_tesim', extract_xpath('./index')
160
205
 
161
- to_field 'creator_ssm', extract_xpath('./did/origination')
162
206
  to_field 'creator_ssim', extract_xpath('./did/origination')
163
- to_field 'creators_ssim', extract_xpath('./did/origination')
164
207
  to_field 'creator_sort' do |record, accumulator|
165
208
  accumulator << record.xpath('./did/origination').map(&:text).join(', ')
166
209
  end
@@ -214,7 +257,7 @@ to_field 'digital_objects_ssm', extract_xpath('./dao|./did/dao', to_text: false)
214
257
  end
215
258
  end
216
259
 
217
- to_field 'date_range_ssim', extract_xpath('./did/unitdate/@normal', to_text: false) do |_record, accumulator|
260
+ to_field 'date_range_isim', extract_xpath('./did/unitdate/@normal', to_text: false) do |_record, accumulator|
218
261
  range = Arclight::YearRange.new
219
262
  next range.years if accumulator.blank?
220
263
 
@@ -244,8 +287,6 @@ to_field 'access_subjects_ssm' do |_record, accumulator, context|
244
287
  accumulator.concat(context.output_hash.fetch('access_subjects_ssim', []))
245
288
  end
246
289
 
247
- to_field 'acqinfo_ssim', extract_xpath('/ead/archdesc/acqinfo/*[local-name()!="head"]')
248
- to_field 'acqinfo_ssim', extract_xpath('/ead/archdesc/descgrp/acqinfo/*[local-name()!="head"]')
249
290
  to_field 'acqinfo_ssim', extract_xpath('./acqinfo/*[local-name()!="head"]')
250
291
  to_field 'acqinfo_ssim', extract_xpath('./descgrp/acqinfo/*[local-name()!="head"]')
251
292
 
@@ -264,7 +305,6 @@ end
264
305
  DID_SEARCHABLE_NOTES_FIELDS.map do |selector|
265
306
  to_field "#{selector}_html_tesm", extract_xpath("./did/#{selector}", to_text: false)
266
307
  end
267
- to_field 'did_note_ssm', extract_xpath('./did/note')
268
308
 
269
309
  # =============================
270
310
  # Each component child document
@@ -280,6 +320,7 @@ to_field 'components' do |record, accumulator, context|
280
320
  provide :counter, context.settings[:counter]
281
321
  provide :depth, context.settings[:depth].to_i + 1
282
322
  provide :component_traject_config, context.settings[:component_traject_config]
323
+ provide :component_identifier_format, context.settings[:component_identifier_format]
283
324
  end
284
325
 
285
326
  i.load_config_file(context.settings[:component_traject_config])
@@ -48,14 +48,17 @@ DID_SEARCHABLE_NOTES_FIELDS = %w[
48
48
  abstract
49
49
  materialspec
50
50
  physloc
51
+ note
51
52
  ].freeze
52
53
 
53
54
  settings do
55
+ provide 'component_traject_config', File.join(__dir__, 'ead2_component_config.rb')
56
+ provide 'date_normalizer', 'Arclight::NormalizedDate'
57
+ provide 'title_normalizer', 'Arclight::NormalizedTitle'
54
58
  provide 'reader_class_name', 'Arclight::Traject::NokogiriNamespacelessReader'
55
59
  provide 'solr_writer.commit_on_close', 'true'
56
60
  provide 'repository', ENV.fetch('REPOSITORY_ID', nil)
57
61
  provide 'logger', Logger.new($stderr)
58
- provide 'component_traject_config', File.join(__dir__, 'ead2_component_config.rb')
59
62
  end
60
63
 
61
64
  each_record do |_record, context|
@@ -100,22 +103,18 @@ end
100
103
  to_field 'unitid_ssm', extract_xpath('/ead/archdesc/did/unitid')
101
104
  to_field 'unitid_tesim', extract_xpath('/ead/archdesc/did/unitid')
102
105
 
103
- to_field 'normalized_title_ssm' do |_record, accumulator, context|
104
- dates = Arclight::NormalizedDate.new(
106
+ to_field 'normalized_date_ssm' do |_record, accumulator, context|
107
+ accumulator << settings['date_normalizer'].constantize.new(
105
108
  context.output_hash['unitdate_inclusive_ssm'],
106
109
  context.output_hash['unitdate_bulk_ssim'],
107
110
  context.output_hash['unitdate_other_ssim']
108
111
  ).to_s
109
- title = context.output_hash['title_ssm'].first
110
- accumulator << Arclight::NormalizedTitle.new(title, dates).to_s
111
112
  end
112
113
 
113
- to_field 'normalized_date_ssm' do |_record, accumulator, context|
114
- accumulator << Arclight::NormalizedDate.new(
115
- context.output_hash['unitdate_inclusive_ssm'],
116
- context.output_hash['unitdate_bulk_ssim'],
117
- context.output_hash['unitdate_other_ssim']
118
- ).to_s
114
+ to_field 'normalized_title_ssm' do |_record, accumulator, context|
115
+ title = context.output_hash['title_ssm']&.first
116
+ date = context.output_hash['normalized_date_ssm']&.first
117
+ accumulator << settings['title_normalizer'].constantize.new(title, date).to_s
119
118
  end
120
119
 
121
120
  to_field 'collection_title_tesim' do |_record, accumulator, context|
@@ -185,11 +184,41 @@ to_field 'digital_objects_ssm', extract_xpath('/ead/archdesc/did/dao|/ead/archde
185
184
  end
186
185
  end
187
186
 
188
- to_field 'extent_ssm', extract_xpath('/ead/archdesc/did/physdesc/extent')
189
- to_field 'extent_tesim', extract_xpath('/ead/archdesc/did/physdesc/extent')
187
+ # This accumulates direct text from a physdesc, ignoring child elements handled elsewhere
188
+ to_field 'physdesc_tesim', extract_xpath('/ead/archdesc/did/physdesc', to_text: false) do |_record, accumulator|
189
+ accumulator.map! do |element|
190
+ physdesc = []
191
+ element.children.map do |child|
192
+ next if child.instance_of?(Nokogiri::XML::Element)
193
+
194
+ physdesc << child.text&.strip unless child.text&.strip&.empty?
195
+ end.flatten
196
+ physdesc.join(' ') unless physdesc.empty?
197
+ end
198
+ end
199
+
200
+ to_field 'extent_ssm' do |record, accumulator|
201
+ physdescs = record.xpath('/ead/archdesc/did/physdesc')
202
+ extents_per_physdesc = physdescs.map do |physdesc|
203
+ extents = physdesc.xpath('./extent').map { |e| e.text.strip }
204
+ # Join extents within the same physdesc with an empty string
205
+ extents.join(' ') unless extents.empty?
206
+ end
207
+
208
+ # Add each physdesc separately to the accumulator
209
+ accumulator.concat(extents_per_physdesc)
210
+ end
211
+
212
+ to_field 'extent_tesim' do |_record, accumulator, context|
213
+ accumulator.concat context.output_hash['extent_ssm'] || []
214
+ end
215
+
216
+ to_field 'physfacet_tesim', extract_xpath('/ead/archdesc/did/physdesc/physfacet')
217
+ to_field 'dimensions_tesim', extract_xpath('/ead/archdesc/did/physdesc/dimensions')
218
+
190
219
  to_field 'genreform_ssim', extract_xpath('/ead/archdesc/controlaccess/genreform')
191
220
 
192
- to_field 'date_range_ssim', extract_xpath('/ead/archdesc/did/unitdate/@normal', to_text: false) do |_record, accumulator|
221
+ to_field 'date_range_isim', extract_xpath('/ead/archdesc/did/unitdate/@normal', to_text: false) do |_record, accumulator|
193
222
  range = Arclight::YearRange.new
194
223
  next range.years if accumulator.blank?
195
224
 
@@ -198,6 +227,9 @@ to_field 'date_range_ssim', extract_xpath('/ead/archdesc/did/unitdate/@normal',
198
227
  accumulator.replace range.years
199
228
  end
200
229
 
230
+ to_field 'indexes_html_tesm', extract_xpath('/ead/archdesc/index', to_text: false)
231
+ to_field 'indexes_tesim', extract_xpath('/ead/archdesc/index')
232
+
201
233
  SEARCHABLE_NOTES_FIELDS.map do |selector|
202
234
  to_field "#{selector}_html_tesm", extract_xpath("/ead/archdesc/#{selector}/*[local-name()!='head']", to_text: false) do |_record, accumulator|
203
235
  accumulator.map!(&:to_html)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Arclight
4
- VERSION = '1.0.1'
4
+ VERSION = '1.1.0'
5
5
  end
@@ -22,7 +22,7 @@ module Arclight
22
22
  def install_blacklight_locale_picker
23
23
  gem 'blacklight-locale_picker'
24
24
 
25
- Bundler.with_clean_env do
25
+ Bundler.with_unbundled_env do
26
26
  run 'bundle install'
27
27
  end
28
28
 
@@ -139,13 +139,13 @@ class CatalogController < ApplicationController
139
139
  # (note: It is case sensitive when searching values)
140
140
 
141
141
  config.add_facet_field 'collection', field: 'collection_ssim', limit: 10
142
- config.add_facet_field 'creator', field: 'creator_ssim', limit: 10
143
- config.add_facet_field 'date_range', field: 'date_range_ssim', range: true
142
+ config.add_facet_field 'creators', field: 'creator_ssim', limit: 10
143
+ config.add_facet_field 'date_range', field: 'date_range_isim', range: true
144
144
  config.add_facet_field 'level', field: 'level_ssim', limit: 10
145
145
  config.add_facet_field 'names', field: 'names_ssim', limit: 10
146
146
  config.add_facet_field 'repository', field: 'repository_ssim', limit: 10
147
- config.add_facet_field 'place', field: 'geogname_ssim', limit: 10
148
- config.add_facet_field 'subject', field: 'access_subjects_ssim', limit: 10
147
+ config.add_facet_field 'places', field: 'geogname_ssim', limit: 10
148
+ config.add_facet_field 'access_subjects', field: 'access_subjects_ssim', limit: 10
149
149
 
150
150
  # Have BL send all facet field names to Solr, which has been the default
151
151
  # previously. Simply remove these lines if you'd rather use Solr request
@@ -231,6 +231,20 @@ class CatalogController < ApplicationController
231
231
  pf: '${pf_title}'
232
232
  }
233
233
  end
234
+ config.add_search_field 'container', label: 'Container' do |field|
235
+ field.qt = 'search'
236
+ field.solr_parameters = {
237
+ qf: '${qf_container}',
238
+ pf: '${pf_container}'
239
+ }
240
+ end
241
+ config.add_search_field 'identifier', label: 'Identifier' do |field|
242
+ field.qt = 'search'
243
+ field.solr_parameters = {
244
+ qf: '${qf_identifier}',
245
+ pf: '${pf_identifier}'
246
+ }
247
+ end
234
248
 
235
249
  # These are the parameters passed through in search_state.params_for_search
236
250
  config.search_state_fields += %i[id group hierarchy_context original_document]
@@ -262,7 +276,7 @@ class CatalogController < ApplicationController
262
276
  # ===========================
263
277
 
264
278
  # Collection Show Page - Summary Section
265
- config.add_summary_field 'creators', field: 'creators_ssim', link_to_facet: true
279
+ config.add_summary_field 'creators', field: 'creator_ssim', link_to_facet: true
266
280
  config.add_summary_field 'abstract', field: 'abstract_html_tesm', helper_method: :render_html_tags
267
281
  config.add_summary_field 'extent', field: 'extent_ssm'
268
282
  config.add_summary_field 'language', field: 'language_ssim'
@@ -279,7 +293,13 @@ class CatalogController < ApplicationController
279
293
  config.add_background_field 'accruals', field: 'accruals_html_tesm', helper_method: :render_html_tags
280
294
  config.add_background_field 'phystech', field: 'phystech_html_tesm', helper_method: :render_html_tags
281
295
  config.add_background_field 'physloc', field: 'physloc_html_tesm', helper_method: :render_html_tags
296
+ config.add_background_field 'physdesc', field: 'physdesc_tesim', helper_method: :render_html_tags
297
+ config.add_background_field 'physfacet', field: 'physfacet_tesim', helper_method: :render_html_tags
298
+ config.add_background_field 'dimensions', field: 'dimensions_tesim', helper_method: :render_html_tags
299
+ config.add_background_field 'materialspec', field: 'materialspec_html_tesm', helper_method: :render_html_tags
300
+ config.add_background_field 'fileplan', field: 'fileplan_html_tesm', helper_method: :render_html_tags
282
301
  config.add_background_field 'descrules', field: 'descrules_ssm', helper_method: :render_html_tags
302
+ config.add_background_field 'note', field: 'note_html_tesm', helper_method: :render_html_tags
283
303
 
284
304
  # Collection Show Page - Related Section
285
305
  config.add_related_field 'relatedmaterial', field: 'relatedmaterial_html_tesm', helper_method: :render_html_tags
@@ -287,6 +307,7 @@ class CatalogController < ApplicationController
287
307
  config.add_related_field 'otherfindaid', field: 'otherfindaid_html_tesm', helper_method: :render_html_tags
288
308
  config.add_related_field 'altformavail', field: 'altformavail_html_tesm', helper_method: :render_html_tags
289
309
  config.add_related_field 'originalsloc', field: 'originalsloc_html_tesm', helper_method: :render_html_tags
310
+ config.add_related_field 'odd', field: 'odd_html_tesm', helper_method: :render_html_tags
290
311
 
291
312
  # Collection Show Page - Indexed Terms Section
292
313
  config.add_indexed_terms_field 'access_subjects', field: 'access_subjects_ssim', link_to_facet: true, separator_options: {
@@ -307,6 +328,9 @@ class CatalogController < ApplicationController
307
328
  last_word_connector: '<br/>'
308
329
  }
309
330
 
331
+ config.add_indexed_terms_field 'indexes', field: 'indexes_html_tesm',
332
+ helper_method: :render_html_tags
333
+
310
334
  # ==========================
311
335
  # COMPONENT SHOW PAGE FIELDS
312
336
  # ==========================
@@ -319,17 +343,32 @@ class CatalogController < ApplicationController
319
343
  }, if: lambda { |_context, _field_config, document|
320
344
  document.containers.present?
321
345
  }
346
+ config.add_component_field 'creators', field: 'creator_ssim', link_to_facet: true
322
347
  config.add_component_field 'abstract', field: 'abstract_html_tesm', helper_method: :render_html_tags
323
348
  config.add_component_field 'extent', field: 'extent_ssm'
324
349
  config.add_component_field 'scopecontent', field: 'scopecontent_html_tesm', helper_method: :render_html_tags
350
+ config.add_component_field 'language', field: 'language_ssim'
325
351
  config.add_component_field 'acqinfo', field: 'acqinfo_ssim', helper_method: :render_html_tags
352
+ config.add_component_field 'bioghist', field: 'bioghist_html_tesm', helper_method: :render_html_tags
326
353
  config.add_component_field 'appraisal', field: 'appraisal_html_tesm', helper_method: :render_html_tags
327
354
  config.add_component_field 'custodhist', field: 'custodhist_html_tesm', helper_method: :render_html_tags
328
355
  config.add_component_field 'processinfo', field: 'processinfo_html_tesm', helper_method: :render_html_tags
329
356
  config.add_component_field 'arrangement', field: 'arrangement_html_tesm', helper_method: :render_html_tags
330
357
  config.add_component_field 'accruals', field: 'accruals_html_tesm', helper_method: :render_html_tags
331
358
  config.add_component_field 'phystech', field: 'phystech_html_tesm', helper_method: :render_html_tags
359
+ config.add_component_field 'materialspec', field: 'materialspec_html_tesm', helper_method: :render_html_tags
332
360
  config.add_component_field 'physloc', field: 'physloc_html_tesm', helper_method: :render_html_tags
361
+ config.add_component_field 'physdesc', field: 'physdesc_tesim', helper_method: :render_html_tags
362
+ config.add_component_field 'physfacet', field: 'physfacet_tesim', helper_method: :render_html_tags
363
+ config.add_component_field 'dimensions', field: 'dimensions_tesim', helper_method: :render_html_tags
364
+ config.add_component_field 'fileplan', field: 'fileplan_html_tesm', helper_method: :render_html_tags
365
+ config.add_component_field 'altformavail', field: 'altformavail_html_tesm', helper_method: :render_html_tags
366
+ config.add_component_field 'otherfindaid', field: 'otherfindaid_html_tesm', helper_method: :render_html_tags
367
+ config.add_component_field 'odd', field: 'odd_html_tesm', helper_method: :render_html_tags
368
+ config.add_component_field 'relatedmaterial', field: 'relatedmaterial_html_tesm', helper_method: :render_html_tags
369
+ config.add_component_field 'separatedmaterial', field: 'separatedmaterial_html_tesm', helper_method: :render_html_tags
370
+ config.add_component_field 'originalsloc', field: 'originalsloc_html_tesm', helper_method: :render_html_tags
371
+ config.add_component_field 'note', field: 'note_html_tesm', helper_method: :render_html_tags
333
372
 
334
373
  # Component Show Page - Indexed Terms Section
335
374
  config.add_component_indexed_terms_field 'access_subjects', field: 'access_subjects_ssim', link_to_facet: true, separator_options: {
@@ -350,6 +389,9 @@ class CatalogController < ApplicationController
350
389
  last_word_connector: '<br/>'
351
390
  }
352
391
 
392
+ config.add_component_indexed_terms_field 'indexes', field: 'indexes_html_tesm',
393
+ helper_method: :render_html_tags
394
+
353
395
  # =================
354
396
  # ACCESS TAB FIELDS
355
397
  # =================
@@ -18,6 +18,10 @@ en:
18
18
  accruals: Accruals
19
19
  phystech: Physical / technical requirements
20
20
  physloc: Physical location
21
+ physdesc: Physical description
22
+ physfacet: Physical facet
23
+ dimensions: Dimensions
24
+ indexes: Indexes
21
25
  descrules: Rules or conventions
22
26
 
23
27
  relatedmaterial: Related material
@@ -25,6 +29,11 @@ en:
25
29
  otherfindaid: Other finding aids
26
30
  altformavail: Alternative form available
27
31
  originalsloc: Location of originals
32
+ materialspec: Material specific details
33
+ fileplan: File plan
34
+ odd: Other descriptive data
35
+ note: Note
36
+ did_note: Note
28
37
 
29
38
  access_subjects: Subjects
30
39
  names_coll: Names
@@ -7,7 +7,7 @@ nlm:
7
7
  <div class="al-repository-street-address-building">Building 38, Room 1E-21</div>
8
8
  <div class="al-repository-street-address-address1">8600 Rockville Pike</div>
9
9
  <div class="al-repository-street-address-city_state_zip_country">Bethesda, MD 20894, USA</div>
10
- thumbnail_url: "https://collections.nlm.nih.gov/pageturnerserver/ajaxp?theurl=http://localhost:8080/fedora/get/nlm:nlmuid-101421040-img/THUMB"
10
+ thumbnail_url: "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/United_States_National_Library_of_Medicine_1999.jpg/500px-United_States_National_Library_of_Medicine_1999.jpg"
11
11
  request_types:
12
12
  google_form:
13
13
  request_url: 'https://docs.google.com/a/stanford.edu/forms/d/e/1FAIpQLSeOamhY_IcFw4sPnz0ddwWWkrPaHbM5wp7JVbOLOL_mIusEyw/viewform'
@@ -24,7 +24,7 @@ sul-spec:
24
24
  <div class="al-repository-street-address-building">Green Library</div>
25
25
  <div class="al-repository-street-address-address1">557 Escondido Mall</div>
26
26
  <div class="al-repository-street-address-city_state_zip_country">Stanford, CA 94305, USA</div>
27
- thumbnail_url: 'https://library.stanford.edu/sites/default/files/styles/150x150/public/collection/image/Collections-Super-Enlight.jpg'
27
+ thumbnail_url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Stanford_University_Green_Library_Bing_Wing.jpg/500px-Stanford_University_Green_Library_Bing_Wing.jpg'
28
28
  request_types:
29
29
  aeon_web_ead:
30
30
  request_url: 'https://sample.request.com'
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arclight",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "The frontend for arclight",
5
5
  "main": "app/assets/javascript/arclight/arclight.js",
6
6
  "files": [
data/solr/conf/schema.xml CHANGED
@@ -338,6 +338,7 @@
338
338
  <copyField source="places_ssim" dest="place_teim"/>
339
339
  <copyField source="names_ssim" dest="name_teim"/>
340
340
  <copyField source="access_subjects_ssim" dest="subject_teim"/>
341
+ <copyField source="containers_ssim" dest="container_teim" />
341
342
 
342
343
  <!-- The catch all `text` field -->
343
344
  <!-- grab the fielded searches -->
@@ -345,9 +346,11 @@
345
346
  <copyField source="places_ssim" dest="text" />
346
347
  <copyField source="names_ssim" dest="text" />
347
348
  <copyField source="access_subjects_ssim" dest="text" />
349
+ <copyField source="containers_ssim" dest="text" />
350
+
348
351
  <!-- grab the searchable notes -->
349
352
  <copyField source="abstract_tesim" dest="text" />
350
- <copyField source="accessrestricct_tesim" dest="text" />
353
+ <copyField source="accessrestrict_tesim" dest="text" />
351
354
  <copyField source="accruals_tesim" dest="text" />
352
355
  <copyField source="acqinfo_tesim" dest="text" />
353
356
  <copyField source="altformavail_tesim" dest="text" />
@@ -358,10 +361,13 @@
358
361
  <copyField source="custodhist_tesim" dest="text" />
359
362
  <copyField source="did_note_tesim" dest="text" />
360
363
  <copyField source="fileplan_tesim" dest="text" />
364
+ <copyField source="indexes_tesim" dest="text" />
365
+ <copyField source="language_ssim" dest="text" />
361
366
  <copyField source="materialspec_tesim" dest="text" />
362
367
  <copyField source="note_tesim" dest="text" />
363
368
  <copyField source="odd_tesim" dest="text" />
364
369
  <copyField source="originalsloc_tesim" dest="text" />
370
+ <copyField source="parent_unittitles_tesim" dest="text" />
365
371
  <copyField source="physdesc_tesim" dest="text" />
366
372
  <copyField source="physloc_tesim" dest="text" />
367
373
  <copyField source="phystech_tesim" dest="text" />
@@ -75,7 +75,15 @@
75
75
  <int name="rows">10</int>
76
76
 
77
77
  <str name="q.alt">*:*</str>
78
- <str name="mm">2&lt;-1 5&lt;-2 6&lt;90%</str>
78
+
79
+ <!-- Minimum Should Match parameter (mm) -->
80
+ <str name="mm">4&lt;90%</str>
81
+ <!-- 1-4 term query, all must match
82
+ 5+ term query, 90% must match; rounded down, so e.g.:
83
+ * 5-10 term query, all but one must match
84
+ * 11-20 term query, all but two must match
85
+ * 21-29 term query, all but three must match, etc.
86
+ -->
79
87
 
80
88
  <!-- this qf and pf are used by default, if not otherwise specified by
81
89
  client. The default blacklight_config will use these for the
@@ -85,6 +93,11 @@
85
93
  http://wiki.apache.org/solr/LocalParams
86
94
  -->
87
95
 
96
+ <!-- In general, matches using the pf parameter should be boosted higher
97
+ than qf, so the proximity of multiple search terms in the matching
98
+ documents is significant in relevance scoring. See:
99
+ https://solr.apache.org/guide/solr/latest/query-guide/dismax-query-parser.html#pf-phrase-fields-parameter
100
+ -->
88
101
  <str name="qf">
89
102
  collection_title_tesim^150
90
103
  title_tesim^100
@@ -93,84 +106,86 @@
93
106
  name_teim^10
94
107
  place_teim^10
95
108
  subject_teim^2
109
+ id
110
+ ead_ssi
111
+ ref_ssm
112
+ unitid_ssm
113
+ container_teim
114
+ parent_unittitles_tesim
96
115
  text
97
116
  </str>
98
117
  <str name="pf">
99
- collection_title_tesim^150
100
- title_tesim^100
101
- normalized_title_teim^100
102
- unitid_identifier_match^40
103
- name_teim^10
104
- place_teim^10
105
- subject_teim^2
106
- text
118
+ collection_title_tesim^300
119
+ title_tesim^200
120
+ normalized_title_teim^200
121
+ unitid_identifier_match^80
122
+ name_teim^20
123
+ place_teim^20
124
+ subject_teim^5
125
+ id^2
126
+ ead_ssi^2
127
+ ref_ssm^2
128
+ unitid_ssm^2
129
+ container_teim^2
130
+ parent_unittitles_tesim^2
131
+ text^2
107
132
  </str>
108
133
 
134
+ <str name="qf_container">
135
+ container_teim
136
+ </str>
137
+ <str name="pf_container">
138
+ container_teim^2
139
+ </str>
140
+ <str name="qf_identifier">
141
+ id
142
+ ead_ssi
143
+ ref_ssm
144
+ unitid_ssm
145
+ </str>
146
+ <str name="pf_identifier">
147
+ id^2
148
+ ead_ssi^2
149
+ ref_ssm^2
150
+ unitid_ssm^2
151
+ </str>
109
152
  <str name="qf_name">
110
153
  name_teim
111
154
  </str>
112
155
  <str name="pf_name">
113
- name_teim
156
+ name_teim^2
114
157
  </str>
115
158
  <str name="qf_place">
116
159
  place_teim
117
160
  </str>
118
161
  <str name="pf_place">
119
- place_teim
162
+ place_teim^2
120
163
  </str>
121
164
  <str name="qf_subject">
122
165
  subject_teim
123
166
  </str>
124
167
  <str name="pf_subject">
125
- subject_teim
168
+ subject_teim^2
126
169
  </str>
127
170
  <str name="qf_title">
128
171
  title_tesim
129
172
  normalized_title_teim
130
173
  </str>
131
174
  <str name="pf_title">
132
- title_tesim
133
- normalized_title_teim
175
+ title_tesim^2
176
+ normalized_title_teim^2
134
177
  </str>
135
178
 
136
179
  <int name="ps">3</int>
137
180
  <float name="tie">0.01</float>
138
181
 
139
- <str name="fl">
140
- id,
141
- score,
142
- abstract_html_tesm,
143
- accessrestrict_html_tesm,
144
- child_component_count_isi,
145
- containers_ssim,
146
- creator_ssm,
147
- extent_ssm,
148
- geogname_ssm,
149
- has_online_content_ssim,
150
- language_ssim,
151
- level_ssm,
152
- repository_ssm,
153
- scopecontent_html_tesm,
154
- title_ssm,
155
- normalized_title_ssm,
156
- normalized_date_ssm,
157
- unitid_ssm,
158
- parent_ssim,
159
- parent_unittitles_ssm,
160
- ead_ssi,
161
- ref_ssm,
162
- component_level_isim,
163
- parent_access_restrict_tesm,
164
- parent_access_terms_tesm,
165
- names_coll_ssim
166
- places_ssim
167
- </str>
182
+ <str name="fl">*</str>
168
183
 
169
184
  <str name="facet">true</str>
170
185
  <str name="facet.mincount">1</str>
171
186
  <str name="facet.field">level_ssim</str>
172
187
  <str name="facet.field">creator_ssim</str>
173
- <str name="facet.field">date_range_ssim</str>
188
+ <str name="facet.field">date_range_isim</str>
174
189
  <str name="facet.field">names_ssim</str>
175
190
  <str name="facet.field">geogname_ssim</str>
176
191
  <str name="facet.field">access_subjects_ssim</str>
data/template.rb CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  gem 'arclight'
4
4
 
5
- run 'bundle install'
5
+ after_bundle do
6
+ generate 'blacklight:install', '--devise'
7
+ generate 'arclight:install', '-f'
6
8
 
7
- generate 'blacklight:install', '--devise'
8
- generate 'arclight:install', '-f'
9
-
10
- rake 'db:migrate'
9
+ rake 'db:migrate'
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arclight
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Hardy
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2023-05-01 00:00:00.000000000 Z
14
+ date: 2023-12-19 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: blacklight
@@ -271,20 +271,6 @@ dependencies:
271
271
  - - ">="
272
272
  - !ruby/object:Gem::Version
273
273
  version: '0'
274
- - !ruby/object:Gem::Dependency
275
- name: webdrivers
276
- requirement: !ruby/object:Gem::Requirement
277
- requirements:
278
- - - ">="
279
- - !ruby/object:Gem::Version
280
- version: '0'
281
- type: :development
282
- prerelease: false
283
- version_requirements: !ruby/object:Gem::Requirement
284
- requirements:
285
- - - ">="
286
- - !ruby/object:Gem::Version
287
- version: '0'
288
274
  description: ''
289
275
  email:
290
276
  - drh@stanford.edu
@@ -336,6 +322,7 @@ files:
336
322
  - app/assets/stylesheets/arclight/modules/mastheads.scss
337
323
  - app/assets/stylesheets/arclight/modules/repositories.scss
338
324
  - app/assets/stylesheets/arclight/modules/repository_card.scss
325
+ - app/assets/stylesheets/arclight/modules/search_form.scss
339
326
  - app/assets/stylesheets/arclight/modules/search_results.scss
340
327
  - app/assets/stylesheets/arclight/modules/show_collection.scss
341
328
  - app/assets/stylesheets/arclight/modules/truncator.scss
@@ -431,6 +418,7 @@ files:
431
418
  - app/views/arclight/requests/_aeon_external_request_endpoint.html.erb
432
419
  - app/views/arclight/requests/_aeon_web_ead.html.erb
433
420
  - app/views/arclight/requests/_google_form.html.erb
421
+ - app/views/catalog/_document_list.html.erb
434
422
  - app/views/catalog/_group.html.erb
435
423
  - app/views/catalog/_group_toggle.html.erb
436
424
  - app/views/catalog/_search_results_header.html.erb
@@ -513,7 +501,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
513
501
  - !ruby/object:Gem::Version
514
502
  version: '0'
515
503
  requirements: []
516
- rubygems_version: 3.4.12
504
+ rubygems_version: 3.4.10
517
505
  signing_key:
518
506
  specification_version: 4
519
507
  summary: A Blacklight-based environment to support discovery and delivery for archives