blacklight 7.41.0 → 8.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. checksums.yaml +4 -4
  2. data/.env +2 -3
  3. data/.github/workflows/ruby.yml +81 -0
  4. data/.rubocop.yml +243 -14
  5. data/.rubocop_todo.yml +137 -429
  6. data/Gemfile +11 -6
  7. data/README.md +11 -3
  8. data/VERSION +1 -1
  9. data/app/assets/javascripts/blacklight/blacklight.esm.js +384 -0
  10. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  11. data/app/assets/javascripts/blacklight/blacklight.js +374 -493
  12. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  13. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  14. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  15. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  16. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  17. data/app/assets/stylesheets/blacklight/_constraints.scss +4 -4
  18. data/app/assets/stylesheets/blacklight/_facets.scss +72 -44
  19. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  20. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  21. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  22. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  23. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  24. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  25. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  26. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  27. data/app/builders/blacklight/action_builder.rb +18 -9
  28. data/app/components/blacklight/advanced_search_form_component.html.erb +3 -3
  29. data/app/components/blacklight/advanced_search_form_component.rb +8 -10
  30. data/app/components/blacklight/constraints_component.rb +27 -37
  31. data/app/components/blacklight/document/action_component.rb +12 -10
  32. data/app/components/blacklight/document/actions_component.rb +2 -2
  33. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  34. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  35. data/app/components/blacklight/document/citation_component.rb +5 -3
  36. data/app/components/blacklight/document/group_component.rb +7 -3
  37. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  38. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  39. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  40. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  41. data/app/components/blacklight/document_component.html.erb +1 -1
  42. data/app/components/blacklight/document_component.rb +16 -78
  43. data/app/components/blacklight/document_metadata_component.html.erb +2 -4
  44. data/app/components/blacklight/document_metadata_component.rb +5 -10
  45. data/app/components/blacklight/facet_component.rb +3 -3
  46. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +4 -4
  47. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  48. data/app/components/blacklight/facet_field_component.html.erb +4 -5
  49. data/app/components/blacklight/facet_field_component.rb +9 -2
  50. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  51. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  52. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  53. data/app/components/blacklight/facet_item_component.rb +1 -43
  54. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  55. data/app/components/blacklight/header_component.rb +1 -1
  56. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  57. data/app/components/blacklight/icons/icon_component.rb +4 -9
  58. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  59. data/app/components/blacklight/icons/list_component.rb +16 -0
  60. data/app/components/blacklight/icons/search_component.rb +16 -0
  61. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  62. data/app/components/blacklight/metadata_field_component.rb +24 -8
  63. data/app/components/blacklight/metadata_field_layout_component.rb +4 -25
  64. data/app/components/blacklight/response/facet_group_component.html.erb +3 -5
  65. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  66. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  67. data/app/components/blacklight/response/pagination_component.rb +2 -11
  68. data/app/components/blacklight/response/sort_component.html.erb +6 -1
  69. data/app/components/blacklight/response/sort_component.rb +1 -16
  70. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  71. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  72. data/app/components/blacklight/response/view_type_component.rb +4 -6
  73. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  74. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  75. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  76. data/app/components/blacklight/search_bar_component.rb +2 -16
  77. data/app/components/blacklight/search_button_component.rb +3 -3
  78. data/app/components/blacklight/search_context_component.rb +43 -10
  79. data/app/components/blacklight/search_header_component.html.erb +2 -0
  80. data/app/components/blacklight/search_header_component.rb +6 -0
  81. data/app/components/blacklight/start_over_button_component.rb +5 -3
  82. data/app/components/blacklight/system/dropdown_component.rb +8 -5
  83. data/app/components/blacklight/system/flash_message_component.html.erb +4 -2
  84. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  85. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  86. data/app/components/blacklight/system/modal_component.rb +1 -3
  87. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  88. data/app/components/blacklight/top_navbar_component.rb +0 -4
  89. data/app/controllers/bookmarks_controller.rb +1 -0
  90. data/app/controllers/catalog_controller.rb +1 -0
  91. data/app/controllers/concerns/blacklight/bookmarks.rb +10 -9
  92. data/app/controllers/concerns/blacklight/catalog.rb +21 -83
  93. data/app/controllers/concerns/blacklight/controller.rb +3 -41
  94. data/app/controllers/concerns/blacklight/search_context.rb +25 -7
  95. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  96. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  97. data/app/controllers/concerns/blacklight/token_based_user.rb +13 -1
  98. data/app/controllers/search_history_controller.rb +1 -0
  99. data/app/helpers/blacklight/blacklight_helper_behavior.rb +12 -310
  100. data/app/helpers/blacklight/catalog_helper_behavior.rb +22 -139
  101. data/app/helpers/blacklight/component_helper_behavior.rb +2 -53
  102. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -119
  103. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  104. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -7
  105. data/app/helpers/blacklight/layout_helper_behavior.rb +4 -3
  106. data/app/helpers/blacklight/render_partials_helper_behavior.rb +11 -31
  107. data/app/helpers/blacklight/url_helper_behavior.rb +12 -97
  108. data/app/helpers/blacklight_helper.rb +1 -0
  109. data/app/helpers/catalog_helper.rb +1 -0
  110. data/app/javascript/blacklight/bookmark_toggle.js +13 -19
  111. data/app/javascript/blacklight/button_focus.js +12 -10
  112. data/app/javascript/blacklight/checkbox_submit.js +68 -123
  113. data/app/javascript/blacklight/core.js +5 -7
  114. data/app/javascript/blacklight/index.js +13 -0
  115. data/app/javascript/blacklight/modal.js +99 -164
  116. data/app/javascript/blacklight/modalForm.js +60 -0
  117. data/app/javascript/blacklight/search_context.js +46 -54
  118. data/app/models/blacklight/facet_paginator.rb +3 -2
  119. data/app/models/blacklight/icon.rb +4 -2
  120. data/app/models/bookmark.rb +0 -2
  121. data/app/models/concerns/blacklight/configurable.rb +5 -4
  122. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -10
  123. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  124. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  125. data/app/models/concerns/blacklight/document/email.rb +1 -0
  126. data/app/models/concerns/blacklight/document/export.rb +2 -1
  127. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  128. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  129. data/app/models/concerns/blacklight/document/semantic_fields.rb +2 -1
  130. data/app/models/concerns/blacklight/document/sms.rb +1 -0
  131. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  132. data/app/models/concerns/blacklight/user.rb +17 -8
  133. data/app/models/record_mailer.rb +13 -12
  134. data/app/models/search.rb +1 -7
  135. data/app/models/solr_document.rb +1 -0
  136. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  137. data/app/presenters/blacklight/document_presenter.rb +23 -50
  138. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  139. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  140. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  141. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  142. data/app/presenters/blacklight/field_presenter.rb +1 -0
  143. data/app/presenters/blacklight/index_presenter.rb +2 -40
  144. data/app/presenters/blacklight/json_presenter.rb +10 -6
  145. data/app/presenters/blacklight/rendering/link_to_facet.rb +2 -5
  146. data/app/presenters/blacklight/show_presenter.rb +1 -9
  147. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  148. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  149. data/app/services/blacklight/field_retriever.rb +12 -21
  150. data/app/services/blacklight/search_service.rb +10 -17
  151. data/app/values/blacklight/types.rb +0 -18
  152. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  153. data/app/views/bookmarks/_tools.html.erb +7 -12
  154. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  155. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  156. data/app/views/catalog/_citation.html.erb +1 -1
  157. data/app/views/catalog/_constraints.html.erb +1 -14
  158. data/app/views/catalog/_document.atom.builder +12 -14
  159. data/app/views/catalog/_document.html.erb +5 -3
  160. data/app/views/catalog/_document.rss.builder +2 -4
  161. data/app/views/catalog/_facet_layout.html.erb +2 -2
  162. data/app/views/catalog/_facets.html.erb +5 -4
  163. data/app/views/catalog/_home_text.html.erb +2 -14
  164. data/app/views/catalog/_per_page_widget.html.erb +10 -1
  165. data/app/views/catalog/_search_form.html.erb +2 -2
  166. data/app/views/catalog/_search_header.html.erb +1 -2
  167. data/app/views/catalog/_search_results.html.erb +2 -2
  168. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  169. data/app/views/catalog/_show_main_content.html.erb +11 -16
  170. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  171. data/app/views/catalog/_show_tools.html.erb +8 -14
  172. data/app/views/catalog/_view_type_group.html.erb +1 -1
  173. data/app/views/catalog/email.html.erb +2 -2
  174. data/app/views/catalog/email_success.html.erb +5 -6
  175. data/app/views/catalog/facet.html.erb +7 -5
  176. data/app/views/catalog/index.atom.builder +12 -14
  177. data/app/views/catalog/index.html.erb +4 -1
  178. data/app/views/catalog/index.json.jbuilder +19 -19
  179. data/app/views/catalog/index.rss.builder +1 -1
  180. data/app/views/catalog/opensearch.xml.builder +1 -1
  181. data/app/views/catalog/sms.html.erb +2 -2
  182. data/app/views/catalog/sms_success.html.erb +5 -6
  183. data/app/views/catalog/suggest.html.erb +3 -0
  184. data/app/views/kaminari/blacklight/_page.html.erb +2 -1
  185. data/app/views/layouts/blacklight/base.html.erb +13 -2
  186. data/app/views/search_history/index.html.erb +6 -2
  187. data/app/views/shared/_flash_messages.html.erb +1 -1
  188. data/app/views/shared/_modal.html.erb +3 -3
  189. data/blacklight.gemspec +7 -11
  190. data/config/importmap.rb +3 -0
  191. data/config/locales/blacklight.ar.yml +0 -1
  192. data/config/locales/blacklight.ca.yml +0 -1
  193. data/config/locales/blacklight.de.yml +0 -1
  194. data/config/locales/blacklight.en.yml +0 -2
  195. data/config/locales/blacklight.es.yml +0 -1
  196. data/config/locales/blacklight.fr.yml +0 -1
  197. data/config/locales/blacklight.hu.yml +0 -1
  198. data/config/locales/blacklight.it.yml +0 -1
  199. data/config/locales/blacklight.nl.yml +0 -1
  200. data/config/locales/blacklight.pt-BR.yml +0 -1
  201. data/config/locales/blacklight.sq.yml +0 -1
  202. data/config/locales/blacklight.zh.yml +0 -1
  203. data/config/routes.rb +3 -2
  204. data/db/migrate/20140202020201_create_searches.rb +1 -0
  205. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  206. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  207. data/docker-compose.yml +3 -3
  208. data/lib/blacklight/abstract_repository.rb +1 -6
  209. data/lib/blacklight/component.rb +47 -10
  210. data/lib/blacklight/configuration/context.rb +4 -4
  211. data/lib/blacklight/configuration/display_field.rb +7 -9
  212. data/lib/blacklight/configuration/facet_field.rb +17 -11
  213. data/lib/blacklight/configuration/field.rb +1 -0
  214. data/lib/blacklight/configuration/fields.rb +12 -15
  215. data/lib/blacklight/configuration/index_field.rb +1 -0
  216. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  217. data/lib/blacklight/configuration/search_field.rb +1 -0
  218. data/lib/blacklight/configuration/show_field.rb +1 -0
  219. data/lib/blacklight/configuration/sort_field.rb +1 -0
  220. data/lib/blacklight/configuration/tool_config.rb +1 -0
  221. data/lib/blacklight/configuration/view_config.rb +14 -10
  222. data/lib/blacklight/configuration.rb +310 -365
  223. data/lib/blacklight/engine.rb +8 -24
  224. data/lib/blacklight/exceptions.rb +2 -2
  225. data/lib/blacklight/nested_open_struct_with_hash_access.rb +7 -13
  226. data/lib/blacklight/open_struct_with_hash_access.rb +23 -6
  227. data/lib/blacklight/parameters.rb +7 -21
  228. data/lib/blacklight/routes/exportable.rb +1 -0
  229. data/lib/blacklight/routes/searchable.rb +2 -1
  230. data/lib/blacklight/routes.rb +1 -0
  231. data/lib/blacklight/search_builder.rb +10 -10
  232. data/lib/blacklight/search_state/filter_field.rb +8 -25
  233. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  234. data/lib/blacklight/search_state.rb +23 -79
  235. data/lib/blacklight/solr/document.rb +1 -0
  236. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  237. data/lib/blacklight/solr/repository.rb +4 -24
  238. data/lib/blacklight/solr/request.rb +1 -0
  239. data/lib/blacklight/solr/response/facets.rb +21 -5
  240. data/lib/blacklight/solr/response/group.rb +1 -0
  241. data/lib/blacklight/solr/response/group_response.rb +1 -0
  242. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  243. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  244. data/lib/blacklight/solr/response/params.rb +5 -4
  245. data/lib/blacklight/solr/response/response.rb +1 -0
  246. data/lib/blacklight/solr/response/spelling.rb +1 -0
  247. data/lib/blacklight/solr/response.rb +16 -3
  248. data/lib/blacklight/solr/search_builder_behavior.rb +16 -35
  249. data/lib/blacklight/solr.rb +7 -0
  250. data/lib/blacklight/version.rb +1 -0
  251. data/lib/blacklight.rb +26 -14
  252. data/lib/generators/blacklight/assets/importmap_generator.rb +55 -0
  253. data/lib/generators/blacklight/assets/propshaft_generator.rb +25 -0
  254. data/lib/generators/blacklight/assets/sprockets_generator.rb +66 -0
  255. data/lib/generators/blacklight/assets_generator.rb +13 -86
  256. data/lib/generators/blacklight/controller_generator.rb +4 -3
  257. data/lib/generators/blacklight/document_generator.rb +1 -0
  258. data/lib/generators/blacklight/install_generator.rb +4 -3
  259. data/lib/generators/blacklight/models_generator.rb +1 -0
  260. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  261. data/lib/generators/blacklight/solr_generator.rb +1 -1
  262. data/lib/generators/blacklight/templates/catalog_controller.rb +34 -8
  263. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +1 -70
  264. data/lib/generators/blacklight/test_support_generator.rb +5 -3
  265. data/lib/generators/blacklight/user_generator.rb +7 -9
  266. data/lib/railties/blacklight.rake +6 -7
  267. data/package.json +10 -13
  268. data/rollup.config.js +27 -0
  269. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  270. data/spec/components/blacklight/document/action_component_spec.rb +6 -1
  271. data/spec/components/blacklight/document_component_spec.rb +22 -131
  272. data/spec/components/blacklight/facet_component_spec.rb +3 -18
  273. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  274. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  275. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +10 -9
  276. data/spec/components/blacklight/response/view_type_component_spec.rb +66 -0
  277. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  278. data/spec/components/blacklight/search_context_component_spec.rb +17 -8
  279. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  280. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  281. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  282. data/spec/controllers/catalog_controller_spec.rb +13 -135
  283. data/spec/features/advanced_search_spec.rb +0 -56
  284. data/spec/features/autocomplete_spec.rb +1 -1
  285. data/spec/features/axe_spec.rb +1 -6
  286. data/spec/features/bookmarks_spec.rb +1 -1
  287. data/spec/features/facets_spec.rb +6 -4
  288. data/spec/features/search_context_spec.rb +5 -11
  289. data/spec/features/search_results_spec.rb +0 -33
  290. data/spec/features/sitelinks_search_box.rb +13 -0
  291. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  292. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  293. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  294. data/spec/helpers/blacklight/layout_helper_behavior_spec.rb +3 -20
  295. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  296. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +9 -131
  297. data/spec/helpers/blacklight_helper_spec.rb +8 -252
  298. data/spec/helpers/catalog_helper_spec.rb +7 -118
  299. data/spec/i18n_spec.rb +1 -0
  300. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  301. data/spec/lib/blacklight/component_spec.rb +27 -32
  302. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  303. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  304. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  305. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +2 -2
  306. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  307. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  308. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  309. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  310. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  311. data/spec/models/blacklight/configuration_spec.rb +17 -51
  312. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  313. data/spec/models/blacklight/icon_spec.rb +31 -15
  314. data/spec/models/blacklight/search_builder_spec.rb +9 -9
  315. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  316. data/spec/models/blacklight/solr/repository_spec.rb +0 -45
  317. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  318. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  319. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  320. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  321. data/spec/models/blacklight/solr/search_builder_spec.rb +24 -44
  322. data/spec/models/blacklight/user_spec.rb +22 -0
  323. data/spec/models/solr_document_spec.rb +3 -9
  324. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  325. data/spec/presenters/blacklight/document_presenter_spec.rb +2 -3
  326. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  327. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  328. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  329. data/spec/presenters/blacklight/field_presenter_spec.rb +0 -14
  330. data/spec/presenters/blacklight/index_presenter_spec.rb +2 -5
  331. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  332. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  333. data/spec/presenters/blacklight/show_presenter_spec.rb +20 -30
  334. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  335. data/spec/requests/load_suggestions_spec.rb +16 -0
  336. data/spec/routing/catalog_routing_spec.rb +2 -1
  337. data/spec/services/blacklight/search_service_spec.rb +39 -76
  338. data/spec/spec_helper.rb +8 -9
  339. data/spec/support/controller_level_helpers.rb +1 -2
  340. data/spec/support/features/search_helpers.rb +39 -0
  341. data/spec/support/features/session_helpers.rb +1 -0
  342. data/spec/support/features.rb +3 -0
  343. data/spec/support/view_component_capybara_test_helpers.rb +8 -0
  344. data/spec/test_app_templates/Gemfile.extra +1 -0
  345. data/spec/test_app_templates/lib/generators/test_app_generator.rb +9 -2
  346. data/spec/views/catalog/_document.html.erb_spec.rb +3 -34
  347. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  348. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +0 -2
  349. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  350. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  351. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -66
  352. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  353. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  354. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  355. data/spec/views/catalog/index.atom.builder_spec.rb +17 -11
  356. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  357. data/spec/views/catalog/index.json.jbuilder_spec.rb +2 -2
  358. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  360. data/tasks/blacklight.rake +11 -9
  361. data/template.demo.rb +7 -7
  362. metadata +77 -189
  363. data/.babelrc +0 -11
  364. data/.github/matrix.json +0 -62
  365. data/.github/workflows/build.yml +0 -16
  366. data/.github/workflows/lint.yml +0 -23
  367. data/.github/workflows/main.yml +0 -23
  368. data/.github/workflows/test.yml +0 -53
  369. data/app/assets/images/blacklight/list.svg +0 -1
  370. data/app/assets/images/blacklight/search.svg +0 -1
  371. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  372. data/app/components/blacklight/content_areas_shim.rb +0 -13
  373. data/app/components/blacklight/search/per_page_component.html.erb +0 -2
  374. data/app/components/blacklight/search/per_page_component.rb +0 -50
  375. data/app/components/blacklight/search_context/server_item_pagination_component.html.erb +0 -10
  376. data/app/components/blacklight/search_context/server_item_pagination_component.rb +0 -15
  377. data/app/components/blacklight/system/dropdown_button_component.rb +0 -18
  378. data/app/controllers/concerns/blacklight/base.rb +0 -12
  379. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  380. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  381. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  382. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  383. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  384. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  385. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  386. data/app/javascript/blacklight/autocomplete.js +0 -36
  387. data/app/javascript/blacklight/facet_load.js +0 -22
  388. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  389. data/app/views/catalog/_constraints_element.html.erb +0 -14
  390. data/app/views/catalog/_document_action.html.erb +0 -5
  391. data/app/views/catalog/_facet_group.html.erb +0 -5
  392. data/app/views/catalog/_facet_limit.html.erb +0 -3
  393. data/app/views/catalog/_index.html.erb +0 -1
  394. data/app/views/catalog/_index_header.html.erb +0 -22
  395. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  396. data/app/views/catalog/_show.html.erb +0 -6
  397. data/app/views/catalog/_show_header.html.erb +0 -2
  398. data/app/views/catalog/_thumbnail.html.erb +0 -1
  399. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  400. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  401. data/spec/components/blacklight/header_component_spec.rb +0 -20
  402. data/spec/components/blacklight/icons/icon_component_spec.rb +0 -42
  403. data/spec/components/blacklight/response/pagination_component_spec.rb +0 -53
  404. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +0 -35
  405. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  406. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  407. data/spec/features/citation_spec.rb +0 -10
  408. data/spec/features/sitelinks_search_box_spec.rb +0 -13
  409. data/spec/features/sms_spec.rb +0 -12
  410. data/spec/helpers/blacklight/hash_as_hidden_fields_behavior_spec.rb +0 -26
  411. data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +0 -92
  412. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +0 -101
  413. data/spec/helpers/blacklight/suggest_helper_behavior_spec.rb +0 -48
  414. data/spec/lib/blacklight/engine_spec.rb +0 -41
  415. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  416. data/spec/services/blacklight/field_retriever_spec.rb +0 -17
  417. data/spec/support/view_component_test_helpers.rb +0 -35
  418. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  419. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  420. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  421. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  422. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  423. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  424. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  425. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
@@ -1,44 +1,29 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Catalog
3
4
  extend ActiveSupport::Concern
4
5
 
5
6
  # MimeResponds is part of ActionController::Base, but not ActionController::API
6
7
  include ActionController::MimeResponds
7
8
 
8
- Deprecation.silence(Blacklight::Base) do
9
- include Blacklight::Base
10
- end
11
-
12
- include Blacklight::Facet
9
+ include Blacklight::Configurable
10
+ include Blacklight::SearchContext
13
11
  include Blacklight::Searchable
14
12
 
15
- extend Deprecation
16
-
17
13
  # The following code is executed when someone includes blacklight::catalog in their
18
14
  # own controller.
19
15
  included do
20
16
  if respond_to? :helper_method
21
- helper_method :sms_mappings, :has_search_parameters?, :facet_limit_for
17
+ helper_method :sms_mappings, :has_search_parameters?
18
+ helper_method :search_facet_path
22
19
  end
23
20
 
24
- helper Blacklight::Facet if respond_to? :helper
25
-
26
- # The index action will more than likely throw this one.
27
- # Example: when the standard query parser is used, and a user submits a "bad" query.
28
- rescue_from Blacklight::Exceptions::InvalidRequest, with: :handle_request_error
29
-
30
21
  record_search_parameters
31
22
  end
32
23
 
33
24
  # get search results from the solr index
34
25
  def index
35
- (@response, deprecated_document_list) = search_service.search_results
36
-
37
- @document_list = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(
38
- deprecated_document_list,
39
- 'The @document_list instance variable is deprecated; use @response.documents instead.',
40
- ActiveSupport::Deprecation.new("8.0", "blacklight")
41
- )
26
+ @response = search_service.search_results
42
27
 
43
28
  respond_to do |format|
44
29
  format.html { store_preferred_view }
@@ -56,12 +41,7 @@ module Blacklight::Catalog
56
41
  # get a single document from the index
57
42
  # to add responses for formats other than html or json see _Blacklight::Document::Export_
58
43
  def show
59
- deprecated_response, @document = search_service.fetch(params[:id])
60
- @response = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(
61
- deprecated_response,
62
- 'The @response instance variable is deprecated; use @document.response instead.',
63
- ActiveSupport::Deprecation.new("8.0", "blacklight")
64
- )
44
+ @document = search_service.fetch(params[:id])
65
45
 
66
46
  respond_to do |format|
67
47
  format.html { @search_context = setup_next_and_previous_documents }
@@ -78,7 +58,7 @@ module Blacklight::Catalog
78
58
  def raw
79
59
  raise(ActionController::RoutingError, 'Not Found') unless blacklight_config.raw_endpoint.enabled
80
60
 
81
- _, @document = search_service.fetch(params[:id])
61
+ @document = search_service.fetch(params[:id])
82
62
  render json: @document
83
63
  end
84
64
 
@@ -106,7 +86,7 @@ module Blacklight::Catalog
106
86
  @response = search_service.facet_field_response(@facet.key)
107
87
  @display_facet = @response.aggregations[@facet.field]
108
88
 
109
- @presenter = (@facet.presenter || Blacklight::FacetFieldPresenter).new(@facet, @display_facet, view_context)
89
+ @presenter = @facet.presenter.new(@facet, @display_facet, view_context)
110
90
  @pagination = @presenter.paginator
111
91
  respond_to do |format|
112
92
  format.html do
@@ -126,21 +106,19 @@ module Blacklight::Catalog
126
106
  end
127
107
  end
128
108
 
109
+ # Returns the dropdown list for autocomplete
129
110
  def suggest
130
- respond_to do |format|
131
- format.json do
132
- render json: suggestions_service.suggestions
133
- end
134
- end
111
+ @suggestions = suggestions_service.suggestions
112
+ render 'suggest', layout: false
135
113
  end
136
114
 
137
115
  # @return [Array] first value is a Blacklight::Solr::Response and the second
138
116
  # is a list of documents
139
117
  def action_documents
140
- deprecated_response, @documents = search_service.fetch(Array(params[:id]))
118
+ @documents = search_service.fetch(Array(params[:id]))
141
119
  raise Blacklight::Exceptions::RecordNotFound if @documents.blank?
142
120
 
143
- [deprecated_response, @documents]
121
+ @documents
144
122
  end
145
123
 
146
124
  def action_success_redirect_path
@@ -154,34 +132,14 @@ module Blacklight::Catalog
154
132
  params[:search_field].present? || search_state.has_constraints?
155
133
  end
156
134
 
157
- # TODO: deprecate this constant with #facet_limit_for
158
- DEFAULT_FACET_LIMIT = 10
159
-
160
- # Look up facet limit for given facet_field. Will look at config, and
161
- # if config is 'true' will look up from Solr @response if available. If
162
- # no limit is available, returns nil. Used from #add_facetting_to_solr
163
- # to supply f.fieldname.facet.limit values in solr request (no @response
164
- # available), and used in display (with @response available) to create
165
- # a facet paginator with the right limit.
166
- def facet_limit_for(facet_field)
167
- facet = blacklight_config.facet_fields[facet_field]
168
- return if facet.blank?
169
-
170
- if facet.limit && @response && @response.aggregations[facet.field]
171
- limit = @response.aggregations[facet.field].limit
172
-
173
- if limit.nil? # we didn't get or a set a limit, so infer one.
174
- facet.limit if facet.limit != true
175
- elsif limit == -1 # limit -1 is solr-speak for unlimited
176
- nil
177
- else
178
- limit.to_i - 1 # we added 1 to find out if we needed to paginate
179
- end
180
- elsif facet.limit
181
- facet.limit == true ? DEFAULT_FACET_LIMIT : facet.limit
182
- end
135
+ def search_facet_path(options = {})
136
+ opts = search_state
137
+ .to_h
138
+ .merge(action: "facet", only_path: true)
139
+ .merge(options)
140
+ .except(:page)
141
+ url_for opts
183
142
  end
184
- deprecation_deprecate facet_limit_for: 'moving to private logic in Blacklight::FacetFieldPresenter'
185
143
 
186
144
  private
187
145
 
@@ -325,26 +283,6 @@ module Blacklight::Catalog
325
283
  action_name == 'show' ? 'catalog_result' : super
326
284
  end
327
285
 
328
- # when a method throws a Blacklight::Exceptions::InvalidRequest, this method is executed.
329
- def handle_request_error(exception)
330
- # Rails own code will catch and give usual Rails error page with stack trace
331
- raise exception if Rails.env.development? || Rails.env.test?
332
-
333
- flash_notice = I18n.t('blacklight.search.errors.request_error')
334
-
335
- # If there are errors coming from the index page, we want to trap those sensibly
336
-
337
- if flash[:notice] == flash_notice
338
- logger&.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
339
- raise exception
340
- end
341
-
342
- logger&.error exception
343
-
344
- flash[:notice] = flash_notice
345
- redirect_to search_action_url
346
- end
347
-
348
286
  def blacklight_advanced_search_form_search_service
349
287
  form_search_state = search_state_class.new(blacklight_advanced_search_form_params, blacklight_config, self)
350
288
 
@@ -1,14 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Filters added to this controller apply to all controllers in the hosting application
3
4
  # as this module is mixed-in to the application controller in the hosting app on installation.
4
5
  module Blacklight::Controller
5
6
  extend ActiveSupport::Concern
6
- extend Deprecation
7
7
 
8
8
  included do
9
- include Blacklight::SearchFields
10
- helper Blacklight::SearchFields if respond_to? :helper
11
-
12
9
  include ActiveSupport::Callbacks
13
10
 
14
11
  # now in application.rb file under config.filter_parameters
@@ -16,6 +13,7 @@ module Blacklight::Controller
16
13
 
17
14
  # handle basic authorization exception with #access_denied
18
15
  rescue_from Blacklight::Exceptions::AccessDenied, with: :access_denied
16
+ helper BlacklightHelper
19
17
 
20
18
  if respond_to? :helper_method
21
19
  helper_method :current_user_session, :current_user, :current_or_guest_user
@@ -24,7 +22,6 @@ module Blacklight::Controller
24
22
  helper_method :has_user_authentication_provider?
25
23
  helper_method :blacklight_config, :blacklight_configuration_context # move to Catalog
26
24
  helper_method :search_action_url, :search_action_path
27
- helper_method :search_facet_path # move to catalog? deprecate?
28
25
  helper_method :search_state
29
26
  end
30
27
 
@@ -33,12 +30,6 @@ module Blacklight::Controller
33
30
  # TODO: move to Searchable
34
31
  class_attribute :search_state_class
35
32
  self.search_state_class = Blacklight::SearchState
36
-
37
- # Which class to use for the search service. You can subclass SearchService if you
38
- # want to override any of the methods (e.g. SearchService#fetch)
39
- # TODO: move to Searchable
40
- class_attribute :search_service_class
41
- self.search_service_class = Blacklight::SearchService
42
33
  end
43
34
 
44
35
  # @private
@@ -76,7 +67,7 @@ module Blacklight::Controller
76
67
  # which action the search form should use
77
68
  def search_action_url options = {}
78
69
  # Rails 4.2 deprecated url helpers accepting string keys for 'controller' or 'action'
79
- search_catalog_url(options.except(:controller, :action))
70
+ search_catalog_url(options.to_h.except(:controller, :action))
80
71
  end
81
72
 
82
73
  def search_action_path *args
@@ -87,22 +78,6 @@ module Blacklight::Controller
87
78
  search_action_url(*args)
88
79
  end
89
80
 
90
- # TODO: move to catalog? deprecate?
91
- def search_facet_path(options = {})
92
- opts = search_state
93
- .to_h
94
- .merge(action: "facet", only_path: true)
95
- .merge(options)
96
- .except(:page)
97
- url_for opts
98
- end
99
-
100
- # Returns a list of Searches from the ids in the user's history.
101
- # TODO: move to catalog? SearchHistory?
102
- def searches_from_history
103
- session[:history].blank? ? ::Search.none : ::Search.where(id: session[:history]).order("updated_at desc")
104
- end
105
-
106
81
  # Should be provided by authentication provider
107
82
  # def current_user
108
83
  # end
@@ -126,21 +101,9 @@ module Blacklight::Controller
126
101
  respond_to? :current_user
127
102
  end
128
103
 
129
- def require_user_authentication_provider
130
- raise ActionController::RoutingError, 'Not Found' unless has_user_authentication_provider?
131
- end
132
- deprecation_deprecate require_user_authentication_provider: 'removed without replacement'
133
-
134
104
  ##
135
105
  # When a user logs in, transfer any saved searches or bookmarks to the current_user
136
106
  def transfer_guest_to_user
137
- Deprecation.silence(Blacklight::Controller) do
138
- transfer_guest_user_actions_to_current_user
139
- end
140
- end
141
-
142
- # @deprecated use canonical `transfer_guest_to_user` method instead
143
- def transfer_guest_user_actions_to_current_user
144
107
  return unless respond_to?(:current_user) && respond_to?(:guest_user) && current_user && guest_user
145
108
 
146
109
  current_user_searches = current_user.searches.pluck(:query_params)
@@ -159,7 +122,6 @@ module Blacklight::Controller
159
122
  # let guest_user know we've moved some bookmarks from under it
160
123
  guest_user.reload if guest_user.persisted?
161
124
  end
162
- deprecation_deprecate :transfer_guest_user_actions_to_current_user
163
125
 
164
126
  ##
165
127
  # To handle failed authorization attempts, redirect the user to the
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::SearchContext
3
4
  extend ActiveSupport::Concern
4
5
 
@@ -17,6 +18,16 @@ module Blacklight::SearchContext
17
18
  end
18
19
  end
19
20
 
21
+ # The current search session
22
+ def current_search_session
23
+ @current_search_session ||= find_search_session
24
+ end
25
+
26
+ # Returns a list of Searches from the ids in the user's history.
27
+ def searches_from_history
28
+ session[:history].blank? ? ::Search.none : ::Search.where(id: session[:history]).order("updated_at desc")
29
+ end
30
+
20
31
  private
21
32
 
22
33
  # sets up the session[:search] hash if it doesn't already exist
@@ -27,11 +38,6 @@ module Blacklight::SearchContext
27
38
  session[:search]
28
39
  end
29
40
 
30
- # The current search session
31
- def current_search_session
32
- @current_search_session ||= find_search_session
33
- end
34
-
35
41
  # Persist the current search session id to the user's session
36
42
  def set_current_search_session
37
43
  search_session['id'] = current_search_session.id if current_search_session
@@ -79,7 +85,7 @@ module Blacklight::SearchContext
79
85
  end
80
86
 
81
87
  def find_or_initialize_search_session_from_params params
82
- params_copy = params.reject { |k, v| blacklisted_search_session_params.include?(k.to_sym) || v.blank? }
88
+ params_copy = params.reject { |k, v| nonpersisted_search_session_params.include?(k.to_sym) || v.blank? }
83
89
 
84
90
  return if params_copy.reject { |k, _v| [:action, :controller].include? k.to_sym }.blank?
85
91
 
@@ -102,10 +108,22 @@ module Blacklight::SearchContext
102
108
  end
103
109
 
104
110
  # A list of query parameters that should not be persisted for a search
105
- def blacklisted_search_session_params
111
+ def nonpersisted_search_session_params
112
+ unless method(:blacklisted_search_session_params).source_location.first.end_with?('deprecation/method_wrappers.rb')
113
+ # The blacklisted_search_session_params was overridden, so call it.
114
+ Blacklight.deprecation.warn(self, "blacklisted_search_session_params was overriden in your app, " \
115
+ "but that method should be renamed to `nonpersisted_search_session_params'. " \
116
+ "The original behavior will be removed in the next major release.")
117
+ return blacklisted_search_session_params
118
+ end
106
119
  [:commit, :counter, :total, :search_id, :page, :per_page]
107
120
  end
108
121
 
122
+ def blacklisted_search_session_params
123
+ nonpersisted_search_session_params
124
+ end
125
+ Blacklight.deprecation.deprecate_methods(self, blacklisted_search_session_params: 'use nonpersisted_search_session_params instead')
126
+
109
127
  # calls setup_previous_document then setup_next_document.
110
128
  # used in the show action for single view pagination.
111
129
  def setup_next_and_previous_documents
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  module SearchHistory
4
5
  extend ActiveSupport::Concern
5
6
  include Blacklight::Configurable
7
+ include Blacklight::SearchContext
6
8
 
7
9
  included do
8
10
  copy_blacklight_config_from(CatalogController)
@@ -5,17 +5,28 @@
5
5
  # would be provided by Blacklight::Controller
6
6
  # 1. search_state
7
7
  # 2. blacklight_config
8
- # 3. search_service_class
9
8
  #
10
9
  # Additionally, the including class may override the search_service_context method to provide
11
10
  # further context to the SearchService. For example you could override this to provide the
12
11
  # currently signed in user.
13
12
  module Blacklight::Searchable
13
+ extend ActiveSupport::Concern
14
+
15
+ included do
16
+ # Which class to use for the search service. You can subclass SearchService if you
17
+ # want to override any of the methods (e.g. SearchService#fetch)
18
+ class_attribute :search_service_class
19
+ self.search_service_class = Blacklight::SearchService
20
+ end
21
+
14
22
  # @return [Blacklight::SearchService]
15
23
  def search_service
16
24
  search_service_class.new(config: blacklight_config, search_state: search_state, user_params: search_state.to_h, **search_service_context)
17
25
  end
18
26
 
27
+ # Override this method on the class that includes Blacklight::Searchable to provide more context to the search service if necessary.
28
+ # For example, if your search builder needs to be aware of the current user, override this method to return a hash including the current user.
29
+ # Then the search builder could use some property about the current user to construct a constraint on the search.
19
30
  # @return [Hash] a hash of context information to pass through to the search service
20
31
  def search_service_context
21
32
  {}
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::TokenBasedUser
3
4
  extend ActiveSupport::Concern
4
5
 
@@ -48,7 +49,18 @@ module Blacklight::TokenBasedUser
48
49
  end
49
50
 
50
51
  def secret_key_generator
51
- @secret_key_generator ||= ActiveSupport::KeyGenerator.new(Rails.application.secret_key_base)
52
+ @secret_key_generator ||= begin
53
+ app = Rails.application
54
+
55
+ secret_key_base = if app.respond_to?(:credentials)
56
+ # Rails 5.2+
57
+ app.credentials.secret_key_base
58
+ else
59
+ # Rails <= 5.1
60
+ app.secrets.secret_key_base
61
+ end
62
+ ActiveSupport::KeyGenerator.new(secret_key_base)
63
+ end
52
64
  end
53
65
 
54
66
  def message_encryptor
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class SearchHistoryController < ApplicationController
3
4
  include Blacklight::SearchHistory
4
5
  end