blacklight 8.11.0 → 9.0.0.beta2

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 (288) hide show
  1. checksums.yaml +4 -4
  2. data/.env +3 -3
  3. data/.github/matrix.json +11 -42
  4. data/.github/pull_request_template.md +7 -0
  5. data/.github/workflows/main.yml +0 -2
  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 +0 -5
  9. data/.rubocop.yml +71 -3
  10. data/.rubocop_todo.yml +43 -76
  11. data/.solr_wrapper.yml +2 -0
  12. data/README.md +30 -8
  13. data/VERSION +1 -1
  14. data/app/assets/builds/blacklight.css +452 -0
  15. data/app/assets/javascripts/blacklight/blacklight.esm.js +6 -76
  16. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -1
  17. data/app/assets/javascripts/blacklight/blacklight.js +6 -76
  18. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -1
  19. data/app/assets/stylesheets/blacklight/_balanced_list.scss +1 -4
  20. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -3
  21. data/app/assets/stylesheets/blacklight/_bookmark.scss +44 -41
  22. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +0 -25
  23. data/app/assets/stylesheets/blacklight/_constraints.scss +15 -24
  24. data/app/assets/stylesheets/blacklight/_controls.scss +2 -18
  25. data/app/assets/stylesheets/blacklight/_facets.scss +17 -84
  26. data/app/assets/stylesheets/blacklight/_group.scss +2 -5
  27. data/app/assets/stylesheets/blacklight/_header.scss +8 -11
  28. data/app/assets/stylesheets/blacklight/_icons.scss +0 -8
  29. data/app/assets/stylesheets/blacklight/_modal.scss +1 -1
  30. data/app/assets/stylesheets/blacklight/_pagination.scss +0 -4
  31. data/app/assets/stylesheets/blacklight/_search_form.scss +0 -1
  32. data/app/assets/stylesheets/blacklight/_search_history.scss +0 -8
  33. data/app/assets/stylesheets/blacklight/_search_results.scss +1 -15
  34. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +9 -14
  35. data/app/assets/stylesheets/blacklight/build.scss +4 -0
  36. data/app/components/blacklight/advanced_search_form_component.rb +3 -3
  37. data/app/components/blacklight/constraint_component.rb +1 -1
  38. data/app/components/blacklight/constraint_layout_component.html.erb +2 -2
  39. data/app/components/blacklight/constraints_component.html.erb +2 -2
  40. data/app/components/blacklight/constraints_component.rb +3 -3
  41. data/app/components/blacklight/document/bookmark_component.html.erb +3 -3
  42. data/app/components/blacklight/document/bookmark_component.rb +2 -2
  43. data/app/components/blacklight/document/group_component.html.erb +1 -1
  44. data/app/components/blacklight/document/more_like_this_component.rb +2 -2
  45. data/app/components/blacklight/document/page_header_component.rb +1 -1
  46. data/app/components/blacklight/document/sidebar_component.rb +5 -5
  47. data/app/components/blacklight/document/thumbnail_component.html.erb +3 -7
  48. data/app/components/blacklight/document/thumbnail_component.rb +7 -6
  49. data/app/components/blacklight/document_component.rb +12 -16
  50. data/app/components/blacklight/document_title_component.rb +5 -11
  51. data/app/components/blacklight/facet_field_checkboxes_component.rb +2 -20
  52. data/app/components/blacklight/facet_field_component.rb +2 -17
  53. data/app/components/blacklight/facet_field_filter_component.rb +2 -21
  54. data/app/components/blacklight/facet_field_inclusive_constraint_component.rb +4 -25
  55. data/app/components/blacklight/facet_field_list_component.rb +2 -50
  56. data/app/components/blacklight/facet_field_no_layout_component.rb +2 -10
  57. data/app/components/blacklight/facet_item_component.rb +2 -74
  58. data/app/components/blacklight/facet_item_pivot_component.rb +3 -3
  59. data/app/components/blacklight/facets/checkboxes_component.rb +26 -0
  60. data/app/components/blacklight/facets/count_component.rb +23 -0
  61. data/app/components/blacklight/{facet_field_component.html.erb → facets/field_component.html.erb} +4 -4
  62. data/app/components/blacklight/facets/field_component.rb +23 -0
  63. data/app/components/blacklight/facets/filters_component.html.erb +4 -0
  64. data/app/components/blacklight/facets/filters_component.rb +27 -0
  65. data/app/components/blacklight/{facet_field_inclusive_constraint_component.html.erb → facets/inclusive_constraint_component.html.erb} +1 -1
  66. data/app/components/blacklight/facets/inclusive_constraint_component.rb +31 -0
  67. data/app/components/blacklight/{facet_field_filter_component.html.erb → facets/index_navigation_component.html.erb} +1 -1
  68. data/app/components/blacklight/facets/index_navigation_component.rb +32 -0
  69. data/app/components/blacklight/facets/item_component.rb +73 -0
  70. data/app/components/blacklight/facets/list_component.html.erb +11 -0
  71. data/app/components/blacklight/facets/list_component.rb +38 -0
  72. data/app/components/blacklight/facets/no_layout_component.rb +16 -0
  73. data/app/components/blacklight/facets/selected_value_component.rb +29 -0
  74. data/app/components/blacklight/facets/suggest_component.html.erb +12 -0
  75. data/app/components/blacklight/facets/suggest_component.rb +22 -0
  76. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +2 -2
  77. data/app/components/blacklight/response/facet_group_component.html.erb +3 -18
  78. data/app/components/blacklight/response/facet_group_component.rb +11 -23
  79. data/app/components/blacklight/response/facet_toggle_button_component.html.erb +16 -0
  80. data/app/components/blacklight/response/facet_toggle_button_component.rb +14 -0
  81. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  82. data/app/components/blacklight/response/pagination_component.rb +2 -1
  83. data/app/components/blacklight/response/sort_component.rb +1 -0
  84. data/app/components/blacklight/response/view_type_button_component.html.erb +1 -1
  85. data/app/components/blacklight/response/view_type_component.html.erb +1 -1
  86. data/app/components/blacklight/search/per_page_component.html.erb +1 -1
  87. data/app/components/blacklight/search/per_page_component.rb +1 -0
  88. data/app/components/blacklight/search/sidebar_component.html.erb +1 -1
  89. data/app/components/blacklight/search/sidebar_component.rb +1 -1
  90. data/app/components/blacklight/search_bar_component.html.erb +3 -3
  91. data/app/components/blacklight/search_bar_component.rb +2 -2
  92. data/app/components/blacklight/search_button_component.rb +2 -2
  93. data/app/components/blacklight/search_context/server_applied_params_component.html.erb +2 -2
  94. data/app/components/blacklight/search_context/server_applied_params_component.rb +9 -0
  95. data/app/components/blacklight/skip_link_component.html.erb +1 -1
  96. data/app/components/blacklight/skip_link_component.rb +2 -1
  97. data/app/components/blacklight/top_navbar_component.html.erb +2 -2
  98. data/app/controllers/concerns/blacklight/bookmarks.rb +3 -3
  99. data/app/controllers/concerns/blacklight/catalog.rb +9 -23
  100. data/app/controllers/concerns/blacklight/controller.rb +1 -1
  101. data/app/controllers/concerns/blacklight/facetable.rb +34 -0
  102. data/app/controllers/concerns/blacklight/search_context.rb +0 -12
  103. data/app/controllers/concerns/blacklight/searchable.rb +1 -1
  104. data/app/helpers/blacklight/blacklight_helper_behavior.rb +0 -6
  105. data/app/helpers/blacklight/catalog_helper_behavior.rb +0 -10
  106. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -14
  107. data/app/helpers/blacklight/document_helper_behavior.rb +3 -27
  108. data/app/helpers/blacklight/facets_helper_behavior.rb +9 -0
  109. data/app/helpers/blacklight/icon_helper_behavior.rb +3 -11
  110. data/app/helpers/blacklight/layout_helper_behavior.rb +2 -2
  111. data/app/helpers/blacklight/render_partials_helper_behavior.rb +0 -14
  112. data/app/helpers/blacklight/url_helper_behavior.rb +1 -1
  113. data/app/javascript/{blacklight → blacklight-frontend}/bookmark_toggle.js +1 -1
  114. data/app/javascript/{blacklight → blacklight-frontend}/checkbox_submit.js +3 -0
  115. data/app/javascript/{blacklight → blacklight-frontend}/core.js +2 -10
  116. data/app/javascript/{blacklight → blacklight-frontend}/facet_suggest.js +1 -3
  117. data/app/javascript/blacklight-frontend/index.js +16 -0
  118. data/app/javascript/{blacklight → blacklight-frontend}/modal.js +1 -5
  119. data/app/models/concerns/blacklight/document.rb +0 -11
  120. data/app/models/concerns/blacklight/user.rb +1 -1
  121. data/app/models/facet_search_builder.rb +5 -0
  122. data/app/presenters/blacklight/facet_field_presenter.rb +3 -3
  123. data/app/presenters/blacklight/rendering/helper_method.rb +4 -4
  124. data/app/presenters/blacklight/rendering/join.rb +2 -2
  125. data/app/services/blacklight/facet_search_service.rb +44 -0
  126. data/app/services/blacklight/field_retriever.rb +1 -1
  127. data/app/services/blacklight/search_params_yaml_coder.rb +0 -2
  128. data/app/services/blacklight/search_service.rb +6 -6
  129. data/app/values/blacklight/types.rb +2 -2
  130. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +0 -2
  131. data/app/views/bookmarks/index.html.erb +1 -1
  132. data/app/views/catalog/_facet_pivot.html.erb +1 -1
  133. data/app/views/catalog/_home_text.html.erb +2 -2
  134. data/app/views/catalog/_results_pagination.html.erb +2 -5
  135. data/app/views/catalog/_search_results.html.erb +3 -3
  136. data/app/views/catalog/_search_results_header.html.erb +1 -1
  137. data/app/views/catalog/_sort_and_per_page.html.erb +1 -1
  138. data/app/views/catalog/_sort_widget.html.erb +1 -0
  139. data/app/views/catalog/facet.html.erb +4 -6
  140. data/app/views/catalog/show.html.erb +2 -3
  141. data/app/views/kaminari/blacklight/_paginator.html.erb +1 -2
  142. data/app/views/layouts/blacklight/base.html.erb +3 -7
  143. data/app/views/search_history/index.html.erb +0 -2
  144. data/blacklight.gemspec +4 -4
  145. data/config/importmap.rb +1 -1
  146. data/config/locales/blacklight.ar.yml +2 -2
  147. data/config/locales/blacklight.ca.yml +124 -124
  148. data/config/locales/blacklight.de.yml +2 -2
  149. data/config/locales/blacklight.en.yml +14 -14
  150. data/config/locales/blacklight.es.yml +2 -2
  151. data/config/locales/blacklight.fr.yml +2 -2
  152. data/config/locales/blacklight.hu.yml +2 -2
  153. data/config/locales/blacklight.it.yml +1 -1
  154. data/config/locales/blacklight.nl.yml +2 -2
  155. data/config/locales/blacklight.pt-BR.yml +1 -1
  156. data/config/locales/blacklight.sq.yml +2 -2
  157. data/config/locales/blacklight.zh.yml +2 -2
  158. data/lib/blacklight/abstract_repository.rb +2 -2
  159. data/lib/blacklight/abstract_search_builder.rb +154 -0
  160. data/lib/blacklight/configuration/context.rb +3 -3
  161. data/lib/blacklight/configuration/display_field.rb +1 -1
  162. data/lib/blacklight/configuration/facet_field.rb +6 -6
  163. data/lib/blacklight/configuration/field.rb +4 -4
  164. data/lib/blacklight/configuration/fields.rb +3 -4
  165. data/lib/blacklight/configuration/search_field.rb +1 -1
  166. data/lib/blacklight/configuration/view_config.rb +2 -4
  167. data/lib/blacklight/configuration.rb +11 -18
  168. data/lib/blacklight/engine.rb +0 -6
  169. data/lib/blacklight/facet_search_builder.rb +18 -0
  170. data/lib/blacklight/nested_open_struct_with_hash_access.rb +1 -1
  171. data/lib/blacklight/open_struct_with_hash_access.rb +5 -5
  172. data/lib/blacklight/search_builder.rb +1 -159
  173. data/lib/blacklight/search_state/filter_field.rb +2 -2
  174. data/lib/blacklight/search_state/pivot_filter_field.rb +4 -4
  175. data/lib/blacklight/solr/abstract_filter_query_builder.rb +77 -0
  176. data/lib/blacklight/solr/default_filter_query_builder.rb +20 -0
  177. data/lib/blacklight/solr/facet_search_builder_behavior.rb +62 -0
  178. data/lib/blacklight/solr/repository.rb +8 -9
  179. data/lib/blacklight/solr/request.rb +1 -7
  180. data/lib/blacklight/solr/response/facets.rb +2 -2
  181. data/lib/blacklight/solr/response/group_response.rb +2 -2
  182. data/lib/blacklight/solr/response/params.rb +0 -4
  183. data/lib/blacklight/solr/response.rb +5 -1
  184. data/lib/blacklight/solr/search_builder_behavior.rb +17 -132
  185. data/lib/blacklight.rb +2 -2
  186. data/lib/generators/blacklight/assets/importmap_generator.rb +6 -24
  187. data/lib/generators/blacklight/assets/propshaft_generator.rb +1 -1
  188. data/lib/generators/blacklight/assets_generator.rb +3 -3
  189. data/lib/generators/blacklight/controller_generator.rb +3 -3
  190. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  191. data/lib/generators/blacklight/templates/.solr_wrapper.yml +2 -0
  192. data/lib/generators/blacklight/templates/catalog_controller.rb +3 -1
  193. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +0 -4
  194. data/lib/generators/blacklight/user_generator.rb +9 -10
  195. data/package.json +15 -5
  196. data/rollup.config.js +1 -1
  197. data/spec/components/blacklight/advanced_search_form_component_spec.rb +18 -22
  198. data/spec/components/blacklight/constraint_layout_component_spec.rb +8 -8
  199. data/spec/components/blacklight/constraints_component_spec.rb +11 -11
  200. data/spec/components/blacklight/document/action_component_spec.rb +21 -17
  201. data/spec/components/blacklight/document/group_component_spec.rb +10 -15
  202. data/spec/components/blacklight/document/page_header_component_spec.rb +35 -28
  203. data/spec/components/blacklight/document/sidebar_component_spec.rb +9 -30
  204. data/spec/components/blacklight/document_component_spec.rb +98 -65
  205. data/spec/components/blacklight/facet_component_spec.rb +12 -8
  206. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +12 -12
  207. data/spec/components/blacklight/{facet_field_checkboxes_component_spec.rb → facets/checkboxes_component_spec.rb} +14 -14
  208. data/spec/components/blacklight/facets/filters_component_spec.rb +36 -0
  209. data/spec/components/blacklight/facets/index_navigation_component_spec.rb +40 -0
  210. data/spec/components/blacklight/{facet_item_component_spec.rb → facets/item_component_spec.rb} +10 -10
  211. data/spec/components/blacklight/{facet_field_list_component_spec.rb → facets/list_component_spec.rb} +24 -24
  212. data/spec/components/blacklight/facets/suggest_component_spec.rb +68 -0
  213. data/spec/components/blacklight/header_component_spec.rb +2 -4
  214. data/spec/components/blacklight/hidden_search_state_component_spec.rb +7 -7
  215. data/spec/components/blacklight/metadata_field_component_spec.rb +17 -15
  216. data/spec/components/blacklight/response/facet_group_component_spec.rb +37 -0
  217. data/spec/components/blacklight/response/pagination_component_spec.rb +1 -1
  218. data/spec/components/blacklight/response/spellcheck_component_spec.rb +1 -1
  219. data/spec/components/blacklight/search_bar_component_spec.rb +5 -5
  220. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +2 -2
  221. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +3 -5
  222. data/spec/components/blacklight/skip_link_component_spec.rb +8 -11
  223. data/spec/components/blacklight/start_over_button_component_spec.rb +4 -4
  224. data/spec/components/blacklight/system/flash_message_component_spec.rb +7 -11
  225. data/spec/controllers/catalog_controller_spec.rb +11 -19
  226. data/spec/features/axe_spec.rb +6 -11
  227. data/spec/features/bookmarks_spec.rb +48 -11
  228. data/spec/features/facets_spec.rb +58 -63
  229. data/spec/features/search_context_spec.rb +1 -2
  230. data/spec/features/search_filters_spec.rb +6 -6
  231. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +0 -9
  232. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +10 -0
  233. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +1 -1
  234. data/spec/lib/blacklight/configuration/facet_field_spec.rb +2 -2
  235. data/spec/models/blacklight/configuration_spec.rb +32 -28
  236. data/spec/models/blacklight/facet_search_builder_spec.rb +19 -0
  237. data/spec/models/blacklight/search_builder_spec.rb +1 -11
  238. data/spec/models/blacklight/solr/default_filter_query_builder_spec.rb +72 -0
  239. data/spec/models/blacklight/solr/document_spec.rb +0 -4
  240. data/spec/models/blacklight/solr/facet_search_builder_behavior_spec.rb +929 -0
  241. data/spec/models/blacklight/solr/repository_spec.rb +31 -29
  242. data/spec/models/blacklight/solr/request_spec.rb +7 -0
  243. data/spec/models/blacklight/solr/response/facets_spec.rb +86 -40
  244. data/spec/models/blacklight/solr/response/group_response_spec.rb +8 -5
  245. data/spec/models/blacklight/solr/response/group_spec.rb +9 -5
  246. data/spec/models/blacklight/solr/response_spec.rb +96 -64
  247. data/spec/models/blacklight/solr/search_builder_behavior_spec.rb +2 -227
  248. data/spec/models/solr_document_spec.rb +5 -1
  249. data/spec/services/blacklight/search_service_spec.rb +5 -26
  250. data/spec/spec_helper.rb +0 -1
  251. data/spec/support/view_component_test_helpers.rb +0 -18
  252. data/spec/views/catalog/facet.html.erb_spec.rb +10 -11
  253. data/spec/views/catalog/index.atom.builder_spec.rb +6 -3
  254. data/spec/views/catalog/index.html.erb_spec.rb +8 -3
  255. data/spec/views/catalog/show.html.erb_spec.rb +1 -0
  256. data/tasks/blacklight.rake +8 -5
  257. metadata +76 -81
  258. data/app/assets/stylesheets/blacklight/_autocomplete.scss +0 -25
  259. data/app/assets/stylesheets/blacklight/_mixins.scss +0 -20
  260. data/app/components/blacklight/facet_field_list_component.html.erb +0 -19
  261. data/app/components/blacklight/icons/legacy_icon_component.rb +0 -30
  262. data/app/components/blacklight/search/facet_suggest_input.html.erb +0 -12
  263. data/app/components/blacklight/search/facet_suggest_input.rb +0 -20
  264. data/app/javascript/blacklight/index.js +0 -18
  265. data/app/javascript/blacklight/modalForm.js +0 -60
  266. data/app/views/catalog/_constraints.html.erb +0 -1
  267. data/app/views/catalog/_facet_index_navigation.html.erb +0 -1
  268. data/app/views/catalog/_facet_layout.html.erb +0 -8
  269. data/app/views/catalog/_facet_pagination.html.erb +0 -1
  270. data/app/views/catalog/_facets.html.erb +0 -5
  271. data/app/views/catalog/_search_form.html.erb +0 -7
  272. data/app/views/catalog/_search_header.html.erb +0 -1
  273. data/app/views/catalog/_show_sidebar.html.erb +0 -3
  274. data/app/views/catalog/_show_tools.html.erb +0 -2
  275. data/app/views/catalog/_start_over.html.erb +0 -1
  276. data/app/views/shared/_header_navbar.html.erb +0 -1
  277. data/lib/generators/blacklight/assets/sprockets_generator.rb +0 -68
  278. data/spec/components/blacklight/document_metadata_component_spec.rb +0 -0
  279. data/spec/components/blacklight/search/facet_suggest_input_spec.rb +0 -57
  280. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +0 -43
  281. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +0 -41
  282. data/spec/views/catalog/_search_header.erb_spec.rb +0 -14
  283. data/spec/views/catalog/_show_sidebar.erb_spec.rb +0 -24
  284. data/spec/views/catalog/_show_tools.html.erb_spec.rb +0 -37
  285. /data/app/components/blacklight/{facet_field_checkboxes_component.html.erb → facets/checkboxes_component.html.erb} +0 -0
  286. /data/app/javascript/{blacklight → blacklight-frontend}/button_focus.js +0 -0
  287. /data/app/javascript/{blacklight → blacklight-frontend}/debounce.js +0 -0
  288. /data/app/javascript/{blacklight → blacklight-frontend}/search_context.js +0 -0
@@ -92,7 +92,7 @@ es:
92
92
  close: Ocultar facetas
93
93
  open: Mostrar facetas
94
94
  missing: "[Falta]"
95
- more_html: más <span class="sr-only visually-hidden">%{field_name}</span> »
95
+ more_html: más <span class="visually-hidden">%{field_name}</span> »
96
96
  pivot:
97
97
  hide: Cerrar
98
98
  show: Abierto
@@ -141,7 +141,7 @@ es:
141
141
  aria_label: Navegación de resultados
142
142
  button_label: "%{count} por página"
143
143
  button_label_html: '%{count}<span class="d-none d-sm-inline"> por página</span>'
144
- label: '%{count}<span class="sr-only visually-hidden"> por página</span>'
144
+ label: '%{count}<span class="visually-hidden"> por página</span>'
145
145
  submit: Actualización
146
146
  title: El número de resultados a mostrar por página
147
147
  rss_feed: RSS de los resultados
@@ -92,7 +92,7 @@ fr:
92
92
  close: Masquer les facettes
93
93
  open: Afficher les facettes
94
94
  missing: "[manquante]"
95
- more_html: plus <span class="sr-only visually-hidden">%{field_name}</span> »
95
+ more_html: plus <span class="visually-hidden">%{field_name}</span> »
96
96
  pivot:
97
97
  hide: Fermer
98
98
  show: Ouvrir
@@ -141,7 +141,7 @@ fr:
141
141
  aria_label: Navigation dans les résultats
142
142
  button_label: "%{count} par page"
143
143
  button_label_html: '%{count}<span class="d-none d-sm-inline"> par page</span>'
144
- label: '%{count}<span class="sr-only visually-hidden"> par page</span>'
144
+ label: '%{count}<span class="visually-hidden"> par page</span>'
145
145
  submit: mettre à jour
146
146
  title: Nombre de résultats à afficher par page
147
147
  rss_feed: RSS pour les résultats
@@ -90,7 +90,7 @@ hu:
90
90
  close: Fazetek elrejtése
91
91
  open: Szempontok megjelenítése
92
92
  missing: "[Hiányzó]"
93
- more_html: több <span class="sr-only visually-hidden">%{field_name}</span> »
93
+ more_html: több <span class="visually-hidden">%{field_name}</span> »
94
94
  pivot:
95
95
  hide: Bezárás
96
96
  show: Megnyitás
@@ -139,7 +139,7 @@ hu:
139
139
  aria_label: Eredmények navigáció
140
140
  button_label: "%{count} oldalanként"
141
141
  button_label_html: '%{count}<span class="d-none d-sm-inline"> oldalanként</span>'
142
- label: '%{count}<span class="sr-only visually-hidden"> oldalanként</span>'
142
+ label: '%{count}<span class="visually-hidden"> oldalanként</span>'
143
143
  submit: Frissítés
144
144
  title: Az eredmények száma oldalanként
145
145
  rss_feed: Eredmények RSS-ként
@@ -142,7 +142,7 @@ it:
142
142
  aria_label: Navigazione dei risultati
143
143
  button_label: "%{count} per pagina"
144
144
  button_label_html: '%{count}<span class="d-none d-sm-inline"> per pagina</span>'
145
- label: '%{count}<span class="sr-only visually-hidden"> per pagina</span>'
145
+ label: '%{count}<span class="visually-hidden"> per pagina</span>'
146
146
  submit: Aggiorna
147
147
  title: Risultati per pagina
148
148
  rss_feed: RSS per i risultati
@@ -90,7 +90,7 @@ nl:
90
90
  close: Verberg facetten
91
91
  open: Toon facetten
92
92
  missing: "[Ontbrekend]"
93
- more_html: Meer <span class="sr-only visually-hidden">%{field_name}</span> »
93
+ more_html: Meer <span class="visually-hidden">%{field_name}</span> »
94
94
  pivot:
95
95
  hide: Sluiten
96
96
  show: Openen
@@ -139,7 +139,7 @@ nl:
139
139
  aria_label: Resultaten navigatie
140
140
  button_label: "%{count} per pagina"
141
141
  button_label_html: '%{count}<span class="d-none d-sm-inline"> per pagina</span>'
142
- label: '%{count}<span class="sr-only visually-hidden"> per pagina</span>'
142
+ label: '%{count}<span class="visually-hidden"> per pagina</span>'
143
143
  submit: Update
144
144
  title: Toon aantal zoekresultaten per pagina
145
145
  rss_feed: RSS voor zoekresultaten
@@ -91,7 +91,7 @@ pt-BR:
91
91
  open: Mostrar facetas
92
92
  missing:
93
93
  - Ausência
94
- more_html: mais <span class="sr-only visually-hidden">%{field_name}</span> »
94
+ more_html: mais <span class="visually-hidden">%{field_name}</span> »
95
95
  pivot:
96
96
  hide: Fechar
97
97
  show: Abrir
@@ -90,7 +90,7 @@ sq:
90
90
  close: Fshih aspektet
91
91
  open: Trego aspektet
92
92
  missing: "[Mungon]"
93
- more_html: Më shumë <span class="sr-only visually-hidden">%{field_name}</span> »
93
+ more_html: Më shumë <span class="visually-hidden">%{field_name}</span> »
94
94
  pivot:
95
95
  hide: Mbylle
96
96
  show: Hape
@@ -139,7 +139,7 @@ sq:
139
139
  aria_label: Rezultatet e lundrimit
140
140
  button_label: "%{count} për faqe"
141
141
  button_label_html: '%{count}<span class="d-none d-sm-inline"> për faqe</span>'
142
- label: '%{count}<span class="sr-only visually-hidden"> për faqe</span>'
142
+ label: '%{count}<span class="visually-hidden"> për faqe</span>'
143
143
  submit: Përditëso
144
144
  title: Numri i rezultateve që do të shfaqen për faqe
145
145
  rss_feed: RSS për rezultatet
@@ -90,7 +90,7 @@ zh:
90
90
  close: 隐藏方面
91
91
  open: 显示方面
92
92
  missing: "[未找到]"
93
- more_html: 更多 <span class="sr-only visually-hidden">%{field_name}</span> »
93
+ more_html: 更多 <span class="visually-hidden">%{field_name}</span> »
94
94
  pivot:
95
95
  hide: 关
96
96
  show: 打开
@@ -139,7 +139,7 @@ zh:
139
139
  aria_label: 结果导航
140
140
  button_label: "%{count} 每页"
141
141
  button_label_html: '%{count}<span class="d-none d-sm-inline"> 每页</span>'
142
- label: '%{count}<span class="sr-only visually-hidden"> 每页</span>'
142
+ label: '%{count}<span class="visually-hidden"> 每页</span>'
143
143
  submit: 更新
144
144
  title: 每页显示结果数
145
145
  rss_feed: 搜索结果RSS
@@ -37,8 +37,8 @@ module Blacklight
37
37
 
38
38
  # Find multiple documents by their ids
39
39
  # @param [Hash] _params query parameters
40
- def find_many(params, **kwargs)
41
- search(params, **kwargs)
40
+ def find_many(params, **)
41
+ search(params, **)
42
42
  end
43
43
 
44
44
  ##
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ ##
5
+ # Blacklight's SearchBuilder converts blacklight request parameters into
6
+ # query parameters appropriate for search index. It does so by evaluating a
7
+ # chain of processing methods to populate a result hash (see {#to_hash}).
8
+ class AbstractSearchBuilder
9
+ class_attribute :default_processor_chain
10
+ self.default_processor_chain = []
11
+
12
+ attr_reader :processor_chain, :search_state, :blacklight_params
13
+
14
+ # @overload initialize(scope)
15
+ # @param [Object] scope scope the scope where the filter methods reside in.
16
+ # @overload initialize(processor_chain, scope)
17
+ # @param [List<Symbol>,TrueClass] processor_chain options a list of filter methods to run or true, to use the default methods
18
+ # @param [Object] scope the scope where the filter methods reside in.
19
+ def initialize(*options)
20
+ case options.size
21
+ when 1
22
+ @processor_chain = default_processor_chain.dup
23
+ @scope = options.first
24
+ when 2
25
+ @processor_chain, @scope = options
26
+ else
27
+ raise ArgumentError, "wrong number of arguments. (#{options.size} for 1..2)"
28
+ end
29
+
30
+ @blacklight_params = {}
31
+ search_state_class = @scope.try(:search_state_class) || Blacklight::SearchState
32
+ @search_state = search_state_class.new(@blacklight_params, @scope&.blacklight_config, @scope)
33
+ @additional_filters = {}
34
+ @merged_params = {}
35
+ @reverse_merged_params = {}
36
+ end
37
+
38
+ delegate :blacklight_config, to: :scope
39
+
40
+ ##
41
+ # Set the parameters to pass through the processor chain
42
+ def with(blacklight_params_or_search_state = {})
43
+ params_will_change!
44
+ @search_state = blacklight_params_or_search_state.is_a?(Blacklight::SearchState) ? blacklight_params_or_search_state : @search_state.reset(blacklight_params_or_search_state)
45
+ @blacklight_params = @search_state.params.dup
46
+ self
47
+ end
48
+
49
+ # sets the facet that this query pertains to, for the purpose of facet pagination
50
+ def facet=(value)
51
+ params_will_change!
52
+ @facet = value
53
+ end
54
+
55
+ # @param [Object] value
56
+ def facet(value = nil)
57
+ if value
58
+ self.facet = value
59
+ return self
60
+ end
61
+ @facet
62
+ end
63
+
64
+ ##
65
+ # Merge additional, repository-specific parameters
66
+ def merge(extra_params, &)
67
+ if extra_params
68
+ params_will_change!
69
+ @merged_params.merge!(extra_params.to_hash, &)
70
+ end
71
+ self
72
+ end
73
+
74
+ ##
75
+ # "Reverse merge" additional, repository-specific parameters
76
+ def reverse_merge(extra_params, &)
77
+ if extra_params
78
+ params_will_change!
79
+ @reverse_merged_params.reverse_merge!(extra_params.to_hash, &)
80
+ end
81
+ self
82
+ end
83
+
84
+ delegate :[], :key?, to: :to_hash
85
+
86
+ # a solr query method
87
+ # @return [Blacklight::Solr::Response] the solr response object
88
+ def to_hash
89
+ return @params unless params_need_update?
90
+
91
+ @params = processed_parameters
92
+ .reverse_merge(@reverse_merged_params)
93
+ .merge(@merged_params)
94
+ .tap { clear_changes }
95
+ end
96
+
97
+ alias query to_hash
98
+ alias to_h to_hash
99
+
100
+ delegate :search_field, to: :search_state
101
+
102
+ private
103
+
104
+ attr_reader :scope
105
+
106
+ def should_add_field_to_request? _field_name, field
107
+ field.include_in_request || (field.include_in_request.nil? && blacklight_config.add_field_configuration_to_solr_request)
108
+ end
109
+
110
+ def request
111
+ Blacklight::Solr::Request.new
112
+ end
113
+
114
+ # The CatalogController #index and #facet actions use this.
115
+ # Solr parameters can come from a number of places. From lowest
116
+ # precedence to highest:
117
+ # 1. General defaults in blacklight config (are trumped by)
118
+ # 2. defaults for the particular search field identified by params[:search_field] (are trumped by)
119
+ # 3. certain parameters directly on input HTTP query params
120
+ # * not just any parameter is grabbed willy nilly, only certain ones are allowed by HTTP input)
121
+ # * for legacy reasons, qt in http query does not over-ride qt in search field definition default.
122
+ # 4. extra parameters passed in as argument.
123
+ #
124
+ # spellcheck.q will be supplied with the [:q] value unless specifically
125
+ # specified otherwise.
126
+ #
127
+ # Incoming parameter :f is mapped to :fq solr parameter.
128
+ #
129
+ # @return a params hash for searching solr.
130
+ def processed_parameters
131
+ request.tap do |request_parameters|
132
+ processor_chain.each do |method_name|
133
+ send(method_name, request_parameters)
134
+ end
135
+ end
136
+ end
137
+
138
+ def params_will_change!
139
+ @dirty = true
140
+ end
141
+
142
+ def params_changed?
143
+ !!@dirty
144
+ end
145
+
146
+ def clear_changes
147
+ @dirty = false
148
+ end
149
+
150
+ def params_need_update?
151
+ params_changed? || @params.nil?
152
+ end
153
+ end
154
+ end
@@ -24,16 +24,16 @@ module Blacklight
24
24
  #
25
25
  # @param [#if,#unless] config an object that responds to if/unless
26
26
  # @return [Boolean]
27
- def evaluate_if_unless_configuration(config, *args)
27
+ def evaluate_if_unless_configuration(config, *)
28
28
  return config if config == true || config == false
29
29
 
30
30
  if_value = !config.respond_to?(:if) ||
31
31
  config.if.nil? ||
32
- evaluate_configuration_conditional(config.if, config, *args)
32
+ evaluate_configuration_conditional(config.if, config, *)
33
33
 
34
34
  unless_value = !config.respond_to?(:unless) ||
35
35
  config.unless.nil? ||
36
- !evaluate_configuration_conditional(config.unless, config, *args)
36
+ !evaluate_configuration_conditional(config.unless, config, *)
37
37
 
38
38
  if_value && unless_value
39
39
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Blacklight
4
4
  class Configuration::DisplayField < Blacklight::Configuration::Field
5
- def initialize(*args, **kwargs, &block)
5
+ def initialize(*args, **kwargs, &)
6
6
  super
7
7
 
8
8
  self.presenter ||= Blacklight::FieldPresenter
@@ -59,15 +59,15 @@ module Blacklight
59
59
  # @!attribute item_presenter
60
60
  # @return [Blacklight::FacetItemPresenter]
61
61
  # @!attribute component
62
- # @return [Blacklight::FacetFieldListComponent]
62
+ # @return [Blacklight::Facets::ListComponent]
63
63
  # @!attribute item_component
64
- # @return [Blacklight::FacetItemComponent]
64
+ # @return [Blacklight::Facets::ItemComponent]
65
65
  # @!attribute partial
66
66
  # @return [String] Rails view partial used to render the facet field
67
67
 
68
68
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
69
69
  def normalize! blacklight_config = nil
70
- query.stringify_keys! if query
70
+ query&.stringify_keys!
71
71
 
72
72
  normalize_pivot_config! if pivot
73
73
  self.collapse = true if collapse.nil?
@@ -76,9 +76,9 @@ module Blacklight
76
76
  self.index_range = 'A'..'Z' if index_range == true
77
77
  self.presenter ||= Blacklight::FacetFieldPresenter
78
78
  self.item_presenter ||= Blacklight::FacetItemPresenter
79
- self.component = Blacklight::FacetFieldListComponent if component.nil? || component == true
80
- self.advanced_search_component ||= Blacklight::FacetFieldCheckboxesComponent
81
- self.item_component ||= Blacklight::FacetItemComponent
79
+ self.component = Blacklight::Facets::ListComponent if component.nil? || component == true
80
+ self.advanced_search_component ||= Blacklight::Facets::CheckboxesComponent
81
+ self.item_component ||= Blacklight::Facets::ItemComponent
82
82
  super
83
83
 
84
84
  if single && tag.blank? && ex.blank?
@@ -33,13 +33,13 @@ module Blacklight
33
33
  raise ArgumentError, "Must supply a field name" if self.field.nil?
34
34
  end
35
35
 
36
- def display_label(context = nil, **options)
36
+ def display_label(context = nil, **)
37
37
  field_label(
38
38
  (:"blacklight.search.fields.#{context}.#{key}" if context),
39
39
  :"blacklight.search.fields.#{key}",
40
40
  label,
41
41
  default_label,
42
- **options
42
+ **
43
43
  )
44
44
  end
45
45
 
@@ -65,10 +65,10 @@ module Blacklight
65
65
  # before falling back to the label
66
66
  # @param [Symbol] any number of additional keys
67
67
  # @param [Symbol] ...
68
- def field_label *i18n_keys, **options
68
+ def field_label(*i18n_keys, **)
69
69
  first, *rest = i18n_keys.compact
70
70
 
71
- I18n.t(first, default: rest, **options)
71
+ I18n.t(first, default: rest, **)
72
72
  end
73
73
  end
74
74
  end
@@ -81,7 +81,7 @@ module Blacklight
81
81
  #
82
82
  # add_blacklight_field :index_field, [{ :field => 'format', :label => 'Format' }, IndexField.new(:field => 'date', :label => 'Date')]
83
83
  #
84
- def add_blacklight_field config_key, *args, &block
84
+ def add_blacklight_field(config_key, *args, &)
85
85
  field_config = case args.first
86
86
  when String
87
87
  field_config_from_key_and_hash(config_key, *args)
@@ -89,7 +89,7 @@ module Blacklight
89
89
  args[0] = args[0].to_s
90
90
  field_config_from_key_and_hash(config_key, *args)
91
91
  when Array
92
- field_config_from_array(config_key, *args, &block)
92
+ field_config_from_array(config_key, *args, &)
93
93
  return # we've iterated over the array above.
94
94
  else
95
95
  field_config_from_field_or_hash(config_key, *args)
@@ -101,7 +101,7 @@ module Blacklight
101
101
 
102
102
  # look up any dynamic fields
103
103
  if field_config.match
104
- handle_matching_fields(config_key, field_config, &block)
104
+ handle_matching_fields(config_key, field_config, &)
105
105
  return
106
106
  end
107
107
 
@@ -145,7 +145,6 @@ module Blacklight
145
145
  end
146
146
 
147
147
  @table[:reflected_fields] ||= Rails.cache.fetch("blacklight_configuration/admin/reflected_fields", expires_in: 1.hour) do
148
- repository = repository_class.new(self)
149
148
  repository.reflect_fields
150
149
  rescue => e
151
150
  Blacklight.logger&.warn "Error retrieving field metadata: #{e}"
@@ -14,7 +14,7 @@ module Blacklight
14
14
  self.if = include_in_simple_select if self.if.nil?
15
15
 
16
16
  super
17
- self.qt ||= blacklight_config.default_solr_params[:qt] if blacklight_config && blacklight_config.default_solr_params
17
+ self.qt ||= blacklight_config.default_solr_params[:qt] if blacklight_config&.default_solr_params
18
18
 
19
19
  self
20
20
  end
@@ -4,8 +4,6 @@ class Blacklight::Configuration
4
4
  class ViewConfig < Blacklight::OpenStructWithHashAccess
5
5
  # @!attribute template
6
6
  # @return [String] partial to render around the documents
7
- # @!attribute partials
8
- # @return [Array<String>] partials to render for each document(see #render_document_partials)
9
7
  # @!attribute document_presenter_class
10
8
  # @return [Class] document presenter class used by helpers and views
11
9
  # @!attribute document_component
@@ -26,7 +24,7 @@ class Blacklight::Configuration
26
24
  # @return [Class] component class used to render the search bar
27
25
  # @!attribute search_header_component
28
26
  # @return [Class] component class used to render the header above the documents
29
- def display_label(**options)
27
+ def display_label(**)
30
28
  I18n.t(
31
29
  :"blacklight.search.view_title.#{key}",
32
30
  default: [
@@ -35,7 +33,7 @@ class Blacklight::Configuration
35
33
  title,
36
34
  key.to_s.humanize
37
35
  ],
38
- **options
36
+ **
39
37
  )
40
38
  end
41
39
 
@@ -66,9 +66,6 @@ module Blacklight
66
66
 
67
67
  # === Single document request configuration
68
68
 
69
- # @!attribute document_solr_request_handler
70
- # @return [String] The solr request handler to use when requesting only a single document
71
- property :document_solr_request_handler, default: nil
72
69
  # @!attribute document_solr_path
73
70
  # @since v5.2.0
74
71
  # @return [String] The url path (relative to the solr base url) to use when requesting only a single document
@@ -99,12 +96,12 @@ module Blacklight
99
96
  ##
100
97
  # == Response models
101
98
 
102
- # @!attribute repository_class
103
- # @return [Class] Class for sending and receiving requests from a search index
104
- property :repository_class, default: Blacklight::Solr::Repository
105
99
  # @!attribute search_builder_class
106
100
  # @return [Class] class for converting Blacklight parameters to request parameters for the repository_class
107
101
  property :search_builder_class, default: ::SearchBuilder
102
+ # @!attribute search_builder_class
103
+ # @return [Class] class for converting Blacklight parameters to request parameters for the repository_class
104
+ property :facet_search_builder_class, default: ::FacetSearchBuilder
108
105
  # @!attribute response_model
109
106
  # model that maps index responses to the blacklight response model
110
107
  # @return [Class]
@@ -138,8 +135,8 @@ module Blacklight
138
135
  # @!attribute bookmark_icon_component
139
136
  # @since v8.3.1
140
137
  # component class used to render a document
141
- # set to Blacklight::Icons::BookmarkIconComponent to replace checkbox with icon
142
- property :bookmark_icon_component, default: nil
138
+ # set to nil if a checkbox is prefered to the icon
139
+ property :bookmark_icon_component, default: Blacklight::Icons::BookmarkIconComponent
143
140
 
144
141
  # @!attribute index
145
142
  # General configuration for all views
@@ -157,8 +154,6 @@ module Blacklight
157
154
  display_type_field: nil,
158
155
  # the "field access" key to use to look up the document display fields
159
156
  document_fields_key: :index_fields,
160
- # partials to render for each document(see #render_document_partials)
161
- partials: [],
162
157
  document_actions: NestedOpenStructWithHashAccess.new(ToolConfig),
163
158
  collection_actions: NestedOpenStructWithHashAccess.new(ToolConfig),
164
159
  # what field, if any, to use to render grouped results
@@ -166,7 +161,9 @@ module Blacklight
166
161
  # additional response formats for search results
167
162
  respond_to: OpenStructWithHashAccess.new,
168
163
  # component class used to render the facet grouping
169
- facet_group_component: nil,
164
+ facet_group_component: Blacklight::Response::FacetGroupComponent,
165
+ # component class used to render the facet pagination
166
+ facet_pagination_component: Blacklight::FacetFieldPaginationComponent,
170
167
  # component class used to render search constraints
171
168
  constraints_component: Blacklight::ConstraintsComponent,
172
169
  # component class used to render the search bar
@@ -184,9 +181,7 @@ module Blacklight
184
181
  # document presenter class used by helpers and views
185
182
  document_presenter_class: nil,
186
183
  document_component: Blacklight::DocumentComponent,
187
- # in Blacklight 9, the default show_tools_component configuration will
188
- # be Blacklight::Document::ShowToolsComponent
189
- show_tools_component: nil,
184
+ show_tools_component: Blacklight::Document::ShowToolsComponent,
190
185
  show_header_tools_component: nil,
191
186
  document_header_component: Blacklight::Document::PageHeaderComponent,
192
187
  sidebar_component: Blacklight::Document::SidebarComponent,
@@ -197,8 +192,6 @@ module Blacklight
197
192
  # Set this to a hash with additional arguments to merge into the route,
198
193
  # or set `controller: :current` to route to the current controller.
199
194
  route: nil,
200
- # partials to render for each document(see #render_document_partials)
201
- partials: [],
202
195
  document_actions: NestedOpenStructWithHashAccess.new(ToolConfig),
203
196
  header_actions: NestedOpenStructWithHashAccess.new(ToolConfig)
204
197
  )
@@ -386,7 +379,7 @@ module Blacklight
386
379
 
387
380
  # @return [Blacklight::Repository]
388
381
  def repository
389
- repository_class.new(self)
382
+ Blacklight.repository_class.new(self)
390
383
  end
391
384
 
392
385
  # @return [String] The destination for the link around the logo in the header
@@ -585,7 +578,7 @@ module Blacklight
585
578
 
586
579
  ##
587
580
  # Add a section of config that only applies to documents with a matching display type
588
- def for_display_type display_type, &_block
581
+ def for_display_type(display_type, &)
589
582
  fields_for_type[display_type] ||= self.class.new
590
583
 
591
584
  fields_for_type[display_type].tap do |conf|
@@ -72,12 +72,6 @@ module Blacklight
72
72
  outer_window: 2
73
73
  }
74
74
 
75
- # Blacklight 9 moves the next button after the page numbers. This behavior can be configured
76
- # in Blacklight 8 by setting the next_button_position to :after
77
- bl_global_config.paginator = {
78
- next_button_position: :before
79
- }
80
-
81
75
  bl_global_config.search_params_permitted_classes = [ActiveSupport::HashWithIndifferentAccess, Symbol]
82
76
 
83
77
  # Anything that goes into Blacklight::Engine.config is stored as a class
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetSearchBuilder < AbstractSearchBuilder
5
+ def facet_suggestion_query=(value)
6
+ params_will_change!
7
+ @facet_suggestion_query = value
8
+ end
9
+
10
+ def facet_suggestion_query(value = nil)
11
+ if value
12
+ self.facet_suggestion_query = value
13
+ return self
14
+ end
15
+ @facet_suggestion_query
16
+ end
17
+ end
18
+ end
@@ -114,7 +114,7 @@ module Blacklight
114
114
 
115
115
  def set_default_proc!
116
116
  self.default_proc = lambda do |hash, key|
117
- hash[key] = nested_class.new(key: key)
117
+ hash[key] = nested_class.new({ key: key })
118
118
  end
119
119
  end
120
120
  end
@@ -53,19 +53,19 @@ module Blacklight
53
53
  self.class.new @table.deep_dup
54
54
  end
55
55
 
56
- def deep_transform_values(&method)
57
- self.class.new @table.deep_transform_values(&method)
56
+ def deep_transform_values(&)
57
+ self.class.new @table.deep_transform_values(&)
58
58
  end
59
59
 
60
- def try(method_name = nil, *args, &block)
60
+ def try(method_name = nil, *, &)
61
61
  if method_name.nil? && block_given?
62
62
  if b.arity.zero?
63
- instance_eval(&block)
63
+ instance_eval(&)
64
64
  else
65
65
  yield self
66
66
  end
67
67
  elsif respond_to?(method_name)
68
- public_send(method_name, *args, &b)
68
+ public_send(method_name, *, &b)
69
69
  end
70
70
  end
71
71
  end