blacklight 7.17.0 → 7.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/app/components/blacklight/content_areas_shim.rb +2 -1
- data/app/components/blacklight/document/thumbnail_component.html.erb +3 -3
- data/app/components/blacklight/document/thumbnail_component.rb +11 -3
- data/app/components/blacklight/document_component.rb +7 -7
- data/app/components/blacklight/metadata_field_layout_component.rb +1 -1
- data/app/components/blacklight/response/view_type_button_component.rb +4 -2
- data/app/helpers/blacklight/catalog_helper_behavior.rb +2 -0
- data/app/helpers/blacklight/render_partials_helper_behavior.rb +5 -1
- data/app/views/catalog/_document.html.erb +4 -3
- data/app/views/catalog/_document_list.html.erb +3 -2
- data/lib/blacklight/configuration.rb +7 -1
- data/lib/blacklight/configuration/view_config.rb +5 -1
- data/lib/blacklight/nested_open_struct_with_hash_access.rb +33 -14
- data/lib/blacklight/open_struct_with_hash_access.rb +1 -1
- data/lib/blacklight/search_builder.rb +1 -0
- data/lib/blacklight/solr/search_builder_behavior.rb +7 -1
- data/lib/generators/blacklight/install_generator.rb +5 -5
- data/lib/generators/blacklight/solr_generator.rb +4 -2
- data/lib/generators/blacklight/user_generator.rb +4 -2
- data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +6 -7
- data/spec/helpers/blacklight_helper_spec.rb +20 -2
- data/spec/helpers/catalog_helper_spec.rb +1 -1
- data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +36 -0
- data/spec/models/blacklight/configuration_spec.rb +10 -0
- data/spec/models/blacklight/solr/search_builder_spec.rb +9 -0
- data/spec/services/blacklight/search_service_spec.rb +1 -1
- data/spec/views/catalog/_constraints.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_document.html.erb_spec.rb +9 -0
- data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
- data/spec/views/catalog/_view_type_group.html.erb_spec.rb +8 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b17640ea1dd81a41048bfbb2362bf692300e228045fac8f0d42aa0fbd281a63
|
4
|
+
data.tar.gz: 6956aa4b0fd67802b24d04b0f27677ca9f84d5692bdf8a34cd21b043d3fe8df9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc71e8e6c0ee060b4303052caf0b9341c58a42c71e5f9badfe03f8013c6e3b96ba43f66d0d477c525edb58263a1993b9d9da143cf3f5f1c7fdb032568df5db87
|
7
|
+
data.tar.gz: e31975c219b1b709bdc6b765f123ffbf13978f56a26936f75d08cc7796e38703f163dc459e735f37bc36da3338e43f481d24b57d8308052509f6d19c0864bb7c
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
7.
|
1
|
+
7.19.0
|
@@ -5,7 +5,8 @@ module Blacklight
|
|
5
5
|
module ContentAreasShim
|
6
6
|
# Shim the `with` helper to write content into slots instead
|
7
7
|
def with(slot_name, *args, **kwargs, &block)
|
8
|
-
Deprecation.warn(
|
8
|
+
Deprecation.warn(Blacklight::ContentAreasShim,
|
9
|
+
'ViewComponents deprecated `with` and it will be removed in ViewComponents 3.0. content_areas. Use slots (https://viewcomponent.org/guide/slots.html) instead.')
|
9
10
|
public_send(slot_name, *args, **kwargs, &block)
|
10
11
|
end
|
11
12
|
end
|
@@ -1,12 +1,12 @@
|
|
1
|
-
<% value =
|
1
|
+
<% value = use_thumbnail_tag_behavior? ? presenter.thumbnail.thumbnail_tag(@image_options, 'aria-hidden': true, tabindex: -1, counter: @counter) : presenter.thumbnail.render(@image_options) %>
|
2
2
|
|
3
3
|
<% if value %>
|
4
4
|
<div class="document-thumbnail">
|
5
|
-
<% if
|
5
|
+
<% if use_thumbnail_tag_behavior? %>
|
6
6
|
<% warn_about_deprecated_behavior %>
|
7
7
|
<%= value %>
|
8
8
|
<% else %>
|
9
|
-
<%= helpers.link_to_document(
|
9
|
+
<%= helpers.link_to_document(presenter.document, value, 'aria-hidden': true, tabindex: -1, counter: @counter) %>
|
10
10
|
<% end %>
|
11
11
|
</div>
|
12
12
|
<% end %>
|
@@ -9,20 +9,28 @@ module Blacklight
|
|
9
9
|
# @param [Blacklight::DocumentPresenter] presenter
|
10
10
|
# @param [Integer] counter
|
11
11
|
# @param [Hash] image_options options for the thumbnail presenter's image tag
|
12
|
-
def initialize(presenter
|
12
|
+
def initialize(presenter: nil, document: nil, counter:, image_options: {})
|
13
13
|
@presenter = presenter
|
14
|
+
@document = presenter&.document || document
|
14
15
|
@counter = counter
|
15
16
|
@image_options = { alt: '' }.merge(image_options)
|
16
|
-
@use_thumbnail_tag = !@presenter.thumbnail.instance_of?(Blacklight::ThumbnailPresenter)
|
17
17
|
end
|
18
18
|
|
19
19
|
def render?
|
20
|
-
|
20
|
+
presenter.thumbnail.exists?
|
21
|
+
end
|
22
|
+
|
23
|
+
def use_thumbnail_tag_behavior?
|
24
|
+
!presenter.thumbnail.instance_of?(Blacklight::ThumbnailPresenter)
|
21
25
|
end
|
22
26
|
|
23
27
|
def warn_about_deprecated_behavior
|
24
28
|
Deprecation.warn(Blacklight::Document::ThumbnailComponent, 'Detected as custom thumbnail presenter; make sure it has a #render method that returns just the thumbnail image tag')
|
25
29
|
end
|
30
|
+
|
31
|
+
def presenter
|
32
|
+
@presenter ||= @view_context.document_presenter(@document)
|
33
|
+
end
|
26
34
|
end
|
27
35
|
end
|
28
36
|
end
|
@@ -25,7 +25,7 @@ module Blacklight
|
|
25
25
|
next static_content if static_content.present?
|
26
26
|
next unless component
|
27
27
|
|
28
|
-
Deprecation.warn('Pass the presenter to the DocumentComponent') if @presenter.nil?
|
28
|
+
Deprecation.warn(Blacklight::DocumentComponent, 'Pass the presenter to the DocumentComponent') if @presenter.nil?
|
29
29
|
|
30
30
|
component.new(*args, document: @document, presenter: @presenter, document_counter: @document_counter, **kwargs)
|
31
31
|
end)
|
@@ -34,7 +34,7 @@ module Blacklight
|
|
34
34
|
renders_one :metadata, (lambda do |static_content = nil, *args, component: nil, fields: nil, **kwargs|
|
35
35
|
next static_content if static_content.present?
|
36
36
|
|
37
|
-
Deprecation.warn('Pass the presenter to the DocumentComponent') if !fields && @presenter.nil?
|
37
|
+
Deprecation.warn(Blacklight::DocumentComponent, 'Pass the presenter to the DocumentComponent') if !fields && @presenter.nil?
|
38
38
|
|
39
39
|
component ||= Blacklight::DocumentMetadataComponent
|
40
40
|
|
@@ -48,9 +48,9 @@ module Blacklight
|
|
48
48
|
next image_options_or_static_content if image_options_or_static_content.is_a? String
|
49
49
|
|
50
50
|
component ||= @presenter&.view_config&.thumbnail_component || Blacklight::Document::ThumbnailComponent
|
51
|
-
Deprecation.warn('Pass the presenter to the DocumentComponent') if !component && @presenter.nil?
|
51
|
+
Deprecation.warn(Blacklight::DocumentComponent, 'Pass the presenter to the DocumentComponent') if !component && @presenter.nil?
|
52
52
|
|
53
|
-
component.new(*args, presenter: @presenter, counter: @counter, image_options: image_options_or_static_content, **kwargs)
|
53
|
+
component.new(*args, document: @document, presenter: @presenter, counter: @counter, image_options: image_options_or_static_content, **kwargs)
|
54
54
|
end)
|
55
55
|
|
56
56
|
# A container for partials rendered using the view config partials configuration. Its use is discouraged, but necessary until
|
@@ -93,13 +93,13 @@ module Blacklight
|
|
93
93
|
@id = id || ('document' if show)
|
94
94
|
@classes = classes
|
95
95
|
|
96
|
-
Deprecation.warn('Passing embed_component is deprecated') if @embed_component.present?
|
96
|
+
Deprecation.warn(Blacklight::DocumentComponent, 'Passing embed_component is deprecated') if @embed_component.present?
|
97
97
|
@embed_component = embed_component
|
98
98
|
|
99
|
-
Deprecation.warn('Passing metadata_component is deprecated') if @metadata_component.present?
|
99
|
+
Deprecation.warn(Blacklight::DocumentComponent, 'Passing metadata_component is deprecated') if @metadata_component.present?
|
100
100
|
@metadata_component = metadata_component || Blacklight::DocumentMetadataComponent
|
101
101
|
|
102
|
-
Deprecation.warn('Passing thumbnail_component is deprecated') if @thumbnail_component.present?
|
102
|
+
Deprecation.warn(Blacklight::DocumentComponent, 'Passing thumbnail_component is deprecated') if @thumbnail_component.present?
|
103
103
|
@thumbnail_component = thumbnail_component || Blacklight::Document::ThumbnailComponent
|
104
104
|
|
105
105
|
@document_counter = document_counter
|
@@ -25,7 +25,7 @@ module Blacklight
|
|
25
25
|
def value(*args, **kwargs, &block)
|
26
26
|
return set_slot(:values, *args, **kwargs, &block) if block_given?
|
27
27
|
|
28
|
-
Deprecation.warn('The `value` content area is deprecated; render from the values slot instead')
|
28
|
+
Deprecation.warn(Blacklight::MetadataFieldLayoutComponent, 'The `value` content area is deprecated; render from the values slot instead')
|
29
29
|
|
30
30
|
values.first
|
31
31
|
end
|
@@ -15,12 +15,14 @@ module Blacklight
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def icon
|
18
|
-
|
18
|
+
Deprecation.silence(Blacklight::CatalogHelperBehavior) do
|
19
|
+
@view_context.render_view_type_group_icon(@view.icon || @key)
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
def label
|
22
24
|
Deprecation.silence(Blacklight::ConfigurationHelperBehavior) do
|
23
|
-
@view_context.view_label(@
|
25
|
+
@view_context.view_label(@key)
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
@@ -253,11 +253,13 @@ module Blacklight::CatalogHelperBehavior
|
|
253
253
|
##
|
254
254
|
# Render the view type icon for the results view picker
|
255
255
|
#
|
256
|
+
# @deprecated
|
256
257
|
# @param [String] view
|
257
258
|
# @return [String]
|
258
259
|
def render_view_type_group_icon view
|
259
260
|
blacklight_icon(view)
|
260
261
|
end
|
262
|
+
deprecation_deprecate render_view_type_group_icon: 'call blacklight_icon instead'
|
261
263
|
|
262
264
|
##
|
263
265
|
# Get the default view type classes for a view in the results view picker
|
@@ -84,12 +84,16 @@ module Blacklight::RenderPartialsHelperBehavior
|
|
84
84
|
# @param [Hash] locals to pass to the render call
|
85
85
|
# @return [String]
|
86
86
|
def render_document_index_with_view view, documents, locals = {}
|
87
|
+
view_config = blacklight_config&.view_config(view)
|
88
|
+
|
89
|
+
return render partial: view_config.template, locals: locals.merge(documents: documents, view_config: view_config) if view_config&.template
|
90
|
+
|
87
91
|
template = cached_view ['index', view].join('_') do
|
88
92
|
find_document_index_template_with_view(view, locals)
|
89
93
|
end
|
90
94
|
|
91
95
|
if template
|
92
|
-
template.render(self, locals.merge(documents: documents))
|
96
|
+
template.render(self, locals.merge(documents: documents, view_config: view_config))
|
93
97
|
else
|
94
98
|
''
|
95
99
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
<% # container for a single doc -%>
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
<% view_config = local_assigns[:view_config] || blacklight_config.view_config(document_index_view_type) %>
|
3
|
+
<%= render (view_config.document_component || Blacklight::DocumentComponent).new(presenter: document_presenter(document), counter: document_counter_with_offset(document_counter)) do |component| %>
|
4
|
+
<% component.public_send(view_config.document_component.blank? && view_config.partials.any? ? :body : :partial) do %>
|
5
|
+
<%= render_document_partials document, view_config.partials, component: component, document_counter: document_counter %>
|
5
6
|
<% end %>
|
6
7
|
<% end %>
|
@@ -1,4 +1,5 @@
|
|
1
1
|
<% # container for all documents in index list view -%>
|
2
|
-
|
3
|
-
|
2
|
+
<% view_config = local_assigns[:view_config] || blacklight_config&.view_config(document_index_view_type) %>
|
3
|
+
<div id="documents" class="documents-<%= view_config&.key || document_index_view_type %>">
|
4
|
+
<%= render documents, as: :document, view_config: view_config %>
|
4
5
|
</div>
|
@@ -170,6 +170,8 @@ module Blacklight
|
|
170
170
|
def initialize(hash = {})
|
171
171
|
super(self.class.default_values.deep_dup.merge(hash))
|
172
172
|
yield(self) if block_given?
|
173
|
+
|
174
|
+
@view_config ||= {}
|
173
175
|
end
|
174
176
|
|
175
177
|
def document_model
|
@@ -333,7 +335,6 @@ module Blacklight
|
|
333
335
|
view_type = nil
|
334
336
|
end
|
335
337
|
|
336
|
-
@view_config ||= {}
|
337
338
|
@view_config[[view_type, action_name]] ||= begin
|
338
339
|
if view_type.nil?
|
339
340
|
action_config(action_name)
|
@@ -428,6 +429,11 @@ module Blacklight
|
|
428
429
|
fields.merge(show_fields)
|
429
430
|
end
|
430
431
|
|
432
|
+
def freeze
|
433
|
+
each { |_k, v| v.is_a?(OpenStruct) && v.freeze }
|
434
|
+
super
|
435
|
+
end
|
436
|
+
|
431
437
|
private
|
432
438
|
|
433
439
|
def add_action(config_hash, name, opts)
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
class Blacklight::Configuration
|
3
3
|
class ViewConfig < Blacklight::OpenStructWithHashAccess
|
4
|
+
# @!attribute template
|
5
|
+
# @return [String] partial to render around the documents
|
4
6
|
# @!attribute partials
|
5
7
|
# @return [Array<String>] partials to render for each document(see #render_document_partials)
|
6
8
|
# @!attribute document_presenter_class
|
@@ -11,6 +13,8 @@ class Blacklight::Configuration
|
|
11
13
|
# @return [String, Symbol] solr field to use to render a document title
|
12
14
|
# @!attribute display_type_field
|
13
15
|
# @return [String, Symbol] solr field to use to render format-specific partials
|
16
|
+
# @!attribute icon
|
17
|
+
# @return [String, Symbol] icon file to use in the view picker
|
14
18
|
# @!attribute document_actions
|
15
19
|
# @return [NestedOpenStructWithHashAccess{Symbol => Blacklight::Configuration::ToolConfig}] 'tools' to render for each document
|
16
20
|
def search_bar_presenter_class
|
@@ -18,7 +22,7 @@ class Blacklight::Configuration
|
|
18
22
|
end
|
19
23
|
|
20
24
|
def display_label(deprecated_key = nil, **options)
|
21
|
-
Deprecation.warn('Passing the key argument to ViewConfig#display_label is deprecated') if deprecated_key.present?
|
25
|
+
Deprecation.warn(Blacklight::Configuration::ViewConfig, 'Passing the key argument to ViewConfig#display_label is deprecated') if deprecated_key.present?
|
22
26
|
|
23
27
|
I18n.t(
|
24
28
|
:"blacklight.search.view_title.#{deprecated_key || key}",
|
@@ -5,18 +5,21 @@ module Blacklight
|
|
5
5
|
# An OpenStruct refinement that converts any hash-keys into
|
6
6
|
# additional instances of NestedOpenStructWithHashAccess
|
7
7
|
class NestedOpenStructWithHashAccess < OpenStructWithHashAccess
|
8
|
+
extend Deprecation
|
9
|
+
self.deprecation_horizon = 'blacklight 8.0'
|
10
|
+
|
8
11
|
attr_reader :nested_class
|
9
12
|
|
10
13
|
delegate :default_proc=, to: :to_h
|
11
14
|
|
12
15
|
def initialize(klass, hash = {})
|
13
16
|
@nested_class = klass
|
14
|
-
value = hash.
|
15
|
-
if v.is_a? Hash
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
value = hash.each_with_object({}) do |(k, v), h|
|
18
|
+
h[k] = if v.is_a? Hash
|
19
|
+
nested_class.new({ key: k.to_sym }.merge(v))
|
20
|
+
else
|
21
|
+
v
|
22
|
+
end
|
20
23
|
end
|
21
24
|
|
22
25
|
super value
|
@@ -34,7 +37,7 @@ module Blacklight
|
|
34
37
|
# into another NestedOpenStructWithHashAccess
|
35
38
|
def []=(key, value)
|
36
39
|
if value.is_a? Hash
|
37
|
-
send "#{key}=", nested_class.new(value)
|
40
|
+
send "#{key}=", nested_class.new({ key: key.to_sym }.merge(value))
|
38
41
|
else
|
39
42
|
super
|
40
43
|
end
|
@@ -86,15 +89,31 @@ module Blacklight
|
|
86
89
|
##
|
87
90
|
# Override #method_missing from OpenStruct to ensure the default_proc logic
|
88
91
|
# gets triggered.
|
89
|
-
def method_missing(mid, *args)
|
92
|
+
def method_missing(mid, *args, **kwargs, &block)
|
90
93
|
len = args.length
|
91
94
|
|
92
|
-
if
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
res = if mid.to_s.end_with?('!')
|
96
|
+
m = mid[0...-1].to_sym
|
97
|
+
new_ostruct_member!(m)
|
98
|
+
@table[m]
|
99
|
+
elsif mid.to_s.end_with?('=')
|
100
|
+
m = mid[0...-1].to_sym
|
101
|
+
new_ostruct_member!(m)
|
102
|
+
@table[m] = args.first
|
103
|
+
elsif len.zero? && kwargs.blank? && !block
|
104
|
+
Deprecation.warn(Blacklight::NestedOpenStructWithHashAccess,
|
105
|
+
"Initializing a #{nested_class} implicitly (by calling #{mid}) is deprecated. Call it as #{mid}! or pass initialize arguments")
|
106
|
+
|
107
|
+
new_ostruct_member!(mid)
|
108
|
+
@table[mid]
|
109
|
+
else
|
110
|
+
new_ostruct_member!(mid)
|
111
|
+
@table[mid] = nested_class.new(key: mid, **(args.first || {}), **kwargs)
|
112
|
+
end
|
113
|
+
|
114
|
+
block&.call(res)
|
115
|
+
|
116
|
+
res
|
98
117
|
end
|
99
118
|
|
100
119
|
private
|
@@ -6,7 +6,7 @@ module Blacklight
|
|
6
6
|
class OpenStructWithHashAccess < OpenStruct
|
7
7
|
delegate :keys, :each, :map, :has_key?, :key?, :include?, :empty?,
|
8
8
|
:length, :delete, :delete_if, :keep_if, :clear, :reject!, :select!,
|
9
|
-
:replace, :fetch, :to_json, :as_json, :any?, to: :to_h
|
9
|
+
:replace, :fetch, :to_json, :as_json, :any?, :freeze, :unfreeze, :frozen?, to: :to_h
|
10
10
|
|
11
11
|
##
|
12
12
|
# Expose the internal hash
|
@@ -45,6 +45,7 @@ module Blacklight
|
|
45
45
|
##
|
46
46
|
# Update the :q (query) parameter
|
47
47
|
def where(conditions)
|
48
|
+
Deprecation.warn(Blacklight::SearchBuilder, "SearchBuilder#where must be called with a hash, received #{conditions.inspect}.") unless conditions.is_a? Hash
|
48
49
|
params_will_change!
|
49
50
|
@search_state = @search_state.reset(@search_state.params.merge(q: conditions))
|
50
51
|
@blacklight_params = @search_state.params.dup
|
@@ -32,6 +32,7 @@ module Blacklight::Solr
|
|
32
32
|
# Take the user-entered query, and put it in the solr params,
|
33
33
|
# including config's "search field" params for current search field.
|
34
34
|
# also include setting spellcheck.q.
|
35
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
35
36
|
def add_query_to_solr(solr_parameters)
|
36
37
|
###
|
37
38
|
# legacy behavior of user param :qt is passed through, but over-ridden
|
@@ -64,11 +65,15 @@ module Blacklight::Solr
|
|
64
65
|
elsif search_field&.solr_local_parameters.present?
|
65
66
|
add_search_field_with_local_parameters(solr_parameters)
|
66
67
|
elsif search_state.query_param.is_a? Hash
|
67
|
-
|
68
|
+
if search_state.query_param == @additional_filters && !processor_chain.include?(:add_additional_filters)
|
69
|
+
Deprecation.warn(Blacklight::Solr::SearchBuilderBehavior, 'Expecting to see the processor step add_additional_filters; falling back to legacy query handling')
|
70
|
+
add_additional_filters(solr_parameters, search_state.query_param)
|
71
|
+
end
|
68
72
|
elsif search_state.query_param
|
69
73
|
solr_parameters.append_query search_state.query_param
|
70
74
|
end
|
71
75
|
end
|
76
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
72
77
|
|
73
78
|
def add_additional_filters(solr_parameters, additional_filters = nil)
|
74
79
|
q = additional_filters || @additional_filters
|
@@ -322,6 +327,7 @@ module Blacklight::Solr
|
|
322
327
|
# around the term unless it's a bare-word. Escape internal quotes
|
323
328
|
# if needed.
|
324
329
|
def solr_param_quote(val, options = {})
|
330
|
+
val = val.to_s
|
325
331
|
options[:quote] ||= '"'
|
326
332
|
unless val =~ /^[a-zA-Z0-9$_\-\^]+$/
|
327
333
|
val = options[:quote] +
|
@@ -37,8 +37,10 @@ module Blacklight
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def bundle_install
|
40
|
-
|
41
|
-
|
40
|
+
inside destination_root do
|
41
|
+
Bundler.with_clean_env do
|
42
|
+
run "bundle install"
|
43
|
+
end
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
@@ -81,9 +83,7 @@ module Blacklight
|
|
81
83
|
blacklight_marc = String.new('blacklight-marc')
|
82
84
|
gem blacklight_marc, '>= 7.0.0.rc1', '< 8'
|
83
85
|
|
84
|
-
|
85
|
-
run "bundle install"
|
86
|
-
end
|
86
|
+
bundle_install
|
87
87
|
|
88
88
|
generate 'blacklight:marc:install'
|
89
89
|
end
|
@@ -24,8 +24,10 @@ module Blacklight
|
|
24
24
|
gem "devise"
|
25
25
|
gem "devise-guests", "~> 0.6"
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
inside destination_root do
|
28
|
+
Bundler.with_clean_env do
|
29
|
+
run "bundle install"
|
30
|
+
end
|
29
31
|
end
|
30
32
|
|
31
33
|
generate "devise:install"
|
@@ -33,9 +33,8 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
|
|
33
33
|
|
34
34
|
describe "#default_document_index_view_type" do
|
35
35
|
it "uses the first view with default set to true" do
|
36
|
-
blacklight_config.view.a
|
37
|
-
blacklight_config.view.b
|
38
|
-
blacklight_config.view.b.default = true
|
36
|
+
blacklight_config.view.a({})
|
37
|
+
blacklight_config.view.b(default: true)
|
39
38
|
expect(helper.default_document_index_view_type).to eq :b
|
40
39
|
end
|
41
40
|
|
@@ -48,8 +47,8 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
|
|
48
47
|
describe "#document_index_views" do
|
49
48
|
before do
|
50
49
|
blacklight_config.view.abc = false
|
51
|
-
blacklight_config.view.def
|
52
|
-
blacklight_config.view.xyz
|
50
|
+
blacklight_config.view.def(if: false)
|
51
|
+
blacklight_config.view.xyz(unless: true)
|
53
52
|
end
|
54
53
|
|
55
54
|
it "filters views using :if/:unless configuration" do
|
@@ -62,8 +61,8 @@ RSpec.describe Blacklight::ConfigurationHelperBehavior do
|
|
62
61
|
|
63
62
|
describe '#document_index_view_controls' do
|
64
63
|
before do
|
65
|
-
blacklight_config.view.a
|
66
|
-
blacklight_config.view.b
|
64
|
+
blacklight_config.view.a({})
|
65
|
+
blacklight_config.view.b(display_control: false)
|
67
66
|
end
|
68
67
|
|
69
68
|
it "filters index views to those set to display controls" do
|
@@ -127,7 +127,7 @@ RSpec.describe BlacklightHelper do
|
|
127
127
|
|
128
128
|
it "renders view type specific actions" do
|
129
129
|
allow(helper).to receive(:document_index_view_type).and_return(:custom)
|
130
|
-
config.view.custom
|
130
|
+
config.view.custom(document_actions: [])
|
131
131
|
expect(helper.render_index_doc_actions(document)).to be_blank
|
132
132
|
end
|
133
133
|
end
|
@@ -315,11 +315,29 @@ RSpec.describe BlacklightHelper do
|
|
315
315
|
end
|
316
316
|
|
317
317
|
it "ignores missing templates" do
|
318
|
-
blacklight_config.view.view_type
|
318
|
+
blacklight_config.view.view_type(partials: %w[index_header a b])
|
319
319
|
|
320
320
|
response = helper.render_document_index_with_view :view_type, [obj1, obj1]
|
321
321
|
expect(response).to have_selector "div#documents"
|
322
322
|
end
|
323
|
+
|
324
|
+
context 'with a template partial provided by the view config' do
|
325
|
+
before do
|
326
|
+
blacklight_config.view.gallery(template: '/my/partial')
|
327
|
+
end
|
328
|
+
|
329
|
+
def stub_template(hash)
|
330
|
+
view.view_paths.unshift(ActionView::FixtureResolver.new(hash))
|
331
|
+
end
|
332
|
+
|
333
|
+
it 'renders that template' do
|
334
|
+
stub_template 'my/_partial.html.erb' => 'some content'
|
335
|
+
|
336
|
+
response = helper.render_document_index_with_view :gallery, [obj1, obj1]
|
337
|
+
|
338
|
+
expect(response).to eq 'some content'
|
339
|
+
end
|
340
|
+
end
|
323
341
|
end
|
324
342
|
|
325
343
|
describe "#document_index_view_type" do
|
@@ -323,7 +323,7 @@ RSpec.describe CatalogHelper do
|
|
323
323
|
|
324
324
|
it "supports view-specific field configuration" do
|
325
325
|
allow(helper).to receive(:document_index_view_type).and_return(:some_view_type)
|
326
|
-
blacklight_config.view.some_view_type
|
326
|
+
blacklight_config.view.some_view_type(display_type_field: :other_type)
|
327
327
|
doc = { other_type: "document" }
|
328
328
|
expect(helper.render_document_class(doc)).to eq "blacklight-document"
|
329
329
|
end
|
@@ -1,6 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.describe Blacklight::NestedOpenStructWithHashAccess do
|
4
|
+
subject { described_class.new(Blacklight::OpenStructWithHashAccess) }
|
5
|
+
|
6
|
+
describe '#key' do
|
7
|
+
context 'for an object provided by the initializer' do
|
8
|
+
subject { described_class.new(Blacklight::OpenStructWithHashAccess, a: { b: 1 }) }
|
9
|
+
|
10
|
+
it 'copies the key to the initialized value' do
|
11
|
+
expect(subject.a).to have_attributes key: :a, b: 1
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'for an object provided through assignment' do
|
16
|
+
it 'copies the key to the initialized value' do
|
17
|
+
subject.a!
|
18
|
+
|
19
|
+
expect(subject.a).to have_attributes key: :a
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
4
24
|
describe "#deep_dup" do
|
5
25
|
it "preserves the current class" do
|
6
26
|
expect(described_class.new(described_class).deep_dup).to be_a_kind_of described_class
|
@@ -23,4 +43,20 @@ RSpec.describe Blacklight::NestedOpenStructWithHashAccess do
|
|
23
43
|
expect(subject.blah).to have_attributes(key: :blah)
|
24
44
|
end
|
25
45
|
end
|
46
|
+
|
47
|
+
describe 'adding new parameters' do
|
48
|
+
subject { described_class.new(Blacklight::Configuration::Field) }
|
49
|
+
|
50
|
+
it 'strips the trailing !' do
|
51
|
+
subject.blah!
|
52
|
+
expect(subject.blah).to have_attributes(key: :blah)
|
53
|
+
expect(subject.keys).to eq [:blah]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'supports direct assignment' do
|
57
|
+
subject.blah = '123'
|
58
|
+
expect(subject.blah).to eq '123'
|
59
|
+
expect(subject.keys).to eq [:blah]
|
60
|
+
end
|
61
|
+
end
|
26
62
|
end
|
@@ -621,4 +621,14 @@ RSpec.describe "Blacklight::Configuration", api: true do
|
|
621
621
|
end
|
622
622
|
end
|
623
623
|
end
|
624
|
+
|
625
|
+
describe '#freeze' do
|
626
|
+
it 'freezes the configuration' do
|
627
|
+
config.freeze
|
628
|
+
|
629
|
+
expect(config.a).to be_nil
|
630
|
+
expect { config.a = '123' }.to raise_error(FrozenError)
|
631
|
+
expect { config.view.a = '123' }.to raise_error(FrozenError)
|
632
|
+
end
|
633
|
+
end
|
624
634
|
end
|
@@ -800,4 +800,13 @@ RSpec.describe Blacklight::Solr::SearchBuilderBehavior, api: true do
|
|
800
800
|
expect(subject.to_hash.with_indifferent_access.dig(:json, :query, :bool, :must, 1, :edismax, :qf)).to eq '${author_qf}'
|
801
801
|
end
|
802
802
|
end
|
803
|
+
|
804
|
+
describe '#where' do
|
805
|
+
let(:user_params) { {} }
|
806
|
+
|
807
|
+
it 'adds additional query filters on the search' do
|
808
|
+
subject.where(id: [1, 2, 3])
|
809
|
+
expect(subject.to_hash).to include q: '{!lucene}id:(1 OR 2 OR 3)'
|
810
|
+
end
|
811
|
+
end
|
803
812
|
end
|
@@ -477,7 +477,7 @@ RSpec.describe Blacklight::SearchService, api: true do
|
|
477
477
|
end
|
478
478
|
|
479
479
|
before do
|
480
|
-
blacklight_config.view.opensearch
|
480
|
+
blacklight_config.view.opensearch(title_field: :field)
|
481
481
|
allow(repository).to receive(:search).and_return(mock_response)
|
482
482
|
end
|
483
483
|
|
@@ -46,4 +46,13 @@ RSpec.describe "catalog/_document" do
|
|
46
46
|
expect(rendered).to have_selector 'article.document header', text: '22. xyz'
|
47
47
|
expect(rendered).not_to match(/partial/)
|
48
48
|
end
|
49
|
+
|
50
|
+
it 'renders the partial using a provided view config' do
|
51
|
+
view_config = Blacklight::Configuration::ViewConfig.new partials: %w[a]
|
52
|
+
stub_template "catalog/_a_default.html.erb" => "partial"
|
53
|
+
|
54
|
+
render partial: "catalog/document", locals: { document: document, document_counter: 1, view_config: view_config }
|
55
|
+
|
56
|
+
expect(rendered).to match(/partial/)
|
57
|
+
end
|
49
58
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
RSpec.describe "catalog/_document_list", type: :view do
|
4
4
|
before do
|
5
|
-
allow(view).to receive_messages(document_index_view_type: "some-view", documents: [])
|
5
|
+
allow(view).to receive_messages(document_index_view_type: "some-view", documents: [], blacklight_config: nil)
|
6
6
|
end
|
7
7
|
|
8
8
|
it "includes a class for the current view" do
|
@@ -3,13 +3,9 @@
|
|
3
3
|
RSpec.describe "catalog/_view_type_group" do
|
4
4
|
let(:blacklight_config) { Blacklight::Configuration.new }
|
5
5
|
let(:response) { instance_double(Blacklight::Solr::Response, empty?: false) }
|
6
|
-
let(:icon_instance) { instance_double(Blacklight::Icon) }
|
7
6
|
|
8
7
|
before do
|
9
8
|
allow(view).to receive(:view_label), &:to_s
|
10
|
-
allow(Blacklight::Icon).to receive(:new).and_return icon_instance
|
11
|
-
allow(icon_instance).to receive(:svg).and_return '<svg></svg>'
|
12
|
-
allow(icon_instance).to receive(:options).and_return({})
|
13
9
|
allow(view).to receive_messages(how_sort_and_per_page?: true, blacklight_config: blacklight_config)
|
14
10
|
controller.request.path_parameters[:action] = 'index'
|
15
11
|
assign(:response, response)
|
@@ -24,13 +20,16 @@ RSpec.describe "catalog/_view_type_group" do
|
|
24
20
|
it "displays the group" do
|
25
21
|
blacklight_config.configure do |config|
|
26
22
|
config.view.delete(:list)
|
27
|
-
config.view.a
|
28
|
-
config.view.b
|
29
|
-
config.view.c
|
23
|
+
config.view.a(icon: :list)
|
24
|
+
config.view.b(icon: :list)
|
25
|
+
config.view.c(icon: :list)
|
30
26
|
end
|
31
27
|
render partial: 'catalog/view_type_group'
|
32
28
|
expect(rendered).to have_selector('.btn-group.view-type-group')
|
33
29
|
expect(rendered).to have_selector('.view-type-a', text: 'a')
|
30
|
+
within '.view-type-a' do
|
31
|
+
expect(rendered).to have_selector 'svg'
|
32
|
+
end
|
34
33
|
expect(rendered).to have_selector('.view-type-b', text: 'b')
|
35
34
|
expect(rendered).to have_selector('.view-type-c', text: 'c')
|
36
35
|
end
|
@@ -38,8 +37,8 @@ RSpec.describe "catalog/_view_type_group" do
|
|
38
37
|
it "sets the current view to 'active'" do
|
39
38
|
blacklight_config.configure do |config|
|
40
39
|
config.view.delete(:list)
|
41
|
-
config.view.a
|
42
|
-
config.view.b
|
40
|
+
config.view.a(icon: :list)
|
41
|
+
config.view.b(icon: :list)
|
43
42
|
end
|
44
43
|
render partial: 'catalog/view_type_group'
|
45
44
|
expect(rendered).to have_selector('.active', text: 'a')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blacklight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.
|
4
|
+
version: 7.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Rochkind
|
@@ -17,7 +17,7 @@ authors:
|
|
17
17
|
autorequire:
|
18
18
|
bindir: exe
|
19
19
|
cert_chain: []
|
20
|
-
date: 2021-
|
20
|
+
date: 2021-05-01 00:00:00.000000000 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: rails
|