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
@@ -3,7 +3,7 @@
3
3
  module Blacklight
4
4
  module Response
5
5
  # Render spellcheck results for a search query
6
- class SpellcheckComponent < ViewComponent::Base
6
+ class SpellcheckComponent < Blacklight::Component
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
@@ -3,7 +3,7 @@
3
3
  module Blacklight
4
4
  module Response
5
5
  # Render spellcheck results for a search query
6
- class ViewTypeButtonComponent < ViewComponent::Base
6
+ class ViewTypeButtonComponent < Blacklight::Component
7
7
  with_collection_parameter :view
8
8
  # @param [Blacklight::Configuration::View] view
9
9
  def initialize(view:, key: nil, selected: false, search_state: nil, classes: 'btn btn-outline-secondary btn-icon')
@@ -18,15 +18,11 @@ module Blacklight
18
18
  return render(@view.icon.new) if @view.icon.is_a?(Class)
19
19
  return render(@view.icon) if @view.icon.is_a?(ViewComponent::Base)
20
20
 
21
- Deprecation.silence(Blacklight::CatalogHelperBehavior) do
22
- helpers.render_view_type_group_icon(@view.icon || @key)
23
- end
21
+ helpers.blacklight_icon(@view.icon || @key)
24
22
  end
25
23
 
26
24
  def label
27
- Deprecation.silence(Blacklight::ConfigurationHelperBehavior) do
28
- helpers.view_label(@key)
29
- end
25
+ @view.display_label
30
26
  end
31
27
 
32
28
  def url
@@ -3,11 +3,11 @@
3
3
  module Blacklight
4
4
  module Response
5
5
  # Render spellcheck results for a search query
6
- class ViewTypeComponent < ViewComponent::Base
6
+ class ViewTypeComponent < Blacklight::Component
7
7
  renders_many :views, 'Blacklight::Response::ViewTypeButtonComponent'
8
8
 
9
9
  # @param [Blacklight::Response] response
10
- def initialize(response:, views: {}, search_state:, selected: nil)
10
+ def initialize(response:, search_state:, views: {}, selected: nil)
11
11
  @response = response
12
12
  @views = views
13
13
  @search_state = search_state
@@ -18,14 +18,12 @@ module Blacklight
18
18
  return if views.any?
19
19
 
20
20
  @views.each do |key, config|
21
- view(key: key, view: config, selected: @selected == key, search_state: @search_state)
21
+ with_view(key: key, view: config, selected: @selected == key, search_state: @search_state)
22
22
  end
23
23
  end
24
24
 
25
25
  def render?
26
- Deprecation.silence(Blacklight::ConfigurationHelperBehavior) do
27
- helpers.has_alternative_views?
28
- end
26
+ views.many? && !@response.empty?
29
27
  end
30
28
  end
31
29
  end
@@ -0,0 +1,8 @@
1
+ <% facet_group_names.each do |groupname| %>
2
+ <% fields = facet_fields_in_group(groupname) %>
3
+ <%= render group_component_class.new(id: groupname, fields: fields, response: response) do |component| %>
4
+ <% component.with_body do %>
5
+ <%= render Blacklight::FacetComponent.with_collection(fields, response: response) %>
6
+ <% end %>
7
+ <% end %>
8
+ <% end %>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Search
5
+ class SidebarComponent < Blacklight::Component
6
+ def initialize(blacklight_config:, response:, view_config:)
7
+ @blacklight_config = blacklight_config
8
+ @response = response
9
+ @group_component_class = view_config.facet_group_component || Blacklight::Response::FacetGroupComponent
10
+ end
11
+
12
+ attr_reader :group_component_class, :response
13
+
14
+ delegate :facet_group_names, :facet_fields_in_group, to: :@blacklight_config
15
+ end
16
+ end
17
+ end
@@ -1,7 +1,7 @@
1
- <%= form_tag @url, method: @method, class: @classes.join(' '), role: 'search', aria: { label: scoped_t('submit') }, **@form_options do %>
2
- <%= render_hash_as_hidden_fields(@params) %>
1
+ <%= form_with url: @url, local: true, method: @method, class: @classes.join(' '), scope: @prefix, role: 'search', aria: { label: scoped_t('submit') }, **@form_options do |f| %>
2
+ <%= render Blacklight::HiddenSearchStateComponent.new(params: @params) %>
3
3
  <% if search_fields.length > 1 %>
4
- <label for="search_field" class="sr-only visually-hidden"><%= scoped_t('search_field.label') %></label>
4
+ <%= f.label :search_field, scoped_t('search_field.label'), class: 'sr-only visually-hidden' %>
5
5
  <% end %>
6
6
  <% before_input_groups.each do |input_group| %>
7
7
  <%= input_group %>
@@ -10,22 +10,27 @@
10
10
  <%= prepend %>
11
11
 
12
12
  <% if search_fields.length > 1 %>
13
- <%= select_tag(:search_field,
14
- options_for_select(search_fields, h(@search_field)),
15
- title: scoped_t('search_field.title'),
16
- id: "#{@prefix}search_field",
17
- class: "custom-select form-select search-field") %>
13
+ <%= f.select(:search_field,
14
+ options_for_select(search_fields, h(@search_field)),
15
+ {},
16
+ title: scoped_t('search_field.title'),
17
+ class: "custom-select form-select search-field") %>
18
18
  <% elsif search_fields.length == 1 %>
19
- <%= hidden_field_tag :search_field, search_fields.first.last %>
19
+ <%= f.hidden_field :search_field, value: search_fields.first.last %>
20
20
  <% end %>
21
21
 
22
- <label for="<%= @prefix %><%= @query_param %>" class="sr-only visually-hidden"><%= scoped_t('search.label') %></label>
23
- <%= text_field_tag @query_param, @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", id: "#{@prefix}q", autocomplete: autocomplete_path.present? ? "off" : "", autofocus: @autofocus, aria: { label: scoped_t('search.label') }, data: { autocomplete_enabled: autocomplete_path.present?, autocomplete_path: autocomplete_path } %>
22
+ <%= f.label @query_param, scoped_t('search.label'), class: 'sr-only visually-hidden' %>
23
+ <% if autocomplete_path.present? %>
24
+ <auto-complete src="<%= autocomplete_path %>" for="autocomplete-popup" class="search-autocomplete-wrapper">
25
+ <%= f.search_field @query_param, value: @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", autofocus: @autofocus, aria: { label: scoped_t('search.label'), autocomplete: 'list', controls: 'autocomplete-popup' } %>
26
+ <ul id="autocomplete-popup" role="listbox" aria-label="<%= scoped_t('search.label') %>"></ul>
27
+ </auto-complete>
28
+ <% else %>
29
+ <%= f.search_field @query_param, value: @q, placeholder: scoped_t('search.placeholder'), class: "search-q q form-control rounded-#{search_fields.length > 1 ? '0' : 'left'}", autofocus: @autofocus, aria: { label: scoped_t('search.label') } %>
30
+ <% end %>
24
31
 
25
- <span class="input-group-append">
26
- <%= append %>
27
- <%= search_button || render(Blacklight::SearchButtonComponent.new(id: "#{@prefix}search", text: scoped_t('submit'))) %>
28
- </span>
32
+ <%= append %>
33
+ <%= search_button || render(Blacklight::SearchButtonComponent.new(id: "#{@prefix}search", text: scoped_t('submit'))) %>
29
34
  </div>
30
35
  <% end %>
31
36
 
@@ -2,8 +2,6 @@
2
2
 
3
3
  module Blacklight
4
4
  class SearchBarComponent < Blacklight::Component
5
- include Blacklight::ContentAreasShim
6
-
7
5
  renders_one :append
8
6
  renders_one :prepend
9
7
  renders_one :search_button
@@ -12,10 +10,10 @@ module Blacklight
12
10
  # rubocop:disable Metrics/ParameterLists
13
11
  def initialize(
14
12
  url:, params:,
15
- advanced_search_url: nil, presenter: nil,
13
+ advanced_search_url: nil,
16
14
  classes: ['search-query-form'], prefix: nil,
17
15
  method: 'GET', q: nil, query_param: :q,
18
- search_field: nil, search_fields: nil, autocomplete_path: nil,
16
+ search_field: nil, autocomplete_path: nil,
19
17
  autofocus: nil, i18n: { scope: 'blacklight.search.form' },
20
18
  form_options: {}
21
19
  )
@@ -30,14 +28,8 @@ module Blacklight
30
28
  @method = method
31
29
  @autocomplete_path = autocomplete_path
32
30
  @autofocus = autofocus
33
- @search_fields = search_fields
34
31
  @i18n = i18n
35
32
  @form_options = form_options
36
-
37
- return if presenter.nil?
38
-
39
- Deprecation.warn(self, 'SearchBarComponent no longer uses a SearchBarPresenter, the presenter: param will be removed in 8.0. ' \
40
- 'Set advanced_search.enabled, autocomplete_enabled, and enable_search_bar_autofocus on BlacklightConfiguration')
41
33
  end
42
34
  # rubocop:enable Metrics/ParameterLists
43
35
 
@@ -74,12 +66,6 @@ module Blacklight
74
66
  helpers.blacklight_config
75
67
  end
76
68
 
77
- def render_hash_as_hidden_fields(*args)
78
- Deprecation.silence(Blacklight::HashAsHiddenFieldsHelperBehavior) do
79
- helpers.render_hash_as_hidden_fields(*args)
80
- end
81
- end
82
-
83
69
  def scoped_t(key, **args)
84
70
  t(key, default: t(key, scope: 'blacklight.search.form'), **@i18n, **args)
85
71
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blacklight
4
- class SearchButtonComponent < ::ViewComponent::Base
4
+ class SearchButtonComponent < Blacklight::Component
5
5
  def initialize(text:, id:)
6
6
  @text = text
7
7
  @id = id
@@ -9,8 +9,8 @@ module Blacklight
9
9
 
10
10
  def call
11
11
  tag.button(class: 'btn btn-primary search-btn', type: 'submit', id: @id) do
12
- tag.span(@text, class: "submit-search-text") +
13
- blacklight_icon(:search, aria_hidden: true)
12
+ tag.span(@text, class: "visually-hidden-sm me-sm-1 submit-search-text") +
13
+ render(Blacklight::Icons::SearchComponent.new)
14
14
  end
15
15
  end
16
16
  end
@@ -0,0 +1,4 @@
1
+ <div id="appliedParams" class="clearfix constraints-container">
2
+ <%= render 'start_over' %>
3
+ <%= link_back_to_catalog class: 'btn btn-outline-secondary' %>
4
+ </div>
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module SearchContext
5
+ class ServerAppliedParamsComponent < Blacklight::Component
6
+ delegate :current_search_session, :link_back_to_catalog, to: :helpers
7
+
8
+ def render?
9
+ current_search_session
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module SearchContext
5
+ class ServerItemPaginationComponent < Blacklight::Component
6
+ with_collection_parameter :search_context
7
+
8
+ def initialize(search_context:, search_session:, current_document:)
9
+ @search_context = search_context
10
+ @search_session = search_session
11
+ @current_document_id = current_document.id
12
+ end
13
+
14
+ def render?
15
+ @search_context.present? && (@search_context[:prev] || @search_context[:next]) && (@search_session['document_id'] == @current_document_id)
16
+ end
17
+
18
+ ##
19
+ # Displays "showing X of Y items" message.
20
+ #
21
+ # @return [String]
22
+ def item_page_entry_info
23
+ t('blacklight.search.entry_pagination_info.other', current: number_with_delimiter(count),
24
+ total: number_with_delimiter(total),
25
+ count: total).html_safe
26
+ end
27
+
28
+ def link_to_previous_document(previous_document = nil, classes: 'previous', **link_opts)
29
+ previous_document ||= @search_context[:prev]
30
+ link_opts = session_tracking_params(previous_document, count - 1, per_page: per_page, search_id: search_id).merge(class: classes, rel: 'prev').merge(link_opts)
31
+ link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), url_for_document(previous_document), link_opts do
32
+ tag.span raw(t('views.pagination.previous')), class: 'previous'
33
+ end
34
+ end
35
+
36
+ def link_to_next_document(next_document = nil, classes: 'next', **link_opts)
37
+ next_document ||= @search_context[:next]
38
+ link_opts = session_tracking_params(next_document, count + 1, per_page: per_page, search_id: search_id).merge(class: classes, rel: 'next').merge(link_opts)
39
+ link_to_unless next_document.nil?, raw(t('views.pagination.next')), url_for_document(next_document), link_opts do
40
+ tag.span raw(t('views.pagination.next')), class: 'next'
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def count
47
+ @search_session['counter'].to_i
48
+ end
49
+
50
+ def per_page
51
+ @search_session['per_page']
52
+ end
53
+
54
+ def total
55
+ @search_session['total'].to_i
56
+ end
57
+
58
+ def search_id
59
+ @search_session['id'] || helpers.current_search_session&.id
60
+ end
61
+
62
+ def session_tracking_params(...)
63
+ helpers.session_tracking_params(...)
64
+ end
65
+
66
+ def url_for_document(...)
67
+ helpers.search_state.url_for_document(...)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,2 @@
1
+ <%= render 'did_you_mean' %>
2
+ <%= render 'sort_and_per_page' %>
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class SearchHeaderComponent < Blacklight::Component
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ <%= tag.div class: 'navbar-search navbar navbar-light bg-light', role: 'navigation', aria: { label: t('blacklight.search.header') } do %>
2
+ <div class="<%= container_classes %>">
3
+ <%= search_bar %>
4
+ </div>
5
+ <% end %>
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class SearchNavbarComponent < Blacklight::Component
5
+ def initialize(blacklight_config:)
6
+ @blacklight_config = blacklight_config
7
+ end
8
+
9
+ attr_reader :blacklight_config
10
+
11
+ delegate :container_classes, to: :helpers
12
+
13
+ def search_bar
14
+ render search_bar_component
15
+ end
16
+
17
+ def search_bar_component
18
+ search_bar_component_class.new(
19
+ url: helpers.search_action_url,
20
+ advanced_search_url: helpers.search_action_url(action: 'advanced_search'),
21
+ params: helpers.search_state.params_for_search.except(:qt),
22
+ autocomplete_path: suggest_index_catalog_path
23
+ )
24
+ end
25
+
26
+ def search_bar_component_class
27
+ view_config&.search_bar_component || Blacklight::SearchBarComponent
28
+ end
29
+
30
+ def view_config
31
+ blacklight_config&.view_config(helpers.document_index_view_type)
32
+ end
33
+ end
34
+ end
@@ -12,9 +12,11 @@ module Blacklight
12
12
  # Get the path to the search action with any parameters (e.g. view type)
13
13
  # that should be persisted across search sessions.
14
14
  def start_over_path query_params = params
15
- Deprecation.silence(Blacklight::UrlHelperBehavior) do
16
- helpers.start_over_path(query_params)
17
- end
15
+ h = {}
16
+ current_index_view_type = helpers.document_index_view_type(query_params)
17
+ h[:view] = current_index_view_type unless current_index_view_type == helpers.default_document_index_view_type
18
+
19
+ helpers.search_action_path(h)
18
20
  end
19
21
  end
20
22
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Blacklight
4
4
  module System
5
- class DropdownComponent < ViewComponent::Base
5
+ class DropdownComponent < Blacklight::Component
6
6
  renders_one :button, (lambda do |classes:, label:|
7
7
  button_tag class: classes, aria: { expanded: false }, data: { toggle: 'dropdown', 'bs-toggle': 'dropdown' } do
8
8
  safe_join([label, content_tag(:span, '', class: 'caret')])
@@ -29,11 +29,11 @@ module Blacklight
29
29
  end
30
30
 
31
31
  def before_render
32
- button(classes: 'btn btn-outline-secondary dropdown-toggle', label: button_label) unless button
32
+ with_button(classes: 'btn btn-outline-secondary dropdown-toggle', label: button_label) unless button
33
33
 
34
34
  return if options.any?
35
35
 
36
- options(@choices.map do |option|
36
+ with_options(@choices.map do |option|
37
37
  text, value = option_text_and_value(option)
38
38
  { text: text, url: helpers.url_for(@search_state.params_for_search(@param => value)), selected: @selected == value }
39
39
  end)
@@ -1,4 +1,6 @@
1
1
  <div class="alert <%= @classes %>">
2
2
  <%= message %>
3
- <a class="btn-close close" data-dismiss="alert" data-bs-dismiss="alert" href="#">&times;</a>
3
+ <%= tag.button_tag button_contents, type: "button", class: "btn-close",
4
+ data: { dismiss: "alert", bs_dismiss: "alert" },
5
+ aria: { label: "Close" } %>
4
6
  </div>
@@ -2,18 +2,27 @@
2
2
 
3
3
  module Blacklight
4
4
  module System
5
- class FlashMessageComponent < ViewComponent::Base
5
+ class FlashMessageComponent < Blacklight::Component
6
6
  renders_one :message
7
7
 
8
8
  with_collection_parameter :message
9
9
 
10
- def initialize(message: nil, type:)
10
+ def initialize(type:, message: nil)
11
11
  @message = message
12
12
  @classes = alert_class(type)
13
13
  end
14
14
 
15
15
  def before_render
16
- message { @message } if @message
16
+ with_message { @message } if @message
17
+ end
18
+
19
+ # Bootstrap 4 requires the span, but Bootstrap 5 should not have it.
20
+ # See https://getbootstrap.com/docs/4.6/components/alerts/#dismissing
21
+ # https://getbootstrap.com/docs/5.1/components/alerts/#dismissing
22
+ def button_contents
23
+ return if helpers.controller.blacklight_config.bootstrap_version == 5
24
+
25
+ tag.span '&times;'.html_safe, aria: { hidden: true }
17
26
  end
18
27
 
19
28
  def alert_class(type)
@@ -6,7 +6,7 @@
6
6
  <h1 class="modal-title"><%= title %></h1>
7
7
  <% end) %>
8
8
 
9
- <button type="button" class="blacklight-modal-close btn-close close" data-bs-dismiss="modal" data-dismiss="modal" aria-label="<%= t('blacklight.modal.close') %>">
9
+ <button type="button" class="blacklight-modal-close btn-close close" data-bl-dismiss="modal" aria-label="<%= t('blacklight.modal.close') %>">
10
10
  <span aria-hidden="true" class="visually-hidden">&times;</span>
11
11
  </button>
12
12
  </div>
@@ -2,9 +2,7 @@
2
2
 
3
3
  module Blacklight
4
4
  module System
5
- class ModalComponent < ViewComponent::Base
6
- include Blacklight::ContentAreasShim
7
-
5
+ class ModalComponent < Blacklight::Component
8
6
  renders_one :prefix
9
7
  renders_one :header
10
8
  renders_one :title
@@ -0,0 +1,12 @@
1
+ <nav class="navbar navbar-expand-md navbar-dark bg-dark topbar" role="navigation">
2
+ <div class="<%= container_classes %>">
3
+ <%= logo_link %>
4
+ <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-bs-toggle="collapse" data-target="#user-util-collapse" data-bs-target="#user-util-collapse" aria-controls="user-util-collapse" aria-expanded="false" aria-label="Toggle navigation">
5
+ <span class="navbar-toggler-icon"></span>
6
+ </button>
7
+
8
+ <div class="collapse navbar-collapse justify-content-md-end" id="user-util-collapse">
9
+ <%= render 'shared/user_util_links' %>
10
+ </div>
11
+ </div>
12
+ </nav>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class TopNavbarComponent < Blacklight::Component
5
+ def initialize(blacklight_config:)
6
+ @blacklight_config = blacklight_config
7
+ end
8
+
9
+ attr_reader :blacklight_config
10
+
11
+ delegate :application_name, :container_classes, to: :helpers
12
+
13
+ def logo_link(title: application_name)
14
+ link_to title, blacklight_config.logo_link, class: 'mb-0 navbar-brand navbar-logo'
15
+ end
16
+ end
17
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class BookmarksController < CatalogController
3
4
  include Blacklight::Bookmarks
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class CatalogController < ApplicationController
3
4
  include Blacklight::Catalog
4
5
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- # note that while this is mostly restful routing, the #update and #destroy actions
2
+
3
+ # NOTE: that while this is mostly restful routing, the #update and #destroy actions
3
4
  # take the Solr document ID as the :id, NOT the id of the actual Bookmark action.
4
5
  module Blacklight::Bookmarks
5
6
  extend ActiveSupport::Concern
@@ -14,12 +15,13 @@ module Blacklight::Bookmarks
14
15
 
15
16
  before_action :verify_user
16
17
 
17
- blacklight_config.track_search_session = false
18
+ blacklight_config.track_search_session.storage = false
18
19
  blacklight_config.http_method = Blacklight::Engine.config.blacklight.bookmarks_http_method
19
20
  blacklight_config.add_results_collection_tool(:clear_bookmarks_widget)
20
21
 
21
22
  blacklight_config.show.document_actions[:bookmark].if = false if blacklight_config.show.document_actions[:bookmark]
22
23
  blacklight_config.show.document_actions[:sms].if = false if blacklight_config.show.document_actions[:sms]
24
+ blacklight_config.search_builder_class = Blacklight::BookmarksSearchBuilder
23
25
  end
24
26
 
25
27
  def action_documents
@@ -38,11 +40,14 @@ module Blacklight::Bookmarks
38
40
  search_catalog_url(*args)
39
41
  end
40
42
 
43
+ # @return [Hash] a hash of context information to pass through to the search service
44
+ def search_service_context
45
+ { bookmarks: @bookmarks }
46
+ end
47
+
41
48
  def index
42
49
  @bookmarks = token_or_current_or_guest_user.bookmarks
43
- bookmark_ids = @bookmarks.collect { |b| b.document_id.to_s }
44
- @response, deprecated_document_list = search_service.fetch(bookmark_ids)
45
- @document_list = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_document_list, "The @document_list instance variable is now deprecated and will be removed in Blacklight 8.0")
50
+ @response = search_service.search_results
46
51
 
47
52
  respond_to do |format|
48
53
  format.html {}
@@ -115,7 +120,7 @@ module Blacklight::Bookmarks
115
120
  redirect_back fallback_location: bookmarks_path, notice: I18n.t('blacklight.bookmarks.remove.success')
116
121
  end
117
122
  elsif request.xhr?
118
- head 500 # ajaxy request needs no redirect and should not have flash set
123
+ head :internal_server_error # ajaxy request needs no redirect and should not have flash set
119
124
  else
120
125
  redirect_back fallback_location: bookmarks_path, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
121
126
  end