blacklight 7.19.1 → 7.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.babelrc +11 -0
- data/.env +1 -1
- data/.github/workflows/ruby.yml +21 -3
- data/.rubocop.yml +4 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js +49 -26
- data/app/assets/stylesheets/blacklight/_constraints.scss +7 -4
- data/app/assets/stylesheets/blacklight/_controls.scss +8 -0
- data/app/assets/stylesheets/blacklight/_facets.scss +2 -2
- data/app/assets/stylesheets/blacklight/_pagination.scss +1 -1
- data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -0
- data/app/components/blacklight/constraints_component.rb +1 -1
- data/app/components/blacklight/document_component.rb +4 -4
- data/app/components/blacklight/facet_field_no_layout_component.rb +1 -1
- data/app/components/blacklight/facet_item_component.rb +3 -3
- data/app/components/blacklight/metadata_field_layout_component.rb +1 -1
- data/app/components/blacklight/response/pagination_component.html.erb +1 -1
- data/app/components/blacklight/system/modal_component.html.erb +2 -2
- data/app/controllers/concerns/blacklight/bookmarks.rb +0 -3
- data/app/controllers/concerns/blacklight/catalog.rb +5 -2
- data/app/controllers/concerns/blacklight/controller.rb +9 -5
- data/app/controllers/concerns/blacklight/search_context.rb +1 -1
- data/app/helpers/blacklight/catalog_helper_behavior.rb +1 -3
- data/app/javascript/blacklight/core.js +13 -2
- data/app/javascript/blacklight/modal.js +1 -1
- data/app/javascript/blacklight/search_context.js +5 -2
- data/app/models/concerns/blacklight/document/email.rb +18 -6
- data/app/models/concerns/blacklight/document/sms.rb +16 -4
- data/app/models/record_mailer.rb +9 -1
- data/app/presenters/blacklight/facet_item_presenter.rb +2 -0
- data/app/views/catalog/_home_text.html.erb +2 -2
- data/app/views/catalog/_paginate_compact.html.erb +1 -0
- data/app/views/record_mailer/sms_record.text.erb +1 -1
- data/app/views/shared/_header_navbar.html.erb +2 -2
- data/blacklight.gemspec +4 -2
- data/config/locales/blacklight.de.yml +4 -2
- data/config/locales/blacklight.en.yml +6 -2
- data/config/locales/blacklight.es.yml +3 -1
- data/config/locales/blacklight.fr.yml +3 -1
- data/config/locales/blacklight.it.yml +3 -1
- data/lib/blacklight/configuration.rb +9 -0
- data/lib/blacklight/engine.rb +2 -0
- data/lib/blacklight/search_state/filter_field.rb +35 -11
- data/lib/blacklight/solr/response/facets.rb +2 -1
- data/lib/blacklight/solr/response/group_response.rb +3 -2
- data/lib/blacklight/solr/response/pagination_methods.rb +1 -1
- data/lib/blacklight/solr/search_builder_behavior.rb +2 -0
- data/lib/blacklight.rb +5 -1
- data/lib/generators/blacklight/assets_generator.rb +4 -2
- data/lib/generators/blacklight/install_generator.rb +4 -1
- data/lib/generators/blacklight/user_generator.rb +1 -1
- data/package.json +5 -3
- data/spec/components/blacklight/constraint_layout_component_spec.rb +2 -6
- data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +2 -6
- data/spec/components/blacklight/facet_field_list_component_spec.rb +2 -6
- data/spec/components/blacklight/facet_item_component_spec.rb +8 -8
- data/spec/components/blacklight/facet_item_pivot_component_spec.rb +3 -7
- data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -8
- data/spec/components/blacklight/metadata_field_component_spec.rb +4 -8
- data/spec/controllers/catalog_controller_spec.rb +14 -2
- data/spec/features/axe_spec.rb +33 -0
- data/spec/features/facet_missing_spec.rb +67 -0
- data/spec/features/facets_spec.rb +1 -1
- data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +2 -2
- data/spec/lib/blacklight/search_state/filter_field_spec.rb +13 -0
- data/spec/models/blacklight/configuration_spec.rb +92 -0
- data/spec/models/blacklight/document/email_spec.rb +32 -0
- data/spec/models/blacklight/document/sms_spec.rb +33 -0
- data/spec/models/blacklight/solr/response/facets_spec.rb +1 -1
- data/spec/models/blacklight/solr/response/group_response_spec.rb +3 -2
- data/spec/models/record_mailer_spec.rb +30 -2
- data/spec/spec_helper.rb +19 -12
- data/spec/support/view_component_capybara_test_helpers.rb +8 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +0 -3
- metadata +42 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f9ecb2c98805e0783286a52510875f35da4b19983fa3c9f174fcce921d2b630
|
4
|
+
data.tar.gz: 221bbc331cace14c9212c4be38d372b3a62b15fa5d16af116f79e90c53a5dafe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebee61b6584dbf10836b754f3f390acc24dce35da380caf633986bd1792991aaec3c07b9299f0f32beed54e339eaec4e0051f2350c08b2111e855688665bf4d4
|
7
|
+
data.tar.gz: 251aca6a6d0908be8a3b75312bd1604e88b4a55810f3553b6634f281ecd79b176ac2ef04797e3a02f42f41c8eaec0d49d734f10a699f8a739c17a65a5cf515ca
|
data/.babelrc
ADDED
data/.env
CHANGED
data/.github/workflows/ruby.yml
CHANGED
@@ -9,9 +9,9 @@ name: CI
|
|
9
9
|
|
10
10
|
on:
|
11
11
|
push:
|
12
|
-
branches: [
|
12
|
+
branches: [ main ]
|
13
13
|
pull_request:
|
14
|
-
branches: [
|
14
|
+
branches: [ main ]
|
15
15
|
|
16
16
|
jobs:
|
17
17
|
lint:
|
@@ -43,6 +43,24 @@ jobs:
|
|
43
43
|
run: bundle exec rake ci
|
44
44
|
env:
|
45
45
|
ENGINE_CART_RAILS_OPTIONS: '--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test'
|
46
|
+
test_bootstrap5:
|
47
|
+
runs-on: ubuntu-latest
|
48
|
+
strategy:
|
49
|
+
matrix:
|
50
|
+
ruby: [3.0]
|
51
|
+
steps:
|
52
|
+
- uses: actions/checkout@v2
|
53
|
+
- name: Set up Ruby
|
54
|
+
uses: ruby/setup-ruby@v1
|
55
|
+
with:
|
56
|
+
ruby-version: ${{ matrix.ruby }}
|
57
|
+
- name: Install dependencies
|
58
|
+
run: bundle install
|
59
|
+
- name: Run tests
|
60
|
+
run: bundle exec rake ci
|
61
|
+
env:
|
62
|
+
BOOTSTRAP_VERSION: '~> 5.0'
|
63
|
+
ENGINE_CART_RAILS_OPTIONS: '--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test'
|
46
64
|
test_rails6_0:
|
47
65
|
runs-on: ubuntu-latest
|
48
66
|
strategy:
|
@@ -87,7 +105,7 @@ jobs:
|
|
87
105
|
runs-on: ubuntu-latest
|
88
106
|
strategy:
|
89
107
|
matrix:
|
90
|
-
ruby: [2.7]
|
108
|
+
ruby: [2.7, 3.0]
|
91
109
|
steps:
|
92
110
|
- uses: actions/checkout@v2
|
93
111
|
- name: Set up Ruby
|
data/.rubocop.yml
CHANGED
@@ -50,6 +50,10 @@ Metrics/ModuleLength:
|
|
50
50
|
- 'app/controllers/concerns/blacklight/catalog.rb'
|
51
51
|
- 'lib/blacklight/solr/search_builder_behavior.rb'
|
52
52
|
|
53
|
+
Metrics/AbcSize:
|
54
|
+
Exclude:
|
55
|
+
- "lib/blacklight/search_state/filter_field.rb"
|
56
|
+
|
53
57
|
Naming/HeredocDelimiterNaming:
|
54
58
|
Enabled: false
|
55
59
|
|
data/Gemfile
CHANGED
@@ -27,7 +27,7 @@ else
|
|
27
27
|
if ENV['RAILS_VERSION']
|
28
28
|
if ENV['RAILS_VERSION'] == 'edge'
|
29
29
|
gem 'rails', github: 'rails/rails'
|
30
|
-
ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge
|
30
|
+
ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge'
|
31
31
|
else
|
32
32
|
gem 'rails', ENV['RAILS_VERSION']
|
33
33
|
end
|
data/README.md
CHANGED
@@ -35,11 +35,11 @@ rails generate blacklight:install
|
|
35
35
|
|
36
36
|
* Ruby 2.2+
|
37
37
|
* Bundler
|
38
|
-
* Rails 5.
|
38
|
+
* Rails 5.2+
|
39
39
|
|
40
40
|
## Contributing Code
|
41
41
|
|
42
|
-
Code contributions are always welcome, instructions for contributing can be found at [CONTRIBUTING.md](https://github.com/projectblacklight/blacklight/blob/
|
42
|
+
Code contributions are always welcome, instructions for contributing can be found at [CONTRIBUTING.md](https://github.com/projectblacklight/blacklight/blob/main/CONTRIBUTING.md).
|
43
43
|
|
44
44
|
## Configuring Apache Solr
|
45
45
|
You'll also want some information about how Blacklight expects [Apache Solr](http://lucene.apache.org/solr ) to run, which you can find in [README_SOLR](https://github.com/projectblacklight/blacklight/wiki/README_SOLR)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
7.
|
1
|
+
7.21.0
|
@@ -1,18 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
1
3
|
Blacklight = function () {
|
2
4
|
var buffer = new Array();
|
3
5
|
return {
|
4
|
-
onLoad: function (func) {
|
6
|
+
onLoad: function onLoad(func) {
|
5
7
|
buffer.push(func);
|
6
8
|
},
|
7
|
-
activate: function () {
|
9
|
+
activate: function activate() {
|
8
10
|
for (var i = 0; i < buffer.length; i++) {
|
9
11
|
buffer[i].call();
|
10
12
|
}
|
11
13
|
},
|
12
|
-
listeners: function () {
|
14
|
+
listeners: function listeners() {
|
13
15
|
var listeners = [];
|
14
16
|
|
15
|
-
if (typeof
|
17
|
+
if (typeof Turbo !== 'undefined') {
|
18
|
+
listeners.push('turbo:load');
|
19
|
+
} else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
|
16
20
|
// Turbolinks 5
|
17
21
|
if (Turbolinks.BrowserAdapter) {
|
18
22
|
listeners.push('turbolinks:load');
|
@@ -36,7 +40,14 @@ Blacklight.listeners().forEach(function (listener) {
|
|
36
40
|
Blacklight.activate();
|
37
41
|
});
|
38
42
|
});
|
39
|
-
|
43
|
+
Blacklight.onLoad(function () {
|
44
|
+
var elem = document.querySelector('.no-js'); // The "no-js" class may already have been removed because this function is
|
45
|
+
// run on every turbo:load event, in that case, it won't find an element.
|
46
|
+
|
47
|
+
if (!elem) return;
|
48
|
+
elem.classList.remove('no-js');
|
49
|
+
elem.classList.add('js');
|
50
|
+
});
|
40
51
|
/*global Bloodhound */
|
41
52
|
|
42
53
|
Blacklight.onLoad(function () {
|
@@ -82,7 +93,7 @@ Blacklight.onLoad(function () {
|
|
82
93
|
$(Blacklight.doBookmarkToggleBehavior.selector).blCheckboxSubmit({
|
83
94
|
// cssClass is added to elements added, plus used for id base
|
84
95
|
cssClass: 'toggle-bookmark',
|
85
|
-
success: function (checked, response) {
|
96
|
+
success: function success(checked, response) {
|
86
97
|
if (response.bookmarks) {
|
87
98
|
$('[data-role=bookmark-counter]').text(response.bookmarks.count);
|
88
99
|
}
|
@@ -100,8 +111,8 @@ Blacklight.onLoad(function () {
|
|
100
111
|
// Button clicks should change focus. As of 10/3/19, Firefox for Mac and
|
101
112
|
// Safari both do not set focus to a button on button click.
|
102
113
|
// See https://zellwk.com/blog/inconsistent-button-behavior/ for background information
|
103
|
-
document.querySelectorAll('button.collapse-toggle').forEach(button
|
104
|
-
button.addEventListener('click', ()
|
114
|
+
document.querySelectorAll('button.collapse-toggle').forEach(function (button) {
|
115
|
+
button.addEventListener('click', function () {
|
105
116
|
event.target.focus();
|
106
117
|
});
|
107
118
|
});
|
@@ -188,12 +199,12 @@ Blacklight.onLoad(function () {
|
|
188
199
|
dataType: 'json',
|
189
200
|
type: form.attr('method').toUpperCase(),
|
190
201
|
data: form.serialize(),
|
191
|
-
error: function () {
|
202
|
+
error: function error() {
|
192
203
|
label.removeAttr('disabled');
|
193
204
|
checkbox.removeAttr('disabled');
|
194
205
|
options.error.call();
|
195
206
|
},
|
196
|
-
success: function (data, status, xhr) {
|
207
|
+
success: function success(data, status, xhr) {
|
197
208
|
//if app isn't running at all, xhr annoyingly
|
198
209
|
//reports success with status 0.
|
199
210
|
if (xhr.status != 0) {
|
@@ -219,10 +230,10 @@ Blacklight.onLoad(function () {
|
|
219
230
|
$.fn.blCheckboxSubmit.defaults = {
|
220
231
|
//cssClass is added to elements added, plus used for id base
|
221
232
|
cssClass: 'blCheckboxSubmit',
|
222
|
-
error: function () {
|
233
|
+
error: function error() {
|
223
234
|
alert("Error");
|
224
235
|
},
|
225
|
-
success: function () {} //callback
|
236
|
+
success: function success() {} //callback
|
226
237
|
|
227
238
|
};
|
228
239
|
})(jQuery);
|
@@ -238,12 +249,12 @@ Blacklight.doResizeFacetLabelsAndCounts = function () {
|
|
238
249
|
}
|
239
250
|
|
240
251
|
document.querySelectorAll('.facet-values, .pivot-facet').forEach(function (elem) {
|
241
|
-
|
252
|
+
var nodes = elem.querySelectorAll('.facet-count'); // TODO: when we drop ie11 support, this can become the spread operator:
|
242
253
|
|
243
|
-
|
254
|
+
var longest = Array.from(nodes).sort(longer)[0];
|
244
255
|
|
245
256
|
if (longest && longest.textContent) {
|
246
|
-
|
257
|
+
var width = longest.textContent.length + 1 + 'ch';
|
247
258
|
elem.querySelector('.facet-count').style.width = width;
|
248
259
|
}
|
249
260
|
});
|
@@ -360,7 +371,7 @@ Blacklight.modal.onFailure = function (jqXHR, textStatus, errorThrown) {
|
|
360
371
|
Blacklight.modal.receiveAjax = function (contents) {
|
361
372
|
// does it have a data- selector for container?
|
362
373
|
// important we don't execute script tags, we shouldn't.
|
363
|
-
// code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/
|
374
|
+
// code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/main/src/ajax/load.js?source=c#L62
|
364
375
|
var container = $('<div>').append(jQuery.parseHTML(contents)).find(Blacklight.modal.containerSelector).first();
|
365
376
|
|
366
377
|
if (container.length !== 0) {
|
@@ -438,14 +449,26 @@ Blacklight.doSearchContextBehavior = function () {
|
|
438
449
|
return Blacklight.do_search_context_behavior();
|
439
450
|
}
|
440
451
|
|
441
|
-
|
452
|
+
var elements = document.querySelectorAll('a[data-context-href]'); // Equivalent to Array.from(), but supports ie11
|
442
453
|
|
443
|
-
|
454
|
+
var nodes = Array.prototype.slice.call(elements);
|
444
455
|
nodes.forEach(function (element) {
|
445
456
|
element.addEventListener('click', function (e) {
|
446
457
|
Blacklight.handleSearchContextMethod.call(e.currentTarget, e);
|
447
458
|
});
|
448
459
|
});
|
460
|
+
};
|
461
|
+
|
462
|
+
Blacklight.csrfToken = function () {
|
463
|
+
var _document$querySelect;
|
464
|
+
|
465
|
+
return (_document$querySelect = document.querySelector('meta[name=csrf-token]')) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.content;
|
466
|
+
};
|
467
|
+
|
468
|
+
Blacklight.csrfParam = function () {
|
469
|
+
var _document$querySelect2;
|
470
|
+
|
471
|
+
return (_document$querySelect2 = document.querySelector('meta[name=csrf-param]')) === null || _document$querySelect2 === void 0 ? void 0 : _document$querySelect2.content;
|
449
472
|
}; // this is the Rails.handleMethod with a couple adjustments, described inline:
|
450
473
|
// first, we're attaching this directly to the event handler, so we can check for meta-keys
|
451
474
|
|
@@ -458,22 +481,21 @@ Blacklight.handleSearchContextMethod = function (event) {
|
|
458
481
|
|
459
482
|
var link = this; // instead of using the normal href, we need to use the context href instead
|
460
483
|
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
484
|
+
var href = link.getAttribute('data-context-href');
|
485
|
+
var target = link.getAttribute('target');
|
486
|
+
var csrfToken = Blacklight.csrfToken();
|
487
|
+
var csrfParam = Blacklight.csrfParam();
|
488
|
+
var form = document.createElement('form');
|
466
489
|
form.method = 'post';
|
467
490
|
form.action = href;
|
468
|
-
|
469
|
-
<input name="redirect" value="${link.getAttribute('href')}" type="hidden" />`; // check for meta keys.. if set, we should open in a new tab
|
491
|
+
var formContent = "<input name=\"_method\" value=\"post\" type=\"hidden\" />\n <input name=\"redirect\" value=\"".concat(link.getAttribute('href'), "\" type=\"hidden\" />"); // check for meta keys.. if set, we should open in a new tab
|
470
492
|
|
471
493
|
if (event.metaKey || event.ctrlKey) {
|
472
494
|
target = '_blank';
|
473
495
|
}
|
474
496
|
|
475
497
|
if (csrfParam !== undefined && csrfToken !== undefined) {
|
476
|
-
formContent +=
|
498
|
+
formContent += "<input name=\"".concat(csrfParam, "\" value=\"").concat(csrfToken, "\" type=\"hidden\" />");
|
477
499
|
} // Must trigger submit by click on a button, else "submit" event handler won't work!
|
478
500
|
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
|
479
501
|
|
@@ -495,3 +517,4 @@ Blacklight.handleSearchContextMethod = function (event) {
|
|
495
517
|
Blacklight.onLoad(function () {
|
496
518
|
Blacklight.doSearchContextBehavior();
|
497
519
|
});
|
520
|
+
|
@@ -1,27 +1,30 @@
|
|
1
1
|
.constraints-container {
|
2
2
|
@extend .mb-2;
|
3
|
+
display: flex;
|
3
4
|
}
|
4
5
|
|
5
6
|
.applied-filter {
|
7
|
+
@extend .mx-1;
|
8
|
+
|
6
9
|
.constraint-value {
|
7
10
|
cursor: default;
|
8
11
|
text-overflow: ellipsis;
|
9
12
|
overflow: hidden;
|
10
13
|
|
11
14
|
@media (max-width: breakpoint-min(sm)) {
|
12
|
-
max-width: breakpoint-min(sm)
|
15
|
+
max-width: breakpoint-min(sm) * .5;
|
13
16
|
}
|
14
17
|
|
15
18
|
@media (min-width: breakpoint-min(sm)) and (max-width: breakpoint-max(sm)) {
|
16
|
-
max-width: breakpoint-min(sm)
|
19
|
+
max-width: breakpoint-min(sm) * .5;
|
17
20
|
}
|
18
21
|
|
19
22
|
@media (min-width: breakpoint-min(md)) and (max-width: breakpoint-max(md)) {
|
20
|
-
max-width: breakpoint-min(md)
|
23
|
+
max-width: breakpoint-min(md) * .5;
|
21
24
|
}
|
22
25
|
|
23
26
|
@media (min-width: breakpoint-min(lg)) {
|
24
|
-
max-width: breakpoint-min(lg)
|
27
|
+
max-width: breakpoint-min(lg) * .5;
|
25
28
|
}
|
26
29
|
|
27
30
|
&:hover, &:active {
|
@@ -83,7 +83,7 @@
|
|
83
83
|
.remove {
|
84
84
|
color: $text-muted;
|
85
85
|
font-weight: bold;
|
86
|
-
padding-left: $spacer
|
86
|
+
padding-left: $spacer * .5;
|
87
87
|
text-decoration: none;
|
88
88
|
|
89
89
|
&:hover {
|
@@ -104,7 +104,7 @@
|
|
104
104
|
padding-right: 1em;
|
105
105
|
text-indent: -15px;
|
106
106
|
padding-left: 15px;
|
107
|
-
padding-bottom: $spacer
|
107
|
+
padding-bottom: $spacer * .5;
|
108
108
|
@include hyphens-auto;
|
109
109
|
}
|
110
110
|
|
@@ -64,7 +64,7 @@ module Blacklight
|
|
64
64
|
Deprecation.silence(Blacklight::SearchState) do
|
65
65
|
@search_state.filters.map do |facet|
|
66
66
|
facet.values.map do |val|
|
67
|
-
next if val.blank?
|
67
|
+
next if val.blank?
|
68
68
|
|
69
69
|
if val.is_a?(Array)
|
70
70
|
yield inclusive_facet_item_presenter(facet.config, val, facet.key) if val.any?(&:present?)
|
@@ -121,10 +121,10 @@ module Blacklight
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def before_render
|
124
|
-
set_slot(:title) unless title
|
125
|
-
set_slot(:thumbnail, component: @thumbnail_component || presenter.view_config&.thumbnail_component) unless thumbnail || show?
|
126
|
-
set_slot(:metadata, component: @metadata_component, fields: presenter.field_presenters) unless metadata
|
127
|
-
set_slot(:embed, component: @embed_component || presenter.view_config&.embed_component) unless embed
|
124
|
+
set_slot(:title, nil) unless title
|
125
|
+
set_slot(:thumbnail, nil, component: @thumbnail_component || presenter.view_config&.thumbnail_component) unless thumbnail || show?
|
126
|
+
set_slot(:metadata, nil, component: @metadata_component, fields: presenter.field_presenters) unless metadata
|
127
|
+
set_slot(:embed, nil, component: @embed_component || presenter.view_config&.embed_component) unless embed
|
128
128
|
end
|
129
129
|
|
130
130
|
private
|
@@ -27,7 +27,7 @@ module Blacklight
|
|
27
27
|
render_facet_value
|
28
28
|
end
|
29
29
|
|
30
|
-
return if content.blank?
|
30
|
+
return '' if content.blank?
|
31
31
|
return content unless @wrapping_element
|
32
32
|
|
33
33
|
content_tag @wrapping_element, content
|
@@ -72,7 +72,7 @@ module Blacklight
|
|
72
72
|
# @private
|
73
73
|
def render_facet_value
|
74
74
|
tag.span(class: "facet-label") do
|
75
|
-
link_to_unless(@suppress_link, @label, @href, class: "facet-select")
|
75
|
+
link_to_unless(@suppress_link, @label, @href, class: "facet-select", rel: "nofollow")
|
76
76
|
end + render_facet_count
|
77
77
|
end
|
78
78
|
|
@@ -85,7 +85,7 @@ module Blacklight
|
|
85
85
|
tag.span(class: "facet-label") do
|
86
86
|
tag.span(@label, class: "selected") +
|
87
87
|
# remove link
|
88
|
-
link_to(@href, class: "remove") do
|
88
|
+
link_to(@href, class: "remove", rel: "nofollow") do
|
89
89
|
tag.span('✖', class: "remove-icon", aria: { hidden: true }) +
|
90
90
|
tag.span(@view_context.t(:'blacklight.search.facets.selected.remove'), class: 'sr-only visually-hidden')
|
91
91
|
end
|
@@ -23,7 +23,7 @@ module Blacklight
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def value(*args, **kwargs, &block)
|
26
|
-
return set_slot(:values, *args, **kwargs, &block) if block_given?
|
26
|
+
return set_slot(:values, nil, *args, **kwargs, &block) if block_given?
|
27
27
|
|
28
28
|
Deprecation.warn(Blacklight::MetadataFieldLayoutComponent, 'The `value` content area is deprecated; render from the values slot instead')
|
29
29
|
|
@@ -6,8 +6,8 @@
|
|
6
6
|
<h1 class="modal-title"><%= title %></h1>
|
7
7
|
<% end) %>
|
8
8
|
|
9
|
-
<button type="button" class="blacklight-modal-close btn-close close" data-dismiss="modal" aria-label="<%= t('blacklight.modal.close') %>">
|
10
|
-
<span aria-hidden="true">×</span>
|
9
|
+
<button type="button" class="blacklight-modal-close btn-close close" data-bs-dismiss="modal" data-dismiss="modal" aria-label="<%= t('blacklight.modal.close') %>">
|
10
|
+
<span aria-hidden="true" class="visually-hidden">×</span>
|
11
11
|
</button>
|
12
12
|
</div>
|
13
13
|
|
@@ -48,9 +48,6 @@ module Blacklight::Bookmarks
|
|
48
48
|
format.html {}
|
49
49
|
format.rss { render layout: false }
|
50
50
|
format.atom { render layout: false }
|
51
|
-
format.json do
|
52
|
-
render json: render_search_results_as_json
|
53
|
-
end
|
54
51
|
|
55
52
|
additional_response_formats(format)
|
56
53
|
document_export_formats(format)
|
@@ -2,6 +2,9 @@
|
|
2
2
|
module Blacklight::Catalog
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
+
# MimeResponds is part of ActionController::Base, but not ActionController::API
|
6
|
+
include ActionController::MimeResponds
|
7
|
+
|
5
8
|
include Blacklight::Base
|
6
9
|
include Blacklight::Facet
|
7
10
|
include Blacklight::Searchable
|
@@ -257,7 +260,7 @@ module Blacklight::Catalog
|
|
257
260
|
|
258
261
|
# Email Action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
|
259
262
|
def email_action documents
|
260
|
-
mail = RecordMailer.email_record(documents, { to: params[:to], message: params[:message] }, url_options)
|
263
|
+
mail = RecordMailer.email_record(documents, { to: params[:to], message: params[:message], config: blacklight_config }, url_options)
|
261
264
|
if mail.respond_to? :deliver_now
|
262
265
|
mail.deliver_now
|
263
266
|
else
|
@@ -268,7 +271,7 @@ module Blacklight::Catalog
|
|
268
271
|
# SMS action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
|
269
272
|
def sms_action documents
|
270
273
|
to = "#{params[:to].gsub(/[^\d]/, '')}@#{params[:carrier]}"
|
271
|
-
mail = RecordMailer.sms_record(documents, { to: to }, url_options)
|
274
|
+
mail = RecordMailer.sms_record(documents, { to: to, config: blacklight_config }, url_options)
|
272
275
|
if mail.respond_to? :deliver_now
|
273
276
|
mail.deliver_now
|
274
277
|
else
|
@@ -3,6 +3,7 @@
|
|
3
3
|
# as this module is mixed-in to the application controller in the hosting app on installation.
|
4
4
|
module Blacklight::Controller
|
5
5
|
extend ActiveSupport::Concern
|
6
|
+
extend Deprecation
|
6
7
|
|
7
8
|
included do
|
8
9
|
include Blacklight::SearchFields
|
@@ -38,11 +39,6 @@ module Blacklight::Controller
|
|
38
39
|
# TODO: move to Searchable
|
39
40
|
class_attribute :search_service_class
|
40
41
|
self.search_service_class = Blacklight::SearchService
|
41
|
-
|
42
|
-
# This callback runs when a user first logs in
|
43
|
-
|
44
|
-
define_callbacks :logging_in_user
|
45
|
-
set_callback :logging_in_user, :before, :transfer_guest_user_actions_to_current_user
|
46
42
|
end
|
47
43
|
|
48
44
|
# @private
|
@@ -136,6 +132,13 @@ module Blacklight::Controller
|
|
136
132
|
|
137
133
|
##
|
138
134
|
# When a user logs in, transfer any saved searches or bookmarks to the current_user
|
135
|
+
def transfer_guest_to_user
|
136
|
+
Deprecation.silence(Blacklight::Controller) do
|
137
|
+
transfer_guest_user_actions_to_current_user
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# @deprecated use canonical `transfer_guest_to_user` method instead
|
139
142
|
def transfer_guest_user_actions_to_current_user
|
140
143
|
return unless respond_to?(:current_user) && respond_to?(:guest_user) && current_user && guest_user
|
141
144
|
|
@@ -155,6 +158,7 @@ module Blacklight::Controller
|
|
155
158
|
# let guest_user know we've moved some bookmarks from under it
|
156
159
|
guest_user.reload if guest_user.persisted?
|
157
160
|
end
|
161
|
+
deprecation_deprecate :transfer_guest_user_actions_to_current_user
|
158
162
|
|
159
163
|
##
|
160
164
|
# To handle failed authorization attempts, redirect the user to the
|
@@ -73,7 +73,7 @@ module Blacklight::SearchContext
|
|
73
73
|
#
|
74
74
|
def agent_is_crawler?
|
75
75
|
crawler_proc = blacklight_config.crawler_detector
|
76
|
-
return false if crawler_proc.nil? || current_user.present?
|
76
|
+
return false if crawler_proc.nil? || (defined?(current_user) && current_user.present?)
|
77
77
|
|
78
78
|
crawler_proc.call(request)
|
79
79
|
end
|
@@ -47,11 +47,9 @@ module Blacklight::CatalogHelperBehavior
|
|
47
47
|
entry_name = if entry_name
|
48
48
|
entry_name.pluralize(collection.size, I18n.locale)
|
49
49
|
else
|
50
|
-
collection.entry_name(count: collection.size).to_s
|
50
|
+
collection.entry_name(count: collection.size).to_s
|
51
51
|
end
|
52
52
|
|
53
|
-
entry_name = entry_name.pluralize unless collection.total_count == 1
|
54
|
-
|
55
53
|
# grouped response objects need special handling
|
56
54
|
end_num = if collection.respond_to?(:groups) && render_grouped_response?(collection)
|
57
55
|
collection.groups.length
|
@@ -13,7 +13,9 @@ Blacklight = function() {
|
|
13
13
|
|
14
14
|
listeners: function () {
|
15
15
|
var listeners = [];
|
16
|
-
if (typeof
|
16
|
+
if (typeof Turbo !== 'undefined') {
|
17
|
+
listeners.push('turbo:load');
|
18
|
+
} else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
|
17
19
|
// Turbolinks 5
|
18
20
|
if (Turbolinks.BrowserAdapter) {
|
19
21
|
listeners.push('turbolinks:load');
|
@@ -38,4 +40,13 @@ Blacklight.listeners().forEach(function(listener) {
|
|
38
40
|
})
|
39
41
|
})
|
40
42
|
|
41
|
-
|
43
|
+
Blacklight.onLoad(function () {
|
44
|
+
const elem = document.querySelector('.no-js');
|
45
|
+
|
46
|
+
// The "no-js" class may already have been removed because this function is
|
47
|
+
// run on every turbo:load event, in that case, it won't find an element.
|
48
|
+
if (!elem) return;
|
49
|
+
|
50
|
+
elem.classList.remove('no-js')
|
51
|
+
elem.classList.add('js')
|
52
|
+
})
|
@@ -120,7 +120,7 @@ Blacklight.modal.onFailure = function(jqXHR, textStatus, errorThrown) {
|
|
120
120
|
Blacklight.modal.receiveAjax = function (contents) {
|
121
121
|
// does it have a data- selector for container?
|
122
122
|
// important we don't execute script tags, we shouldn't.
|
123
|
-
// code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/
|
123
|
+
// code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/main/src/ajax/load.js?source=c#L62
|
124
124
|
var container = $('<div>').
|
125
125
|
append( jQuery.parseHTML(contents) ).find( Blacklight.modal.containerSelector ).first();
|
126
126
|
if (container.length !== 0) {
|
@@ -15,6 +15,9 @@ Blacklight.doSearchContextBehavior = function() {
|
|
15
15
|
})
|
16
16
|
};
|
17
17
|
|
18
|
+
Blacklight.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content
|
19
|
+
Blacklight.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content
|
20
|
+
|
18
21
|
// this is the Rails.handleMethod with a couple adjustments, described inline:
|
19
22
|
// first, we're attaching this directly to the event handler, so we can check for meta-keys
|
20
23
|
Blacklight.handleSearchContextMethod = function(event) {
|
@@ -27,8 +30,8 @@ Blacklight.handleSearchContextMethod = function(event) {
|
|
27
30
|
// instead of using the normal href, we need to use the context href instead
|
28
31
|
let href = link.getAttribute('data-context-href')
|
29
32
|
let target = link.getAttribute('target')
|
30
|
-
let csrfToken =
|
31
|
-
let csrfParam =
|
33
|
+
let csrfToken = Blacklight.csrfToken()
|
34
|
+
let csrfParam = Blacklight.csrfParam()
|
32
35
|
let form = document.createElement('form')
|
33
36
|
form.method = 'post'
|
34
37
|
form.action = href
|