blacklight-spotlight 3.0.0.rc4 → 3.0.2

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/blacklight/close.svg +1 -0
  3. data/app/assets/images/blacklight/zoom_in.svg +1 -0
  4. data/app/assets/images/blacklight/zoom_out.svg +1 -0
  5. data/app/assets/javascripts/spotlight/admin/blocks/uploaded_items_block.js +8 -1
  6. data/app/assets/javascripts/spotlight/admin/catalog_edit.js +13 -47
  7. data/app/assets/javascripts/spotlight/admin/exhibit_tag_autocomplete.js +37 -0
  8. data/app/assets/javascripts/spotlight/admin/{reindex_monitor.js → progress_monitor.js} +25 -4
  9. data/app/assets/javascripts/spotlight/admin/sir-trevor/locales.js +1 -1
  10. data/app/assets/javascripts/spotlight/user/zpr_links.js.erb +29 -14
  11. data/app/assets/stylesheets/spotlight/_browse.scss +8 -0
  12. data/app/assets/stylesheets/spotlight/_catalog.scss +30 -4
  13. data/app/assets/stylesheets/spotlight/_exhibit_admin.scss +9 -0
  14. data/app/assets/stylesheets/spotlight/_modals.scss +3 -0
  15. data/app/assets/stylesheets/spotlight/_nestable.scss +8 -0
  16. data/app/assets/stylesheets/spotlight/_spotlight.scss +2 -0
  17. data/app/assets/stylesheets/spotlight/_view_larger.scss +22 -0
  18. data/app/assets/stylesheets/spotlight/typeahead.css +23 -23
  19. data/app/builders/spotlight/bootstrap_breadcrumbs_builder.rb +4 -2
  20. data/app/controllers/concerns/spotlight/base.rb +1 -1
  21. data/app/controllers/concerns/spotlight/catalog.rb +7 -1
  22. data/app/controllers/spotlight/browse_controller.rb +9 -15
  23. data/app/controllers/spotlight/bulk_actions_controller.rb +62 -0
  24. data/app/controllers/spotlight/bulk_updates_controller.rb +67 -0
  25. data/app/controllers/spotlight/catalog_controller.rb +12 -12
  26. data/app/controllers/spotlight/dashboards_controller.rb +5 -4
  27. data/app/controllers/spotlight/featured_images_controller.rb +1 -1
  28. data/app/controllers/spotlight/job_trackers_controller.rb +17 -0
  29. data/app/controllers/spotlight/pages_controller.rb +6 -7
  30. data/app/controllers/spotlight/tags_controller.rb +39 -5
  31. data/app/helpers/spotlight/application_helper.rb +1 -1
  32. data/app/helpers/spotlight/job_trackers_helper.rb +31 -0
  33. data/app/helpers/spotlight/main_app_helpers.rb +3 -4
  34. data/app/helpers/spotlight/meta_helper.rb +2 -2
  35. data/app/helpers/spotlight/pages_helper.rb +0 -7
  36. data/app/helpers/spotlight/roles_helper.rb +1 -1
  37. data/app/helpers/spotlight/searches_helper.rb +1 -1
  38. data/app/jobs/concerns/spotlight/gather_documents.rb +35 -0
  39. data/app/jobs/concerns/spotlight/job_tracking.rb +40 -23
  40. data/app/jobs/spotlight/add_tags_job.rb +31 -0
  41. data/app/jobs/spotlight/add_uploads_from_csv.rb +2 -4
  42. data/app/jobs/spotlight/change_visibility_job.rb +33 -0
  43. data/app/jobs/spotlight/process_bulk_updates_csv_job.rb +82 -0
  44. data/app/jobs/spotlight/reindex_exhibit_job.rb +5 -2
  45. data/app/jobs/spotlight/reindex_job.rb +35 -23
  46. data/app/jobs/spotlight/remove_tags_job.rb +31 -0
  47. data/app/jobs/spotlight/rename_sidecar_field_job.rb +1 -0
  48. data/app/jobs/spotlight/rename_tags_job.rb +33 -0
  49. data/app/models/concerns/spotlight/browse_category_search_builder.rb +59 -0
  50. data/app/models/concerns/spotlight/exhibit_analytics.rb +2 -6
  51. data/app/models/concerns/spotlight/exhibit_documents.rb +2 -2
  52. data/app/models/concerns/spotlight/resources/web.rb +1 -1
  53. data/app/models/concerns/spotlight/search_builder.rb +11 -0
  54. data/app/models/concerns/spotlight/solr_document.rb +1 -1
  55. data/app/models/concerns/spotlight/solr_document/atomic_updates.rb +2 -2
  56. data/app/models/concerns/spotlight/user.rb +5 -1
  57. data/app/models/sir_trevor_rails/blocks/browse_block.rb +1 -1
  58. data/app/models/sir_trevor_rails/blocks/featured_pages_block.rb +1 -1
  59. data/app/models/sir_trevor_rails/blocks/solr_documents_block.rb +9 -0
  60. data/app/models/sir_trevor_rails/blocks/uploaded_items_block.rb +4 -0
  61. data/app/models/spotlight/ability.rb +6 -2
  62. data/app/models/spotlight/attachment.rb +1 -1
  63. data/app/models/spotlight/{reindex_progress.rb → background_job_progress.rb} +8 -7
  64. data/app/models/spotlight/blacklight_configuration.rb +26 -6
  65. data/app/models/spotlight/bulk_update.rb +8 -0
  66. data/app/models/spotlight/exhibit.rb +2 -1
  67. data/app/models/spotlight/feature_page.rb +0 -2
  68. data/app/models/spotlight/featured_image.rb +40 -1
  69. data/app/models/spotlight/field_metadata.rb +4 -8
  70. data/app/models/spotlight/job_tracker.rb +11 -2
  71. data/app/models/spotlight/page.rb +1 -3
  72. data/app/models/spotlight/page_configurations.rb +10 -9
  73. data/app/models/spotlight/resource.rb +4 -4
  74. data/app/models/spotlight/resources/iiif_harvester.rb +2 -2
  75. data/app/models/spotlight/resources/iiif_service.rb +8 -1
  76. data/app/models/spotlight/resources/upload.rb +2 -2
  77. data/app/models/spotlight/role.rb +1 -2
  78. data/app/presenters/spotlight/iiif_manifest_presenter.rb +2 -2
  79. data/app/services/spotlight/bulk_updates_csv_template_service.rb +93 -0
  80. data/app/services/spotlight/etl/executor.rb +1 -3
  81. data/app/services/spotlight/iiif_resource_resolver.rb +1 -1
  82. data/app/uploaders/spotlight/bulk_updates_uploader.rb +7 -0
  83. data/app/uploaders/spotlight/featured_image_uploader.rb +1 -1
  84. data/app/views/catalog/_add_tags.html.erb +28 -0
  85. data/app/views/catalog/_bulk_actions.html.erb +12 -0
  86. data/app/views/catalog/_change_visibility.html.erb +35 -0
  87. data/app/views/catalog/_curator_actions.html.erb +3 -0
  88. data/app/views/catalog/_remove_tags.html.erb +37 -0
  89. data/app/views/catalog/_save_search.html.erb +1 -1
  90. data/app/views/spotlight/about_pages/_sidebar.html.erb +2 -2
  91. data/app/views/spotlight/browse/_search.html.erb +3 -3
  92. data/app/views/spotlight/browse/_search_box.html.erb +9 -9
  93. data/app/views/spotlight/browse/_search_title.html.erb +1 -1
  94. data/app/views/spotlight/bulk_updates/_download.html.erb +23 -0
  95. data/app/views/spotlight/bulk_updates/_overview.html.erb +1 -0
  96. data/app/views/spotlight/bulk_updates/_progress_panel.html.erb +19 -0
  97. data/app/views/spotlight/bulk_updates/_upload.html.erb +12 -0
  98. data/app/views/spotlight/bulk_updates/edit.html.erb +37 -0
  99. data/app/views/spotlight/catalog/_admin_header.html.erb +1 -1
  100. data/app/views/spotlight/catalog/_admin_index_header_default.html.erb +1 -1
  101. data/app/views/spotlight/catalog/_admin_thumbnail_default.html.erb +3 -2
  102. data/app/views/spotlight/catalog/_edit_default.html.erb +2 -2
  103. data/app/views/spotlight/catalog/_reindex_progress_panel.html.erb +1 -1
  104. data/app/views/spotlight/catalog/index.iiif_json.jbuilder +1 -1
  105. data/app/views/spotlight/custom_fields/_form.html.erb +1 -1
  106. data/app/views/spotlight/custom_search_fields/_form.html.erb +1 -1
  107. data/app/views/spotlight/dashboards/_reindexing_activity.html.erb +1 -1
  108. data/app/views/spotlight/exhibits/_exhibit_card.html.erb +1 -1
  109. data/app/views/spotlight/feature_pages/_sidebar.html.erb +1 -1
  110. data/app/views/spotlight/featured_images/_form.html.erb +1 -1
  111. data/app/views/spotlight/job_trackers/show.html.erb +79 -0
  112. data/app/views/spotlight/metadata_configurations/_metadata_field.html.erb +2 -2
  113. data/app/views/spotlight/pages/_form.html.erb +2 -2
  114. data/app/views/spotlight/pages/_order_pages.html.erb +2 -2
  115. data/app/views/spotlight/pages/_view_type_group.html.erb +3 -3
  116. data/app/views/spotlight/pages/show.html.erb +1 -1
  117. data/app/views/spotlight/resources/_form.html.erb +1 -1
  118. data/app/views/spotlight/resources/csv_upload/_form.html.erb +1 -1
  119. data/app/views/spotlight/resources/iiif/_form.html.erb +1 -1
  120. data/app/views/spotlight/resources/json_upload/_form.html.erb +2 -2
  121. data/app/views/spotlight/resources/upload/_form.html.erb +1 -1
  122. data/app/views/spotlight/search_configurations/_document_index_view_types.html.erb +2 -2
  123. data/app/views/spotlight/searches/_form.html.erb +2 -2
  124. data/app/views/spotlight/shared/_curation_sidebar.html.erb +3 -0
  125. data/app/views/spotlight/sir_trevor/blocks/_browse_group_categories_block.html.erb +3 -3
  126. data/app/views/spotlight/sir_trevor/blocks/_search_results_block.html.erb +1 -1
  127. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb +8 -8
  128. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb +7 -7
  129. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb +9 -7
  130. data/app/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb +5 -5
  131. data/app/views/spotlight/sir_trevor/blocks/_uploaded_items_block.html.erb +4 -0
  132. data/app/views/spotlight/tags/_tag.html.erb +24 -0
  133. data/app/views/spotlight/tags/index.html.erb +12 -16
  134. data/app/views/spotlight/translations/show.yaml.yamlbuilder +6 -0
  135. data/config/i18n-tasks.yml +1 -0
  136. data/config/locales/spotlight.en.yml +169 -10
  137. data/config/routes.rb +29 -1
  138. data/db/migrate/20210126123041_create_events.rb +1 -1
  139. data/db/migrate/20210305070001_remove_class_from_sirtrevor_image_blocks.rb +20 -0
  140. data/db/migrate/20210305171150_create_bulk_updates.rb +9 -0
  141. data/db/migrate/20210308090000_migrate_caption_values_for_title_key.rb +29 -0
  142. data/db/migrate/20210506070809_add_indexes_for_featured_images.rb +9 -0
  143. data/lib/generators/spotlight/install_generator.rb +2 -2
  144. data/lib/generators/spotlight/templates/config/initializers/riiif.rb +7 -5
  145. data/lib/generators/spotlight/templates/config/initializers/spotlight_initializer.rb +1 -1
  146. data/lib/generators/spotlight/templates/solr/config/schema.xml +1 -1
  147. data/lib/migration/iiif.rb +3 -3
  148. data/lib/spotlight/engine.rb +14 -0
  149. data/lib/spotlight/version.rb +1 -1
  150. data/spec/controllers/spotlight/browse_controller_spec.rb +0 -6
  151. data/spec/controllers/spotlight/bulk_actions_controller_spec.rb +124 -0
  152. data/spec/controllers/spotlight/bulk_updates_controller_spec.rb +77 -0
  153. data/spec/controllers/spotlight/catalog_controller_spec.rb +12 -12
  154. data/spec/controllers/spotlight/featured_images_controller_spec.rb +3 -3
  155. data/spec/controllers/spotlight/job_trackers_controller_spec.rb +37 -0
  156. data/spec/controllers/spotlight/tags_controller_spec.rb +5 -1
  157. data/spec/examples.txt +1496 -1442
  158. data/spec/factories/bulk_updates.rb +15 -0
  159. data/spec/factories/exhibits.rb +4 -0
  160. data/spec/factories/job_trackers.rb +2 -0
  161. data/spec/factories/users.rb +27 -8
  162. data/spec/features/add_items_spec.rb +1 -1
  163. data/spec/features/bulk_actions_spec.rb +72 -0
  164. data/spec/features/catalog_spec.rb +1 -0
  165. data/spec/features/import_exhibit_spec.rb +5 -1
  166. data/spec/features/javascript/blocks/solr_documents_block_spec.rb +4 -4
  167. data/spec/features/javascript/blocks/uploaded_items_block_spec.rb +27 -1
  168. data/spec/features/site_users_management_spec.rb +4 -4
  169. data/spec/fixtures/bulk-update-template.csv +57 -0
  170. data/spec/fixtures/updated-bulk-update-template-w-tags.csv +4 -0
  171. data/spec/fixtures/updated-bulk-update-template.csv +4 -0
  172. data/spec/helpers/spotlight/application_helper_spec.rb +5 -6
  173. data/spec/helpers/spotlight/pages_helper_spec.rb +0 -15
  174. data/spec/helpers/spotlight/roles_helper_spec.rb +1 -1
  175. data/spec/i18n_spec.rb +1 -0
  176. data/spec/jobs/spotlight/add_tags_job_spec.rb +34 -0
  177. data/spec/jobs/spotlight/add_uploads_from_csv_spec.rb +4 -1
  178. data/spec/jobs/spotlight/change_visibility_job_spec.rb +30 -0
  179. data/spec/jobs/spotlight/process_bulk_updates_csv_job_spec.rb +78 -0
  180. data/spec/jobs/spotlight/reindex_job_spec.rb +4 -1
  181. data/spec/jobs/spotlight/remove_tags_job_spec.rb +39 -0
  182. data/spec/lib/migration/iiif_spec.rb +1 -1
  183. data/spec/models/spotlight/ability_spec.rb +27 -0
  184. data/spec/models/spotlight/access_controls_enforcement_search_builder_spec.rb +1 -2
  185. data/spec/models/spotlight/{reindex_progress_spec.rb → background_job_progress_spec.rb} +15 -2
  186. data/spec/models/spotlight/blacklight_configuration_spec.rb +22 -17
  187. data/spec/models/spotlight/browse_category_search_builder_spec.rb +49 -0
  188. data/spec/models/spotlight/exhibit_spec.rb +1 -1
  189. data/spec/models/spotlight/featured_image_spec.rb +13 -1
  190. data/spec/models/spotlight/resource_spec.rb +23 -0
  191. data/spec/models/spotlight/solr_document/atomic_updates_spec.rb +10 -0
  192. data/spec/presenters/spotlight/iiif_manifest_presenter_spec.rb +1 -1
  193. data/spec/services/spotlight/bulk_updates_csv_template_service_spec.rb +26 -0
  194. data/spec/test_app_templates/Gemfile.extra +1 -0
  195. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  196. data/spec/uploaders/spotlight/featured_image_uploader_spec.rb +2 -2
  197. data/spec/views/spotlight/catalog/_edit_default.html.erb_spec.rb +1 -1
  198. data/spec/views/spotlight/dashboards/_reindexing_activity.html.erb_spec.rb +2 -0
  199. data/spec/views/spotlight/job_trackers/show.html.erb_spec.rb +65 -0
  200. data/spec/views/spotlight/metadata_configurations/_metadata_field.html.erb_spec.rb +3 -4
  201. data/spec/views/spotlight/sir_trevor/blocks/_browse_block.html.erb_spec.rb +1 -1
  202. data/spec/views/spotlight/sir_trevor/blocks/_iframe_block.html.erb_spec.rb +1 -1
  203. data/spec/views/spotlight/sir_trevor/blocks/_link_to_search_block.html.erb_spec.rb +1 -1
  204. data/spec/views/spotlight/sir_trevor/blocks/_rule_block.html.erb_spec.rb +1 -1
  205. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb_spec.rb +8 -4
  206. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb_spec.rb +7 -2
  207. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_embed_block.html.erb_spec.rb +8 -5
  208. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb_spec.rb +3 -2
  209. data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb_spec.rb +9 -4
  210. data/spec/views/spotlight/tags/index.html.erb_spec.rb +5 -2
  211. metadata +90 -21
  212. data/app/assets/images/blacklight/add_circle.svg +0 -1
  213. data/app/assets/images/blacklight/custom_fullscreen.svg +0 -1
  214. data/app/assets/images/blacklight/remove_circle.svg +0 -1
  215. data/app/assets/images/blacklight/resize_small.svg +0 -1
@@ -21,10 +21,12 @@ module Spotlight
21
21
  end
22
22
 
23
23
  def render_element(element)
24
- html_class = 'active' if @context.current_page?(compute_path(element))
24
+ current = @context.current_page?(compute_path(element)) || element.options&.dig(:current)
25
+
26
+ html_class = 'active' if current
25
27
 
26
28
  @context.content_tag(:li, class: "breadcrumb-item #{html_class}") do
27
- @context.link_to_unless_current(element_label(element), compute_path(element), element.options)
29
+ @context.link_to_unless(current, element_label(element), compute_path(element), element.options&.except(:current))
28
30
  end
29
31
  end
30
32
 
@@ -32,7 +32,7 @@ module Spotlight
32
32
  def autocomplete_json_response_for_document(doc)
33
33
  {
34
34
  id: doc.id,
35
- title: CGI.unescapeHTML(view_context.presenter(doc).heading.to_str),
35
+ title: CGI.unescapeHTML(view_context.document_presenter(doc).heading.to_str),
36
36
  thumbnail: doc.first(blacklight_config.index.thumbnail_field),
37
37
  full_image_url: doc.first(Spotlight::Engine.config.full_image_field),
38
38
  description: doc.id,
@@ -14,20 +14,26 @@ module Spotlight
14
14
 
15
15
  # Adds a facet to display document visibility for the current exhibit
16
16
  # if the user is a curator
17
+ # rubocop:disable Metrics/MethodLength
17
18
  def add_facet_visibility_field
18
19
  return unless current_exhibit && can?(:curate, current_exhibit)
19
20
 
20
21
  blacklight_config.add_facet_field 'exhibit_visibility',
21
22
  label: I18n.t(:'spotlight.catalog.facets.exhibit_visibility.label'),
22
23
  query: {
24
+ public: {
25
+ label: I18n.t(:'spotlight.catalog.facets.exhibit_visibility.public'),
26
+ fq: "-#{blacklight_config.document_model.visibility_field(current_exhibit)}:false"
27
+ },
23
28
  private: {
24
29
  label: I18n.t(:'spotlight.catalog.facets.exhibit_visibility.private'),
25
30
  fq: "#{blacklight_config.document_model.visibility_field(current_exhibit)}:false"
26
31
  }
27
32
  }
28
33
  end
34
+ # rubocop:enable Metrics/MethodLength
29
35
 
30
- def render_save_this_search?
36
+ def render_curator_actions?
31
37
  (current_exhibit && can?(:curate, current_exhibit)) &&
32
38
  !(params[:controller] == 'spotlight/catalog' && params[:action] == 'admin')
33
39
  end
@@ -15,13 +15,15 @@ module Spotlight
15
15
  before_action :attach_search_breadcrumb, only: :show
16
16
  record_search_parameters only: :show
17
17
 
18
- helper_method :should_render_spotlight_search_bar?, :presenter
18
+ helper_method :should_render_spotlight_search_bar?
19
19
 
20
20
  before_action :swap_actions_configuration, only: :show
21
21
 
22
22
  before_action do
23
23
  blacklight_config.track_search_session = false
24
- blacklight_config.view.gallery.classes = 'row-cols-2 row-cols-md-4'
24
+ blacklight_config.view.gallery.classes = 'row-cols-2 row-cols-md-4' if blacklight_config.view.key? :gallery
25
+ blacklight_config.action_mapping.default = blacklight_config.index
26
+ blacklight_config.action_mapping.show = blacklight_config.index
25
27
  end
26
28
 
27
29
  def index
@@ -31,15 +33,11 @@ module Spotlight
31
33
 
32
34
  def show
33
35
  @response, @document_list = search_service.search_results do |builder|
34
- builder.with(search_query)
36
+ builder.with(params.merge(browse_category_id: @search.id))
35
37
  end
36
38
 
37
39
  respond_to do |format|
38
40
  format.html
39
- format.json do
40
- @presenter = Blacklight::JsonPresenter.new(@response, blacklight_config)
41
- render template: 'catalog/index'
42
- end
43
41
  end
44
42
  end
45
43
 
@@ -47,11 +45,7 @@ module Spotlight
47
45
 
48
46
  def swap_actions_configuration
49
47
  blacklight_config.index.document_actions = blacklight_config.browse.document_actions
50
- end
51
-
52
- def search_query
53
- @search.query_params['q'] = [@search.query_params['q'], params[:browse_q]].join(' ')
54
- @search.merge_params_for_search(params, blacklight_config)
48
+ blacklight_config.action_mapping.show.top_level_config = :index if blacklight_config.key?(:action_mapping)
55
49
  end
56
50
 
57
51
  ##
@@ -127,11 +121,11 @@ module Spotlight
127
121
  Spotlight::Engine.config.default_browse_index_view_type
128
122
  end
129
123
 
130
- def presenter(document)
131
- view_context.index_presenter(document)
124
+ def render_save_this_search?
125
+ false
132
126
  end
133
127
 
134
- def render_save_this_search?
128
+ def render_curator_actions?
135
129
  false
136
130
  end
137
131
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spotlight
4
+ ##
5
+ # Controller enabling bulk functionality for search results
6
+ class BulkActionsController < Spotlight::CatalogController
7
+ before_action :authenticate_user!
8
+ before_action :check_authorization
9
+
10
+ def add_tags
11
+ handle_bulk_action_with_job(Spotlight::AddTagsJob, tags: add_tags_params)
12
+ end
13
+
14
+ def remove_tags
15
+ handle_bulk_action_with_job(Spotlight::RemoveTagsJob, tags: remove_tags_params)
16
+ end
17
+
18
+ def change_visibility
19
+ handle_bulk_action_with_job(Spotlight::ChangeVisibilityJob, visibility: change_visibility_params)
20
+ end
21
+
22
+ private
23
+
24
+ def handle_bulk_action_with_job(job, i18n_key: action_name, **params)
25
+ job.perform_later(
26
+ solr_params: solr_params,
27
+ exhibit: current_exhibit,
28
+ user: current_user,
29
+ **params
30
+ )
31
+
32
+ redirect_back fallback_location: spotlight.search_exhibit_catalog_path(current_search_session.query_params),
33
+ notice: t(:"spotlight.bulk_actions.#{i18n_key}.changed", count: solr_response.total)
34
+ end
35
+
36
+ def solr_params
37
+ solr_response.request_params
38
+ end
39
+
40
+ def solr_response
41
+ @solr_response ||= begin
42
+ response, _docs = search_service.search_results do |builder|
43
+ builder.merge(fl: 'id', rows: 0)
44
+ end
45
+
46
+ response
47
+ end
48
+ end
49
+
50
+ def add_tags_params
51
+ params.require(:tags).split(',').map(&:strip)
52
+ end
53
+
54
+ def remove_tags_params
55
+ params.require(:tags).split(',').map(&:strip)
56
+ end
57
+
58
+ def change_visibility_params
59
+ params.require(:visibility)
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+
5
+ module Spotlight
6
+ ##
7
+ # Controller enabling bulk functionality for items defined in a spreadsheet.
8
+ class BulkUpdatesController < Spotlight::ApplicationController
9
+ before_action :authenticate_user!
10
+ before_action :check_authorization
11
+
12
+ def edit; end
13
+
14
+ def download_template
15
+ # Set Last-Modified as a work-around for https://github.com/rack/rack/issues/1619
16
+ headers['Last-Modified'] = ''
17
+ headers['Cache-Control'] = 'no-cache'
18
+ headers['Content-Type'] = 'text/csv'
19
+ headers['Content-Disposition'] = "attachment; filename=\"#{current_exhibit.slug}-bulk-update-template.csv\""
20
+ headers.delete('Content-Length')
21
+
22
+ self.response_body = csv_template
23
+ end
24
+
25
+ def update
26
+ bulk_update = Spotlight::BulkUpdate.new(exhibit: current_exhibit, file: file_params)
27
+ if bulk_update.save
28
+ ProcessBulkUpdatesCsvJob.perform_later(current_exhibit, bulk_update)
29
+ redirect_back fallback_location: spotlight.edit_exhibit_bulk_updates_path(current_exhibit), notice: t(:'spotlight.bulk_updates.update.submitted')
30
+ else
31
+ redirect_back fallback_location: spotlight.edit_exhibit_bulk_updates_path(current_exhibit), alert: t(:'spotlight.bulk_updates.update.error')
32
+ end
33
+ end
34
+
35
+ def monitor
36
+ render json: BackgroundJobProgress.new(current_exhibit, job_class: Spotlight::ProcessBulkUpdatesCsvJob)
37
+ end
38
+
39
+ private
40
+
41
+ def csv_template
42
+ boolean = ActiveModel::Type::Boolean.new
43
+ Spotlight::BulkUpdatesCsvTemplateService.new(exhibit: current_exhibit).template(
44
+ view_context: view_context,
45
+ title: boolean.cast(reference_field_params[:item_title]),
46
+ tags: boolean.cast(updatable_field_params[:tags]),
47
+ visibility: boolean.cast(updatable_field_params[:visibility])
48
+ )
49
+ end
50
+
51
+ def reference_field_params
52
+ params.require(:reference_fields).permit(:item_title)
53
+ end
54
+
55
+ def updatable_field_params
56
+ params.require(:updatable_fields).permit(:visibility, :tags)
57
+ end
58
+
59
+ def file_params
60
+ params.require(:file)
61
+ end
62
+
63
+ def check_authorization
64
+ authorize! :bulk_update, current_exhibit
65
+ end
66
+ end
67
+ end
@@ -27,8 +27,7 @@ module Spotlight
27
27
 
28
28
  before_action only: :admin do
29
29
  blacklight_config.view.select! { |k, _v| k == :admin_table }
30
- blacklight_config.view.admin_table.partials = [:index_compact]
31
- blacklight_config.view.admin_table.document_actions = []
30
+ blacklight_config.view.admin_table(partials: [:index_compact], document_actions: []) unless blacklight_config.view.key? :admin_table
32
31
  blacklight_config.track_search_session = false
33
32
 
34
33
  unless blacklight_config.sort_fields.key? :timestamp
@@ -38,8 +37,7 @@ module Spotlight
38
37
  end
39
38
 
40
39
  before_action only: :edit do
41
- blacklight_config.view.edit.partials = blacklight_config.view_config(:show).partials.dup
42
- blacklight_config.view.edit.partials.insert(2, :edit)
40
+ blacklight_config.view.edit(partials: blacklight_config.view_config(:show).partials.dup.insert(2, :edit)) unless blacklight_config.view.key? :edit
43
41
  end
44
42
 
45
43
  def show
@@ -126,15 +124,11 @@ module Spotlight
126
124
  protected
127
125
 
128
126
  def attach_breadcrumbs
129
- # The "q: ''" is necessary so that the breadcrumb builder recognizes that a path like this:
130
- # /exhibits/1?f%5Bgenre_sim%5D%5B%5D=map&q= is not the same as /exhibits/1
131
- # Otherwise the exhibit breadcrumb won't be a link.
132
- # see http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-current_page-3F
133
127
  if view_context.current_page?({ action: :admin })
134
- add_breadcrumb t(:'spotlight.exhibits.breadcrumb', title: @exhibit.title), exhibit_root_path(@exhibit, q: '')
128
+ add_breadcrumb t(:'spotlight.exhibits.breadcrumb', title: @exhibit.title), exhibit_root_path(@exhibit)
135
129
  else
136
130
  # When not on the admin page, get the translated value for the "Home" breadcrumb
137
- add_breadcrumb t(:'spotlight.curation.nav.home', title: @exhibit.title), exhibit_root_path(@exhibit, q: '')
131
+ add_breadcrumb t(:'spotlight.curation.nav.home', title: @exhibit.title), exhibit_root_path(@exhibit)
138
132
  end
139
133
  end
140
134
 
@@ -203,8 +197,14 @@ module Spotlight
203
197
  redirect_to spotlight.exhibit_root_path(@exhibit) unless has_search_parameters?
204
198
  end
205
199
 
200
+ def has_search_parameters? # rubocop:disable Naming/PredicateName
201
+ super || params[:browse_category_id].present?
202
+ end
203
+
206
204
  def add_breadcrumb_with_search_params
207
- add_breadcrumb t(:'spotlight.catalog.breadcrumb.index'), spotlight.search_exhibit_catalog_path(params.to_unsafe_h) if has_search_parameters?
205
+ return unless has_search_parameters?
206
+
207
+ add_breadcrumb t(:'spotlight.catalog.breadcrumb.index'), spotlight.search_exhibit_catalog_path(params.to_unsafe_h), current: action_name == 'index'
208
208
  end
209
209
 
210
210
  # rubocop:disable Metrics/AbcSize
@@ -218,7 +218,7 @@ module Spotlight
218
218
  add_breadcrumb t(:'spotlight.catalog.breadcrumb.index'), search_action_url(current_search_session.query_params)
219
219
  end
220
220
 
221
- add_breadcrumb view_context.show_presenter(document).heading, polymorphic_path([current_exhibit, document])
221
+ add_breadcrumb view_context.document_presenter(document).heading, polymorphic_path([current_exhibit, document])
222
222
  end
223
223
  # rubocop:enable Metrics/AbcSize
224
224
 
@@ -11,10 +11,11 @@ module Spotlight
11
11
  include Spotlight::SearchHelper
12
12
 
13
13
  before_action only: [:show] do
14
- blacklight_config.view.reject! { |_k, _v| true }
15
- blacklight_config.view.admin_table.partials = ['index_compact']
16
- blacklight_config.view.admin_table.document_actions = []
14
+ blacklight_config.action_mapping&.delete(:show)
15
+ blacklight_config.view.clear
16
+ blacklight_config.view.admin_table(partials: ['index_compact'], document_actions: [])
17
17
  blacklight_config.track_search_session = false
18
+ blacklight_config.action_mapping.show.top_level_config = :index if blacklight_config.key?(:action_mapping)
18
19
  end
19
20
 
20
21
  def show
@@ -22,7 +23,7 @@ module Spotlight
22
23
 
23
24
  @pages = @exhibit.pages.recent.limit(5)
24
25
  @solr_documents = load_recent_solr_documents 5
25
- @recent_reindexing = @exhibit.job_trackers.recent
26
+ @recent_reindexing = @exhibit.job_trackers.where.not(job_class: Spotlight::Engine.config.hidden_job_classes).recent
26
27
 
27
28
  attach_dashboard_breadcrumbs
28
29
  end
@@ -16,7 +16,7 @@ module Spotlight
16
16
  private
17
17
 
18
18
  def tilesource
19
- riiif.info_url(@featured_image.id)
19
+ riiif.info_url(@featured_image)
20
20
  end
21
21
 
22
22
  # The create action can be called from a number of different forms, so
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spotlight
4
+ ##
5
+ # Locking mechanism for page-level locks
6
+ class JobTrackersController < Spotlight::ApplicationController
7
+ load_and_authorize_resource :exhibit
8
+ load_and_authorize_resource through: :exhibit
9
+
10
+ # GET /:exhibit_id/job_trackers/1
11
+ def show
12
+ add_breadcrumb t(:'spotlight.exhibits.breadcrumb', title: @exhibit.title), @exhibit
13
+ add_breadcrumb t(:'spotlight.curation.sidebar.dashboard'), exhibit_dashboard_path(@exhibit)
14
+ add_breadcrumb t(:'spotlight.configuration.sidebar.job_trackers'), [@job_tracker.on, @job_tracker]
15
+ end
16
+ end
17
+ end
@@ -17,9 +17,11 @@ module Spotlight
17
17
  include Spotlight::Base
18
18
  include Blacklight::SearchContext
19
19
 
20
- helper_method :get_search_results, :search_results, :fetch, :page_collection_name, :presenter
20
+ helper_method :get_search_results, :search_results, :fetch, :page_collection_name
21
21
 
22
22
  before_action do
23
+ blacklight_config.action_mapping.default = blacklight_config.index
24
+ blacklight_config.action_mapping.show = blacklight_config.index
23
25
  blacklight_config.view.gallery.classes = 'row-cols-2 row-cols-md-4' unless @page&.display_sidebar
24
26
  end
25
27
 
@@ -63,7 +65,8 @@ module Spotlight
63
65
  @page.last_edited_by = @page.created_by = current_user
64
66
 
65
67
  if @page.save
66
- redirect_to [spotlight, @page.exhibit, page_collection_name], notice: t(:'helpers.submit.page.created', model: @page.class.model_name.human.downcase)
68
+ redirect_to [spotlight, @page.exhibit, page_collection_name.to_sym],
69
+ notice: t(:'helpers.submit.page.created', model: @page.class.model_name.human.downcase)
67
70
  else
68
71
  render action: 'new'
69
72
  end
@@ -84,7 +87,7 @@ module Spotlight
84
87
  def destroy
85
88
  @page.destroy
86
89
 
87
- redirect_to [spotlight, @page.exhibit, page_collection_name], flash: { html_safe: true }, notice: undo_notice(:destroyed)
90
+ redirect_to [spotlight, @page.exhibit, page_collection_name.to_sym], flash: { html_safe: true }, notice: undo_notice(:destroyed)
88
91
  end
89
92
 
90
93
  def update_all
@@ -204,10 +207,6 @@ module Spotlight
204
207
  raise ActiveRecord::RecordNotFound
205
208
  end
206
209
  end
207
-
208
- def presenter(document)
209
- view_context.index_presenter(document)
210
- end
211
210
  end
212
211
  # rubocop:enable Metrics/ClassLength
213
212
  end
@@ -6,9 +6,13 @@ module Spotlight
6
6
  class TagsController < Spotlight::ApplicationController
7
7
  before_action :authenticate_user!
8
8
  load_and_authorize_resource :exhibit, class: Spotlight::Exhibit
9
+ load_resource :tag, through: :exhibit, through_association: :owned_tags, except: [:index], class: 'ActsAsTaggableOn::Tag'
9
10
 
10
- def index
11
+ before_action do
11
12
  authorize! :tag, @exhibit
13
+ end
14
+
15
+ def index
12
16
  @tags = @exhibit.owned_tags
13
17
  add_breadcrumb t(:'spotlight.exhibits.breadcrumb', title: @exhibit.title), @exhibit
14
18
  add_breadcrumb t(:'spotlight.curation.sidebar.header'), exhibit_dashboard_path(@exhibit)
@@ -16,16 +20,46 @@ module Spotlight
16
20
 
17
21
  respond_to do |format|
18
22
  format.html
19
- format.json { render json: @exhibit.owned_tags.map(&:name) }
23
+ format.json { render json: @tags.map(&:name) }
20
24
  end
21
25
  end
22
26
 
23
27
  def destroy
24
- authorize! :tag, @exhibit
25
- # warning: this causes every solr document with this tag to reindex. That could be slow.
26
- @exhibit.owned_taggings.where(tag_id: params[:id]).destroy_all
28
+ Spotlight::RenameTagsJob.perform_later(@exhibit, @tag, to: nil)
27
29
 
28
30
  redirect_to exhibit_tags_path(@exhibit)
29
31
  end
32
+
33
+ def rename
34
+ Spotlight::RenameTagsJob.perform_later(@exhibit, @tag, to: params[:new_tag])
35
+
36
+ redirect_to exhibit_tags_path(@exhibit)
37
+ end
38
+
39
+ def update_all
40
+ tags_to_rename = batch_update_params['owned_tags_attributes'].values.select do |tag|
41
+ tag[:name]&.present? && tag[:current_name]&.strip != tag[:name]&.strip
42
+ end
43
+
44
+ rename_tags_later!(tags_to_rename)
45
+
46
+ redirect_back fallback_location: fallback_url, notice: t(:'helpers.submit.tags.batch_updated', count: tags_to_rename.count)
47
+ end
48
+
49
+ private
50
+
51
+ def rename_tags_later!(tags_to_rename)
52
+ tags_to_rename.each do |tag|
53
+ Spotlight::RenameTagsJob.perform_later(@exhibit, @exhibit.owned_tags.find(tag[:id]), to: tag[:name])
54
+ end
55
+ end
56
+
57
+ def fallback_url
58
+ spotlight.exhibit_tags_path(@exhibit)
59
+ end
60
+
61
+ def batch_update_params
62
+ params.require(:exhibit).permit('owned_tags_attributes' => %i[id current_name name])
63
+ end
30
64
  end
31
65
  end