blacklight 7.20.1 → 7.22.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/.docker/app/Dockerfile +3 -1
- data/.dockerignore +3 -0
- data/.env +2 -2
- data/.github/workflows/ruby.yml +3 -2
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js +62 -32
- data/app/assets/stylesheets/blacklight/_constraints.scss +3 -1
- data/app/assets/stylesheets/blacklight/_controls.scss +2 -1
- data/app/components/blacklight/constraints_component.rb +3 -7
- data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
- data/app/components/blacklight/facet_item_pivot_component.rb +1 -1
- data/app/components/blacklight/system/modal_component.html.erb +2 -2
- data/app/controllers/concerns/blacklight/catalog.rb +2 -2
- data/app/helpers/blacklight/facets_helper_behavior.rb +1 -1
- data/app/helpers/blacklight/render_partials_helper_behavior.rb +4 -1
- data/app/javascript/blacklight/core.js +8 -2
- data/app/javascript/blacklight/modal.js +20 -4
- 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/bookmarks/index.html.erb +1 -1
- data/app/views/catalog/_search_results.html.erb +1 -1
- data/app/views/record_mailer/sms_record.text.erb +1 -1
- data/config/locales/blacklight.de.yml +1 -1
- data/docker-compose.yml +5 -2
- data/lib/blacklight/configuration/facet_field.rb +2 -0
- data/lib/blacklight/configuration.rb +9 -0
- data/lib/blacklight/engine.rb +2 -0
- data/lib/blacklight/search_state/filter_field.rb +34 -19
- data/lib/blacklight/solr/response/facets.rb +14 -5
- data/lib/blacklight/solr/search_builder_behavior.rb +2 -14
- data/package.json +4 -2
- data/spec/controllers/catalog_controller_spec.rb +14 -2
- data/spec/features/axe_spec.rb +6 -7
- data/spec/features/facet_missing_spec.rb +12 -4
- data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +7 -7
- data/spec/lib/blacklight/search_state/filter_field_spec.rb +3 -17
- 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 +7 -1
- data/spec/models/blacklight/solr/search_builder_spec.rb +0 -13
- data/spec/models/record_mailer_spec.rb +30 -2
- data/spec/spec_helper.rb +3 -3
- data/tasks/blacklight.rake +5 -1
- metadata +8 -6
data/docker-compose.yml
CHANGED
@@ -7,8 +7,9 @@ services:
|
|
7
7
|
dockerfile: .docker/app/Dockerfile
|
8
8
|
args:
|
9
9
|
- ALPINE_RUBY_VERSION
|
10
|
-
|
11
|
-
|
10
|
+
# mounting . is causing seg-fault on macosx
|
11
|
+
#volumes:
|
12
|
+
#- .:/app
|
12
13
|
depends_on:
|
13
14
|
- solr
|
14
15
|
ports:
|
@@ -16,6 +17,8 @@ services:
|
|
16
17
|
environment:
|
17
18
|
- SOLR_URL # Set via environment variable or use default defined in .env file
|
18
19
|
- RAILS_VERSION # Set via environment variable or use default defined in .env file
|
20
|
+
- SOLR_ENV=docker-compose
|
21
|
+
- ENGINE_CART_RAILS_OPTIONS=--skip-git --skip-listen --skip-spring --skip-keeps --skip-action-cable --skip-coffee --skip-test --skip-solr
|
19
22
|
|
20
23
|
solr:
|
21
24
|
environment:
|
@@ -58,6 +58,8 @@ module Blacklight
|
|
58
58
|
# Rendering:
|
59
59
|
# @!attribute presenter
|
60
60
|
# @return [Blacklight::FacetFieldPresenter]
|
61
|
+
# @!attribute item_presenter
|
62
|
+
# @return [Blacklight::FacetItemPresenter]
|
61
63
|
# @!attribute component
|
62
64
|
# @return [Blacklight::FacetFieldListComponent]
|
63
65
|
# @!attribute item_component
|
@@ -101,6 +101,9 @@ module Blacklight
|
|
101
101
|
show: { top_level_config: :show },
|
102
102
|
citation: { parent_config: :show }
|
103
103
|
),
|
104
|
+
# SMS and Email configurations.
|
105
|
+
sms: ViewConfig.new,
|
106
|
+
email: ViewConfig.new,
|
104
107
|
# Configurations for specific types of index views
|
105
108
|
view: NestedOpenStructWithHashAccess.new(ViewConfig,
|
106
109
|
list: {},
|
@@ -167,6 +170,12 @@ module Blacklight
|
|
167
170
|
# solr fields to use for sorting results
|
168
171
|
define_field_access :sort_field
|
169
172
|
|
173
|
+
# solr fields to use in text message
|
174
|
+
define_field_access :sms_field
|
175
|
+
|
176
|
+
# solr fields to use in email message
|
177
|
+
define_field_access :email_field
|
178
|
+
|
170
179
|
def initialize(hash = {})
|
171
180
|
super(self.class.default_values.deep_dup.merge(hash))
|
172
181
|
yield(self) if block_given?
|
data/lib/blacklight/engine.rb
CHANGED
@@ -4,6 +4,8 @@ module Blacklight
|
|
4
4
|
class SearchState
|
5
5
|
# Modeling access to filter query parameters
|
6
6
|
class FilterField
|
7
|
+
MISSING = { missing: true }.freeze
|
8
|
+
|
7
9
|
# @param [Blacklight::Configuration::FacetField] config
|
8
10
|
attr_reader :config
|
9
11
|
|
@@ -25,7 +27,9 @@ module Blacklight
|
|
25
27
|
def add(item)
|
26
28
|
new_state = search_state.reset_search
|
27
29
|
|
28
|
-
if item.
|
30
|
+
if item.try(:missing)
|
31
|
+
# if this is a 'missing' facet value, the :fq is only for backwards compatibility
|
32
|
+
elsif item.respond_to?(:fq)
|
29
33
|
Array(item.fq).each do |f, v|
|
30
34
|
new_state = new_state.filter(f).add(v)
|
31
35
|
end
|
@@ -35,21 +39,28 @@ module Blacklight
|
|
35
39
|
return new_state.filter(item.field).add(item)
|
36
40
|
end
|
37
41
|
|
42
|
+
url_key = key
|
38
43
|
params = new_state.params
|
39
44
|
param = :f
|
40
45
|
value = as_url_parameter(item)
|
46
|
+
|
47
|
+
if value == Blacklight::SearchState::FilterField::MISSING
|
48
|
+
url_key = "-#{key}"
|
49
|
+
value = Blacklight::Engine.config.facet_missing_param
|
50
|
+
end
|
51
|
+
|
41
52
|
param = :f_inclusive if value.is_a?(Array)
|
42
53
|
|
43
54
|
# value could be a string
|
44
55
|
params[param] = (params[param] || {}).dup
|
45
56
|
|
46
57
|
if value.is_a? Array
|
47
|
-
params[param][
|
58
|
+
params[param][url_key] = value
|
48
59
|
elsif config.single
|
49
|
-
params[param][
|
60
|
+
params[param][url_key] = [value]
|
50
61
|
else
|
51
|
-
params[param][
|
52
|
-
params[param][
|
62
|
+
params[param][url_key] = Array(params[param][url_key] || []).dup
|
63
|
+
params[param][url_key].push(value)
|
53
64
|
end
|
54
65
|
|
55
66
|
new_state.reset(params)
|
@@ -63,19 +74,26 @@ module Blacklight
|
|
63
74
|
return new_state.filter(item.field).remove(item)
|
64
75
|
end
|
65
76
|
|
77
|
+
url_key = config.key
|
66
78
|
params = new_state.params
|
67
79
|
|
68
80
|
param = :f
|
69
81
|
value = as_url_parameter(item)
|
82
|
+
|
83
|
+
if value == Blacklight::SearchState::FilterField::MISSING
|
84
|
+
url_key = "-#{key}"
|
85
|
+
value = Blacklight::Engine.config.facet_missing_param
|
86
|
+
end
|
87
|
+
|
70
88
|
param = :f_inclusive if value.is_a?(Array)
|
71
89
|
|
72
90
|
# need to dup the facet values too,
|
73
91
|
# if the values aren't dup'd, then the values
|
74
92
|
# from the session will get remove in the show view...
|
75
93
|
params[param] = (params[param] || {}).dup
|
76
|
-
params[param][
|
94
|
+
params[param][url_key] = (params[param][url_key] || []).dup
|
77
95
|
|
78
|
-
collection = params[param][
|
96
|
+
collection = params[param][url_key]
|
79
97
|
# collection should be an array, because we link to ?f[key][]=value,
|
80
98
|
# however, Facebook (and maybe some other PHP tools) tranform that parameters
|
81
99
|
# into ?f[key][0]=value, which Rails interprets as a Hash.
|
@@ -84,18 +102,10 @@ module Blacklight
|
|
84
102
|
collection = collection.values
|
85
103
|
end
|
86
104
|
|
87
|
-
params[param][
|
88
|
-
params[param].delete(
|
105
|
+
params[param][url_key] = collection - Array(value)
|
106
|
+
params[param].delete(url_key) if params[param][url_key].empty?
|
89
107
|
params.delete(param) if params[param].empty?
|
90
108
|
|
91
|
-
# Handle missing field queries.
|
92
|
-
missing = I18n.t("blacklight.search.facets.missing")
|
93
|
-
if (item.respond_to?(:fq) && item.fq == "-#{key}:[* TO *]") ||
|
94
|
-
item == missing
|
95
|
-
params[param].delete("-#{key}:")
|
96
|
-
params[param].delete(key) if params[param][key] == [""]
|
97
|
-
end
|
98
|
-
|
99
109
|
new_state.reset(params)
|
100
110
|
end
|
101
111
|
|
@@ -104,8 +114,9 @@ module Blacklight
|
|
104
114
|
params = search_state.params
|
105
115
|
f = Array(params.dig(:f, key))
|
106
116
|
f_inclusive = [params.dig(:f_inclusive, key)] if params.dig(:f_inclusive, key).present?
|
117
|
+
f_missing = [Blacklight::SearchState::FilterField::MISSING] if params.dig(:f, "-#{key}")&.any? { |v| v == Blacklight::Engine.config.facet_missing_param }
|
107
118
|
|
108
|
-
f + (f_inclusive || [])
|
119
|
+
f + (f_inclusive || []) + (f_missing || [])
|
109
120
|
end
|
110
121
|
delegate :any?, to: :values
|
111
122
|
|
@@ -121,6 +132,8 @@ module Blacklight
|
|
121
132
|
|
122
133
|
if value.is_a?(Array)
|
123
134
|
(params.dig(:f_inclusive, key) || []).to_set == value.to_set
|
135
|
+
elsif value == Blacklight::SearchState::FilterField::MISSING
|
136
|
+
(params.dig(:f, "-#{key}") || []).include?(Blacklight::Engine.config.facet_missing_param)
|
124
137
|
else
|
125
138
|
(params.dig(:f, key) || []).include?(value)
|
126
139
|
end
|
@@ -130,7 +143,9 @@ module Blacklight
|
|
130
143
|
|
131
144
|
# TODO: this code is duplicated in Blacklight::FacetsHelperBehavior
|
132
145
|
def as_url_parameter(item)
|
133
|
-
if item.respond_to?
|
146
|
+
if item.respond_to?(:missing) && item.missing
|
147
|
+
Blacklight::SearchState::FilterField::MISSING
|
148
|
+
elsif item.respond_to? :value
|
134
149
|
item.value
|
135
150
|
else
|
136
151
|
item
|
@@ -61,6 +61,10 @@ module Blacklight::Solr::Response::Facets
|
|
61
61
|
@options[:data] || {}
|
62
62
|
end
|
63
63
|
|
64
|
+
def response
|
65
|
+
@options[:response]
|
66
|
+
end
|
67
|
+
|
64
68
|
def index?
|
65
69
|
sort == 'index'
|
66
70
|
end
|
@@ -171,7 +175,8 @@ module Blacklight::Solr::Response::Facets
|
|
171
175
|
# legacy solr facet.missing serialization
|
172
176
|
if value.nil?
|
173
177
|
i.label = I18n.t(:"blacklight.search.fields.facet.missing.#{facet_field_name}", default: [:"blacklight.search.facets.missing"])
|
174
|
-
i.fq = "-#{facet_field_name}:[* TO *]"
|
178
|
+
i.fq = "-#{facet_field_name}:[* TO *]" # this explicit fq is deprecated; the missing attribute below is a better thing to check for this case
|
179
|
+
i.value = Blacklight::SearchState::FilterField::MISSING
|
175
180
|
i.missing = true
|
176
181
|
end
|
177
182
|
|
@@ -179,7 +184,7 @@ module Blacklight::Solr::Response::Facets
|
|
179
184
|
end
|
180
185
|
|
181
186
|
options = facet_field_aggregation_options(facet_field_name)
|
182
|
-
facet_field = FacetField.new(facet_field_name, items, options)
|
187
|
+
facet_field = FacetField.new(facet_field_name, items, options.merge(response: self))
|
183
188
|
|
184
189
|
if values[nil]
|
185
190
|
facet_field.missing = items.find(&:missing)
|
@@ -212,7 +217,9 @@ module Blacklight::Solr::Response::Facets
|
|
212
217
|
|
213
218
|
items = items.sort_by(&:hits).reverse if facet_field.sort && facet_field.sort.to_sym == :count
|
214
219
|
|
215
|
-
|
220
|
+
facet_field = Blacklight::Solr::Response::Facets::FacetField.new field_name, items, response: response
|
221
|
+
|
222
|
+
hash[field_name] = facet_field
|
216
223
|
end
|
217
224
|
end
|
218
225
|
|
@@ -243,7 +250,9 @@ module Blacklight::Solr::Response::Facets
|
|
243
250
|
|
244
251
|
# alias all the possible blacklight config names..
|
245
252
|
blacklight_config.facet_fields.select { |_k, v| v.pivot && v.pivot.join(",") == field_name }.each_key do |key|
|
246
|
-
|
253
|
+
facet_field = Blacklight::Solr::Response::Facets::FacetField.new key, items, response: self
|
254
|
+
|
255
|
+
hash[key] = facet_field
|
247
256
|
end
|
248
257
|
end
|
249
258
|
end
|
@@ -287,7 +296,7 @@ module Blacklight::Solr::Response::Facets
|
|
287
296
|
i
|
288
297
|
end
|
289
298
|
|
290
|
-
options = facet_field_aggregation_options(facet_field_name).merge(data: data)
|
299
|
+
options = facet_field_aggregation_options(facet_field_name).merge(data: data, response: self)
|
291
300
|
facet_field = FacetField.new(facet_field_name, items, options)
|
292
301
|
|
293
302
|
facet_field.missing = Blacklight::Solr::Response::Facets::FacetItem.new(
|
@@ -10,7 +10,6 @@ module Blacklight::Solr
|
|
10
10
|
:add_facetting_to_solr, :add_solr_fields_to_query, :add_paging_to_solr,
|
11
11
|
:add_sorting_to_solr, :add_group_config_to_solr,
|
12
12
|
:add_facet_paging_to_solr, :add_adv_search_clauses,
|
13
|
-
:add_missing_field_query,
|
14
13
|
:add_additional_filters
|
15
14
|
]
|
16
15
|
end
|
@@ -82,19 +81,6 @@ module Blacklight::Solr
|
|
82
81
|
end
|
83
82
|
end
|
84
83
|
|
85
|
-
##
|
86
|
-
# Build and append a missing field query.
|
87
|
-
##
|
88
|
-
def add_missing_field_query(solr_parameters)
|
89
|
-
return unless solr_parameters["facet.missing"]
|
90
|
-
|
91
|
-
solr_parameters[:fq] = [] if solr_parameters[:fq].blank?
|
92
|
-
|
93
|
-
solr_parameters[:fq].append(*(blacklight_params["f"] || [])
|
94
|
-
.select { |f| f.match(/^-/) }
|
95
|
-
.map { |k, _v| "#{k}[* TO *]" })
|
96
|
-
end
|
97
|
-
|
98
84
|
def add_additional_filters(solr_parameters, additional_filters = nil)
|
99
85
|
q = additional_filters || @additional_filters
|
100
86
|
|
@@ -384,6 +370,8 @@ module Blacklight::Solr
|
|
384
370
|
elsif value.is_a?(Range)
|
385
371
|
prefix = "{!#{local_params.join(' ')}}" unless local_params.empty?
|
386
372
|
"#{prefix}#{solr_field}:[#{value.first} TO #{value.last}]"
|
373
|
+
elsif value == Blacklight::SearchState::FilterField::MISSING
|
374
|
+
"-#{solr_field}:[* TO *]"
|
387
375
|
else
|
388
376
|
"{!term f=#{solr_field}#{(' ' + local_params.join(' ')) unless local_params.empty?}}#{convert_to_term_value(value)}"
|
389
377
|
end
|
data/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "blacklight-frontend",
|
3
|
-
"version": "7.
|
4
|
-
"description": "[![Build Status](https://travis-ci.com/projectblacklight/blacklight.png?branch=
|
3
|
+
"version": "7.21.2",
|
4
|
+
"description": "[![Build Status](https://travis-ci.com/projectblacklight/blacklight.png?branch=main)](https://travis-ci.com/projectblacklight/blacklight) [![Gem Version](https://badge.fury.io/rb/blacklight.png)](http://badge.fury.io/rb/blacklight) [![Coverage Status](https://coveralls.io/repos/github/projectblacklight/blacklight/badge.svg?branch=main)](https://coveralls.io/github/projectblacklight/blacklight?branch=main)",
|
5
5
|
"main": "app/assets/javascripts/blacklight",
|
6
6
|
"scripts": {
|
7
7
|
"js-compile-bundle": "shx cat app/javascript/blacklight/core.js app/javascript/blacklight/autocomplete.js app/javascript/blacklight/bookmark_toggle.js app/javascript/blacklight/button_focus.js app/javascript/blacklight/checkbox_submit.js app/javascript/blacklight/facet_load.js app/javascript/blacklight/modal.js app/javascript/blacklight/search_context.js | shx sed \"s/^(import|export).*//\" | babel --filename app/javascript/blacklight/blacklight.js > app/assets/javascripts/blacklight/blacklight.js"
|
@@ -23,8 +23,10 @@
|
|
23
23
|
"devDependencies": {
|
24
24
|
"@babel/cli": "^7.2.3",
|
25
25
|
"@babel/core": "^7.2.3",
|
26
|
+
"@babel/preset-env": "^7.16.0",
|
26
27
|
"shx": "^0.3.2"
|
27
28
|
},
|
29
|
+
"browserslist": "> 0.25%, not dead",
|
28
30
|
"dependencies": {
|
29
31
|
"bloodhound-js": "^1.2.3",
|
30
32
|
"bootstrap": ">=4.3.1 <6.0.0",
|
@@ -501,6 +501,12 @@ RSpec.describe CatalogController, api: true do
|
|
501
501
|
end
|
502
502
|
|
503
503
|
describe "email", api: false do
|
504
|
+
let(:config) { Blacklight::Configuration.new }
|
505
|
+
|
506
|
+
before do
|
507
|
+
allow(controller).to receive(:blacklight_config).and_return(config)
|
508
|
+
end
|
509
|
+
|
504
510
|
it "gives error if no TO parameter" do
|
505
511
|
post :email, params: { id: doc_id }
|
506
512
|
expect(request.flash[:error]).to eq "You must enter a recipient in order to send this message"
|
@@ -518,7 +524,7 @@ RSpec.describe CatalogController, api: true do
|
|
518
524
|
|
519
525
|
it "redirects back to the record upon success" do
|
520
526
|
allow(RecordMailer).to receive(:email_record)
|
521
|
-
.with(anything, { to: 'test_email@projectblacklight.org', message: 'xyz' }, hash_including(host: 'test.host'))
|
527
|
+
.with(anything, { to: 'test_email@projectblacklight.org', message: 'xyz', config: config }, hash_including(host: 'test.host'))
|
522
528
|
.and_return double(deliver: nil)
|
523
529
|
post :email, params: { id: doc_id, to: 'test_email@projectblacklight.org', message: 'xyz' }
|
524
530
|
expect(request.flash[:error]).to be_nil
|
@@ -533,6 +539,12 @@ RSpec.describe CatalogController, api: true do
|
|
533
539
|
end
|
534
540
|
|
535
541
|
describe "sms", api: false do
|
542
|
+
let(:config) { Blacklight::Configuration.new }
|
543
|
+
|
544
|
+
before do
|
545
|
+
allow(controller).to receive(:blacklight_config).and_return(config)
|
546
|
+
end
|
547
|
+
|
536
548
|
it "gives error if no phone number is given" do
|
537
549
|
post :sms, params: { id: doc_id, carrier: 'att' }
|
538
550
|
expect(request.flash[:error]).to eq "You must enter a recipient's phone number in order to send this message"
|
@@ -562,7 +574,7 @@ RSpec.describe CatalogController, api: true do
|
|
562
574
|
it "sends to the appropriate carrier email address" do
|
563
575
|
expect(RecordMailer)
|
564
576
|
.to receive(:sms_record)
|
565
|
-
.with(anything, { to: '5555555555@txt.att.net' }, hash_including(host: 'test.host'))
|
577
|
+
.with(anything, { to: '5555555555@txt.att.net', config: config }, hash_including(host: 'test.host'))
|
566
578
|
.and_return double(deliver: nil)
|
567
579
|
post :sms, params: { id: doc_id, to: '5555555555', carrier: 'txt.att.net' }
|
568
580
|
end
|
data/spec/features/axe_spec.rb
CHANGED
@@ -1,34 +1,33 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.describe 'Accessibility testing', api: false, js: true do
|
4
|
-
|
4
|
+
it 'validates the home page' do
|
5
5
|
visit root_path
|
6
6
|
expect(page).to be_accessible
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
it 'validates the catalog page' do
|
10
10
|
visit root_path
|
11
11
|
fill_in "q", with: 'history'
|
12
12
|
click_button 'search'
|
13
13
|
|
14
|
-
|
15
|
-
expect(page).to be_accessible(skipping: ['aria-allowed-role'])
|
14
|
+
expect(page).to be_accessible
|
16
15
|
|
17
16
|
within '.card.blacklight-language_ssim' do
|
18
17
|
click_button 'Language'
|
19
18
|
click_link "Tibetan"
|
20
19
|
end
|
21
20
|
|
22
|
-
expect(page).to be_accessible
|
21
|
+
expect(page).to be_accessible
|
23
22
|
end
|
24
23
|
|
25
|
-
|
24
|
+
it 'validates the single results page' do
|
26
25
|
visit solr_document_path('2007020969')
|
27
26
|
expect(page).to be_accessible
|
28
27
|
end
|
29
28
|
|
30
29
|
def be_accessible(skipping: [])
|
31
30
|
# typeahead does funny things with the search bar
|
32
|
-
be_axe_clean.excluding('.tt-hint').skipping(skipping + [('color-contrast' if Bootstrap::VERSION < '5')])
|
31
|
+
be_axe_clean.excluding('.tt-hint').skipping(skipping + [('color-contrast' if Bootstrap::VERSION < '5')].compact)
|
33
32
|
end
|
34
33
|
end
|
@@ -32,8 +32,12 @@ RSpec.describe "Facet missing" do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
context "unselecting the facet missing facet" do
|
35
|
-
it "unselects the
|
36
|
-
visit root_path
|
35
|
+
it "unselects the missing field facet" do
|
36
|
+
visit root_path
|
37
|
+
|
38
|
+
within "#facet-subject_geo_ssim" do
|
39
|
+
click_link "[Missing]"
|
40
|
+
end
|
37
41
|
|
38
42
|
within "#facet-subject_geo_ssim" do
|
39
43
|
click_link "remove"
|
@@ -45,8 +49,12 @@ RSpec.describe "Facet missing" do
|
|
45
49
|
end
|
46
50
|
|
47
51
|
context "unselecting the facet missing constraint" do
|
48
|
-
it "unselects the
|
49
|
-
visit root_path
|
52
|
+
it "unselects the missing field facet" do
|
53
|
+
visit root_path
|
54
|
+
|
55
|
+
within "#facet-subject_geo_ssim" do
|
56
|
+
click_link "[Missing]"
|
57
|
+
end
|
50
58
|
|
51
59
|
within ".filter-subject_geo_ssim" do
|
52
60
|
click_link "Remove constraint Region: [Missing]"
|
@@ -305,7 +305,7 @@ RSpec.describe Blacklight::FacetsHelperBehavior do
|
|
305
305
|
let(:search_state) { double(has_facet?: false, add_facet_params_and_redirect: { controller: 'catalog' }) }
|
306
306
|
|
307
307
|
before do
|
308
|
-
allow(helper).to receive(:facet_configuration_for_field).with('simple_field').and_return(Blacklight::Configuration::FacetField.new(key: 'simple_field', query: nil, date: nil, helper_method: nil, single: false, url_method: nil))
|
308
|
+
allow(helper).to receive(:facet_configuration_for_field).with('simple_field').and_return(Blacklight::Configuration::FacetField.new(key: 'simple_field', query: nil, date: nil, helper_method: nil, single: false, url_method: nil, item_presenter: nil))
|
309
309
|
allow(helper).to receive(:facet_display_value).and_return('Z')
|
310
310
|
allow(helper).to receive(:search_state).and_return(search_state)
|
311
311
|
allow(helper).to receive(:search_action_path) do |*args|
|
@@ -326,7 +326,7 @@ RSpec.describe Blacklight::FacetsHelperBehavior do
|
|
326
326
|
let(:expected_html) { '<span class="facet-label"><a class="facet-select" rel="nofollow" href="/blabla">Z</a></span><span class="facet-count">10</span>' }
|
327
327
|
|
328
328
|
it "uses that method" do
|
329
|
-
allow(helper).to receive(:facet_configuration_for_field).with('simple_field').and_return(Blacklight::Configuration::FacetField.new(key: 'simple_field', query: nil, date: nil, helper_method: nil, single: false, url_method: :test_method))
|
329
|
+
allow(helper).to receive(:facet_configuration_for_field).with('simple_field').and_return(Blacklight::Configuration::FacetField.new(key: 'simple_field', query: nil, date: nil, helper_method: nil, single: false, url_method: :test_method, item_presenter: nil))
|
330
330
|
allow(helper).to receive(:test_method).with('simple_field', item).and_return('/blabla')
|
331
331
|
result = helper.render_facet_value('simple_field', item)
|
332
332
|
expect(result).to be_equivalent_to(expected_html).respecting_element_order
|
@@ -345,28 +345,28 @@ RSpec.describe Blacklight::FacetsHelperBehavior do
|
|
345
345
|
|
346
346
|
describe "#facet_display_value" do
|
347
347
|
it "justs be the facet value for an ordinary facet" do
|
348
|
-
allow(helper).to receive(:facet_configuration_for_field).with('simple_field').and_return(double(query: nil, date: nil, helper_method: nil, url_method: nil))
|
348
|
+
allow(helper).to receive(:facet_configuration_for_field).with('simple_field').and_return(double(query: nil, date: nil, helper_method: nil, url_method: nil, item_presenter: nil))
|
349
349
|
expect(helper.facet_display_value('simple_field', 'asdf')).to eq 'asdf'
|
350
350
|
end
|
351
351
|
|
352
352
|
it "allows you to pass in a :helper_method argument to the configuration" do
|
353
|
-
allow(helper).to receive(:facet_configuration_for_field).with('helper_field').and_return(double(query: nil, date: nil, url_method: nil, helper_method: :my_facet_value_renderer))
|
353
|
+
allow(helper).to receive(:facet_configuration_for_field).with('helper_field').and_return(double(query: nil, date: nil, url_method: nil, helper_method: :my_facet_value_renderer, item_presenter: nil))
|
354
354
|
allow(helper).to receive(:my_facet_value_renderer).with('qwerty').and_return('abc')
|
355
355
|
expect(helper.facet_display_value('helper_field', 'qwerty')).to eq 'abc'
|
356
356
|
end
|
357
357
|
|
358
358
|
it "extracts the configuration label for a query facet" do
|
359
|
-
allow(helper).to receive(:facet_configuration_for_field).with('query_facet').and_return(double(query: { 'query_key' => { label: 'XYZ' } }, date: nil, helper_method: nil, url_method: nil))
|
359
|
+
allow(helper).to receive(:facet_configuration_for_field).with('query_facet').and_return(double(query: { 'query_key' => { label: 'XYZ' } }, date: nil, helper_method: nil, url_method: nil, item_presenter: nil))
|
360
360
|
expect(helper.facet_display_value('query_facet', 'query_key')).to eq 'XYZ'
|
361
361
|
end
|
362
362
|
|
363
363
|
it "localizes the label for date-type facets" do
|
364
|
-
allow(helper).to receive(:facet_configuration_for_field).with('date_facet').and_return(double('date' => true, :query => nil, :helper_method => nil, :url_method => nil))
|
364
|
+
allow(helper).to receive(:facet_configuration_for_field).with('date_facet').and_return(double('date' => true, :query => nil, :helper_method => nil, :url_method => nil, :item_presenter => nil))
|
365
365
|
expect(helper.facet_display_value('date_facet', '2012-01-01')).to eq 'Sun, 01 Jan 2012 00:00:00 +0000'
|
366
366
|
end
|
367
367
|
|
368
368
|
it "localizes the label for date-type facets with the supplied localization options" do
|
369
|
-
allow(helper).to receive(:facet_configuration_for_field).with('date_facet').and_return(double('date' => { format: :short }, :query => nil, :helper_method => nil, :url_method => nil))
|
369
|
+
allow(helper).to receive(:facet_configuration_for_field).with('date_facet').and_return(double('date' => { format: :short }, :query => nil, :helper_method => nil, :url_method => nil, :item_presenter => nil))
|
370
370
|
expect(helper.facet_display_value('date_facet', '2012-01-01')).to eq '01 Jan 00:00'
|
371
371
|
end
|
372
372
|
end
|
@@ -162,28 +162,14 @@ RSpec.describe Blacklight::SearchState::FilterField do
|
|
162
162
|
|
163
163
|
context "With facet.missing field" do
|
164
164
|
let(:params) do
|
165
|
-
{ f: {
|
165
|
+
{ f: { "-some_field": ["[* TO *]"] } }
|
166
166
|
end
|
167
167
|
|
168
168
|
it "removes facet.missing facet params" do
|
169
169
|
filter = search_state.filter("some_field")
|
170
|
-
new_state = filter.remove(OpenStruct.new(
|
170
|
+
new_state = filter.remove(OpenStruct.new(key: 'some_field', missing: true))
|
171
171
|
|
172
|
-
expect(new_state.params).to eq(
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
context "With facet.missing field value" do
|
177
|
-
let(:params) do
|
178
|
-
{ f: { some_field: [""], "-some_field:": [""] } }
|
179
|
-
end
|
180
|
-
|
181
|
-
it "removes facet.missing facet params" do
|
182
|
-
missing = I18n.t("blacklight.search.facets.missing")
|
183
|
-
filter = search_state.filter("some_field")
|
184
|
-
new_state = filter.remove(missing)
|
185
|
-
|
186
|
-
expect(new_state.params).to eq("f" => {})
|
172
|
+
expect(new_state.params).to eq({})
|
187
173
|
end
|
188
174
|
end
|
189
175
|
end
|
@@ -543,6 +543,98 @@ RSpec.describe "Blacklight::Configuration", api: true do
|
|
543
543
|
end
|
544
544
|
end
|
545
545
|
|
546
|
+
describe "add_sms_field" do
|
547
|
+
it "takes hash form" do
|
548
|
+
config.add_sms_field("title_tsim", label: "Title")
|
549
|
+
|
550
|
+
expect(config.sms_fields["title_tsim"]).not_to be_nil
|
551
|
+
expect(config.sms_fields["title_tsim"].label).to eq "Title"
|
552
|
+
end
|
553
|
+
|
554
|
+
it "takes ShowField argument" do
|
555
|
+
config.add_sms_field("title_tsim", Blacklight::Configuration::SmsField.new(field: "title_display", label: "Title"))
|
556
|
+
|
557
|
+
expect(config.sms_fields["title_tsim"]).not_to be_nil
|
558
|
+
expect(config.sms_fields["title_tsim"].label).to eq "Title"
|
559
|
+
end
|
560
|
+
|
561
|
+
it "takes block form" do
|
562
|
+
config.add_sms_field("title_tsim") do |f|
|
563
|
+
f.label = "Title"
|
564
|
+
end
|
565
|
+
|
566
|
+
expect(config.sms_fields["title_tsim"]).not_to be_nil
|
567
|
+
expect(config.sms_fields["title_tsim"].label).to eq "Title"
|
568
|
+
end
|
569
|
+
|
570
|
+
it "creates default label humanized from field" do
|
571
|
+
config.add_sms_field("my_custom_field")
|
572
|
+
|
573
|
+
expect(config.sms_fields["my_custom_field"].label).to eq "My Custom Field"
|
574
|
+
end
|
575
|
+
|
576
|
+
it "raises on nil solr field name" do
|
577
|
+
expect { config.add_sms_field(nil) }.to raise_error ArgumentError
|
578
|
+
end
|
579
|
+
|
580
|
+
it "takes wild-carded field names and dereference them to solr fields" do
|
581
|
+
allow(config).to receive(:reflected_fields).and_return(
|
582
|
+
"some_field_display" => {},
|
583
|
+
"another_field_display" => {},
|
584
|
+
"a_facet_field" => {}
|
585
|
+
)
|
586
|
+
config.add_sms_field "*_display"
|
587
|
+
|
588
|
+
expect(config.sms_fields.keys).to eq %w[some_field_display another_field_display]
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
592
|
+
describe "add_email_field" do
|
593
|
+
it "takes hash form" do
|
594
|
+
config.add_email_field("title_tsim", label: "Title")
|
595
|
+
|
596
|
+
expect(config.email_fields["title_tsim"]).not_to be_nil
|
597
|
+
expect(config.email_fields["title_tsim"].label).to eq "Title"
|
598
|
+
end
|
599
|
+
|
600
|
+
it "takes ShowField argument" do
|
601
|
+
config.add_email_field("title_tsim", Blacklight::Configuration::EmailField.new(field: "title_display", label: "Title"))
|
602
|
+
|
603
|
+
expect(config.email_fields["title_tsim"]).not_to be_nil
|
604
|
+
expect(config.email_fields["title_tsim"].label).to eq "Title"
|
605
|
+
end
|
606
|
+
|
607
|
+
it "takes block form" do
|
608
|
+
config.add_email_field("title_tsim") do |f|
|
609
|
+
f.label = "Title"
|
610
|
+
end
|
611
|
+
|
612
|
+
expect(config.email_fields["title_tsim"]).not_to be_nil
|
613
|
+
expect(config.email_fields["title_tsim"].label).to eq "Title"
|
614
|
+
end
|
615
|
+
|
616
|
+
it "creates default label humanized from field" do
|
617
|
+
config.add_email_field("my_custom_field")
|
618
|
+
|
619
|
+
expect(config.email_fields["my_custom_field"].label).to eq "My Custom Field"
|
620
|
+
end
|
621
|
+
|
622
|
+
it "raises on nil solr field name" do
|
623
|
+
expect { config.add_email_field(nil) }.to raise_error ArgumentError
|
624
|
+
end
|
625
|
+
|
626
|
+
it "takes wild-carded field names and dereference them to solr fields" do
|
627
|
+
allow(config).to receive(:reflected_fields).and_return(
|
628
|
+
"some_field_display" => {},
|
629
|
+
"another_field_display" => {},
|
630
|
+
"a_facet_field" => {}
|
631
|
+
)
|
632
|
+
config.add_email_field "*_display"
|
633
|
+
|
634
|
+
expect(config.email_fields.keys).to eq %w[some_field_display another_field_display]
|
635
|
+
end
|
636
|
+
end
|
637
|
+
|
546
638
|
describe "#default_search_field" do
|
547
639
|
it "uses the field with a :default key" do
|
548
640
|
config.add_search_field('search_field_1')
|