blacklight 7.25.3 → 7.27.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ed5074249090af28b69f617baadf69238599d64f387aae61ef71478ea501573
4
- data.tar.gz: 03c767a4f628e2e09cd0afbbcb84a30cb0b4161013343f6fd45ab0a9653b58e6
3
+ metadata.gz: 39fe32f4252deb7d8bb08a1d2781a8d1af7e387eb2bafc93fc083cd13eda9b21
4
+ data.tar.gz: f0b41d058163f54ca1f5a11b745077c8404eea4f8cea43d87c8ea4e6d6ed0d30
5
5
  SHA512:
6
- metadata.gz: 55bab7b3b6c79e06a946650fa0be87eb273b29ef7e2967a945b4222e58edb4da63781b6011d325c9de6377fe8fcb6c6678a651dc4afa6a2d86860a81fa81ebdb
7
- data.tar.gz: ccafd10839a91ef7ec21bc5838da73f4cd31d6a17320e6e20b4e052c0414b9ca16c2e6347e1ca1f9dbdaacfed26e723bed9eb6289b5e8c7c887c3867a3cbf8b7
6
+ metadata.gz: e02cee90b4acb73a5b3fe4883c2a076f37146200fdec169bc3bbf0012ffcd79e5244019ee703c97c601f7100bdaecacf65617dccbc2050911b0fa4e7a24eefbd
7
+ data.tar.gz: 80036e1203a14f9d7f90e11a8fd02309e447d29be4f1deb4250d7628a3bcfad1ed00e43d57d9152fd1fff751e27e983af0adb0747978978039a6d1d81309e688
data/VERSION CHANGED
@@ -1 +1 @@
1
- 7.25.3
1
+ 7.27.0
@@ -120,6 +120,21 @@
120
120
  text-align: right;
121
121
  width: 5em;
122
122
  }
123
+
124
+ .facet-checkbox {
125
+ display: table-cell;
126
+ width: 1.25rem;
127
+ vertical-align: top;
128
+ }
129
+
130
+ .label-and-count {
131
+ display: table;
132
+ width: 100%;
133
+ }
134
+
135
+ .label-and-count label {
136
+ display: table-row;
137
+ }
123
138
  }
124
139
 
125
140
  .facet-extended-list {
@@ -1,4 +1,4 @@
1
- <% if constraints.present? %>
1
+ <% if constraints? %>
2
2
  <div class="constraints well search_history">
3
3
  <h4><%= t 'blacklight.advanced_search.form.search_context' %></h4>
4
4
  <% constraints.each do |constraint| %>
@@ -11,8 +11,8 @@
11
11
  <%= render_hash_as_hidden_fields(@params) %>
12
12
 
13
13
  <div class="input-criteria">
14
- <div class="query-criteria">
15
- <h2 class="query-criteria-heading">
14
+ <div class="query-criteria mb-4">
15
+ <h2 class="query-criteria-heading h3 mb-4">
16
16
  <%= t('blacklight.advanced_search.form.query_criteria_heading_html', select_menu: default_operator_menu) %>
17
17
  </h2>
18
18
 
@@ -23,28 +23,32 @@
23
23
  </div>
24
24
  </div>
25
25
 
26
- <div class="limit-criteria">
27
- <h2 class="limit-criteria-heading"><%= t('blacklight.advanced_search.form.limit_criteria_heading_html')%></h2>
26
+ <% if search_filter_controls? %>
27
+ <div class="limit-criteria mb-4">
28
+ <h2 class="limit-criteria-heading h3"><%= t('blacklight.advanced_search.form.limit_criteria_heading_html')%></h2>
28
29
 
29
- <div id="advanced_search_facets" class="limit_input">
30
- <div class="advanced-facet-limits panel-group">
31
- <% search_filter_controls.each do |control| %>
32
- <%= control %>
33
- <% end %>
30
+ <div id="advanced_search_facets" class="limit_input row">
31
+ <div class="advanced-facet-limits panel-group col-md-9 offset-md-3">
32
+ <% search_filter_controls.each do |control| %>
33
+ <%= control %>
34
+ <% end %>
35
+ </div>
34
36
  </div>
35
37
  </div>
36
- </div>
38
+ <% end %>
37
39
  </div>
38
40
 
39
- <%= content_tag :h2, t('blacklight.advanced_search.form.sort_label') %>
40
- <div class="form-group row">
41
- <div class="col-sm-offset-3 col-sm-4">
42
- <%= sort_fields_select %>
41
+ <% if sort_fields_select %>
42
+ <div class="form-group row mb-4">
43
+ <%= content_tag :h2, t('blacklight.advanced_search.form.sort_label'), class: 'col-md-3 col-form-label text-md-right' %>
44
+ <div class="col">
45
+ <%= sort_fields_select %>
46
+ </div>
43
47
  </div>
44
- </div>
48
+ <% end %>
45
49
 
46
50
  <div class="form-group row">
47
- <div class="submit-buttons col-sm-offset-3 col-sm-9">
51
+ <div class="submit-buttons col-md-9 offset-md-3">
48
52
  <%= submit_tag t('blacklight.advanced_search.form.search_btn_html'), class: 'btn btn-primary advanced-search-submit', id: "advanced-search-submit" %>
49
53
  <%= button_tag t('blacklight.advanced_search.form.start_over_html'), type: 'reset', class: 'btn btn-link advanced-search-start-over' %>
50
54
  </div>
@@ -31,7 +31,9 @@ module Blacklight
31
31
 
32
32
  def sort_fields_select
33
33
  options = sort_fields.values.map { |field_config| [helpers.sort_field_label(field_config.key), field_config.key] }
34
- select_tag(:sort, options_for_select(options, params[:sort]), class: "form-control sort-select")
34
+ return unless options.any?
35
+
36
+ select_tag(:sort, options_for_select(options, params[:sort]), class: "form-control sort-select w-auto")
35
37
  end
36
38
 
37
39
  private
@@ -41,7 +43,7 @@ module Blacklight
41
43
  search_field_control do
42
44
  fields_for('clause[]', i, include_id: false) do |f|
43
45
  content_tag(:div, class: 'form-group advanced-search-field row') do
44
- f.label(:query, field.display_label('search'), class: "col-sm-3 col-form-label") +
46
+ f.label(:query, field.display_label('search'), class: "col-md-3 col-form-label text-md-right") +
45
47
  content_tag(:div, class: 'col-sm-9') do
46
48
  f.hidden_field(:field, value: field.key) +
47
49
  f.text_field(:query, value: query_for_search_clause(field.key), class: 'form-control')
@@ -62,12 +64,16 @@ module Blacklight
62
64
  end
63
65
 
64
66
  def initialize_constraints
65
- constraint do
66
- params = helpers.search_state.params_for_search.except :page, :f_inclusive, :q, :search_field, :op, :index, :sort
67
+ params = helpers.search_state.params_for_search.except :page, :f_inclusive, :q, :search_field, :op, :index, :sort
68
+
69
+ adv_search_context = helpers.search_state.reset(params)
67
70
 
68
- adv_search_context = helpers.search_state.reset(params)
71
+ constraints_text = render(Blacklight::ConstraintsComponent.for_search_history(search_state: adv_search_context))
69
72
 
70
- Blacklight::ConstraintsComponent.for_search_history(search_state: adv_search_context)
73
+ return if constraints_text.blank?
74
+
75
+ constraint do
76
+ constraints_text
71
77
  end
72
78
  end
73
79
 
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ ##
5
+ # Renders a single section for facet limit with a specified
6
+ # solr field used for faceting. This renders no UI of it's own, but renders
7
+ # the component that is configured for the facet.
8
+ class FacetComponent < ViewComponent::Base
9
+ with_collection_parameter :display_facet_or_field_config
10
+
11
+ # @param [Blacklight::Solr::Response::Facets::FacetField] display_facet
12
+ # @param [Blacklight::Configuration] blacklight_config
13
+ # @param [Boolean] layout
14
+ # rubocop:disable Metrics/CyclomaticComplexity
15
+ def initialize(display_facet_or_field_config: nil, display_facet: nil, field_config: nil, response: nil, blacklight_config: nil, **component_args)
16
+ if display_facet_or_field_config.is_a? Blacklight::FacetFieldPresenter
17
+ @facet_field_presenter = display_facet_or_field_config
18
+ @field_config = @facet_field_presenter.facet_field
19
+ @display_facet = @facet_field_presenter.display_facet
20
+ elsif display_facet_or_field_config.is_a?(Blacklight::Configuration::Field) || field_config
21
+ @facet_field_presenter = nil # we need the view context to generate this
22
+ @field_config = display_facet_or_field_config || field_config
23
+ @display_facet = display_facet ||
24
+ response&.aggregations&.fetch(@field_config.field) { Blacklight::Solr::Response::Facets::NullFacetField.new(@field_config.field, response: response) }
25
+ elsif (display_facet || display_facet_or_field_config).respond_to?(:name)
26
+ @facet_field_presenter = nil # we need the view context to generate this
27
+ @display_facet = display_facet || display_facet_or_field_config
28
+ @field_config = field_config || blacklight_config&.facet_configuration_for_field(@display_facet.name)
29
+ else
30
+ raise ArgumentError, 'You must provide one of display_facet or field_config' unless @field_config
31
+ end
32
+
33
+ @component_args = component_args
34
+ end
35
+ # rubocop:enable Metrics/CyclomaticComplexity
36
+
37
+ def render?
38
+ helpers.should_render_field?(@field_config, @display_facet)
39
+ end
40
+
41
+ def call
42
+ return render_partial if @field_config.partial
43
+
44
+ component = @field_config.component == true ? Blacklight::FacetFieldListComponent : @field_config.component
45
+
46
+ render(
47
+ component.new(
48
+ facet_field: @facet_field_presenter || helpers.facet_field_presenter(@field_config, @display_facet),
49
+ **@component_args
50
+ )
51
+ )
52
+ end
53
+
54
+ def render_partial
55
+ helpers.render(@field_config.partial, locals: { field_name: @field_config.field, facet_field: @field_config, display_facet: @display_facet }.merge(@component_args))
56
+ end
57
+ end
58
+ end
@@ -13,7 +13,8 @@
13
13
 
14
14
  <span class="label-and-count">
15
15
  <%= label_tag "f_inclusive_#{@facet_field.key}_#{idx}" do %>
16
- <%= presenter.label %>
16
+ <span class="facet-label"><%= presenter.label %></span>
17
+ <span class="facet-count"><%= t('blacklight.search.facets.count', number: number_with_delimiter(presenter.hits)) %></span>
17
18
  <% end %>
18
19
  <span>
19
20
  </li>
@@ -16,7 +16,7 @@ module Blacklight
16
16
  end
17
17
 
18
18
  def render?
19
- @facet_field.paginator.items.any?
19
+ @facet_field.paginator&.items&.any?
20
20
  end
21
21
  end
22
22
  end
@@ -4,6 +4,8 @@ module Blacklight
4
4
  class FacetItemComponent < Blacklight::Component
5
5
  extend Deprecation
6
6
 
7
+ attr_reader :label, :href, :hits
8
+
7
9
  with_collection_parameter :facet_item
8
10
 
9
11
  def initialize(facet_item:, wrapping_element: 'li', suppress_link: false)
@@ -48,9 +50,9 @@ module Blacklight
48
50
  def overridden_helper_methods?
49
51
  return false if explicit_component_configuration?
50
52
 
51
- @view_context.method(:render_facet_item).owner != Blacklight::FacetsHelperBehavior ||
52
- @view_context.method(:render_facet_value).owner != Blacklight::FacetsHelperBehavior ||
53
- @view_context.method(:render_selected_facet_value).owner != Blacklight::FacetsHelperBehavior
53
+ helpers.method(:render_facet_item).owner != Blacklight::FacetsHelperBehavior ||
54
+ helpers.method(:render_facet_value).owner != Blacklight::FacetsHelperBehavior ||
55
+ helpers.method(:render_selected_facet_value).owner != Blacklight::FacetsHelperBehavior
54
56
  end
55
57
 
56
58
  # Call out to the helper method equivalent of this component
@@ -72,7 +74,7 @@ module Blacklight
72
74
  # @private
73
75
  def render_facet_value
74
76
  tag.span(class: "facet-label") do
75
- link_to_unless(@suppress_link, @label, @href, class: "facet-select", rel: "nofollow")
77
+ link_to_unless(@suppress_link, label, href, class: "facet-select", rel: "nofollow")
76
78
  end + render_facet_count
77
79
  end
78
80
 
@@ -83,9 +85,9 @@ module Blacklight
83
85
  # @private
84
86
  def render_selected_facet_value
85
87
  tag.span(class: "facet-label") do
86
- tag.span(@label, class: "selected") +
88
+ tag.span(label, class: "selected") +
87
89
  # remove link
88
- link_to(@href, class: "remove", rel: "nofollow") do
90
+ link_to(href, class: "remove", rel: "nofollow") do
89
91
  tag.span('✖', class: "remove-icon", aria: { hidden: true }) +
90
92
  tag.span(helpers.t(:'blacklight.search.facets.selected.remove'), class: 'sr-only visually-hidden')
91
93
  end
@@ -101,12 +103,12 @@ module Blacklight
101
103
  # @return [String]
102
104
  # @private
103
105
  def render_facet_count(options = {})
104
- return helpers.render_facet_count(@hits, options) unless helpers.method(:render_facet_count).owner == Blacklight::FacetsHelperBehavior || explicit_component_configuration?
106
+ return helpers.render_facet_count(hits, options) unless helpers.method(:render_facet_count).owner == Blacklight::FacetsHelperBehavior || explicit_component_configuration?
105
107
 
106
- return '' if @hits.blank?
108
+ return '' if hits.blank?
107
109
 
108
110
  classes = (options[:classes] || []) << "facet-count"
109
- tag.span(t('blacklight.search.facets.count', number: number_with_delimiter(@hits)), class: classes)
111
+ tag.span(t('blacklight.search.facets.count', number: number_with_delimiter(hits)), class: classes)
110
112
  end
111
113
 
112
114
  private
@@ -60,9 +60,7 @@ module Blacklight::Catalog
60
60
  end
61
61
 
62
62
  def advanced_search
63
- empty_service = search_service_class.new(config: blacklight_config, user_params: {}, **search_service_context)
64
-
65
- (@response, _deprecated_document_list) = empty_service.search_results
63
+ (@response, _deprecated_document_list) = blacklight_advanced_search_form_search_service.search_results
66
64
  end
67
65
 
68
66
  # get a single document from the index
@@ -334,4 +332,14 @@ module Blacklight::Catalog
334
332
  flash[:notice] = flash_notice
335
333
  redirect_to search_action_url
336
334
  end
335
+
336
+ def blacklight_advanced_search_form_search_service
337
+ form_search_state = search_state_class.new(blacklight_advanced_search_form_params, blacklight_config, self)
338
+
339
+ search_service_class.new(config: blacklight_config, search_state: form_search_state, user_params: form_search_state.to_h, **search_service_context)
340
+ end
341
+
342
+ def blacklight_advanced_search_form_params
343
+ {}
344
+ end
337
345
  end
@@ -76,13 +76,10 @@ module Blacklight::FacetsHelperBehavior
76
76
  field_config = facet_configuration_for_field(display_facet.name)
77
77
 
78
78
  if field_config.component
79
- return unless should_render_field?(field_config, display_facet)
80
-
81
- component = field_config.component == true ? Blacklight::FacetFieldListComponent : field_config.component
82
-
83
79
  return render(
84
- component.new(
85
- facet_field: facet_field_presenter(field_config, display_facet),
80
+ Blacklight::FacetComponent.new(
81
+ display_facet: display_facet,
82
+ field_config: field_config,
86
83
  layout: (params[:action] == 'facet' ? false : options[:layout])
87
84
  )
88
85
  )
@@ -35,7 +35,7 @@ module Blacklight::RenderConstraintsHelperBehavior
35
35
  end
36
36
 
37
37
  Deprecation.silence(Blacklight::RenderConstraintsHelperBehavior) do
38
- render_constraints_query(params_or_search_state) + render_constraints_filters(params_or_search_state)
38
+ render_constraints_query(params_or_search_state) + render_constraints_clauses(params_or_search_state) + render_constraints_filters(params_or_search_state)
39
39
  end
40
40
  end
41
41
 
@@ -60,6 +60,24 @@ module Blacklight::RenderConstraintsHelperBehavior
60
60
  end
61
61
  end
62
62
 
63
+ ##
64
+ # Render the query constraints
65
+ #
66
+ # @deprecated
67
+ # @param [Blacklight::SearchState,ActionController::Parameters] params_or_search_state query parameters
68
+ # @return [String]
69
+ def render_constraints_clauses(params_or_search_state = search_state)
70
+ search_state = convert_to_search_state(params_or_search_state)
71
+
72
+ clause_presenters = search_state.clause_params.map do |key, clause|
73
+ field_config = blacklight_config.search_fields[clause[:field]]
74
+ Blacklight::ClausePresenter.new(key, clause, field_config, self, search_state)
75
+ end
76
+
77
+ render(Blacklight::ConstraintComponent.with_collection(clause_presenters))
78
+ end
79
+ deprecation_deprecate :render_constraints_clauses
80
+
63
81
  ##
64
82
  # Provide a url for removing a particular constraint. This can be overriden
65
83
  # in the case that you want parameters other than the defaults to be removed
@@ -107,9 +125,13 @@ module Blacklight::RenderConstraintsHelperBehavior
107
125
  safe_join(Array(values).map do |val|
108
126
  next if val.blank? # skip empty string
109
127
 
110
- presenter = facet_item_presenter(facet_config, val, facet)
111
-
112
128
  Deprecation.silence(Blacklight::RenderConstraintsHelperBehavior) do
129
+ presenter = if val.is_a? Array
130
+ inclusive_facet_item_presenter(facet_config, val, facet)
131
+ else
132
+ facet_item_presenter(facet_config, val, facet)
133
+ end
134
+
113
135
  render_constraint_element(presenter.field_label,
114
136
  presenter.label,
115
137
  remove: presenter.remove_href(search_state),
@@ -118,6 +140,10 @@ module Blacklight::RenderConstraintsHelperBehavior
118
140
  end, "\n")
119
141
  end
120
142
 
143
+ def inclusive_facet_item_presenter(facet_config, facet_item, facet_field)
144
+ Blacklight::InclusiveFacetItemPresenter.new(facet_item, facet_config, self, facet_field)
145
+ end
146
+
121
147
  # Render a label/value constraint on the screen. Can be called
122
148
  # by plugins and such to get application-defined rendering.
123
149
  #
@@ -25,7 +25,7 @@ module Blacklight
25
25
  end
26
26
 
27
27
  def remove_href(path = search_state)
28
- view_context.search_action_path(path.reset_search(clause: path.clause_params.except(key)))
28
+ view_context.search_action_path(path.reset_search(clause: path.clause_params.except(key)).to_h)
29
29
  end
30
30
 
31
31
  private
@@ -1,5 +1,5 @@
1
1
  <% if render_show_doc_actions_method_from_blacklight? %>
2
- <%= render(Blacklight::Document::ActionsComponent.new(document: nil, tag: 'div', classes: "#{controller_name}Tools", wrapping_tag: 'span', wrapping_classes: 'btn btn-outline-primary', link_classes: '', actions: document_actions(document_list, options: { document: nil }), options: { document_list: @response.documents }, url_opts: Blacklight::Parameters.sanitize(params.to_unsafe_h))) %>
2
+ <%= render(Blacklight::Document::ActionsComponent.new(document: nil, tag: 'div', classes: "#{controller_name}Tools", link_classes: 'btn btn-outline-primary', actions: document_actions(document_list, options: { document: nil }), options: { document_list: @response.documents }, url_opts: Blacklight::Parameters.sanitize(params.to_unsafe_h))) %>
3
3
  <% else %>
4
4
  <% Deprecation.warn(self, '#render_show_doc_actions is deprecated; use ActionComponents instead') %>
5
5
  <ul class="<%= controller_name %>Tools nav nav-pills">
@@ -99,6 +99,12 @@ module Blacklight::Solr::Response::Facets
99
99
  end
100
100
  end
101
101
 
102
+ class NullFacetField < FacetField
103
+ def initialize name, items = [], response: nil, **kwargs
104
+ super(name, items, response: response, **kwargs)
105
+ end
106
+ end
107
+
102
108
  ##
103
109
  # Get all the Solr facet data (fields, queries, pivots) as a hash keyed by
104
110
  # both the Solr field name and/or by the blacklight field name
@@ -17,6 +17,7 @@
17
17
  </updateHandler>
18
18
 
19
19
  <!-- solr lib dirs -->
20
+ <lib dir="${solr.install.dir:../../../..}/contrib/modules/lib" />
20
21
  <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib" />
21
22
  <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" />
22
23
 
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Blacklight::FacetComponent, type: :component do
6
+ subject(:rendered) do
7
+ render_inline_to_capybara_node(component)
8
+ end
9
+
10
+ let(:component) { described_class.new(**component_kwargs) }
11
+ let(:component_kwargs) { { field_config: facet_config, display_facet: display_facet } }
12
+ let(:items) { [{ label: "Book", value: 'Book', hits: 20 }] }
13
+
14
+ let(:display_facet) do
15
+ instance_double(Blacklight::Solr::Response::Facets::FacetField, name: 'field', items: items, limit: nil, sort: :index, offset: 0, prefix: nil)
16
+ end
17
+
18
+ let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'field', component: Blacklight::FacetFieldListComponent).normalize! }
19
+
20
+ before do
21
+ allow(controller).to receive(:view_context).and_return(controller.view_context)
22
+ allow(controller.view_context).to receive(:facet_limit_for).and_return(20)
23
+ end
24
+
25
+ it 'delegates to the configured component to render something' do
26
+ expect(rendered).to have_selector 'ul.facet-values'
27
+ end
28
+
29
+ context 'with a facet configured to use a partial' do
30
+ let(:facet_config) do
31
+ Blacklight::Configuration::FacetField.new(key: 'field', partial: 'catalog/facet_partial').normalize!
32
+ end
33
+
34
+ before do
35
+ controller.view_context.view_paths.unshift(RSpec::Rails::ViewExampleGroup::StubResolverCache.resolver_for('catalog/_facet_partial.html.erb' => 'facet partial'))
36
+ end
37
+
38
+ it 'renders the partial' do
39
+ expect(rendered).to have_content 'facet partial'
40
+ end
41
+ end
42
+
43
+ context 'with a field and response' do
44
+ let(:component_kwargs) do
45
+ { display_facet_or_field_config: facet_config, response: response }
46
+ end
47
+
48
+ let(:response) { instance_double(Blacklight::Solr::Response, aggregations: { 'field' => display_facet }) }
49
+
50
+ it 'extracts the facet data from the response to pass on to the rendering component' do
51
+ allow(facet_config.component).to receive(:new).and_call_original
52
+
53
+ rendered
54
+
55
+ expect(facet_config.component).to have_received(:new).with(facet_field: have_attributes(facet_field: facet_config, display_facet: display_facet))
56
+ end
57
+
58
+ context 'when the field is not in the response' do
59
+ let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'some_other_field', component: Blacklight::FacetFieldListComponent).normalize! }
60
+
61
+ it 'uses a null field to pass through the response information anyway' do
62
+ allow(facet_config.component).to receive(:new).and_call_original
63
+
64
+ rendered
65
+
66
+ expect(facet_config.component).to have_received(:new).with(facet_field: have_attributes(facet_field: facet_config, display_facet: have_attributes(items: [], response: response)))
67
+ end
68
+ end
69
+ end
70
+
71
+ context 'with a display facet and configuration' do
72
+ let(:component_kwargs) do
73
+ { display_facet_or_field_config: display_facet, blacklight_config: blacklight_config }
74
+ end
75
+
76
+ let(:blacklight_config) { Blacklight::Configuration.new.tap { |config| config.facet_fields['field'] = facet_config } }
77
+
78
+ it 'pulls the facet config from the blacklight config' do
79
+ allow(facet_config.component).to receive(:new).and_call_original
80
+
81
+ rendered
82
+
83
+ expect(facet_config.component).to have_received(:new).with(facet_field: have_attributes(facet_field: facet_config, display_facet: display_facet))
84
+ end
85
+ end
86
+
87
+ context 'with a presenter' do
88
+ let(:component_kwargs) do
89
+ { display_facet_or_field_config: presenter }
90
+ end
91
+
92
+ let(:presenter) { Blacklight::FacetFieldPresenter.new(facet_config, display_facet, controller.view_context) }
93
+
94
+ it 'renders the component with the provided presenter' do
95
+ allow(facet_config.component).to receive(:new).and_call_original
96
+
97
+ rendered
98
+
99
+ expect(facet_config.component).to have_received(:new).with(facet_field: presenter)
100
+ end
101
+ end
102
+ end
@@ -199,7 +199,7 @@ RSpec.describe Blacklight::FacetsHelperBehavior do
199
199
 
200
200
  it "lets you override the rendered partial for pivot facets" do
201
201
  mock_facet = double(name: 'component_field')
202
- expect(helper).to receive(:render).with(an_instance_of(Blacklight::FacetFieldListComponent))
202
+ expect(helper).to receive(:render).with(an_instance_of(Blacklight::FacetComponent))
203
203
  helper.render_facet_limit(mock_facet)
204
204
  end
205
205
 
@@ -6,6 +6,7 @@ RSpec.describe Blacklight::RenderConstraintsHelperBehavior do
6
6
  let(:config) do
7
7
  Blacklight::Configuration.new do |config|
8
8
  config.add_facet_field 'type'
9
+ config.add_search_field 'title'
9
10
  end
10
11
  end
11
12
 
@@ -31,6 +32,21 @@ RSpec.describe Blacklight::RenderConstraintsHelperBehavior do
31
32
  end
32
33
  end
33
34
 
35
+ describe '#render_constraints_clauses' do
36
+ subject { helper.render_constraints_clauses(params) }
37
+
38
+ let(:my_engine) { double("Engine") }
39
+ let(:params) { ActionController::Parameters.new(clause: { "0": { field: 'title', query: 'nature' } }, f: { type: 'journal' }) }
40
+
41
+ it 'renders the clause constraint' do
42
+ expect(subject).to have_selector '.constraint-value', text: /Title\s+nature/
43
+ end
44
+
45
+ it "has a link relative to the current url" do
46
+ expect(subject).to have_link 'Remove constraint Title: nature', href: '/catalog?f%5Btype%5D%5B%5D=journal'
47
+ end
48
+ end
49
+
34
50
  describe '#render_filter_element' do
35
51
  subject { helper.render_filter_element('type', ['journal'], path) }
36
52
 
@@ -54,6 +70,14 @@ RSpec.describe Blacklight::RenderConstraintsHelperBehavior do
54
70
  expect(subject).to have_link "Remove constraint Item Type: journal", href: "/catalog?q=biz"
55
71
  end
56
72
  end
73
+
74
+ context 'with multivalued facets' do
75
+ subject { helper.render_filter_element('type', [%w[journal book]], path) }
76
+
77
+ it "handles such values gracefully" do
78
+ expect(subject).to have_link "Remove constraint Item Type: journal OR book", href: "/catalog?q=biz"
79
+ end
80
+ end
57
81
  end
58
82
 
59
83
  describe "#render_constraints_filters" do
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.25.3
4
+ version: 7.27.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Rochkind
@@ -14,10 +14,10 @@ authors:
14
14
  - Dan Funk
15
15
  - Naomi Dushay
16
16
  - Justin Coyne
17
- autorequire:
17
+ autorequire:
18
18
  bindir: exe
19
19
  cert_chain: []
20
- date: 2022-05-24 00:00:00.000000000 Z
20
+ date: 2022-07-01 00:00:00.000000000 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: rails
@@ -453,6 +453,7 @@ files:
453
453
  - app/components/blacklight/document_metadata_component.rb
454
454
  - app/components/blacklight/document_title_component.html.erb
455
455
  - app/components/blacklight/document_title_component.rb
456
+ - app/components/blacklight/facet_component.rb
456
457
  - app/components/blacklight/facet_field_checkboxes_component.html.erb
457
458
  - app/components/blacklight/facet_field_checkboxes_component.rb
458
459
  - app/components/blacklight/facet_field_component.html.erb
@@ -779,6 +780,7 @@ files:
779
780
  - spec/components/blacklight/document/group_component_spec.rb
780
781
  - spec/components/blacklight/document_component_spec.rb
781
782
  - spec/components/blacklight/document_metadata_component_spec.rb
783
+ - spec/components/blacklight/facet_component_spec.rb
782
784
  - spec/components/blacklight/facet_field_checkboxes_component_spec.rb
783
785
  - spec/components/blacklight/facet_field_list_component_spec.rb
784
786
  - spec/components/blacklight/facet_item_component_spec.rb
@@ -931,7 +933,7 @@ homepage: http://projectblacklight.org/
931
933
  licenses:
932
934
  - Apache 2.0
933
935
  metadata: {}
934
- post_install_message:
936
+ post_install_message:
935
937
  rdoc_options: []
936
938
  require_paths:
937
939
  - lib
@@ -946,8 +948,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
946
948
  - !ruby/object:Gem::Version
947
949
  version: '0'
948
950
  requirements: []
949
- rubygems_version: 3.2.32
950
- signing_key:
951
+ rubygems_version: 3.1.2
952
+ signing_key:
951
953
  specification_version: 4
952
954
  summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
953
955
  index.
@@ -959,6 +961,7 @@ test_files:
959
961
  - spec/components/blacklight/document/group_component_spec.rb
960
962
  - spec/components/blacklight/document_component_spec.rb
961
963
  - spec/components/blacklight/document_metadata_component_spec.rb
964
+ - spec/components/blacklight/facet_component_spec.rb
962
965
  - spec/components/blacklight/facet_field_checkboxes_component_spec.rb
963
966
  - spec/components/blacklight/facet_field_list_component_spec.rb
964
967
  - spec/components/blacklight/facet_item_component_spec.rb