blacklight 8.1.0 → 8.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +8 -6
- data/.rubocop_todo.yml +20 -5
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/blacklight.esm.js +41 -21
- data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js +41 -21
- data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
- data/app/assets/stylesheets/blacklight/_mixins.scss +1 -1
- data/app/components/blacklight/advanced_search_form_component.html.erb +3 -3
- data/app/components/blacklight/advanced_search_form_component.rb +1 -1
- data/app/components/blacklight/document/bookmark_component.html.erb +1 -6
- data/app/components/blacklight/facet_field_component.html.erb +2 -1
- data/app/components/blacklight/icons/legacy_icon_component.rb +1 -1
- data/app/components/blacklight/response/facet_group_component.html.erb +0 -1
- data/app/components/blacklight/search/sidebar_component.html.erb +8 -6
- data/app/components/blacklight/search_bar_component.html.erb +36 -34
- data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
- data/app/controllers/concerns/blacklight/token_based_user.rb +5 -19
- data/app/helpers/blacklight/url_helper_behavior.rb +3 -2
- data/app/javascript/blacklight/checkbox_submit.js +15 -10
- data/app/javascript/blacklight/modal.js +26 -12
- data/app/javascript/blacklight/search_context.js +1 -0
- data/app/values/blacklight/types.rb +14 -0
- data/app/views/catalog/_advanced_search_form.html.erb +1 -1
- data/app/views/catalog/_citation.html.erb +1 -1
- data/app/views/catalog/email.html.erb +2 -2
- data/app/views/catalog/sms.html.erb +2 -2
- data/app/views/kaminari/blacklight/_page.html.erb +1 -1
- data/blacklight.gemspec +1 -1
- data/config/locales/blacklight.ar.yml +0 -1
- data/config/locales/blacklight.ca.yml +0 -2
- data/config/locales/blacklight.de.yml +0 -1
- data/config/locales/blacklight.en.yml +0 -1
- data/config/locales/blacklight.es.yml +0 -1
- data/config/locales/blacklight.fr.yml +0 -1
- data/config/locales/blacklight.hu.yml +0 -1
- data/config/locales/blacklight.it.yml +0 -1
- data/config/locales/blacklight.nl.yml +0 -1
- data/config/locales/blacklight.pt-BR.yml +0 -1
- data/config/locales/blacklight.sq.yml +0 -1
- data/config/locales/blacklight.zh.yml +0 -1
- data/docker-compose.yml +0 -2
- data/lib/blacklight/solr/repository.rb +3 -1
- data/lib/blacklight/solr/response/params.rb +1 -1
- data/lib/blacklight/solr/search_builder_behavior.rb +2 -0
- data/lib/generators/blacklight/assets/importmap_generator.rb +2 -2
- data/lib/generators/blacklight/assets/sprockets_generator.rb +1 -1
- data/lib/generators/blacklight/assets_generator.rb +1 -1
- data/package.json +1 -1
- data/spec/components/blacklight/document_component_spec.rb +3 -3
- data/spec/components/blacklight/facet_component_spec.rb +1 -1
- data/spec/components/blacklight/response/view_type_component_spec.rb +1 -1
- data/spec/controllers/catalog_controller_spec.rb +2 -2
- data/spec/features/advanced_search_spec.rb +6 -0
- data/spec/features/citation_spec.rb +10 -0
- data/spec/features/sms_spec.rb +12 -0
- data/spec/models/blacklight/solr/response_spec.rb +1 -1
- data/spec/models/blacklight/solr/search_builder_spec.rb +13 -0
- data/spec/models/solr_document_spec.rb +6 -2
- data/spec/spec_helper.rb +0 -28
- data/spec/test_app_templates/Gemfile.extra +0 -1
- data/spec/views/catalog/_document.html.erb_spec.rb +1 -1
- data/spec/views/catalog/index.atom.builder_spec.rb +1 -1
- data/template.demo.rb +7 -7
- metadata +9 -5
@@ -55,7 +55,7 @@ module Blacklight
|
|
55
55
|
def initialize_search_filter_controls
|
56
56
|
fields = blacklight_config.facet_fields.select { |_k, v| v.include_in_advanced_search || v.include_in_advanced_search.nil? }
|
57
57
|
|
58
|
-
fields.
|
58
|
+
fields.each_value do |config|
|
59
59
|
display_facet = @response.aggregations[config.field]
|
60
60
|
with_search_filter_control(config: config, display_facet: display_facet)
|
61
61
|
end
|
@@ -1,13 +1,9 @@
|
|
1
|
-
<%-
|
2
|
-
# the data-doc-id attribute is used by our JS that converts to a checkbox/label.
|
3
|
-
# we don't use the per-form csrf token
|
4
|
-
-%>
|
1
|
+
<%- # we don't use the per-form csrf token -%>
|
5
2
|
<%= form_tag(bookmark_path,
|
6
3
|
authenticity_token: false,
|
7
4
|
method: bookmarked? ? :delete : :put,
|
8
5
|
class: "bookmark-toggle",
|
9
6
|
data: {
|
10
|
-
'doc-id' => @document.id,
|
11
7
|
present: t('blacklight.search.bookmarks.present'),
|
12
8
|
absent: t('blacklight.search.bookmarks.absent'),
|
13
9
|
inprogress: t('blacklight.search.bookmarks.inprogress')
|
@@ -20,6 +16,5 @@
|
|
20
16
|
</div>
|
21
17
|
|
22
18
|
<%= submit_tag(t(bookmarked? ? 'remove.button' : 'add.button', scope: 'blacklight.bookmarks'),
|
23
|
-
id: "bookmark_toggle_#{@document.id.to_s.parameterize}",
|
24
19
|
class: "bookmark-#{bookmarked? ? 'remove' : 'add'} btn btn-outline-secondary") %>
|
25
20
|
<% end %>
|
@@ -8,11 +8,12 @@
|
|
8
8
|
data-target="#<%= html_id %>"
|
9
9
|
data-bs-target="#<%= html_id %>"
|
10
10
|
aria-expanded="<%= @facet_field.collapsed? ? 'false' : 'true' %>"
|
11
|
+
arial-controls="<%= html_id %>"
|
11
12
|
>
|
12
13
|
<%= label %>
|
13
14
|
</button>
|
14
15
|
</h3>
|
15
|
-
<div id="<%= html_id %>" aria-labelledby="<%= header_html_id %>" class="panel-collapse facet-content collapse <%= "show" unless @facet_field.collapsed? %>">
|
16
|
+
<div id="<%= html_id %>" role="region" aria-labelledby="<%= header_html_id %>" class="panel-collapse facet-content collapse <%= "show" unless @facet_field.collapsed? %>">
|
16
17
|
<div class="card-body">
|
17
18
|
<%= body %>
|
18
19
|
|
@@ -11,7 +11,7 @@ module Blacklight
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def call
|
14
|
-
tag.span(svg&.html_safe || default_icon,
|
14
|
+
tag.span(svg&.html_safe || default_icon, # rubocop:disable Rails/OutputSafety
|
15
15
|
class: "blacklight-icons blacklight-icon-#{@name} #{@classes}".strip,
|
16
16
|
'aria-hidden': (true if @aria_hidden))
|
17
17
|
end
|
@@ -15,7 +15,6 @@
|
|
15
15
|
aria: {
|
16
16
|
controls: @panel_id,
|
17
17
|
expanded: 'false',
|
18
|
-
label: t('blacklight.search.facets.group.toggle'),
|
19
18
|
} do %>
|
20
19
|
<span data-show-label><%= t('blacklight.search.facets.group.open') %></span>
|
21
20
|
<span data-hide-label><%= t('blacklight.search.facets.group.close') %></span>
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
<%
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
<search>
|
2
|
+
<% facet_group_names.each do |groupname| %>
|
3
|
+
<% fields = facet_fields_in_group(groupname) %>
|
4
|
+
<%= render group_component_class.new(id: groupname, fields: fields, response: response) do |component| %>
|
5
|
+
<% component.with_body do %>
|
6
|
+
<%= render Blacklight::FacetComponent.with_collection(fields, response: response) %>
|
7
|
+
<% end %>
|
6
8
|
<% end %>
|
7
9
|
<% end %>
|
8
|
-
|
10
|
+
</search>
|
@@ -1,39 +1,41 @@
|
|
1
|
-
|
2
|
-
<%=
|
3
|
-
|
4
|
-
<%= f.label :search_field, scoped_t('search_field.label'), class: 'sr-only visually-hidden' %>
|
5
|
-
<% end %>
|
6
|
-
<% before_input_groups.each do |input_group| %>
|
7
|
-
<%= input_group %>
|
8
|
-
<% end %>
|
9
|
-
<div class="input-group">
|
10
|
-
<%= prepend %>
|
11
|
-
|
1
|
+
<search>
|
2
|
+
<%= form_with url: @url, local: true, method: @method, class: @classes.join(' '), scope: @prefix, role: 'search', **@form_options do |f| %>
|
3
|
+
<%= render Blacklight::HiddenSearchStateComponent.new(params: @params) %>
|
12
4
|
<% if search_fields.length > 1 %>
|
13
|
-
<%= f.
|
14
|
-
options_for_select(search_fields, h(@search_field)),
|
15
|
-
{},
|
16
|
-
title: scoped_t('search_field.title'),
|
17
|
-
class: "custom-select form-select search-field") %>
|
18
|
-
<% elsif search_fields.length == 1 %>
|
19
|
-
<%= f.hidden_field :search_field, value: search_fields.first.last %>
|
5
|
+
<%= f.label :search_field, scoped_t('search_field.label'), class: 'sr-only visually-hidden' %>
|
20
6
|
<% end %>
|
21
|
-
|
22
|
-
|
23
|
-
<% if autocomplete_path.present? %>
|
24
|
-
<auto-complete src="<%= autocomplete_path %>" for="autocomplete-popup" class="search-autocomplete-wrapper">
|
25
|
-
<%= f.search_field @query_param, value: @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", autofocus: @autofocus, aria: { label: scoped_t('search.label'), autocomplete: 'list', controls: 'autocomplete-popup' } %>
|
26
|
-
<ul id="autocomplete-popup" role="listbox" aria-label="<%= scoped_t('search.label') %>"></ul>
|
27
|
-
</auto-complete>
|
28
|
-
<% else %>
|
29
|
-
<%= f.search_field @query_param, value: @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", autofocus: @autofocus, aria: { label: scoped_t('search.label') } %>
|
7
|
+
<% before_input_groups.each do |input_group| %>
|
8
|
+
<%= input_group %>
|
30
9
|
<% end %>
|
10
|
+
<div class="input-group">
|
11
|
+
<%= prepend %>
|
31
12
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
13
|
+
<% if search_fields.length > 1 %>
|
14
|
+
<%= f.select(:search_field,
|
15
|
+
options_for_select(search_fields, h(@search_field)),
|
16
|
+
{},
|
17
|
+
title: scoped_t('search_field.title'),
|
18
|
+
class: "custom-select form-select search-field") %>
|
19
|
+
<% elsif search_fields.length == 1 %>
|
20
|
+
<%= f.hidden_field :search_field, value: search_fields.first.last %>
|
21
|
+
<% end %>
|
36
22
|
|
37
|
-
|
38
|
-
|
39
|
-
|
23
|
+
<%= f.label @query_param, scoped_t('search.label'), class: 'sr-only visually-hidden' %>
|
24
|
+
<% if autocomplete_path.present? %>
|
25
|
+
<auto-complete src="<%= autocomplete_path %>" for="autocomplete-popup" class="search-autocomplete-wrapper">
|
26
|
+
<%= f.search_field @query_param, value: @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", autofocus: @autofocus, aria: { label: scoped_t('search.label'), autocomplete: 'list', controls: 'autocomplete-popup' } %>
|
27
|
+
<ul id="autocomplete-popup" role="listbox" aria-label="<%= scoped_t('search.label') %>" hidden></ul>
|
28
|
+
</auto-complete>
|
29
|
+
<% else %>
|
30
|
+
<%= f.search_field @query_param, value: @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", autofocus: @autofocus, aria: { label: scoped_t('search.label') } %>
|
31
|
+
<% end %>
|
32
|
+
|
33
|
+
<%= append %>
|
34
|
+
<%= search_button || render(Blacklight::SearchButtonComponent.new(id: "#{@prefix}search", text: scoped_t('submit'))) %>
|
35
|
+
</div>
|
36
|
+
<% end %>
|
37
|
+
|
38
|
+
<% if advanced_search_enabled? %>
|
39
|
+
<%= link_to t('blacklight.advanced_search.more_options'), @advanced_search_url, class: 'advanced_search btn btn-secondary'%>
|
40
|
+
<% end %>
|
41
|
+
</search>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="alert <%= @classes %>">
|
2
2
|
<%= message %>
|
3
|
-
<%= tag.
|
3
|
+
<%= tag.button button_contents, type: "button", class: "btn-close",
|
4
4
|
data: { dismiss: "alert", bs_dismiss: "alert" },
|
5
5
|
aria: { label: "Close" } %>
|
6
6
|
</div>
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# A controller mixin that allows users to share their bookmarks.
|
4
|
+
# This is used to create a callback from refworks in the bookmarks_export_url helper in blacklight-marc
|
3
5
|
module Blacklight::TokenBasedUser
|
4
6
|
extend ActiveSupport::Concern
|
5
7
|
|
@@ -45,34 +47,18 @@ module Blacklight::TokenBasedUser
|
|
45
47
|
end
|
46
48
|
|
47
49
|
def export_secret_token
|
48
|
-
secret_key_generator.generate_key('encrypted user session key'
|
50
|
+
secret_key_generator.generate_key('encrypted user session key', key_len)
|
49
51
|
end
|
50
52
|
|
51
53
|
def secret_key_generator
|
52
|
-
@secret_key_generator ||=
|
53
|
-
app = Rails.application
|
54
|
-
|
55
|
-
secret_key_base = if app.respond_to?(:credentials)
|
56
|
-
# Rails 5.2+
|
57
|
-
app.credentials.secret_key_base
|
58
|
-
else
|
59
|
-
# Rails <= 5.1
|
60
|
-
app.secrets.secret_key_base
|
61
|
-
end
|
62
|
-
ActiveSupport::KeyGenerator.new(secret_key_base)
|
63
|
-
end
|
54
|
+
@secret_key_generator ||= ActiveSupport::KeyGenerator.new(Rails.application.secret_key_base)
|
64
55
|
end
|
65
56
|
|
66
57
|
def message_encryptor
|
67
58
|
ActiveSupport::MessageEncryptor.new(export_secret_token)
|
68
59
|
end
|
69
60
|
|
70
|
-
# Ruby 2.4 requires keys of very particular lengths
|
71
61
|
def key_len
|
72
|
-
|
73
|
-
ActiveSupport::MessageEncryptor.key_len
|
74
|
-
else
|
75
|
-
0
|
76
|
-
end
|
62
|
+
ActiveSupport::MessageEncryptor.key_len
|
77
63
|
end
|
78
64
|
end
|
@@ -36,7 +36,8 @@ module Blacklight::UrlHelperBehavior
|
|
36
36
|
private :document_link_params
|
37
37
|
|
38
38
|
##
|
39
|
-
# Attributes for a link that gives a URL we can use to track clicks for the current search session
|
39
|
+
# Attributes for a link that gives a URL we can use to track clicks for the current search session.
|
40
|
+
# We disable turbo prefetch (InstantClick), because since we replace the link with a form, it's just wasted.
|
40
41
|
# @param [SolrDocument] document
|
41
42
|
# @param [Integer] counter
|
42
43
|
# @example
|
@@ -52,7 +53,7 @@ module Blacklight::UrlHelperBehavior
|
|
52
53
|
return {} if path.nil?
|
53
54
|
|
54
55
|
context_method = blacklight_config.track_search_session.storage == 'client' ? 'get' : 'post'
|
55
|
-
{ data: { context_href: path, context_method: context_method } }
|
56
|
+
{ data: { context_href: path, context_method: context_method, turbo_prefetch: false } }
|
56
57
|
end
|
57
58
|
|
58
59
|
##
|
@@ -18,11 +18,11 @@ export default class CheckboxSubmit {
|
|
18
18
|
this.form = form
|
19
19
|
}
|
20
20
|
|
21
|
-
|
21
|
+
clicked(evt) {
|
22
22
|
this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')
|
23
23
|
this.labelTarget.setAttribute('disabled', 'disabled');
|
24
24
|
this.checkboxTarget.setAttribute('disabled', 'disabled');
|
25
|
-
|
25
|
+
fetch(this.formTarget.getAttribute('action'), {
|
26
26
|
body: new FormData(this.formTarget),
|
27
27
|
method: this.formTarget.getAttribute('method').toUpperCase(),
|
28
28
|
headers: {
|
@@ -30,16 +30,17 @@ export default class CheckboxSubmit {
|
|
30
30
|
'X-Requested-With': 'XMLHttpRequest',
|
31
31
|
'X-CSRF-Token': document.querySelector('meta[name=csrf-token]')?.content
|
32
32
|
}
|
33
|
-
})
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
}).then((response) => {
|
34
|
+
if (response.ok) return response.json();
|
35
|
+
return Promise.reject('response was not ok')
|
36
|
+
}).then((json) => {
|
37
|
+
this.labelTarget.removeAttribute('disabled')
|
38
|
+
this.checkboxTarget.removeAttribute('disabled')
|
38
39
|
this.updateStateFor(!this.checked)
|
39
40
|
document.querySelector('[data-role=bookmark-counter]').innerHTML = json.bookmarks.count
|
40
|
-
}
|
41
|
-
|
42
|
-
}
|
41
|
+
}).catch((error) => {
|
42
|
+
this.handleError(error)
|
43
|
+
})
|
43
44
|
}
|
44
45
|
|
45
46
|
get checked() {
|
@@ -62,6 +63,10 @@ export default class CheckboxSubmit {
|
|
62
63
|
return this.form.querySelector('[data-checkboxsubmit-target="span"]')
|
63
64
|
}
|
64
65
|
|
66
|
+
handleError() {
|
67
|
+
alert("Unable to save the bookmark at this time.")
|
68
|
+
}
|
69
|
+
|
65
70
|
updateStateFor(state) {
|
66
71
|
this.checkboxTarget.checked = state
|
67
72
|
|
@@ -97,21 +97,35 @@ const Modal = (() => {
|
|
97
97
|
}
|
98
98
|
|
99
99
|
// Add the passed in contents to the modal and display it.
|
100
|
+
// We have specific handling so that scripts returned from the ajax call are executed.
|
101
|
+
// This enables adding a script like recaptcha to prevent bots from sending emails.
|
100
102
|
modal.receiveAjax = function (contents) {
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
103
|
+
const domparser = new DOMParser();
|
104
|
+
const dom = domparser.parseFromString(contents, "text/html")
|
105
|
+
// If there is a containerSelector on the document, use its children.
|
106
|
+
let elements = dom.querySelectorAll(`${modal.containerSelector} > *`)
|
107
|
+
const frag = document.createDocumentFragment()
|
108
|
+
if (elements.length == 0) {
|
109
|
+
// If the containerSelector wasn't found, use the whole document
|
110
|
+
elements = dom.body.childNodes
|
111
|
+
}
|
112
|
+
elements.forEach((el) => frag.appendChild(el))
|
113
|
+
modal.activateScripts(frag)
|
114
|
+
|
115
|
+
document.querySelector(`${modal.modalSelector} .modal-content`).replaceChildren(frag)
|
116
|
+
|
117
|
+
modal.show();
|
113
118
|
};
|
114
119
|
|
120
|
+
// DOMParser doesn't allow scripts to be executed. This fixes that.
|
121
|
+
modal.activateScripts = function (frag) {
|
122
|
+
frag.querySelectorAll('script').forEach((script) => {
|
123
|
+
const fixedScript = document.createElement('script')
|
124
|
+
fixedScript.src = script.src
|
125
|
+
fixedScript.async = false
|
126
|
+
script.parentNode.replaceChild(fixedScript, script)
|
127
|
+
})
|
128
|
+
}
|
115
129
|
|
116
130
|
modal.modalAjaxLinkClick = function(e) {
|
117
131
|
e.preventDefault();
|
@@ -65,6 +65,19 @@ module Blacklight
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
+
class Time < Value
|
69
|
+
def cast(input)
|
70
|
+
value = super
|
71
|
+
return if value.blank?
|
72
|
+
|
73
|
+
begin
|
74
|
+
::Time.parse(value.to_s) # rubocop:disable Rails/TimeZone
|
75
|
+
rescue ArgumentError
|
76
|
+
Rails.logger&.info "Unable to parse time: #{value.inspect}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
68
81
|
class Boolean < Value
|
69
82
|
def cast(input)
|
70
83
|
ActiveModel::Type::Boolean.new.cast(super)
|
@@ -106,6 +119,7 @@ module Blacklight
|
|
106
119
|
register :boolean, Boolean
|
107
120
|
register :string, String
|
108
121
|
register :date, Date
|
122
|
+
register :time, Time
|
109
123
|
register :array, Array
|
110
124
|
register :json, JsonValue
|
111
125
|
register :html, Html
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<%= render Blacklight::System::ModalComponent.new do |component| %>
|
2
|
-
<% component.
|
2
|
+
<% component.with_title { t('blacklight.tools.citation') } %>
|
3
3
|
|
4
4
|
<%= render Blacklight::Document::CitationComponent.with_collection(@documents) if @documents.present? %>
|
5
5
|
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= render Blacklight::System::ModalComponent.new do |component| %>
|
2
|
-
<% component.
|
2
|
+
<% component.with_title { t('blacklight.email.form.title') } %>
|
3
3
|
|
4
|
-
<% component.
|
4
|
+
<% component.with_body do %>
|
5
5
|
<%= render 'email_form' %>
|
6
6
|
<% end %>
|
7
7
|
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= render Blacklight::System::ModalComponent.new do |component| %>
|
2
|
-
<% component.
|
2
|
+
<% component.with_title { t('blacklight.sms.form.title') } %>
|
3
3
|
|
4
|
-
<% component.
|
4
|
+
<% component.with_body do %>
|
5
5
|
<%= render 'sms_form' %>
|
6
6
|
<% end %>
|
7
7
|
<% end %>
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
<li class="page-item <%= 'active' if page.current? %>">
|
13
13
|
<% if page.current? %>
|
14
|
-
<span class="page-link" aria-
|
14
|
+
<span class="page-link" aria-current="true"><%= page_display %><span class="sr-only visually-hidden"> <%= t('views.pagination.aria.current_page', page: page_display) %></span></span>
|
15
15
|
<% else %>
|
16
16
|
<%= link_to page_display, url, :remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil, class: 'page-link', aria: { label: t('views.pagination.aria.go_to_page', page: page_display) } %>
|
17
17
|
<% end %>
|
data/blacklight.gemspec
CHANGED
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_dependency "view_component", '>= 2.66', '< 4'
|
35
35
|
|
36
36
|
s.add_development_dependency "rsolr", ">= 1.0.6", "< 3" # Library for interacting with rSolr.
|
37
|
-
s.add_development_dependency "rspec-rails", "~> 6.
|
37
|
+
s.add_development_dependency "rspec-rails", "~> 6.1"
|
38
38
|
s.add_development_dependency "rspec-collection_matchers", ">= 1.0"
|
39
39
|
s.add_development_dependency 'axe-core-rspec'
|
40
40
|
s.add_development_dependency "capybara", '~> 3'
|
data/docker-compose.yml
CHANGED
@@ -21,7 +21,9 @@ module Blacklight::Solr
|
|
21
21
|
# Execute a search query against solr
|
22
22
|
# @param [Hash] params solr query parameters
|
23
23
|
def search params = {}
|
24
|
-
|
24
|
+
request_params = params.reverse_merge({ qt: blacklight_config.qt })
|
25
|
+
|
26
|
+
send_and_receive search_path(request_params), request_params
|
25
27
|
end
|
26
28
|
|
27
29
|
# @param [Hash] request_params
|
@@ -31,7 +31,7 @@ module Blacklight::Solr::Response::Params
|
|
31
31
|
defaults = {
|
32
32
|
sort: single_valued_param(:'facet.sort'),
|
33
33
|
limit: single_valued_param(:'facet.limit')&.to_i || 100,
|
34
|
-
offset: single_valued_param(:'facet.offset')
|
34
|
+
offset: single_valued_param(:'facet.offset').to_i,
|
35
35
|
prefix: single_valued_param(:'facet.prefix')
|
36
36
|
}
|
37
37
|
|
@@ -86,6 +86,8 @@ module Blacklight::Solr
|
|
86
86
|
return unless search_state.query_param
|
87
87
|
|
88
88
|
bool_query = search_field.clause_params.transform_values { |v| v.merge(query: search_state.query_param) }
|
89
|
+
solr_parameters["spellcheck.q"] ||= search_state.query_param
|
90
|
+
|
89
91
|
solr_parameters.append_boolean_query(:must, bool_query)
|
90
92
|
end
|
91
93
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Blacklight
|
4
4
|
module Assets
|
5
5
|
class ImportmapGenerator < Rails::Generators::Base
|
6
|
-
class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.
|
6
|
+
class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.3'), desc: "Set the generated app's bootstrap version"
|
7
7
|
|
8
8
|
# This could be skipped if you want to use webpacker
|
9
9
|
def add_javascript_dependencies
|
@@ -16,7 +16,7 @@ module Blacklight
|
|
16
16
|
<<~CONTENT
|
17
17
|
pin "@github/auto-complete-element", to: "https://cdn.skypack.dev/@github/auto-complete-element"
|
18
18
|
pin "@popperjs/core", to: "https://ga.jspm.io/npm:@popperjs/core@2.11.6/dist/umd/popper.min.js"
|
19
|
-
pin "bootstrap", to: "https://ga.jspm.io/npm:bootstrap@#{(defined?(Bootstrap) && Bootstrap::VERSION) || '5.
|
19
|
+
pin "bootstrap", to: "https://ga.jspm.io/npm:bootstrap@#{(defined?(Bootstrap) && Bootstrap::VERSION) || '5.3.2'}/dist/js/bootstrap.js"
|
20
20
|
CONTENT
|
21
21
|
end
|
22
22
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Blacklight
|
4
4
|
module Assets
|
5
5
|
class SprocketsGenerator < Rails::Generators::Base
|
6
|
-
class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.
|
6
|
+
class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.3'), desc: "Set the generated app's bootstrap version"
|
7
7
|
|
8
8
|
# This could be skipped if you want to use webpacker
|
9
9
|
def add_javascript_dependencies
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Blacklight
|
4
4
|
class AssetsGenerator < Rails::Generators::Base
|
5
|
-
class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.
|
5
|
+
class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.3'), desc: "Set the generated app's bootstrap version"
|
6
6
|
|
7
7
|
def run_asset_pipeline_specific_generator
|
8
8
|
generated_options = "--bootstrap-version='#{options[:'bootstrap-version']}'" if options[:'bootstrap-version']
|
data/package.json
CHANGED