blacklight-spotlight 4.2.0 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/app/assets/javascripts/spotlight/spotlight.esm.js +119 -3
  4. data/app/assets/javascripts/spotlight/spotlight.esm.js.map +1 -1
  5. data/app/assets/javascripts/spotlight/spotlight.js +119 -3
  6. data/app/assets/javascripts/spotlight/spotlight.js.map +1 -1
  7. data/app/controllers/concerns/spotlight/search_helper.rb +2 -2
  8. data/app/controllers/spotlight/appearances_controller.rb +1 -1
  9. data/app/controllers/spotlight/bulk_actions_controller.rb +1 -1
  10. data/app/controllers/spotlight/bulk_updates_controller.rb +1 -1
  11. data/app/controllers/spotlight/featured_images_controller.rb +1 -1
  12. data/app/controllers/spotlight/groups_controller.rb +1 -1
  13. data/app/controllers/spotlight/pages_controller.rb +1 -1
  14. data/app/controllers/spotlight/resources/csv_upload_controller.rb +1 -1
  15. data/app/controllers/spotlight/roles_controller.rb +1 -1
  16. data/app/controllers/spotlight/searches_controller.rb +1 -1
  17. data/app/controllers/spotlight/translations_controller.rb +2 -2
  18. data/app/helpers/spotlight/application_helper.rb +2 -2
  19. data/app/helpers/spotlight/crop_helper.rb +1 -1
  20. data/app/helpers/spotlight/pages_helper.rb +7 -0
  21. data/app/helpers/spotlight/title_helper.rb +2 -2
  22. data/app/javascript/spotlight/admin/blocks/browse_group_categories_block.js +1 -1
  23. data/app/javascript/spotlight/admin/blocks/resources_block.js +82 -1
  24. data/app/javascript/spotlight/admin/blocks/solr_documents_embed_block.js +1 -1
  25. data/app/javascript/spotlight/admin/blocks/uploaded_items_block.js +21 -0
  26. data/app/javascript/spotlight/admin/sir-trevor/locales.js +11 -0
  27. data/app/jobs/concerns/spotlight/job_tracking.rb +1 -1
  28. data/app/jobs/spotlight/add_tags_job.rb +2 -2
  29. data/app/jobs/spotlight/add_uploads_from_csv.rb +1 -1
  30. data/app/jobs/spotlight/change_visibility_job.rb +2 -2
  31. data/app/jobs/spotlight/process_bulk_updates_csv_job.rb +2 -2
  32. data/app/jobs/spotlight/reindex_exhibit_job.rb +1 -1
  33. data/app/jobs/spotlight/reindex_job.rb +6 -6
  34. data/app/jobs/spotlight/remove_tags_job.rb +2 -2
  35. data/app/jobs/spotlight/rename_tags_job.rb +2 -2
  36. data/app/models/concerns/spotlight/exhibit_defaults.rb +1 -1
  37. data/app/models/concerns/spotlight/exhibit_documents.rb +2 -2
  38. data/app/models/concerns/spotlight/solr_document/finder.rb +4 -4
  39. data/app/models/concerns/spotlight/solr_document.rb +4 -4
  40. data/app/models/concerns/spotlight/translatables.rb +1 -1
  41. data/app/models/spotlight/analytics/ga.rb +1 -1
  42. data/app/models/spotlight/attachment.rb +1 -1
  43. data/app/models/spotlight/background_job_progress.rb +1 -1
  44. data/app/models/spotlight/contact_email.rb +1 -1
  45. data/app/models/spotlight/contact_form.rb +2 -2
  46. data/app/models/spotlight/custom_field.rb +2 -2
  47. data/app/models/spotlight/custom_search_field.rb +2 -2
  48. data/app/models/spotlight/job_tracker.rb +1 -1
  49. data/app/models/spotlight/page.rb +2 -2
  50. data/app/models/spotlight/resources/iiif_service.rb +4 -4
  51. data/app/models/spotlight/role.rb +1 -1
  52. data/app/models/spotlight/search.rb +2 -2
  53. data/app/services/spotlight/bulk_updates_csv_template_service.rb +2 -2
  54. data/app/services/spotlight/clone_translated_page_from_locale.rb +1 -1
  55. data/app/services/spotlight/etl/pipeline.rb +1 -1
  56. data/app/views/shared/_exhibit_navbar.html.erb +1 -1
  57. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb +3 -3
  58. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb +3 -3
  59. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb +3 -3
  60. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb +3 -3
  61. data/app/views/spotlight/sir_trevor/blocks/_uploaded_items_block.html.erb +3 -2
  62. data/lib/migration/iiif.rb +3 -3
  63. data/lib/spotlight/engine.rb +4 -17
  64. data/lib/spotlight/version.rb +1 -1
  65. data/lib/tasks/spotlight_tasks.rake +3 -3
  66. data/spec/factories/exhibits.rb +1 -1
  67. metadata +3 -3
@@ -6,14 +6,14 @@ module Spotlight
6
6
  def search_service(user_params = respond_to?(:search_state, true) ? search_state.to_h : {})
7
7
  klass = respond_to?(:search_service_class) ? search_service_class : Blacklight::SearchService
8
8
 
9
- klass.new(config: blacklight_config, user_params: user_params, **search_service_context)
9
+ klass.new(config: blacklight_config, user_params:, **search_service_context)
10
10
  end
11
11
 
12
12
  # @return [Hash] a hash of context information to pass through to the search service
13
13
  def search_service_context
14
14
  return {} unless respond_to?(:current_ability)
15
15
 
16
- { current_ability: current_ability }
16
+ { current_ability: }
17
17
  end
18
18
  end
19
19
  end
@@ -16,7 +16,7 @@ module Spotlight
16
16
  def update
17
17
  if @exhibit.update(exhibit_params)
18
18
  notice = t(:'helpers.submit.spotlight_default.updated', model: @exhibit.class.model_name.human.downcase)
19
- redirect_to edit_exhibit_appearance_path(@exhibit), notice: notice
19
+ redirect_to edit_exhibit_appearance_path(@exhibit), notice:
20
20
  else
21
21
  render 'edit'
22
22
  end
@@ -23,7 +23,7 @@ module Spotlight
23
23
 
24
24
  def handle_bulk_action_with_job(job, i18n_key: action_name, **params)
25
25
  job.perform_later(
26
- solr_params: solr_params,
26
+ solr_params:,
27
27
  exhibit: current_exhibit,
28
28
  user: current_user,
29
29
  **params
@@ -46,7 +46,7 @@ module Spotlight
46
46
  def csv_template
47
47
  boolean = ActiveModel::Type::Boolean.new
48
48
  Spotlight::BulkUpdatesCsvTemplateService.new(exhibit: current_exhibit).template(
49
- view_context: view_context,
49
+ view_context:,
50
50
  title: boolean.cast(reference_field_params[:item_title]),
51
51
  tags: boolean.cast(updatable_field_params[:tags]),
52
52
  visibility: boolean.cast(updatable_field_params[:visibility])
@@ -7,7 +7,7 @@ module Spotlight
7
7
 
8
8
  def create
9
9
  if @featured_image.save && @featured_image.file_present?
10
- render json: { tilesource: tilesource, id: @featured_image.id }
10
+ render json: { tilesource:, id: @featured_image.id }
11
11
  else
12
12
  render json: { error: 'unable to create image' }, status: :bad_request
13
13
  end
@@ -50,7 +50,7 @@ module Spotlight
50
50
  else
51
51
  t(:'helpers.submit.group.batch_error', model: human_name)
52
52
  end
53
- redirect_to spotlight.exhibit_searches_path(anchor: 'browse-groups'), notice: notice
53
+ redirect_to spotlight.exhibit_searches_path(anchor: 'browse-groups'), notice:
54
54
  end
55
55
 
56
56
  protected
@@ -93,7 +93,7 @@ module Spotlight
93
93
  else
94
94
  t(:'helpers.submit.page.batch_error', model: human_name)
95
95
  end
96
- redirect_back fallback_location: spotlight.exhibit_dashboard_path(@exhibit), notice: notice
96
+ redirect_back fallback_location: spotlight.exhibit_dashboard_path(@exhibit), notice:
97
97
  end
98
98
 
99
99
  def clone
@@ -36,7 +36,7 @@ module Spotlight
36
36
  end
37
37
 
38
38
  def data_param_keys
39
- Spotlight::Resources::Upload.fields(current_exhibit).map(&:field_name) + current_exhibit.custom_fields.map(&:field)
39
+ Spotlight::Resources::Upload.fields(current_exhibit).map(&:field_name) + current_exhibit.custom_fields.map(&:slug)
40
40
  end
41
41
 
42
42
  # Gets an IO-like object for the CSV parser to use.
@@ -24,7 +24,7 @@ module Spotlight
24
24
  if @exhibit.update(exhibit_params)
25
25
  notice = any_deleted ? t(:'helpers.submit.role.destroyed') : t(:'helpers.submit.role.updated')
26
26
  Spotlight::InviteUsersService.call(resource: @exhibit)
27
- redirect_to exhibit_roles_path(@exhibit), notice: notice
27
+ redirect_to exhibit_roles_path(@exhibit), notice:
28
28
  else
29
29
  flash[:alert] = t(:'helpers.submit.role.batch_error', count: exhibit_params[:roles_attributes].to_unsafe_h.size)
30
30
  render action: 'index'
@@ -78,7 +78,7 @@ module Spotlight
78
78
  else
79
79
  t(:'helpers.submit.search.batch_error', model: Spotlight::Search.model_name.human.pluralize.downcase)
80
80
  end
81
- redirect_back fallback_location: fallback_url, notice: notice
81
+ redirect_back fallback_location: fallback_url, notice:
82
82
  end
83
83
 
84
84
  protected
@@ -21,7 +21,7 @@ module Spotlight
21
21
  if current_exhibit.update(exhibit_params)
22
22
  I18n.reload! # reload since we're memoizing
23
23
  notice = t(:'helpers.submit.spotlight_default.updated', model: current_exhibit.class.model_name.human.downcase)
24
- redirect_to edit_exhibit_translations_path(current_exhibit, language: @language, tab: @tab), notice: notice
24
+ redirect_to edit_exhibit_translations_path(current_exhibit, language: @language, tab: @tab), notice:
25
25
  else
26
26
  render 'edit'
27
27
  end
@@ -31,7 +31,7 @@ module Spotlight
31
31
  if current_exhibit.update(import_exhibit_params)
32
32
  I18n.reload! # reload since we're memoizing
33
33
  notice = t(:'helpers.submit.spotlight_default.updated', model: current_exhibit.class.model_name.human.downcase)
34
- redirect_to edit_exhibit_translations_path(current_exhibit, language: @language), notice: notice
34
+ redirect_to edit_exhibit_translations_path(current_exhibit, language: @language), notice:
35
35
  else
36
36
  render 'edit'
37
37
  end
@@ -37,7 +37,7 @@ module Spotlight
37
37
  initial_exception = nil
38
38
 
39
39
  ([self] + additional_locale_routing_scopes).each do |scope|
40
- return scope.public_send(:url_for, params.to_unsafe_h.merge(locale: locale))
40
+ return scope.public_send(:url_for, params.to_unsafe_h.merge(locale:))
41
41
  rescue ActionController::UrlGenerationError => e
42
42
  initial_exception ||= e
43
43
  end
@@ -51,7 +51,7 @@ module Spotlight
51
51
 
52
52
  # Can search for named routes directly in the main app, omitting
53
53
  # the "main_app." prefix
54
- def method_missing(method, *args, &block)
54
+ def method_missing(method, *args, &)
55
55
  if main_app_url_helper?(method)
56
56
  main_app.send(method, *args)
57
57
  else
@@ -11,7 +11,7 @@ module Spotlight
11
11
  concat f.hidden_field(:iiif_image_id)
12
12
  concat f.hidden_field(:iiif_region)
13
13
  concat f.hidden_field(:iiif_tilesource)
14
- concat iiif_cropper_tag(f, initial_crop_selection: initial_crop_selection)
14
+ concat iiif_cropper_tag(f, initial_crop_selection:)
15
15
  end
16
16
  end
17
17
 
@@ -80,5 +80,12 @@ module Spotlight
80
80
  def configurations_for_current_page
81
81
  Spotlight::PageConfigurations.new(context: self, page: @page).as_json
82
82
  end
83
+
84
+ def resource_alt_text(options, default)
85
+ return '' if options[:decorative].present?
86
+ return options[:alt_text] if options[:alt_text].present?
87
+
88
+ default
89
+ end
83
90
  end
84
91
  end
@@ -15,7 +15,7 @@ module Spotlight
15
15
  def page_title(section, title = nil)
16
16
  title ||= t(:'.header', default: '').presence
17
17
 
18
- head_content = t(:'spotlight.html_admin_title', section: section, title: title) if section && title
18
+ head_content = t(:'spotlight.html_admin_title', section:, title:) if section && title
19
19
  head_content ||= section || title
20
20
  set_html_page_title(head_content)
21
21
 
@@ -28,7 +28,7 @@ module Spotlight
28
28
  end
29
29
 
30
30
  def set_html_page_title(title = nil)
31
- @page_title = strip_tags(t(:'spotlight.html_title', title: title || t(:'.title', default: :'.header'), application_name: application_name)).html_safe
31
+ @page_title = strip_tags(t(:'spotlight.html_title', title: title || t(:'.title', default: :'.header'), application_name:)).html_safe
32
32
  end
33
33
  end
34
34
  end
@@ -82,7 +82,7 @@ SirTrevor.Blocks.BrowseGroupCategories = (function(){
82
82
  },
83
83
 
84
84
  item_options: function() { return `
85
- '<label>
85
+ <label>
86
86
  <input type="hidden" name="display-item-counts" value="false" />
87
87
  <input type="checkbox" name="display-item-counts" value="true" checked />
88
88
  ${i18n.t("blocks:browse_group_categories:item_counts")}
@@ -8,10 +8,24 @@ Core.Block.Resources = (function(){
8
8
  formable: true,
9
9
  autocompleteable: true,
10
10
  show_heading: true,
11
+ show_alt_text: true,
11
12
 
12
13
  title: function() { return i18n.t("blocks:" + this.type + ":title"); },
13
14
  description: function() { return i18n.t("blocks:" + this.type + ":description"); },
14
-
15
+ alt_text_guidelines: function() {
16
+ if (this.show_alt_text) {
17
+ return i18n.t("blocks:alt_text_guidelines:intro");
18
+ }
19
+ return "";
20
+ },
21
+ alt_text_guidelines_link: function() {
22
+ if (this.show_alt_text) {
23
+ var link_url = i18n.t("blocks:alt_text_guidelines:link_url");
24
+ var link_label = i18n.t("blocks:alt_text_guidelines:link_label");
25
+ return '<a target="_blank" href="' + link_url + '">' + link_label + '</a>';
26
+ }
27
+ return "";
28
+ },
15
29
  icon_name: "resources",
16
30
  blockGroup: function() { return i18n.t("blocks:group:items") },
17
31
 
@@ -21,6 +35,8 @@ Core.Block.Resources = (function(){
21
35
  show_secondary_field_key: "show-secondary-caption",
22
36
 
23
37
  display_checkbox: "display-checkbox",
38
+ decorative_checkbox: "decorative-checkbox",
39
+ alt_text_textarea: "alt-text-textarea",
24
40
 
25
41
  globalIndex: 0,
26
42
 
@@ -28,6 +44,13 @@ Core.Block.Resources = (function(){
28
44
  return [];
29
45
  },
30
46
 
47
+ _altTextFieldsHTML: function(index, data) {
48
+ if (this.show_alt_text) {
49
+ return this.altTextHTML(index, data);
50
+ }
51
+ return "";
52
+ },
53
+
31
54
  _itemPanel: function(data) {
32
55
  var index = "item_" + this.globalIndex++;
33
56
  var checked;
@@ -58,6 +81,7 @@ Core.Block.Resources = (function(){
58
81
  <div class="main">
59
82
  <div class="title card-title">${data.title}</div>
60
83
  <div>${(data.slug || data.id)}</div>
84
+ ${this._altTextFieldsHTML(index, data)}
61
85
  </div>
62
86
  <div class="remove float-right float-end">
63
87
  <a data-item-grid-panel-remove="true" href="#">${i18n.t("blocks:resources:panel:remove")}</a>
@@ -94,6 +118,7 @@ Core.Block.Resources = (function(){
94
118
 
95
119
  createItemPanel: function(data) {
96
120
  var panel = this._itemPanel(data);
121
+ this.attachAltTextHandlers(panel);
97
122
  $(panel).appendTo($('.panels > ol', this.inner));
98
123
  $('[data-behavior="nestable"]', this.inner).trigger('change');
99
124
  },
@@ -126,11 +151,67 @@ Core.Block.Resources = (function(){
126
151
  return `<div class="form resources-admin clearfix">
127
152
  <div class="widget-header">
128
153
  ${this.description()}
154
+ ${this.alt_text_guidelines()}
155
+ ${this.alt_text_guidelines_link()}
129
156
  </div>
130
157
  ${this.content()}
131
158
  </div>`
132
159
  },
133
160
 
161
+ _altTextData: function(data) {
162
+ const isDecorative = data.decorative;
163
+ const altText = isDecorative ? '' : (data.alt_text || '');
164
+ const altTextBackup = data.alt_text_backup || '';
165
+ const placeholderAttr = isDecorative ? '' : `placeholder="${i18n.t("blocks:resources:alt_text:placeholder")}"`;
166
+ const disabledAttr = isDecorative ? 'disabled' : '';
167
+
168
+ return { isDecorative, altText, altTextBackup, placeholderAttr, disabledAttr };
169
+ },
170
+
171
+ altTextHTML: function(index, data) {
172
+ const { isDecorative, altText, altTextBackup, placeholderAttr, disabledAttr } = this._altTextData(data);
173
+ return `<div class="mt-2 pt-2 d-flex">
174
+ <div class="me-2 mr-2">
175
+ <label class="col-form-label pb-0 pt-1" for="${this.formId(this.alt_text_textarea + '_' + data.id)}">${i18n.t("blocks:resources:alt_text:alternative_text")}</label>
176
+ <div class="form-check mb-1 justify-content-end">
177
+ <input class="form-check-input" type="checkbox"
178
+ id="${this.formId(this.decorative_checkbox + '_' + data.id)}" name="item[${index}][decorative]" ${isDecorative ? 'checked' : ''}>
179
+ <label class="form-check-label" for="${this.formId(this.decorative_checkbox + '_' + data.id)}">${i18n.t("blocks:resources:alt_text:decorative")}</label>
180
+ </div>
181
+ </div>
182
+ <div class="flex-grow-1 flex-fill d-flex">
183
+ <input type="hidden" name="item[${index}][alt_text_backup]" value="${altTextBackup}" />
184
+ <textarea class="form-control w-100" rows="2" ${placeholderAttr}
185
+ id="${this.formId(this.alt_text_textarea + '_' + data.id)}" name="item[${index}][alt_text]" ${disabledAttr}>${altText}</textarea>
186
+ </div>
187
+ </div>`
188
+ },
189
+
190
+ attachAltTextHandlers: function(panel) {
191
+ if (this.show_alt_text) {
192
+ const decorativeCheckbox = $('input[name$="[decorative]"]', panel);
193
+ const altTextInput = $('textarea[name$="[alt_text]"]', panel);
194
+ const altTextBackupInput = $('input[name$="[alt_text_backup]"]', panel);
195
+
196
+ decorativeCheckbox.on('change', function() {
197
+ const isDecorative = this.checked;
198
+ if (isDecorative) {
199
+ altTextBackupInput.val(altTextInput.val());
200
+ altTextInput.val('');
201
+ } else {
202
+ altTextInput.val(altTextBackupInput.val());
203
+ }
204
+ altTextInput
205
+ .prop('disabled', isDecorative)
206
+ .attr('placeholder', isDecorative ? '' : i18n.t("blocks:resources:alt_text:placeholder"));
207
+ });
208
+
209
+ altTextInput.on('input', function() {
210
+ $(this).data('lastValue', $(this).val());
211
+ });
212
+ }
213
+ },
214
+
134
215
  onBlockRender: function() {
135
216
  SpotlightNestable.init($('[data-behavior="nestable"]', this.inner));
136
217
 
@@ -4,7 +4,7 @@ SirTrevor.Blocks.SolrDocumentsEmbed = (function(){
4
4
 
5
5
  return SirTrevor.Blocks.SolrDocumentsBase.extend({
6
6
  type: "solr_documents_embed",
7
-
7
+ show_alt_text: false,
8
8
  icon_name: "item_embed",
9
9
 
10
10
  item_options: function() { return "" },
@@ -96,6 +96,7 @@ SirTrevor.Blocks.UploadedItems = (function(){
96
96
  <label for="${this.formId('link_' + dataId)}" class="col-form-label col-md-3">${i18n.t("blocks:uploaded_items:link")}</label>
97
97
  <input type="text" class="form-control col" id="${this.formId('link_' + dataId)}" name="item[${index}][link]" data-field="link"/>
98
98
  </div>
99
+ ${this._altTextFieldsHTML(index, data)}
99
100
  </div>
100
101
  <div class="remove float-right float-end">
101
102
  <a data-item-grid-panel-remove="true" href="#">${i18n.t("blocks:resources:panel:remove")}</a>
@@ -123,6 +124,8 @@ SirTrevor.Blocks.UploadedItems = (function(){
123
124
  return `<div class="form oembed-text-admin clearfix">
124
125
  <div class="widget-header">
125
126
  ${this.description()}
127
+ ${this.alt_text_guidelines()}
128
+ ${this.alt_text_guidelines_link()}
126
129
  </div>
127
130
  <div class="row">
128
131
  <div class="form-group mb-3 col-md-8">
@@ -142,6 +145,24 @@ SirTrevor.Blocks.UploadedItems = (function(){
142
145
  </div>`
143
146
  },
144
147
 
148
+ altTextHTML: function(index, data) {
149
+ const { isDecorative, altText, altTextBackup, placeholderAttr, disabledAttr } = this._altTextData(data);
150
+ return `
151
+ <div class="field row mr-3 me-3">
152
+ <div class="col-lg-3 ps-md-2 pl-md-2">
153
+ <label class="col-form-label text-nowrap pb-0 pt-1 justify-content-md-start justify-content-lg-end d-flex" for="${this.formId(this.alt_text_textarea + '_' + data.id)}">${i18n.t("blocks:resources:alt_text:alternative_text")}</label>
154
+ <div class="form-check d-flex justify-content-md-start justify-content-lg-end">
155
+ <input class="form-check-input" type="checkbox"
156
+ id="${this.formId(this.decorative_checkbox + '_' + data.id)}" name="item[${index}][decorative]" ${isDecorative ? 'checked' : ''}>
157
+ <label class="form-check-label" for="${this.formId(this.decorative_checkbox + '_' + data.id)}">${i18n.t("blocks:resources:alt_text:decorative")}</label>
158
+ </div>
159
+ </div>
160
+ <input type="hidden" name="item[${index}][alt_text_backup]" value="${altTextBackup}" />
161
+ <textarea class="col-lg-9" rows="2" ${placeholderAttr}
162
+ id="${this.formId(this.alt_text_textarea + '_' + data.id)}" name="item[${index}][alt_text]" ${disabledAttr}>${altText}</textarea>
163
+ </div>`
164
+ },
165
+
145
166
  zpr_key: 'zpr_link'
146
167
  });
147
168
  })();
@@ -51,6 +51,11 @@ SirTrevor.Locales.en.blocks = $.extend(SirTrevor.Locales.en.blocks, {
51
51
  drag: "Drag",
52
52
  display: "Display?",
53
53
  remove: "Remove"
54
+ },
55
+ alt_text: {
56
+ decorative: "Decorative",
57
+ alternative_text: "Alternative text",
58
+ placeholder: "Enter alt text for this item..."
54
59
  }
55
60
  },
56
61
 
@@ -116,5 +121,11 @@ SirTrevor.Locales.en.blocks = $.extend(SirTrevor.Locales.en.blocks, {
116
121
  group: {
117
122
  undefined: "Standard widgets",
118
123
  items: "Exhibit item widgets"
124
+ },
125
+
126
+ alt_text_guidelines: {
127
+ intro: 'For each item, please enter alternative text or appropriately check the decorative box. ',
128
+ link_label: 'Guidelines for writing alt text.',
129
+ link_url: 'https://www.w3.org/WAI/tutorials/images/'
119
130
  }
120
131
  });
@@ -55,7 +55,7 @@ module Spotlight
55
55
  private
56
56
 
57
57
  def find_or_initialize_job_tracker
58
- JobTracker.find_or_create_by(job_id: job_id) do |tracker|
58
+ JobTracker.find_or_create_by(job_id:) do |tracker|
59
59
  tracker.job_class = self.class.name
60
60
  tracker.status = 'enqueued'
61
61
  end
@@ -19,12 +19,12 @@ module Spotlight
19
19
  document.reindex(update_params: {})
20
20
  progress&.increment
21
21
  rescue StandardError => e
22
- job_tracker.append_log_entry(type: :error, exhibit: exhibit, message: e.to_s)
22
+ job_tracker.append_log_entry(type: :error, exhibit:, message: e.to_s)
23
23
  @errors += 1
24
24
  mark_job_as_failed!
25
25
  end
26
26
  exhibit.blacklight_config.repository.connection.commit
27
- job_tracker.append_log_entry(type: :info, exhibit: exhibit, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
27
+ job_tracker.append_log_entry(type: :info, exhibit:, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
28
28
  end
29
29
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
30
30
  end
@@ -44,7 +44,7 @@ module Spotlight
44
44
 
45
45
  resource = Spotlight::Resources::Upload.new(
46
46
  data: row,
47
- exhibit: exhibit
47
+ exhibit:
48
48
  )
49
49
  resource.build_upload(remote_image_url: url) unless url == '~'
50
50
 
@@ -21,12 +21,12 @@ module Spotlight
21
21
  document.reindex(update_params: {})
22
22
  progress&.increment
23
23
  rescue StandardError => e
24
- job_tracker.append_log_entry(type: :error, exhibit: exhibit, message: e.to_s)
24
+ job_tracker.append_log_entry(type: :error, exhibit:, message: e.to_s)
25
25
  @errors += 1
26
26
  mark_job_as_failed!
27
27
  end
28
28
  exhibit.blacklight_config.repository.connection.commit
29
- job_tracker.append_log_entry(type: :info, exhibit: exhibit, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
29
+ job_tracker.append_log_entry(type: :info, exhibit:, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
30
30
  end
31
31
  # rubocop:enable Metrics/MethodLength
32
32
  end
@@ -20,13 +20,13 @@ module Spotlight
20
20
  process_row(exhibit, row)
21
21
  progress&.increment
22
22
  rescue StandardError => e
23
- job_tracker.append_log_entry(type: :error, exhibit: exhibit, message: e.to_s)
23
+ job_tracker.append_log_entry(type: :error, exhibit:, message: e.to_s)
24
24
  errors += 1
25
25
  mark_job_as_failed!
26
26
  end
27
27
 
28
28
  exhibit.blacklight_config.repository.connection.commit
29
- job_tracker.append_log_entry(type: :info, exhibit: exhibit, message: "#{progress&.progress} of #{progress&.total} (#{errors} errors)")
29
+ job_tracker.append_log_entry(type: :info, exhibit:, message: "#{progress&.progress} of #{progress&.total} (#{errors} errors)")
30
30
  end
31
31
  end
32
32
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
@@ -30,7 +30,7 @@ module Spotlight
30
30
 
31
31
  def perform_later_in_batches(exhibit, of:)
32
32
  last = 0
33
- exhibit.resources.select(:id).in_batches(of: of) do |batch|
33
+ exhibit.resources.select(:id).in_batches(of:) do |batch|
34
34
  last = batch.last.id
35
35
  Spotlight::ReindexJob.perform_later(exhibit, reports_on: job_tracker, start: batch.first.id, finish: batch.last.id)
36
36
  end
@@ -29,7 +29,7 @@ module Spotlight
29
29
  error_handler = lambda do |pipeline, exception, _data|
30
30
  job_tracker.append_log_entry(
31
31
  type: :error,
32
- exhibit: exhibit,
32
+ exhibit:,
33
33
  message: exception.to_s,
34
34
  backtrace: exception.backtrace.first(5).join("\n"),
35
35
  resource_id: (pipeline.source.id if pipeline.source.respond_to?(:id))
@@ -38,8 +38,8 @@ module Spotlight
38
38
  errors += 1
39
39
  end
40
40
 
41
- resource_list(exhibit_or_resources, start: start, finish: finish).each do |resource|
42
- resource.reindex(touch: false, commit: false, job_tracker: job_tracker, additional_data: job_data, on_error: error_handler) do |*|
41
+ resource_list(exhibit_or_resources, start:, finish:).each do |resource|
42
+ resource.reindex(touch: false, commit: false, job_tracker:, additional_data: job_data, on_error: error_handler) do |*|
43
43
  progress&.increment
44
44
  end
45
45
  rescue StandardError => e
@@ -48,14 +48,14 @@ module Spotlight
48
48
 
49
49
  job_tracker.append_log_entry(
50
50
  type: :summary,
51
- exhibit: exhibit,
51
+ exhibit:,
52
52
  message: I18n.t(
53
53
  'spotlight.job_trackers.show.messages.status.in_progress',
54
54
  progress: progress.progress,
55
55
  total: progress.total,
56
56
  errors: (I18n.t('spotlight.job_trackers.show.messages.errors', count: errors) if errors.positive?)
57
57
  ),
58
- progress: progress.progress, total: progress.total, errors: errors
58
+ progress: progress.progress, total: progress.total, errors:
59
59
  )
60
60
  end
61
61
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
@@ -85,7 +85,7 @@ module Spotlight
85
85
 
86
86
  def resource_list(exhibit_or_resources, start: nil, finish: nil)
87
87
  if exhibit_or_resources.is_a?(Spotlight::Exhibit)
88
- exhibit_or_resources.resources.find_each(start: start, finish: finish)
88
+ exhibit_or_resources.resources.find_each(start:, finish:)
89
89
  else
90
90
  Array(exhibit_or_resources)
91
91
  end
@@ -19,12 +19,12 @@ module Spotlight
19
19
  document.reindex(update_params: {})
20
20
  progress&.increment
21
21
  rescue StandardError => e
22
- job_tracker.append_log_entry(type: :error, exhibit: exhibit, message: e.to_s)
22
+ job_tracker.append_log_entry(type: :error, exhibit:, message: e.to_s)
23
23
  @errors += 1
24
24
  mark_job_as_failed!
25
25
  end
26
26
  exhibit.blacklight_config.repository.connection.commit
27
- job_tracker.append_log_entry(type: :info, exhibit: exhibit, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
27
+ job_tracker.append_log_entry(type: :info, exhibit:, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
28
28
  end
29
29
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
30
30
  end
@@ -20,13 +20,13 @@ module Spotlight
20
20
  exhibit.tag(sidecar, with: all_tags, on: :tags)
21
21
  sidecar.document.reindex(update_params: {})
22
22
  rescue StandardError => e
23
- job_tracker.append_log_entry(type: :error, exhibit: exhibit, message: e.to_s)
23
+ job_tracker.append_log_entry(type: :error, exhibit:, message: e.to_s)
24
24
  @errors += 1
25
25
  mark_job_as_failed!
26
26
  end
27
27
 
28
28
  exhibit.blacklight_config.repository.connection.commit
29
- job_tracker.append_log_entry(type: :info, exhibit: exhibit, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
29
+ job_tracker.append_log_entry(type: :info, exhibit:, message: "#{progress.progress} of #{progress.total} (#{@errors} errors)")
30
30
  end
31
31
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
32
32
  end
@@ -35,7 +35,7 @@ module Spotlight
35
35
 
36
36
  def initialize_main_navigation
37
37
  default_main_navigations.each_with_index do |nav_type, weight|
38
- main_navigations.create nav_type: nav_type, weight: weight
38
+ main_navigations.create nav_type:, weight:
39
39
  end
40
40
  end
41
41
 
@@ -8,7 +8,7 @@ module Spotlight
8
8
  # filtered by the exhibit-specific solr field.
9
9
  #
10
10
  # @return [Enumerable<SolrDocument>]
11
- def solr_documents(&block)
11
+ def solr_documents(&)
12
12
  return to_enum(:solr_documents) unless block_given?
13
13
 
14
14
  start = 0
@@ -17,7 +17,7 @@ module Spotlight
17
17
  response = repository.search(search_params.start(start).to_h)
18
18
 
19
19
  while response.documents.present?
20
- response.documents.each(&block)
20
+ response.documents.each(&)
21
21
  start += response.documents.length
22
22
  response = repository.search(search_params.start(start).to_h)
23
23
  end
@@ -19,17 +19,17 @@ module Spotlight
19
19
  @index ||= blacklight_config.repository_class.new(blacklight_config)
20
20
  end
21
21
 
22
- def find_each(&block)
22
+ def find_each(&)
23
23
  return to_enum(:find_each) unless block_given?
24
24
 
25
25
  start = 0
26
26
  search_params = { q: '*:*', fl: 'id', facet: false }
27
- response = index.search(search_params.merge(start: start))
27
+ response = index.search(search_params.merge(start:))
28
28
 
29
29
  while response.documents.present?
30
- response.documents.each(&block)
30
+ response.documents.each(&)
31
31
  start += response.documents.length
32
- response = index.search(search_params.merge(start: start))
32
+ response = index.search(search_params.merge(start:))
33
33
  end
34
34
  end
35
35
 
@@ -87,7 +87,7 @@ module Spotlight
87
87
  end
88
88
 
89
89
  def sidecar(exhibit)
90
- sidecars.find_or_initialize_by exhibit: exhibit, document_id: id, document_type: self.class.to_s
90
+ sidecars.find_or_initialize_by exhibit:, document_id: id, document_type: self.class.to_s
91
91
  end
92
92
 
93
93
  def to_solr
@@ -156,12 +156,12 @@ module Spotlight
156
156
  deep_compact(attributes)
157
157
  end
158
158
 
159
- def deep_transform_values(object, &block)
159
+ def deep_transform_values(object, &)
160
160
  # Available in Rails 6
161
161
  if object.respond_to?(:deep_transform_values)
162
- object.deep_transform_values(&block)
162
+ object.deep_transform_values(&)
163
163
  else
164
- _deep_transform_values(object, &block)
164
+ _deep_transform_values(object, &)
165
165
  end
166
166
  end
167
167