blacklight 9.0.0.beta1 → 9.0.0

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 (263) hide show
  1. checksums.yaml +4 -4
  2. data/.docker/app/Dockerfile +2 -1
  3. data/.github/matrix.json +55 -0
  4. data/.github/workflows/build.yml +16 -0
  5. data/.github/workflows/lint.yml +25 -0
  6. data/.github/workflows/main.yml +22 -0
  7. data/.github/workflows/release_7_x_scheduled.yml +39 -0
  8. data/.github/workflows/release_8_x_scheduled.yml +39 -0
  9. data/.github/workflows/test.yml +53 -0
  10. data/.rubocop.yml +81 -3
  11. data/.rubocop_todo.yml +46 -71
  12. data/.solr_wrapper.yml +3 -1
  13. data/README.md +2 -2
  14. data/VERSION +1 -1
  15. data/app/assets/builds/blacklight.css +51 -38
  16. data/app/assets/javascripts/blacklight/blacklight.esm.js +62 -77
  17. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  18. data/app/assets/javascripts/blacklight/blacklight.js +62 -77
  19. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  20. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +0 -1
  21. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +4 -0
  22. data/app/assets/stylesheets/blacklight/_facets.scss +37 -29
  23. data/app/assets/stylesheets/blacklight/_header.scss +4 -0
  24. data/app/assets/stylesheets/blacklight/_modal.scss +9 -8
  25. data/app/assets/stylesheets/blacklight/_pagination.scss +1 -3
  26. data/app/assets/stylesheets/blacklight/_search_history.scss +0 -4
  27. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +3 -0
  28. data/app/components/blacklight/advanced_search_form_component.html.erb +4 -4
  29. data/app/components/blacklight/advanced_search_form_component.rb +6 -5
  30. data/app/components/blacklight/constraint_component.html.erb +1 -5
  31. data/app/components/blacklight/constraint_component.rb +11 -0
  32. data/app/components/blacklight/constraint_layout_component.html.erb +1 -6
  33. data/app/components/blacklight/constraint_layout_component.rb +9 -0
  34. data/app/components/blacklight/constraints_component.html.erb +3 -8
  35. data/app/components/blacklight/constraints_component.rb +59 -14
  36. data/app/components/blacklight/document/action_component.rb +1 -3
  37. data/app/components/blacklight/document/bookmark_component.html.erb +3 -3
  38. data/app/components/blacklight/document/bookmark_component.rb +10 -4
  39. data/app/components/blacklight/document/group_component.html.erb +1 -1
  40. data/app/components/blacklight/document/more_like_this_component.rb +2 -2
  41. data/app/components/blacklight/document/page_header_component.rb +3 -3
  42. data/app/components/blacklight/document/thumbnail_component.html.erb +3 -7
  43. data/app/components/blacklight/document/thumbnail_component.rb +7 -6
  44. data/app/components/blacklight/document_component.html.erb +3 -3
  45. data/app/components/blacklight/document_component.rb +22 -26
  46. data/app/components/blacklight/document_title_component.rb +6 -10
  47. data/app/components/blacklight/facet_field_checkboxes_component.rb +4 -18
  48. data/app/components/blacklight/facet_field_component.rb +4 -15
  49. data/app/components/blacklight/facet_field_filter_component.rb +4 -19
  50. data/app/components/blacklight/facet_field_inclusive_constraint_component.rb +4 -23
  51. data/app/components/blacklight/facet_field_list_component.rb +4 -30
  52. data/app/components/blacklight/facet_field_no_layout_component.rb +4 -8
  53. data/app/components/blacklight/facet_field_pagination_component.html.erb +2 -2
  54. data/app/components/blacklight/facet_item_component.rb +4 -72
  55. data/app/components/blacklight/facet_item_pivot_component.rb +8 -4
  56. data/app/components/blacklight/{facet_field_checkboxes_component.html.erb → facets/checkboxes_component.html.erb} +4 -4
  57. data/app/components/blacklight/facets/checkboxes_component.rb +26 -0
  58. data/app/components/blacklight/facets/count_component.rb +23 -0
  59. data/app/components/blacklight/{facet_field_component.html.erb → facets/field_component.html.erb} +1 -3
  60. data/app/components/blacklight/facets/field_component.rb +23 -0
  61. data/app/components/blacklight/facets/filters_component.html.erb +4 -0
  62. data/app/components/blacklight/facets/filters_component.rb +39 -0
  63. data/app/components/blacklight/{facet_field_inclusive_constraint_component.html.erb → facets/inclusive_constraint_component.html.erb} +1 -1
  64. data/app/components/blacklight/facets/inclusive_constraint_component.rb +31 -0
  65. data/app/components/blacklight/{facet_field_filter_component.html.erb → facets/index_navigation_component.html.erb} +1 -1
  66. data/app/components/blacklight/facets/index_navigation_component.rb +32 -0
  67. data/app/components/blacklight/facets/item_component.rb +76 -0
  68. data/app/components/blacklight/facets/list_component.html.erb +11 -0
  69. data/app/components/blacklight/facets/list_component.rb +46 -0
  70. data/app/components/blacklight/facets/no_layout_component.rb +16 -0
  71. data/app/components/blacklight/facets/pivot_list_component.rb +14 -0
  72. data/app/components/blacklight/facets/selected_value_component.rb +29 -0
  73. data/app/components/blacklight/facets/suggest_component.html.erb +17 -0
  74. data/app/components/blacklight/facets/suggest_component.rb +21 -0
  75. data/app/components/blacklight/header_component.rb +2 -2
  76. data/app/components/blacklight/icons/remove_component.rb +2 -2
  77. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  78. data/app/components/blacklight/metadata_field_component.rb +2 -1
  79. data/app/components/blacklight/metadata_field_layout_component.rb +9 -4
  80. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +2 -2
  81. data/app/components/blacklight/response/facet_group_component.html.erb +3 -3
  82. data/app/components/blacklight/response/facet_group_component.rb +9 -1
  83. data/app/components/blacklight/search_bar_component.html.erb +2 -2
  84. data/app/components/blacklight/system/dropdown_component.html.erb +1 -1
  85. data/app/components/blacklight/system/dropdown_component.rb +1 -1
  86. data/app/components/blacklight/system/flash_message_component.html.erb +1 -1
  87. data/app/components/blacklight/system/flash_message_component.rb +0 -9
  88. data/app/components/blacklight/system/modal_component.html.erb +1 -2
  89. data/app/components/blacklight/top_navbar_component.html.erb +2 -2
  90. data/app/controllers/concerns/blacklight/bookmarks.rb +13 -3
  91. data/app/controllers/concerns/blacklight/catalog.rb +27 -30
  92. data/app/controllers/concerns/blacklight/controller.rb +1 -1
  93. data/app/controllers/concerns/blacklight/search_context.rb +1 -1
  94. data/app/controllers/concerns/blacklight/searchable.rb +1 -1
  95. data/app/helpers/blacklight/catalog_helper_behavior.rb +5 -3
  96. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -2
  97. data/app/helpers/blacklight/document_helper_behavior.rb +3 -1
  98. data/app/helpers/blacklight/facets_helper_behavior.rb +7 -12
  99. data/app/helpers/blacklight/icon_helper_behavior.rb +2 -2
  100. data/app/javascript/blacklight-frontend/bookmark_toggle.js +7 -2
  101. data/app/javascript/blacklight-frontend/button_focus.js +1 -1
  102. data/app/javascript/blacklight-frontend/checkbox_submit.js +9 -2
  103. data/app/javascript/blacklight-frontend/debounce.js +1 -1
  104. data/app/javascript/blacklight-frontend/facet_suggest.js +27 -3
  105. data/app/javascript/blacklight-frontend/index.js +0 -2
  106. data/app/javascript/blacklight-frontend/modal.js +15 -8
  107. data/app/javascript/blacklight-frontend/search_context.js +3 -2
  108. data/app/presenters/blacklight/constraint_presenter.rb +22 -0
  109. data/app/presenters/blacklight/document_presenter.rb +6 -5
  110. data/app/presenters/blacklight/facet_field_presenter.rb +18 -2
  111. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +6 -0
  112. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +1 -5
  113. data/app/presenters/blacklight/facet_item_presenter.rb +5 -18
  114. data/app/presenters/blacklight/field_presenter.rb +4 -2
  115. data/app/presenters/blacklight/json_presenter.rb +8 -4
  116. data/app/presenters/blacklight/rendering/abstract_step.rb +7 -1
  117. data/app/presenters/blacklight/rendering/helper_method.rb +4 -4
  118. data/app/presenters/blacklight/rendering/join.rb +11 -7
  119. data/app/presenters/blacklight/rendering/terminator.rb +1 -1
  120. data/app/services/blacklight/field_retriever.rb +1 -1
  121. data/app/services/blacklight/search_service.rb +10 -8
  122. data/app/values/blacklight/types.rb +2 -2
  123. data/app/views/blacklight/nav/_bookmark.html.erb +1 -1
  124. data/app/views/catalog/_document.atom.builder +1 -1
  125. data/app/views/catalog/_document.html.erb +1 -1
  126. data/app/views/catalog/_email_form.html.erb +4 -4
  127. data/app/views/catalog/_home_text.html.erb +2 -2
  128. data/app/views/catalog/_show_main_content.html.erb +9 -5
  129. data/app/views/catalog/_sms_form.html.erb +4 -4
  130. data/app/views/catalog/_sort_and_per_page.html.erb +1 -1
  131. data/app/views/catalog/advanced_search.html.erb +1 -1
  132. data/app/views/catalog/facet.html.erb +8 -10
  133. data/app/views/catalog/index.html.erb +0 -1
  134. data/app/views/catalog/index.json.jbuilder +5 -3
  135. data/app/views/catalog/show.html.erb +2 -2
  136. data/app/views/layouts/blacklight/base.html.erb +1 -1
  137. data/blacklight.gemspec +1 -1
  138. data/config/locales/blacklight.ar.yml +14 -14
  139. data/config/locales/blacklight.ca.yml +2 -2
  140. data/config/locales/blacklight.de.yml +13 -13
  141. data/config/locales/blacklight.en.yml +3 -3
  142. data/config/locales/blacklight.es.yml +13 -13
  143. data/config/locales/blacklight.fr.yml +14 -14
  144. data/config/locales/blacklight.hu.yml +15 -15
  145. data/config/locales/blacklight.it.yml +16 -16
  146. data/config/locales/blacklight.nl.yml +13 -13
  147. data/config/locales/blacklight.pt-BR.yml +15 -15
  148. data/config/locales/blacklight.sq.yml +14 -14
  149. data/config/locales/blacklight.zh.yml +12 -12
  150. data/lib/blacklight/abstract_repository.rb +2 -2
  151. data/lib/blacklight/component.rb +7 -1
  152. data/lib/blacklight/configuration/context.rb +3 -3
  153. data/lib/blacklight/configuration/facet_field.rb +11 -6
  154. data/lib/blacklight/configuration/field.rb +4 -4
  155. data/lib/blacklight/configuration/fields.rb +0 -1
  156. data/lib/blacklight/configuration/search_field.rb +1 -1
  157. data/lib/blacklight/configuration/view_config.rb +32 -18
  158. data/lib/blacklight/configuration.rb +64 -10
  159. data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -1
  160. data/lib/blacklight/open_struct_with_hash_access.rb +2 -2
  161. data/lib/blacklight/routes/searchable.rb +1 -1
  162. data/lib/blacklight/search_builder.rb +2 -1
  163. data/lib/blacklight/search_state/filter_field.rb +4 -4
  164. data/lib/blacklight/search_state/pivot_filter_field.rb +5 -5
  165. data/lib/blacklight/search_state.rb +2 -0
  166. data/lib/blacklight/solr/abstract_filter_query_builder.rb +77 -0
  167. data/lib/blacklight/solr/default_filter_query_builder.rb +20 -0
  168. data/lib/blacklight/solr/field_reflection_search_builder.rb +11 -0
  169. data/lib/blacklight/solr/repository.rb +17 -15
  170. data/lib/blacklight/solr/response/facets.rb +2 -2
  171. data/lib/blacklight/solr/response/params.rb +0 -4
  172. data/lib/blacklight/solr/response.rb +5 -1
  173. data/lib/blacklight/solr/search_builder_behavior.rb +48 -97
  174. data/lib/blacklight/solr/single_doc_search_builder.rb +25 -0
  175. data/lib/blacklight.rb +6 -4
  176. data/lib/generators/blacklight/assets/importmap_generator.rb +3 -5
  177. data/lib/generators/blacklight/assets_generator.rb +1 -1
  178. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  179. data/lib/generators/blacklight/templates/.solr_wrapper.yml +3 -1
  180. data/lib/generators/blacklight/templates/catalog_controller.rb +34 -8
  181. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +0 -71
  182. data/package.json +3 -3
  183. data/spec/components/blacklight/advanced_search_form_component_spec.rb +18 -22
  184. data/spec/components/blacklight/constraint_layout_component_spec.rb +8 -8
  185. data/spec/components/blacklight/constraints_component_spec.rb +11 -11
  186. data/spec/components/blacklight/document/action_component_spec.rb +23 -15
  187. data/spec/components/blacklight/document/group_component_spec.rb +10 -15
  188. data/spec/components/blacklight/document/page_header_component_spec.rb +35 -28
  189. data/spec/components/blacklight/document/sidebar_component_spec.rb +5 -11
  190. data/spec/components/blacklight/document_component_spec.rb +105 -79
  191. data/spec/components/blacklight/facet_component_spec.rb +12 -8
  192. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +12 -12
  193. data/spec/components/blacklight/{facet_field_checkboxes_component_spec.rb → facets/checkboxes_component_spec.rb} +13 -13
  194. data/spec/components/blacklight/facets/filters_component_spec.rb +36 -0
  195. data/spec/components/blacklight/facets/index_navigation_component_spec.rb +41 -0
  196. data/spec/components/blacklight/{facet_item_component_spec.rb → facets/item_component_spec.rb} +10 -10
  197. data/spec/components/blacklight/{facet_field_list_component_spec.rb → facets/list_component_spec.rb} +34 -23
  198. data/spec/components/blacklight/facets/pivot_list_component_spec.rb +53 -0
  199. data/spec/components/blacklight/facets/suggest_component_spec.rb +82 -0
  200. data/spec/components/blacklight/header_component_spec.rb +2 -4
  201. data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -7
  202. data/spec/components/blacklight/metadata_field_component_spec.rb +17 -15
  203. data/spec/components/blacklight/response/facet_group_component_spec.rb +37 -0
  204. data/spec/components/blacklight/response/pagination_component_spec.rb +1 -1
  205. data/spec/components/blacklight/response/spellcheck_component_spec.rb +1 -1
  206. data/spec/components/blacklight/search_bar_component_spec.rb +28 -5
  207. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +2 -2
  208. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +3 -5
  209. data/spec/components/blacklight/skip_link_component_spec.rb +8 -11
  210. data/spec/components/blacklight/start_over_button_component_spec.rb +4 -4
  211. data/spec/components/blacklight/system/dropdown_component_spec.rb +26 -0
  212. data/spec/components/blacklight/system/flash_message_component_spec.rb +7 -11
  213. data/spec/controllers/blacklight/catalog_spec.rb +1 -1
  214. data/spec/controllers/catalog_controller_spec.rb +12 -20
  215. data/spec/features/advanced_search_spec.rb +42 -21
  216. data/spec/features/facets_spec.rb +84 -12
  217. data/spec/features/modal_spec.rb +1 -1
  218. data/spec/features/search_filters_spec.rb +6 -4
  219. data/spec/features/search_spec.rb +3 -3
  220. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +10 -0
  221. data/spec/lib/blacklight/configuration/facet_field_spec.rb +2 -2
  222. data/spec/lib/blacklight/parameters_spec.rb +12 -1
  223. data/spec/lib/blacklight/search_state/filter_field_spec.rb +18 -0
  224. data/spec/models/blacklight/configuration_spec.rb +178 -28
  225. data/spec/models/blacklight/solr/default_filter_query_builder_spec.rb +72 -0
  226. data/spec/models/blacklight/solr/document_spec.rb +0 -4
  227. data/spec/models/blacklight/solr/repository_spec.rb +37 -29
  228. data/spec/models/blacklight/solr/response/facets_spec.rb +86 -40
  229. data/spec/models/blacklight/solr/response/group_response_spec.rb +8 -5
  230. data/spec/models/blacklight/solr/response/group_spec.rb +9 -5
  231. data/spec/models/blacklight/solr/response_spec.rb +96 -64
  232. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +38 -57
  233. data/spec/models/solr_document_spec.rb +5 -1
  234. data/spec/presenters/blacklight/constraint_presenter_spec.rb +32 -0
  235. data/spec/presenters/blacklight/document_presenter_spec.rb +3 -3
  236. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +0 -7
  237. data/spec/presenters/blacklight/field_presenter_spec.rb +103 -22
  238. data/spec/presenters/blacklight/json_presenter_spec.rb +17 -0
  239. data/spec/presenters/blacklight/rendering/pipeline_spec.rb +130 -14
  240. data/spec/services/blacklight/search_service_spec.rb +6 -27
  241. data/spec/spec_helper.rb +0 -1
  242. data/spec/support/presenter_test_helpers.rb +1 -1
  243. data/spec/support/view_component_test_helpers.rb +0 -18
  244. data/spec/views/catalog/facet.html.erb_spec.rb +10 -3
  245. data/spec/views/catalog/index.atom.builder_spec.rb +8 -3
  246. data/spec/views/catalog/index.html.erb_spec.rb +3 -1
  247. metadata +69 -38
  248. data/.github/workflows/ruby.yml +0 -98
  249. data/app/assets/stylesheets/blacklight/_icons.scss +0 -4
  250. data/app/components/blacklight/facet_field_list_component.html.erb +0 -19
  251. data/app/components/blacklight/search/facet_suggest_input.html.erb +0 -9
  252. data/app/components/blacklight/search/facet_suggest_input.rb +0 -16
  253. data/app/javascript/blacklight-frontend/modalForm.js +0 -60
  254. data/app/views/catalog/_facet_index_navigation.html.erb +0 -1
  255. data/app/views/catalog/_facet_layout.html.erb +0 -8
  256. data/app/views/catalog/_facet_pagination.html.erb +0 -1
  257. data/app/views/catalog/_facet_pivot.html.erb +0 -3
  258. data/app/views/shared/_sitelinks_search_box.html.erb +0 -12
  259. data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
  260. data/spec/components/blacklight/search/facet_suggest_input_spec.rb +0 -33
  261. data/spec/features/sitelinks_search_box_spec.rb +0 -13
  262. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +0 -43
  263. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +0 -41
@@ -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
@@ -19,6 +19,10 @@ module Blacklight
19
19
 
20
20
  with_collection_parameter :facet_item
21
21
 
22
+ # @param [Blacklight::FacetItemPivotPresenter] facet_item
23
+ # @param [String] wrapping_element
24
+ # @param [Boolean] suppress_link
25
+ # @param [Boolean] collapsing
22
26
  def initialize(facet_item:, wrapping_element: 'li', suppress_link: false, collapsing: nil)
23
27
  @facet_item = facet_item
24
28
  @wrapping_element = wrapping_element
@@ -28,17 +32,17 @@ module Blacklight
28
32
  end
29
33
 
30
34
  def call
31
- facet = Blacklight::FacetItemComponent.new(facet_item: @facet_item, wrapping_element: nil, suppress_link: @suppress_link)
35
+ facet = Blacklight::Facets::ItemComponent.new(facet_item: @facet_item, wrapping_element: nil, suppress_link: @suppress_link)
32
36
 
33
37
  id = "h-#{self.class.mint_id}" if @collapsing && has_items?
34
38
 
35
- content_tag @wrapping_element, class: 'treeitem' do
39
+ content_tag @wrapping_element, class: 'treeitem', role: 'treeitem' do
36
40
  concat(content_tag('span', class: "d-flex flex-row align-items-center") do
37
41
  concat facet_toggle_button(id) if has_items? && @collapsing
38
42
  concat content_tag('span', render(facet), class: "facet-values d-flex flex-row flex-grow-1 #{'facet-leaf-node' if has_items? && @collapsing}", id: id && "#{id}_label")
39
43
  end)
40
44
  if has_items?
41
- concat(content_tag('ul', class: "pivot-facet flex-column list-unstyled ps-4 #{'collapse' if @collapsing} #{'show' if expanded?}", id: id, role: 'group') do
45
+ concat(content_tag('ul', class: "list-unstyled ps-3 #{'collapse' if @collapsing} #{'show' if expanded?}", id: id, role: 'group') do
42
46
  render(
43
47
  self.class.with_collection(
44
48
  @facet_item.facet_item_presenters.to_a
@@ -64,7 +68,7 @@ module Blacklight
64
68
  end
65
69
 
66
70
  def facet_toggle_button(id)
67
- content_tag 'button', class: %w[btn facet-toggle-handle] + [('collapsed' unless expanded?)],
71
+ content_tag 'button', class: %w[btn focus-ring facet-toggle-handle] + [('collapsed' unless expanded?)],
68
72
  data: { toggle: 'collapse', 'bs-toggle': 'collapse', target: "##{id}", 'bs-target': "##{id}" },
69
73
  aria: { expanded: expanded?, controls: id, describedby: "#{id}_label" } do
70
74
  concat toggle_icon(:show)
@@ -7,13 +7,13 @@
7
7
  <ul class="facet-values list-unstyled blacklight-facet-checkboxes">
8
8
  <% presenters.each_with_index do |presenter, idx| -%>
9
9
  <li>
10
- <span class="facet-checkbox">
10
+ <span class="facet-checkbox flex-shrink-0">
11
11
  <%= check_box_tag "f_inclusive[#{@facet_field.key}][]", presenter.value, presenter.selected?, id: "f_inclusive_#{@facet_field.key}_#{idx}"%>
12
12
  </span>
13
13
 
14
- <span>
15
- <%= label_tag "f_inclusive_#{@facet_field.key}_#{idx}" do %>
16
- <span class="facet-label"><%= presenter.label %></span>
14
+ <span class="facet-label-and-count flex-grow-1">
15
+ <%= label_tag "f_inclusive_#{@facet_field.key}_#{idx}", class: 'd-flex' do %>
16
+ <span class="facet-label flex-grow-1"><%= presenter.label %></span>
17
17
  <span class="facet-count"><%= t('blacklight.search.facets.count', number: number_with_delimiter(presenter.hits)) %></span>
18
18
  <% end %>
19
19
  </span>
@@ -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
@@ -3,12 +3,10 @@
3
3
  <button
4
4
  type="button"
5
5
  class="btn accordion-button <%= "collapsed" if @facet_field.collapsed? %>"
6
- data-toggle="collapse"
7
6
  data-bs-toggle="collapse"
8
- data-target="#<%= html_id %>"
9
7
  data-bs-target="#<%= html_id %>"
10
8
  aria-expanded="<%= @facet_field.collapsed? ? 'false' : 'true' %>"
11
- arial-controls="<%= html_id %>"
9
+ aria-controls="<%= html_id %>"
12
10
  >
13
11
  <%= label %>
14
12
  </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 mt-1 mb-3',
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
+ presenter.suggest? || 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
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ class ItemComponent < Blacklight::Component
6
+ attr_reader :label, :href, :hits
7
+
8
+ with_collection_parameter :facet_item
9
+
10
+ # @param [Blacklight::FacetItemPresenter] facet_item
11
+ # @param [String] wrapping_element
12
+ # @param [Boolean] suppress_link
13
+ def initialize(facet_item:, wrapping_element: 'li', suppress_link: false)
14
+ @facet_item = facet_item
15
+ @label = facet_item.label
16
+ @hits = facet_item.hits
17
+ @href = facet_item.href
18
+ @selected = facet_item.selected?
19
+ @wrapping_element = wrapping_element
20
+ @suppress_link = suppress_link
21
+ end
22
+
23
+ def call
24
+ # if the downstream app has overridden the helper methods we'd usually call,
25
+ # use the helpers to preserve compatibility
26
+ content = if @selected
27
+ render_selected_facet_value
28
+ else
29
+ render_facet_value
30
+ end
31
+
32
+ return '' if content.blank?
33
+ return content unless @wrapping_element
34
+
35
+ content_tag @wrapping_element, content
36
+ end
37
+
38
+ ##
39
+ # Standard display of a facet value in a list. Used in both _facets sidebar
40
+ # partial and catalog/facet expanded list. Will output facet value name as
41
+ # a link to add that to your restrictions, with count in parens.
42
+ #
43
+ # @return [String]
44
+ # @private
45
+ def render_facet_value
46
+ tag.span(class: "facet-label") do
47
+ link_to_unless(@suppress_link, label, href, class: "facet-select", rel: "nofollow")
48
+ end + render_facet_count
49
+ end
50
+
51
+ ##
52
+ # Standard display of a SELECTED facet value (e.g. without a link and with a remove button)
53
+ # @see #render_facet_value
54
+ #
55
+ # @private
56
+ def render_selected_facet_value
57
+ concat render(Blacklight::Facets::SelectedValueComponent.new(label: label, href: href))
58
+ concat render_facet_count(classes: ["selected"])
59
+ end
60
+
61
+ ##
62
+ # Renders a count value for facet limits. Can be over-ridden locally
63
+ # to change style. And can be called by plugins to get consistent display.
64
+ #
65
+ # @param [Hash] options
66
+ # @option options [Array<String>] an array of classes to add to count span.
67
+ # @return [String]
68
+ # @private
69
+ def render_facet_count(options = {})
70
+ classes = (options[:classes] || []) << "facet-count"
71
+
72
+ render Blacklight::Facets::CountComponent.new(hits: hits, classes: classes)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,11 @@
1
+ <%= render(layout.new(facet_field: @facet_field)) do |component| %>
2
+ <% component.with_label do %>
3
+ <%= @facet_field.label %>
4
+ <% end %>
5
+ <% component.with_body do %>
6
+ <%= render(Blacklight::Facets::InclusiveConstraintComponent.new(facet_field: @facet_field)) %>
7
+ <%= content_tag :ul, class: @classes, role: @role do %>
8
+ <%= render facet_items %>
9
+ <% end %>
10
+ <% end %>
11
+ <% end %>
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Facets
5
+ class ListComponent < Blacklight::Component
6
+ # @param [Blacklight::FacetFieldPresenter] facet_field
7
+ def initialize(facet_field:,
8
+ classes: %w[facet-values list-unstyled],
9
+ role: nil,
10
+ layout: nil)
11
+ @facet_field = facet_field
12
+ @classes = classes
13
+ @role = role
14
+ @layout = layout == false ? Blacklight::Facets::NoLayoutComponent : Blacklight::Facets::FieldComponent
15
+ end
16
+
17
+ attr_accessor :layout, :classes, :role
18
+
19
+ def facet_items(wrapping_element: :li, **item_args)
20
+ facet_item_component_class.with_collection(facet_item_presenters, wrapping_element: wrapping_element, **item_args)
21
+ end
22
+
23
+ def facet_item_presenters
24
+ @facet_field.paginator.items.map do |item|
25
+ facet_item_presenter(item)
26
+ end
27
+ end
28
+
29
+ def render?
30
+ @facet_field.paginator&.items&.any?
31
+ end
32
+
33
+ def facet_item_presenter(facet_item)
34
+ @facet_field.item_presenter(facet_item)
35
+ end
36
+
37
+ def facet_item_component_class
38
+ facet_config.item_component
39
+ end
40
+
41
+ def facet_config
42
+ @facet_field.facet_field
43
+ end
44
+ end
45
+ end
46
+ end