blacklight 7.33.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/.env +3 -2
  3. data/.github/workflows/ruby.yml +38 -107
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +243 -2
  6. data/.rubocop_todo.yml +216 -270
  7. data/Gemfile +7 -6
  8. data/README.md +12 -4
  9. data/Rakefile +18 -0
  10. data/VERSION +1 -1
  11. data/app/assets/config/blacklight/manifest.js +3 -0
  12. data/app/assets/javascripts/blacklight/blacklight.esm.js +376 -0
  13. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  14. data/app/assets/javascripts/blacklight/blacklight.js +332 -485
  15. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  16. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  20. data/app/assets/stylesheets/blacklight/_facets.scss +104 -49
  21. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  22. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  23. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  24. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  25. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  26. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  27. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  28. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  29. data/app/builders/blacklight/action_builder.rb +18 -9
  30. data/app/components/blacklight/advanced_search_form_component.html.erb +1 -1
  31. data/app/components/blacklight/advanced_search_form_component.rb +7 -9
  32. data/app/components/blacklight/constraints_component.rb +27 -37
  33. data/app/components/blacklight/document/action_component.html.erb +2 -9
  34. data/app/components/blacklight/document/action_component.rb +26 -8
  35. data/app/components/blacklight/document/actions_component.rb +2 -2
  36. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  37. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  38. data/app/components/blacklight/document/citation_component.rb +5 -3
  39. data/app/components/blacklight/document/group_component.rb +7 -3
  40. data/app/components/blacklight/document/show_tools_component.html.erb +12 -0
  41. data/app/components/blacklight/document/show_tools_component.rb +23 -0
  42. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  43. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  44. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  45. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  46. data/app/components/blacklight/document_component.html.erb +4 -0
  47. data/app/components/blacklight/document_component.rb +54 -42
  48. data/app/components/blacklight/document_metadata_component.html.erb +4 -2
  49. data/app/components/blacklight/document_metadata_component.rb +11 -6
  50. data/app/components/blacklight/document_title_component.rb +4 -1
  51. data/app/components/blacklight/facet_component.rb +1 -1
  52. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +3 -3
  53. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  54. data/app/components/blacklight/facet_field_component.html.erb +5 -5
  55. data/app/components/blacklight/facet_field_component.rb +9 -2
  56. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  57. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  58. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  59. data/app/components/blacklight/facet_item_component.rb +1 -43
  60. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  61. data/app/components/blacklight/header_component.html.erb +2 -0
  62. data/app/components/blacklight/header_component.rb +26 -0
  63. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  64. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  65. data/app/components/blacklight/icons/list_component.rb +16 -0
  66. data/app/components/blacklight/icons/search_component.rb +16 -0
  67. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  68. data/app/components/blacklight/metadata_field_component.rb +24 -8
  69. data/app/components/blacklight/metadata_field_layout_component.rb +7 -22
  70. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +17 -0
  71. data/app/components/blacklight/response/facet_group_component.html.erb +5 -6
  72. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  73. data/app/components/blacklight/response/sort_component.rb +2 -2
  74. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  75. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  76. data/app/components/blacklight/response/view_type_component.rb +4 -6
  77. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  78. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  79. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  80. data/app/components/blacklight/search_bar_component.rb +2 -16
  81. data/app/components/blacklight/search_button_component.rb +3 -3
  82. data/app/components/blacklight/search_context/server_applied_params_component.html.erb +4 -0
  83. data/app/components/blacklight/search_context/server_applied_params_component.rb +13 -0
  84. data/app/components/blacklight/search_context/server_item_pagination_component.rb +71 -0
  85. data/app/components/blacklight/search_header_component.html.erb +2 -0
  86. data/app/components/blacklight/search_header_component.rb +6 -0
  87. data/app/components/blacklight/search_navbar_component.html.erb +5 -0
  88. data/app/components/blacklight/search_navbar_component.rb +34 -0
  89. data/app/components/blacklight/start_over_button_component.rb +5 -3
  90. data/app/components/blacklight/system/dropdown_component.rb +3 -3
  91. data/app/components/blacklight/system/flash_message_component.html.erb +3 -1
  92. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  93. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  94. data/app/components/blacklight/system/modal_component.rb +1 -3
  95. data/app/components/blacklight/top_navbar_component.html.erb +12 -0
  96. data/app/components/blacklight/top_navbar_component.rb +17 -0
  97. data/app/controllers/bookmarks_controller.rb +1 -0
  98. data/app/controllers/catalog_controller.rb +1 -0
  99. data/app/controllers/concerns/blacklight/bookmarks.rb +11 -6
  100. data/app/controllers/concerns/blacklight/catalog.rb +21 -72
  101. data/app/controllers/concerns/blacklight/controller.rb +6 -43
  102. data/app/controllers/concerns/blacklight/search_context.rb +71 -13
  103. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  104. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  105. data/app/controllers/concerns/blacklight/token_based_user.rb +1 -0
  106. data/app/controllers/search_history_controller.rb +1 -0
  107. data/app/helpers/blacklight/blacklight_helper_behavior.rb +1 -400
  108. data/app/helpers/blacklight/catalog_helper_behavior.rb +40 -182
  109. data/app/helpers/blacklight/component_helper_behavior.rb +1 -63
  110. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -117
  111. data/app/helpers/blacklight/document_helper_behavior.rb +76 -0
  112. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  113. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -4
  114. data/app/helpers/blacklight/layout_helper_behavior.rb +60 -0
  115. data/app/helpers/blacklight/render_partials_helper_behavior.rb +12 -30
  116. data/app/helpers/blacklight/url_helper_behavior.rb +21 -97
  117. data/app/helpers/blacklight_helper.rb +1 -0
  118. data/app/helpers/catalog_helper.rb +1 -0
  119. data/app/javascript/blacklight/bookmark_toggle.js +9 -22
  120. data/app/javascript/blacklight/button_focus.js +9 -7
  121. data/app/javascript/blacklight/checkbox_submit.js +68 -122
  122. data/app/javascript/blacklight/core.js +6 -5
  123. data/app/javascript/blacklight/index.js +14 -0
  124. data/app/javascript/blacklight/modal.js +100 -165
  125. data/app/javascript/blacklight/modalForm.js +60 -0
  126. data/app/javascript/blacklight/search_context.js +13 -29
  127. data/app/models/blacklight/facet_paginator.rb +3 -2
  128. data/app/models/blacklight/icon.rb +4 -2
  129. data/app/models/bookmark.rb +0 -2
  130. data/app/models/concerns/blacklight/configurable.rb +5 -4
  131. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -0
  132. data/app/models/concerns/blacklight/document/attributes.rb +50 -0
  133. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  134. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  135. data/app/models/concerns/blacklight/document/export.rb +2 -1
  136. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  137. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  138. data/app/models/concerns/blacklight/document/semantic_fields.rb +1 -0
  139. data/app/models/concerns/blacklight/document.rb +23 -20
  140. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  141. data/app/models/concerns/blacklight/user.rb +17 -8
  142. data/app/models/record_mailer.rb +23 -18
  143. data/app/models/search.rb +0 -1
  144. data/app/models/solr_document.rb +1 -0
  145. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  146. data/app/presenters/blacklight/document_presenter.rb +24 -30
  147. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  148. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  149. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  150. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  151. data/app/presenters/blacklight/field_presenter.rb +1 -0
  152. data/app/presenters/blacklight/index_presenter.rb +2 -40
  153. data/app/presenters/blacklight/json_presenter.rb +7 -5
  154. data/app/presenters/blacklight/rendering/abstract_step.rb +4 -0
  155. data/app/presenters/blacklight/rendering/join.rb +7 -1
  156. data/app/presenters/blacklight/rendering/link_to_facet.rb +3 -6
  157. data/app/presenters/blacklight/rendering/microdata.rb +1 -1
  158. data/app/presenters/blacklight/show_presenter.rb +1 -9
  159. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  160. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  161. data/app/services/blacklight/field_retriever.rb +1 -8
  162. data/app/services/blacklight/search_service.rb +9 -7
  163. data/app/values/blacklight/types.rb +95 -11
  164. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  165. data/app/views/bookmarks/_tools.html.erb +7 -12
  166. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  167. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  168. data/app/views/catalog/_constraints.html.erb +1 -14
  169. data/app/views/catalog/_document.atom.builder +12 -14
  170. data/app/views/catalog/_document.html.erb +3 -6
  171. data/app/views/catalog/_document.rss.builder +2 -4
  172. data/app/views/catalog/_document_list.html.erb +2 -1
  173. data/app/views/catalog/_facet_layout.html.erb +2 -2
  174. data/app/views/catalog/_facets.html.erb +5 -4
  175. data/app/views/catalog/_home_text.html.erb +2 -14
  176. data/app/views/catalog/_search_form.html.erb +3 -3
  177. data/app/views/catalog/_search_header.html.erb +1 -2
  178. data/app/views/catalog/_search_results.html.erb +2 -2
  179. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  180. data/app/views/catalog/_show_main_content.html.erb +8 -19
  181. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  182. data/app/views/catalog/_show_tools.html.erb +1 -19
  183. data/app/views/catalog/_view_type_group.html.erb +1 -1
  184. data/app/views/catalog/email_success.html.erb +5 -6
  185. data/app/views/catalog/facet.html.erb +7 -5
  186. data/app/views/catalog/index.atom.builder +12 -14
  187. data/app/views/catalog/index.html.erb +7 -1
  188. data/app/views/catalog/index.json.jbuilder +19 -19
  189. data/app/views/catalog/index.rss.builder +1 -1
  190. data/app/views/catalog/opensearch.xml.builder +1 -1
  191. data/app/views/catalog/show.html.erb +1 -6
  192. data/app/views/catalog/sms_success.html.erb +5 -6
  193. data/app/views/catalog/suggest.html.erb +3 -0
  194. data/app/views/layouts/blacklight/base.html.erb +19 -9
  195. data/app/views/record_mailer/email_record.text.erb +4 -3
  196. data/app/views/record_mailer/sms_record.text.erb +4 -4
  197. data/app/views/search_history/index.html.erb +6 -2
  198. data/app/views/shared/_header_navbar.html.erb +1 -22
  199. data/app/views/shared/_modal.html.erb +3 -3
  200. data/blacklight.gemspec +8 -10
  201. data/config/importmap.rb +3 -0
  202. data/config/locales/blacklight.ar.yml +209 -233
  203. data/config/locales/blacklight.ca.yml +0 -7
  204. data/config/locales/blacklight.de.yml +197 -216
  205. data/config/locales/blacklight.en.yml +2 -7
  206. data/config/locales/blacklight.es.yml +196 -216
  207. data/config/locales/blacklight.fr.yml +196 -220
  208. data/config/locales/blacklight.hu.yml +193 -213
  209. data/config/locales/blacklight.it.yml +197 -216
  210. data/config/locales/blacklight.nl.yml +193 -213
  211. data/config/locales/blacklight.pt-BR.yml +195 -216
  212. data/config/locales/blacklight.sq.yml +193 -213
  213. data/config/locales/blacklight.zh.yml +194 -214
  214. data/config/routes.rb +3 -2
  215. data/db/migrate/20140202020201_create_searches.rb +1 -0
  216. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  217. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  218. data/docker-compose.yml +1 -0
  219. data/lib/blacklight/abstract_repository.rb +1 -0
  220. data/lib/blacklight/configuration/context.rb +4 -4
  221. data/lib/blacklight/configuration/display_field.rb +7 -9
  222. data/lib/blacklight/configuration/facet_field.rb +17 -11
  223. data/lib/blacklight/configuration/field.rb +1 -0
  224. data/lib/blacklight/configuration/fields.rb +12 -15
  225. data/lib/blacklight/configuration/index_field.rb +1 -0
  226. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  227. data/lib/blacklight/configuration/search_field.rb +1 -0
  228. data/lib/blacklight/configuration/session_tracking_config.rb +45 -0
  229. data/lib/blacklight/configuration/show_field.rb +1 -0
  230. data/lib/blacklight/configuration/sort_field.rb +1 -0
  231. data/lib/blacklight/configuration/tool_config.rb +1 -0
  232. data/lib/blacklight/configuration/view_config.rb +16 -10
  233. data/lib/blacklight/configuration.rb +322 -341
  234. data/lib/blacklight/engine.rb +13 -15
  235. data/lib/blacklight/exceptions.rb +2 -2
  236. data/lib/blacklight/nested_open_struct_with_hash_access.rb +6 -12
  237. data/lib/blacklight/open_struct_with_hash_access.rb +19 -17
  238. data/lib/blacklight/parameters.rb +7 -21
  239. data/lib/blacklight/routes/exportable.rb +1 -0
  240. data/lib/blacklight/routes/searchable.rb +3 -1
  241. data/lib/blacklight/routes.rb +1 -0
  242. data/lib/blacklight/search_builder.rb +10 -10
  243. data/lib/blacklight/search_state/filter_field.rb +8 -25
  244. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  245. data/lib/blacklight/search_state.rb +23 -79
  246. data/lib/blacklight/solr/document.rb +1 -0
  247. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  248. data/lib/blacklight/solr/repository.rb +1 -0
  249. data/lib/blacklight/solr/request.rb +3 -0
  250. data/lib/blacklight/solr/response/facets.rb +21 -5
  251. data/lib/blacklight/solr/response/group.rb +1 -0
  252. data/lib/blacklight/solr/response/group_response.rb +1 -0
  253. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  254. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  255. data/lib/blacklight/solr/response/params.rb +5 -4
  256. data/lib/blacklight/solr/response/response.rb +1 -0
  257. data/lib/blacklight/solr/response/spelling.rb +1 -0
  258. data/lib/blacklight/solr/response.rb +4 -3
  259. data/lib/blacklight/solr/search_builder_behavior.rb +16 -32
  260. data/lib/blacklight/solr.rb +1 -0
  261. data/lib/blacklight/version.rb +1 -0
  262. data/lib/blacklight.rb +8 -11
  263. data/lib/generators/blacklight/assets/importmap_generator.rb +56 -0
  264. data/lib/generators/blacklight/assets/propshaft_generator.rb +34 -0
  265. data/lib/generators/blacklight/assets/sprockets_generator.rb +68 -0
  266. data/lib/generators/blacklight/assets_generator.rb +14 -88
  267. data/lib/generators/blacklight/controller_generator.rb +3 -2
  268. data/lib/generators/blacklight/document_generator.rb +1 -0
  269. data/lib/generators/blacklight/install_generator.rb +7 -4
  270. data/lib/generators/blacklight/models_generator.rb +1 -0
  271. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  272. data/lib/generators/blacklight/solr_generator.rb +1 -1
  273. data/lib/generators/blacklight/templates/catalog_controller.rb +37 -7
  274. data/lib/generators/blacklight/templates/solr_document.rb +1 -7
  275. data/lib/generators/blacklight/test_support_generator.rb +4 -2
  276. data/lib/generators/blacklight/user_generator.rb +7 -9
  277. data/lib/railties/blacklight.rake +2 -3
  278. data/package.json +10 -10
  279. data/rollup.config.js +37 -0
  280. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  281. data/spec/components/blacklight/document_component_spec.rb +74 -33
  282. data/spec/components/blacklight/facet_component_spec.rb +2 -7
  283. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  284. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  285. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +9 -7
  286. data/spec/components/blacklight/header_component_spec.rb +20 -0
  287. data/spec/components/blacklight/response/view_type_component_spec.rb +83 -0
  288. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  289. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +29 -0
  290. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +51 -0
  291. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  292. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  293. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  294. data/spec/controllers/catalog_controller_spec.rb +24 -126
  295. data/spec/features/autocomplete_spec.rb +1 -1
  296. data/spec/features/axe_spec.rb +1 -1
  297. data/spec/features/bookmarks_spec.rb +1 -1
  298. data/spec/features/component_template_override_spec.rb +8 -0
  299. data/spec/features/facets_spec.rb +1 -1
  300. data/spec/features/modal_spec.rb +12 -0
  301. data/spec/features/search_context_spec.rb +4 -10
  302. data/spec/features/search_results_spec.rb +0 -33
  303. data/spec/features/sitelinks_search_box_spec.rb +13 -0
  304. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  305. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  306. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  307. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  308. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +10 -132
  309. data/spec/helpers/blacklight_helper_spec.rb +3 -298
  310. data/spec/helpers/catalog_helper_spec.rb +60 -115
  311. data/spec/i18n_spec.rb +1 -0
  312. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  313. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  314. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  315. data/spec/lib/blacklight/configuration/session_tracking_config_spec.rb +38 -0
  316. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  317. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +4 -4
  318. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  319. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  320. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  321. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  322. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  323. data/spec/models/blacklight/configuration_spec.rb +41 -53
  324. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  325. data/spec/models/blacklight/icon_spec.rb +29 -15
  326. data/spec/models/blacklight/search_builder_spec.rb +12 -12
  327. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  328. data/spec/models/blacklight/solr/request_spec.rb +2 -2
  329. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  330. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  331. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  332. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  333. data/spec/models/blacklight/solr/search_builder_spec.rb +32 -23
  334. data/spec/models/blacklight/user_spec.rb +22 -0
  335. data/spec/models/record_mailer_spec.rb +36 -23
  336. data/spec/models/solr_document_spec.rb +21 -3
  337. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  338. data/spec/presenters/blacklight/document_presenter_spec.rb +3 -2
  339. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  340. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  341. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  342. data/spec/presenters/blacklight/field_presenter_spec.rb +2 -16
  343. data/spec/presenters/blacklight/index_presenter_spec.rb +3 -4
  344. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  345. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  346. data/spec/presenters/blacklight/show_presenter_spec.rb +11 -25
  347. data/spec/presenters/pipeline_spec.rb +13 -2
  348. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  349. data/spec/requests/load_suggestions_spec.rb +16 -0
  350. data/spec/routing/catalog_routing_spec.rb +6 -1
  351. data/spec/services/blacklight/search_service_spec.rb +31 -68
  352. data/spec/spec_helper.rb +4 -3
  353. data/spec/support/controller_level_helpers.rb +1 -2
  354. data/spec/support/features/search_helpers.rb +39 -0
  355. data/spec/support/features/session_helpers.rb +1 -0
  356. data/spec/support/features.rb +3 -0
  357. data/spec/support/view_component_test_helpers.rb +21 -0
  358. data/spec/test_app_templates/Gemfile.extra +4 -0
  359. data/spec/test_app_templates/lib/generators/test_app_generator.rb +17 -2
  360. data/spec/views/catalog/_document.html.erb_spec.rb +23 -33
  361. data/spec/views/catalog/_document_list.html.erb_spec.rb +7 -2
  362. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  363. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  364. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  365. data/spec/views/catalog/_show_tools.html.erb_spec.rb +7 -54
  366. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  367. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  368. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  369. data/spec/views/catalog/index.atom.builder_spec.rb +18 -11
  370. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  371. data/spec/views/catalog/index.json.jbuilder_spec.rb +3 -3
  372. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  373. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  374. data/tasks/blacklight.rake +7 -5
  375. metadata +95 -123
  376. data/.babelrc +0 -11
  377. data/app/assets/images/blacklight/list.svg +0 -1
  378. data/app/assets/images/blacklight/search.svg +0 -1
  379. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  380. data/app/components/blacklight/content_areas_shim.rb +0 -13
  381. data/app/components/blacklight/search_context_component.rb +0 -34
  382. data/app/controllers/concerns/blacklight/base.rb +0 -7
  383. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  384. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  385. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  386. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  387. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  388. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  389. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  390. data/app/javascript/blacklight/autocomplete.js +0 -36
  391. data/app/javascript/blacklight/facet_load.js +0 -22
  392. data/app/models/concerns/blacklight/document/email.rb +0 -26
  393. data/app/models/concerns/blacklight/document/sms.rb +0 -24
  394. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  395. data/app/views/catalog/_constraints_element.html.erb +0 -14
  396. data/app/views/catalog/_document_action.html.erb +0 -5
  397. data/app/views/catalog/_facet_group.html.erb +0 -5
  398. data/app/views/catalog/_facet_limit.html.erb +0 -3
  399. data/app/views/catalog/_index.html.erb +0 -1
  400. data/app/views/catalog/_index_header.html.erb +0 -22
  401. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  402. data/app/views/catalog/_show.html.erb +0 -6
  403. data/app/views/catalog/_show_header.html.erb +0 -2
  404. data/app/views/catalog/_thumbnail.html.erb +0 -1
  405. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  406. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  407. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  408. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  409. data/spec/features/sitelinks_search_box.rb +0 -13
  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 -108
  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/models/blacklight/document/email_spec.rb +0 -57
  416. data/spec/models/blacklight/document/sms_spec.rb +0 -58
  417. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  418. data/spec/support/view_component_capybara_test_helpers.rb +0 -8
  419. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  420. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  421. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  422. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  423. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  424. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  425. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  426. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
  427. /data/app/components/blacklight/{search_context_component.html.erb → search_context/server_item_pagination_component.html.erb} +0 -0
@@ -17,7 +17,7 @@ module Blacklight
17
17
  return to_enum(:presenters) unless block_given?
18
18
 
19
19
  @facet_field.paginator.items.each do |item|
20
- yield (@facet_field.facet_field.item_presenter || Blacklight::FacetItemPresenter).new(item, @facet_field.facet_field, helpers, @facet_field.key, @facet_field.search_state)
20
+ yield @facet_field.facet_field.item_presenter.new(item, @facet_field.facet_field, helpers, @facet_field.key, @facet_field.search_state)
21
21
  end
22
22
  end
23
23
  end
@@ -1,18 +1,18 @@
1
1
  <div class="card facet-limit blacklight-<%= @facet_field.key %> <%= 'facet-limit-active' if @facet_field.active? %>">
2
- <h3 class="card-header p-0 facet-field-heading" id="<%= @facet_field.html_id %>-header">
2
+ <h3 class="card-header p-0 facet-field-heading" id="<%= header_html_id %>">
3
3
  <button
4
4
  type="button"
5
5
  class="btn w-100 d-block btn-block p-2 text-start text-left collapse-toggle <%= "collapsed" if @facet_field.collapsed? %>"
6
6
  data-toggle="collapse"
7
7
  data-bs-toggle="collapse"
8
- data-target="#<%= @facet_field.html_id %>"
9
- data-bs-target="#<%= @facet_field.html_id %>"
8
+ data-target="#<%= html_id %>"
9
+ data-bs-target="#<%= html_id %>"
10
10
  aria-expanded="<%= @facet_field.collapsed? ? 'false' : 'true' %>"
11
11
  >
12
12
  <%= label %>
13
13
  </button>
14
14
  </h3>
15
- <div id="<%= @facet_field.html_id %>" aria-labelledby="<%= @facet_field.html_id %>-header" class="panel-collapse facet-content collapse <%= "show" unless @facet_field.collapsed? %>">
15
+ <div id="<%= html_id %>" aria-labelledby="<%= header_html_id %>" class="panel-collapse facet-content collapse <%= "show" unless @facet_field.collapsed? %>">
16
16
  <div class="card-body">
17
17
  <%= body %>
18
18
 
@@ -20,7 +20,7 @@
20
20
  <div class="more_facets">
21
21
  <%= link_to t("more_#{@facet_field.key}_html", scope: 'blacklight.search.facets', default: :more_html, field_name: @facet_field.label),
22
22
  @facet_field.modal_path,
23
- data: { blacklight_modal: 'trigger' } %>
23
+ data: { blacklight_modal: 'trigger', turbo: false } %>
24
24
  </div>
25
25
  <% end %>
26
26
  </div>
@@ -2,13 +2,20 @@
2
2
 
3
3
  module Blacklight
4
4
  class FacetFieldComponent < Blacklight::Component
5
- include Blacklight::ContentAreasShim
6
-
7
5
  renders_one :label
8
6
  renders_one :body
9
7
 
8
+ # @param [Blacklight::FacetFieldPresenter] facet_field
10
9
  def initialize(facet_field:)
11
10
  @facet_field = facet_field
12
11
  end
12
+
13
+ def html_id
14
+ "facet-#{@facet_field.key.parameterize}"
15
+ end
16
+
17
+ def header_html_id
18
+ "#{html_id}-header"
19
+ end
13
20
  end
14
21
  end
@@ -1,11 +1,11 @@
1
1
  <%= render(@layout.new(facet_field: @facet_field)) do |component| %>
2
- <% component.label do %>
2
+ <% component.with_label do %>
3
3
  <%= @facet_field.label %>
4
4
  <% end %>
5
- <% component.body do %>
5
+ <% component.with_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
@@ -0,0 +1,2 @@
1
+ <%= top_bar %>
2
+ <%= search_bar %>
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class HeaderComponent < Blacklight::Component
5
+ renders_one :top_bar, lambda { |component: Blacklight::TopNavbarComponent|
6
+ component.new(blacklight_config: blacklight_config)
7
+ }
8
+
9
+ renders_one :search_bar, lambda { |component: Blacklight::SearchNavbarComponent|
10
+ component.new(blacklight_config: blacklight_config)
11
+ }
12
+
13
+ def initialize(blacklight_config:)
14
+ @blacklight_config = blacklight_config
15
+ end
16
+
17
+ attr_reader :blacklight_config
18
+
19
+ # Hack so that the default lambdas are triggered
20
+ # so that we don't have to do c.with_top_bar() in the call.
21
+ def before_render
22
+ set_slot(:top_bar, nil) unless top_bar
23
+ set_slot(:search_bar, nil) unless search_bar
24
+ end
25
+ end
26
+ end
@@ -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
@@ -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.label do %>
2
+ <% component.with_label do %>
3
3
  <%= label %>
4
4
  <% end %>
5
- <% component.value do %>
5
+ <% component.with_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,40 +2,25 @@
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 block
11
- content_tag :dd, class: "#{@value_class} blacklight-#{@key}", &block
8
+ if @value_tag.nil?
9
+ block&.call || value
10
+ elsif block
11
+ content_tag @value_tag, class: "#{@value_class} blacklight-#{@key}", &block
12
12
  else
13
- content_tag :dd, value, class: "#{@value_class} blacklight-#{@key}"
13
+ content_tag @value_tag, value, class: "#{@value_class} blacklight-#{@key}"
14
14
  end
15
15
  end)
16
16
 
17
17
  # @param field [Blacklight::FieldPresenter]
18
- def initialize(field:, label_class: 'col-md-3', value_class: 'col-md-9')
18
+ def initialize(field:, value_tag: 'dd', label_class: 'col-md-3', value_class: 'col-md-9')
19
19
  @field = field
20
20
  @key = @field.key.parameterize
21
21
  @label_class = label_class
22
+ @value_tag = value_tag
22
23
  @value_class = value_class
23
24
  end
24
-
25
- def value(*args, **kwargs, &block)
26
- return set_slot(:values, nil, *args, **kwargs, &block) if block_given?
27
-
28
- Deprecation.warn(Blacklight::MetadataFieldLayoutComponent, 'The `value` content area is deprecated; render from the values slot instead')
29
-
30
- values.first
31
- end
32
-
33
- def with(slot_name, *args, **kwargs, &block)
34
- if slot_name == :value
35
- super(:values, *args, **kwargs, &block)
36
- else
37
- super
38
- end
39
- end
40
25
  end
41
26
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class MetadataFieldPlainTextLayoutComponent < Blacklight::MetadataFieldLayoutComponent
5
+ with_collection_parameter :field
6
+
7
+ def initialize(field:, **kwargs)
8
+ super(field: field, **kwargs, value_tag: nil)
9
+ end
10
+
11
+ # rubocop:disable Rails/OutputSafety
12
+ def call
13
+ [label.to_s.strip, helpers.strip_tags(CGI.unescape_html(safe_join(values, "\n")).strip)].compact.join(' ').html_safe
14
+ end
15
+ # rubocop:enable Rails/OutputSafety
16
+ end
17
+ end
@@ -17,13 +17,12 @@
17
17
  expanded: 'false',
18
18
  label: t('blacklight.search.facets.group.toggle'),
19
19
  } do %>
20
- <span class="navbar-toggler-icon"></span>
20
+ <span data-show-label><%= t('blacklight.search.facets.group.open') %></span>
21
+ <span data-hide-label><%= t('blacklight.search.facets.group.close') %></span>
21
22
  <% end %>
22
23
  </div>
23
24
 
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 %>
25
+ <div id="<%= @panel_id %>" class="facets-collapse collapse">
26
+ <%= body %>
27
+ </div>
29
28
  <% 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
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Blacklight
4
4
  module Response
5
- class SortComponent < ViewComponent::Base
6
- def initialize(param: 'sort', choices: {}, search_state:, id: 'sort-dropdown', classes: [], selected: nil)
5
+ class SortComponent < Blacklight::Component
6
+ def initialize(search_state:, param: 'sort', choices: {}, id: 'sort-dropdown', classes: [], selected: nil)
7
7
  @param = param
8
8
  @choices = choices
9
9
  @search_state = search_state