blacklight 7.30.0 → 7.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/app/assets/stylesheets/blacklight/_header.scss +4 -7
  4. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +2 -0
  5. data/app/components/blacklight/constraint_component.html.erb +1 -1
  6. data/app/components/blacklight/document/action_component.html.erb +1 -1
  7. data/app/components/blacklight/icons/icon_component.rb +14 -2
  8. data/app/components/blacklight/search_bar_component.html.erb +6 -7
  9. data/app/components/blacklight/search_bar_component.rb +6 -1
  10. data/app/components/blacklight/search_button_component.rb +17 -0
  11. data/app/helpers/blacklight/component_helper_behavior.rb +10 -12
  12. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -3
  13. data/app/models/concerns/blacklight/document.rb +7 -0
  14. data/app/models/search_builder.rb +5 -0
  15. data/app/presenters/blacklight/clause_presenter.rb +4 -0
  16. data/app/presenters/blacklight/document_presenter.rb +5 -0
  17. data/app/presenters/blacklight/facet_item_presenter.rb +8 -0
  18. data/app/views/catalog/_search_results.html.erb +1 -2
  19. data/app/views/catalog/_search_results_header.html.erb +1 -0
  20. data/blacklight.gemspec +1 -1
  21. data/lib/blacklight/component.rb +20 -0
  22. data/lib/blacklight.rb +6 -6
  23. data/lib/generators/blacklight/assets_generator.rb +9 -3
  24. data/lib/generators/blacklight/templates/catalog_controller.rb +2 -0
  25. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +1 -1
  26. data/lib/generators/blacklight/templates/solr_document.rb +2 -0
  27. data/package.json +0 -1
  28. data/spec/components/blacklight/search_bar_component_spec.rb +82 -0
  29. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -3
  30. data/spec/helpers/catalog_helper_spec.rb +1 -1
  31. data/spec/models/blacklight/suggest_search_spec.rb +1 -1
  32. data/spec/models/solr_document_spec.rb +11 -0
  33. data/spec/presenters/blacklight/document_presenter_spec.rb +6 -0
  34. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +7 -0
  35. metadata +10 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3f2833ee33fe1cc1d37ef72206820efdd9bbdd4c39f14783c08bfba4c7b9dd8
4
- data.tar.gz: 3f9cbc91061f1a1b68bd25aab95c518f134c7a497566241691a8aee63cc6b752
3
+ metadata.gz: 17b8b14189b4ced9faa60d183fa887eb6962dba4d55f3718fee11ff4bed59388
4
+ data.tar.gz: dd1f5ea853080c0732313b3ab64de8d310634786cfbcfe5ddde6691bc2137820
5
5
  SHA512:
6
- metadata.gz: 5b6500ea3048765a8e9d78425eb6f14d7a7edcb6cd17c1ddcc91c88edc7e09353672f0aa7ff29e1e85fbe238508066f9221b652c48cacbfe947e636dbac13a27
7
- data.tar.gz: 5da051e3b7d496204d5e8752c09d346e39c0a94d917539155e60d0a2488ee3a32770bdbf205d11d9fff9da0f107c8d01b8786749ad9e9272b4b9933f46b6815e
6
+ metadata.gz: d481b3b290ca1030fcc593fad5ef8fdbe3e5a42091c4138af3efaaa58b45322f32d8e4956e6d92d01d305e762d4e2a3886f9caa193ba4197920d18d989184308
7
+ data.tar.gz: f6010fc1c00b31fddce8d2e73794655dbe3c1c690e65bedace78c693a4c36a884f5ac0589681717e3852bf9e1ff41109a7d5de2c2d4957e835c59afd53cfcfcb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 7.30.0
1
+ 7.32.0
@@ -12,19 +12,16 @@
12
12
  .navbar-logo { /* The main logo image for the Blacklight instance */
13
13
  @if $logo-image {
14
14
  background: transparent $logo-image no-repeat top left;
15
+ background-size: $logo-width $logo-height;
15
16
  }
16
-
17
17
  display: inline-block;
18
- flex: 0 0 150px;
19
- height: 50px;
20
- margin-right:20px;
18
+ height: $logo-height;
19
+ margin-right: 20px;
21
20
  margin-top: -0.4rem;
22
21
  overflow: hidden;
23
- padding-left: 0;
24
- padding-right: 0;
25
22
  text-indent: 100%;
26
23
  white-space: nowrap;
27
- width: 150px;
24
+ width: $logo-width;
28
25
  }
29
26
 
30
27
  .navbar-search {
@@ -1,6 +1,8 @@
1
1
  /* Warning! If you want to change these, just copy them into your own theme css. But you want to remove the !default, which only will set them if not already set. */
2
2
 
3
3
  $logo-image: image_url('blacklight/logo.png') !default;
4
+ $logo-width: 150px !default;
5
+ $logo-height: 50px !default;
4
6
 
5
7
  /* label (field names) */
6
8
  $field_name_color: $text-muted !default;
@@ -1,5 +1,5 @@
1
1
  <%= render(@layout.new(
2
2
  classes: (Array(@classes) + ["filter-#{@facet_item_presenter.key.parameterize}"]).join(' '),
3
3
  label: @facet_item_presenter.field_label,
4
- value: @facet_item_presenter.label,
4
+ value: @facet_item_presenter.constraint_label,
5
5
  remove_path: @facet_item_presenter.remove_href)) %>
@@ -3,7 +3,7 @@
3
3
  url,
4
4
  id: @id,
5
5
  class: @link_classes,
6
- data: {}.merge(({ blacklight_modal: "trigger" } if @action.modal != false) || {}) %>
6
+ data: {}.merge(({ blacklight_modal: "trigger", turbo: false } if @action.modal != false) || {}) %>
7
7
  <% else %>
8
8
  <%= helpers.render(partial: @action.partial || @action.name.to_s, locals: { document: @document, document_action_config: @action }.merge(@options)) %>
9
9
  <% end %>
@@ -6,15 +6,27 @@ module Blacklight
6
6
  # You can override the default svg by setting:
7
7
  # Blacklight::Icons::ListComponent.svg = '<svg>your SVG here</svg>'
8
8
  class IconComponent < ::ViewComponent::Base
9
- def initialize(svg: nil)
9
+ # rubocop:disable Metrics/ParameterLists
10
+ def initialize(svg: nil, tag: :span, name: nil, label: nil, aria_hidden: nil, classes: nil, **options)
10
11
  self.svg = svg if svg
12
+ @classes = Array(classes) + ['blacklight-icons', "blacklight-icons-#{name}"]
13
+ @name = name
14
+ @tag = tag
15
+ @options = options.merge(aria: options.fetch(:aria, {}).reverse_merge(label: label, hidden: aria_hidden))
11
16
  end
17
+ # rubocop:enable Metrics/ParameterLists
12
18
 
13
19
  def call
14
- svg&.html_safe # rubocop:disable Rails/OutputSafety
20
+ tag.public_send(@tag, svg&.html_safe, # rubocop:disable Rails/OutputSafety
21
+ class: @classes,
22
+ **@options)
15
23
  end
16
24
 
17
25
  class_attribute :svg
26
+
27
+ def name
28
+ @name ||= self.class.name.demodulize.underscore.sub('_component', '')
29
+ end
18
30
  end
19
31
  end
20
32
  end
@@ -1,8 +1,11 @@
1
- <%= form_tag @url, method: @method, class: @classes.join(' '), role: 'search', 'aria-label' => scoped_t('submit') do %>
1
+ <%= form_tag @url, method: @method, class: @classes.join(' '), role: 'search', aria: { label: scoped_t('submit') }, **@form_options do %>
2
2
  <%= render_hash_as_hidden_fields(@params) %>
3
3
  <% if search_fields.length > 1 %>
4
4
  <label for="search_field" class="sr-only visually-hidden"><%= scoped_t('search_field.label') %></label>
5
5
  <% end %>
6
+ <% before_input_groups.each do |input_group| %>
7
+ <%= input_group %>
8
+ <% end %>
6
9
  <div class="input-group">
7
10
  <%= prepend %>
8
11
 
@@ -17,15 +20,11 @@
17
20
  <% end %>
18
21
 
19
22
  <label for="<%= @prefix %><%= @query_param %>" class="sr-only visually-hidden"><%= scoped_t('search.label') %></label>
20
- <%= text_field_tag @query_param, @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", id: "#{@prefix}q", autocomplete: autocomplete_path.present? ? "off" : "", autofocus: @autofocus, data: { autocomplete_enabled: autocomplete_path.present?, autocomplete_path: autocomplete_path } %>
23
+ <%= text_field_tag @query_param, @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", id: "#{@prefix}q", autocomplete: autocomplete_path.present? ? "off" : "", autofocus: @autofocus, aria: { label: scoped_t('search.label') }, data: { autocomplete_enabled: autocomplete_path.present?, autocomplete_path: autocomplete_path } %>
21
24
 
22
25
  <span class="input-group-append">
23
26
  <%= append %>
24
-
25
- <button type="submit" class="btn btn-primary search-btn" id="<%= @prefix %>search">
26
- <span class="submit-search-text"><%= scoped_t('submit') %></span>
27
- <%= blacklight_icon :search, aria_hidden: true %>
28
- </button>
27
+ <%= search_button || render(Blacklight::SearchButtonComponent.new(id: "#{@prefix}search", text: scoped_t('submit'))) %>
29
28
  </span>
30
29
  </div>
31
30
  <% end %>
@@ -6,6 +6,8 @@ module Blacklight
6
6
 
7
7
  renders_one :append
8
8
  renders_one :prepend
9
+ renders_one :search_button
10
+ renders_many :before_input_groups
9
11
 
10
12
  # rubocop:disable Metrics/ParameterLists
11
13
  def initialize(
@@ -14,7 +16,8 @@ module Blacklight
14
16
  classes: ['search-query-form'], prefix: nil,
15
17
  method: 'GET', q: nil, query_param: :q,
16
18
  search_field: nil, search_fields: nil, autocomplete_path: nil,
17
- autofocus: nil, i18n: { scope: 'blacklight.search.form' }
19
+ autofocus: nil, i18n: { scope: 'blacklight.search.form' },
20
+ form_options: {}
18
21
  )
19
22
  @url = url
20
23
  @advanced_search_url = advanced_search_url
@@ -29,6 +32,8 @@ module Blacklight
29
32
  @autofocus = autofocus
30
33
  @search_fields = search_fields
31
34
  @i18n = i18n
35
+ @form_options = form_options
36
+
32
37
  return if presenter.nil?
33
38
 
34
39
  Deprecation.warn(self, 'SearchBarComponent no longer uses a SearchBarPresenter, the presenter: param will be removed in 8.0. ' \
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class SearchButtonComponent < ::ViewComponent::Base
5
+ def initialize(text:, id:)
6
+ @text = text
7
+ @id = id
8
+ end
9
+
10
+ def call
11
+ tag.button(class: 'btn btn-primary search-btn', type: 'submit', id: @id) do
12
+ tag.span(@text, class: "submit-search-text") +
13
+ blacklight_icon(:search, aria_hidden: true)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -38,28 +38,26 @@ module Blacklight
38
38
  # (normally renders next to title in the list view)
39
39
  #
40
40
  # @param [SolrDocument] document
41
- # @param [Hash] options
42
- # @option options [String] :wrapping_class
41
+ # @param [String] wrapping_class ("index-document-functions")
42
+ # @param [Class] component (Blacklight::Document::ActionsComponent)
43
43
  # @return [String]
44
- def render_index_doc_actions(document, options = {})
45
- actions = filter_partials(blacklight_config.view_config(document_index_view_type).document_actions, { document: document }.merge(options)).map { |_k, v| v }
46
- wrapping_class = options.delete(:wrapping_class) || "index-document-functions"
44
+ def render_index_doc_actions(document, wrapping_class: "index-document-functions", component: Blacklight::Document::ActionsComponent)
45
+ actions = filter_partials(blacklight_config.view_config(document_index_view_type).document_actions, { document: document }).map { |_k, v| v }
47
46
 
48
- render(Blacklight::Document::ActionsComponent.new(document: document, actions: actions, options: options, classes: wrapping_class))
47
+ render(component.new(document: document, actions: actions, classes: wrapping_class))
49
48
  end
50
49
 
51
50
  ##
52
51
  # Render "collection actions" area for search results view
53
52
  # (normally renders next to pagination at the top of the result set)
54
53
  #
55
- # @param [Hash] options
56
- # @option options [String] :wrapping_class
54
+ # @param [String] wrapping_class ("search-widgets")
55
+ # @param [Class] component (Blacklight::Document::ActionsComponent)
57
56
  # @return [String]
58
- def render_results_collection_tools(options = {})
59
- actions = filter_partials(blacklight_config.view_config(document_index_view_type).collection_actions, options).map { |_k, v| v }
60
- wrapping_class = options.delete(:wrapping_class) || "search-widgets"
57
+ def render_results_collection_tools(wrapping_class: "search-widgets", component: Blacklight::Document::ActionsComponent)
58
+ actions = filter_partials(blacklight_config.view_config(document_index_view_type).collection_actions, {}).map { |_k, v| v }
61
59
 
62
- render(Blacklight::Document::ActionsComponent.new(actions: actions, options: options, classes: wrapping_class))
60
+ render(component.new(actions: actions, classes: wrapping_class))
63
61
  end
64
62
 
65
63
  ##
@@ -9,9 +9,11 @@ module Blacklight::IconHelperBehavior
9
9
  # the svg everytime.
10
10
  # @param [String, Symbol] icon_name
11
11
  # @return [String]
12
- def blacklight_icon(icon_name, options = {})
13
- Rails.cache.fetch([:blacklight_icons, icon_name, options]) do
14
- icon = Blacklight::Icon.new(icon_name, **options)
12
+ def blacklight_icon(icon_name, **kwargs)
13
+ render "Blacklight::Icons::#{icon_name.to_s.camelize}Component".constantize.new(**kwargs)
14
+ rescue NameError
15
+ Rails.cache.fetch([:blacklight_icons, icon_name, kwargs]) do
16
+ icon = Blacklight::Icon.new(icon_name, **kwargs)
15
17
  tag.span(icon.svg.html_safe, **icon.options)
16
18
  end
17
19
  end
@@ -26,6 +26,8 @@ module Blacklight::Document
26
26
  extend ActiveModel::Naming
27
27
  include Blacklight::Document::Extensions
28
28
  include GlobalID::Identification
29
+
30
+ class_attribute :inspector_fields, default: [:_source]
29
31
  end
30
32
 
31
33
  attr_reader :response, :_source
@@ -82,6 +84,11 @@ module Blacklight::Document
82
84
  Array(self[key]).first
83
85
  end
84
86
 
87
+ def inspect
88
+ fields = inspector_fields.map { |field| "#{field}: #{public_send(field)}" }.join(", ")
89
+ "#<#{self.class.name}:#{object_id} #{fields}>"
90
+ end
91
+
85
92
  def to_partial_path
86
93
  'catalog/document'
87
94
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SearchBuilder < Blacklight::SearchBuilder
4
+ include Blacklight::Solr::SearchBuilderBehavior
5
+ end
@@ -24,6 +24,10 @@ module Blacklight
24
24
  user_parameters[:query]
25
25
  end
26
26
 
27
+ def constraint_label
28
+ label
29
+ end
30
+
27
31
  def remove_href(path = search_state)
28
32
  view_context.search_action_path(path.reset_search(clause: path.clause_params.except(key)).to_h)
29
33
  end
@@ -125,6 +125,11 @@ module Blacklight
125
125
  configuration.view_config(:show)
126
126
  end
127
127
 
128
+ def inspect
129
+ fields = "document:#{document.inspect}"
130
+ "#<#{self.class.name}:#{object_id} #{fields}>"
131
+ end
132
+
128
133
  private
129
134
 
130
135
  def render_field?(field_config)
@@ -66,6 +66,14 @@ module Blacklight
66
66
  end
67
67
  end
68
68
 
69
+ # Get the displayable version of the facet's value for use
70
+ # in e.g. the constraints widget
71
+ #
72
+ # @return [String]
73
+ def constraint_label
74
+ label
75
+ end
76
+
69
77
  def value
70
78
  if facet_item.respond_to? :value
71
79
  facet_item.value
@@ -12,8 +12,7 @@
12
12
  <% end %>
13
13
 
14
14
  <% content_for(:container_header) do -%>
15
- <h1 class="sr-only visually-hidden top-content-title"><%= t('blacklight.search.header') %></h1>
16
-
15
+ <%= render 'search_results_header' %>
17
16
  <%= render 'constraints' %>
18
17
  <% end %>
19
18
 
@@ -0,0 +1 @@
1
+ <h1 class="sr-only visually-hidden top-content-title"><%= t('blacklight.search.header') %></h1>
data/blacklight.gemspec CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.add_dependency "deprecation"
33
33
  s.add_dependency "i18n", '>= 1.7.0' # added named parameters
34
34
  s.add_dependency "ostruct", '>= 0.3.2'
35
- s.add_dependency "view_component", '~> 2.43'
35
+ s.add_dependency "view_component", '~> 2.66'
36
36
  s.add_dependency 'hashdiff'
37
37
 
38
38
  s.add_development_dependency "rsolr", ">= 1.0.6", "< 3" # Library for interacting with rSolr.
@@ -3,6 +3,11 @@
3
3
  module Blacklight
4
4
  class Component < ViewComponent::Base
5
5
  class << self
6
+ # Workaround for https://github.com/ViewComponent/view_component/issues/1565
7
+ def config
8
+ @config ||= ViewComponent::Config.defaults.merge(ViewComponent::Base.config)
9
+ end
10
+
6
11
  # rubocop:disable Naming/MemoizedInstanceVariableName
7
12
  def compiler
8
13
  @__vc_compiler ||= EngineCompiler.new(self)
@@ -12,6 +17,21 @@ module Blacklight
12
17
  alias sidecar_files _sidecar_files unless ViewComponent::Base.respond_to? :sidecar_files
13
18
  end
14
19
 
20
+ EXCLUDE_VARIABLES = [
21
+ :@lookup_context, :@view_renderer, :@view_flow, :@view_context,
22
+ :@tag_builder, :@current_template,
23
+ :@__vc_set_slots, :@__vc_original_view_context,
24
+ :@__vc_variant, :@__vc_content_evaluated,
25
+ :@__vc_render_in_block, :@__vc_content, :@__vc_helpers
26
+ ].freeze
27
+
28
+ def inspect
29
+ # Exclude variables added by render_in
30
+ render_variables = instance_variables - EXCLUDE_VARIABLES
31
+ fields = render_variables.map { |ivar| "#{ivar}:#{instance_variable_get(ivar).inspect}" }.join(', ')
32
+ "#<#{self.class.name}:#{object_id} #{fields}>"
33
+ end
34
+
15
35
  class EngineCompiler < ::ViewComponent::Compiler
16
36
  # ViewComponent::Compiler locates and caches templates from sidecar files to the component source file.
17
37
  # While this is sensible in a Rails application, it prevents component templates defined in an Engine
data/lib/blacklight.rb CHANGED
@@ -60,11 +60,7 @@ module Blacklight
60
60
  end
61
61
 
62
62
  def self.connection_config
63
- Blacklight::RuntimeRegistry.connection_config ||= begin
64
- raise "The #{::Rails.env} environment settings were not found in the blacklight.yml config" unless blacklight_yml[::Rails.env]
65
-
66
- blacklight_yml[::Rails.env].symbolize_keys
67
- end
63
+ Blacklight::RuntimeRegistry.connection_config ||= blacklight_yml[::Rails.env]&.symbolize_keys if blacklight_yml?
68
64
  end
69
65
 
70
66
  def self.connection_config=(value)
@@ -86,7 +82,7 @@ module Blacklight
86
82
  require 'yaml'
87
83
 
88
84
  return @blacklight_yml if @blacklight_yml
89
- unless File.exist?(blacklight_config_file)
85
+ unless blacklight_yml?
90
86
  raise "You are missing a configuration file: #{blacklight_config_file}. Have you run \"rails generate blacklight:install\"?"
91
87
  end
92
88
 
@@ -113,6 +109,10 @@ module Blacklight
113
109
  @blacklight_yml
114
110
  end
115
111
 
112
+ def self.blacklight_yml?
113
+ File.exist?(blacklight_config_file)
114
+ end
115
+
116
116
  def self.logger
117
117
  @logger ||= begin
118
118
  ::Rails.logger if defined? Rails && Rails.respond_to?(:logger)
@@ -15,8 +15,6 @@ module Blacklight
15
15
  return unless Rails.version > '7'
16
16
 
17
17
  gem "sassc-rails", "~> 2.1"
18
-
19
- remove_file 'app/javascript/application.js'
20
18
  end
21
19
 
22
20
  # Add sprockets javascript if needed
@@ -37,7 +35,7 @@ module Blacklight
37
35
  # Remove the empty generated app/assets/images directory. Without doing this,
38
36
  # the default Sprockets 4 manifest will raise an exception.
39
37
  def appease_sprockets4
40
- return if !defined?(Sprockets::VERSION) || Sprockets::VERSION < '4'
38
+ return if !defined?(Sprockets::VERSION) || Sprockets::VERSION < '4' || using_importmap?
41
39
 
42
40
  append_to_file 'app/assets/config/manifest.js', "\n//= link application.js"
43
41
  empty_directory 'app/assets/images'
@@ -74,6 +72,14 @@ module Blacklight
74
72
 
75
73
  private
76
74
 
75
+ def root
76
+ @root ||= Pathname(destination_root)
77
+ end
78
+
79
+ def using_importmap?
80
+ @using_importmap ||= root.join('config/importmap.rb').exist?
81
+ end
82
+
77
83
  def turbolinks?
78
84
  @turbolinks ||= application_js.include?('turbolinks')
79
85
  end
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+
3
+ # Blacklight controller that handles searches and document requests
2
4
  class <%= controller_name.classify %>Controller < ApplicationController
3
5
 
4
6
  include Blacklight::Catalog
@@ -17,7 +17,7 @@
17
17
  </updateHandler>
18
18
 
19
19
  <!-- solr lib dirs -->
20
- <lib dir="${solr.install.dir:../../../..}/contrib/modules/lib" />
20
+ <lib dir="${solr.install.dir:../../../..}/modules/analysis-extras/lib" />
21
21
  <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib" />
22
22
  <lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" />
23
23
 
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+
3
+ # Represent a single document returned from Solr
2
4
  class <%= model_name.classify %>
3
5
  include Blacklight::Solr::Document
4
6
 
data/package.json CHANGED
@@ -28,7 +28,6 @@
28
28
  },
29
29
  "browserslist": "> 0.25%, not dead",
30
30
  "dependencies": {
31
- "bloodhound-js": "^1.2.3",
32
31
  "bootstrap": ">=4.3.1 <6.0.0",
33
32
  "jquery": "^3.5.1",
34
33
  "typeahead.js": "^0.11.1"
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Blacklight::SearchBarComponent, type: :component do
6
+ let(:instance) { described_class.new(url: search_action_url, params: params_for_search) }
7
+
8
+ let(:search_action_url) { '/catalog' }
9
+ let(:params_for_search) { { q: 'testParamValue' } }
10
+ let(:blacklight_config) do
11
+ Blacklight::Configuration.new.configure do |config|
12
+ config.view = { list: nil, abc: nil }
13
+ end
14
+ end
15
+
16
+ before do
17
+ allow(controller).to receive(:blacklight_config).and_return(blacklight_config)
18
+ end
19
+
20
+ context 'with the default button' do
21
+ subject(:render) { render_inline(instance) }
22
+
23
+ it 'renders the search field and a button' do
24
+ expect(render.css("input[aria-label='#{I18n.t('blacklight.search.form.search.label')}']")).to be_present
25
+ expect(render.css("button#search")).to be_present
26
+ end
27
+ end
28
+
29
+ context 'when a button is passed in' do
30
+ subject(:render) do
31
+ render_inline(instance) do |c|
32
+ c.search_button do
33
+ controller.view_context.tag.button "hello", id: 'custom_search'
34
+ end
35
+ end
36
+ end
37
+
38
+ it 'renders the search field and a button' do
39
+ expect(render.css("input[aria-label='#{I18n.t('blacklight.search.form.search.label')}']")).to be_present
40
+ expect(render.css("button#search")).not_to be_present
41
+ expect(render.css("button#custom_search")).to be_present
42
+ end
43
+ end
44
+
45
+ context 'with prepend' do
46
+ subject(:render) do
47
+ render_inline(instance) do |c|
48
+ c.with_prepend { 'stuff before' }
49
+ end
50
+ end
51
+
52
+ it 'renders the prepended value' do
53
+ expect(render.to_html).to include 'stuff before'
54
+ end
55
+ end
56
+
57
+ context 'with append' do
58
+ subject(:render) do
59
+ render_inline(instance) do |c|
60
+ c.with_append { 'stuff after' }
61
+ end
62
+ end
63
+
64
+ it 'renders the appended value' do
65
+ expect(render.to_html).to include 'stuff after'
66
+ end
67
+ end
68
+
69
+ context 'with extra inputs' do
70
+ subject(:render) do
71
+ render_inline(instance) do |c|
72
+ c.with_before_input_group { controller.view_context.tag.input name: 'foo' }
73
+ c.with_before_input_group { controller.view_context.tag.input name: 'bar' }
74
+ end
75
+ end
76
+
77
+ it 'renders the extra inputs' do
78
+ expect(render.css("input[name='foo']")).to be_present
79
+ expect(render.css("input[name='bar']")).to be_present
80
+ end
81
+ end
82
+ end
@@ -2,9 +2,14 @@
2
2
 
3
3
  RSpec.describe Blacklight::IconHelperBehavior do
4
4
  describe '#blacklight_icon' do
5
- it 'wraps the svg in a span with classes' do
6
- expect(helper.blacklight_icon(:search))
7
- .to have_css 'span.blacklight-icons svg'
5
+ subject(:icon) { helper.blacklight_icon(:search, classes: 'custom-class') }
6
+
7
+ it 'returns the svg' do
8
+ expect(icon).to have_css '.blacklight-icons svg'
9
+ end
10
+
11
+ it 'adds classes to the wrappering element' do
12
+ expect(icon).to have_css '.custom-class svg'
8
13
  end
9
14
  end
10
15
  end
@@ -243,7 +243,7 @@ RSpec.describe CatalogHelper do
243
243
  end
244
244
 
245
245
  it "calls thumbnail presenter with provided values" do
246
- expect(thumbnail_presenter).to receive(:thumbnail_tag).with({}, suppress_link: true)
246
+ expect(thumbnail_presenter).to receive(:thumbnail_tag).with({}, { suppress_link: true })
247
247
  helper.render_thumbnail_tag document, {}, suppress_link: true
248
248
  end
249
249
  end
@@ -8,7 +8,7 @@ RSpec.describe Blacklight::SuggestSearch, api: true do
8
8
 
9
9
  describe '#suggestions' do
10
10
  it 'delegates to the repository' do
11
- expect(repository).to receive(:suggestions).with(q: 'test').and_return(response)
11
+ expect(repository).to receive(:suggestions).with({ q: 'test' }).and_return(response)
12
12
  expect(suggest_search.suggestions).to eq response
13
13
  end
14
14
  end
@@ -29,6 +29,17 @@ RSpec.describe SolrDocument, api: true do
29
29
  end
30
30
  end
31
31
 
32
+ describe '.inspect' do
33
+ subject(:inspect) { document.inspect }
34
+
35
+ let(:document) do
36
+ described_class.new(id: '123',
37
+ title_tesim: ['Good Omens'])
38
+ end
39
+
40
+ it { is_expected.to end_with "_source: {\"id\"=>\"123\", \"title_tesim\"=>[\"Good Omens\"]}>" }
41
+ end
42
+
32
43
  describe '.attribute' do
33
44
  subject(:title) { document.title }
34
45
 
@@ -60,4 +60,10 @@ RSpec.describe Blacklight::DocumentPresenter do
60
60
  expect(presenter.thumbnail).to be_a_kind_of custom_presenter_class
61
61
  end
62
62
  end
63
+
64
+ describe '#inspect' do
65
+ subject(:inspect) { presenter.inspect }
66
+
67
+ it { is_expected.to start_with '#<Blacklight::DocumentPresenter:' }
68
+ end
63
69
  end
@@ -55,6 +55,13 @@ RSpec.describe Blacklight::FacetItemPresenter, type: :presenter do
55
55
  end
56
56
  end
57
57
 
58
+ describe '#constraint_label' do
59
+ it 'provides the label for the constraint' do
60
+ allow(facet_config).to receive_messages(query: nil, date: nil, helper_method: nil, url_method: nil)
61
+ expect(presenter.constraint_label).to eq presenter.label
62
+ end
63
+ end
64
+
58
65
  describe '#href' do
59
66
  before do
60
67
  allow(search_state).to receive(:has_facet?).and_return(false)
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.30.0
4
+ version: 7.32.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: 2022-10-03 00:00:00.000000000 Z
20
+ date: 2022-11-16 00:00:00.000000000 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: rails
@@ -129,14 +129,14 @@ dependencies:
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '2.43'
132
+ version: '2.66'
133
133
  type: :runtime
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '2.43'
139
+ version: '2.66'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: hashdiff
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -489,6 +489,7 @@ files:
489
489
  - app/components/blacklight/response/view_type_component.rb
490
490
  - app/components/blacklight/search_bar_component.html.erb
491
491
  - app/components/blacklight/search_bar_component.rb
492
+ - app/components/blacklight/search_button_component.rb
492
493
  - app/components/blacklight/search_context_component.html.erb
493
494
  - app/components/blacklight/search_context_component.rb
494
495
  - app/components/blacklight/search_history_constraint_layout_component.rb
@@ -555,6 +556,7 @@ files:
555
556
  - app/models/concerns/blacklight/user.rb
556
557
  - app/models/record_mailer.rb
557
558
  - app/models/search.rb
559
+ - app/models/search_builder.rb
558
560
  - app/models/solr_document.rb
559
561
  - app/presenters/blacklight/clause_presenter.rb
560
562
  - app/presenters/blacklight/document_presenter.rb
@@ -620,6 +622,7 @@ files:
620
622
  - app/views/catalog/_search_form.html.erb
621
623
  - app/views/catalog/_search_header.html.erb
622
624
  - app/views/catalog/_search_results.html.erb
625
+ - app/views/catalog/_search_results_header.html.erb
623
626
  - app/views/catalog/_search_sidebar.html.erb
624
627
  - app/views/catalog/_show.html.erb
625
628
  - app/views/catalog/_show_header.html.erb
@@ -790,6 +793,7 @@ files:
790
793
  - spec/components/blacklight/hidden_search_state_component_spec.rb
791
794
  - spec/components/blacklight/metadata_field_component_spec.rb
792
795
  - spec/components/blacklight/response/spellcheck_component_spec.rb
796
+ - spec/components/blacklight/search_bar_component_spec.rb
793
797
  - spec/components/blacklight/start_over_button_component_spec.rb
794
798
  - spec/components/blacklight/system/flash_message_component_spec.rb
795
799
  - spec/controllers/alternate_controller_spec.rb
@@ -950,7 +954,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
950
954
  - !ruby/object:Gem::Version
951
955
  version: '0'
952
956
  requirements: []
953
- rubygems_version: 3.2.32
957
+ rubygems_version: 3.3.7
954
958
  signing_key:
955
959
  specification_version: 4
956
960
  summary: Blacklight provides a discovery interface for any Solr (http://lucene.apache.org/solr)
@@ -971,6 +975,7 @@ test_files:
971
975
  - spec/components/blacklight/hidden_search_state_component_spec.rb
972
976
  - spec/components/blacklight/metadata_field_component_spec.rb
973
977
  - spec/components/blacklight/response/spellcheck_component_spec.rb
978
+ - spec/components/blacklight/search_bar_component_spec.rb
974
979
  - spec/components/blacklight/start_over_button_component_spec.rb
975
980
  - spec/components/blacklight/system/flash_message_component_spec.rb
976
981
  - spec/controllers/alternate_controller_spec.rb