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
@@ -1,21 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'blacklight/deprecations/search_state_normalization'
4
3
  require 'blacklight/search_state/filter_field'
4
+ require 'blacklight/search_state/pivot_filter_field'
5
5
 
6
6
  module Blacklight
7
7
  # This class encapsulates the search state as represented by the query
8
8
  # parameters namely: :f, :q, :page, :per_page and, :sort
9
9
  class SearchState
10
- extend Deprecation
11
- include Blacklight::Deprecations::SearchStateNormalization
12
-
13
10
  attr_reader :blacklight_config # Must be called blacklight_config, because Blacklight::Facet calls blacklight_config.
14
- attr_reader :params
15
11
 
16
12
  # This method is never accessed in this class, but may be used by subclasses that need
17
13
  # to access the url_helpers
18
- attr_reader :controller
14
+ attr_reader :controller, :params
19
15
 
20
16
  delegate :facet_configuration_for_field, to: :blacklight_config
21
17
 
@@ -33,34 +29,8 @@ module Blacklight
33
29
  end
34
30
  alias to_h to_hash
35
31
 
36
- def to_unsafe_h
37
- Deprecation.warn(self.class, 'Use SearchState#to_h instead of SearchState#to_unsafe_h')
38
- to_hash
39
- end
40
-
41
- def method_missing(method_name, *arguments, &block)
42
- if @params.respond_to?(method_name)
43
- Deprecation.warn(self.class, "Calling `#{method_name}` on Blacklight::SearchState " \
44
- 'is deprecated and will be removed in Blacklight 8. Call #to_h first if you ' \
45
- ' need to use hash methods (or, preferably, use your own SearchState implementation)')
46
- @params.public_send(method_name, *arguments, &block)
47
- else
48
- super
49
- end
50
- end
51
-
52
- def respond_to_missing?(method_name, include_private = false)
53
- @params.respond_to?(method_name, include_private) || super
54
- end
55
-
56
- # Tiny shim to make it easier to migrate raw params access to using this class
57
- delegate :[], to: :params
58
- deprecation_deprecate :[]
59
-
60
32
  def has_constraints?
61
- Deprecation.silence(Blacklight::SearchState) do
62
- !(query_param.blank? && filter_params.blank? && filters.blank? && clause_params.blank?)
63
- end
33
+ !(query_param.blank? && filters.blank? && clause_params.blank?)
64
34
  end
65
35
 
66
36
  def query_param
@@ -71,11 +41,6 @@ module Blacklight
71
41
  params[:clause] || {}
72
42
  end
73
43
 
74
- def filter_params
75
- params[:f] || {}
76
- end
77
- deprecation_deprecate filter_params: 'Use #filters instead'
78
-
79
44
  # @return [Blacklight::SearchState]
80
45
  def reset(params = nil)
81
46
  self.class.new(params || {}, blacklight_config, controller)
@@ -91,15 +56,20 @@ module Blacklight
91
56
  # to provide more interesting routing to
92
57
  # documents
93
58
  def url_for_document(doc, options = {})
94
- if respond_to?(:blacklight_config) &&
95
- blacklight_config.view_config(:show).route &&
96
- (!doc.respond_to?(:to_model) || doc.to_model.is_a?(SolrDocument))
97
- route = blacklight_config.view_config(:show).route.merge(action: :show, id: doc).merge(options)
98
- route[:controller] = params[:controller] if route[:controller] == :current
99
- route
100
- else
101
- doc
102
- end
59
+ return doc unless routable?(doc)
60
+
61
+ route = blacklight_config.view_config(:show).route.merge(action: :show, id: doc).merge(options)
62
+ route[:controller] = params[:controller] if route[:controller] == :current
63
+ route
64
+ end
65
+
66
+ # To build a show route, we must have a blacklight_config that has
67
+ # configured show views, and the doc must appropriate to the config
68
+ # @return [Boolean]
69
+ def routable?(doc)
70
+ return false unless respond_to?(:blacklight_config) && blacklight_config.view_config(:show).route
71
+
72
+ doc.is_a? routable_model_for(blacklight_config)
103
73
  end
104
74
 
105
75
  def remove_query_params
@@ -116,6 +86,7 @@ module Blacklight
116
86
  @filters ||= filter_fields.select(&:any?)
117
87
  end
118
88
 
89
+ # @return [FilterField]
119
90
  def filter(field_key_or_field)
120
91
  field = field_key_or_field if field_key_or_field.is_a? Blacklight::Configuration::Field
121
92
  field ||= blacklight_config.facet_fields[field_key_or_field]
@@ -124,15 +95,6 @@ module Blacklight
124
95
  (field.filter_class || FilterField).new(field, self)
125
96
  end
126
97
 
127
- # adds the value and/or field to params[:f]
128
- # Does NOT remove request keys and otherwise ensure that the hash
129
- # is suitable for a redirect. See
130
- # add_facet_params_and_redirect
131
- def add_facet_params(field, item)
132
- filter(field).add(item).params
133
- end
134
- deprecation_deprecate add_facet_params: 'Use filter(field).add(item) instead'
135
-
136
98
  # Used in catalog/facet action, facets.rb view, for a click
137
99
  # on a facet value. Add on the facet params to existing
138
100
  # search constraints. Remove any paginator-specific request
@@ -141,9 +103,7 @@ module Blacklight
141
103
  # Change the action to 'index' to send them back to
142
104
  # catalog/index with their new facet choice.
143
105
  def add_facet_params_and_redirect(field, item)
144
- new_params = Deprecation.silence(self.class) do
145
- add_facet_params(field, item).to_h.with_indifferent_access
146
- end
106
+ new_params = filter(field).add(item).to_h
147
107
 
148
108
  # Delete any request params from facet-specific action, needed
149
109
  # to redir to index action properly.
@@ -153,26 +113,6 @@ module Blacklight
153
113
  new_params
154
114
  end
155
115
 
156
- # copies the current params (or whatever is passed in as the 3rd arg)
157
- # removes the field value from params[:f]
158
- # removes the field if there are no more values in params[:f][field]
159
- # removes additional params (page, id, etc..)
160
- # @param [String] field
161
- # @param [String] item
162
- def remove_facet_params(field, item)
163
- filter(field).remove(item).params
164
- end
165
- deprecation_deprecate remove_facet_params: 'Use filter(field).remove(item) instead'
166
-
167
- def has_facet?(config, value: nil)
168
- if value
169
- filter(config).include?(value)
170
- else
171
- filter(config).any?
172
- end
173
- end
174
- deprecation_deprecate has_facet?: 'Use filter(field).include?(value) or .any? instead'
175
-
176
116
  # Merge the source params with the params_to_merge hash
177
117
  # @param [Hash] params_to_merge to merge into above
178
118
  # @return [ActionController::Parameters] the current search parameters after being sanitized by Blacklight::Parameters.sanitize
@@ -230,6 +170,10 @@ module Blacklight
230
170
 
231
171
  private
232
172
 
173
+ def routable_model_for(blacklight_config)
174
+ blacklight_config.document_model || ::SolrDocument
175
+ end
176
+
233
177
  def search_field_key
234
178
  params[:search_field]
235
179
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  ##
3
4
  ##
4
5
  # = Introduction
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr
3
4
  # Pagination for facet values -- works by setting the limit to max
4
5
  # displayable. You have to ask Solr for limit+1, to get enough
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr
3
4
  class Repository < Blacklight::AbstractRepository
4
5
  ##
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Blacklight::Solr::InvalidParameter < ArgumentError; end
3
4
 
4
5
  class Blacklight::Solr::Request < ActiveSupport::HashWithIndifferentAccess
@@ -18,6 +19,8 @@ class Blacklight::Solr::Request < ActiveSupport::HashWithIndifferentAccess
18
19
  end
19
20
 
20
21
  def append_query(query)
22
+ return if query.nil?
23
+
21
24
  if self['q'] || dig(:json, :query, :bool)
22
25
  self[:json] ||= { query: { bool: { must: [] } } }
23
26
  self[:json][:query] ||= { bool: { must: [] } }
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'ostruct'
3
4
 
4
5
  module Blacklight::Solr::Response::Facets
@@ -109,7 +110,7 @@ module Blacklight::Solr::Response::Facets
109
110
  # Get all the Solr facet data (fields, queries, pivots) as a hash keyed by
110
111
  # both the Solr field name and/or by the blacklight field name
111
112
  def aggregations
112
- @aggregations ||= {}.merge(facet_field_aggregations).merge(facet_query_aggregations).merge(facet_pivot_aggregations).merge(json_facet_aggregations)
113
+ @aggregations ||= default_aggregations.merge(facet_field_aggregations).merge(facet_query_aggregations).merge(facet_pivot_aggregations).merge(json_facet_aggregations)
113
114
  end
114
115
 
115
116
  def facet_counts
@@ -123,7 +124,7 @@ module Blacklight::Solr::Response::Facets
123
124
 
124
125
  # this is some old solr (1.4? earlier?) serialization of facet fields
125
126
  if val.is_a? Array
126
- Hash[val]
127
+ val.to_h
127
128
  else
128
129
  val
129
130
  end
@@ -151,6 +152,21 @@ module Blacklight::Solr::Response::Facets
151
152
 
152
153
  private
153
154
 
155
+ # @return [Hash] establish a null object pattern for facet data look-up, allowing
156
+ # the response and applied parameters to get passed through even if there was no
157
+ # facet data in the response
158
+ def default_aggregations
159
+ @default_aggregations ||= begin
160
+ h = Hash.new { |key| null_facet_field_object(key) }
161
+ h.with_indifferent_access
162
+ end
163
+ end
164
+
165
+ # @return [Blacklight::Solr::Response::FacetField] a "null object" facet field
166
+ def null_facet_field_object(key)
167
+ Blacklight::Solr::Response::FacetField.new(key, [], facet_field_aggregation_options(key).merge(response: self))
168
+ end
169
+
154
170
  ##
155
171
  # Convert Solr responses of various json.nl flavors to
156
172
  def list_as_hash solr_list
@@ -161,10 +177,10 @@ module Blacklight::Solr::Response::Facets
161
177
  solr_list.transform_values do |values|
162
178
  if values.first.is_a? Array
163
179
  # arrarr
164
- Hash[values]
180
+ values.to_h
165
181
  else
166
182
  # flat
167
- Hash[values.each_slice(2).to_a]
183
+ values.each_slice(2).to_a.to_h
168
184
  end
169
185
  end
170
186
  end
@@ -180,7 +196,7 @@ module Blacklight::Solr::Response::Facets
180
196
 
181
197
  # legacy solr facet.missing serialization
182
198
  if value.nil?
183
- i.label = I18n.t(:"blacklight.search.fields.facet.missing.#{facet_field_name}", default: [:"blacklight.search.facets.missing"])
199
+ i.label = I18n.t(:"blacklight.search.fields.facet.missing.#{facet_field_name}", default: [:'blacklight.search.facets.missing'])
184
200
  i.fq = "-#{facet_field_name}:[* TO *]" # this explicit fq is deprecated; the missing attribute below is a better thing to check for this case
185
201
  i.value = Blacklight::SearchState::FilterField::MISSING
186
202
  i.missing = true
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Blacklight::Solr::Response::Group
3
4
  include Blacklight::Solr::Response::PaginationMethods
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Blacklight::Solr::Response::GroupResponse
3
4
  include Blacklight::Solr::Response::PaginationMethods
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr::Response::MoreLikeThis
3
4
  def more_like document
4
5
  mlt = more_like_this[document.id]
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr::Response::PaginationMethods
3
4
  include Kaminari::PageScopeMethods
4
5
  include Kaminari::ConfigurationMethods::ClassMethods
5
6
 
6
- def limit_value #:nodoc:
7
+ def limit_value # :nodoc:
7
8
  rows
8
9
  end
9
10
 
10
- def offset_value #:nodoc:
11
+ def offset_value # :nodoc:
11
12
  start
12
13
  end
13
14
 
14
- def total_count #:nodoc:
15
+ def total_count # :nodoc:
15
16
  total
16
17
  end
17
18
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr::Response::Params
3
4
  # From https://solr.apache.org/guide/8_8/json-request-api.html#supported-properties-and-syntax
4
5
  QUERY_PARAMETER_TO_JSON_PARAMETER_MAPPING = {
@@ -29,9 +30,9 @@ module Blacklight::Solr::Response::Params
29
30
  def facet_field_aggregation_options(facet_field_name)
30
31
  defaults = {
31
32
  sort: single_valued_param(:'facet.sort'),
32
- limit: single_valued_param(:"facet.limit")&.to_i || 100,
33
- offset: single_valued_param(:"facet.offset")&.to_i || 0,
34
- prefix: single_valued_param(:"facet.prefix")
33
+ limit: single_valued_param(:'facet.limit')&.to_i || 100,
34
+ offset: single_valued_param(:'facet.offset')&.to_i || 0,
35
+ prefix: single_valued_param(:'facet.prefix')
35
36
  }
36
37
 
37
38
  json_facet = json_params.dig('facet', facet_field_name)&.slice(:limit, :offset, :prefix, :sort)&.symbolize_keys || {}
@@ -41,7 +42,7 @@ module Blacklight::Solr::Response::Params
41
42
  limit: single_valued_param(:"f.#{facet_field_name}.facet.limit")&.to_i,
42
43
  offset: single_valued_param(:"f.#{facet_field_name}.facet.offset")&.to_i,
43
44
  prefix: single_valued_param(:"f.#{facet_field_name}.facet.prefix")
44
- }.reject { |_k, v| v.nil? }
45
+ }.compact
45
46
 
46
47
  options = defaults.merge(json_facet).merge(param_facet)
47
48
  options[:sort] ||= options[:limit].positive? ? 'count' : 'index'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr::Response::Response
3
4
  def response
4
5
  self[:response] || {}
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # A mixin for making access to the spellcheck component data easy.
3
4
  #
4
5
  # response.spelling.words
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class Blacklight::Solr::Response < ActiveSupport::HashWithIndifferentAccess
3
4
  extend ActiveSupport::Autoload
4
5
  eager_autoload do
@@ -78,11 +79,11 @@ class Blacklight::Solr::Response < ActiveSupport::HashWithIndifferentAccess
78
79
  when Array
79
80
  value.each { |v| force_to_utf8(v) }
80
81
  when String
81
- if value.encoding != Encoding::UTF_8
82
+ if value.encoding == Encoding::UTF_8
83
+ value
84
+ else
82
85
  Blacklight.logger&.warn "Found a non utf-8 value in Blacklight::Solr::Response. \"#{value}\" Encoding is #{value.encoding}"
83
86
  value.dup.force_encoding('UTF-8')
84
- else
85
- value
86
87
  end
87
88
  end
88
89
  value
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Solr
3
4
  module SearchBuilderBehavior
4
5
  extend ActiveSupport::Concern
@@ -30,16 +31,6 @@ module Blacklight::Solr
30
31
  end
31
32
 
32
33
  def add_search_field_default_parameters(solr_parameters)
33
- ###
34
- # legacy behavior of user param :qt is passed through, but over-ridden
35
- # by actual search field config if present. We might want to remove
36
- # this legacy behavior at some point. It does not seem to be currently
37
- # rspec'd.
38
- if search_state.params[:qt]
39
- Deprecation.warn(Blacklight::Solr::SearchBuilderBehavior, 'Passing the Solr qt as a parameter is deprecated.')
40
- solr_parameters[:qt] = blacklight_params[:qt]
41
- end
42
-
43
34
  ###
44
35
  # Merge in search field configured values, if present, over-writing general
45
36
  # defaults
@@ -55,11 +46,6 @@ module Blacklight::Solr
55
46
  # including config's "search field" params for current search field.
56
47
  # also include setting spellcheck.q.
57
48
  def add_query_to_solr(solr_parameters)
58
- unless processor_chain.include?(:add_search_field_default_parameters)
59
- Deprecation.warn(Blacklight::Solr::SearchBuilderBehavior, 'Please include :add_search_field_default_parameters in your process chain')
60
- add_search_field_default_parameters(solr_parameters)
61
- end
62
-
63
49
  ##
64
50
  # Create Solr 'q' including the user-entered q, prefixed by any
65
51
  # solr LocalParams in config, using solr LocalParams syntax.
@@ -71,12 +57,7 @@ module Blacklight::Solr
71
57
  add_search_field_with_json_query_parameters(solr_parameters)
72
58
  elsif search_field&.solr_local_parameters.present?
73
59
  add_search_field_with_local_parameters(solr_parameters)
74
- elsif search_state.query_param.is_a? Hash
75
- if search_state.query_param == @additional_filters && !processor_chain.include?(:add_additional_filters)
76
- Deprecation.warn(Blacklight::Solr::SearchBuilderBehavior, 'Expecting to see the processor step add_additional_filters; falling back to legacy query handling')
77
- add_additional_filters(solr_parameters, search_state.query_param)
78
- end
79
- elsif search_state.query_param
60
+ elsif !search_state&.query_param.is_a?(Hash)
80
61
  solr_parameters.append_query search_state.query_param
81
62
  end
82
63
  end
@@ -151,9 +132,9 @@ module Blacklight::Solr
151
132
  end
152
133
  solr_parameters.merge!(subqueries) if subqueries
153
134
  else
154
- filter.values.reject(&:blank?).each do |value|
135
+ filter.values.compact_blank.each do |value|
155
136
  filter_query, subqueries = if value.is_a?(Array)
156
- facet_inclusive_value_to_fq_string(filter.key, value.reject(&:blank?))
137
+ facet_inclusive_value_to_fq_string(filter.key, value.compact_blank)
157
138
  else
158
139
  facet_value_to_fq_string(filter.config.key, value)
159
140
  end
@@ -282,7 +263,7 @@ module Blacklight::Solr
282
263
 
283
264
  # Now override with our specific things for fetching facet values
284
265
  facet_ex = facet_config.respond_to?(:ex) ? facet_config.ex : nil
285
- solr_params[:"facet.field"] = with_ex_local_param(facet_ex, facet_config.field)
266
+ solr_params[:'facet.field'] = with_ex_local_param(facet_ex, facet_config.field)
286
267
 
287
268
  # Need to set as f.facet_field.facet.* to make sure we
288
269
  # override any field-specific default in the solr request handler.
@@ -339,9 +320,9 @@ module Blacklight::Solr
339
320
  options[:quote] ||= '"'
340
321
  unless val =~ /^[a-zA-Z0-9$_\-\^]+$/
341
322
  val = options[:quote] +
342
- # Yes, we need crazy escaping here, to deal with regexp esc too!
343
- val.gsub("'", "\\\\\'").gsub('"', "\\\\\"") +
344
- options[:quote]
323
+ # Yes, we need crazy escaping here, to deal with regexp esc too!
324
+ val.gsub("'", "\\\\\'").gsub('"', "\\\\\"") +
325
+ options[:quote]
345
326
  end
346
327
  val
347
328
  end
@@ -350,6 +331,7 @@ module Blacklight::Solr
350
331
 
351
332
  ##
352
333
  # Convert a facet/value pair into a solr fq parameter
334
+ # rubocop:disable Metrics/PerceivedComplexity
353
335
  def facet_value_to_fq_string(facet_field, value, use_local_params: true)
354
336
  facet_config = blacklight_config.facet_fields[facet_field]
355
337
 
@@ -372,9 +354,10 @@ module Blacklight::Solr
372
354
  elsif value == Blacklight::SearchState::FilterField::MISSING
373
355
  "-#{solr_field}:[* TO *]"
374
356
  else
375
- "{!term f=#{solr_field}#{(' ' + local_params.join(' ')) unless local_params.empty?}}#{convert_to_term_value(value)}"
357
+ "{!term f=#{solr_field}#{" #{local_params.join(' ')}" unless local_params.empty?}}#{convert_to_term_value(value)}"
376
358
  end
377
359
  end
360
+ # rubocop:enable Metrics/PerceivedComplexity
378
361
 
379
362
  def facet_inclusive_value_to_fq_string(facet_field, values)
380
363
  return if values.blank?
@@ -394,13 +377,14 @@ module Blacklight::Solr
394
377
  "{!query v=$#{k}}"
395
378
  end.join(' OR ')
396
379
 
397
- ["{!lucene#{(' ' + local_params.join(' ')) unless local_params.empty?}}#{filter_query}", solr_filters]
380
+ ["{!lucene#{" #{local_params.join(' ')}" unless local_params.empty?}}#{filter_query}", solr_filters]
398
381
  end
399
382
 
400
383
  def convert_to_term_value(value)
401
- if value.is_a?(DateTime) || value.is_a?(Time)
384
+ case value
385
+ when DateTime, Time
402
386
  value.utc.strftime("%Y-%m-%dT%H:%M:%SZ")
403
- elsif value.is_a?(Date)
387
+ when Date
404
388
  value.to_time(:local).strftime("%Y-%m-%dT%H:%M:%SZ")
405
389
  else
406
390
  value.to_s
@@ -434,7 +418,7 @@ module Blacklight::Solr
434
418
 
435
419
  def add_search_field_with_local_parameters(solr_parameters)
436
420
  local_params = search_field.solr_local_parameters.map do |key, val|
437
- key.to_s + "=" + solr_param_quote(val, quote: "'")
421
+ "#{key}=#{solr_param_quote(val, quote: "'")}"
438
422
  end.join(" ")
439
423
  solr_parameters.append_query "{!#{local_params}}#{search_state.query_param}"
440
424
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  module Solr
4
5
  autoload :Document, 'blacklight/solr/document'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  unless Blacklight.const_defined? :VERSION
4
5
  def self.version
data/lib/blacklight.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'kaminari'
3
- require 'deprecation'
4
4
  require 'blacklight/open_struct_with_hash_access'
5
5
  require 'blacklight/nested_open_struct_with_hash_access'
6
6
  require 'jbuilder'
@@ -17,13 +17,11 @@ module Blacklight
17
17
  autoload :SearchState, 'blacklight/search_state'
18
18
  autoload :Solr, 'blacklight/solr'
19
19
 
20
- extend Deprecation
21
-
22
20
  require 'blacklight/version'
23
21
  require 'blacklight/engine' if defined?(Rails)
24
22
 
25
23
  def self.blacklight_config_file
26
- "#{::Rails.root}/config/blacklight.yml"
24
+ Rails.root.join("config/blacklight.yml")
27
25
  end
28
26
 
29
27
  ##
@@ -69,9 +67,6 @@ module Blacklight
69
67
 
70
68
  def defaults_version
71
69
  @defaults_version ||= blacklight_yml['load_defaults'] ||
72
- # this config parameter was introduced in Blacklight 7.11, so to be safe,
73
- # we pin any 7.x app to the 7.10 behavior
74
- (Blacklight::VERSION.starts_with?('7') && '7.10.0') ||
75
70
  Blacklight::VERSION
76
71
 
77
72
  @defaults_version == 'latest' ? Blacklight::VERSION : @defaults_version
@@ -87,7 +82,7 @@ module Blacklight
87
82
  end
88
83
 
89
84
  begin
90
- blacklight_erb = ERB.new(IO.read(blacklight_config_file)).result(binding)
85
+ blacklight_erb = ERB.new(File.read(blacklight_config_file)).result(binding)
91
86
  rescue StandardError, SyntaxError => e
92
87
  raise("#{blacklight_config_file} was found, but could not be parsed with ERB. \n#{e.inspect}")
93
88
  end
@@ -114,9 +109,7 @@ module Blacklight
114
109
  end
115
110
 
116
111
  def self.logger
117
- @logger ||= begin
118
- ::Rails.logger if defined? Rails && Rails.respond_to?(:logger)
119
- end
112
+ @logger ||= (::Rails.logger if defined? Rails && Rails.respond_to?(:logger))
120
113
  end
121
114
 
122
115
  def self.logger= logger
@@ -135,4 +128,8 @@ module Blacklight
135
128
  def self.root
136
129
  @root ||= File.expand_path(File.dirname(File.dirname(__FILE__)))
137
130
  end
131
+
132
+ def self.deprecation
133
+ @deprecation ||= ActiveSupport::Deprecation.new('9.0', 'Blacklight')
134
+ end
138
135
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ module Assets
5
+ class ImportmapGenerator < Rails::Generators::Base
6
+ class_option :'bootstrap-version', type: :string, default: ENV.fetch('BOOTSTRAP_VERSION', '~> 5.1'), desc: "Set the generated app's bootstrap version"
7
+
8
+ # This could be skipped if you want to use webpacker
9
+ def add_javascript_dependencies
10
+ gem 'bootstrap', options[:'bootstrap-version'].presence # in rails 7, only for stylesheets
11
+ gem 'jquery-rails' if bootstrap_4? # Bootstrap 4 has a dependency on jquery
12
+ end
13
+
14
+ def import_javascript_assets
15
+ append_to_file 'config/importmap.rb' do
16
+ <<~CONTENT
17
+ pin "@github/auto-complete-element", to: "https://cdn.skypack.dev/@github/auto-complete-element"
18
+ pin "@popperjs/core", to: "https://ga.jspm.io/npm:@popperjs/core@2.11.6/dist/umd/popper.min.js"
19
+ pin "bootstrap", to: "https://ga.jspm.io/npm:bootstrap@#{(defined?(Bootstrap) && Bootstrap::VERSION) || '5.2.2'}/dist/js/bootstrap.js"
20
+ CONTENT
21
+ end
22
+
23
+ append_to_file 'app/assets/config/manifest.js' do
24
+ <<~CONTENT
25
+ //= link blacklight/manifest.js
26
+ CONTENT
27
+ end
28
+ end
29
+
30
+ def append_blacklight_javascript
31
+ append_to_file 'app/javascript/application.js' do
32
+ <<~CONTENT
33
+ import bootstrap from "bootstrap"
34
+ import githubAutoCompleteElement from "@github/auto-complete-element"
35
+ import Blacklight from "blacklight"
36
+ CONTENT
37
+ end
38
+ end
39
+
40
+ def add_stylesheet
41
+ gem "sassc-rails", "~> 2.1" if Rails.version > '7'
42
+
43
+ create_file 'app/assets/stylesheets/blacklight.scss' do
44
+ <<~CONTENT
45
+ @import 'bootstrap';
46
+ @import 'blacklight/blacklight';
47
+ CONTENT
48
+ end
49
+ end
50
+
51
+ def bootstrap_4?
52
+ options[:'bootstrap-version'].match?(/\A[^0-9]*4\./)
53
+ end
54
+ end
55
+ end
56
+ end