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,22 +0,0 @@
1
- /*global Blacklight */
2
-
3
- 'use strict';
4
-
5
- Blacklight.doResizeFacetLabelsAndCounts = function() {
6
- // adjust width of facet columns to fit their contents
7
- function longer (a,b) { return b.textContent.length - a.textContent.length }
8
-
9
- document.querySelectorAll('.facet-values, .pivot-facet').forEach(function(elem){
10
- const nodes = elem.querySelectorAll('.facet-count')
11
- // TODO: when we drop ie11 support, this can become the spread operator:
12
- const longest = Array.from(nodes).sort(longer)[0]
13
- if (longest && longest.textContent) {
14
- const width = longest.textContent.length + 1 + 'ch'
15
- elem.querySelector('.facet-count').style.width = width
16
- }
17
- })
18
- }
19
-
20
- Blacklight.onLoad(function() {
21
- Blacklight.doResizeFacetLabelsAndCounts()
22
- })
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
- # This module provides the body of an email export based on the document's semantic values
3
- module Blacklight::Document::Email
4
- # Return a text string that will be the body of the email
5
- def to_email_text(config = nil)
6
- body = []
7
-
8
- if config
9
- body = config.email_fields.map do |name, field|
10
- values = [self[name]].flatten
11
- "#{field.label} #{values.join(' ')}" if self[name].present?
12
- end
13
- end
14
-
15
- # Use to_semantic_values for backwards compatibility
16
- if body.empty?
17
- semantics = to_semantic_values
18
- body << I18n.t('blacklight.email.text.title', value: semantics[:title].join(" ")) if semantics[:title].present?
19
- body << I18n.t('blacklight.email.text.author', value: semantics[:author].join(" ")) if semantics[:author].present?
20
- body << I18n.t('blacklight.email.text.format', value: semantics[:format].join(" ")) if semantics[:format].present?
21
- body << I18n.t('blacklight.email.text.language', value: semantics[:language].join(" ")) if semantics[:language].present?
22
- end
23
-
24
- return body.join("\n") unless body.empty?
25
- end
26
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
- # This module provides the body of an email export based on the document's semantic values
3
- module Blacklight::Document::Sms
4
- # Return a text string that will be the body of the email
5
- def to_sms_text(config = nil)
6
- body = []
7
-
8
- if config
9
- body = config.sms_fields.map do |name, field|
10
- values = [self[name]].flatten
11
- "#{field.label} #{values.first}" if self[name].present?
12
- end
13
- end
14
-
15
- # Use to_semantic_values for backwards compatibility
16
- if body.empty?
17
- semantics = to_semantic_values
18
- body << I18n.t('blacklight.sms.text.title', value: semantics[:title].first) if semantics[:title].present?
19
- body << I18n.t('blacklight.sms.text.author', value: semantics[:author].first) if semantics[:author].present?
20
- end
21
-
22
- return body.join unless body.empty?
23
- end
24
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Blacklight
4
- class SearchBarPresenter
5
- extend Deprecation
6
- attr_reader :configuration, :view_context, :controller
7
-
8
- # Set the partial this presenter draws
9
- class_attribute :partial
10
- self.partial = 'catalog/search_form'
11
-
12
- def initialize(controller, configuration = view_context.blacklight_config)
13
- @controller = controller
14
- @view_context = controller.view_context
15
- @configuration = configuration
16
- end
17
-
18
- def render
19
- view_context.render partial, presenter: self
20
- end
21
- deprecation_deprecate render: "The SearchBarPresenter has been deprecated. Call `render Blacklight::SearchBarComponent.new' instead"
22
-
23
- ##
24
- # @return [Boolean] should autocomplete be enabled in the UI
25
- def autocomplete_enabled?
26
- configuration.autocomplete_enabled.present? &&
27
- configuration.autocomplete_path.present?
28
- end
29
-
30
- ##
31
- # If no search parameters have been given, we should
32
- # auto-focus the user's cursor into the searchbox
33
- #
34
- # @return [Boolean]
35
- def autofocus?
36
- configuration.enable_search_bar_autofocus.present? &&
37
- configuration.enable_search_bar_autofocus &&
38
- controller.is_a?(Blacklight::Catalog) &&
39
- controller.action_name == "index" &&
40
- !controller.has_search_parameters?
41
- end
42
-
43
- def advanced_search_enabled?
44
- configuration.advanced_search.enabled
45
- end
46
- end
47
- end
@@ -1,14 +0,0 @@
1
- <% # local params:
2
- # label
3
- # value
4
- # options =>
5
- # :remove => url for a remove constraint link
6
- # :classes => array of classes to add to container span
7
- options ||= {}
8
- %>
9
-
10
- <%= render(Blacklight::ConstraintLayoutComponent.new(
11
- classes: options[:classes],
12
- label: label,
13
- value: value,
14
- remove_path: options[:remove])) %>
@@ -1,5 +0,0 @@
1
- <%= link_to document_action_label(document_action_config.key, document_action_config),
2
- document_action_path(document_action_config, (local_assigns.has_key?(:url_opts) ? url_opts : {}).merge(({id: document} if document) || {})),
3
- id: document_action_config.fetch(:id, "#{document_action_config.key}Link"),
4
- class: 'nav-link',
5
- data: {}.merge(({ blacklight_modal: "trigger" } if document_action_config.modal != false) || {}) %>
@@ -1,5 +0,0 @@
1
- <%= render (blacklight_config&.view_config(document_index_view_type)&.facet_group_component || Blacklight::Response::FacetGroupComponent).new(
2
- response: @response,
3
- id: groupname,
4
- fields: facet_field_names(groupname),
5
- title: groupname.present? ? t("blacklight.search.facets-#{groupname}.title") : t('blacklight.search.facets.title')) %>
@@ -1,3 +0,0 @@
1
- <%= render(Blacklight::FacetFieldListComponent.new(
2
- facet_field: facet_field_presenter(facet_field, display_facet),
3
- layout: false)) %>
@@ -1 +0,0 @@
1
- <%= render(Blacklight::DocumentMetadataComponent.new(fields: document_presenter(document).field_presenters)) %>
@@ -1,22 +0,0 @@
1
- <%# header bar for doc items in index view -%>
2
- <header class="documentHeader row">
3
- <%# main title container for doc partial view
4
- How many bootstrap columns need to be reserved
5
- for bookmarks control depends on size.
6
- -%>
7
- <% document_actions = capture do %>
8
- <% # bookmark functions for items/docs -%>
9
- <%= render_index_doc_actions document, wrapping_class: "index-document-functions col-sm-3 col-lg-2" %>
10
- <% end %>
11
-
12
- <h3 class="index_title document-title-heading <%= document_actions.present? ? "col-sm-9 col-lg-10" : "col-md-12" %>">
13
- <% if counter = document_counter_with_offset(document_counter) %>
14
- <span class="document-counter">
15
- <%= t('blacklight.search.documents.counter', counter: counter) %>
16
- </span>
17
- <% end %>
18
- <%= link_to_document document, counter: counter %>
19
- </h3>
20
-
21
- <%= document_actions %>
22
- </header>
@@ -1,2 +0,0 @@
1
- <% Deprecation.warn(self, 'The partial _previous_next_doc.html.erb will be removed in 8.0. Render Blacklight::SearchContextComponent instead.') %>
2
- <%= render(Blacklight::SearchContextComponent.new(search_context: @search_context, search_session: search_session)) %>
@@ -1,6 +0,0 @@
1
- <%= render(
2
- Blacklight::DocumentMetadataComponent.new(
3
- fields: document_presenter(document).field_presenters,
4
- show: true
5
- )
6
- ) %>
@@ -1,2 +0,0 @@
1
- <% # bookmark/folder functions -%>
2
- <%= Deprecation.silence(Blacklight::BlacklightHelperBehavior) { render_document_heading(document, :tag => :h1) } %>
@@ -1 +0,0 @@
1
- <%= render Blacklight::Document::ThumbnailComponent.new(presenter: document_presenter(document), counter: document_counter_with_offset(document_counter)) -%>
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Blacklight
4
- module Deprecations
5
- module EngineConfiguration
6
- # rubocop:disable Style/RedundantSelf, Style/HashSyntax
7
- # @deprecated
8
- def bookmarks_http_method
9
- self.blacklight.bookmarks_http_method
10
- end
11
- deprecation_deprecate bookmarks_http_method: 'Moved to `blacklight.bookmarks_http_method`'
12
-
13
- # @deprecated
14
- def bookmarks_http_method=(val)
15
- self.blacklight.bookmarks_http_method = val
16
- end
17
- deprecation_deprecate :'bookmarks_http_method=' => 'Moved to `blacklight.bookmarks_http_method=`'
18
-
19
- # @deprecated
20
- def email_regexp
21
- self.blacklight.email_regexp
22
- end
23
- deprecation_deprecate email_regexp: 'Moved to `blacklight.email_regexp`'
24
-
25
- # @deprecated
26
- def email_regexp=(val)
27
- self.blacklight.email_regexp = val
28
- end
29
- deprecation_deprecate :'email_regexp=' => 'Moved to `blacklight.email_regexp=`'
30
-
31
- # @deprecated
32
- def facet_missing_param
33
- self.blacklight.facet_missing_param
34
- end
35
- deprecation_deprecate facet_missing_param: 'Moved to `blacklight.facet_missing_param`'
36
-
37
- # @deprecated
38
- def facet_missing_param=(val)
39
- self.blacklight.facet_missing_param = val
40
- end
41
- deprecation_deprecate :'facet_missing_param=' => 'Moved to `blacklight.facet_missing_param=`'
42
-
43
- # @deprecated
44
- def sms_mappings
45
- self.blacklight.sms_mappings
46
- end
47
- deprecation_deprecate sms_mappings: 'Moved to `blacklight.sms_mappings`'
48
-
49
- # @deprecated
50
- def sms_mappings=(val)
51
- self.blacklight.sms_mappings = val
52
- end
53
- deprecation_deprecate :'sms_mappings=' => 'Moved to `blacklight.sms_mappings=`'
54
- # rubocop:enable Style/RedundantSelf, Style/HashSyntax
55
-
56
- def self.deprecate_in(object)
57
- class << object
58
- extend Deprecation
59
- self.deprecation_horizon = 'blacklight 8.0'
60
-
61
- include Blacklight::Deprecations::EngineConfiguration
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Blacklight
4
- module Deprecations
5
- module SearchStateNormalization
6
- extend ActiveSupport::Concern
7
-
8
- class_methods do
9
- def facet_params_need_normalization(facet_params)
10
- Deprecation.warn(self, 'Calling `facet_params_need_normalization` on the Blacklight::SearchState ' \
11
- 'class is deprecated and will be removed in Blacklight 8. Delegate to #needs_normalization?(value_params) on the ' \
12
- 'filter fields of the search state object.')
13
-
14
- facet_params.is_a?(Hash) && facet_params.values.any? { |x| x.is_a?(Hash) }
15
- end
16
-
17
- def normalize_facet_params(facet_params)
18
- Deprecation.warn(self, 'Calling `normalize_facet_params` on the Blacklight::SearchState ' \
19
- 'class is deprecated and will be removed in Blacklight 8. Delegate to #normalize(value_params) on the ' \
20
- 'filter fields of the search state object.')
21
-
22
- facet_params.transform_values { |value| value.is_a?(Hash) ? value.values : value }
23
- end
24
-
25
- def normalize_params(untrusted_params = {})
26
- Deprecation.warn(self, 'Calling `normalize_params` on the Blacklight::SearchState ' \
27
- 'class is deprecated and will be removed in Blacklight 8. Call #normalize_params on the ' \
28
- 'search state object.')
29
- params = untrusted_params
30
-
31
- if params.respond_to?(:to_unsafe_h)
32
- # This is the typical (not-ActionView::TestCase) code path.
33
- params = params.to_unsafe_h
34
- # In Rails 5 to_unsafe_h returns a HashWithIndifferentAccess, in Rails 4 it returns Hash
35
- params = params.with_indifferent_access if params.instance_of? Hash
36
- elsif params.is_a? Hash
37
- # This is an ActionView::TestCase workaround for Rails 4.2.
38
- params = params.dup.with_indifferent_access
39
- else
40
- params = params.dup.to_h.with_indifferent_access
41
- end
42
-
43
- # Normalize facet parameters mangled by facebook
44
- params[:f] = normalize_facet_params(params[:f]) if facet_params_need_normalization(params[:f])
45
- params[:f_inclusive] = normalize_facet_params(params[:f_inclusive]) if facet_params_need_normalization(params[:f_inclusive])
46
-
47
- params
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Blacklight::Facet do
4
- subject do
5
- Class.new do
6
- include Blacklight::Facet
7
- attr_reader :blacklight_config
8
-
9
- def initialize blacklight_config
10
- @blacklight_config = blacklight_config
11
- end
12
- end.new(blacklight_config)
13
- end
14
-
15
- let(:blacklight_config) { Blacklight::Configuration.new }
16
-
17
- describe "#facet_configuration_for_field" do
18
- it "looks up fields by key" do
19
- blacklight_config.add_facet_field 'a'
20
- expect(subject.facet_configuration_for_field('a')).to eq blacklight_config.facet_fields['a']
21
- end
22
-
23
- it "looks up fields by field name" do
24
- blacklight_config.add_facet_field 'a', field: 'b'
25
- expect(subject.facet_configuration_for_field('b')).to eq blacklight_config.facet_fields['a']
26
- end
27
-
28
- it "supports both strings and symbols" do
29
- blacklight_config.add_facet_field 'a', field: :b
30
- expect(subject.facet_configuration_for_field('b')).to eq blacklight_config.facet_fields['a']
31
- end
32
- end
33
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Blacklight::SearchFields do
4
- around { |test| Deprecation.silence(described_class) { test.call } }
5
-
6
- class MockConfig
7
- include Blacklight::SearchFields
8
- end
9
-
10
- before(:all) do
11
- @config = Blacklight::Configuration.new do |config|
12
- config.default_solr_params = { qt: 'search' }
13
-
14
- config.add_search_field 'all_fields', label: 'All Fields'
15
- config.add_search_field 'title', qt: 'title_search'
16
- config.add_search_field 'author', qt: 'author_search'
17
- config.add_search_field 'subject', qt: 'subject_search'
18
- config.add_search_field 'no_display', qt: 'something', include_in_simple_select: false
19
- end
20
- end
21
-
22
- before do
23
- @search_field_obj = MockConfig.new
24
- allow(@search_field_obj).to receive(:blacklight_config).and_return(@config)
25
- end
26
-
27
- it "returns search field list with calculated :label when needed" do
28
- @search_field_obj.search_field_list.each do |hash|
29
- expect(hash.label).not_to be_blank
30
- end
31
- end
32
-
33
- describe "for unspecified :key" do
34
- before do
35
- @bad_config = MockConfig.new
36
- end
37
-
38
- it "raises exception on #search_field_list" do
39
- expect do
40
- allow(@bad_config).to receive(:blacklight_config).and_return(Blacklight::Configuration.new do |config|
41
- config.add_search_field label: 'All Fields', qt: 'all_fields'
42
- config.add_search_field 'title', qt: 'title_search'
43
- end)
44
- end.to raise_error ArgumentError
45
- end
46
- end
47
-
48
- describe "for duplicate keys" do
49
- before do
50
- @bad_config = MockConfig.new
51
- end
52
-
53
- it "raises on #search_field_list" do
54
- expect do
55
- allow(@bad_config).to receive(:blacklight_config).and_return(Blacklight::Configuration.new do |config|
56
- config.add_search_field 'my_key', label: 'All Fields'
57
- config.add_search_field 'my_key', label: 'title'
58
- end)
59
- end.to raise_error RuntimeError
60
- end
61
- end
62
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe 'Sitelinks search box' do
4
- it 'is home page' do
5
- visit root_path
6
- expect(page).to have_css 'script[type="application/ld+json"]'
7
- end
8
-
9
- it 'on search page' do
10
- visit search_catalog_path q: 'book'
11
- expect(page).not_to have_css 'script[type="application/ld+json"]'
12
- end
13
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Blacklight::HashAsHiddenFieldsHelperBehavior do
4
- around { |test| Deprecation.silence(described_class) { test.call } }
5
-
6
- let(:params) do
7
- { q: "query",
8
- search_field: "search_field",
9
- per_page: 10,
10
- page: 5,
11
- extra_arbitrary_key: "arbitrary_value",
12
- f: { field1: %w[a b], field2: ["z"] } }
13
- end
14
- let(:generated) { helper.render_hash_as_hidden_fields(params) }
15
-
16
- it "converts a hash with nested complex data to Rails-style hidden form fields" do
17
- allow(Deprecation).to receive(:warn)
18
- expect(generated).to have_selector("input[type='hidden'][name='q'][value='query']", visible: false)
19
- expect(generated).to have_selector("input[type='hidden'][name='per_page'][value='10']", visible: false)
20
- expect(generated).to have_selector("input[type='hidden'][name='page'][value='5']", visible: false)
21
- expect(generated).to have_selector("input[type='hidden'][name='extra_arbitrary_key'][value='arbitrary_value']", visible: false)
22
- expect(generated).to have_selector("input[type='hidden'][name='f[field2][]'][value='z']", visible: false)
23
- expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='a']", visible: false)
24
- expect(generated).to have_selector("input[type='hidden'][name='f[field1][]'][value='b']", visible: false)
25
- end
26
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Blacklight::RenderConstraintsHelperBehavior do
4
- around { |test| Deprecation.silence(described_class) { test.call } }
5
-
6
- let(:config) do
7
- Blacklight::Configuration.new do |config|
8
- config.add_facet_field 'type'
9
- config.add_search_field 'title'
10
- end
11
- end
12
-
13
- before do
14
- # the helper methods below infer paths from the current route
15
- controller.request.path_parameters[:controller] = 'catalog'
16
- allow(helper).to receive(:search_action_path) do |*args|
17
- search_catalog_path *args
18
- end
19
-
20
- allow(helper).to receive(:blacklight_config).and_return(config)
21
- allow(controller).to receive(:search_state_class).and_return(Blacklight::SearchState)
22
- end
23
-
24
- describe '#render_constraints_query' do
25
- subject { helper.render_constraints_query(params) }
26
-
27
- let(:my_engine) { double("Engine") }
28
- let(:params) { ActionController::Parameters.new(q: 'foobar', f: { type: 'journal' }) }
29
-
30
- it "has a link relative to the current url" do
31
- expect(subject).to have_link 'Remove constraint', href: '/catalog?f%5Btype%5D%5B%5D=journal'
32
- end
33
- end
34
-
35
- describe '#render_constraints_clauses' do
36
- subject { helper.render_constraints_clauses(params) }
37
-
38
- let(:my_engine) { double("Engine") }
39
- let(:params) { ActionController::Parameters.new(clause: { "0": { field: 'title', query: 'nature' } }, f: { type: 'journal' }) }
40
-
41
- it 'renders the clause constraint' do
42
- expect(subject).to have_selector '.constraint-value', text: /Title\s+nature/
43
- end
44
-
45
- it "has a link relative to the current url" do
46
- expect(subject).to have_link 'Remove constraint Title: nature', href: '/catalog?f%5Btype%5D%5B%5D=journal'
47
- end
48
- end
49
-
50
- describe '#render_filter_element' do
51
- subject { helper.render_filter_element('type', ['journal'], path) }
52
-
53
- before do
54
- allow(helper).to receive(:blacklight_config).and_return(config)
55
- expect(helper).to receive(:facet_field_label).with('type').and_return("Item Type")
56
- end
57
-
58
- let(:params) { ActionController::Parameters.new q: 'biz' }
59
- let(:path) { Blacklight::SearchState.new(params, config, controller) }
60
-
61
- it "has a link relative to the current url" do
62
- expect(subject).to have_link "Remove constraint Item Type: journal", href: "/catalog?q=biz"
63
- expect(subject).to have_selector ".filter-name", text: 'Item Type'
64
- end
65
-
66
- context 'with string values' do
67
- subject { helper.render_filter_element('type', 'journal', path) }
68
-
69
- it "handles string values gracefully" do
70
- expect(subject).to have_link "Remove constraint Item Type: journal", href: "/catalog?q=biz"
71
- end
72
- end
73
-
74
- context 'with multivalued facets' do
75
- subject { helper.render_filter_element('type', [%w[journal book]], path) }
76
-
77
- it "handles such values gracefully" do
78
- expect(subject).to have_link "Remove constraint Item Type: journal OR book", href: "/catalog?q=biz"
79
- end
80
- end
81
- end
82
-
83
- describe "#render_constraints_filters" do
84
- subject { helper.render_constraints_filters(params) }
85
-
86
- let(:params) { ActionController::Parameters.new f: { 'type' => [''] } }
87
-
88
- it "renders nothing for empty facet limit param" do
89
- expect(subject).to be_blank
90
- end
91
- end
92
- end
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Blacklight::SearchHistoryConstraintsHelperBehavior do
4
- around { |test| Deprecation.silence(described_class) { test.call } }
5
-
6
- before(:all) do
7
- @config = Blacklight::Configuration.new do |config|
8
- config.add_search_field 'default_search_field', label: 'Default'
9
-
10
- config.add_facet_field 'some_facet', label: 'Some'
11
- config.add_facet_field 'other_facet', label: 'Other'
12
- config.add_facet_field 'i18n_facet'
13
-
14
- I18n.backend.store_translations(:en, blacklight: { search: { fields: { facet: { i18n_facet: 'English facet label' } } } })
15
- I18n.backend.store_translations(:de, blacklight: { search: { fields: { facet: { i18n_facet: 'German facet label' } } } })
16
- end
17
- end
18
-
19
- before do
20
- allow(helper).to receive(:blacklight_config).and_return(@config)
21
- end
22
-
23
- describe "render_search_to_s_*" do
24
- describe "render_search_to_s_element" do
25
- it "renders basic element" do
26
- response = helper.render_search_to_s_element("key", "value")
27
- expect(response).to have_selector("span.constraint") do |span|
28
- expect(span).to have_selector("span.filter-name", content: "key:")
29
- expect(span).to have_selector("span.filter-value", content: "value")
30
- end
31
- expect(response).to be_html_safe
32
- end
33
-
34
- it "escapes them that need escaping" do
35
- response = helper.render_search_to_s_element("key>", "value>")
36
- expect(response).to have_selector("span.constraint") do |span|
37
- expect(span).to have_selector("span.filter-name") do |s2|
38
- # Note: nokogiri's gettext will unescape the inner html
39
- # which seems to be what rspecs "contains" method calls on
40
- # text nodes - thus the to_s inserted below.
41
- expect(s2).to match(/key&gt;:/)
42
- end
43
- expect(span).to have_selector("span.filter-value") do |s3|
44
- expect(s3).to match(/value&gt;/)
45
- end
46
- end
47
- expect(response).to be_html_safe
48
- end
49
-
50
- it "does not escape with options set thus" do
51
- response = helper.render_search_to_s_element("key>", "value>", escape_key: false, escape_value: false)
52
- expect(response).to have_selector("span.constraint") do |span|
53
- expect(span).to have_selector("span.filter-name", content: "key>:")
54
- expect(span).to have_selector("span.filter-value", content: "value>")
55
- end
56
- expect(response).to be_html_safe
57
- end
58
- end
59
-
60
- describe "render_search_to_s" do
61
- before do
62
- @params = { q: "history", f: { "some_facet" => %w[value1 value1], "other_facet" => ["other1"] } }
63
- end
64
-
65
- it "calls lesser methods" do
66
- allow(helper).to receive(:blacklight_config).and_return(@config)
67
- allow(helper).to receive(:default_search_field).and_return(Blacklight::Configuration::SearchField.new(key: 'default_search_field', display_label: 'Default'))
68
- allow(helper).to receive(:label_for_search_field).with(nil).and_return('')
69
- # API hooks expect this to be so
70
- response = helper.render_search_to_s(@params)
71
-
72
- expect(response).to include(helper.render_search_to_s_q(@params))
73
- expect(response).to include(helper.render_search_to_s_filters(@params))
74
- expect(response).to be_html_safe
75
- end
76
- end
77
-
78
- describe "render_search_to_s_filters" do
79
- it "renders a constraint for a selected facet in the config" do
80
- response = helper.render_search_to_s_filters(f: { "some_facet" => %w[value1 value2] })
81
- expect(response).to eq("<span class=\"constraint\"><span class=\"filter-name\">Some:</span><span class=\"filter-values\"><span class=\"filter-value\">value1</span><span class=\"filter-separator\"> and </span><span class=\"filter-value\">value2</span></span></span>")
82
- end
83
-
84
- it "renders a constraint for a selected facet not in the config" do
85
- response = helper.render_search_to_s_filters(f: { "undefined_facet" => %w[value1 value2] })
86
- expect(response).to eq("<span class=\"constraint\"><span class=\"filter-name\">#{'undefined_facet'.titleize}:</span><span class=\"filter-values\"><span class=\"filter-value\">value1</span><span class=\"filter-separator\"> and </span><span class=\"filter-value\">value2</span></span></span>")
87
- end
88
-
89
- context 'with I18n translations for selected facet' do
90
- before do
91
- @orig_locale = I18n.locale
92
- end
93
-
94
- after do
95
- I18n.locale = @orig_locale
96
- end
97
-
98
- it 'renders the correct I18n label for a selected facet with I18n translations' do
99
- { en: 'English facet label', de: 'German facet label' }.each do |locale, label|
100
- I18n.locale = locale
101
- response = helper.render_search_to_s_filters(f: { 'i18n_facet' => %w[value1 value2] })
102
- expect(response).to include(label)
103
- end
104
- end
105
- end
106
- end
107
- end
108
- end