blacklight 7.41.0 → 8.0.0.beta1

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 (425) hide show
  1. checksums.yaml +4 -4
  2. data/.env +2 -3
  3. data/.github/workflows/ruby.yml +81 -0
  4. data/.rubocop.yml +243 -14
  5. data/.rubocop_todo.yml +137 -429
  6. data/Gemfile +11 -6
  7. data/README.md +11 -3
  8. data/VERSION +1 -1
  9. data/app/assets/javascripts/blacklight/blacklight.esm.js +384 -0
  10. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  11. data/app/assets/javascripts/blacklight/blacklight.js +374 -493
  12. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  13. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  14. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  15. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  16. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  17. data/app/assets/stylesheets/blacklight/_constraints.scss +4 -4
  18. data/app/assets/stylesheets/blacklight/_facets.scss +72 -44
  19. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  20. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  21. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  22. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  23. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  24. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  25. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  26. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  27. data/app/builders/blacklight/action_builder.rb +18 -9
  28. data/app/components/blacklight/advanced_search_form_component.html.erb +3 -3
  29. data/app/components/blacklight/advanced_search_form_component.rb +8 -10
  30. data/app/components/blacklight/constraints_component.rb +27 -37
  31. data/app/components/blacklight/document/action_component.rb +12 -10
  32. data/app/components/blacklight/document/actions_component.rb +2 -2
  33. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  34. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  35. data/app/components/blacklight/document/citation_component.rb +5 -3
  36. data/app/components/blacklight/document/group_component.rb +7 -3
  37. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  38. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  39. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  40. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  41. data/app/components/blacklight/document_component.html.erb +1 -1
  42. data/app/components/blacklight/document_component.rb +16 -78
  43. data/app/components/blacklight/document_metadata_component.html.erb +2 -4
  44. data/app/components/blacklight/document_metadata_component.rb +5 -10
  45. data/app/components/blacklight/facet_component.rb +3 -3
  46. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +4 -4
  47. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  48. data/app/components/blacklight/facet_field_component.html.erb +4 -5
  49. data/app/components/blacklight/facet_field_component.rb +9 -2
  50. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  51. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  52. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  53. data/app/components/blacklight/facet_item_component.rb +1 -43
  54. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  55. data/app/components/blacklight/header_component.rb +1 -1
  56. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  57. data/app/components/blacklight/icons/icon_component.rb +4 -9
  58. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  59. data/app/components/blacklight/icons/list_component.rb +16 -0
  60. data/app/components/blacklight/icons/search_component.rb +16 -0
  61. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  62. data/app/components/blacklight/metadata_field_component.rb +24 -8
  63. data/app/components/blacklight/metadata_field_layout_component.rb +4 -25
  64. data/app/components/blacklight/response/facet_group_component.html.erb +3 -5
  65. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  66. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  67. data/app/components/blacklight/response/pagination_component.rb +2 -11
  68. data/app/components/blacklight/response/sort_component.html.erb +6 -1
  69. data/app/components/blacklight/response/sort_component.rb +1 -16
  70. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  71. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  72. data/app/components/blacklight/response/view_type_component.rb +4 -6
  73. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  74. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  75. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  76. data/app/components/blacklight/search_bar_component.rb +2 -16
  77. data/app/components/blacklight/search_button_component.rb +3 -3
  78. data/app/components/blacklight/search_context_component.rb +43 -10
  79. data/app/components/blacklight/search_header_component.html.erb +2 -0
  80. data/app/components/blacklight/search_header_component.rb +6 -0
  81. data/app/components/blacklight/start_over_button_component.rb +5 -3
  82. data/app/components/blacklight/system/dropdown_component.rb +8 -5
  83. data/app/components/blacklight/system/flash_message_component.html.erb +4 -2
  84. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  85. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  86. data/app/components/blacklight/system/modal_component.rb +1 -3
  87. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  88. data/app/components/blacklight/top_navbar_component.rb +0 -4
  89. data/app/controllers/bookmarks_controller.rb +1 -0
  90. data/app/controllers/catalog_controller.rb +1 -0
  91. data/app/controllers/concerns/blacklight/bookmarks.rb +10 -9
  92. data/app/controllers/concerns/blacklight/catalog.rb +21 -83
  93. data/app/controllers/concerns/blacklight/controller.rb +3 -41
  94. data/app/controllers/concerns/blacklight/search_context.rb +25 -7
  95. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  96. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  97. data/app/controllers/concerns/blacklight/token_based_user.rb +13 -1
  98. data/app/controllers/search_history_controller.rb +1 -0
  99. data/app/helpers/blacklight/blacklight_helper_behavior.rb +12 -310
  100. data/app/helpers/blacklight/catalog_helper_behavior.rb +22 -139
  101. data/app/helpers/blacklight/component_helper_behavior.rb +2 -53
  102. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -119
  103. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  104. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -7
  105. data/app/helpers/blacklight/layout_helper_behavior.rb +4 -3
  106. data/app/helpers/blacklight/render_partials_helper_behavior.rb +11 -31
  107. data/app/helpers/blacklight/url_helper_behavior.rb +12 -97
  108. data/app/helpers/blacklight_helper.rb +1 -0
  109. data/app/helpers/catalog_helper.rb +1 -0
  110. data/app/javascript/blacklight/bookmark_toggle.js +13 -19
  111. data/app/javascript/blacklight/button_focus.js +12 -10
  112. data/app/javascript/blacklight/checkbox_submit.js +68 -123
  113. data/app/javascript/blacklight/core.js +5 -7
  114. data/app/javascript/blacklight/index.js +13 -0
  115. data/app/javascript/blacklight/modal.js +99 -164
  116. data/app/javascript/blacklight/modalForm.js +60 -0
  117. data/app/javascript/blacklight/search_context.js +46 -54
  118. data/app/models/blacklight/facet_paginator.rb +3 -2
  119. data/app/models/blacklight/icon.rb +4 -2
  120. data/app/models/bookmark.rb +0 -2
  121. data/app/models/concerns/blacklight/configurable.rb +5 -4
  122. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -10
  123. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  124. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  125. data/app/models/concerns/blacklight/document/email.rb +1 -0
  126. data/app/models/concerns/blacklight/document/export.rb +2 -1
  127. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  128. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  129. data/app/models/concerns/blacklight/document/semantic_fields.rb +2 -1
  130. data/app/models/concerns/blacklight/document/sms.rb +1 -0
  131. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  132. data/app/models/concerns/blacklight/user.rb +17 -8
  133. data/app/models/record_mailer.rb +13 -12
  134. data/app/models/search.rb +1 -7
  135. data/app/models/solr_document.rb +1 -0
  136. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  137. data/app/presenters/blacklight/document_presenter.rb +23 -50
  138. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  139. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  140. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  141. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  142. data/app/presenters/blacklight/field_presenter.rb +1 -0
  143. data/app/presenters/blacklight/index_presenter.rb +2 -40
  144. data/app/presenters/blacklight/json_presenter.rb +10 -6
  145. data/app/presenters/blacklight/rendering/link_to_facet.rb +2 -5
  146. data/app/presenters/blacklight/show_presenter.rb +1 -9
  147. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  148. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  149. data/app/services/blacklight/field_retriever.rb +12 -21
  150. data/app/services/blacklight/search_service.rb +10 -17
  151. data/app/values/blacklight/types.rb +0 -18
  152. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  153. data/app/views/bookmarks/_tools.html.erb +7 -12
  154. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  155. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  156. data/app/views/catalog/_citation.html.erb +1 -1
  157. data/app/views/catalog/_constraints.html.erb +1 -14
  158. data/app/views/catalog/_document.atom.builder +12 -14
  159. data/app/views/catalog/_document.html.erb +5 -3
  160. data/app/views/catalog/_document.rss.builder +2 -4
  161. data/app/views/catalog/_facet_layout.html.erb +2 -2
  162. data/app/views/catalog/_facets.html.erb +5 -4
  163. data/app/views/catalog/_home_text.html.erb +2 -14
  164. data/app/views/catalog/_per_page_widget.html.erb +10 -1
  165. data/app/views/catalog/_search_form.html.erb +2 -2
  166. data/app/views/catalog/_search_header.html.erb +1 -2
  167. data/app/views/catalog/_search_results.html.erb +2 -2
  168. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  169. data/app/views/catalog/_show_main_content.html.erb +11 -16
  170. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  171. data/app/views/catalog/_show_tools.html.erb +8 -14
  172. data/app/views/catalog/_view_type_group.html.erb +1 -1
  173. data/app/views/catalog/email.html.erb +2 -2
  174. data/app/views/catalog/email_success.html.erb +5 -6
  175. data/app/views/catalog/facet.html.erb +7 -5
  176. data/app/views/catalog/index.atom.builder +12 -14
  177. data/app/views/catalog/index.html.erb +4 -1
  178. data/app/views/catalog/index.json.jbuilder +19 -19
  179. data/app/views/catalog/index.rss.builder +1 -1
  180. data/app/views/catalog/opensearch.xml.builder +1 -1
  181. data/app/views/catalog/sms.html.erb +2 -2
  182. data/app/views/catalog/sms_success.html.erb +5 -6
  183. data/app/views/catalog/suggest.html.erb +3 -0
  184. data/app/views/kaminari/blacklight/_page.html.erb +2 -1
  185. data/app/views/layouts/blacklight/base.html.erb +13 -2
  186. data/app/views/search_history/index.html.erb +6 -2
  187. data/app/views/shared/_flash_messages.html.erb +1 -1
  188. data/app/views/shared/_modal.html.erb +3 -3
  189. data/blacklight.gemspec +7 -11
  190. data/config/importmap.rb +3 -0
  191. data/config/locales/blacklight.ar.yml +0 -1
  192. data/config/locales/blacklight.ca.yml +0 -1
  193. data/config/locales/blacklight.de.yml +0 -1
  194. data/config/locales/blacklight.en.yml +0 -2
  195. data/config/locales/blacklight.es.yml +0 -1
  196. data/config/locales/blacklight.fr.yml +0 -1
  197. data/config/locales/blacklight.hu.yml +0 -1
  198. data/config/locales/blacklight.it.yml +0 -1
  199. data/config/locales/blacklight.nl.yml +0 -1
  200. data/config/locales/blacklight.pt-BR.yml +0 -1
  201. data/config/locales/blacklight.sq.yml +0 -1
  202. data/config/locales/blacklight.zh.yml +0 -1
  203. data/config/routes.rb +3 -2
  204. data/db/migrate/20140202020201_create_searches.rb +1 -0
  205. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  206. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  207. data/docker-compose.yml +3 -3
  208. data/lib/blacklight/abstract_repository.rb +1 -6
  209. data/lib/blacklight/component.rb +47 -10
  210. data/lib/blacklight/configuration/context.rb +4 -4
  211. data/lib/blacklight/configuration/display_field.rb +7 -9
  212. data/lib/blacklight/configuration/facet_field.rb +17 -11
  213. data/lib/blacklight/configuration/field.rb +1 -0
  214. data/lib/blacklight/configuration/fields.rb +12 -15
  215. data/lib/blacklight/configuration/index_field.rb +1 -0
  216. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  217. data/lib/blacklight/configuration/search_field.rb +1 -0
  218. data/lib/blacklight/configuration/show_field.rb +1 -0
  219. data/lib/blacklight/configuration/sort_field.rb +1 -0
  220. data/lib/blacklight/configuration/tool_config.rb +1 -0
  221. data/lib/blacklight/configuration/view_config.rb +14 -10
  222. data/lib/blacklight/configuration.rb +310 -365
  223. data/lib/blacklight/engine.rb +8 -24
  224. data/lib/blacklight/exceptions.rb +2 -2
  225. data/lib/blacklight/nested_open_struct_with_hash_access.rb +7 -13
  226. data/lib/blacklight/open_struct_with_hash_access.rb +23 -6
  227. data/lib/blacklight/parameters.rb +7 -21
  228. data/lib/blacklight/routes/exportable.rb +1 -0
  229. data/lib/blacklight/routes/searchable.rb +2 -1
  230. data/lib/blacklight/routes.rb +1 -0
  231. data/lib/blacklight/search_builder.rb +10 -10
  232. data/lib/blacklight/search_state/filter_field.rb +8 -25
  233. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  234. data/lib/blacklight/search_state.rb +23 -79
  235. data/lib/blacklight/solr/document.rb +1 -0
  236. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  237. data/lib/blacklight/solr/repository.rb +4 -24
  238. data/lib/blacklight/solr/request.rb +1 -0
  239. data/lib/blacklight/solr/response/facets.rb +21 -5
  240. data/lib/blacklight/solr/response/group.rb +1 -0
  241. data/lib/blacklight/solr/response/group_response.rb +1 -0
  242. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  243. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  244. data/lib/blacklight/solr/response/params.rb +5 -4
  245. data/lib/blacklight/solr/response/response.rb +1 -0
  246. data/lib/blacklight/solr/response/spelling.rb +1 -0
  247. data/lib/blacklight/solr/response.rb +16 -3
  248. data/lib/blacklight/solr/search_builder_behavior.rb +16 -35
  249. data/lib/blacklight/solr.rb +7 -0
  250. data/lib/blacklight/version.rb +1 -0
  251. data/lib/blacklight.rb +26 -14
  252. data/lib/generators/blacklight/assets/importmap_generator.rb +55 -0
  253. data/lib/generators/blacklight/assets/propshaft_generator.rb +25 -0
  254. data/lib/generators/blacklight/assets/sprockets_generator.rb +66 -0
  255. data/lib/generators/blacklight/assets_generator.rb +13 -86
  256. data/lib/generators/blacklight/controller_generator.rb +4 -3
  257. data/lib/generators/blacklight/document_generator.rb +1 -0
  258. data/lib/generators/blacklight/install_generator.rb +4 -3
  259. data/lib/generators/blacklight/models_generator.rb +1 -0
  260. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  261. data/lib/generators/blacklight/solr_generator.rb +1 -1
  262. data/lib/generators/blacklight/templates/catalog_controller.rb +34 -8
  263. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +1 -70
  264. data/lib/generators/blacklight/test_support_generator.rb +5 -3
  265. data/lib/generators/blacklight/user_generator.rb +7 -9
  266. data/lib/railties/blacklight.rake +6 -7
  267. data/package.json +10 -13
  268. data/rollup.config.js +27 -0
  269. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  270. data/spec/components/blacklight/document/action_component_spec.rb +6 -1
  271. data/spec/components/blacklight/document_component_spec.rb +22 -131
  272. data/spec/components/blacklight/facet_component_spec.rb +3 -18
  273. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  274. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  275. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +10 -9
  276. data/spec/components/blacklight/response/view_type_component_spec.rb +66 -0
  277. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  278. data/spec/components/blacklight/search_context_component_spec.rb +17 -8
  279. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  280. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  281. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  282. data/spec/controllers/catalog_controller_spec.rb +13 -135
  283. data/spec/features/advanced_search_spec.rb +0 -56
  284. data/spec/features/autocomplete_spec.rb +1 -1
  285. data/spec/features/axe_spec.rb +1 -6
  286. data/spec/features/bookmarks_spec.rb +1 -1
  287. data/spec/features/facets_spec.rb +6 -4
  288. data/spec/features/search_context_spec.rb +5 -11
  289. data/spec/features/search_results_spec.rb +0 -33
  290. data/spec/features/sitelinks_search_box.rb +13 -0
  291. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  292. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  293. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  294. data/spec/helpers/blacklight/layout_helper_behavior_spec.rb +3 -20
  295. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  296. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +9 -131
  297. data/spec/helpers/blacklight_helper_spec.rb +8 -252
  298. data/spec/helpers/catalog_helper_spec.rb +7 -118
  299. data/spec/i18n_spec.rb +1 -0
  300. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  301. data/spec/lib/blacklight/component_spec.rb +27 -32
  302. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  303. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  304. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  305. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +2 -2
  306. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  307. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  308. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  309. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  310. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  311. data/spec/models/blacklight/configuration_spec.rb +17 -51
  312. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  313. data/spec/models/blacklight/icon_spec.rb +31 -15
  314. data/spec/models/blacklight/search_builder_spec.rb +9 -9
  315. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  316. data/spec/models/blacklight/solr/repository_spec.rb +0 -45
  317. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  318. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  319. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  320. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  321. data/spec/models/blacklight/solr/search_builder_spec.rb +24 -44
  322. data/spec/models/blacklight/user_spec.rb +22 -0
  323. data/spec/models/solr_document_spec.rb +3 -9
  324. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  325. data/spec/presenters/blacklight/document_presenter_spec.rb +2 -3
  326. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  327. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  328. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  329. data/spec/presenters/blacklight/field_presenter_spec.rb +0 -14
  330. data/spec/presenters/blacklight/index_presenter_spec.rb +2 -5
  331. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  332. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  333. data/spec/presenters/blacklight/show_presenter_spec.rb +20 -30
  334. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  335. data/spec/requests/load_suggestions_spec.rb +16 -0
  336. data/spec/routing/catalog_routing_spec.rb +2 -1
  337. data/spec/services/blacklight/search_service_spec.rb +39 -76
  338. data/spec/spec_helper.rb +8 -9
  339. data/spec/support/controller_level_helpers.rb +1 -2
  340. data/spec/support/features/search_helpers.rb +39 -0
  341. data/spec/support/features/session_helpers.rb +1 -0
  342. data/spec/support/features.rb +3 -0
  343. data/spec/support/view_component_capybara_test_helpers.rb +8 -0
  344. data/spec/test_app_templates/Gemfile.extra +1 -0
  345. data/spec/test_app_templates/lib/generators/test_app_generator.rb +9 -2
  346. data/spec/views/catalog/_document.html.erb_spec.rb +3 -34
  347. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  348. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +0 -2
  349. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  350. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  351. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -66
  352. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  353. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  354. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  355. data/spec/views/catalog/index.atom.builder_spec.rb +17 -11
  356. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  357. data/spec/views/catalog/index.json.jbuilder_spec.rb +2 -2
  358. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  360. data/tasks/blacklight.rake +11 -9
  361. data/template.demo.rb +7 -7
  362. metadata +77 -189
  363. data/.babelrc +0 -11
  364. data/.github/matrix.json +0 -62
  365. data/.github/workflows/build.yml +0 -16
  366. data/.github/workflows/lint.yml +0 -23
  367. data/.github/workflows/main.yml +0 -23
  368. data/.github/workflows/test.yml +0 -53
  369. data/app/assets/images/blacklight/list.svg +0 -1
  370. data/app/assets/images/blacklight/search.svg +0 -1
  371. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  372. data/app/components/blacklight/content_areas_shim.rb +0 -13
  373. data/app/components/blacklight/search/per_page_component.html.erb +0 -2
  374. data/app/components/blacklight/search/per_page_component.rb +0 -50
  375. data/app/components/blacklight/search_context/server_item_pagination_component.html.erb +0 -10
  376. data/app/components/blacklight/search_context/server_item_pagination_component.rb +0 -15
  377. data/app/components/blacklight/system/dropdown_button_component.rb +0 -18
  378. data/app/controllers/concerns/blacklight/base.rb +0 -12
  379. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  380. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  381. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  382. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  383. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  384. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  385. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  386. data/app/javascript/blacklight/autocomplete.js +0 -36
  387. data/app/javascript/blacklight/facet_load.js +0 -22
  388. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  389. data/app/views/catalog/_constraints_element.html.erb +0 -14
  390. data/app/views/catalog/_document_action.html.erb +0 -5
  391. data/app/views/catalog/_facet_group.html.erb +0 -5
  392. data/app/views/catalog/_facet_limit.html.erb +0 -3
  393. data/app/views/catalog/_index.html.erb +0 -1
  394. data/app/views/catalog/_index_header.html.erb +0 -22
  395. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  396. data/app/views/catalog/_show.html.erb +0 -6
  397. data/app/views/catalog/_show_header.html.erb +0 -2
  398. data/app/views/catalog/_thumbnail.html.erb +0 -1
  399. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  400. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  401. data/spec/components/blacklight/header_component_spec.rb +0 -20
  402. data/spec/components/blacklight/icons/icon_component_spec.rb +0 -42
  403. data/spec/components/blacklight/response/pagination_component_spec.rb +0 -53
  404. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +0 -35
  405. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  406. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  407. data/spec/features/citation_spec.rb +0 -10
  408. data/spec/features/sitelinks_search_box_spec.rb +0 -13
  409. data/spec/features/sms_spec.rb +0 -12
  410. data/spec/helpers/blacklight/hash_as_hidden_fields_behavior_spec.rb +0 -26
  411. data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +0 -92
  412. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +0 -101
  413. data/spec/helpers/blacklight/suggest_helper_behavior_spec.rb +0 -48
  414. data/spec/lib/blacklight/engine_spec.rb +0 -41
  415. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  416. data/spec/services/blacklight/field_retriever_spec.rb +0 -17
  417. data/spec/support/view_component_test_helpers.rb +0 -35
  418. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  419. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  420. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  421. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  422. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  423. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  424. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  425. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
@@ -1,11 +1,11 @@
1
1
  <%= render(@layout.new(facet_field: @facet_field)) do |component| %>
2
- <% component.with_label do %>
2
+ <% component.label do %>
3
3
  <%= @facet_field.label %>
4
4
  <% end %>
5
- <% component.with_body do %>
5
+ <% component.body do %>
6
6
  <%= helpers.render(Blacklight::FacetFieldInclusiveConstraintComponent.new(facet_field: @facet_field)) %>
7
7
  <ul class="facet-values list-unstyled">
8
- <%= render_facet_limit_list @facet_field.paginator, @facet_field.key %>
8
+ <%= render facet_items %>
9
9
  </ul>
10
10
  <%# backwards compatibility, ugh %>
11
11
  <% if @layout == Blacklight::FacetFieldNoLayoutComponent && !@facet_field.in_modal? && @facet_field.modal_path %>
@@ -7,16 +7,48 @@ module Blacklight
7
7
  @layout = layout == false ? FacetFieldNoLayoutComponent : Blacklight::FacetFieldComponent
8
8
  end
9
9
 
10
- # Here for backwards compatibility only.
11
- # @private
12
- def render_facet_limit_list(*args)
13
- Deprecation.silence(Blacklight::FacetsHelperBehavior) do
14
- helpers.render_facet_limit_list(*args)
10
+ ##
11
+ # Renders the list of values
12
+ # removes any elements where render_facet_item returns a nil value. This enables an application
13
+ # to filter undesireable facet items so they don't appear in the UI
14
+ # @deprecated
15
+ def render_facet_limit_list(paginator, facet_field, wrapping_element = :li)
16
+ return render(facet_items(wrapping_element: wrapping_element)) if paginator == @facet_field.paginator && facet_field == @facet_field.key
17
+
18
+ facet_config ||= helpers.facet_configuration_for_field(facet_field)
19
+
20
+ collection = paginator.items.map do |item|
21
+ facet_item_presenter(item, facet_config, facet_field)
22
+ end
23
+
24
+ render(facet_item_component_class(facet_config).with_collection(collection, wrapping_element: wrapping_element))
25
+ end
26
+ Blacklight.deprecation.deprecate_methods(self, render_facet_limit_list: 'Call e.g. `render facet_items` instead')
27
+
28
+ def facet_items(wrapping_element: :li, **item_args)
29
+ facet_item_component_class.with_collection(facet_item_presenters, wrapping_element: wrapping_element, **item_args)
30
+ end
31
+
32
+ def facet_item_presenters
33
+ @facet_field.paginator.items.map do |item|
34
+ facet_item_presenter(item)
15
35
  end
16
36
  end
17
37
 
18
38
  def render?
19
39
  @facet_field.paginator&.items&.any?
20
40
  end
41
+
42
+ def facet_item_presenter(facet_item, deprecated_facet_config = nil, facet_field = nil)
43
+ (deprecated_facet_config || facet_config).item_presenter.new(facet_item, deprecated_facet_config || facet_config, helpers, facet_field || @facet_field.key)
44
+ end
45
+
46
+ def facet_item_component_class(deprecated_facet_config = nil)
47
+ (deprecated_facet_config || facet_config).item_component
48
+ end
49
+
50
+ def facet_config
51
+ @facet_field.facet_field
52
+ end
21
53
  end
22
54
  end
@@ -2,8 +2,6 @@
2
2
 
3
3
  module Blacklight
4
4
  class FacetFieldNoLayoutComponent < Blacklight::Component
5
- include Blacklight::ContentAreasShim
6
-
7
5
  renders_one :label
8
6
  renders_one :body
9
7
 
@@ -2,8 +2,6 @@
2
2
 
3
3
  module Blacklight
4
4
  class FacetItemComponent < Blacklight::Component
5
- extend Deprecation
6
-
7
5
  attr_reader :label, :href, :hits
8
6
 
9
7
  with_collection_parameter :facet_item
@@ -21,9 +19,7 @@ module Blacklight
21
19
  def call
22
20
  # if the downstream app has overridden the helper methods we'd usually call,
23
21
  # use the helpers to preserve compatibility
24
- content = if overridden_helper_methods?
25
- content_from_legacy_view_helper
26
- elsif @selected
22
+ content = if @selected
27
23
  render_selected_facet_value
28
24
  else
29
25
  render_facet_value
@@ -35,36 +31,6 @@ module Blacklight
35
31
  content_tag @wrapping_element, content
36
32
  end
37
33
 
38
- # This is a little shim to let us call the render methods below outside the
39
- # usual component rendering cycle (for backward compatibility)
40
- # @private
41
- # @deprecated
42
- def with_view_context(view_context)
43
- @view_context = view_context
44
- self
45
- end
46
-
47
- # Check if the downstream application has overridden these methods
48
- # @deprecated
49
- # @private
50
- def overridden_helper_methods?
51
- return false if explicit_component_configuration?
52
-
53
- helpers.method(:render_facet_item).owner != Blacklight::FacetsHelperBehavior ||
54
- helpers.method(:render_facet_value).owner != Blacklight::FacetsHelperBehavior ||
55
- helpers.method(:render_selected_facet_value).owner != Blacklight::FacetsHelperBehavior
56
- end
57
-
58
- # Call out to the helper method equivalent of this component
59
- # @deprecated
60
- # @private
61
- def content_from_legacy_view_helper
62
- Deprecation.warn(self.class, 'Calling out to the #render_facet_item helper for backwards compatibility.')
63
- Deprecation.silence(Blacklight::FacetsHelperBehavior) do
64
- @view_context.render_facet_item(@facet_item.facet_field, @facet_item.facet_item)
65
- end
66
- end
67
-
68
34
  ##
69
35
  # Standard display of a facet value in a list. Used in both _facets sidebar
70
36
  # partial and catalog/facet expanded list. Will output facet value name as
@@ -103,18 +69,10 @@ module Blacklight
103
69
  # @return [String]
104
70
  # @private
105
71
  def render_facet_count(options = {})
106
- return helpers.render_facet_count(hits, options) unless helpers.method(:render_facet_count).owner == Blacklight::FacetsHelperBehavior || explicit_component_configuration?
107
-
108
72
  return '' if hits.blank?
109
73
 
110
74
  classes = (options[:classes] || []) << "facet-count"
111
75
  tag.span(t('blacklight.search.facets.count', number: number_with_delimiter(hits)), class: classes)
112
76
  end
113
-
114
- private
115
-
116
- def explicit_component_configuration?
117
- @facet_item.facet_config.item_component.present?
118
- end
119
77
  end
120
78
  end
@@ -6,7 +6,7 @@ module Blacklight
6
6
  # Somewhat arbitrary number; the only important thing is that
7
7
  # it is bigger than the number of leaf nodes in any collapsing
8
8
  # pivot facet on the page.
9
- ID_COUNTER_MAX = 2**20 - 1
9
+ ID_COUNTER_MAX = (2**20) - 1
10
10
 
11
11
  # Mint a (sufficiently) unique identifier, so we can associate
12
12
  # the expand/collapse control with labels
@@ -24,7 +24,7 @@ module Blacklight
24
24
  @wrapping_element = wrapping_element
25
25
  @suppress_link = suppress_link
26
26
  @collapsing = collapsing.nil? ? facet_item.facet_config.collapsing : collapsing
27
- @icons = { show: '', hide: '' }.merge(facet_item.facet_config.icons || {})
27
+ @icons = { show: tag.span(class: 'icon'), hide: tag.span(class: 'icon') }.merge(facet_item.facet_config.icons || {})
28
28
  end
29
29
 
30
30
  def call
@@ -32,15 +32,16 @@ module Blacklight
32
32
 
33
33
  id = "h-#{self.class.mint_id}" if @collapsing && has_items?
34
34
 
35
- content_tag @wrapping_element, role: 'treeitem' do
36
- concat facet_toggle_button(id) if has_items? && @collapsing
37
- concat content_tag('span', render_component(facet), class: "facet-values #{'facet-leaf-node' if has_items? && @collapsing}", id: id && "#{id}_label")
38
-
35
+ content_tag @wrapping_element, role: 'treeitem', class: 'treeitem' do
36
+ concat(content_tag('span', class: "d-flex flex-row align-items-center") do
37
+ concat facet_toggle_button(id) if has_items? && @collapsing
38
+ 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
+ end)
39
40
  if has_items?
40
- concat(content_tag('ul', class: "pivot-facet list-unstyled #{'collapse' if @collapsing}", id: id, role: 'group') do
41
- render_component(
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
42
+ render(
42
43
  self.class.with_collection(
43
- @facet_item.items.map { |i| facet_item_presenter(i) }
44
+ @facet_item.facet_item_presenters.to_a
44
45
  )
45
46
  )
46
47
  end)
@@ -51,13 +52,21 @@ module Blacklight
51
52
  private
52
53
 
53
54
  def has_items?
54
- @facet_item.items.present?
55
+ return unless @facet_item.respond_to? :facet_item_presenters
56
+
57
+ @facet_item.facet_item_presenters.any?
58
+ end
59
+
60
+ def expanded?
61
+ return unless @collapsing
62
+
63
+ @facet_item.shown?
55
64
  end
56
65
 
57
66
  def facet_toggle_button(id)
58
- content_tag 'button', class: 'btn facet-toggle-handle collapsed',
67
+ content_tag 'button', class: %w[btn facet-toggle-handle] + [('collapsed' unless expanded?)],
59
68
  data: { toggle: 'collapse', 'bs-toggle': 'collapse', target: "##{id}", 'bs-target': "##{id}" },
60
- aria: { expanded: false, controls: id, describedby: "#{id}_label" } do
69
+ aria: { expanded: expanded?, controls: id, describedby: "#{id}_label" } do
61
70
  concat toggle_icon(:show)
62
71
  concat toggle_icon(:hide)
63
72
  end
@@ -69,16 +78,5 @@ module Blacklight
69
78
  concat content_tag('span', t(type, scope: 'blacklight.search.facets.pivot'), class: 'sr-only visually-hidden')
70
79
  end
71
80
  end
72
-
73
- # This is a little convoluted in Blacklight 7 in order to maintain backwards-compat
74
- # with overrides of deprecated helpers. In 8.x, we can just call Component#render_in
75
- # and call it a day
76
- def render_component(component)
77
- helpers.render(component)
78
- end
79
-
80
- def facet_item_presenter(facet_item)
81
- (@facet_item.facet_config.item_presenter || Blacklight::FacetItemPresenter).new(facet_item, @facet_item.facet_config, helpers, @facet_item.facet_field, @facet_item.search_state)
82
- end
83
81
  end
84
82
  end
@@ -17,7 +17,7 @@ module Blacklight
17
17
  attr_reader :blacklight_config
18
18
 
19
19
  # Hack so that the default lambdas are triggered
20
- # so that we don't have to do c.top_bar() in the call.
20
+ # so that we don't have to do c.with_top_bar() in the call.
21
21
  def before_render
22
22
  set_slot(:top_bar, nil) unless top_bar
23
23
  set_slot(:search_bar, nil) unless search_bar
@@ -7,8 +7,7 @@ module Blacklight
7
7
  class HiddenSearchStateComponent < Blacklight::Component
8
8
  # @param [Hash] params
9
9
  def initialize(params:)
10
- Deprecation.warn(self, "Passing page as a parameter to HiddenSearchStateComponent is deprecated and will not be supported in Blacklight 8") if params.key?(:page)
11
- @params = params.except(:utf8)
10
+ @params = params.except(:page, :utf8)
12
11
  end
13
12
 
14
13
  def call
@@ -2,16 +2,15 @@
2
2
 
3
3
  module Blacklight
4
4
  module Icons
5
- # This is the base class for icon components. You should extend this class for each icon.
6
- #
5
+ # This is the list icon for the search button.
7
6
  # You can override the default svg by setting:
8
- # Blacklight::Icons::MyIconComponent.svg = '<svg>your SVG here</svg>'
7
+ # Blacklight::Icons::ListComponent.svg = '<svg>your SVG here</svg>'
9
8
  class IconComponent < ::ViewComponent::Base
10
9
  # rubocop:disable Metrics/ParameterLists
11
10
  def initialize(svg: nil, tag: :span, name: nil, label: nil, aria_hidden: nil, classes: nil, **options)
12
11
  self.svg = svg if svg
12
+ @classes = Array(classes) + ['blacklight-icons', "blacklight-icons-#{name}"]
13
13
  @name = name
14
- @assigned_classes = Array(classes)
15
14
  @tag = tag
16
15
  @options = options.merge(aria: options.fetch(:aria, {}).reverse_merge(label: label, hidden: aria_hidden))
17
16
  end
@@ -19,16 +18,12 @@ module Blacklight
19
18
 
20
19
  def call
21
20
  tag.public_send(@tag, svg&.html_safe, # rubocop:disable Rails/OutputSafety
22
- class: classes,
21
+ class: @classes,
23
22
  **@options)
24
23
  end
25
24
 
26
25
  class_attribute :svg
27
26
 
28
- def classes
29
- @classes ||= @assigned_classes + ['blacklight-icons', "blacklight-icons-#{name}"]
30
- end
31
-
32
27
  def name
33
28
  @name ||= self.class.name.demodulize.underscore.sub('_component', '')
34
29
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ class LegacyIconComponent < ::ViewComponent::Base
6
+ def initialize(name:, classes: '', aria_hidden: false, label: true, role: 'img', additional_options: {})
7
+ @name = name
8
+ @classes = classes
9
+ @aria_hidden = aria_hidden
10
+ @icon = Blacklight::Icon.new(name, classes: classes, label: label, role: role, additional_options: additional_options)
11
+ end
12
+
13
+ def call
14
+ tag.span(svg&.html_safe || default_icon, # rubocop:disable Rails/OutputSafety
15
+ class: "blacklight-icons blacklight-icon-#{@name} #{@classes}".strip,
16
+ 'aria-hidden': (true if @aria_hidden))
17
+ end
18
+
19
+ def svg
20
+ Rails.cache.fetch([:blacklight_icon_svg, @name]) do
21
+ @icon.svg if @icon.present?
22
+ end
23
+ end
24
+
25
+ def default_icon
26
+ @icon.icon_label
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # This is the list icon for the search button.
6
+ # You can override the default svg by setting:
7
+ # Blacklight::Icons::ListComponent.svg = '<svg>your SVG here</svg>'
8
+ class ListComponent < Blacklight::Icons::IconComponent
9
+ self.svg = <<~SVG
10
+ <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" aria-hidden="true" width="24" height="24" viewBox="0 0 24 24">
11
+ <path d="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z"/><path d="M0 0h24v24H0z" fill="none"/>
12
+ </svg>
13
+ SVG
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Icons
5
+ # This is the magnifing glass icon for the search button.
6
+ # You can override the default svg by setting:
7
+ # Blacklight::Icons::SearchComponent.svg = '<svg>your SVG here</svg>'
8
+ class SearchComponent < Blacklight::Icons::IconComponent
9
+ self.svg = <<~SVG
10
+ <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" aria-hidden="true" width="24" height="24" viewBox="0 0 24 24">
11
+ <path fill="none" d="M0 0h24v24H0V0z"/><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
12
+ </svg>
13
+ SVG
14
+ end
15
+ end
16
+ end
@@ -1,8 +1,8 @@
1
1
  <%= render(@layout.new(field: @field)) do |component| %>
2
- <% component.with_label do %>
2
+ <% component.label do %>
3
3
  <%= label %>
4
4
  <% end %>
5
- <% component.with_value do %>
5
+ <% component.value do %>
6
6
  <%= @field.render %>
7
7
  <% end %>
8
8
  <% end %>
@@ -7,25 +7,41 @@ module Blacklight
7
7
  # @param field [Blacklight::FieldPresenter]
8
8
  # @param layout [Blacklight::MetadataFieldLayoutComponent] alternate layout component to use
9
9
  # @param show [Boolean] are we showing only a single document (vs a list of search results); used for backwards-compatibility
10
- def initialize(field:, layout: nil, show: false)
10
+ def initialize(field:, layout: nil, show: false, view_type: nil)
11
11
  @field = field
12
12
  @layout = layout || Blacklight::MetadataFieldLayoutComponent
13
+ @view_type = view_type
13
14
  @show = show
14
15
  end
15
16
 
16
- # @private
17
17
  def label
18
- Deprecation.silence(Blacklight::BlacklightHelperBehavior) do
19
- if @show
20
- helpers.render_document_show_field_label @field.document, label: @field.label('show'), field: @field.key
21
- else
22
- helpers.render_index_field_label @field.document, label: @field.label, field: @field.key
23
- end
18
+ if @show
19
+ show_field_label @field.label('show')
20
+ else
21
+ index_field_label @field.label
24
22
  end
25
23
  end
26
24
 
27
25
  def render?
28
26
  @field.render_field?
29
27
  end
28
+
29
+ ##
30
+ # Render the index field label for a document
31
+ #
32
+ # Translations for index field labels should go under blacklight.search.fields
33
+ # They are picked up from there by a value "%{label}" in blacklight.search.index.label
34
+ # @return [String]
35
+ def index_field_label label
36
+ html_escape t(:"blacklight.search.index.#{@view_type}.label", default: :'blacklight.search.index.label', label: label)
37
+ end
38
+
39
+ ##
40
+ # Render the show field label for a document
41
+ #
42
+ # @return [String]
43
+ def show_field_label label
44
+ t(:'blacklight.search.show.label', label: label)
45
+ end
30
46
  end
31
47
  end
@@ -2,43 +2,22 @@
2
2
 
3
3
  module Blacklight
4
4
  class MetadataFieldLayoutComponent < Blacklight::Component
5
- include Blacklight::ContentAreasShim
6
-
7
5
  with_collection_parameter :field
8
6
  renders_one :label
9
7
  renders_many :values, (lambda do |value: nil, &block|
10
- if @value_tag.nil?
11
- block&.call || value
12
- elsif block
13
- content_tag @value_tag, class: "#{@value_class} blacklight-#{@key}", &block
8
+ if block
9
+ content_tag :dd, class: "#{@value_class} blacklight-#{@key}", &block
14
10
  else
15
- content_tag @value_tag, value, class: "#{@value_class} blacklight-#{@key}"
11
+ content_tag :dd, value, class: "#{@value_class} blacklight-#{@key}"
16
12
  end
17
13
  end)
18
14
 
19
15
  # @param field [Blacklight::FieldPresenter]
20
- def initialize(field:, value_tag: 'dd', label_class: 'col-md-3', value_class: 'col-md-9')
16
+ def initialize(field:, label_class: 'col-md-3', value_class: 'col-md-9')
21
17
  @field = field
22
18
  @key = @field.key.parameterize
23
19
  @label_class = label_class
24
- @value_tag = value_tag
25
20
  @value_class = value_class
26
21
  end
27
-
28
- def value(*args, **kwargs, &block)
29
- return set_slot(:values, nil, *args, **kwargs, &block) if block_given?
30
-
31
- Deprecation.warn(Blacklight::MetadataFieldLayoutComponent, 'The `value` content area is deprecated; render from the values slot instead')
32
-
33
- values.first
34
- end
35
-
36
- def with(slot_name, *args, **kwargs, &block)
37
- if slot_name == :value
38
- super(:values, *args, **kwargs, &block)
39
- else
40
- super
41
- end
42
- end
43
22
  end
44
23
  end
@@ -21,9 +21,7 @@
21
21
  <% end %>
22
22
  </div>
23
23
 
24
- <%= content_tag :div, id: @panel_id, class: 'facets-collapse collapse' do %>
25
- <% ::Deprecation.silence(Blacklight::FacetsHelperBehavior) do %>
26
- <%= helpers.render_facet_partials @fields, response: @response %>
27
- <% end %>
28
- <% end %>
24
+ <div id="<%= @panel_id %>" class="facets-collapse collapse">
25
+ <%= body %>
26
+ </div>
29
27
  <% end %>
@@ -4,22 +4,43 @@ module Blacklight
4
4
  module Response
5
5
  # Render a group of facet fields
6
6
  class FacetGroupComponent < Blacklight::Component
7
+ renders_one :body
8
+
7
9
  # @param [Blacklight::Response] response
8
- # @param [Array<String>] fields facet fields to render
10
+ # @param [Array<Blacklight::Configuration::FacetField>] fields facet fields to render
9
11
  # @param [String] title the title of the facet group section
10
12
  # @param [String] id a unique identifier for the group
11
- def initialize(response:, fields: [], title: nil, id: nil)
12
- @response = response
13
- @fields = fields
14
- @title = title
13
+ def initialize(id:, title: nil, fields: [], response: nil)
14
+ @groupname = id
15
15
  @id = id ? "facets-#{id}" : 'facets'
16
+ @title = title || I18n.t("blacklight.search.#{@id}.title")
16
17
  @panel_id = id ? "facet-panel-#{id}-collapse" : 'facet-panel-collapse'
18
+
19
+ # deprecated variables
20
+ @fields = fields
21
+ @response = response
22
+ end
23
+
24
+ # Provide fallback behavior for rendering this object without a body slot
25
+ def before_render
26
+ set_slot(:body, nil) { default_body } unless body
17
27
  end
18
28
 
19
29
  def render?
20
- Deprecation.silence(Blacklight::FacetsHelperBehavior) do
21
- helpers.has_facet_values?(@fields, @response)
22
- end
30
+ body.present?
31
+ end
32
+
33
+ private
34
+
35
+ # @deprecated
36
+ def default_body
37
+ Blacklight.deprecation.warn('Rendering the Blacklight::FacetGroupComponent without a body slot is deprecated.')
38
+ helpers.render(Blacklight::FacetComponent.with_collection(@fields, response: @response))
39
+ end
40
+
41
+ # @deprecated
42
+ def blacklight_config
43
+ helpers.blacklight_config
23
44
  end
24
45
  end
25
46
  end
@@ -1,3 +1,3 @@
1
- <%= content_tag :section, class: 'pagination', **html_attr do %>
1
+ <%= content_tag :section, class: 'pagination', **@html_attr do %>
2
2
  <%= pagination %>
3
3
  <% end %>
@@ -8,21 +8,12 @@ module Blacklight
8
8
  # @param [Hash] html html options for the pagination container
9
9
  def initialize(response:, html: {}, **pagination_args)
10
10
  @response = response
11
- @html = html
11
+ @html_attr = { aria: { label: t('views.pagination.aria.container_label') } }.merge(html)
12
12
  @pagination_args = pagination_args
13
13
  end
14
14
 
15
- def html_attr
16
- { aria: { label: t('views.pagination.aria.container_label') } }.merge(@html)
17
- end
18
-
19
15
  def pagination
20
- args = configured_options.merge(@pagination_args).compact
21
- helpers.paginate @response, **args
22
- end
23
-
24
- def configured_options
25
- controller.blacklight_config.index.pagination_options
16
+ helpers.paginate @response, **Blacklight::Engine.config.blacklight.default_pagination_options, **@pagination_args
26
17
  end
27
18
  end
28
19
  end
@@ -1 +1,6 @@
1
- <%= dropdown %>
1
+ <%= helpers.render(Blacklight::System::DropdownComponent.new(
2
+ param: @param,
3
+ choices: @choices,
4
+ id: @id,
5
+ search_state: @search_state,
6
+ selected: @selected)) %>
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Blacklight
4
4
  module Response
5
- class SortComponent < Blacklight::Component
5
+ class SortComponent < ViewComponent::Base
6
6
  def initialize(search_state:, param: 'sort', choices: {}, id: 'sort-dropdown', classes: [], selected: nil)
7
7
  @param = param
8
8
  @choices = choices
@@ -11,21 +11,6 @@ module Blacklight
11
11
  @classes = classes
12
12
  @selected = selected
13
13
  end
14
-
15
- # You may override this method in a subclass if you want to use a different dropdown component
16
- def dropdown_class
17
- Blacklight::System::DropdownComponent
18
- end
19
-
20
- def dropdown
21
- render(dropdown_class.new(
22
- param: @param,
23
- choices: @choices,
24
- id: @id,
25
- search_state: @search_state,
26
- selected: @selected
27
- ))
28
- end
29
14
  end
30
15
  end
31
16
  end
@@ -3,7 +3,7 @@
3
3
  module Blacklight
4
4
  module Response
5
5
  # Render spellcheck results for a search query
6
- class SpellcheckComponent < Blacklight::Component
6
+ class SpellcheckComponent < ViewComponent::Base
7
7
  # @param [Blacklight::Response] response
8
8
  # @param [Array<String>] options explicit spellcheck options to render
9
9
  def initialize(response:, options: nil)
@@ -13,15 +13,26 @@ module Blacklight
13
13
  end
14
14
 
15
15
  def link_to_query(query)
16
- Deprecation.silence(Blacklight::UrlHelperBehavior) do
17
- helpers.link_to_query(query)
18
- end
16
+ p = helpers.search_state.to_h.except(:page, :action)
17
+ p[:q] = query
18
+ link_to(query, helpers.search_action_path(p))
19
19
  end
20
20
 
21
21
  def render?
22
- Deprecation.silence(Blacklight::BlacklightHelperBehavior) do
23
- @options&.any? && helpers.should_show_spellcheck_suggestions?(@response)
24
- end
22
+ Array(@options).any? && show_spellcheck_suggestions?(@response)
23
+ end
24
+
25
+ # @!group Search result helpers
26
+ ##
27
+ # Determine whether to display spellcheck suggestions
28
+ #
29
+ # @param [Blacklight::Solr::Response] response
30
+ # @return [Boolean]
31
+ def show_spellcheck_suggestions? response
32
+ # The spelling response field may be missing from non solr repositories.
33
+ response.total <= helpers.blacklight_config.spell_max &&
34
+ !response.spelling.nil? &&
35
+ response.spelling.words.any?
25
36
  end
26
37
 
27
38
  private