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
@@ -21,6 +21,7 @@ module Blacklight::Document
21
21
  include Blacklight::Document::SemanticFields
22
22
  include Blacklight::Document::CacheKey
23
23
  include Blacklight::Document::Export
24
+ include Blacklight::Document::Attributes
24
25
 
25
26
  included do
26
27
  extend ActiveModel::Naming
@@ -30,6 +31,17 @@ module Blacklight::Document
30
31
  class_attribute :inspector_fields, default: [:_source]
31
32
  end
32
33
 
34
+ Email = Module.new do
35
+ def self.included(mod)
36
+ Blacklight.deprecation.warn("Blacklight::Document::Email is deprecated and will be removed (included in #{mod}).")
37
+ end
38
+ end
39
+ Sms = Module.new do
40
+ def self.included(mod)
41
+ Blacklight.deprecation.warn("Blacklight::Document::Sms is deprecated and will be removed (included in #{mod}).")
42
+ end
43
+ end
44
+
33
45
  attr_reader :response, :_source
34
46
  alias_method :solr_response, :response
35
47
 
@@ -70,13 +82,20 @@ module Blacklight::Document
70
82
  alias has_field? has?
71
83
  alias has_key? key?
72
84
 
73
- def fetch key, *default
85
+ NO_DEFAULT_PROVIDED = Object.new # :nodoc:
86
+ def fetch key, default = NO_DEFAULT_PROVIDED
74
87
  if key? key
75
88
  self[key]
76
- elsif default.empty? && !block_given?
77
- raise KeyError, "key not found \"#{key}\""
89
+ elsif block_given?
90
+ yield(self) if block_given?
91
+ elsif default != NO_DEFAULT_PROVIDED
92
+ if default.respond_to?(:call)
93
+ default.call(self)
94
+ else
95
+ default
96
+ end
78
97
  else
79
- (yield(self) if block_given?) || default.first
98
+ raise KeyError, "key not found \"#{key}\""
80
99
  end
81
100
  end
82
101
 
@@ -116,21 +135,5 @@ module Blacklight::Document
116
135
  def unique_key
117
136
  @unique_key ||= 'id'
118
137
  end
119
-
120
- # Define an attribute reader on a document model
121
- # @example
122
- # class SolrDocument
123
- # include Blacklight::Solr::Document
124
- # attribute :title, Blacklight::Types::String, 'title_tesim'
125
- # end
126
- #
127
- # doc = SolrDocument.new(title_tesim: ["One flew over the cuckoo's nest"])
128
- # doc.title
129
- # #=> "One flew over the cuckoo's nest"
130
- def attribute(name, type, field)
131
- define_method name do
132
- type.coerce(self[field])
133
- end
134
- end
135
138
  end
136
139
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  module Suggest
4
5
  class Response
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::User
3
- # This gives us an is_blacklight_user method that can be included in
4
- # the containing applications models.
5
- # SEE ALSO: The /lib/blacklight/engine.rb class for how when this
6
- # is injected into the hosting application through ActiveRecord::Base extend
7
- def self.included(base)
8
- return unless base.respond_to? :has_many
4
+ extend ActiveSupport::Concern
5
+ # SEE ALSO: The lib/blacklight/generator/user_generator.rb class for where this
6
+ # is generated into the hosting application.
7
+ included do
8
+ class_attribute :string_display_key
9
9
 
10
- base.send :has_many, :bookmarks, dependent: :destroy, as: :user
11
- base.send :has_many, :searches, dependent: :destroy, as: :user
10
+ has_many :bookmarks, dependent: :destroy, as: :user
11
+ has_many :searches, dependent: :destroy, as: :user
12
12
  end
13
13
 
14
14
  def bookmarks_for_documents documents = []
@@ -28,4 +28,13 @@ module Blacklight::User
28
28
  def existing_bookmark_for(document)
29
29
  bookmarks_for_documents([document]).first
30
30
  end
31
+
32
+ ##
33
+ # @return [String] a user-displayable login/identifier for the user account
34
+ def to_s
35
+ string_display_key = self.class.string_display_key
36
+ return send(string_display_key) if respond_to?(string_display_key)
37
+
38
+ super
39
+ end
31
40
  end
@@ -1,28 +1,23 @@
1
1
  # frozen_string_literal: true
2
- # Only works for documents with a #to_marc right now.
3
- class RecordMailer < ActionMailer::Base
4
- def email_record(documents, details, url_gen_params)
5
- title = begin
6
- title_field = details[:config].email.title_field
7
- if title_field
8
- [documents.first[title_field]].flatten.first
9
- else
10
- documents.first.to_semantic_values[:title]
11
- end
12
- rescue
13
- I18n.t('blacklight.email.text.default_title')
14
- end
15
2
 
16
- subject = I18n.t('blacklight.email.text.subject',
17
- count: documents.length,
18
- title: Array(title).first)
3
+ # Only works for documents with a #to_marc right now.
4
+ class RecordMailer < ApplicationMailer
5
+ helper CatalogHelper
6
+ helper_method :blacklight_config, :blacklight_configuration_context
19
7
 
8
+ def email_record(documents, details, url_gen_params)
20
9
  @documents = documents
21
10
  @message = details[:message]
22
11
  @config = details[:config]
23
12
  @url_gen_params = url_gen_params
24
13
 
25
- mail(to: details[:to], subject: subject)
14
+ title = view_context.document_presenter(documents.first).html_title || I18n.t('blacklight.email.text.default_title')
15
+
16
+ subject = I18n.t('blacklight.email.text.subject',
17
+ count: documents.length,
18
+ title: Array(title).first)
19
+
20
+ mail(to: details[:to], subject: subject)
26
21
  end
27
22
 
28
23
  def sms_record(documents, details, url_gen_params)
@@ -30,6 +25,16 @@ class RecordMailer < ActionMailer::Base
30
25
  @config = details[:config]
31
26
  @url_gen_params = url_gen_params
32
27
 
33
- mail(to: details[:to], subject: "")
28
+ mail(to: details[:to], subject: "") # rubocop:disable Rails/I18nLocaleTexts
29
+ end
30
+
31
+ def blacklight_config
32
+ @config || Blacklight.default_configuration
33
+ end
34
+
35
+ ##
36
+ # Context in which to evaluate blacklight configuration conditionals
37
+ def blacklight_configuration_context
38
+ @blacklight_configuration_context ||= Blacklight::Configuration::Context.new(self)
34
39
  end
35
40
  end
data/app/models/search.rb CHANGED
@@ -3,7 +3,6 @@
3
3
  class Search < ApplicationRecord
4
4
  belongs_to :user, optional: true
5
5
 
6
- # use a backwards-compatible serializer until the Rails API stabilizes and we can evaluate for major-revision compatibility
7
6
  serialize :query_params, Blacklight::SearchParamsYamlCoder
8
7
 
9
8
  # A Search instance is considered a saved search if it has a user_id.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  class SolrDocument
3
4
  include Blacklight::Solr::Document
4
5
  end
@@ -29,7 +29,7 @@ module Blacklight
29
29
  end
30
30
 
31
31
  def remove_href(path = search_state)
32
- view_context.search_action_path(path.reset_search(clause: path.clause_params.except(key)).to_h)
32
+ view_context.search_action_path(path.reset_search(clause: path.clause_params.except(key)))
33
33
  end
34
34
 
35
35
  private
@@ -11,18 +11,20 @@ module Blacklight
11
11
  # @param [SolrDocument] document
12
12
  # @param [ActionView::Base] view_context scope for linking and generating urls
13
13
  # @param [Blacklight::Configuration] configuration
14
- def initialize(document, view_context, configuration = view_context.blacklight_config)
14
+ def initialize(document, view_context, configuration = view_context.blacklight_config, view_config: nil, field_presenter_options: {})
15
15
  @document = document
16
16
  @view_context = view_context
17
17
  @configuration = configuration
18
+ @view_config = view_config
19
+ @field_presenter_options = field_presenter_options
18
20
  end
19
21
 
20
22
  # @return [Hash<String,Configuration::Field>] all the fields for this index view that should be rendered
21
- def fields_to_render
22
- return to_enum(:fields_to_render) unless block_given?
23
+ def fields_to_render(document_fields = fields, **kwargs)
24
+ return to_enum(:fields_to_render, document_fields, **kwargs) unless block_given?
23
25
 
24
- fields.each do |name, field_config|
25
- field_presenter = field_presenter(field_config)
26
+ document_fields.each do |name, field_config|
27
+ field_presenter = field_presenter(field_config, kwargs)
26
28
 
27
29
  next unless field_presenter.render_field? && field_presenter.any?
28
30
 
@@ -30,10 +32,10 @@ module Blacklight
30
32
  end
31
33
  end
32
34
 
33
- def field_presenters
34
- return to_enum(:field_presenters) unless block_given?
35
+ def field_presenters(document_fields = fields, **kwargs)
36
+ return to_enum(:field_presenters, document_fields, **kwargs) unless block_given?
35
37
 
36
- fields_to_render.each { |_, _, config| yield config }
38
+ fields_to_render(document_fields, **kwargs).each { |_, _, config| yield config }
37
39
  end
38
40
 
39
41
  ##
@@ -79,10 +81,8 @@ module Blacklight
79
81
 
80
82
  fields += ['format'] if fields.empty? # backwards compatibility with the old default value for display_type_field
81
83
 
82
- display_type = fields.lazy.map { |field| field_presenter(field_config(field)) }.detect(&:any?)&.values
83
- display_type ||= Array(default) if default
84
-
85
- display_type || []
84
+ display_type = fields.lazy.map { |field| field_presenter(display_fields[field] || Configuration::NullDisplayField.new(field)) }.detect(&:any?)&.values
85
+ display_type || Array(default)
86
86
  end
87
87
 
88
88
  ##
@@ -122,7 +122,7 @@ module Blacklight
122
122
  end
123
123
 
124
124
  def show_view_config
125
- configuration.view_config(:show)
125
+ configuration.view_config(:show, action_name: view_context.action_name)
126
126
  end
127
127
 
128
128
  def inspect
@@ -132,33 +132,27 @@ module Blacklight
132
132
 
133
133
  private
134
134
 
135
- def render_field?(field_config)
136
- field_presenter(field_config).render_field?
137
- end
138
- deprecation_deprecate render_field?: 'Use FieldPresenter#render_field?'
139
-
140
- def has_value?(field_config)
141
- field_presenter(field_config).any?
135
+ # @return [Hash<String,Configuration::Field>]
136
+ def fields
137
+ @fields ||= Array(display_type).inject(display_fields) do |fields, display_type|
138
+ fields.merge(display_fields(configuration.for_display_type(display_type)))
139
+ end
142
140
  end
143
- deprecation_deprecate has_value?: 'Use FieldPresenter#any?'
144
141
 
145
- def field_values(field_config, options = {})
146
- field_value(field_config, options)
142
+ def display_fields(config = configuration)
143
+ config[view_config.document_fields_key || :index_fields]
147
144
  end
148
- deprecation_deprecate field_values: 'Use #field_value'
149
145
 
150
- def retrieve_values(field_config)
151
- field_presenter(field_config).values
146
+ def field_config(field)
147
+ fields.fetch(field) { Configuration::NullDisplayField.new(field) }
152
148
  end
153
- deprecation_deprecate retrieve_values: 'Use FieldPresenter#values'
154
149
 
155
150
  def field_presenter(field_config, options = {})
156
- presenter_class = field_config.presenter || Blacklight::FieldPresenter
157
- presenter_class.new(view_context, document, field_config, options.merge(field_presenter_options))
151
+ field_config.presenter.new(view_context, document, field_config, field_presenter_options.merge(options))
158
152
  end
159
153
 
160
154
  def field_presenter_options
161
- {}
155
+ @field_presenter_options ||= {}
162
156
  end
163
157
  end
164
158
  end
@@ -15,15 +15,11 @@ module Blacklight
15
15
  end
16
16
 
17
17
  def collapsed?
18
- Deprecation.silence(Blacklight::FacetsHelperBehavior) do
19
- view_context.should_collapse_facet?(facet_field)
20
- end
18
+ !active? && facet_field.collapse
21
19
  end
22
20
 
23
21
  def active?
24
- Deprecation.silence(Blacklight::FacetsHelperBehavior) do
25
- view_context.facet_field_in_params?(key)
26
- end
22
+ search_state.filter(facet_field).any?
27
23
  end
28
24
 
29
25
  def in_modal?
@@ -44,20 +40,49 @@ module Blacklight
44
40
  search_state&.filter(facet_field)&.values || []
45
41
  end
46
42
 
47
- # @private
48
- # @deprecated
49
- def html_id
50
- Deprecation.silence(Blacklight::FacetsHelperBehavior) do
51
- view_context.facet_field_id(facet_field)
52
- end
43
+ # Appease rubocop rules by implementing #each_value
44
+ def each_value(&block)
45
+ values.each(&block)
53
46
  end
54
47
 
55
48
  def paginator
56
49
  return unless display_facet
57
50
 
58
- Deprecation.silence(Blacklight::Facet) do
59
- @paginator ||= view_context.facet_paginator(facet_field, display_facet)
51
+ @paginator ||= blacklight_config.facet_paginator_class.new(
52
+ display_facet.items,
53
+ sort: display_facet.sort,
54
+ offset: display_facet.offset,
55
+ prefix: display_facet.prefix,
56
+ limit: facet_limit
57
+ )
58
+ end
59
+
60
+ DEFAULT_FACET_LIMIT = 10
61
+
62
+ # Look up facet limit for given facet_field. Will look at config, and
63
+ # if config is 'true' will look up from Solr @response if available. If
64
+ # no limit is available, returns nil. Used from #add_facetting_to_solr
65
+ # to supply f.fieldname.facet.limit values in solr request (no @response
66
+ # available), and used in display (with @response available) to create
67
+ # a facet paginator with the right limit.
68
+ def facet_limit
69
+ return unless facet_field.limit
70
+
71
+ if @display_facet
72
+ limit = @display_facet.limit
73
+
74
+ if limit.nil? # we didn't get or a set a limit, so infer one.
75
+ facet_field.limit if facet_field.limit != true
76
+ elsif limit == -1 # limit -1 is solr-speak for unlimited
77
+ nil
78
+ else
79
+ limit.to_i - 1 # we added 1 to find out if we needed to paginate
80
+ end
81
+ else
82
+ facet_field.limit == true ? DEFAULT_FACET_LIMIT : facet.limit
60
83
  end
61
84
  end
85
+
86
+ delegate :blacklight_config, to: :search_state
62
87
  end
63
88
  end
@@ -7,12 +7,8 @@ module Blacklight
7
7
  delegate :key, to: :facet_config
8
8
 
9
9
  def initialize(group, facet_item, facet_config, view_context, facet_field, search_state = view_context.search_state)
10
+ super(facet_item, facet_config, view_context, facet_field, search_state)
10
11
  @group = group
11
- @facet_item = facet_item
12
- @facet_config = facet_config
13
- @view_context = view_context
14
- @facet_field = facet_field
15
- @search_state = search_state
16
12
  end
17
13
 
18
14
  ##
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ class FacetItemPivotPresenter < FacetItemPresenter
5
+ ##
6
+ # Check if the query parameters have the given facet field with the
7
+ # given value.
8
+ def selected?
9
+ search_state.filter(facet_config).include?(facet_item)
10
+ end
11
+
12
+ def shown?
13
+ selected? || facet_item_presenters.any? { |x| x.try(:shown?) }
14
+ end
15
+
16
+ def field_label
17
+ facet_field_presenter.label
18
+ end
19
+
20
+ def facet_item_presenters
21
+ return to_enum(:facet_item_presenters) unless block_given?
22
+ return [] unless items
23
+
24
+ items.each { |i| yield facet_item_presenter(i) }
25
+ end
26
+
27
+ def facet_item_presenter(facet_item)
28
+ facet_config.item_presenter.new(facet_item, facet_config, view_context, facet_field, search_state)
29
+ end
30
+
31
+ ##
32
+ # Get the displayable version of a facet's value
33
+ #
34
+ # @return [String]
35
+ def label
36
+ label_source = facet_item.respond_to?(:label) ? facet_item.label : facet_item
37
+ if facet_config.helper_method
38
+ view_context.public_send(facet_config.helper_method, label_source)
39
+ else
40
+ item_fq = label_source.respond_to?(:fq) ? label_source.fq : {}
41
+ item_fq = item_fq.symbolize_keys
42
+ label_value = facet_config.pivot.map(&:to_sym).map { |k| item_fq[k] }
43
+ if label_source.respond_to?(:field)
44
+ label_value << value
45
+ else
46
+ label_value.unshift value
47
+ end
48
+ label_value.compact.join(" » ")
49
+ end
50
+ end
51
+
52
+ def value
53
+ if facet_item.respond_to? :value
54
+ facet_item.value
55
+ else
56
+ facet_item
57
+ end
58
+ end
59
+ end
60
+ end
@@ -30,9 +30,7 @@ module Blacklight
30
30
  # Check if the query parameters have the given facet field with the
31
31
  # given value.
32
32
  def selected?
33
- Deprecation.silence(Blacklight::SearchState) do
34
- search_state.has_facet? facet_config, value: value
35
- end
33
+ search_state.filter(facet_config).include?(value)
36
34
  end
37
35
 
38
36
  def field_label
@@ -44,8 +42,6 @@ module Blacklight
44
42
  #
45
43
  # @return [String]
46
44
  def label
47
- return @view_context.facet_display_value(@facet_field, @facet_item) unless @view_context.method(:facet_display_value).owner == Blacklight::FacetsHelperBehavior
48
-
49
45
  label_value = if facet_item.respond_to? :label
50
46
  facet_item.label
51
47
  else
@@ -62,7 +58,7 @@ module Blacklight
62
58
  localization_options = facet_config.date == true ? {} : facet_config.date
63
59
  I18n.l(Time.zone.parse(label_value), **localization_options)
64
60
  else
65
- label_value
61
+ label_value.to_s
66
62
  end
67
63
  end
68
64
 
@@ -92,9 +88,7 @@ module Blacklight
92
88
 
93
89
  # @private
94
90
  def remove_href(path = search_state)
95
- Deprecation.silence(Blacklight::SearchState) do
96
- view_context.search_action_path(path.remove_facet_params(facet_config.key, facet_item))
97
- end
91
+ view_context.search_action_path(path.filter(facet_config.key).remove(facet_item))
98
92
  end
99
93
 
100
94
  # @private
@@ -30,6 +30,7 @@ module Blacklight
30
30
  end
31
31
 
32
32
  attr_reader :view_context, :document, :field_config, :except_operations, :options
33
+
33
34
  delegate :key, :component, to: :field_config
34
35
 
35
36
  # @return [String]
@@ -1,47 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  class IndexPresenter < DocumentPresenter
4
- ##
5
- # Render the document index heading. This is used when making a link to a
6
- # document, where we don't want any HTML markup added from the pipeline.
7
- #
8
- # @param [Symbol, Proc, String] field_or_string_or_proc Render the given field or evaluate the proc or render the given string
9
- # @param [Hash] opts
10
- def label(field_or_string_or_proc, opts = {})
11
- config = Configuration::NullField.new
12
- value = case field_or_string_or_proc
13
- when Symbol
14
- config = field_config(field_or_string_or_proc)
15
- field_presenter(config).values
16
- when Proc
17
- Deprecation.warn(self, "calling IndexPresenter.label with a Proc is deprecated. " \
18
- "First argument must be a symbol. This will be removed in Blacklight 8")
19
- field_or_string_or_proc.call(document, opts)
20
- when String
21
- Deprecation.warn(self, "calling IndexPresenter.label with a String is deprecated. " \
22
- "First argument must be a symbol. This will be removed in Blacklight 8")
23
- field_or_string_or_proc
24
- end
25
-
26
- value = document.id if value.blank?
27
- field_value(config, values: Array.wrap(value), except_operations: [Rendering::HelperMethod])
28
- end
29
-
30
- deprecation_deprecate label: 'Use #heading'
31
-
32
5
  def view_config
33
- @view_config ||= configuration.view_config(view_context.document_index_view_type)
34
- end
35
-
36
- private
37
-
38
- # @return [Hash<String,Configuration::Field>] all the fields for this index view
39
- def fields
40
- configuration.index_fields_for(display_type)
41
- end
42
-
43
- def field_config(field)
44
- configuration.index_fields.fetch(field) { Configuration::NullField.new(field) }
6
+ @view_config ||= configuration.view_config(view_context.document_index_view_type, action_name: view_context.action_name)
45
7
  end
46
8
  end
47
9
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  class JsonPresenter
4
- include Blacklight::Facet
5
-
6
5
  # @param [Solr::Response] response raw solr response.
7
6
  # @param [Configuration] blacklight_config the configuration
8
7
  def initialize(response, blacklight_config)
@@ -12,15 +11,18 @@ module Blacklight
12
11
 
13
12
  attr_reader :blacklight_config
14
13
 
14
+ delegate :facet_field_names, :facet_configuration_for_field, to: :blacklight_config
15
+
15
16
  def documents
16
17
  @response.documents
17
18
  end
18
19
 
19
20
  # @return [Array<Blacklight::Solr::Response::Facets::FacetField>]
20
21
  def search_facets
21
- Deprecation.silence(Blacklight::Facet) do
22
- facets_from_request(facet_field_names, @response).select { |display_facet| display_facet.items.present? }
23
- end
22
+ facet_field_names
23
+ .map { |field| @response.aggregations[facet_configuration_for_field(field).field] }
24
+ .compact
25
+ .select { |display_facet| display_facet.items.present? }
24
26
  end
25
27
 
26
28
  # extract the pagination info from the response object
@@ -20,6 +20,10 @@ module Blacklight
20
20
  first, *rest = *stack
21
21
  first.new(output_values, config, document, context, options, rest).render
22
22
  end
23
+
24
+ def html?
25
+ options[:format].nil? || options[:format].to_s == 'html'
26
+ end
23
27
  end
24
28
  end
25
29
  end
@@ -5,7 +5,13 @@ module Blacklight
5
5
  class Join < AbstractStep
6
6
  def render
7
7
  options = config.separator_options || {}
8
- next_step(values.map { |x| html_escape(x) }.to_sentence(options).html_safe)
8
+ if values.one? || values.none?
9
+ next_step(values.first)
10
+ elsif !html?
11
+ next_step(values.to_sentence(options))
12
+ else
13
+ next_step(values.map { |x| x.html_safe? ? x : html_escape(x) }.to_sentence(options).html_safe)
14
+ end
9
15
  end
10
16
 
11
17
  private
@@ -3,9 +3,8 @@
3
3
  module Blacklight
4
4
  module Rendering
5
5
  class LinkToFacet < AbstractStep
6
- extend Deprecation
7
6
  def render
8
- return next_step(values) unless config.link_to_facet
7
+ return next_step(values) unless config.link_to_facet && html?
9
8
 
10
9
  next_step(render_link)
11
10
  end
@@ -31,10 +30,8 @@ module Blacklight
31
30
  context.search_action_path(facet_params(field, v))
32
31
  end
33
32
 
34
- def facet_params(field, v)
35
- Deprecation.silence(Blacklight::SearchState) do
36
- context.search_state.reset.add_facet_params(field, v)
37
- end
33
+ def facet_params(field, item)
34
+ context.search_state.reset.filter(field).add(item).params
38
35
  end
39
36
  end
40
37
  end
@@ -5,7 +5,7 @@ module Blacklight
5
5
  class Microdata < AbstractStep
6
6
  include ActionView::Helpers::TagHelper
7
7
  def render
8
- return next_step(values) unless config.itemprop
8
+ return next_step(values) unless config.itemprop && html?
9
9
 
10
10
  next_step(values.map { |x| itemprop(x, config.itemprop) })
11
11
  end
@@ -1,17 +1,9 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  class ShowPresenter < DocumentPresenter
4
5
  private
5
6
 
6
- # @return [Hash<String,Configuration::Field>]
7
- def fields
8
- configuration.show_fields_for(display_type)
9
- end
10
-
11
- def field_config(field)
12
- configuration.show_fields.fetch(field) { Configuration::NullField.new(field) }
13
- end
14
-
15
7
  def field_presenter_options
16
8
  { context: 'show' }
17
9
  end