blacklight 9.0.0.beta1 → 9.0.0.beta3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/.github/matrix.json +47 -0
  3. data/.github/workflows/build.yml +16 -0
  4. data/.github/workflows/lint.yml +25 -0
  5. data/.github/workflows/main.yml +22 -0
  6. data/.github/workflows/release_7_x_scheduled.yml +39 -0
  7. data/.github/workflows/release_8_x_scheduled.yml +39 -0
  8. data/.github/workflows/test.yml +53 -0
  9. data/.rubocop.yml +81 -3
  10. data/.rubocop_todo.yml +43 -67
  11. data/.solr_wrapper.yml +2 -0
  12. data/VERSION +1 -1
  13. data/app/assets/builds/blacklight.css +17 -18
  14. data/app/assets/javascripts/blacklight/blacklight.esm.js +43 -73
  15. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  16. data/app/assets/javascripts/blacklight/blacklight.js +43 -73
  17. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  18. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +0 -1
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +4 -0
  20. data/app/assets/stylesheets/blacklight/_facets.scss +2 -2
  21. data/app/assets/stylesheets/blacklight/_header.scss +4 -0
  22. data/app/assets/stylesheets/blacklight/_modal.scss +9 -8
  23. data/app/assets/stylesheets/blacklight/_pagination.scss +1 -3
  24. data/app/assets/stylesheets/blacklight/_search_history.scss +0 -4
  25. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +3 -0
  26. data/app/components/blacklight/advanced_search_form_component.rb +2 -2
  27. data/app/components/blacklight/constraint_layout_component.html.erb +1 -6
  28. data/app/components/blacklight/constraint_layout_component.rb +9 -0
  29. data/app/components/blacklight/constraints_component.rb +2 -2
  30. data/app/components/blacklight/document/action_component.rb +1 -3
  31. data/app/components/blacklight/document/bookmark_component.html.erb +2 -2
  32. data/app/components/blacklight/document/bookmark_component.rb +2 -2
  33. data/app/components/blacklight/document/more_like_this_component.rb +2 -2
  34. data/app/components/blacklight/document/page_header_component.rb +2 -2
  35. data/app/components/blacklight/document/thumbnail_component.html.erb +3 -7
  36. data/app/components/blacklight/document/thumbnail_component.rb +7 -6
  37. data/app/components/blacklight/document_component.html.erb +3 -3
  38. data/app/components/blacklight/document_component.rb +5 -5
  39. data/app/components/blacklight/document_title_component.rb +6 -10
  40. data/app/components/blacklight/facet_field_checkboxes_component.rb +4 -18
  41. data/app/components/blacklight/facet_field_component.rb +4 -15
  42. data/app/components/blacklight/facet_field_filter_component.rb +4 -19
  43. data/app/components/blacklight/facet_field_inclusive_constraint_component.rb +4 -23
  44. data/app/components/blacklight/facet_field_list_component.rb +4 -30
  45. data/app/components/blacklight/facet_field_no_layout_component.rb +4 -8
  46. data/app/components/blacklight/facet_field_pagination_component.html.erb +2 -2
  47. data/app/components/blacklight/facet_item_component.rb +4 -72
  48. data/app/components/blacklight/facet_item_pivot_component.rb +1 -1
  49. data/app/components/blacklight/facets/checkboxes_component.rb +26 -0
  50. data/app/components/blacklight/facets/count_component.rb +23 -0
  51. data/app/components/blacklight/{facet_field_component.html.erb → facets/field_component.html.erb} +1 -1
  52. data/app/components/blacklight/facets/field_component.rb +23 -0
  53. data/app/components/blacklight/facets/filters_component.html.erb +4 -0
  54. data/app/components/blacklight/facets/filters_component.rb +39 -0
  55. data/app/components/blacklight/{facet_field_inclusive_constraint_component.html.erb → facets/inclusive_constraint_component.html.erb} +1 -1
  56. data/app/components/blacklight/facets/inclusive_constraint_component.rb +31 -0
  57. data/app/components/blacklight/{facet_field_filter_component.html.erb → facets/index_navigation_component.html.erb} +1 -1
  58. data/app/components/blacklight/facets/index_navigation_component.rb +32 -0
  59. data/app/components/blacklight/facets/item_component.rb +73 -0
  60. data/app/components/blacklight/facets/list_component.html.erb +11 -0
  61. data/app/components/blacklight/facets/list_component.rb +40 -0
  62. data/app/components/blacklight/facets/no_layout_component.rb +16 -0
  63. data/app/components/blacklight/facets/selected_value_component.rb +29 -0
  64. data/app/components/blacklight/facets/suggest_component.html.erb +12 -0
  65. data/app/components/blacklight/facets/suggest_component.rb +22 -0
  66. data/app/components/blacklight/icons/remove_component.rb +2 -2
  67. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +2 -2
  68. data/app/components/blacklight/response/facet_group_component.html.erb +3 -3
  69. data/app/components/blacklight/response/facet_group_component.rb +9 -1
  70. data/app/components/blacklight/system/dropdown_component.html.erb +1 -1
  71. data/app/components/blacklight/system/dropdown_component.rb +1 -1
  72. data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
  73. data/app/components/blacklight/system/flash_message_component.rb +0 -9
  74. data/app/components/blacklight/system/modal_component.html.erb +1 -2
  75. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  76. data/app/controllers/concerns/blacklight/bookmarks.rb +3 -3
  77. data/app/controllers/concerns/blacklight/catalog.rb +16 -27
  78. data/app/controllers/concerns/blacklight/controller.rb +1 -1
  79. data/app/controllers/concerns/blacklight/facetable.rb +34 -0
  80. data/app/controllers/concerns/blacklight/search_context.rb +1 -1
  81. data/app/controllers/concerns/blacklight/searchable.rb +1 -1
  82. data/app/helpers/blacklight/catalog_helper_behavior.rb +1 -1
  83. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -2
  84. data/app/helpers/blacklight/document_helper_behavior.rb +3 -1
  85. data/app/helpers/blacklight/facets_helper_behavior.rb +9 -0
  86. data/app/helpers/blacklight/icon_helper_behavior.rb +2 -2
  87. data/app/javascript/blacklight-frontend/bookmark_toggle.js +7 -2
  88. data/app/javascript/blacklight-frontend/checkbox_submit.js +8 -1
  89. data/app/javascript/blacklight-frontend/debounce.js +1 -1
  90. data/app/javascript/blacklight-frontend/facet_suggest.js +23 -3
  91. data/app/javascript/blacklight-frontend/index.js +0 -2
  92. data/app/javascript/blacklight-frontend/modal.js +2 -6
  93. data/app/javascript/blacklight-frontend/search_context.js +3 -2
  94. data/app/models/facet_search_builder.rb +5 -0
  95. data/app/presenters/blacklight/facet_field_presenter.rb +1 -1
  96. data/app/presenters/blacklight/json_presenter.rb +8 -4
  97. data/app/presenters/blacklight/rendering/helper_method.rb +4 -4
  98. data/app/presenters/blacklight/rendering/join.rb +2 -2
  99. data/app/services/blacklight/facet_search_service.rb +44 -0
  100. data/app/services/blacklight/field_retriever.rb +1 -1
  101. data/app/services/blacklight/search_service.rb +6 -6
  102. data/app/values/blacklight/types.rb +2 -2
  103. data/app/views/catalog/_facet_pivot.html.erb +1 -1
  104. data/app/views/catalog/_home_text.html.erb +2 -2
  105. data/app/views/catalog/_sort_and_per_page.html.erb +1 -1
  106. data/app/views/catalog/facet.html.erb +8 -10
  107. data/config/locales/blacklight.ar.yml +14 -13
  108. data/config/locales/blacklight.ca.yml +1 -0
  109. data/config/locales/blacklight.de.yml +13 -12
  110. data/config/locales/blacklight.en.yml +1 -0
  111. data/config/locales/blacklight.es.yml +13 -12
  112. data/config/locales/blacklight.fr.yml +14 -13
  113. data/config/locales/blacklight.hu.yml +15 -14
  114. data/config/locales/blacklight.it.yml +15 -14
  115. data/config/locales/blacklight.nl.yml +13 -12
  116. data/config/locales/blacklight.pt-BR.yml +15 -14
  117. data/config/locales/blacklight.sq.yml +14 -13
  118. data/config/locales/blacklight.zh.yml +11 -10
  119. data/lib/blacklight/abstract_repository.rb +2 -2
  120. data/lib/blacklight/abstract_search_builder.rb +154 -0
  121. data/lib/blacklight/configuration/context.rb +3 -3
  122. data/lib/blacklight/configuration/facet_field.rb +6 -6
  123. data/lib/blacklight/configuration/field.rb +4 -4
  124. data/lib/blacklight/configuration/fields.rb +0 -1
  125. data/lib/blacklight/configuration/search_field.rb +1 -1
  126. data/lib/blacklight/configuration/view_config.rb +2 -2
  127. data/lib/blacklight/configuration.rb +9 -4
  128. data/lib/blacklight/facet_search_builder.rb +18 -0
  129. data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -1
  130. data/lib/blacklight/open_struct_with_hash_access.rb +2 -2
  131. data/lib/blacklight/search_builder.rb +1 -159
  132. data/lib/blacklight/search_state/filter_field.rb +4 -4
  133. data/lib/blacklight/search_state/pivot_filter_field.rb +4 -4
  134. data/lib/blacklight/solr/abstract_filter_query_builder.rb +77 -0
  135. data/lib/blacklight/solr/default_filter_query_builder.rb +20 -0
  136. data/lib/blacklight/solr/facet_search_builder_behavior.rb +62 -0
  137. data/lib/blacklight/solr/repository.rb +12 -10
  138. data/lib/blacklight/solr/response/facets.rb +2 -2
  139. data/lib/blacklight/solr/response/params.rb +0 -4
  140. data/lib/blacklight/solr/response.rb +5 -1
  141. data/lib/blacklight/solr/search_builder_behavior.rb +17 -132
  142. data/lib/blacklight.rb +6 -4
  143. data/lib/generators/blacklight/assets/importmap_generator.rb +3 -5
  144. data/lib/generators/blacklight/assets_generator.rb +1 -1
  145. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  146. data/lib/generators/blacklight/templates/.solr_wrapper.yml +2 -0
  147. data/lib/generators/blacklight/templates/catalog_controller.rb +5 -3
  148. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +0 -4
  149. data/package.json +3 -3
  150. data/spec/components/blacklight/advanced_search_form_component_spec.rb +18 -22
  151. data/spec/components/blacklight/constraint_layout_component_spec.rb +8 -8
  152. data/spec/components/blacklight/constraints_component_spec.rb +11 -11
  153. data/spec/components/blacklight/document/action_component_spec.rb +23 -15
  154. data/spec/components/blacklight/document/group_component_spec.rb +10 -15
  155. data/spec/components/blacklight/document/page_header_component_spec.rb +35 -28
  156. data/spec/components/blacklight/document/sidebar_component_spec.rb +5 -11
  157. data/spec/components/blacklight/document_component_spec.rb +98 -65
  158. data/spec/components/blacklight/facet_component_spec.rb +12 -8
  159. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +12 -12
  160. data/spec/components/blacklight/{facet_field_checkboxes_component_spec.rb → facets/checkboxes_component_spec.rb} +13 -13
  161. data/spec/components/blacklight/facets/filters_component_spec.rb +36 -0
  162. data/spec/components/blacklight/facets/index_navigation_component_spec.rb +40 -0
  163. data/spec/components/blacklight/{facet_item_component_spec.rb → facets/item_component_spec.rb} +10 -10
  164. data/spec/components/blacklight/{facet_field_list_component_spec.rb → facets/list_component_spec.rb} +23 -23
  165. data/spec/components/blacklight/facets/suggest_component_spec.rb +68 -0
  166. data/spec/components/blacklight/header_component_spec.rb +2 -4
  167. data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -7
  168. data/spec/components/blacklight/metadata_field_component_spec.rb +17 -15
  169. data/spec/components/blacklight/response/facet_group_component_spec.rb +37 -0
  170. data/spec/components/blacklight/response/pagination_component_spec.rb +1 -1
  171. data/spec/components/blacklight/response/spellcheck_component_spec.rb +1 -1
  172. data/spec/components/blacklight/search_bar_component_spec.rb +4 -4
  173. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +2 -2
  174. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +3 -5
  175. data/spec/components/blacklight/skip_link_component_spec.rb +8 -11
  176. data/spec/components/blacklight/start_over_button_component_spec.rb +4 -4
  177. data/spec/components/blacklight/system/dropdown_component_spec.rb +26 -0
  178. data/spec/components/blacklight/system/flash_message_component_spec.rb +7 -11
  179. data/spec/controllers/catalog_controller_spec.rb +12 -20
  180. data/spec/features/facets_spec.rb +70 -7
  181. data/spec/features/modal_spec.rb +1 -1
  182. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +10 -0
  183. data/spec/lib/blacklight/configuration/facet_field_spec.rb +2 -2
  184. data/spec/lib/blacklight/parameters_spec.rb +12 -1
  185. data/spec/lib/blacklight/search_state/filter_field_spec.rb +18 -0
  186. data/spec/models/blacklight/configuration_spec.rb +52 -28
  187. data/spec/models/blacklight/facet_search_builder_spec.rb +19 -0
  188. data/spec/models/blacklight/search_builder_spec.rb +1 -11
  189. data/spec/models/blacklight/solr/default_filter_query_builder_spec.rb +72 -0
  190. data/spec/models/blacklight/solr/document_spec.rb +0 -4
  191. data/spec/models/blacklight/solr/facet_search_builder_behavior_spec.rb +929 -0
  192. data/spec/models/blacklight/solr/repository_spec.rb +31 -29
  193. data/spec/models/blacklight/solr/response/facets_spec.rb +86 -40
  194. data/spec/models/blacklight/solr/response/group_response_spec.rb +8 -5
  195. data/spec/models/blacklight/solr/response/group_spec.rb +9 -5
  196. data/spec/models/blacklight/solr/response_spec.rb +96 -64
  197. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +2 -227
  198. data/spec/models/solr_document_spec.rb +5 -1
  199. data/spec/presenters/blacklight/json_presenter_spec.rb +17 -0
  200. data/spec/services/blacklight/search_service_spec.rb +6 -27
  201. data/spec/spec_helper.rb +0 -1
  202. data/spec/support/view_component_test_helpers.rb +0 -18
  203. data/spec/views/catalog/facet.html.erb_spec.rb +10 -3
  204. data/spec/views/catalog/index.atom.builder_spec.rb +6 -3
  205. data/spec/views/catalog/index.html.erb_spec.rb +3 -1
  206. metadata +57 -29
  207. data/.github/workflows/ruby.yml +0 -98
  208. data/app/assets/stylesheets/blacklight/_icons.scss +0 -4
  209. data/app/components/blacklight/facet_field_list_component.html.erb +0 -19
  210. data/app/components/blacklight/search/facet_suggest_input.html.erb +0 -9
  211. data/app/components/blacklight/search/facet_suggest_input.rb +0 -16
  212. data/app/javascript/blacklight-frontend/modalForm.js +0 -60
  213. data/app/views/catalog/_facet_index_navigation.html.erb +0 -1
  214. data/app/views/catalog/_facet_layout.html.erb +0 -8
  215. data/app/views/catalog/_facet_pagination.html.erb +0 -1
  216. data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
  217. data/spec/components/blacklight/search/facet_suggest_input_spec.rb +0 -33
  218. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +0 -43
  219. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +0 -41
  220. /data/app/components/blacklight/{facet_field_checkboxes_component.html.erb → facets/checkboxes_component.html.erb} +0 -0
@@ -9,19 +9,20 @@ 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(counter:, presenter: nil, document: nil, image_options: {})
12
+ def initialize(counter:, presenter: nil, image_options: {})
13
13
  @presenter = presenter
14
- @document = presenter&.document || document
15
14
  @counter = counter
16
15
  @image_options = { alt: '' }.merge(image_options)
17
16
  end
18
17
 
19
- def render?
20
- presenter.thumbnail.exists?
18
+ attr_accessor :presenter
19
+
20
+ def thumbnail_value
21
+ @thumbnail_value ||= presenter.thumbnail.render(@image_options)
21
22
  end
22
23
 
23
- def presenter
24
- @presenter ||= helpers.document_presenter(@document)
24
+ def render?
25
+ presenter.thumbnail && thumbnail_value
25
26
  end
26
27
  end
27
28
  end
@@ -1,11 +1,11 @@
1
1
  <%= content_tag @component,
2
2
  id: @id,
3
3
  data: {
4
- 'document-id': @document.id.to_s.parameterize,
5
- 'document-counter': @counter,
4
+ 'document-id': document.id.to_s.parameterize,
5
+ 'document-counter': counter,
6
6
  },
7
7
  itemscope: true,
8
- itemtype: @document.itemtype,
8
+ itemtype: document.itemtype,
9
9
  class: classes.flatten.join(' ') do %>
10
10
  <%= header %>
11
11
  <% if body.present? %>
@@ -36,7 +36,7 @@ module Blacklight
36
36
  renders_one :title, (lambda do |*args, component: nil, **kwargs|
37
37
  component ||= view_config.title_component || Blacklight::DocumentTitleComponent
38
38
 
39
- component.new(*args, counter: @counter, document: @document, presenter: @presenter, as: @title_component, actions: !@show, link_to_document: !@show, document_component: self, **kwargs)
39
+ component.new(*args, counter: @counter, presenter: @presenter, as: @title_component, actions: !@show, link_to_document: !@show, document_component: self, **kwargs)
40
40
  end)
41
41
 
42
42
  renders_one :embed, (lambda do |static_content = nil, *args, component: nil, **kwargs|
@@ -46,7 +46,7 @@ module Blacklight
46
46
 
47
47
  next unless component
48
48
 
49
- component.new(*args, document: @document, presenter: @presenter, document_counter: @document_counter, **kwargs)
49
+ component.new(*args, presenter: @presenter, document_counter: @document_counter, **kwargs)
50
50
  end)
51
51
 
52
52
  # The primary metadata section
@@ -66,7 +66,7 @@ module Blacklight
66
66
 
67
67
  component ||= view_config.thumbnail_component || Blacklight::Document::ThumbnailComponent
68
68
 
69
- component.new(*args, document: @document, presenter: @presenter, counter: @counter, image_options: image_options_or_static_content, **kwargs)
69
+ component.new(*args, presenter: @presenter, counter: @counter, image_options: image_options_or_static_content, **kwargs)
70
70
  end)
71
71
 
72
72
  # A container for partials rendered using the view config partials configuration. Its use is discouraged, but necessary until
@@ -126,7 +126,7 @@ module Blacklight
126
126
 
127
127
  view_partials.each do |view_partial|
128
128
  with_partial(view_partial) do
129
- helpers.render_document_partial @document, view_partial, component: self, document_counter: @counter
129
+ helpers.render_document_partial document, view_partial, component: self, document_counter: counter
130
130
  end
131
131
  end
132
132
  end
@@ -135,7 +135,7 @@ module Blacklight
135
135
 
136
136
  delegate :view_config, to: :@presenter
137
137
 
138
- attr_reader :document_counter, :presenter, :view_partials
138
+ attr_reader :document_counter, :counter, :document, :presenter, :view_partials
139
139
 
140
140
  def show?
141
141
  @show
@@ -7,12 +7,9 @@ module Blacklight
7
7
  renders_many :actions
8
8
 
9
9
  # rubocop:disable Metrics/ParameterLists
10
- def initialize(title = nil, document: nil, presenter: nil, as: :h3, counter: nil, classes: 'index_title document-title-heading col h5', link_to_document: true, document_component: nil,
10
+ def initialize(title = nil, presenter:, as: :h3, counter: nil, classes: 'index_title document-title-heading col h5', link_to_document: true, document_component: nil,
11
11
  actions: true)
12
- raise ArgumentError, 'missing keyword: :document or :presenter' if presenter.nil? && document.nil?
13
-
14
12
  @title = title
15
- @document = document
16
13
  @presenter = presenter
17
14
  @as = as || :h3
18
15
  @counter = counter
@@ -20,9 +17,14 @@ module Blacklight
20
17
  @link_to_document = link_to_document
21
18
  @document_component = document_component
22
19
  @actions = actions
20
+ @document = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(@presenter.document,
21
+ "Don't use the @document instance variable. Instead use @presenter",
22
+ ActiveSupport::Deprecation.new)
23
23
  end
24
24
  # rubocop:enable Metrics/ParameterLists
25
25
 
26
+ attr_accessor :presenter
27
+
26
28
  # Content for the document title area; should be an inline element
27
29
  def title
28
30
  if @link_to_document
@@ -53,11 +55,5 @@ module Blacklight
53
55
  t('blacklight.search.documents.counter', counter: @counter)
54
56
  end
55
57
  end
56
-
57
- private
58
-
59
- def presenter
60
- @presenter ||= helpers.document_presenter(@document)
61
- end
62
58
  end
63
59
  end
@@ -1,24 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetFieldCheckboxesComponent < Blacklight::Component
5
- def initialize(facet_field:, layout: nil)
6
- @facet_field = facet_field
7
- @layout = layout == false ? FacetFieldNoLayoutComponent : Blacklight::FacetFieldComponent
8
- end
9
-
10
- def render?
11
- presenters.any?
12
- end
13
-
14
- def presenters
15
- return [] unless @facet_field.paginator
16
-
17
- return to_enum(:presenters) unless block_given?
18
-
19
- @facet_field.paginator.items.each do |item|
20
- yield Blacklight::FacetCheckboxItemPresenter.new(item, @facet_field.facet_field, helpers, @facet_field.key, @facet_field.search_state)
21
- end
4
+ class FacetFieldCheckboxesComponent < Facets::CheckboxesComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetFieldCheckboxesComponent is deprecated. Use Blacklight::Facets::CheckboxesComponent instead.")
7
+ super
22
8
  end
23
9
  end
24
10
  end
@@ -1,21 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetFieldComponent < Blacklight::Component
5
- renders_one :label
6
- renders_one :body
7
-
8
- # @param [Blacklight::FacetFieldPresenter] facet_field
9
- def initialize(facet_field:)
10
- @facet_field = facet_field
11
- end
12
-
13
- def html_id
14
- "facet-#{@facet_field.key.parameterize}"
15
- end
16
-
17
- def header_html_id
18
- "#{html_id}-header"
4
+ class FacetFieldComponent < Facets::FieldComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetFieldComponent is deprecated. Use Blacklight::Facets::FacetFieldComponent instead.")
7
+ super
19
8
  end
20
9
  end
21
10
  end
@@ -1,25 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetFieldFilterComponent < Blacklight::Component
5
- def initialize(facet_field:)
6
- @facet_field = facet_field
7
- end
8
-
9
- def render?
10
- @facet_field.facet_field.index_range.any?
11
- end
12
-
13
- def prefix
14
- @facet_field.paginator.prefix
15
- end
16
-
17
- def clear_facet_prefix_url
18
- @facet_field.paginator.params_for_resort_url('index', @facet_field.search_state.to_h.except(@facet_field.paginator.request_keys[:prefix]))
19
- end
20
-
21
- def facet_prefix_url(letter)
22
- @facet_field.paginator.params_for_resort_url('index', @facet_field.search_state.to_h.merge(@facet_field.paginator.request_keys[:prefix] => letter))
4
+ class FacetFieldFilterComponent < Facets::IndexNavigationComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetFieldFilterComponent is deprecated. Use Blacklight::Facets::IndexNavigationComponent instead.")
7
+ super
23
8
  end
24
9
  end
25
10
  end
@@ -1,29 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetFieldInclusiveConstraintComponent < Blacklight::Component
5
- with_collection_parameter :facet_field
6
-
7
- def initialize(facet_field:, values: nil)
8
- @facet_field = facet_field
9
- @values = values
10
- end
11
-
12
- def values
13
- @values ||= @facet_field.values.find { |v| v.is_a? Array }
14
- @values || []
15
- end
16
-
17
- def render?
18
- values.present?
19
- end
20
-
21
- def presenters
22
- return to_enum(:presenters) unless block_given?
23
-
24
- values.each do |item|
25
- yield Blacklight::FacetGroupedItemPresenter.new(values, item, @facet_field.facet_field, helpers, @facet_field.key, @facet_field.search_state)
26
- end
4
+ class FacetFieldInclusiveConstraintComponent < Facets::InclusiveConstraintComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetFieldInclusiveConstraintComponent is deprecated. Use Blacklight::Facets::InclusiveConstraintComponent instead.")
7
+ super
27
8
  end
28
9
  end
29
10
  end
@@ -1,36 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetFieldListComponent < Blacklight::Component
5
- def initialize(facet_field:, layout: nil)
6
- @facet_field = facet_field
7
- @layout = layout == false ? FacetFieldNoLayoutComponent : Blacklight::FacetFieldComponent
8
- end
9
-
10
- def facet_items(wrapping_element: :li, **item_args)
11
- facet_item_component_class.with_collection(facet_item_presenters, wrapping_element: wrapping_element, **item_args)
12
- end
13
-
14
- def facet_item_presenters
15
- @facet_field.paginator.items.map do |item|
16
- facet_item_presenter(item)
17
- end
18
- end
19
-
20
- def render?
21
- @facet_field.paginator&.items&.any?
22
- end
23
-
24
- def facet_item_presenter(facet_item)
25
- facet_config.item_presenter.new(facet_item, facet_config, helpers, @facet_field.key)
26
- end
27
-
28
- def facet_item_component_class
29
- facet_config.item_component
30
- end
31
-
32
- def facet_config
33
- @facet_field.facet_field
4
+ class FacetFieldListComponent < Facets::ListComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetFieldListComponent is deprecated. Use Blacklight::Facets::ListComponent instead.")
7
+ super
34
8
  end
35
9
  end
36
10
  end
@@ -1,14 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetFieldNoLayoutComponent < Blacklight::Component
5
- renders_one :label
6
- renders_one :body
7
-
8
- def initialize(**); end
9
-
10
- def call
11
- body.to_s
4
+ class FacetFieldNoLayoutComponent < Facets::NoLayoutComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetFieldNoLayoutComponent is deprecated. Use Blacklight::Facets::NoLayoutComponent instead.")
7
+ super
12
8
  end
13
9
  end
14
10
  end
@@ -1,10 +1,10 @@
1
1
  <div class="prev_next_links btn-group">
2
2
  <%= helpers.link_to_previous_page @facet_field.paginator, raw(t('views.pagination.previous')), params: @facet_field.search_state.to_h, param_name: param_name, class: 'btn btn-link', data: { blacklight_modal: "preserve" } do %>
3
- <%= content_tag :span, raw(t('views.pagination.previous')), class: 'disabled btn' %>
3
+ <%= content_tag :a, raw(t('views.pagination.previous')), class: 'disabled btn btn-link text-decoration-none', aria: { disabled: true } %>
4
4
  <% end %>
5
5
 
6
6
  <%= helpers.link_to_next_page @facet_field.paginator, raw(t('views.pagination.next')), params: @facet_field.search_state.to_h, param_name: param_name, class: 'btn btn-link', data: { blacklight_modal: "preserve" } do %>
7
- <%= content_tag :span, raw(t('views.pagination.next')), class: 'disabled btn' %>
7
+ <%= content_tag :a, raw(t('views.pagination.next')), class: 'disabled btn btn-link text-decoration-none', aria: { disabled: true } %>
8
8
  <% end %>
9
9
  </div>
10
10
 
@@ -1,78 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class FacetItemComponent < Blacklight::Component
5
- attr_reader :label, :href, :hits
6
-
7
- with_collection_parameter :facet_item
8
-
9
- def initialize(facet_item:, wrapping_element: 'li', suppress_link: false)
10
- @facet_item = facet_item
11
- @label = facet_item.label
12
- @hits = facet_item.hits
13
- @href = facet_item.href
14
- @selected = facet_item.selected?
15
- @wrapping_element = wrapping_element
16
- @suppress_link = suppress_link
17
- end
18
-
19
- def call
20
- # if the downstream app has overridden the helper methods we'd usually call,
21
- # use the helpers to preserve compatibility
22
- content = if @selected
23
- render_selected_facet_value
24
- else
25
- render_facet_value
26
- end
27
-
28
- return '' if content.blank?
29
- return content unless @wrapping_element
30
-
31
- content_tag @wrapping_element, content
32
- end
33
-
34
- ##
35
- # Standard display of a facet value in a list. Used in both _facets sidebar
36
- # partial and catalog/facet expanded list. Will output facet value name as
37
- # a link to add that to your restrictions, with count in parens.
38
- #
39
- # @return [String]
40
- # @private
41
- def render_facet_value
42
- tag.span(class: "facet-label") do
43
- link_to_unless(@suppress_link, label, href, class: "facet-select", rel: "nofollow")
44
- end + render_facet_count
45
- end
46
-
47
- ##
48
- # Standard display of a SELECTED facet value (e.g. without a link and with a remove button)
49
- # @see #render_facet_value
50
- #
51
- # @private
52
- def render_selected_facet_value
53
- tag.span(class: "facet-label") do
54
- tag.span(label, class: "selected") +
55
- # remove link
56
- link_to(href, class: "remove", rel: "nofollow") do
57
- render(Blacklight::Icons::RemoveComponent.new(aria_hidden: true)) +
58
- tag.span(helpers.t(:'blacklight.search.facets.selected.remove'), class: 'visually-hidden')
59
- end
60
- end + render_facet_count(classes: ["selected"])
61
- end
62
-
63
- ##
64
- # Renders a count value for facet limits. Can be over-ridden locally
65
- # to change style. And can be called by plugins to get consistent display.
66
- #
67
- # @param [Hash] options
68
- # @option options [Array<String>] an array of classes to add to count span.
69
- # @return [String]
70
- # @private
71
- def render_facet_count(options = {})
72
- return '' if hits.blank?
73
-
74
- classes = (options[:classes] || []) << "facet-count"
75
- tag.span(t('blacklight.search.facets.count', number: number_with_delimiter(hits)), class: classes)
4
+ class FacetItemComponent < Facets::ItemComponent
5
+ def initialize(...)
6
+ Rails.logger.warn("Blacklight::FacetItemComponent is deprecated. Use Blacklight::Facets::ItemComponent instead.")
7
+ super
76
8
  end
77
9
  end
78
10
  end
@@ -28,7 +28,7 @@ module Blacklight
28
28
  end
29
29
 
30
30
  def call
31
- facet = Blacklight::FacetItemComponent.new(facet_item: @facet_item, wrapping_element: nil, suppress_link: @suppress_link)
31
+ facet = Blacklight::Facets::ItemComponent.new(facet_item: @facet_item, wrapping_element: nil, suppress_link: @suppress_link)
32
32
 
33
33
  id = "h-#{self.class.mint_id}" if @collapsing && has_items?
34
34
 
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ class CheckboxesComponent < Blacklight::Component
6
+ def initialize(facet_field:, layout: nil)
7
+ @facet_field = facet_field
8
+ @layout = layout == false ? Blacklight::Facets::NoLayoutComponent : Blacklight::Facets::FieldComponent
9
+ end
10
+
11
+ def render?
12
+ presenters.any?
13
+ end
14
+
15
+ def presenters
16
+ return [] unless @facet_field.paginator
17
+
18
+ return to_enum(:presenters) unless block_given?
19
+
20
+ @facet_field.paginator.items.each do |item|
21
+ yield Blacklight::FacetCheckboxItemPresenter.new(item, @facet_field.facet_field, helpers, @facet_field.key, @facet_field.search_state)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ # Display count of a facet value
6
+ class CountComponent < Blacklight::Component
7
+ def initialize(hits:, classes:)
8
+ @hits = hits
9
+ @classes = classes
10
+ end
11
+
12
+ attr_reader :hits, :classes
13
+
14
+ def render?
15
+ hits.present?
16
+ end
17
+
18
+ def call
19
+ tag.span(t('blacklight.search.facets.count', number: number_with_delimiter(hits)), class: classes)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -8,7 +8,7 @@
8
8
  data-target="#<%= html_id %>"
9
9
  data-bs-target="#<%= html_id %>"
10
10
  aria-expanded="<%= @facet_field.collapsed? ? 'false' : 'true' %>"
11
- arial-controls="<%= html_id %>"
11
+ aria-controls="<%= html_id %>"
12
12
  >
13
13
  <%= label %>
14
14
  </button>
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ class FieldComponent < Blacklight::Component
6
+ renders_one :label
7
+ renders_one :body
8
+
9
+ # @param [Blacklight::FacetFieldPresenter] facet_field
10
+ def initialize(facet_field:)
11
+ @facet_field = facet_field
12
+ end
13
+
14
+ def html_id
15
+ "facet-#{@facet_field.key.parameterize}"
16
+ end
17
+
18
+ def header_html_id
19
+ "#{html_id}-header"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,4 @@
1
+ <div class="<%= classes %>">
2
+ <%= suggestions %>
3
+ <%= index_navigation %>
4
+ </div>
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight::Facets
4
+ class FiltersComponent < Blacklight::Component
5
+ # @param [Blacklight::FacetFieldPresenter] presenter
6
+ def initialize(presenter:, classes: 'facet-filters card card-body bg-light p-3 mb-3 border-0',
7
+ suggestions_component: Blacklight::Facets::SuggestComponent,
8
+ index_navigation_component: Blacklight::Facets::IndexNavigationComponent)
9
+ @presenter = presenter
10
+ @classes = classes
11
+ @suggestions_component = suggestions_component
12
+ @index_navigation_component = index_navigation_component
13
+ end
14
+
15
+ def facet
16
+ @presenter.facet_field
17
+ end
18
+
19
+ attr_reader :classes, :presenter, :suggestions_component, :index_navigation_component
20
+
21
+ delegate :display_facet, to: :presenter
22
+
23
+ def render?
24
+ facet.suggest != false || render_index_navigation?
25
+ end
26
+
27
+ def render_index_navigation?
28
+ facet.index_range && display_facet.index?
29
+ end
30
+
31
+ def suggestions
32
+ render suggestions_component.new(presenter: presenter)
33
+ end
34
+
35
+ def index_navigation
36
+ render index_navigation_component.new(presenter: presenter)
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
1
  <div class="inclusive_or card card-body bg-light mb-3">
2
2
  <h5><%= t('blacklight.advanced_search.any_of') %></h5>
3
3
  <ul class="list-unstyled facet-values">
4
- <%= render(Blacklight::FacetItemComponent.with_collection(presenters.to_a)) %>
4
+ <%= render Blacklight::Facets::ItemComponent.with_collection(presenters.to_a) %>
5
5
  </ul>
6
6
  </div>
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ class InclusiveConstraintComponent < Blacklight::Component
6
+ with_collection_parameter :facet_field
7
+
8
+ def initialize(facet_field:, values: nil)
9
+ @facet_field = facet_field
10
+ @values = values
11
+ end
12
+
13
+ def values
14
+ @values ||= @facet_field.values.find { |v| v.is_a? Array }
15
+ @values || []
16
+ end
17
+
18
+ def render?
19
+ values.present?
20
+ end
21
+
22
+ def presenters
23
+ return to_enum(:presenters) unless block_given?
24
+
25
+ values.each do |item|
26
+ yield Blacklight::FacetGroupedItemPresenter.new(values, item, @facet_field.facet_field, helpers, @facet_field.key, @facet_field.search_state)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -3,7 +3,7 @@
3
3
  <li class="page-item <%= 'active' if prefix.blank? %>">
4
4
  <%= link_to t('blacklight.search.facets.all'), clear_facet_prefix_url, data: { blacklight_modal: "preserve" }, class: 'page-link' %>
5
5
  </li>
6
- <% @facet_field.facet_field.index_range.each do |letter| %>
6
+ <% index_range.each do |letter| %>
7
7
  <li class="page-item <%= 'active' if prefix == letter %>">
8
8
  <%= link_to(letter, facet_prefix_url(letter), class: 'page-link', data: { blacklight_modal: "preserve" }) %>
9
9
  </li>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ class IndexNavigationComponent < Blacklight::Component
6
+ # @params [Blacklight::FacetFieldPresenter] presenter
7
+ def initialize(presenter:)
8
+ @presenter = presenter
9
+ end
10
+
11
+ def render?
12
+ index_range && @presenter.display_facet.index?
13
+ end
14
+
15
+ def index_range
16
+ @presenter.facet_field.index_range
17
+ end
18
+
19
+ def prefix
20
+ @presenter.paginator.prefix
21
+ end
22
+
23
+ def clear_facet_prefix_url
24
+ @presenter.paginator.params_for_resort_url('index', @presenter.search_state.to_h.except(@presenter.paginator.request_keys[:prefix]))
25
+ end
26
+
27
+ def facet_prefix_url(letter)
28
+ @presenter.paginator.params_for_resort_url('index', @presenter.search_state.to_h.merge(@presenter.paginator.request_keys[:prefix] => letter))
29
+ end
30
+ end
31
+ end
32
+ end