blacklight 7.41.0 → 8.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. checksums.yaml +4 -4
  2. data/.env +2 -3
  3. data/.github/workflows/ruby.yml +81 -0
  4. data/.rubocop.yml +243 -14
  5. data/.rubocop_todo.yml +137 -429
  6. data/Gemfile +11 -6
  7. data/README.md +11 -3
  8. data/VERSION +1 -1
  9. data/app/assets/javascripts/blacklight/blacklight.esm.js +384 -0
  10. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  11. data/app/assets/javascripts/blacklight/blacklight.js +374 -493
  12. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  13. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  14. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  15. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  16. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  17. data/app/assets/stylesheets/blacklight/_constraints.scss +4 -4
  18. data/app/assets/stylesheets/blacklight/_facets.scss +72 -44
  19. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  20. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  21. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  22. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  23. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  24. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  25. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  26. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  27. data/app/builders/blacklight/action_builder.rb +18 -9
  28. data/app/components/blacklight/advanced_search_form_component.html.erb +3 -3
  29. data/app/components/blacklight/advanced_search_form_component.rb +8 -10
  30. data/app/components/blacklight/constraints_component.rb +27 -37
  31. data/app/components/blacklight/document/action_component.rb +12 -10
  32. data/app/components/blacklight/document/actions_component.rb +2 -2
  33. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  34. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  35. data/app/components/blacklight/document/citation_component.rb +5 -3
  36. data/app/components/blacklight/document/group_component.rb +7 -3
  37. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  38. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  39. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  40. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  41. data/app/components/blacklight/document_component.html.erb +1 -1
  42. data/app/components/blacklight/document_component.rb +16 -78
  43. data/app/components/blacklight/document_metadata_component.html.erb +2 -4
  44. data/app/components/blacklight/document_metadata_component.rb +5 -10
  45. data/app/components/blacklight/facet_component.rb +3 -3
  46. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +4 -4
  47. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  48. data/app/components/blacklight/facet_field_component.html.erb +4 -5
  49. data/app/components/blacklight/facet_field_component.rb +9 -2
  50. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  51. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  52. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  53. data/app/components/blacklight/facet_item_component.rb +1 -43
  54. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  55. data/app/components/blacklight/header_component.rb +1 -1
  56. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  57. data/app/components/blacklight/icons/icon_component.rb +4 -9
  58. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  59. data/app/components/blacklight/icons/list_component.rb +16 -0
  60. data/app/components/blacklight/icons/search_component.rb +16 -0
  61. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  62. data/app/components/blacklight/metadata_field_component.rb +24 -8
  63. data/app/components/blacklight/metadata_field_layout_component.rb +4 -25
  64. data/app/components/blacklight/response/facet_group_component.html.erb +3 -5
  65. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  66. data/app/components/blacklight/response/pagination_component.html.erb +1 -1
  67. data/app/components/blacklight/response/pagination_component.rb +2 -11
  68. data/app/components/blacklight/response/sort_component.html.erb +6 -1
  69. data/app/components/blacklight/response/sort_component.rb +1 -16
  70. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  71. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  72. data/app/components/blacklight/response/view_type_component.rb +4 -6
  73. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  74. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  75. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  76. data/app/components/blacklight/search_bar_component.rb +2 -16
  77. data/app/components/blacklight/search_button_component.rb +3 -3
  78. data/app/components/blacklight/search_context_component.rb +43 -10
  79. data/app/components/blacklight/search_header_component.html.erb +2 -0
  80. data/app/components/blacklight/search_header_component.rb +6 -0
  81. data/app/components/blacklight/start_over_button_component.rb +5 -3
  82. data/app/components/blacklight/system/dropdown_component.rb +8 -5
  83. data/app/components/blacklight/system/flash_message_component.html.erb +4 -2
  84. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  85. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  86. data/app/components/blacklight/system/modal_component.rb +1 -3
  87. data/app/components/blacklight/top_navbar_component.html.erb +1 -1
  88. data/app/components/blacklight/top_navbar_component.rb +0 -4
  89. data/app/controllers/bookmarks_controller.rb +1 -0
  90. data/app/controllers/catalog_controller.rb +1 -0
  91. data/app/controllers/concerns/blacklight/bookmarks.rb +10 -9
  92. data/app/controllers/concerns/blacklight/catalog.rb +21 -83
  93. data/app/controllers/concerns/blacklight/controller.rb +3 -41
  94. data/app/controllers/concerns/blacklight/search_context.rb +25 -7
  95. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  96. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  97. data/app/controllers/concerns/blacklight/token_based_user.rb +13 -1
  98. data/app/controllers/search_history_controller.rb +1 -0
  99. data/app/helpers/blacklight/blacklight_helper_behavior.rb +12 -310
  100. data/app/helpers/blacklight/catalog_helper_behavior.rb +22 -139
  101. data/app/helpers/blacklight/component_helper_behavior.rb +2 -53
  102. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -119
  103. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  104. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -7
  105. data/app/helpers/blacklight/layout_helper_behavior.rb +4 -3
  106. data/app/helpers/blacklight/render_partials_helper_behavior.rb +11 -31
  107. data/app/helpers/blacklight/url_helper_behavior.rb +12 -97
  108. data/app/helpers/blacklight_helper.rb +1 -0
  109. data/app/helpers/catalog_helper.rb +1 -0
  110. data/app/javascript/blacklight/bookmark_toggle.js +13 -19
  111. data/app/javascript/blacklight/button_focus.js +12 -10
  112. data/app/javascript/blacklight/checkbox_submit.js +68 -123
  113. data/app/javascript/blacklight/core.js +5 -7
  114. data/app/javascript/blacklight/index.js +13 -0
  115. data/app/javascript/blacklight/modal.js +99 -164
  116. data/app/javascript/blacklight/modalForm.js +60 -0
  117. data/app/javascript/blacklight/search_context.js +46 -54
  118. data/app/models/blacklight/facet_paginator.rb +3 -2
  119. data/app/models/blacklight/icon.rb +4 -2
  120. data/app/models/bookmark.rb +0 -2
  121. data/app/models/concerns/blacklight/configurable.rb +5 -4
  122. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -10
  123. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  124. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  125. data/app/models/concerns/blacklight/document/email.rb +1 -0
  126. data/app/models/concerns/blacklight/document/export.rb +2 -1
  127. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  128. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  129. data/app/models/concerns/blacklight/document/semantic_fields.rb +2 -1
  130. data/app/models/concerns/blacklight/document/sms.rb +1 -0
  131. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  132. data/app/models/concerns/blacklight/user.rb +17 -8
  133. data/app/models/record_mailer.rb +13 -12
  134. data/app/models/search.rb +1 -7
  135. data/app/models/solr_document.rb +1 -0
  136. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  137. data/app/presenters/blacklight/document_presenter.rb +23 -50
  138. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  139. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  140. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  141. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  142. data/app/presenters/blacklight/field_presenter.rb +1 -0
  143. data/app/presenters/blacklight/index_presenter.rb +2 -40
  144. data/app/presenters/blacklight/json_presenter.rb +10 -6
  145. data/app/presenters/blacklight/rendering/link_to_facet.rb +2 -5
  146. data/app/presenters/blacklight/show_presenter.rb +1 -9
  147. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  148. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  149. data/app/services/blacklight/field_retriever.rb +12 -21
  150. data/app/services/blacklight/search_service.rb +10 -17
  151. data/app/values/blacklight/types.rb +0 -18
  152. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  153. data/app/views/bookmarks/_tools.html.erb +7 -12
  154. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  155. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  156. data/app/views/catalog/_citation.html.erb +1 -1
  157. data/app/views/catalog/_constraints.html.erb +1 -14
  158. data/app/views/catalog/_document.atom.builder +12 -14
  159. data/app/views/catalog/_document.html.erb +5 -3
  160. data/app/views/catalog/_document.rss.builder +2 -4
  161. data/app/views/catalog/_facet_layout.html.erb +2 -2
  162. data/app/views/catalog/_facets.html.erb +5 -4
  163. data/app/views/catalog/_home_text.html.erb +2 -14
  164. data/app/views/catalog/_per_page_widget.html.erb +10 -1
  165. data/app/views/catalog/_search_form.html.erb +2 -2
  166. data/app/views/catalog/_search_header.html.erb +1 -2
  167. data/app/views/catalog/_search_results.html.erb +2 -2
  168. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  169. data/app/views/catalog/_show_main_content.html.erb +11 -16
  170. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  171. data/app/views/catalog/_show_tools.html.erb +8 -14
  172. data/app/views/catalog/_view_type_group.html.erb +1 -1
  173. data/app/views/catalog/email.html.erb +2 -2
  174. data/app/views/catalog/email_success.html.erb +5 -6
  175. data/app/views/catalog/facet.html.erb +7 -5
  176. data/app/views/catalog/index.atom.builder +12 -14
  177. data/app/views/catalog/index.html.erb +4 -1
  178. data/app/views/catalog/index.json.jbuilder +19 -19
  179. data/app/views/catalog/index.rss.builder +1 -1
  180. data/app/views/catalog/opensearch.xml.builder +1 -1
  181. data/app/views/catalog/sms.html.erb +2 -2
  182. data/app/views/catalog/sms_success.html.erb +5 -6
  183. data/app/views/catalog/suggest.html.erb +3 -0
  184. data/app/views/kaminari/blacklight/_page.html.erb +2 -1
  185. data/app/views/layouts/blacklight/base.html.erb +13 -2
  186. data/app/views/search_history/index.html.erb +6 -2
  187. data/app/views/shared/_flash_messages.html.erb +1 -1
  188. data/app/views/shared/_modal.html.erb +3 -3
  189. data/blacklight.gemspec +7 -11
  190. data/config/importmap.rb +3 -0
  191. data/config/locales/blacklight.ar.yml +0 -1
  192. data/config/locales/blacklight.ca.yml +0 -1
  193. data/config/locales/blacklight.de.yml +0 -1
  194. data/config/locales/blacklight.en.yml +0 -2
  195. data/config/locales/blacklight.es.yml +0 -1
  196. data/config/locales/blacklight.fr.yml +0 -1
  197. data/config/locales/blacklight.hu.yml +0 -1
  198. data/config/locales/blacklight.it.yml +0 -1
  199. data/config/locales/blacklight.nl.yml +0 -1
  200. data/config/locales/blacklight.pt-BR.yml +0 -1
  201. data/config/locales/blacklight.sq.yml +0 -1
  202. data/config/locales/blacklight.zh.yml +0 -1
  203. data/config/routes.rb +3 -2
  204. data/db/migrate/20140202020201_create_searches.rb +1 -0
  205. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  206. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  207. data/docker-compose.yml +3 -3
  208. data/lib/blacklight/abstract_repository.rb +1 -6
  209. data/lib/blacklight/component.rb +47 -10
  210. data/lib/blacklight/configuration/context.rb +4 -4
  211. data/lib/blacklight/configuration/display_field.rb +7 -9
  212. data/lib/blacklight/configuration/facet_field.rb +17 -11
  213. data/lib/blacklight/configuration/field.rb +1 -0
  214. data/lib/blacklight/configuration/fields.rb +12 -15
  215. data/lib/blacklight/configuration/index_field.rb +1 -0
  216. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  217. data/lib/blacklight/configuration/search_field.rb +1 -0
  218. data/lib/blacklight/configuration/show_field.rb +1 -0
  219. data/lib/blacklight/configuration/sort_field.rb +1 -0
  220. data/lib/blacklight/configuration/tool_config.rb +1 -0
  221. data/lib/blacklight/configuration/view_config.rb +14 -10
  222. data/lib/blacklight/configuration.rb +310 -365
  223. data/lib/blacklight/engine.rb +8 -24
  224. data/lib/blacklight/exceptions.rb +2 -2
  225. data/lib/blacklight/nested_open_struct_with_hash_access.rb +7 -13
  226. data/lib/blacklight/open_struct_with_hash_access.rb +23 -6
  227. data/lib/blacklight/parameters.rb +7 -21
  228. data/lib/blacklight/routes/exportable.rb +1 -0
  229. data/lib/blacklight/routes/searchable.rb +2 -1
  230. data/lib/blacklight/routes.rb +1 -0
  231. data/lib/blacklight/search_builder.rb +10 -10
  232. data/lib/blacklight/search_state/filter_field.rb +8 -25
  233. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  234. data/lib/blacklight/search_state.rb +23 -79
  235. data/lib/blacklight/solr/document.rb +1 -0
  236. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  237. data/lib/blacklight/solr/repository.rb +4 -24
  238. data/lib/blacklight/solr/request.rb +1 -0
  239. data/lib/blacklight/solr/response/facets.rb +21 -5
  240. data/lib/blacklight/solr/response/group.rb +1 -0
  241. data/lib/blacklight/solr/response/group_response.rb +1 -0
  242. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  243. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  244. data/lib/blacklight/solr/response/params.rb +5 -4
  245. data/lib/blacklight/solr/response/response.rb +1 -0
  246. data/lib/blacklight/solr/response/spelling.rb +1 -0
  247. data/lib/blacklight/solr/response.rb +16 -3
  248. data/lib/blacklight/solr/search_builder_behavior.rb +16 -35
  249. data/lib/blacklight/solr.rb +7 -0
  250. data/lib/blacklight/version.rb +1 -0
  251. data/lib/blacklight.rb +26 -14
  252. data/lib/generators/blacklight/assets/importmap_generator.rb +55 -0
  253. data/lib/generators/blacklight/assets/propshaft_generator.rb +25 -0
  254. data/lib/generators/blacklight/assets/sprockets_generator.rb +66 -0
  255. data/lib/generators/blacklight/assets_generator.rb +13 -86
  256. data/lib/generators/blacklight/controller_generator.rb +4 -3
  257. data/lib/generators/blacklight/document_generator.rb +1 -0
  258. data/lib/generators/blacklight/install_generator.rb +4 -3
  259. data/lib/generators/blacklight/models_generator.rb +1 -0
  260. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  261. data/lib/generators/blacklight/solr_generator.rb +1 -1
  262. data/lib/generators/blacklight/templates/catalog_controller.rb +34 -8
  263. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +1 -70
  264. data/lib/generators/blacklight/test_support_generator.rb +5 -3
  265. data/lib/generators/blacklight/user_generator.rb +7 -9
  266. data/lib/railties/blacklight.rake +6 -7
  267. data/package.json +10 -13
  268. data/rollup.config.js +27 -0
  269. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  270. data/spec/components/blacklight/document/action_component_spec.rb +6 -1
  271. data/spec/components/blacklight/document_component_spec.rb +22 -131
  272. data/spec/components/blacklight/facet_component_spec.rb +3 -18
  273. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  274. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  275. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +10 -9
  276. data/spec/components/blacklight/response/view_type_component_spec.rb +66 -0
  277. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  278. data/spec/components/blacklight/search_context_component_spec.rb +17 -8
  279. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  280. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  281. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  282. data/spec/controllers/catalog_controller_spec.rb +13 -135
  283. data/spec/features/advanced_search_spec.rb +0 -56
  284. data/spec/features/autocomplete_spec.rb +1 -1
  285. data/spec/features/axe_spec.rb +1 -6
  286. data/spec/features/bookmarks_spec.rb +1 -1
  287. data/spec/features/facets_spec.rb +6 -4
  288. data/spec/features/search_context_spec.rb +5 -11
  289. data/spec/features/search_results_spec.rb +0 -33
  290. data/spec/features/sitelinks_search_box.rb +13 -0
  291. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  292. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  293. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  294. data/spec/helpers/blacklight/layout_helper_behavior_spec.rb +3 -20
  295. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  296. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +9 -131
  297. data/spec/helpers/blacklight_helper_spec.rb +8 -252
  298. data/spec/helpers/catalog_helper_spec.rb +7 -118
  299. data/spec/i18n_spec.rb +1 -0
  300. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  301. data/spec/lib/blacklight/component_spec.rb +27 -32
  302. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  303. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  304. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  305. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +2 -2
  306. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  307. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  308. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  309. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  310. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  311. data/spec/models/blacklight/configuration_spec.rb +17 -51
  312. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  313. data/spec/models/blacklight/icon_spec.rb +31 -15
  314. data/spec/models/blacklight/search_builder_spec.rb +9 -9
  315. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  316. data/spec/models/blacklight/solr/repository_spec.rb +0 -45
  317. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  318. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  319. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  320. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  321. data/spec/models/blacklight/solr/search_builder_spec.rb +24 -44
  322. data/spec/models/blacklight/user_spec.rb +22 -0
  323. data/spec/models/solr_document_spec.rb +3 -9
  324. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  325. data/spec/presenters/blacklight/document_presenter_spec.rb +2 -3
  326. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  327. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  328. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  329. data/spec/presenters/blacklight/field_presenter_spec.rb +0 -14
  330. data/spec/presenters/blacklight/index_presenter_spec.rb +2 -5
  331. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  332. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  333. data/spec/presenters/blacklight/show_presenter_spec.rb +20 -30
  334. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  335. data/spec/requests/load_suggestions_spec.rb +16 -0
  336. data/spec/routing/catalog_routing_spec.rb +2 -1
  337. data/spec/services/blacklight/search_service_spec.rb +39 -76
  338. data/spec/spec_helper.rb +8 -9
  339. data/spec/support/controller_level_helpers.rb +1 -2
  340. data/spec/support/features/search_helpers.rb +39 -0
  341. data/spec/support/features/session_helpers.rb +1 -0
  342. data/spec/support/features.rb +3 -0
  343. data/spec/support/view_component_capybara_test_helpers.rb +8 -0
  344. data/spec/test_app_templates/Gemfile.extra +1 -0
  345. data/spec/test_app_templates/lib/generators/test_app_generator.rb +9 -2
  346. data/spec/views/catalog/_document.html.erb_spec.rb +3 -34
  347. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  348. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +0 -2
  349. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  350. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  351. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -66
  352. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  353. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  354. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  355. data/spec/views/catalog/index.atom.builder_spec.rb +17 -11
  356. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  357. data/spec/views/catalog/index.json.jbuilder_spec.rb +2 -2
  358. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  360. data/tasks/blacklight.rake +11 -9
  361. data/template.demo.rb +7 -7
  362. metadata +77 -189
  363. data/.babelrc +0 -11
  364. data/.github/matrix.json +0 -62
  365. data/.github/workflows/build.yml +0 -16
  366. data/.github/workflows/lint.yml +0 -23
  367. data/.github/workflows/main.yml +0 -23
  368. data/.github/workflows/test.yml +0 -53
  369. data/app/assets/images/blacklight/list.svg +0 -1
  370. data/app/assets/images/blacklight/search.svg +0 -1
  371. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  372. data/app/components/blacklight/content_areas_shim.rb +0 -13
  373. data/app/components/blacklight/search/per_page_component.html.erb +0 -2
  374. data/app/components/blacklight/search/per_page_component.rb +0 -50
  375. data/app/components/blacklight/search_context/server_item_pagination_component.html.erb +0 -10
  376. data/app/components/blacklight/search_context/server_item_pagination_component.rb +0 -15
  377. data/app/components/blacklight/system/dropdown_button_component.rb +0 -18
  378. data/app/controllers/concerns/blacklight/base.rb +0 -12
  379. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  380. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  381. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  382. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  383. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  384. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  385. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  386. data/app/javascript/blacklight/autocomplete.js +0 -36
  387. data/app/javascript/blacklight/facet_load.js +0 -22
  388. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  389. data/app/views/catalog/_constraints_element.html.erb +0 -14
  390. data/app/views/catalog/_document_action.html.erb +0 -5
  391. data/app/views/catalog/_facet_group.html.erb +0 -5
  392. data/app/views/catalog/_facet_limit.html.erb +0 -3
  393. data/app/views/catalog/_index.html.erb +0 -1
  394. data/app/views/catalog/_index_header.html.erb +0 -22
  395. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  396. data/app/views/catalog/_show.html.erb +0 -6
  397. data/app/views/catalog/_show_header.html.erb +0 -2
  398. data/app/views/catalog/_thumbnail.html.erb +0 -1
  399. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  400. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  401. data/spec/components/blacklight/header_component_spec.rb +0 -20
  402. data/spec/components/blacklight/icons/icon_component_spec.rb +0 -42
  403. data/spec/components/blacklight/response/pagination_component_spec.rb +0 -53
  404. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +0 -35
  405. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  406. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  407. data/spec/features/citation_spec.rb +0 -10
  408. data/spec/features/sitelinks_search_box_spec.rb +0 -13
  409. data/spec/features/sms_spec.rb +0 -12
  410. data/spec/helpers/blacklight/hash_as_hidden_fields_behavior_spec.rb +0 -26
  411. data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +0 -92
  412. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +0 -101
  413. data/spec/helpers/blacklight/suggest_helper_behavior_spec.rb +0 -48
  414. data/spec/lib/blacklight/engine_spec.rb +0 -41
  415. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  416. data/spec/services/blacklight/field_retriever_spec.rb +0 -17
  417. data/spec/support/view_component_test_helpers.rb +0 -35
  418. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  419. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  420. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  421. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  422. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  423. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  424. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  425. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
data/rollup.config.js ADDED
@@ -0,0 +1,27 @@
1
+ 'use strict'
2
+
3
+ const path = require('path')
4
+
5
+ const BUNDLE = process.env.BUNDLE === 'true'
6
+ const ESM = process.env.ESM === 'true'
7
+
8
+ const fileDest = `blacklight${ESM ? '.esm' : ''}`
9
+ const external = []
10
+ const globals = {}
11
+
12
+ const rollupConfig = {
13
+ input: path.resolve(__dirname, `app/javascript/blacklight/index.js`),
14
+ output: {
15
+ file: path.resolve(__dirname, `app/assets/javascripts/blacklight/${fileDest}.js`),
16
+ format: ESM ? 'esm' : 'umd',
17
+ globals,
18
+ generatedCode: 'es2015'
19
+ },
20
+ external
21
+ }
22
+
23
+ if (!ESM) {
24
+ rollupConfig.output.name = 'Blacklight'
25
+ }
26
+
27
+ module.exports = rollupConfig
@@ -13,13 +13,21 @@ RSpec.describe Blacklight::ConstraintsComponent, type: :component do
13
13
 
14
14
  let(:blacklight_config) do
15
15
  Blacklight::Configuration.new.configure do |config|
16
- config.add_facet_field 'some_facet'
16
+ config.add_facet_field :some_facet
17
17
  end
18
18
  end
19
19
 
20
20
  let(:search_state) { Blacklight::SearchState.new(query_params.with_indifferent_access, blacklight_config) }
21
21
  let(:query_params) { {} }
22
22
 
23
+ context 'with no constraints' do
24
+ describe '#render?' do
25
+ it 'is false' do
26
+ expect(component.render?).to be false
27
+ end
28
+ end
29
+ end
30
+
23
31
  context 'with a query' do
24
32
  let(:query_params) { { q: 'some query' } }
25
33
 
@@ -43,21 +51,17 @@ RSpec.describe Blacklight::ConstraintsComponent, type: :component do
43
51
  context 'with a facet' do
44
52
  let(:query_params) { { f: { some_facet: ['some value'] } } }
45
53
 
46
- before do
47
- controller.blacklight_config.configure do |config|
48
- config.add_facet_field :some_facet
49
- end
54
+ it 'renders the query' do
55
+ expect(rendered).to have_selector('.constraint-value > .filter-name', text: 'Some Facet').and(have_selector('.constraint-value > .filter-value', text: 'some value'))
50
56
  end
51
57
 
52
- # this has to be cleaned up to prevent leaking class configuration
53
- after do
54
- controller.blacklight_config.configure do |config|
55
- config['facet_fields'].delete('some_facet')
56
- end
57
- end
58
+ context 'that is not configured' do
59
+ let(:query_params) { { f: { some_facet: ['some value'], missing: ['another value'] } } }
58
60
 
59
- it 'renders the query' do
60
- expect(rendered).to have_selector('.constraint-value > .filter-name', text: 'Some Facet').and(have_selector('.constraint-value > .filter-value', text: 'some value'))
61
+ it 'renders only the configured constraints' do
62
+ expect(rendered).to have_selector('.constraint-value > .filter-name', text: 'Some Facet').and(have_selector('.constraint-value > .filter-value', text: 'some value'))
63
+ expect(rendered).not_to have_selector('.constraint-value > .filter-name', text: 'Missing')
64
+ end
61
65
  end
62
66
  end
63
67
 
@@ -23,7 +23,12 @@ RSpec.describe Blacklight::Document::ActionComponent, type: :component do
23
23
  end
24
24
 
25
25
  it 'renders an action link' do
26
- allow(view_context).to receive(:some_tool_solr_document_path).with(document, { only_path: true }).and_return('/asdf')
26
+ if Rails.version >= '6'
27
+ allow(view_context).to receive(:some_tool_solr_document_path).with(document, { only_path: true }).and_return('/asdf')
28
+ else
29
+ allow(view_context).to receive(:some_tool_solr_document_path).with(document).and_return('/asdf')
30
+ end
31
+
27
32
  expect(rendered).to have_link 'Some tool', href: '/asdf'
28
33
  end
29
34
 
@@ -43,11 +43,11 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
43
43
  end
44
44
 
45
45
  it 'has some defined content areas' do
46
- component.with(:title, 'Title')
47
- component.with(:embed, 'Embed')
48
- component.with(:metadata, 'Metadata')
49
- component.with(:thumbnail, 'Thumbnail')
50
- component.with(:actions) { 'Actions' }
46
+ component.set_slot(:title) { 'Title' }
47
+ component.set_slot(:embed, nil, 'Embed')
48
+ component.set_slot(:metadata, nil, 'Metadata')
49
+ component.set_slot(:thumbnail, nil, 'Thumbnail')
50
+ component.set_slot(:actions) { 'Actions' }
51
51
 
52
52
  expect(rendered).to have_content 'Title'
53
53
  expect(rendered).to have_content 'Embed'
@@ -57,7 +57,7 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
57
57
  end
58
58
 
59
59
  it 'has schema.org properties' do
60
- component.with(:body, '-')
60
+ component.set_slot(:body) { '-' }
61
61
 
62
62
  expect(rendered).to have_selector 'article[@itemtype="http://schema.org/Thing"]'
63
63
  expect(rendered).to have_selector 'article[@itemscope]'
@@ -65,7 +65,7 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
65
65
 
66
66
  context 'with a provided body' do
67
67
  it 'opts-out of normal component content' do
68
- component.with(:body) { 'Body content' }
68
+ component.set_slot(:body) { 'Body content' }
69
69
 
70
70
  expect(rendered).to have_content 'Body content'
71
71
  expect(rendered).not_to have_selector 'header'
@@ -74,14 +74,10 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
74
74
  end
75
75
 
76
76
  context 'index view' do
77
- before do
78
- controller.action_name = "index"
79
- end
80
-
81
77
  let(:attr) { { counter: 5 } }
82
78
 
83
79
  it 'has data properties' do
84
- component.with(:body, '-')
80
+ component.set_slot(:body) { '-' }
85
81
 
86
82
  expect(rendered).to have_selector 'article[@data-document-id="x"]'
87
83
  expect(rendered).to have_selector 'article[@data-document-counter="5"]'
@@ -96,12 +92,9 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
96
92
  end
97
93
 
98
94
  context 'with a document rendered as part of a collection' do
99
- # ViewComponent 3 changes iteration counters to begin at 0 rather than 1
100
- let(:document_counter) { ViewComponent::VERSION::MAJOR < 3 ? 11 : 10 }
101
- let(:attr) { { document_counter: document_counter, counter_offset: 100 } }
95
+ let(:attr) { { document_counter: 10, counter_offset: 100 } }
102
96
 
103
97
  it 'renders a counter with the title' do
104
- # after ViewComponent 2.5, collection counter params are 1-indexed
105
98
  expect(rendered).to have_selector 'header', text: '111. Title'
106
99
  end
107
100
  end
@@ -113,26 +106,17 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
113
106
  it 'renders a thumbnail' do
114
107
  expect(rendered).to have_selector 'a[href="/catalog/x"] img[src="http://example.com/image.jpg"]'
115
108
  end
116
-
117
- context 'with default metadata component' do
118
- it 'renders metadata' do
119
- expect(rendered).to have_selector 'dl.document-metadata'
120
- expect(rendered).to have_selector 'dt', text: 'Title:'
121
- expect(rendered).to have_selector 'dd', text: 'Title'
122
- expect(rendered).not_to have_selector 'dt', text: 'ISBN:'
123
- end
124
- end
125
109
  end
126
110
 
127
111
  context 'show view' do
128
112
  let(:attr) { { title_component: :h1, show: true } }
129
113
 
130
114
  before do
131
- controller.action_name = "show"
115
+ allow(view_context).to receive(:action_name).and_return('show')
132
116
  end
133
117
 
134
118
  it 'renders with an id' do
135
- component.with(:body, '-')
119
+ component.set_slot(:body) { '-' }
136
120
 
137
121
  expect(rendered).to have_selector 'article#document'
138
122
  end
@@ -159,118 +143,25 @@ RSpec.describe Blacklight::DocumentComponent, type: :component do
159
143
  blacklight_config.show.embed_component = StubComponent
160
144
  expect(rendered).to have_content 'embed'
161
145
  end
162
-
163
- context 'show view with custom translation' do
164
- let!(:original_translations) { I18n.backend.send(:translations).deep_dup }
165
-
166
- before do
167
- controller.action_name = "show"
168
- I18n.backend.store_translations(:en, blacklight: { search: { show: { label: "testing:%{label}" } } })
169
- end
170
-
171
- after do
172
- I18n.backend.reload!
173
- I18n.backend.store_translations(:en, original_translations[:en])
174
- end
175
-
176
- it 'renders with show-specific metadata with correct translation' do
177
- expect(rendered).to have_css 'dl.document-metadata'
178
- expect(rendered).to have_css 'dt', text: 'testing:ISBN'
179
- expect(rendered).to have_css 'dd', text: 'Value'
180
- end
181
- end
182
-
183
- context 'with configured metadata component' do
184
- let(:custom_component_class) do
185
- Class.new(Blacklight::DocumentMetadataComponent) do
186
- # Override component rendering with our own value
187
- def call
188
- 'blah'
189
- end
190
- end
191
- end
192
-
193
- before do
194
- stub_const('MyMetadataComponent', custom_component_class)
195
- blacklight_config.show.metadata_component = MyMetadataComponent
196
- end
197
-
198
- it 'renders custom component' do
199
- expect(rendered).to have_text 'blah'
200
- end
201
- end
202
-
203
- context 'with configured title component' do
204
- let(:custom_component_class) do
205
- Class.new(Blacklight::DocumentTitleComponent) do
206
- # Override component rendering with our own value
207
- def call
208
- 'Titleriffic'
209
- end
210
- end
211
- end
212
-
213
- before do
214
- stub_const('MyTitleComponent', custom_component_class)
215
- blacklight_config.show.title_component = MyTitleComponent
216
- end
217
-
218
- it 'renders custom component' do
219
- expect(rendered).to have_text 'Titleriffic'
220
- end
221
- end
222
- end
223
-
224
- context 'with a thumbnail component' do
225
- let(:attr) { { thumbnail_component: thumbnail_component_class } }
226
- let(:thumbnail_component_class) do
227
- Class.new(ViewComponent::Base) do
228
- def render_in(view_context)
229
- view_context.capture { 'Thumb!' }
230
- end
231
- end
232
- end
233
-
234
- it 'uses the provided thumbnail component' do
235
- expect(rendered).to have_content 'Thumb!'
236
- end
237
146
  end
238
147
 
239
- context 'with partials rendered into a component slot' do
240
- it 'does not automatically renders partials' do
241
- component.with_partial { 'Partials' }
242
- expect(rendered).not_to have_content 'Partials'
243
- end
244
- end
245
-
246
- context 'with render_partials_in_component set to true' do
247
- before do
248
- blacklight_config.index.render_partials_in_component = true
249
- end
250
-
251
- it 'renders partials' do
252
- component.with_partial { 'Partials' }
253
- expect(rendered).to have_content 'Partials'
254
- end
148
+ it 'renders metadata' do
149
+ expect(rendered).to have_selector 'dl.document-metadata'
150
+ expect(rendered).to have_selector 'dt', text: 'Title:'
151
+ expect(rendered).to have_selector 'dd', text: 'Title'
152
+ expect(rendered).not_to have_selector 'dt', text: 'ISBN:'
255
153
  end
256
154
 
257
- context 'with partials passed into the component constructor' do
258
- let(:attr) { { partials: ['a'] } }
259
-
260
- before do
261
- allow(view_context).to receive(:render_document_partial).and_return('Partials')
262
- end
263
-
264
- it 'renders partials' do
265
- expect(rendered).to have_content 'Partials'
266
- end
155
+ it 'renders partials' do
156
+ component.partial { 'Partials' }
157
+ expect(rendered).to have_content 'Partials'
267
158
  end
268
159
 
269
- context 'with before_titles' do
160
+ context 'with before_title' do
270
161
  let(:render) do
271
162
  component.render_in(view_context) do
272
- component.with_title do |c|
273
- c.with_before_title { 'Prefix!' }
163
+ component.title do |c|
164
+ c.before_title { 'Prefix!' }
274
165
  end
275
166
  end
276
167
  end
@@ -15,12 +15,7 @@ RSpec.describe Blacklight::FacetComponent, type: :component do
15
15
  instance_double(Blacklight::Solr::Response::Facets::FacetField, name: 'field', items: items, limit: nil, sort: :index, offset: 0, prefix: nil)
16
16
  end
17
17
 
18
- let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'field', component: Blacklight::FacetFieldListComponent).normalize! }
19
-
20
- before do
21
- allow(controller).to receive(:view_context).and_return(controller.view_context)
22
- allow(controller.view_context).to receive(:facet_limit_for).and_return(20)
23
- end
18
+ let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'field').normalize! }
24
19
 
25
20
  it 'delegates to the configured component to render something' do
26
21
  expect(rendered).to have_selector 'ul.facet-values'
@@ -51,17 +46,7 @@ RSpec.describe Blacklight::FacetComponent, type: :component do
51
46
  end
52
47
 
53
48
  before do
54
- # Not sure why we need to re-implement rspec's stub_template, but
55
- # we already were, and need a Rails 7.1+ safe alternate too
56
- # https://github.com/rspec/rspec-rails/commit/4d65bea0619955acb15023b9c3f57a3a53183da8
57
- # https://github.com/rspec/rspec-rails/issues/2696
58
-
59
- replace_hash = { 'catalog/_facet_partial.html.erb' => 'facet partial' }
60
- if ::Rails.version.to_f >= 7.1
61
- controller.prepend_view_path(RSpec::Rails::ViewExampleGroup::StubResolverCache.resolver_for(replace_hash))
62
- else
63
- controller.view_context.view_paths.unshift(RSpec::Rails::ViewExampleGroup::StubResolverCache.resolver_for(replace_hash))
64
- end
49
+ controller.view_context.view_paths.unshift(RSpec::Rails::ViewExampleGroup::StubResolverCache.resolver_for('catalog/_facet_partial.html.erb' => 'facet partial'))
65
50
  end
66
51
 
67
52
  it 'renders the partial' do
@@ -85,7 +70,7 @@ RSpec.describe Blacklight::FacetComponent, type: :component do
85
70
  end
86
71
 
87
72
  context 'when the field is not in the response' do
88
- let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'some_other_field', component: Blacklight::FacetFieldListComponent).normalize! }
73
+ let(:facet_config) { Blacklight::Configuration::FacetField.new(key: 'some_other_field').normalize! }
89
74
 
90
75
  it 'uses a null field to pass through the response information anyway' do
91
76
  allow(facet_config.component).to receive(:new).and_call_original
@@ -10,14 +10,13 @@ RSpec.describe Blacklight::FacetFieldCheckboxesComponent, type: :component do
10
10
  let(:facet_field) do
11
11
  instance_double(
12
12
  Blacklight::FacetFieldPresenter,
13
- facet_field: Blacklight::Configuration::NullField.new(key: 'field'),
13
+ facet_field: Blacklight::Configuration::NullField.new(key: 'field', item_component: Blacklight::FacetItemComponent, item_presenter: Blacklight::FacetItemPresenter),
14
14
  paginator: paginator,
15
15
  key: 'field',
16
16
  label: 'Field',
17
17
  active?: false,
18
18
  collapsed?: false,
19
19
  modal_path: nil,
20
- html_id: 'facet-field',
21
20
  search_state: search_state
22
21
  )
23
22
  end
@@ -11,16 +11,18 @@ RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
11
11
  instance_double(
12
12
  Blacklight::FacetFieldPresenter,
13
13
  paginator: paginator,
14
+ facet_field: facet_config,
14
15
  key: 'field',
15
16
  label: 'Field',
16
17
  active?: false,
17
18
  collapsed?: false,
18
19
  modal_path: nil,
19
- html_id: 'facet-field',
20
20
  values: []
21
21
  )
22
22
  end
23
23
 
24
+ let(:facet_config) { Blacklight::Configuration::NullField.new(key: 'field', item_component: Blacklight::FacetItemComponent, item_presenter: Blacklight::FacetItemPresenter) }
25
+
24
26
  let(:paginator) do
25
27
  instance_double(Blacklight::FacetPaginator, items: [
26
28
  double(label: 'x', hits: 10),
@@ -45,12 +47,12 @@ RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
45
47
  instance_double(
46
48
  Blacklight::FacetFieldPresenter,
47
49
  paginator: paginator,
50
+ facet_field: facet_config,
48
51
  key: 'field',
49
52
  label: 'Field',
50
53
  active?: true,
51
54
  collapsed?: false,
52
55
  modal_path: nil,
53
- html_id: 'facet-field',
54
56
  values: []
55
57
  )
56
58
  end
@@ -65,12 +67,12 @@ RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
65
67
  instance_double(
66
68
  Blacklight::FacetFieldPresenter,
67
69
  paginator: paginator,
70
+ facet_field: facet_config,
68
71
  key: 'field',
69
72
  label: 'Field',
70
73
  active?: false,
71
74
  collapsed?: true,
72
75
  modal_path: nil,
73
- html_id: 'facet-field',
74
76
  values: []
75
77
  )
76
78
  end
@@ -91,12 +93,12 @@ RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
91
93
  instance_double(
92
94
  Blacklight::FacetFieldPresenter,
93
95
  paginator: paginator,
96
+ facet_field: facet_config,
94
97
  key: 'field',
95
98
  label: 'Field',
96
99
  active?: false,
97
100
  collapsed?: false,
98
101
  modal_path: '/catalog/facet/modal',
99
- html_id: 'facet-field',
100
102
  values: []
101
103
  )
102
104
  end
@@ -111,13 +113,12 @@ RSpec.describe Blacklight::FacetFieldListComponent, type: :component do
111
113
  instance_double(
112
114
  Blacklight::FacetFieldPresenter,
113
115
  paginator: paginator,
114
- facet_field: Blacklight::Configuration::NullField.new(key: 'field'),
116
+ facet_field: facet_config,
115
117
  key: 'field',
116
118
  label: 'Field',
117
119
  active?: false,
118
120
  collapsed?: false,
119
121
  modal_path: nil,
120
- html_id: 'facet-field',
121
122
  values: [%w[a b c]],
122
123
  search_state: search_state
123
124
  )
@@ -19,42 +19,43 @@ RSpec.describe Blacklight::FacetItemPivotComponent, type: :component do
19
19
 
20
20
  let(:facet_item) do
21
21
  instance_double(
22
- Blacklight::FacetItemPresenter,
23
- facet_config: Blacklight::Configuration::FacetField.new(key: 'z'),
22
+ Blacklight::FacetItemPivotPresenter,
23
+ facet_config: facet_config,
24
24
  facet_field: 'z',
25
25
  label: 'x',
26
26
  hits: 10,
27
27
  href: '/catalog?f[z]=x',
28
28
  selected?: false,
29
29
  search_state: search_state,
30
- items: [OpenStruct.new(value: 'x:1', hits: 5)]
30
+ facet_item_presenters: [OpenStruct.new(label: 'x:1', hits: 5, href: '/catalog?f[z][]=x:1', facet_config: facet_config)]
31
31
  )
32
32
  end
33
33
 
34
+ let(:facet_config) { Blacklight::Configuration::NullField.new(key: 'z', item_component: Blacklight::FacetItemComponent, item_presenter: Blacklight::FacetItemPivotPresenter) }
35
+
34
36
  it 'links to the facet and shows the number of hits' do
35
37
  expect(rendered).to have_selector 'li'
36
- expect(rendered).to have_link 'x', href: nokogiri_mediated_href(facet_item.href)
38
+ expect(rendered).to have_link 'x', href: '/catalog?f%5Bz%5D=x'
37
39
  expect(rendered).to have_selector '.facet-count', text: '10'
38
40
  end
39
41
 
40
42
  it 'has the facet hierarchy' do
41
- pending
42
43
  expect(rendered).to have_selector 'li ul.pivot-facet'
43
- expect(rendered).to have_link 'x:1', href: nokogiri_mediated_href(facet_item.facet_item_presenters.first.href)
44
+ expect(rendered).to have_link 'x:1', href: /f%5Bz%5D%5B%5D=x:1/
44
45
  end
45
46
 
46
47
  context 'with a selected facet' do
47
48
  let(:facet_item) do
48
49
  instance_double(
49
- Blacklight::FacetItemPresenter,
50
- facet_config: Blacklight::Configuration::FacetField.new,
50
+ Blacklight::FacetItemPivotPresenter,
51
+ facet_config: facet_config,
51
52
  facet_field: 'z',
52
53
  label: 'x',
53
54
  hits: 10,
54
55
  href: '/catalog',
55
56
  selected?: true,
56
57
  search_state: search_state,
57
- items: []
58
+ facet_item_presenters: []
58
59
  )
59
60
  end
60
61
 
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Blacklight::Response::ViewTypeComponent, type: :component do
6
+ subject(:render) do
7
+ render_inline(described_class.new(response: response, views: views, search_state: search_state))
8
+ end
9
+
10
+ let(:response) { instance_double(Blacklight::Solr::Response, empty?: false) }
11
+ let(:search_state) { instance_double(Blacklight::SearchState, to_h: { controller: 'catalog', action: 'index' }) }
12
+ let(:view_config) { Blacklight::Configuration::ViewConfig.new }
13
+
14
+ describe "when some views exist" do
15
+ let(:views) do
16
+ {
17
+ abc: view_config,
18
+ def: view_config
19
+ }
20
+ end
21
+
22
+ it "draws the group" do
23
+ expect(render.css('.view-type-group')).to be_present
24
+ end
25
+ end
26
+
27
+ context 'with a icon component class' do
28
+ let(:views) do
29
+ { abc: Blacklight::Configuration::ViewConfig.new(icon: Blacklight::Icons::ListComponent), def: view_config }
30
+ end
31
+
32
+ it 'draws the icon' do
33
+ expect(render.css('.view-type-abc svg')).to be_present
34
+ end
35
+ end
36
+
37
+ context 'with a icon component instance' do
38
+ let(:views) do
39
+ { abc: Blacklight::Configuration::ViewConfig.new(icon: Blacklight::Icons::ListComponent.new), def: view_config }
40
+ end
41
+
42
+ it 'draws the icon' do
43
+ expect(render.css('.view-type-abc svg')).to be_present
44
+ end
45
+ end
46
+
47
+ context 'with a icon with the svg given in-line' do
48
+ let(:views) do
49
+ { abc: Blacklight::Configuration::ViewConfig.new(icon: Blacklight::Icons::IconComponent.new(svg: 'blah')), def: view_config }
50
+ end
51
+
52
+ it 'draws the icon' do
53
+ expect(render.css('.view-type-abc').text).to include 'blah'
54
+ end
55
+ end
56
+
57
+ describe "when no views exist" do
58
+ let(:views) do
59
+ {}
60
+ end
61
+
62
+ it "draws nothing" do
63
+ expect(render.to_html).to be_blank
64
+ end
65
+ end
66
+ end
@@ -29,7 +29,7 @@ RSpec.describe Blacklight::SearchBarComponent, type: :component do
29
29
  context 'when a button is passed in' do
30
30
  subject(:render) do
31
31
  render_inline(instance) do |c|
32
- c.with_search_button do
32
+ c.search_button do
33
33
  controller.view_context.tag.button "hello", id: 'custom_search'
34
34
  end
35
35
  end
@@ -1,18 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'spec_helper'
4
+
4
5
  RSpec.describe Blacklight::SearchContextComponent, type: :component do
5
6
  subject(:render) { render_inline(instance) }
6
7
 
7
- let(:current_document_id) { 9 }
8
- let(:search_session) { { 'document_id' => current_document_id, 'counter' => 1, 'total' => '3' } }
8
+ let(:search_session) { {} }
9
9
  let(:instance) { described_class.new(search_context: search_context, search_session: search_session) }
10
10
 
11
11
  before do
12
- allow(controller).to receive(:search_session).and_return(search_session)
13
- allow(controller).to receive(:current_search_session).and_return(double(id: current_document_id))
14
- controller.class.helper_method :search_session
15
- controller.class.helper_method :current_search_session
12
+ allow(controller).to receive(:current_search_session).and_return(double(id: 9))
13
+ end
14
+
15
+ context 'when there is no next or previous' do
16
+ let(:search_context) { {} }
17
+
18
+ it "does not render content" do
19
+ expect(render.to_html).to be_blank
20
+ end
16
21
  end
17
22
 
18
23
  context 'when there is next and previous' do
@@ -21,11 +26,15 @@ RSpec.describe Blacklight::SearchContextComponent, type: :component do
21
26
  let(:next_doc) { SolrDocument.new(id: '888') }
22
27
 
23
28
  before do
24
- allow(controller).to receive_messages(controller_name: 'catalog', link_to_previous_document: '', link_to_next_document: '')
29
+ # allow(controller).to receive(:controller_tracking_method).and_return('track_catalog_path')
30
+ allow(controller).to receive(:controller_name).and_return('catalog')
31
+
32
+ allow(controller).to receive(:link_to_previous_document).and_return('')
33
+ allow(controller).to receive(:link_to_next_document).and_return('')
25
34
  end
26
35
 
27
36
  it "renders content" do
28
- expect(render.css('.page-links').to_html).not_to be_blank
37
+ expect(render.css('.pagination-search-widgets').to_html).not_to be_blank
29
38
  end
30
39
  end
31
40
  end
@@ -1,10 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RSpec.describe Blacklight::DefaultComponentConfiguration do
3
+ RSpec.describe CatalogController do
4
4
  subject do
5
5
  Class.new do
6
6
  include Blacklight::Configurable
7
- include Blacklight::DefaultComponentConfiguration
8
7
 
9
8
  def some_existing_action
10
9
  1
@@ -12,10 +11,6 @@ RSpec.describe Blacklight::DefaultComponentConfiguration do
12
11
  end
13
12
  end
14
13
 
15
- before do
16
- allow(Deprecation).to receive(:warn)
17
- end
18
-
19
14
  describe ".add_show_tools_partial" do
20
15
  it "defines an action method" do
21
16
  subject.blacklight_config.add_show_tools_partial :xyz
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- RSpec.describe Blacklight::Base do
3
+ RSpec.describe Blacklight::Catalog do
4
4
  subject { controller }
5
5
 
6
- let(:controller) { Deprecation.silence(described_class) { (Class.new(ApplicationController) { include Blacklight::Base }).new } }
6
+ let(:controller) { (Class.new(ApplicationController) { include Blacklight::Catalog }).new }
7
7
 
8
8
  describe "#search_state" do
9
9
  subject { controller.send(:search_state) }