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.
- checksums.yaml +4 -4
- data/app/assets/images/blacklight/close.svg +1 -0
- data/app/assets/images/blacklight/zoom_in.svg +1 -0
- data/app/assets/images/blacklight/zoom_out.svg +1 -0
- data/app/assets/javascripts/spotlight/admin/blocks/uploaded_items_block.js +8 -1
- data/app/assets/javascripts/spotlight/admin/catalog_edit.js +13 -47
- data/app/assets/javascripts/spotlight/admin/exhibit_tag_autocomplete.js +37 -0
- data/app/assets/javascripts/spotlight/admin/{reindex_monitor.js → progress_monitor.js} +25 -4
- data/app/assets/javascripts/spotlight/admin/sir-trevor/locales.js +1 -1
- data/app/assets/javascripts/spotlight/user/zpr_links.js.erb +29 -14
- data/app/assets/stylesheets/spotlight/_browse.scss +8 -0
- data/app/assets/stylesheets/spotlight/_catalog.scss +30 -4
- data/app/assets/stylesheets/spotlight/_exhibit_admin.scss +9 -0
- data/app/assets/stylesheets/spotlight/_modals.scss +3 -0
- data/app/assets/stylesheets/spotlight/_nestable.scss +8 -0
- data/app/assets/stylesheets/spotlight/_spotlight.scss +2 -0
- data/app/assets/stylesheets/spotlight/_view_larger.scss +22 -0
- data/app/assets/stylesheets/spotlight/typeahead.css +23 -23
- data/app/builders/spotlight/bootstrap_breadcrumbs_builder.rb +4 -2
- data/app/controllers/concerns/spotlight/base.rb +1 -1
- data/app/controllers/concerns/spotlight/catalog.rb +7 -1
- data/app/controllers/spotlight/browse_controller.rb +9 -15
- data/app/controllers/spotlight/bulk_actions_controller.rb +62 -0
- data/app/controllers/spotlight/bulk_updates_controller.rb +67 -0
- data/app/controllers/spotlight/catalog_controller.rb +12 -12
- data/app/controllers/spotlight/dashboards_controller.rb +5 -4
- data/app/controllers/spotlight/featured_images_controller.rb +1 -1
- data/app/controllers/spotlight/job_trackers_controller.rb +17 -0
- data/app/controllers/spotlight/pages_controller.rb +6 -7
- data/app/controllers/spotlight/tags_controller.rb +39 -5
- data/app/helpers/spotlight/application_helper.rb +1 -1
- data/app/helpers/spotlight/job_trackers_helper.rb +31 -0
- data/app/helpers/spotlight/main_app_helpers.rb +3 -4
- data/app/helpers/spotlight/meta_helper.rb +2 -2
- data/app/helpers/spotlight/pages_helper.rb +0 -7
- data/app/helpers/spotlight/roles_helper.rb +1 -1
- data/app/helpers/spotlight/searches_helper.rb +1 -1
- data/app/jobs/concerns/spotlight/gather_documents.rb +35 -0
- data/app/jobs/concerns/spotlight/job_tracking.rb +40 -23
- data/app/jobs/spotlight/add_tags_job.rb +31 -0
- data/app/jobs/spotlight/add_uploads_from_csv.rb +2 -4
- data/app/jobs/spotlight/change_visibility_job.rb +33 -0
- data/app/jobs/spotlight/process_bulk_updates_csv_job.rb +82 -0
- data/app/jobs/spotlight/reindex_exhibit_job.rb +5 -2
- data/app/jobs/spotlight/reindex_job.rb +35 -23
- data/app/jobs/spotlight/remove_tags_job.rb +31 -0
- data/app/jobs/spotlight/rename_sidecar_field_job.rb +1 -0
- data/app/jobs/spotlight/rename_tags_job.rb +33 -0
- data/app/models/concerns/spotlight/browse_category_search_builder.rb +59 -0
- data/app/models/concerns/spotlight/exhibit_analytics.rb +2 -6
- data/app/models/concerns/spotlight/exhibit_documents.rb +2 -2
- data/app/models/concerns/spotlight/resources/web.rb +1 -1
- data/app/models/concerns/spotlight/search_builder.rb +11 -0
- data/app/models/concerns/spotlight/solr_document.rb +1 -1
- data/app/models/concerns/spotlight/solr_document/atomic_updates.rb +2 -2
- data/app/models/concerns/spotlight/user.rb +5 -1
- data/app/models/sir_trevor_rails/blocks/browse_block.rb +1 -1
- data/app/models/sir_trevor_rails/blocks/featured_pages_block.rb +1 -1
- data/app/models/sir_trevor_rails/blocks/solr_documents_block.rb +9 -0
- data/app/models/sir_trevor_rails/blocks/uploaded_items_block.rb +4 -0
- data/app/models/spotlight/ability.rb +6 -2
- data/app/models/spotlight/attachment.rb +1 -1
- data/app/models/spotlight/{reindex_progress.rb → background_job_progress.rb} +8 -7
- data/app/models/spotlight/blacklight_configuration.rb +26 -6
- data/app/models/spotlight/bulk_update.rb +8 -0
- data/app/models/spotlight/exhibit.rb +2 -1
- data/app/models/spotlight/feature_page.rb +0 -2
- data/app/models/spotlight/featured_image.rb +40 -1
- data/app/models/spotlight/field_metadata.rb +4 -8
- data/app/models/spotlight/job_tracker.rb +11 -2
- data/app/models/spotlight/page.rb +1 -3
- data/app/models/spotlight/page_configurations.rb +10 -9
- data/app/models/spotlight/resource.rb +4 -4
- data/app/models/spotlight/resources/iiif_harvester.rb +2 -2
- data/app/models/spotlight/resources/iiif_service.rb +8 -1
- data/app/models/spotlight/resources/upload.rb +2 -2
- data/app/models/spotlight/role.rb +1 -2
- data/app/presenters/spotlight/iiif_manifest_presenter.rb +2 -2
- data/app/services/spotlight/bulk_updates_csv_template_service.rb +93 -0
- data/app/services/spotlight/etl/executor.rb +1 -3
- data/app/services/spotlight/iiif_resource_resolver.rb +1 -1
- data/app/uploaders/spotlight/bulk_updates_uploader.rb +7 -0
- data/app/uploaders/spotlight/featured_image_uploader.rb +1 -1
- data/app/views/catalog/_add_tags.html.erb +28 -0
- data/app/views/catalog/_bulk_actions.html.erb +12 -0
- data/app/views/catalog/_change_visibility.html.erb +35 -0
- data/app/views/catalog/_curator_actions.html.erb +3 -0
- data/app/views/catalog/_remove_tags.html.erb +37 -0
- data/app/views/catalog/_save_search.html.erb +1 -1
- data/app/views/spotlight/about_pages/_sidebar.html.erb +2 -2
- data/app/views/spotlight/browse/_search.html.erb +3 -3
- data/app/views/spotlight/browse/_search_box.html.erb +9 -9
- data/app/views/spotlight/browse/_search_title.html.erb +1 -1
- data/app/views/spotlight/bulk_updates/_download.html.erb +23 -0
- data/app/views/spotlight/bulk_updates/_overview.html.erb +1 -0
- data/app/views/spotlight/bulk_updates/_progress_panel.html.erb +19 -0
- data/app/views/spotlight/bulk_updates/_upload.html.erb +12 -0
- data/app/views/spotlight/bulk_updates/edit.html.erb +37 -0
- data/app/views/spotlight/catalog/_admin_header.html.erb +1 -1
- data/app/views/spotlight/catalog/_admin_index_header_default.html.erb +1 -1
- data/app/views/spotlight/catalog/_admin_thumbnail_default.html.erb +3 -2
- data/app/views/spotlight/catalog/_edit_default.html.erb +2 -2
- data/app/views/spotlight/catalog/_reindex_progress_panel.html.erb +1 -1
- data/app/views/spotlight/catalog/index.iiif_json.jbuilder +1 -1
- data/app/views/spotlight/custom_fields/_form.html.erb +1 -1
- data/app/views/spotlight/custom_search_fields/_form.html.erb +1 -1
- data/app/views/spotlight/dashboards/_reindexing_activity.html.erb +1 -1
- data/app/views/spotlight/exhibits/_exhibit_card.html.erb +1 -1
- data/app/views/spotlight/feature_pages/_sidebar.html.erb +1 -1
- data/app/views/spotlight/featured_images/_form.html.erb +1 -1
- data/app/views/spotlight/job_trackers/show.html.erb +79 -0
- data/app/views/spotlight/metadata_configurations/_metadata_field.html.erb +2 -2
- data/app/views/spotlight/pages/_form.html.erb +2 -2
- data/app/views/spotlight/pages/_order_pages.html.erb +2 -2
- data/app/views/spotlight/pages/_view_type_group.html.erb +3 -3
- data/app/views/spotlight/pages/show.html.erb +1 -1
- data/app/views/spotlight/resources/_form.html.erb +1 -1
- data/app/views/spotlight/resources/csv_upload/_form.html.erb +1 -1
- data/app/views/spotlight/resources/iiif/_form.html.erb +1 -1
- data/app/views/spotlight/resources/json_upload/_form.html.erb +2 -2
- data/app/views/spotlight/resources/upload/_form.html.erb +1 -1
- data/app/views/spotlight/search_configurations/_document_index_view_types.html.erb +2 -2
- data/app/views/spotlight/searches/_form.html.erb +2 -2
- data/app/views/spotlight/shared/_curation_sidebar.html.erb +3 -0
- data/app/views/spotlight/sir_trevor/blocks/_browse_group_categories_block.html.erb +3 -3
- data/app/views/spotlight/sir_trevor/blocks/_search_results_block.html.erb +1 -1
- data/app/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb +8 -8
- data/app/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb +7 -7
- data/app/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb +9 -7
- data/app/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb +5 -5
- data/app/views/spotlight/sir_trevor/blocks/_uploaded_items_block.html.erb +4 -0
- data/app/views/spotlight/tags/_tag.html.erb +24 -0
- data/app/views/spotlight/tags/index.html.erb +12 -16
- data/app/views/spotlight/translations/show.yaml.yamlbuilder +6 -0
- data/config/i18n-tasks.yml +1 -0
- data/config/locales/spotlight.en.yml +169 -10
- data/config/routes.rb +29 -1
- data/db/migrate/20210126123041_create_events.rb +1 -1
- data/db/migrate/20210305070001_remove_class_from_sirtrevor_image_blocks.rb +20 -0
- data/db/migrate/20210305171150_create_bulk_updates.rb +9 -0
- data/db/migrate/20210308090000_migrate_caption_values_for_title_key.rb +29 -0
- data/db/migrate/20210506070809_add_indexes_for_featured_images.rb +9 -0
- data/lib/generators/spotlight/install_generator.rb +2 -2
- data/lib/generators/spotlight/templates/config/initializers/riiif.rb +7 -5
- data/lib/generators/spotlight/templates/config/initializers/spotlight_initializer.rb +1 -1
- data/lib/generators/spotlight/templates/solr/config/schema.xml +1 -1
- data/lib/migration/iiif.rb +3 -3
- data/lib/spotlight/engine.rb +14 -0
- data/lib/spotlight/version.rb +1 -1
- data/spec/controllers/spotlight/browse_controller_spec.rb +0 -6
- data/spec/controllers/spotlight/bulk_actions_controller_spec.rb +124 -0
- data/spec/controllers/spotlight/bulk_updates_controller_spec.rb +77 -0
- data/spec/controllers/spotlight/catalog_controller_spec.rb +12 -12
- data/spec/controllers/spotlight/featured_images_controller_spec.rb +3 -3
- data/spec/controllers/spotlight/job_trackers_controller_spec.rb +37 -0
- data/spec/controllers/spotlight/tags_controller_spec.rb +5 -1
- data/spec/examples.txt +1496 -1442
- data/spec/factories/bulk_updates.rb +15 -0
- data/spec/factories/exhibits.rb +4 -0
- data/spec/factories/job_trackers.rb +2 -0
- data/spec/factories/users.rb +27 -8
- data/spec/features/add_items_spec.rb +1 -1
- data/spec/features/bulk_actions_spec.rb +72 -0
- data/spec/features/catalog_spec.rb +1 -0
- data/spec/features/import_exhibit_spec.rb +5 -1
- data/spec/features/javascript/blocks/solr_documents_block_spec.rb +4 -4
- data/spec/features/javascript/blocks/uploaded_items_block_spec.rb +27 -1
- data/spec/features/site_users_management_spec.rb +4 -4
- data/spec/fixtures/bulk-update-template.csv +57 -0
- data/spec/fixtures/updated-bulk-update-template-w-tags.csv +4 -0
- data/spec/fixtures/updated-bulk-update-template.csv +4 -0
- data/spec/helpers/spotlight/application_helper_spec.rb +5 -6
- data/spec/helpers/spotlight/pages_helper_spec.rb +0 -15
- data/spec/helpers/spotlight/roles_helper_spec.rb +1 -1
- data/spec/i18n_spec.rb +1 -0
- data/spec/jobs/spotlight/add_tags_job_spec.rb +34 -0
- data/spec/jobs/spotlight/add_uploads_from_csv_spec.rb +4 -1
- data/spec/jobs/spotlight/change_visibility_job_spec.rb +30 -0
- data/spec/jobs/spotlight/process_bulk_updates_csv_job_spec.rb +78 -0
- data/spec/jobs/spotlight/reindex_job_spec.rb +4 -1
- data/spec/jobs/spotlight/remove_tags_job_spec.rb +39 -0
- data/spec/lib/migration/iiif_spec.rb +1 -1
- data/spec/models/spotlight/ability_spec.rb +27 -0
- data/spec/models/spotlight/access_controls_enforcement_search_builder_spec.rb +1 -2
- data/spec/models/spotlight/{reindex_progress_spec.rb → background_job_progress_spec.rb} +15 -2
- data/spec/models/spotlight/blacklight_configuration_spec.rb +22 -17
- data/spec/models/spotlight/browse_category_search_builder_spec.rb +49 -0
- data/spec/models/spotlight/exhibit_spec.rb +1 -1
- data/spec/models/spotlight/featured_image_spec.rb +13 -1
- data/spec/models/spotlight/resource_spec.rb +23 -0
- data/spec/models/spotlight/solr_document/atomic_updates_spec.rb +10 -0
- data/spec/presenters/spotlight/iiif_manifest_presenter_spec.rb +1 -1
- data/spec/services/spotlight/bulk_updates_csv_template_service_spec.rb +26 -0
- data/spec/test_app_templates/Gemfile.extra +1 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
- data/spec/uploaders/spotlight/featured_image_uploader_spec.rb +2 -2
- data/spec/views/spotlight/catalog/_edit_default.html.erb_spec.rb +1 -1
- data/spec/views/spotlight/dashboards/_reindexing_activity.html.erb_spec.rb +2 -0
- data/spec/views/spotlight/job_trackers/show.html.erb_spec.rb +65 -0
- data/spec/views/spotlight/metadata_configurations/_metadata_field.html.erb_spec.rb +3 -4
- data/spec/views/spotlight/sir_trevor/blocks/_browse_block.html.erb_spec.rb +1 -1
- data/spec/views/spotlight/sir_trevor/blocks/_iframe_block.html.erb_spec.rb +1 -1
- data/spec/views/spotlight/sir_trevor/blocks/_link_to_search_block.html.erb_spec.rb +1 -1
- data/spec/views/spotlight/sir_trevor/blocks/_rule_block.html.erb_spec.rb +1 -1
- data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_block.html.erb_spec.rb +8 -4
- data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_carousel_block.html.erb_spec.rb +7 -2
- data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_embed_block.html.erb_spec.rb +8 -5
- data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_features_block.html.erb_spec.rb +3 -2
- data/spec/views/spotlight/sir_trevor/blocks/_solr_documents_grid_block.html.erb_spec.rb +9 -4
- data/spec/views/spotlight/tags/index.html.erb_spec.rb +5 -2
- metadata +90 -21
- data/app/assets/images/blacklight/add_circle.svg +0 -1
- data/app/assets/images/blacklight/custom_fullscreen.svg +0 -1
- data/app/assets/images/blacklight/remove_circle.svg +0 -1
- 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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
131
|
-
|
|
124
|
+
def render_save_this_search?
|
|
125
|
+
false
|
|
132
126
|
end
|
|
133
127
|
|
|
134
|
-
def
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
15
|
-
blacklight_config.view.
|
|
16
|
-
blacklight_config.view.admin_table
|
|
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
|
|
@@ -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
|
|
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],
|
|
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
|
-
|
|
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: @
|
|
23
|
+
format.json { render json: @tags.map(&:name) }
|
|
20
24
|
end
|
|
21
25
|
end
|
|
22
26
|
|
|
23
27
|
def destroy
|
|
24
|
-
|
|
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
|