blacklight 7.24.0 → 7.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +4 -4
  3. data/VERSION +1 -1
  4. data/app/assets/javascripts/blacklight/blacklight.js +2 -2
  5. data/app/components/blacklight/constraint_component.rb +1 -1
  6. data/app/components/blacklight/constraint_layout_component.rb +1 -1
  7. data/app/components/blacklight/constraints_component.rb +1 -1
  8. data/app/components/blacklight/document/action_component.rb +1 -1
  9. data/app/components/blacklight/document/actions_component.rb +1 -1
  10. data/app/components/blacklight/document/bookmark_component.rb +1 -1
  11. data/app/components/blacklight/document/citation_component.rb +2 -2
  12. data/app/components/blacklight/document/group_component.rb +3 -2
  13. data/app/components/blacklight/document/more_like_this_component.rb +1 -1
  14. data/app/components/blacklight/document/thumbnail_component.rb +1 -1
  15. data/app/components/blacklight/document_component.rb +1 -2
  16. data/app/components/blacklight/document_metadata_component.rb +1 -1
  17. data/app/components/blacklight/document_title_component.rb +1 -1
  18. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  19. data/app/components/blacklight/facet_field_component.rb +1 -1
  20. data/app/components/blacklight/facet_field_filter_component.rb +1 -1
  21. data/app/components/blacklight/facet_field_inclusive_constraint_component.rb +1 -1
  22. data/app/components/blacklight/facet_field_list_component.rb +1 -1
  23. data/app/components/blacklight/facet_field_no_layout_component.rb +1 -1
  24. data/app/components/blacklight/facet_field_pagination_component.rb +1 -1
  25. data/app/components/blacklight/facet_item_component.rb +1 -1
  26. data/app/components/blacklight/facet_item_pivot_component.rb +1 -1
  27. data/app/components/blacklight/hidden_search_state_component.rb +2 -2
  28. data/app/components/blacklight/metadata_field_component.rb +1 -1
  29. data/app/components/blacklight/metadata_field_layout_component.rb +1 -1
  30. data/app/components/blacklight/response/facet_group_component.rb +1 -1
  31. data/app/components/blacklight/response/pagination_component.rb +1 -1
  32. data/app/components/blacklight/search_bar_component.html.erb +7 -7
  33. data/app/components/blacklight/search_bar_component.rb +18 -13
  34. data/app/components/blacklight/search_context_component.rb +1 -1
  35. data/app/components/blacklight/start_over_button_component.rb +1 -1
  36. data/app/helpers/blacklight/blacklight_helper_behavior.rb +3 -1
  37. data/app/helpers/blacklight/catalog_helper_behavior.rb +1 -1
  38. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +5 -7
  39. data/app/javascript/blacklight/modal.js +2 -2
  40. data/app/presenters/blacklight/search_bar_presenter.rb +2 -0
  41. data/app/services/blacklight/field_retriever.rb +1 -1
  42. data/app/views/catalog/_constraints.html.erb +2 -2
  43. data/app/views/catalog/_facet_group.html.erb +1 -1
  44. data/app/views/catalog/_search_form.html.erb +2 -2
  45. data/app/views/shared/_header_navbar.html.erb +5 -1
  46. data/lib/blacklight/component.rb +40 -0
  47. data/lib/blacklight/configuration/facet_field.rb +1 -1
  48. data/lib/blacklight/configuration/fields.rb +10 -11
  49. data/lib/blacklight/configuration/view_config.rb +6 -0
  50. data/lib/blacklight/configuration.rb +320 -179
  51. data/lib/blacklight/deprecations/search_state_normalization.rb +52 -0
  52. data/lib/blacklight/search_state/filter_field.rb +44 -16
  53. data/lib/blacklight/search_state.rb +55 -31
  54. data/lib/blacklight/solr/search_builder_behavior.rb +3 -1
  55. data/lib/blacklight.rb +1 -0
  56. data/package.json +1 -1
  57. data/spec/components/blacklight/constraints_component_spec.rb +14 -1
  58. data/spec/components/blacklight/facet_field_list_component_spec.rb +6 -1
  59. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +7 -1
  60. data/spec/controllers/blacklight/base_spec.rb +4 -1
  61. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +23 -6
  62. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +7 -0
  63. data/spec/lib/blacklight/component_spec.rb +43 -0
  64. data/spec/lib/blacklight/search_state/filter_field_spec.rb +12 -1
  65. data/spec/lib/blacklight/search_state_spec.rb +17 -3
  66. data/spec/models/blacklight/configuration_spec.rb +2 -2
  67. data/spec/models/blacklight/solr/search_builder_spec.rb +15 -0
  68. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +10 -4
  69. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +6 -1
  70. data/spec/presenters/blacklight/field_presenter_spec.rb +2 -0
  71. data/spec/views/catalog/index.json.jbuilder_spec.rb +1 -0
  72. metadata +7 -3
@@ -13,6 +13,10 @@
13
13
 
14
14
  <%= content_tag :div, class: 'navbar-search navbar navbar-light bg-light', role: 'navigation', aria: { label: t('blacklight.search.header') } do %>
15
15
  <div class="<%= container_classes %>">
16
- <%= render_search_bar %>
16
+ <%= render((blacklight_config&.view_config(document_index_view_type)&.search_bar_component ||Blacklight::SearchBarComponent).new(
17
+ url: search_action_url,
18
+ advanced_search_url: search_action_url(action: 'advanced_search'),
19
+ params: search_state.params_for_search.except(:qt),
20
+ autocomplete_path: search_action_path(action: :suggest))) %>
17
21
  </div>
18
22
  <% end %>
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class Component < ViewComponent::Base
5
+ class << self
6
+ # rubocop:disable Naming/MemoizedInstanceVariableName
7
+ def compiler
8
+ @__vc_compiler ||= EngineCompiler.new(self)
9
+ end
10
+ # rubocop:enable Naming/MemoizedInstanceVariableName
11
+ end
12
+
13
+ class EngineCompiler < ::ViewComponent::Compiler
14
+ # ViewComponent::Compiler locates and caches templates from sidecar files to the component source file.
15
+ # While this is sensible in a Rails application, it prevents component templates defined in an Engine
16
+ # from being overridden by an installing application without subclassing the component, which may also
17
+ # require modifying any partials rendering the component. This subclass of compiler overrides the template
18
+ # location algorithm to take the sidecar file names from the Engine, but look to see if a file of the
19
+ # same name existing in the installing application (ie, under Rails.root). If the latter exists, this
20
+ # compiler will cache that template instead of the engine-defined file; if not, the compiler will fall
21
+ # back to the engine-defined file.
22
+ def templates
23
+ @templates ||= begin
24
+ extensions = ActionView::Template.template_handler_extensions
25
+
26
+ component_class._sidecar_files(extensions).each_with_object([]) do |path, memo|
27
+ pieces = File.basename(path).split(".")
28
+ app_path = "#{Rails.root}/#{path.slice(path.index(component_class.view_component_path)..-1)}"
29
+
30
+ memo << {
31
+ path: File.exist?(app_path) ? app_path : path,
32
+ variant: pieces.second.split("+").second&.to_sym,
33
+ handler: pieces.last
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -47,7 +47,7 @@ module Blacklight
47
47
  # @!attribute pivot
48
48
  # @return []
49
49
  # @!attribute filter_query_builder
50
- # @return [nil, #call] a Proc (or other object responding to #call) that receives as parameters: 1) the search builder, 2) this facet config
50
+ # @return [nil, #call] a Proc (or other object responding to #call) that receives as parameters: 1) the search builder, 2) the Blacklight::FilterField instance
51
51
  # and 3) the solr parameters hash. The Proc returns a string suitable for e.g. Solr's fq parameter, or a 2-element array of the string and a hash of additional
52
52
  # parameters to include with the query (i.e. for referenced subqueries); note that implementations are responsible for ensuring
53
53
  # the additional parameter keys are unique.
@@ -10,18 +10,13 @@ module Blacklight
10
10
 
11
11
  class_methods do
12
12
  # Add a configuration block for a collection of solr fields
13
- def define_field_access(key, options = {})
13
+ def define_field_access(key, base_class_name = nil, class: nil)
14
14
  key = key.to_s if respond_to? :to_s
15
15
 
16
16
  default_values[key.pluralize.to_sym] = ActiveSupport::OrderedHash.new
17
17
 
18
- base_class_name = options.fetch(:class, Field)
19
-
20
- unless const_defined? key.camelcase
21
- class_eval <<-END_EVAL, __FILE__, __LINE__ + 1
22
- class #{key.camelcase} < #{base_class_name}; end
23
- END_EVAL
24
- end
18
+ @field_type_for_class ||= {}
19
+ @field_type_for_class[key] = binding.local_variable_get(:class) || base_class_name
25
20
 
26
21
  class_eval <<-END_EVAL, __FILE__, __LINE__ + 1
27
22
  def add_#{key}(*args, &block)
@@ -29,8 +24,11 @@ module Blacklight
29
24
  end
30
25
  END_EVAL
31
26
  end
32
- end
33
27
 
28
+ def field_type_for_class(key)
29
+ @field_type_for_class&.dig(key.to_s) || Blacklight::Configuration::Field
30
+ end
31
+ end
34
32
  # Add a solr field configuration to the given configuration key
35
33
  #
36
34
  # The recommended and strongly encouraged format is a field name, configuration pair, e.g.:
@@ -198,8 +196,9 @@ module Blacklight
198
196
  end
199
197
 
200
198
  # convert a config key to the appropriate Field class
201
- def field_class_from_key key
202
- "Blacklight::Configuration::#{key.camelcase}".constantize
199
+ # @param [String] key
200
+ def field_class_from_key(key)
201
+ self.class.field_type_for_class(key)
203
202
  end
204
203
  end
205
204
  end
@@ -17,6 +17,12 @@ class Blacklight::Configuration
17
17
  # @return [String, Symbol] icon file to use in the view picker
18
18
  # @!attribute document_actions
19
19
  # @return [NestedOpenStructWithHashAccess{Symbol => Blacklight::Configuration::ToolConfig}] 'tools' to render for each document
20
+ # @!attribute facet_group_component
21
+ # @return [Class] component class used to render a facet group
22
+ # @!attribute constraints_component
23
+ # @return [Class] component class used to render the constraints
24
+ # @!attribute search_bar_component
25
+ # @return [Class] component class used to render the search bar
20
26
  def search_bar_presenter_class
21
27
  super || Blacklight::SearchBarPresenter
22
28
  end