blacklight-spotlight 3.0.0.alpha.9 → 3.0.0.alpha.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/app/assets/javascripts/spotlight/admin/blocks/browse_block.js +55 -1
- data/app/assets/javascripts/spotlight/admin/blocks/uploaded_items_block.js +7 -2
- data/app/assets/javascripts/spotlight/admin/crop.es6 +5 -0
- data/app/assets/javascripts/spotlight/admin/sir-trevor/locales.js +3 -2
- data/app/assets/stylesheets/spotlight/_accessibility.scss +1 -1
- data/app/assets/stylesheets/spotlight/_browse.scss +16 -0
- data/app/assets/stylesheets/spotlight/_curation.scss +6 -0
- data/app/assets/stylesheets/spotlight/_featured_browse_categories_block.scss +3 -0
- data/app/assets/stylesheets/spotlight/_header.scss +1 -1
- data/app/assets/stylesheets/spotlight/_translations.scss +1 -0
- data/app/controllers/spotlight/appearances_controller.rb +1 -0
- data/app/controllers/spotlight/browse_controller.rb +1 -1
- data/app/controllers/spotlight/exhibits_controller.rb +2 -3
- data/app/controllers/spotlight/featured_images_controller.rb +1 -1
- data/app/controllers/spotlight/pages_controller.rb +1 -1
- data/app/controllers/spotlight/searches_controller.rb +3 -2
- data/app/controllers/spotlight/translations_controller.rb +46 -0
- data/app/helpers/spotlight/crop_helper.rb +4 -1
- data/app/models/concerns/spotlight/translatables.rb +17 -1
- data/app/models/spotlight/about_page.rb +3 -1
- data/app/models/spotlight/exhibit.rb +4 -2
- data/app/models/spotlight/feature_page.rb +3 -1
- data/app/models/spotlight/featured_image.rb +29 -12
- data/app/models/spotlight/home_page.rb +3 -1
- data/app/models/spotlight/main_navigation.rb +2 -2
- data/app/models/spotlight/masthead.rb +1 -1
- data/app/models/spotlight/page.rb +5 -1
- data/app/models/spotlight/search.rb +5 -1
- data/app/models/spotlight/solr_document_sidecar.rb +7 -5
- data/app/models/spotlight/temporary_image.rb +8 -0
- data/app/services/spotlight/exhibit_import_export_service.rb +454 -0
- data/app/views/catalog/_save_search.html.erb +1 -1
- data/app/views/spotlight/browse/_search.html.erb +3 -2
- data/app/views/spotlight/browse/_search_title.html.erb +2 -1
- data/app/views/spotlight/pages/_form.html.erb +1 -1
- data/app/views/spotlight/searches/_form.html.erb +1 -0
- data/app/views/spotlight/searches/_search.html.erb +1 -0
- data/app/views/spotlight/sir_trevor/blocks/_browse_block.html.erb +1 -0
- data/app/views/spotlight/sir_trevor/blocks/_uploaded_items_block.html.erb +7 -1
- data/app/views/spotlight/translations/_browse_categories.html.erb +29 -3
- data/app/views/spotlight/translations/_general.html.erb +7 -7
- data/app/views/spotlight/translations/_import.html.erb +24 -0
- data/app/views/spotlight/translations/_metadata.html.erb +1 -1
- data/app/views/spotlight/translations/_page.html.erb +5 -5
- data/app/views/spotlight/translations/_pages.html.erb +4 -4
- data/app/views/spotlight/translations/_pages_table.html.erb +5 -5
- data/app/views/spotlight/translations/_search_fields.html.erb +3 -3
- data/app/views/spotlight/translations/edit.html.erb +8 -6
- data/app/views/spotlight/translations/show.yaml.yamlbuilder +81 -0
- data/config/locales/spotlight.ar.yml +43 -24
- data/config/locales/spotlight.en.yml +65 -53
- data/config/routes.rb +6 -1
- data/db/migrate/20200403161512_add_subtitle_to_searches.rb +7 -0
- data/lib/spotlight/engine.rb +20 -0
- data/lib/spotlight/version.rb +1 -1
- data/spec/controllers/spotlight/home_pages_controller_spec.rb +1 -1
- data/spec/controllers/spotlight/translations_controller_spec.rb +53 -2
- data/spec/factories/featured_images.rb +4 -0
- data/spec/features/exhibits/translation_editing_spec.rb +2 -2
- data/spec/features/home_page_spec.rb +9 -0
- data/spec/features/javascript/blocks/uploaded_items_block_spec.rb +4 -1
- data/spec/i18n_spec.rb +0 -2
- data/spec/models/spotlight/exhibit_spec.rb +9 -1
- data/spec/models/spotlight/featured_image_spec.rb +28 -0
- data/spec/models/spotlight/page_spec.rb +6 -1
- data/spec/models/spotlight/resources/upload_spec.rb +43 -79
- data/spec/{serializers/spotlight/exhibit_export_serializer_spec.rb → services/spotlight/exhibit_import_export_service_spec.rb} +108 -22
- data/spec/views/spotlight/translations/_import.html.erb_spec.rb +24 -0
- metadata +14 -11
- data/app/serializers/spotlight/exhibit_export_serializer.rb +0 -205
- data/app/serializers/spotlight/featured_image_representer.rb +0 -29
- data/app/serializers/spotlight/main_navigation_representer.rb +0 -13
- data/app/serializers/spotlight/page_representer.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27efff1c809c87463bcd240ccc65b6edca2182b73238f1027bc178a2f009ab5e
|
4
|
+
data.tar.gz: 9df0f469fa0bc43f39a718d2cdb3bc7909e25da15a2e1d189ccc054b006eb579
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc49fe51f1c599c5c3569d4387f7b2c1e124e9d8369a2b554ec26e441d8197f4f7e154cec7ab0b9c8fd3bdb8597315675da6d54b129df4774cdafbecfa339c9f
|
7
|
+
data.tar.gz: c06bc5cd170cf772c13bf220bb8e0ebb136b81fb7a575b6cbfe16704fe77c4cf42c759131f9fda803361b909537ba97e9e366e58f4ab99b68d4275408b3c7853
|
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Read more about what Spotlight is, our motivations for creating it, and how to i
|
|
9
9
|
|
10
10
|
## Requirements
|
11
11
|
|
12
|
-
1. Ruby (2.
|
12
|
+
1. Ruby (2.5.0 or greater)
|
13
13
|
2. Rails (5.1 or greater)
|
14
14
|
3. Java (7 or greater) *for Solr*
|
15
15
|
4. ImageMagick (http://www.imagemagick.org/script/index.php) due to [carrierwave](https://github.com/carrierwaveuploader/carrierwave#adding-versions)
|
@@ -93,7 +93,7 @@ Spotlight ships with [`i18n-tasks`](https://github.com/glebm/i18n-tasks) to help
|
|
93
93
|
$ bundle exec i18n-tasks health
|
94
94
|
```
|
95
95
|
|
96
|
-
See [developer-facing instructions for enabling translation](https://github.com/projectblacklight/spotlight/wiki/Translations) on the wiki.
|
96
|
+
See [developer-facing instructions for enabling translation](https://github.com/projectblacklight/spotlight/wiki/Translations) on the wiki.
|
97
97
|
|
98
98
|
## Community
|
99
99
|
|
@@ -10,7 +10,7 @@ SirTrevor.Blocks.Browse = (function(){
|
|
10
10
|
autocomplete_url: function() {
|
11
11
|
return $(this.inner).closest('form[data-autocomplete-exhibit-searches-path]').data('autocomplete-exhibit-searches-path').replace("%25QUERY", "%QUERY");
|
12
12
|
},
|
13
|
-
autocomplete_template: function() { return '<div class="autocomplete-item{{#unless published}} blacklight-private{{/unless}}">{{#if thumbnail_image_url}}<div class="document-thumbnail"><img class="img-thumbnail" src="{{thumbnail_image_url}}" /></div>{{/if}}<span class="autocomplete-title">{{
|
13
|
+
autocomplete_template: function() { return '<div class="autocomplete-item{{#unless published}} blacklight-private{{/unless}}">{{#if thumbnail_image_url}}<div class="document-thumbnail"><img class="img-thumbnail" src="{{thumbnail_image_url}}" /></div>{{/if}}<span class="autocomplete-title">{{full_title}}</span><br/><small> {{description}}</small></div>' },
|
14
14
|
|
15
15
|
bloodhoundOptions: function() {
|
16
16
|
return {
|
@@ -21,6 +21,60 @@ SirTrevor.Blocks.Browse = (function(){
|
|
21
21
|
};
|
22
22
|
},
|
23
23
|
|
24
|
+
_itemPanel: function(data) {
|
25
|
+
var index = "item_" + this.globalIndex++;
|
26
|
+
var checked;
|
27
|
+
if (data.display == "true") {
|
28
|
+
checked = "checked='checked'"
|
29
|
+
} else {
|
30
|
+
checked = "";
|
31
|
+
}
|
32
|
+
var resource_id = data.slug || data.id;
|
33
|
+
var markup = [
|
34
|
+
'<li class="field form-inline dd-item dd3-item" data-resource-id="' + resource_id + '" data-id="' + index + '" id="' + this.formId("item_" + data.id) + '">',
|
35
|
+
'<input type="hidden" name="item[' + index + '][id]" value="' + resource_id + '" />',
|
36
|
+
'<input type="hidden" name="item[' + index + '][full_title]" value="' + (data.full_title || data.title) + '" />',
|
37
|
+
'<input data-property="weight" type="hidden" name="item[' + index + '][weight]" value="' + data.weight + '" />',
|
38
|
+
'<div class="card d-flex dd3-content">',
|
39
|
+
'<div class="dd-handle dd3-handle"><%= i18n.t("blocks:resources:panel:drag") %></div>',
|
40
|
+
'<div class="card-header item-grid">',
|
41
|
+
'<div class="d-flex">',
|
42
|
+
'<div class="checkbox">',
|
43
|
+
'<input name="item[' + index + '][display]" type="hidden" value="false" />',
|
44
|
+
'<input name="item[' + index + '][display]" id="'+ this.formId(this.display_checkbox + '_' + data.id) + '" type="checkbox" ' + checked + ' class="item-grid-checkbox" value="true" />',
|
45
|
+
'<label class="sr-only" for="'+ this.formId(this.display_checkbox + '_' + data.id) +'"><%= i18n.t("blocks:resources:panel:display") %></label>',
|
46
|
+
'</div>',
|
47
|
+
'<div class="pic">',
|
48
|
+
'<img class="img-thumbnail" src="' + (data.thumbnail_image_url || ((data.iiif_tilesource || "").replace("/info.json", "/full/!100,100/0/default.jpg"))) + '" />',
|
49
|
+
'</div>',
|
50
|
+
'<div class="main">',
|
51
|
+
'<div class="title card-title">' + (data.full_title || data.title) + '</div>',
|
52
|
+
'<div>' + (data.slug || data.id) + '</div>',
|
53
|
+
'</div>',
|
54
|
+
'<div class="remove float-right">',
|
55
|
+
'<a data-item-grid-panel-remove="true" href="#"><%= i18n.t("blocks:resources:panel:remove") %></a>',
|
56
|
+
'</div>',
|
57
|
+
'</div>',
|
58
|
+
'</div>',
|
59
|
+
'</div>',
|
60
|
+
'</li>'
|
61
|
+
].join("\n");
|
62
|
+
|
63
|
+
var panel = $(_.template(markup)(this));
|
64
|
+
var context = this;
|
65
|
+
|
66
|
+
$('.remove a', panel).on('click', function(e) {
|
67
|
+
e.preventDefault();
|
68
|
+
$(this).closest('.field').remove();
|
69
|
+
context.afterPanelDelete();
|
70
|
+
|
71
|
+
});
|
72
|
+
|
73
|
+
this.afterPanelRender(data, panel);
|
74
|
+
|
75
|
+
return panel;
|
76
|
+
},
|
77
|
+
|
24
78
|
item_options: function() { return [
|
25
79
|
'<label>',
|
26
80
|
'<input type="hidden" name="display-item-counts" value="false" />',
|
@@ -85,9 +85,13 @@ SirTrevor.Blocks.UploadedItems = (function(){
|
|
85
85
|
'</div>',
|
86
86
|
'<div class="main form-horizontal">',
|
87
87
|
'<div class="title card-title">' + dataTitle + '</div>',
|
88
|
-
'<div class="field">',
|
88
|
+
'<div class="field row mr-3">',
|
89
89
|
'<label for="' + this.formId('caption_' + dataId) + '" class="col-form-label col-md-3"><%= i18n.t("blocks:uploaded_items:caption") %></label>',
|
90
|
-
'<input type="text" class="form-control" id="' + this.formId('caption_' + dataId) + '" name="item[' + index + '][caption]" data-field="caption"/>',
|
90
|
+
'<input type="text" class="form-control col" id="' + this.formId('caption_' + dataId) + '" name="item[' + index + '][caption]" data-field="caption"/>',
|
91
|
+
'</div>',
|
92
|
+
'<div class="field row mr-3">',
|
93
|
+
'<label for="' + this.formId('link_' + dataId) + '" class="col-form-label col-md-3"><%= i18n.t("blocks:uploaded_items:link") %></label>',
|
94
|
+
'<input type="text" class="form-control col" id="' + this.formId('link_' + dataId) + '" name="item[' + index + '][link]" data-field="link"/>',
|
91
95
|
'</div>',
|
92
96
|
'</div>',
|
93
97
|
'<div class="remove float-right">',
|
@@ -99,6 +103,7 @@ SirTrevor.Blocks.UploadedItems = (function(){
|
|
99
103
|
|
100
104
|
var panel = $(_.template(markup)(this));
|
101
105
|
panel.find('[data-field="caption"]').val(data.caption);
|
106
|
+
panel.find('[data-field="link"]').val(data.link);
|
102
107
|
var context = this;
|
103
108
|
|
104
109
|
$('.remove a', panel).on('click', function(e) {
|
@@ -269,6 +269,11 @@ export default class Crop {
|
|
269
269
|
|
270
270
|
successHandler(data, stat, xhr) {
|
271
271
|
this.setIiifFields({ tilesource: data.tilesource });
|
272
|
+
this.setUploadId(data.id);
|
273
|
+
}
|
274
|
+
|
275
|
+
setUploadId(id) {
|
276
|
+
$('#' + this.formPrefix + "_upload_id").val(id);
|
272
277
|
}
|
273
278
|
|
274
279
|
aspectRatioPreservingRectangleEditor(aspect) {
|
@@ -29,8 +29,9 @@ SirTrevor.Locales.en.blocks = $.extend(SirTrevor.Locales.en.blocks, {
|
|
29
29
|
|
30
30
|
uploaded_items: {
|
31
31
|
title: "Uploaded Item Row",
|
32
|
-
description: "This widget displays uploaded items in a horizontal row. Optionally, you can add a heading and/or text to be displayed adjacent to the items.",
|
33
|
-
caption: 'Caption'
|
32
|
+
description: "This widget displays uploaded items in a horizontal row. Optionally, you can add a heading and/or text to be displayed adjacent to the items. The item caption and link URL fields are also optional.",
|
33
|
+
caption: 'Caption',
|
34
|
+
link: 'Link URL'
|
34
35
|
},
|
35
36
|
|
36
37
|
featured_pages: {
|
@@ -26,6 +26,18 @@ $image-overlay-max-height: 300px;
|
|
26
26
|
}
|
27
27
|
}
|
28
28
|
|
29
|
+
.blacklight-browse-show {
|
30
|
+
.subtitle {
|
31
|
+
padding-right: $spacer;
|
32
|
+
|
33
|
+
&::before {
|
34
|
+
content: " \000B7 ";
|
35
|
+
color: $text-muted;
|
36
|
+
padding-right: $spacer / 2;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
29
41
|
.browse-landing {
|
30
42
|
text-align: center;
|
31
43
|
// Placeholder for vertically alignment - might already be available from use in another feature
|
@@ -70,6 +82,10 @@ $image-overlay-max-height: 300px;
|
|
70
82
|
font-size: $h3-font-size;
|
71
83
|
@extend %vertical-align;
|
72
84
|
|
85
|
+
.category-subtitle {
|
86
|
+
display: block;
|
87
|
+
}
|
88
|
+
|
73
89
|
small {
|
74
90
|
display: block;
|
75
91
|
color: $white;
|
@@ -27,8 +27,7 @@ module Spotlight
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def process_import
|
30
|
-
@exhibit.import(JSON.parse(import_exhibit_params.read))
|
31
|
-
if @exhibit.save && @exhibit.reindex_later
|
30
|
+
if @exhibit.import(JSON.parse(import_exhibit_params.read)) && @exhibit.reindex_later
|
32
31
|
redirect_to spotlight.exhibit_dashboard_path(@exhibit), notice: t(:'helpers.submit.exhibit.updated', model: @exhibit.class.model_name.human.downcase)
|
33
32
|
else
|
34
33
|
render action: :import
|
@@ -50,7 +49,7 @@ module Spotlight
|
|
50
49
|
respond_to do |format|
|
51
50
|
format.json do
|
52
51
|
authorize! :export, @exhibit
|
53
|
-
send_data JSON.pretty_generate(Spotlight::
|
52
|
+
send_data JSON.pretty_generate(Spotlight::ExhibitImportExportService.new(@exhibit).as_json),
|
54
53
|
type: 'application/json',
|
55
54
|
disposition: 'attachment',
|
56
55
|
filename: "#{@exhibit.friendly_id}-export.json"
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Spotlight
|
4
4
|
# Handles requests to upload images for exhibit thumbnails
|
5
5
|
class FeaturedImagesController < Spotlight::ApplicationController
|
6
|
-
load_and_authorize_resource instance_name: :featured_image
|
6
|
+
load_and_authorize_resource instance_name: :featured_image, class: 'Spotlight::TemporaryImage'
|
7
7
|
|
8
8
|
def create
|
9
9
|
if @featured_image.save && @featured_image.file_present?
|
@@ -70,7 +70,7 @@ module Spotlight
|
|
70
70
|
@page.lock&.delete
|
71
71
|
|
72
72
|
if @page.update(page_params.merge(last_edited_by: current_user))
|
73
|
-
redirect_to [spotlight, @page.exhibit, @page], flash: { html_safe: true }, notice: undo_notice(:updated)
|
73
|
+
redirect_to [spotlight, @page.exhibit, @page, format: params.permit(:format)], flash: { html_safe: true }, notice: undo_notice(:updated)
|
74
74
|
else
|
75
75
|
render action: 'edit'
|
76
76
|
end
|
@@ -31,7 +31,7 @@ module Spotlight
|
|
31
31
|
respond_to do |format|
|
32
32
|
format.html
|
33
33
|
format.json do
|
34
|
-
render json: @searches.as_json(methods: %i[count thumbnail_image_url]), root: false
|
34
|
+
render json: @searches.as_json(methods: %i[full_title count thumbnail_image_url]), root: false
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -50,7 +50,7 @@ module Spotlight
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def edit
|
53
|
-
add_breadcrumb @search.
|
53
|
+
add_breadcrumb @search.full_title, edit_exhibit_search_path(@search.exhibit, @search)
|
54
54
|
@exhibit = @search.exhibit
|
55
55
|
end
|
56
56
|
|
@@ -105,6 +105,7 @@ module Spotlight
|
|
105
105
|
def search_params
|
106
106
|
params.require(:search).permit(
|
107
107
|
:title,
|
108
|
+
:subtitle,
|
108
109
|
:long_description,
|
109
110
|
:search_box,
|
110
111
|
:default_index_view_type,
|
@@ -21,6 +21,22 @@ module Spotlight
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
+
def show
|
25
|
+
respond_to do |format|
|
26
|
+
format.yaml
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def import
|
31
|
+
if current_exhibit.update(import_exhibit_params)
|
32
|
+
I18n.reload! # reload since we're memoizing
|
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
|
35
|
+
else
|
36
|
+
render 'edit'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
24
40
|
private
|
25
41
|
|
26
42
|
def attach_breadcrumbs
|
@@ -33,6 +49,21 @@ module Spotlight
|
|
33
49
|
params.require(:exhibit).permit(translations_attributes: %i[id locale key value])
|
34
50
|
end
|
35
51
|
|
52
|
+
def import_exhibit_params
|
53
|
+
imported_translations = YAML.safe_load(params.require(:file).read)
|
54
|
+
|
55
|
+
# set language from YML root locale
|
56
|
+
language = imported_translations.keys.first
|
57
|
+
|
58
|
+
# convert YML to hash
|
59
|
+
translation = unfold(imported_translations.values.first).map do |k, v|
|
60
|
+
current_translation = Translation.find_or_initialize_by(exhibit: current_exhibit, key: k, locale: language)
|
61
|
+
{ key: k, value: v, locale: language, id: current_translation.id }
|
62
|
+
end
|
63
|
+
|
64
|
+
{ translations_attributes: translation }
|
65
|
+
end
|
66
|
+
|
36
67
|
def set_language
|
37
68
|
@language = params[:language] || current_exhibit.available_locales.first
|
38
69
|
end
|
@@ -40,5 +71,20 @@ module Spotlight
|
|
40
71
|
def set_tab
|
41
72
|
@tab = params[:tab]
|
42
73
|
end
|
74
|
+
|
75
|
+
def unfold(value, key = nil)
|
76
|
+
return to_enum(:unfold, value, key) unless block_given?
|
77
|
+
|
78
|
+
if value.is_a? Hash
|
79
|
+
value.each do |k, v|
|
80
|
+
arr = unfold(v, [key, k].compact.join('.'))
|
81
|
+
arr.each do |k1, v1|
|
82
|
+
yield k1, v1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
else
|
86
|
+
yield key, value
|
87
|
+
end
|
88
|
+
end
|
43
89
|
end
|
44
90
|
end
|
@@ -25,7 +25,10 @@ module Spotlight
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def iiif_upload_tag(f)
|
28
|
-
|
28
|
+
content_tag(:div) do
|
29
|
+
concat f.file_field_without_bootstrap :file, name: 'featured_image[image]', data: { endpoint: polymorphic_path(f.object.model_name.route_key) }
|
30
|
+
concat f.hidden_field :upload_id
|
31
|
+
end
|
29
32
|
end
|
30
33
|
|
31
34
|
def form_prefix(f)
|
@@ -15,8 +15,24 @@ module Spotlight
|
|
15
15
|
# Set up a reader for the specified attribute that uses the I18n backend,
|
16
16
|
# and defaults to the ActiveRecord value
|
17
17
|
def define_translated_attr_reader(attr_name)
|
18
|
+
# Define a dynamic method for translating database-backed attributes,
|
19
|
+
# falling back to the database information as needed.
|
20
|
+
#
|
21
|
+
# Note: the empty string is provided as the final fallback to avoid i18n blowing
|
22
|
+
# up on nil attributes.
|
18
23
|
define_method(:"#{attr_name}") do
|
19
|
-
|
24
|
+
send("translated_#{attr_name}", default: [attr_translation(attr_name), ''])
|
25
|
+
end
|
26
|
+
|
27
|
+
# Define an accessor that gets the value of the attribute in a given locale,
|
28
|
+
# returning `nil` for untranslated values.
|
29
|
+
#
|
30
|
+
# Note: For the default locale, we actually want to dig into the database,
|
31
|
+
# because that is the source of truth for the data.
|
32
|
+
define_method(:"translated_#{attr_name}") do |default: [], **options|
|
33
|
+
default = Array.wrap(default)
|
34
|
+
default.prepend(attr_translation(attr_name)) if I18n.locale == I18n.default_locale
|
35
|
+
I18n.translate(attr_name, scope: slug, default: default, **options).presence
|
20
36
|
end
|
21
37
|
end
|
22
38
|
end
|
@@ -5,6 +5,8 @@ module Spotlight
|
|
5
5
|
# About pages
|
6
6
|
class AboutPage < Spotlight::Page
|
7
7
|
extend FriendlyId
|
8
|
-
friendly_id :title, use: %i[slugged scoped finders history], scope: %i[exhibit locale]
|
8
|
+
friendly_id :title, use: %i[slugged scoped finders history], scope: %i[exhibit locale] do |config|
|
9
|
+
config.reserved_words.concat(%w[update_all contacts])
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
@@ -100,8 +100,10 @@ module Spotlight
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def import(hash)
|
103
|
-
|
104
|
-
|
103
|
+
ActiveRecord::Base.transaction do
|
104
|
+
Spotlight::ExhibitImportExportService.new(self).from_hash!(hash)
|
105
|
+
save
|
106
|
+
end
|
105
107
|
end
|
106
108
|
|
107
109
|
def solr_data
|