blacklight 7.33.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/.env +3 -2
  3. data/.github/workflows/ruby.yml +38 -107
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +243 -2
  6. data/.rubocop_todo.yml +216 -270
  7. data/Gemfile +7 -6
  8. data/README.md +12 -4
  9. data/Rakefile +18 -0
  10. data/VERSION +1 -1
  11. data/app/assets/config/blacklight/manifest.js +3 -0
  12. data/app/assets/javascripts/blacklight/blacklight.esm.js +376 -0
  13. data/app/assets/javascripts/blacklight/blacklight.esm.js.map +1 -0
  14. data/app/assets/javascripts/blacklight/blacklight.js +332 -485
  15. data/app/assets/javascripts/blacklight/blacklight.js.map +1 -0
  16. data/app/assets/stylesheets/blacklight/_autocomplete.scss +25 -0
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +1 -1
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +16 -0
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +8 -0
  20. data/app/assets/stylesheets/blacklight/_facets.scss +104 -49
  21. data/app/assets/stylesheets/blacklight/_header.scss +0 -15
  22. data/app/assets/stylesheets/blacklight/_icons.scss +0 -14
  23. data/app/assets/stylesheets/blacklight/_mixins.scss +20 -0
  24. data/app/assets/stylesheets/blacklight/_modal.scss +8 -2
  25. data/app/assets/stylesheets/blacklight/_search_form.scss +30 -3
  26. data/app/assets/stylesheets/blacklight/_search_history.scss +10 -1
  27. data/app/assets/stylesheets/blacklight/_search_results.scss +6 -2
  28. data/app/assets/stylesheets/blacklight/blacklight_defaults.scss +4 -1
  29. data/app/builders/blacklight/action_builder.rb +18 -9
  30. data/app/components/blacklight/advanced_search_form_component.html.erb +1 -1
  31. data/app/components/blacklight/advanced_search_form_component.rb +7 -9
  32. data/app/components/blacklight/constraints_component.rb +27 -37
  33. data/app/components/blacklight/document/action_component.html.erb +2 -9
  34. data/app/components/blacklight/document/action_component.rb +26 -8
  35. data/app/components/blacklight/document/actions_component.rb +2 -2
  36. data/app/components/blacklight/document/bookmark_component.html.erb +9 -0
  37. data/app/components/blacklight/document/bookmark_component.rb +4 -2
  38. data/app/components/blacklight/document/citation_component.rb +5 -3
  39. data/app/components/blacklight/document/group_component.rb +7 -3
  40. data/app/components/blacklight/document/show_tools_component.html.erb +12 -0
  41. data/app/components/blacklight/document/show_tools_component.rb +23 -0
  42. data/app/components/blacklight/document/sidebar_component.html.erb +2 -0
  43. data/app/components/blacklight/document/sidebar_component.rb +16 -0
  44. data/app/components/blacklight/document/thumbnail_component.html.erb +2 -7
  45. data/app/components/blacklight/document/thumbnail_component.rb +1 -9
  46. data/app/components/blacklight/document_component.html.erb +4 -0
  47. data/app/components/blacklight/document_component.rb +54 -42
  48. data/app/components/blacklight/document_metadata_component.html.erb +4 -2
  49. data/app/components/blacklight/document_metadata_component.rb +11 -6
  50. data/app/components/blacklight/document_title_component.rb +4 -1
  51. data/app/components/blacklight/facet_component.rb +1 -1
  52. data/app/components/blacklight/facet_field_checkboxes_component.html.erb +3 -3
  53. data/app/components/blacklight/facet_field_checkboxes_component.rb +1 -1
  54. data/app/components/blacklight/facet_field_component.html.erb +5 -5
  55. data/app/components/blacklight/facet_field_component.rb +9 -2
  56. data/app/components/blacklight/facet_field_list_component.html.erb +3 -3
  57. data/app/components/blacklight/facet_field_list_component.rb +37 -5
  58. data/app/components/blacklight/facet_field_no_layout_component.rb +0 -2
  59. data/app/components/blacklight/facet_item_component.rb +1 -43
  60. data/app/components/blacklight/facet_item_pivot_component.rb +21 -23
  61. data/app/components/blacklight/header_component.html.erb +2 -0
  62. data/app/components/blacklight/header_component.rb +26 -0
  63. data/app/components/blacklight/hidden_search_state_component.rb +1 -2
  64. data/app/components/blacklight/icons/legacy_icon_component.rb +30 -0
  65. data/app/components/blacklight/icons/list_component.rb +16 -0
  66. data/app/components/blacklight/icons/search_component.rb +16 -0
  67. data/app/components/blacklight/metadata_field_component.html.erb +2 -2
  68. data/app/components/blacklight/metadata_field_component.rb +24 -8
  69. data/app/components/blacklight/metadata_field_layout_component.rb +7 -22
  70. data/app/components/blacklight/metadata_field_plain_text_layout_component.rb +17 -0
  71. data/app/components/blacklight/response/facet_group_component.html.erb +5 -6
  72. data/app/components/blacklight/response/facet_group_component.rb +29 -8
  73. data/app/components/blacklight/response/sort_component.rb +2 -2
  74. data/app/components/blacklight/response/spellcheck_component.rb +18 -7
  75. data/app/components/blacklight/response/view_type_button_component.rb +3 -7
  76. data/app/components/blacklight/response/view_type_component.rb +4 -6
  77. data/app/components/blacklight/search/sidebar_component.html.erb +8 -0
  78. data/app/components/blacklight/search/sidebar_component.rb +17 -0
  79. data/app/components/blacklight/search_bar_component.html.erb +20 -15
  80. data/app/components/blacklight/search_bar_component.rb +2 -16
  81. data/app/components/blacklight/search_button_component.rb +3 -3
  82. data/app/components/blacklight/search_context/server_applied_params_component.html.erb +4 -0
  83. data/app/components/blacklight/search_context/server_applied_params_component.rb +13 -0
  84. data/app/components/blacklight/search_context/server_item_pagination_component.rb +71 -0
  85. data/app/components/blacklight/search_header_component.html.erb +2 -0
  86. data/app/components/blacklight/search_header_component.rb +6 -0
  87. data/app/components/blacklight/search_navbar_component.html.erb +5 -0
  88. data/app/components/blacklight/search_navbar_component.rb +34 -0
  89. data/app/components/blacklight/start_over_button_component.rb +5 -3
  90. data/app/components/blacklight/system/dropdown_component.rb +3 -3
  91. data/app/components/blacklight/system/flash_message_component.html.erb +3 -1
  92. data/app/components/blacklight/system/flash_message_component.rb +12 -3
  93. data/app/components/blacklight/system/modal_component.html.erb +1 -1
  94. data/app/components/blacklight/system/modal_component.rb +1 -3
  95. data/app/components/blacklight/top_navbar_component.html.erb +12 -0
  96. data/app/components/blacklight/top_navbar_component.rb +17 -0
  97. data/app/controllers/bookmarks_controller.rb +1 -0
  98. data/app/controllers/catalog_controller.rb +1 -0
  99. data/app/controllers/concerns/blacklight/bookmarks.rb +11 -6
  100. data/app/controllers/concerns/blacklight/catalog.rb +21 -72
  101. data/app/controllers/concerns/blacklight/controller.rb +6 -43
  102. data/app/controllers/concerns/blacklight/search_context.rb +71 -13
  103. data/app/controllers/concerns/blacklight/search_history.rb +2 -0
  104. data/app/controllers/concerns/blacklight/searchable.rb +12 -1
  105. data/app/controllers/concerns/blacklight/token_based_user.rb +1 -0
  106. data/app/controllers/search_history_controller.rb +1 -0
  107. data/app/helpers/blacklight/blacklight_helper_behavior.rb +1 -400
  108. data/app/helpers/blacklight/catalog_helper_behavior.rb +40 -182
  109. data/app/helpers/blacklight/component_helper_behavior.rb +1 -63
  110. data/app/helpers/blacklight/configuration_helper_behavior.rb +2 -117
  111. data/app/helpers/blacklight/document_helper_behavior.rb +76 -0
  112. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -321
  113. data/app/helpers/blacklight/icon_helper_behavior.rb +5 -4
  114. data/app/helpers/blacklight/layout_helper_behavior.rb +60 -0
  115. data/app/helpers/blacklight/render_partials_helper_behavior.rb +12 -30
  116. data/app/helpers/blacklight/url_helper_behavior.rb +21 -97
  117. data/app/helpers/blacklight_helper.rb +1 -0
  118. data/app/helpers/catalog_helper.rb +1 -0
  119. data/app/javascript/blacklight/bookmark_toggle.js +9 -22
  120. data/app/javascript/blacklight/button_focus.js +9 -7
  121. data/app/javascript/blacklight/checkbox_submit.js +68 -122
  122. data/app/javascript/blacklight/core.js +6 -5
  123. data/app/javascript/blacklight/index.js +14 -0
  124. data/app/javascript/blacklight/modal.js +100 -165
  125. data/app/javascript/blacklight/modalForm.js +60 -0
  126. data/app/javascript/blacklight/search_context.js +13 -29
  127. data/app/models/blacklight/facet_paginator.rb +3 -2
  128. data/app/models/blacklight/icon.rb +4 -2
  129. data/app/models/bookmark.rb +0 -2
  130. data/app/models/concerns/blacklight/configurable.rb +5 -4
  131. data/app/models/concerns/blacklight/document/active_model_shim.rb +1 -0
  132. data/app/models/concerns/blacklight/document/attributes.rb +50 -0
  133. data/app/models/concerns/blacklight/document/cache_key.rb +1 -0
  134. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -1
  135. data/app/models/concerns/blacklight/document/export.rb +2 -1
  136. data/app/models/concerns/blacklight/document/extensions.rb +1 -0
  137. data/app/models/concerns/blacklight/document/schema_org.rb +1 -0
  138. data/app/models/concerns/blacklight/document/semantic_fields.rb +1 -0
  139. data/app/models/concerns/blacklight/document.rb +23 -20
  140. data/app/models/concerns/blacklight/suggest/response.rb +1 -0
  141. data/app/models/concerns/blacklight/user.rb +17 -8
  142. data/app/models/record_mailer.rb +23 -18
  143. data/app/models/search.rb +0 -1
  144. data/app/models/solr_document.rb +1 -0
  145. data/app/presenters/blacklight/clause_presenter.rb +1 -1
  146. data/app/presenters/blacklight/document_presenter.rb +24 -30
  147. data/app/presenters/blacklight/facet_field_presenter.rb +39 -14
  148. data/app/presenters/blacklight/facet_grouped_item_presenter.rb +1 -5
  149. data/app/presenters/blacklight/facet_item_pivot_presenter.rb +60 -0
  150. data/app/presenters/blacklight/facet_item_presenter.rb +3 -9
  151. data/app/presenters/blacklight/field_presenter.rb +1 -0
  152. data/app/presenters/blacklight/index_presenter.rb +2 -40
  153. data/app/presenters/blacklight/json_presenter.rb +7 -5
  154. data/app/presenters/blacklight/rendering/abstract_step.rb +4 -0
  155. data/app/presenters/blacklight/rendering/join.rb +7 -1
  156. data/app/presenters/blacklight/rendering/link_to_facet.rb +3 -6
  157. data/app/presenters/blacklight/rendering/microdata.rb +1 -1
  158. data/app/presenters/blacklight/show_presenter.rb +1 -9
  159. data/app/presenters/blacklight/thumbnail_presenter.rb +1 -1
  160. data/app/services/blacklight/bookmarks_search_builder.rb +22 -0
  161. data/app/services/blacklight/field_retriever.rb +1 -8
  162. data/app/services/blacklight/search_service.rb +9 -7
  163. data/app/values/blacklight/types.rb +95 -11
  164. data/app/views/bookmarks/_clear_bookmarks_widget.html.erb +8 -1
  165. data/app/views/bookmarks/_tools.html.erb +7 -12
  166. data/app/views/catalog/_advanced_search_form.html.erb +0 -1
  167. data/app/views/catalog/_bookmark_control.html.erb +1 -1
  168. data/app/views/catalog/_constraints.html.erb +1 -14
  169. data/app/views/catalog/_document.atom.builder +12 -14
  170. data/app/views/catalog/_document.html.erb +3 -6
  171. data/app/views/catalog/_document.rss.builder +2 -4
  172. data/app/views/catalog/_document_list.html.erb +2 -1
  173. data/app/views/catalog/_facet_layout.html.erb +2 -2
  174. data/app/views/catalog/_facets.html.erb +5 -4
  175. data/app/views/catalog/_home_text.html.erb +2 -14
  176. data/app/views/catalog/_search_form.html.erb +3 -3
  177. data/app/views/catalog/_search_header.html.erb +1 -2
  178. data/app/views/catalog/_search_results.html.erb +2 -2
  179. data/app/views/catalog/_search_sidebar.html.erb +5 -1
  180. data/app/views/catalog/_show_main_content.html.erb +8 -19
  181. data/app/views/catalog/_show_sidebar.html.erb +2 -2
  182. data/app/views/catalog/_show_tools.html.erb +1 -19
  183. data/app/views/catalog/_view_type_group.html.erb +1 -1
  184. data/app/views/catalog/email_success.html.erb +5 -6
  185. data/app/views/catalog/facet.html.erb +7 -5
  186. data/app/views/catalog/index.atom.builder +12 -14
  187. data/app/views/catalog/index.html.erb +7 -1
  188. data/app/views/catalog/index.json.jbuilder +19 -19
  189. data/app/views/catalog/index.rss.builder +1 -1
  190. data/app/views/catalog/opensearch.xml.builder +1 -1
  191. data/app/views/catalog/show.html.erb +1 -6
  192. data/app/views/catalog/sms_success.html.erb +5 -6
  193. data/app/views/catalog/suggest.html.erb +3 -0
  194. data/app/views/layouts/blacklight/base.html.erb +19 -9
  195. data/app/views/record_mailer/email_record.text.erb +4 -3
  196. data/app/views/record_mailer/sms_record.text.erb +4 -4
  197. data/app/views/search_history/index.html.erb +6 -2
  198. data/app/views/shared/_header_navbar.html.erb +1 -22
  199. data/app/views/shared/_modal.html.erb +3 -3
  200. data/blacklight.gemspec +8 -10
  201. data/config/importmap.rb +3 -0
  202. data/config/locales/blacklight.ar.yml +209 -233
  203. data/config/locales/blacklight.ca.yml +0 -7
  204. data/config/locales/blacklight.de.yml +197 -216
  205. data/config/locales/blacklight.en.yml +2 -7
  206. data/config/locales/blacklight.es.yml +196 -216
  207. data/config/locales/blacklight.fr.yml +196 -220
  208. data/config/locales/blacklight.hu.yml +193 -213
  209. data/config/locales/blacklight.it.yml +197 -216
  210. data/config/locales/blacklight.nl.yml +193 -213
  211. data/config/locales/blacklight.pt-BR.yml +195 -216
  212. data/config/locales/blacklight.sq.yml +193 -213
  213. data/config/locales/blacklight.zh.yml +194 -214
  214. data/config/routes.rb +3 -2
  215. data/db/migrate/20140202020201_create_searches.rb +1 -0
  216. data/db/migrate/20140202020202_create_bookmarks.rb +1 -0
  217. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -0
  218. data/docker-compose.yml +1 -0
  219. data/lib/blacklight/abstract_repository.rb +1 -0
  220. data/lib/blacklight/configuration/context.rb +4 -4
  221. data/lib/blacklight/configuration/display_field.rb +7 -9
  222. data/lib/blacklight/configuration/facet_field.rb +17 -11
  223. data/lib/blacklight/configuration/field.rb +1 -0
  224. data/lib/blacklight/configuration/fields.rb +12 -15
  225. data/lib/blacklight/configuration/index_field.rb +1 -0
  226. data/lib/blacklight/configuration/null_display_field.rb +17 -0
  227. data/lib/blacklight/configuration/search_field.rb +1 -0
  228. data/lib/blacklight/configuration/session_tracking_config.rb +45 -0
  229. data/lib/blacklight/configuration/show_field.rb +1 -0
  230. data/lib/blacklight/configuration/sort_field.rb +1 -0
  231. data/lib/blacklight/configuration/tool_config.rb +1 -0
  232. data/lib/blacklight/configuration/view_config.rb +16 -10
  233. data/lib/blacklight/configuration.rb +322 -341
  234. data/lib/blacklight/engine.rb +13 -15
  235. data/lib/blacklight/exceptions.rb +2 -2
  236. data/lib/blacklight/nested_open_struct_with_hash_access.rb +6 -12
  237. data/lib/blacklight/open_struct_with_hash_access.rb +19 -17
  238. data/lib/blacklight/parameters.rb +7 -21
  239. data/lib/blacklight/routes/exportable.rb +1 -0
  240. data/lib/blacklight/routes/searchable.rb +3 -1
  241. data/lib/blacklight/routes.rb +1 -0
  242. data/lib/blacklight/search_builder.rb +10 -10
  243. data/lib/blacklight/search_state/filter_field.rb +8 -25
  244. data/lib/blacklight/search_state/pivot_filter_field.rb +144 -0
  245. data/lib/blacklight/search_state.rb +23 -79
  246. data/lib/blacklight/solr/document.rb +1 -0
  247. data/lib/blacklight/solr/facet_paginator.rb +1 -0
  248. data/lib/blacklight/solr/repository.rb +1 -0
  249. data/lib/blacklight/solr/request.rb +3 -0
  250. data/lib/blacklight/solr/response/facets.rb +21 -5
  251. data/lib/blacklight/solr/response/group.rb +1 -0
  252. data/lib/blacklight/solr/response/group_response.rb +1 -0
  253. data/lib/blacklight/solr/response/more_like_this.rb +1 -0
  254. data/lib/blacklight/solr/response/pagination_methods.rb +4 -3
  255. data/lib/blacklight/solr/response/params.rb +5 -4
  256. data/lib/blacklight/solr/response/response.rb +1 -0
  257. data/lib/blacklight/solr/response/spelling.rb +1 -0
  258. data/lib/blacklight/solr/response.rb +4 -3
  259. data/lib/blacklight/solr/search_builder_behavior.rb +16 -32
  260. data/lib/blacklight/solr.rb +1 -0
  261. data/lib/blacklight/version.rb +1 -0
  262. data/lib/blacklight.rb +8 -11
  263. data/lib/generators/blacklight/assets/importmap_generator.rb +56 -0
  264. data/lib/generators/blacklight/assets/propshaft_generator.rb +34 -0
  265. data/lib/generators/blacklight/assets/sprockets_generator.rb +68 -0
  266. data/lib/generators/blacklight/assets_generator.rb +14 -88
  267. data/lib/generators/blacklight/controller_generator.rb +3 -2
  268. data/lib/generators/blacklight/document_generator.rb +1 -0
  269. data/lib/generators/blacklight/install_generator.rb +7 -4
  270. data/lib/generators/blacklight/models_generator.rb +1 -0
  271. data/lib/generators/blacklight/search_builder_generator.rb +1 -0
  272. data/lib/generators/blacklight/solr_generator.rb +1 -1
  273. data/lib/generators/blacklight/templates/catalog_controller.rb +37 -7
  274. data/lib/generators/blacklight/templates/solr_document.rb +1 -7
  275. data/lib/generators/blacklight/test_support_generator.rb +4 -2
  276. data/lib/generators/blacklight/user_generator.rb +7 -9
  277. data/lib/railties/blacklight.rake +2 -3
  278. data/package.json +10 -10
  279. data/rollup.config.js +37 -0
  280. data/spec/components/blacklight/constraints_component_spec.rb +17 -13
  281. data/spec/components/blacklight/document_component_spec.rb +74 -33
  282. data/spec/components/blacklight/facet_component_spec.rb +2 -7
  283. data/spec/components/blacklight/facet_field_checkboxes_component_spec.rb +1 -2
  284. data/spec/components/blacklight/facet_field_list_component_spec.rb +7 -6
  285. data/spec/components/blacklight/facet_item_pivot_component_spec.rb +9 -7
  286. data/spec/components/blacklight/header_component_spec.rb +20 -0
  287. data/spec/components/blacklight/response/view_type_component_spec.rb +83 -0
  288. data/spec/components/blacklight/search_bar_component_spec.rb +1 -1
  289. data/spec/components/blacklight/search_context/server_applied_params_component_spec.rb +29 -0
  290. data/spec/components/blacklight/search_context/server_item_pagination_component_spec.rb +51 -0
  291. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +1 -6
  292. data/spec/controllers/blacklight/{base_spec.rb → catalog_spec.rb} +2 -2
  293. data/spec/controllers/bookmarks_controller_spec.rb +2 -3
  294. data/spec/controllers/catalog_controller_spec.rb +24 -126
  295. data/spec/features/autocomplete_spec.rb +1 -1
  296. data/spec/features/axe_spec.rb +1 -1
  297. data/spec/features/bookmarks_spec.rb +1 -1
  298. data/spec/features/component_template_override_spec.rb +8 -0
  299. data/spec/features/facets_spec.rb +1 -1
  300. data/spec/features/modal_spec.rb +12 -0
  301. data/spec/features/search_context_spec.rb +4 -10
  302. data/spec/features/search_results_spec.rb +0 -33
  303. data/spec/features/sitelinks_search_box_spec.rb +13 -0
  304. data/spec/helpers/blacklight/configuration_helper_behavior_spec.rb +2 -138
  305. data/spec/helpers/blacklight/facets_helper_behavior_spec.rb +0 -387
  306. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  307. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +5 -7
  308. data/spec/helpers/blacklight/url_helper_behavior_spec.rb +10 -132
  309. data/spec/helpers/blacklight_helper_spec.rb +3 -298
  310. data/spec/helpers/catalog_helper_spec.rb +60 -115
  311. data/spec/i18n_spec.rb +1 -0
  312. data/spec/integration/generators/blacklight/solr_generator_spec.rb +1 -1
  313. data/spec/lib/blacklight/configuration/facet_field_spec.rb +27 -16
  314. data/spec/lib/blacklight/configuration/field_spec.rb +1 -1
  315. data/spec/lib/blacklight/configuration/session_tracking_config_spec.rb +38 -0
  316. data/spec/lib/blacklight/configuration/view_config_spec.rb +1 -1
  317. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +4 -4
  318. data/spec/lib/blacklight/parameters_spec.rb +1 -4
  319. data/spec/lib/blacklight/search_state/filter_field_spec.rb +4 -4
  320. data/spec/lib/blacklight/search_state/pivot_filter_field_spec.rb +117 -0
  321. data/spec/lib/blacklight/search_state_spec.rb +80 -198
  322. data/spec/lib/tasks/blacklight_task_spec.rb +1 -0
  323. data/spec/models/blacklight/configuration_spec.rb +41 -53
  324. data/spec/models/blacklight/document/active_model_shim_spec.rb +2 -2
  325. data/spec/models/blacklight/icon_spec.rb +29 -15
  326. data/spec/models/blacklight/search_builder_spec.rb +12 -12
  327. data/spec/models/blacklight/solr/document_spec.rb +3 -3
  328. data/spec/models/blacklight/solr/request_spec.rb +2 -2
  329. data/spec/models/blacklight/solr/response/facets_spec.rb +27 -27
  330. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -0
  331. data/spec/models/blacklight/solr/response/group_spec.rb +1 -0
  332. data/spec/models/blacklight/solr/response_spec.rb +9 -2
  333. data/spec/models/blacklight/solr/search_builder_spec.rb +32 -23
  334. data/spec/models/blacklight/user_spec.rb +22 -0
  335. data/spec/models/record_mailer_spec.rb +36 -23
  336. data/spec/models/solr_document_spec.rb +21 -3
  337. data/spec/presenters/blacklight/clause_presenter_spec.rb +1 -0
  338. data/spec/presenters/blacklight/document_presenter_spec.rb +3 -2
  339. data/spec/presenters/blacklight/facet_field_presenter_spec.rb +85 -12
  340. data/spec/presenters/blacklight/facet_grouped_item_presenter_spec.rb +1 -0
  341. data/spec/presenters/blacklight/facet_item_presenter_spec.rb +14 -13
  342. data/spec/presenters/blacklight/field_presenter_spec.rb +2 -16
  343. data/spec/presenters/blacklight/index_presenter_spec.rb +3 -4
  344. data/spec/presenters/blacklight/json_presenter_spec.rb +1 -0
  345. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -2
  346. data/spec/presenters/blacklight/show_presenter_spec.rb +11 -25
  347. data/spec/presenters/pipeline_spec.rb +13 -2
  348. data/spec/presenters/thumbnail_presenter_spec.rb +1 -1
  349. data/spec/requests/load_suggestions_spec.rb +16 -0
  350. data/spec/routing/catalog_routing_spec.rb +6 -1
  351. data/spec/services/blacklight/search_service_spec.rb +31 -68
  352. data/spec/spec_helper.rb +4 -3
  353. data/spec/support/controller_level_helpers.rb +1 -2
  354. data/spec/support/features/search_helpers.rb +39 -0
  355. data/spec/support/features/session_helpers.rb +1 -0
  356. data/spec/support/features.rb +3 -0
  357. data/spec/support/view_component_test_helpers.rb +21 -0
  358. data/spec/test_app_templates/Gemfile.extra +4 -0
  359. data/spec/test_app_templates/lib/generators/test_app_generator.rb +17 -2
  360. data/spec/views/catalog/_document.html.erb_spec.rb +23 -33
  361. data/spec/views/catalog/_document_list.html.erb_spec.rb +7 -2
  362. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  363. data/spec/views/catalog/_search_header.erb_spec.rb +1 -0
  364. data/spec/views/catalog/_show_sidebar.erb_spec.rb +1 -0
  365. data/spec/views/catalog/_show_tools.html.erb_spec.rb +7 -54
  366. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +17 -9
  367. data/spec/views/catalog/email_success.html.erb_spec.rb +2 -2
  368. data/spec/views/catalog/facet.html.erb_spec.rb +6 -3
  369. data/spec/views/catalog/index.atom.builder_spec.rb +18 -11
  370. data/spec/views/catalog/index.html.erb_spec.rb +5 -6
  371. data/spec/views/catalog/index.json.jbuilder_spec.rb +3 -3
  372. data/spec/views/catalog/show.html.erb_spec.rb +3 -25
  373. data/spec/views/catalog/sms_success.html.erb_spec.rb +2 -2
  374. data/tasks/blacklight.rake +7 -5
  375. metadata +95 -123
  376. data/.babelrc +0 -11
  377. data/app/assets/images/blacklight/list.svg +0 -1
  378. data/app/assets/images/blacklight/search.svg +0 -1
  379. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +0 -37
  380. data/app/components/blacklight/content_areas_shim.rb +0 -13
  381. data/app/components/blacklight/search_context_component.rb +0 -34
  382. data/app/controllers/concerns/blacklight/base.rb +0 -7
  383. data/app/controllers/concerns/blacklight/default_component_configuration.rb +0 -64
  384. data/app/controllers/concerns/blacklight/facet.rb +0 -69
  385. data/app/controllers/concerns/blacklight/search_fields.rb +0 -46
  386. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +0 -27
  387. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +0 -188
  388. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +0 -97
  389. data/app/helpers/blacklight/suggest_helper_behavior.rb +0 -13
  390. data/app/javascript/blacklight/autocomplete.js +0 -36
  391. data/app/javascript/blacklight/facet_load.js +0 -22
  392. data/app/models/concerns/blacklight/document/email.rb +0 -26
  393. data/app/models/concerns/blacklight/document/sms.rb +0 -24
  394. data/app/presenters/blacklight/search_bar_presenter.rb +0 -47
  395. data/app/views/catalog/_constraints_element.html.erb +0 -14
  396. data/app/views/catalog/_document_action.html.erb +0 -5
  397. data/app/views/catalog/_facet_group.html.erb +0 -5
  398. data/app/views/catalog/_facet_limit.html.erb +0 -3
  399. data/app/views/catalog/_index.html.erb +0 -1
  400. data/app/views/catalog/_index_header.html.erb +0 -22
  401. data/app/views/catalog/_previous_next_doc.html.erb +0 -2
  402. data/app/views/catalog/_show.html.erb +0 -6
  403. data/app/views/catalog/_show_header.html.erb +0 -2
  404. data/app/views/catalog/_thumbnail.html.erb +0 -1
  405. data/lib/blacklight/deprecations/engine_configuration.rb +0 -66
  406. data/lib/blacklight/deprecations/search_state_normalization.rb +0 -52
  407. data/spec/controllers/blacklight/facet_spec.rb +0 -33
  408. data/spec/controllers/blacklight/search_fields_spec.rb +0 -62
  409. data/spec/features/sitelinks_search_box.rb +0 -13
  410. data/spec/helpers/blacklight/hash_as_hidden_fields_behavior_spec.rb +0 -26
  411. data/spec/helpers/blacklight/render_constraints_helper_behavior_spec.rb +0 -92
  412. data/spec/helpers/blacklight/search_history_constraints_helper_behavior_spec.rb +0 -108
  413. data/spec/helpers/blacklight/suggest_helper_behavior_spec.rb +0 -48
  414. data/spec/lib/blacklight/engine_spec.rb +0 -41
  415. data/spec/models/blacklight/document/email_spec.rb +0 -57
  416. data/spec/models/blacklight/document/sms_spec.rb +0 -58
  417. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +0 -94
  418. data/spec/support/view_component_capybara_test_helpers.rb +0 -8
  419. data/spec/views/catalog/_constraints.html.erb_spec.rb +0 -33
  420. data/spec/views/catalog/_facet_group.html.erb_spec.rb +0 -84
  421. data/spec/views/catalog/_facets.html.erb_spec.rb +0 -15
  422. data/spec/views/catalog/_index.html.erb_spec.rb +0 -62
  423. data/spec/views/catalog/_index_header.html.erb_spec.rb +0 -35
  424. data/spec/views/catalog/_previous_next_doc.html.erb_spec.rb +0 -22
  425. data/spec/views/catalog/_show.html.erb_spec.rb +0 -62
  426. data/spec/views/catalog/_thumbnail.html.erb_spec.rb +0 -38
  427. /data/app/components/blacklight/{search_context_component.html.erb → search_context/server_item_pagination_component.html.erb} +0 -0
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # Methods added to this helper will be available to all templates in the hosting
3
4
  # application
4
5
  module Blacklight
@@ -46,5 +47,64 @@ module Blacklight
46
47
  def container_classes
47
48
  'container'
48
49
  end
50
+
51
+ ##
52
+ # Render "document actions" area for navigation header
53
+ # (normally renders "Saved Searches", "History", "Bookmarks")
54
+ # These things are added by add_nav_action
55
+ #
56
+ # @param [Hash] options
57
+ # @return [String]
58
+ def render_nav_actions(options = {}, &block)
59
+ render_filtered_partials(blacklight_config.navbar.partials, options, &block)
60
+ end
61
+
62
+ ##
63
+ # Open Search discovery tag for HTML <head> links
64
+ # @return [String]
65
+ def opensearch_description_tag title, href
66
+ tag :link, href: href, title: title, type: "application/opensearchdescription+xml", rel: "search"
67
+ end
68
+
69
+ ##
70
+ # Get the page's HTML title
71
+ #
72
+ # @return [String]
73
+ def render_page_title
74
+ (content_for(:page_title) if content_for?(:page_title)) || @page_title || application_name
75
+ end
76
+
77
+ ##
78
+ # Create <link rel="alternate"> links from a documents dynamically
79
+ # provided export formats.
80
+ #
81
+ # Returns empty string if no links available.
82
+ #
83
+ # @param [SolrDocument] document
84
+ # @param [Hash] options
85
+ # @option options [Boolean] :unique ensures only one link is output for every
86
+ # content type, e.g. as required by atom
87
+ # @option options [Array<String>] :exclude array of format shortnames to not include in the output
88
+ # @return [String]
89
+ def render_link_rel_alternates(document = @document, options = {})
90
+ return if document.nil?
91
+
92
+ document_presenter(document).link_rel_alternates(options)
93
+ end
94
+
95
+ ##
96
+ # Render classes for the <body> element
97
+ # @return [String]
98
+ def render_body_class
99
+ extra_body_classes.join " "
100
+ end
101
+
102
+ ##
103
+ # List of classes to be applied to the <body> element
104
+ # @see render_body_class
105
+ # @return [Array<String>]
106
+ def extra_body_classes
107
+ @extra_body_classes ||= ["blacklight-#{controller.controller_name}", "blacklight-#{[controller.controller_name, controller.action_name].join('-')}"]
108
+ end
49
109
  end
50
110
  end
@@ -1,28 +1,16 @@
1
1
  # frozen_string_literal: true
2
- module Blacklight::RenderPartialsHelperBehavior
3
- extend Deprecation
4
2
 
3
+ module Blacklight::RenderPartialsHelperBehavior
5
4
  ##
6
5
  # Render the document index view
7
6
  #
8
7
  # @param [Array<SolrDocument>] documents list of documents to render
9
8
  # @param [Hash] locals to pass to the render call
10
9
  # @return [String]
11
- def render_document_index documents = nil, locals = {}
12
- unless documents
13
- Deprecation.warn(self, "Calling render_document_index without documents is deprecated and will be removed in version 8")
14
- documents = @response.documents
15
- end
10
+ def render_document_index documents, locals = {}
16
11
  render_document_index_with_view(document_index_view_type, documents, locals)
17
12
  end
18
13
 
19
- ##
20
- # Render the document index for a grouped response
21
- def render_grouped_document_index
22
- render 'catalog/group'
23
- end
24
- deprecation_deprecate render_grouped_document_index: 'Removed without replacement'
25
-
26
14
  ##
27
15
  # Return the list of partials for a given solr document
28
16
  # @param [SolrDocument] doc solr document to render partials for
@@ -34,6 +22,8 @@ module Blacklight::RenderPartialsHelperBehavior
34
22
  render_document_partial(doc, action_name, locals)
35
23
  end, "\n")
36
24
  end
25
+ Blacklight.deprecation.deprecate_methods(self, render_document_partials: 'Replace this call with: "document_component = blacklight_config.view_config(:atom).summary_component
26
+ render document_component.new(presenter: document_presenter(document), component: :div, show: true)"')
37
27
 
38
28
  ##
39
29
  # Return the list of xml for a given solr document. Doesn't safely escape for HTML.
@@ -60,7 +50,7 @@ module Blacklight::RenderPartialsHelperBehavior
60
50
  # @param [String] base_name base name for the partial
61
51
  # @param [Hash] locals local variables to pass through to the partials
62
52
  def render_document_partial(doc, base_name, locals = {})
63
- format = Deprecation.silence(Blacklight::RenderPartialsHelperBehavior) { document_partial_name(doc, base_name) }
53
+ format = document_partial_name(doc, base_name)
64
54
 
65
55
  view_type = document_index_view_type
66
56
  template = cached_view ['show', view_type, base_name, format].join('_') do
@@ -69,6 +59,7 @@ module Blacklight::RenderPartialsHelperBehavior
69
59
  if template
70
60
  template.render(self, locals.merge(document: doc))
71
61
  else
62
+ logger.warn("No template was found for base_name: '#{base_name}', view_type: '#{view_type}' in render_document_partial")
72
63
  ''
73
64
  end
74
65
  end
@@ -118,6 +109,8 @@ module Blacklight::RenderPartialsHelperBehavior
118
109
  ]
119
110
  end
120
111
 
112
+ private
113
+
121
114
  ##
122
115
  # Return a normalized partial name for rendering a single document
123
116
  #
@@ -130,9 +123,6 @@ module Blacklight::RenderPartialsHelperBehavior
130
123
 
131
124
  type_field_to_partial_name(document, display_type)
132
125
  end
133
- deprecation_deprecate document_partial_name: 'Moving to a private method'
134
-
135
- private
136
126
 
137
127
  ##
138
128
  # Return a partial name for rendering a document
@@ -190,21 +180,13 @@ module Blacklight::RenderPartialsHelperBehavior
190
180
  def find_document_index_template_with_view view_type, locals
191
181
  document_index_path_templates.each do |str|
192
182
  partial = format(str, index_view_type: view_type)
183
+ name = partial.split('/').last
184
+ prefix = partial.split('/').first if partial.include?('/')
193
185
  logger&.debug "Looking for document index partial #{partial}"
194
-
195
- template = if Rails::VERSION::MAJOR >= 6
196
- name = partial.split('/').last
197
- prefix = partial.split('/').first if partial.include?('/')
198
-
199
- prefixes = lookup_context.prefixes + [prefix, ""].compact
200
- lookup_context.find_all(name, prefixes, true, locals.keys + [:documents], {}).first
201
- else
202
- lookup_context.find_all(partial, lookup_context.prefixes + [""], true, locals.keys + [:documents], {}).first
203
- end
204
-
186
+ prefixes = lookup_context.prefixes + [prefix, ""].compact
187
+ template = lookup_context.find_all(name, prefixes, true, locals.keys + [:documents], {}).first
205
188
  return template if template
206
189
  end
207
-
208
190
  nil
209
191
  end
210
192
 
@@ -1,15 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  ##
3
4
  # URL helper methods
4
5
  module Blacklight::UrlHelperBehavior
5
- extend Deprecation
6
-
7
- # @deprecated
8
- def url_for_document(doc, options = {})
9
- search_state.url_for_document(doc, options)
10
- end
11
- deprecation_deprecate url_for_document: 'Use SearchState#url_for_document directly'
12
-
13
6
  # Uses the catalog_path route to create a link to the show page for an item.
14
7
  # catalog_path accepts a hash. The solr query params are stored in the session,
15
8
  # so we only need the +counter+ param here. We also need to know if we are viewing to document as part of search results.
@@ -19,9 +12,9 @@ module Blacklight::UrlHelperBehavior
19
12
  # @param opts [Hash] the options to create the link with
20
13
  # @option opts [Number] :counter (nil) the count to set in the session (for paging through a query result)
21
14
  # @example Passing in an image
22
- # link_to_document(doc, '<img src="thumbnail.png">', counter: 3) #=> "<a href=\"catalog/123\" data-tracker-href=\"/catalog/123/track?counter=3&search_id=999\"><img src="thumbnail.png"></a>
15
+ # link_to_document(doc, '<img src="thumbnail.png">', counter: 3) #=> "<a href=\"catalog/123\" data-context-href=\"/catalog/123/track?counter=3&search_id=999\"><img src="thumbnail.png"></a>
23
16
  # @example With the default document link field
24
- # link_to_document(doc, counter: 3) #=> "<a href=\"catalog/123\" data-tracker-href=\"/catalog/123/track?counter=3&search_id=999\">My Title</a>
17
+ # link_to_document(doc, counter: 3) #=> "<a href=\"catalog/123\" data-context-href=\"/catalog/123/track?counter=3&search_id=999\">My Title</a>
25
18
  def link_to_document(doc, field_or_opts = nil, opts = { counter: nil })
26
19
  label = case field_or_opts
27
20
  when NilClass
@@ -29,18 +22,11 @@ module Blacklight::UrlHelperBehavior
29
22
  when Hash
30
23
  opts = field_or_opts
31
24
  document_presenter(doc).heading
32
- when Proc, Symbol
33
- Deprecation.warn(self, "passing a #{field_or_opts.class} to link_to_document is deprecated and will be removed in Blacklight 8")
34
- Deprecation.silence(Blacklight::IndexPresenter) do
35
- index_presenter(doc).label field_or_opts, opts
36
- end
37
25
  else # String
38
26
  field_or_opts
39
27
  end
40
28
 
41
- Deprecation.silence(Blacklight::UrlHelperBehavior) do
42
- link_to label, url_for_document(doc), document_link_params(doc, opts)
43
- end
29
+ link_to label, search_state.url_for_document(doc), document_link_params(doc, opts)
44
30
  end
45
31
 
46
32
  # @private
@@ -49,61 +35,42 @@ module Blacklight::UrlHelperBehavior
49
35
  end
50
36
  private :document_link_params
51
37
 
52
- ##
53
- # Link to the previous document in the current search context
54
- # @deprecated
55
- def link_to_previous_document(previous_document, classes: 'previous', **addl_link_opts)
56
- link_opts = session_tracking_params(previous_document, search_session['counter'].to_i - 1).merge(class: classes, rel: 'prev').merge(addl_link_opts)
57
- link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), url_for_document(previous_document), link_opts do
58
- tag.span raw(t('views.pagination.previous')), class: 'previous'
59
- end
60
- end
61
- deprecation_deprecate link_to_previous_document: 'Moving to Blacklight::SearchContextComponent'
62
-
63
- ##
64
- # Link to the next document in the current search context
65
- # @deprecated
66
- def link_to_next_document(next_document, classes: 'next', **addl_link_opts)
67
- link_opts = session_tracking_params(next_document, search_session['counter'].to_i + 1).merge(class: classes, rel: 'next').merge(addl_link_opts)
68
- link_to_unless next_document.nil?, raw(t('views.pagination.next')), url_for_document(next_document), link_opts do
69
- tag.span raw(t('views.pagination.next')), class: 'next'
70
- end
71
- end
72
- deprecation_deprecate link_to_previous_document: 'Moving to Blacklight::SearchContextComponent'
73
-
74
38
  ##
75
39
  # Attributes for a link that gives a URL we can use to track clicks for the current search session
76
- # @private
77
40
  # @param [SolrDocument] document
78
41
  # @param [Integer] counter
79
42
  # @example
80
43
  # session_tracking_params(SolrDocument.new(id: 123), 7)
81
- # => { data: { :'context-href' => '/catalog/123/track?counter=7&search_id=999' } }
82
- def session_tracking_params document, counter
83
- path = session_tracking_path(document, per_page: params.fetch(:per_page, search_session['per_page']), counter: counter, search_id: current_search_session.try(:id), document_id: document&.id)
84
-
85
- if path.nil?
86
- return {}
44
+ # => { data: { context_href: '/catalog/123/track?counter=7&search_id=999' } }
45
+ def session_tracking_params document, counter, per_page: search_session['per_page'], search_id: current_search_session&.id
46
+ path_params = { per_page: params.fetch(:per_page, per_page), counter: counter, search_id: search_id }
47
+ if blacklight_config.track_search_session.storage == 'server'
48
+ path_params[:document_id] = document&.id
49
+ path_params[:search_id] = search_id
87
50
  end
51
+ path = session_tracking_path(document, path_params)
52
+ return {} if path.nil?
88
53
 
89
- { data: { 'context-href': path } }
54
+ context_method = blacklight_config.track_search_session.storage == 'client' ? 'get' : 'post'
55
+ { data: { context_href: path, context_method: context_method } }
90
56
  end
91
- private :session_tracking_params
92
57
 
93
58
  ##
94
59
  # Get the URL for tracking search sessions across pages using polymorphic routing
95
60
  def session_tracking_path document, params = {}
96
- return if document.nil? || !blacklight_config&.track_search_session
61
+ return if document.nil? || !blacklight_config.track_search_session.storage
97
62
 
98
63
  if main_app.respond_to?(controller_tracking_method)
99
64
  return main_app.public_send(controller_tracking_method, params.merge(id: document))
100
65
  end
101
66
 
102
67
  raise "Unable to find #{controller_tracking_method} route helper. " \
103
- "Did you add `concerns :searchable` routing mixin to your `config/routes.rb`?"
68
+ "Did you add `concerns :searchable` routing mixin to your `config/routes.rb`?"
104
69
  end
105
70
 
106
71
  def controller_tracking_method
72
+ return blacklight_config.track_search_session.url_helper if blacklight_config.track_search_session.url_helper
73
+
107
74
  "track_#{controller_name}_path"
108
75
  end
109
76
 
@@ -111,28 +78,6 @@ module Blacklight::UrlHelperBehavior
111
78
  # link based helpers ->
112
79
  #
113
80
 
114
- # create link to query (e.g. spelling suggestion)
115
- # @deprecated
116
- def link_to_query(query)
117
- p = search_state.to_h.except(:page, :action)
118
- p[:q] = query
119
- link_to(query, search_action_path(p))
120
- end
121
- deprecation_deprecate link_to_query: 'Removed without replacement'
122
-
123
- ##
124
- # Get the path to the search action with any parameters (e.g. view type)
125
- # that should be persisted across search sessions.
126
- # @deprecated
127
- def start_over_path query_params = params
128
- h = {}
129
- current_index_view_type = document_index_view_type(query_params)
130
- h[:view] = current_index_view_type unless current_index_view_type == default_document_index_view_type
131
-
132
- search_action_path(h)
133
- end
134
- deprecation_deprecate start_over_path: 'Removed without replacement'
135
-
136
81
  # Create a link back to the index screen, keeping the user's facet, query and paging choices intact by using session.
137
82
  # @example
138
83
  # link_back_to_catalog(label: 'Back to Search')
@@ -165,30 +110,9 @@ module Blacklight::UrlHelperBehavior
165
110
  link_to label, link_url, opts
166
111
  end
167
112
 
168
- # Search History and Saved Searches display
113
+ # Use in e.g. the search history display, where we want something more like text instead of the normal constraints
169
114
  def link_to_previous_search(params)
170
- Deprecation.silence(Blacklight::SearchHistoryConstraintsHelperBehavior) do
171
- link_to(render_search_to_s(params), search_action_path(params))
172
- end
173
- end
174
-
175
- # Get url parameters to a search within a grouped result set
176
- #
177
- # @deprecated
178
- # @param [Blacklight::Solr::Response::Group] group
179
- # @return [Hash]
180
- def add_group_facet_params_and_redirect group
181
- search_state.add_facet_params_and_redirect(group.field, group.key)
182
- end
183
- deprecation_deprecate add_group_facet_params_and_redirect: 'Removed without replacement'
184
-
185
- # A URL to refworks export, with an embedded callback URL to this app.
186
- # the callback URL is to bookmarks#export, which delivers a list of
187
- # user's bookmarks in 'refworks marc txt' format -- we tell refworks
188
- # to expect that format.
189
- # @deprecated
190
- def bookmarks_export_url(format, params = {})
191
- bookmarks_url(params.merge(format: format, encrypted_user_id: encrypt_user_id(current_or_guest_user.id)))
115
+ search_state = controller.search_state_class.new(params, blacklight_config, self)
116
+ link_to(render(Blacklight::ConstraintsComponent.for_search_history(search_state: search_state)), search_action_path(params))
192
117
  end
193
- deprecation_deprecate bookmarks_export_url: 'Removed without replacement'
194
118
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module BlacklightHelper
3
4
  include Blacklight::BlacklightHelperBehavior
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module CatalogHelper
3
4
  include Blacklight::CatalogHelperBehavior
4
5
  end
@@ -1,25 +1,12 @@
1
- (function($) {
2
- //change form submit toggle to checkbox
3
- Blacklight.doBookmarkToggleBehavior = function() {
4
- if (typeof Blacklight.do_bookmark_toggle_behavior == 'function') {
5
- console.warn("do_bookmark_toggle_behavior is deprecated. Use doBookmarkToggleBehavior instead.");
6
- return Blacklight.do_bookmark_toggle_behavior();
7
- }
8
- $(Blacklight.doBookmarkToggleBehavior.selector).blCheckboxSubmit({
9
- // cssClass is added to elements added, plus used for id base
10
- cssClass: 'toggle-bookmark',
11
- success: function(checked, response) {
12
- if (response.bookmarks) {
13
- $('[data-role=bookmark-counter]').text(response.bookmarks.count);
14
- }
15
- }
16
- });
17
- };
18
- Blacklight.doBookmarkToggleBehavior.selector = 'form.bookmark-toggle';
1
+ import CheckboxSubmit from 'blacklight/checkbox_submit'
19
2
 
20
- Blacklight.onLoad(function() {
21
- Blacklight.doBookmarkToggleBehavior();
22
- });
3
+ const BookmarkToggle = (e) => {
4
+ if (e.target.matches('[data-checkboxsubmit-target="checkbox"]')) {
5
+ const form = e.target.closest('form')
6
+ if (form) new CheckboxSubmit(form).clicked(e);
7
+ }
8
+ };
23
9
 
10
+ document.addEventListener('click', BookmarkToggle);
24
11
 
25
- })(jQuery);
12
+ export default BookmarkToggle
@@ -1,10 +1,12 @@
1
- Blacklight.onLoad(function() {
1
+ const ButtonFocus = (e) => {
2
2
  // Button clicks should change focus. As of 10/3/19, Firefox for Mac and
3
3
  // Safari both do not set focus to a button on button click.
4
4
  // See https://zellwk.com/blog/inconsistent-button-behavior/ for background information
5
- document.querySelectorAll('button.collapse-toggle').forEach((button) => {
6
- button.addEventListener('click', () => {
7
- event.target.focus();
8
- });
9
- });
10
- });
5
+ if (e.target.matches('[data-toggle="collapse"]') || e.target.matches('[data-bs-toggle="collapse"]')) {
6
+ e.target.focus()
7
+ }
8
+ }
9
+
10
+ document.addEventListener('click', ButtonFocus)
11
+
12
+ export default ButtonFocus
@@ -1,134 +1,80 @@
1
- /* A JQuery plugin (should this be implemented as a widget instead? not sure)
2
- that will convert a "toggle" form, with single submit button to add/remove
1
+ /* Converts a "toggle" form, with single submit button to add/remove
3
2
  something, like used for Bookmarks, into an AJAXy checkbox instead.
4
-
5
3
  Apply to a form. Does require certain assumption about the form:
6
4
  1) The same form 'action' href must be used for both ADD and REMOVE
7
5
  actions, with the different being the hidden input name="_method"
8
6
  being set to "put" or "delete" -- that's the Rails method to pretend
9
7
  to be doing a certain HTTP verb. So same URL, PUT to add, DELETE
10
8
  to remove. This plugin assumes that.
11
-
12
9
  Plus, the form this is applied to should provide a data-doc-id
13
10
  attribute (HTML5-style doc-*) that contains the id/primary key
14
11
  of the object in question -- used by plugin for a unique value for
15
12
  DOM id's.
16
-
17
- Uses HTML for a checkbox compatible with Bootstrap 3.
18
-
19
- Pass in options for your class name and labels:
20
- $("form.something").blCheckboxSubmit({
21
- //cssClass is added to elements added, plus used for id base
22
- cssClass: "toggle_my_kinda_form",
23
- error: function() {
24
- #optional callback
25
- },
26
- success: function(after_success_check_state) {
27
- #optional callback
28
- }
29
- });
13
+ Uses HTML for a checkbox compatible with Bootstrap 4.
14
+ new CheckboxSubmit(document.querySelector('form.something')).render()
30
15
  */
31
- (function($) {
32
- $.fn.blCheckboxSubmit = function(argOpts) {
33
- this.each(function() {
34
- var options = $.extend({}, $.fn.blCheckboxSubmit.defaults, argOpts);
35
-
36
-
37
- var form = $(this);
38
- form.children().hide();
39
- //We're going to use the existing form to actually send our add/removes
40
- //This works conveneintly because the exact same action href is used
41
- //for both bookmarks/$doc_id. But let's take out the irrelevant parts
42
- //of the form to avoid any future confusion.
43
- form.find('input[type=submit]').remove();
44
-
45
- //View needs to set data-doc-id so we know a unique value
46
- //for making DOM id
47
- var uniqueId = form.attr('data-doc-id') || Math.random();
48
- // if form is currently using method delete to change state,
49
- // then checkbox is currently checked
50
- var checked = (form.find('input[name=_method][value=delete]').length != 0);
51
-
52
- var checkbox = $('<input type="checkbox">')
53
- .addClass( options.cssClass )
54
- .attr('id', options.cssClass + '_' + uniqueId);
55
- var label = $('<label>')
56
- .addClass( options.cssClass )
57
- .attr('for', options.cssClass + '_' + uniqueId)
58
- .attr('title', form.attr('title') || '');
59
- var span = $('<span>');
60
-
61
- label.append(checkbox);
62
- label.append(' ');
63
- label.append(span);
64
-
65
- var checkboxDiv = $('<div class="checkbox" />')
66
- .addClass(options.cssClass)
67
- .append(label);
68
-
69
- function updateStateFor(state) {
70
- checkbox.prop('checked', state);
71
- label.toggleClass('checked', state);
72
- if (state) {
73
- //Set the Rails hidden field that fakes an HTTP verb
74
- //properly for current state action.
75
- form.find('input[name=_method]').val('delete');
76
- span.html(form.attr('data-present'));
77
- } else {
78
- form.find('input[name=_method]').val('put');
79
- span.html(form.attr('data-absent'));
80
- }
81
- }
82
-
83
- form.append(checkboxDiv);
84
- updateStateFor(checked);
85
-
86
- checkbox.click(function() {
87
- span.html(form.attr('data-inprogress'));
88
- label.attr('disabled', 'disabled');
89
- checkbox.attr('disabled', 'disabled');
90
-
91
- $.ajax({
92
- url: form.attr('action'),
93
- dataType: 'json',
94
- type: form.attr('method').toUpperCase(),
95
- data: form.serialize(),
96
- error: function() {
97
- label.removeAttr('disabled');
98
- checkbox.removeAttr('disabled');
99
- options.error.call();
100
- },
101
- success: function(data, status, xhr) {
102
- //if app isn't running at all, xhr annoyingly
103
- //reports success with status 0.
104
- if (xhr.status != 0) {
105
- checked = ! checked;
106
- updateStateFor(checked);
107
- label.removeAttr('disabled');
108
- checkbox.removeAttr('disabled');
109
- options.success.call(form, checked, xhr.responseJSON);
110
- } else {
111
- label.removeAttr('disabled');
112
- checkbox.removeAttr('disabled');
113
- options.error.call();
114
- }
115
- }
116
- });
117
-
118
- return false;
119
- }); //checkbox.click
120
-
121
-
122
- }); //this.each
123
- return this;
124
- };
125
-
126
- $.fn.blCheckboxSubmit.defaults = {
127
- //cssClass is added to elements added, plus used for id base
128
- cssClass: 'blCheckboxSubmit',
129
- error: function() {
130
- alert("Error");
131
- },
132
- success: function() {} //callback
133
- };
134
- })(jQuery);
16
+ export default class CheckboxSubmit {
17
+ constructor(form) {
18
+ this.form = form
19
+ }
20
+
21
+ async clicked(evt) {
22
+ this.spanTarget.innerHTML = this.form.getAttribute('data-inprogress')
23
+ this.labelTarget.setAttribute('disabled', 'disabled');
24
+ this.checkboxTarget.setAttribute('disabled', 'disabled');
25
+ const response = await fetch(this.formTarget.getAttribute('action'), {
26
+ body: new FormData(this.formTarget),
27
+ method: this.formTarget.getAttribute('method').toUpperCase(),
28
+ headers: {
29
+ 'Accept': 'application/json',
30
+ 'X-Requested-With': 'XMLHttpRequest',
31
+ 'X-CSRF-Token': document.querySelector('meta[name=csrf-token]')?.content
32
+ }
33
+ })
34
+ this.labelTarget.removeAttribute('disabled')
35
+ this.checkboxTarget.removeAttribute('disabled')
36
+ if (response.ok) {
37
+ const json = await response.json()
38
+ this.updateStateFor(!this.checked)
39
+ document.querySelector('[data-role=bookmark-counter]').innerHTML = json.bookmarks.count
40
+ } else {
41
+ alert('Error')
42
+ }
43
+ }
44
+
45
+ get checked() {
46
+ return (this.form.querySelectorAll('input[name=_method][value=delete]').length != 0)
47
+ }
48
+
49
+ get formTarget() {
50
+ return this.form
51
+ }
52
+
53
+ get labelTarget() {
54
+ return this.form.querySelector('[data-checkboxsubmit-target="label"]')
55
+ }
56
+
57
+ get checkboxTarget() {
58
+ return this.form.querySelector('[data-checkboxsubmit-target="checkbox"]')
59
+ }
60
+
61
+ get spanTarget() {
62
+ return this.form.querySelector('[data-checkboxsubmit-target="span"]')
63
+ }
64
+
65
+ updateStateFor(state) {
66
+ this.checkboxTarget.checked = state
67
+
68
+ if (state) {
69
+ this.labelTarget.classList.add('checked')
70
+ //Set the Rails hidden field that fakes an HTTP verb
71
+ //properly for current state action.
72
+ this.formTarget.querySelector('input[name=_method]').value = 'delete'
73
+ this.spanTarget.innerHTML = this.form.getAttribute('data-present')
74
+ } else {
75
+ this.labelTarget.classList.remove('checked')
76
+ this.formTarget.querySelector('input[name=_method]').value = 'put'
77
+ this.spanTarget.innerHTML = this.form.getAttribute('data-absent')
78
+ }
79
+ }
80
+ }
@@ -1,20 +1,20 @@
1
1
  const Blacklight = function() {
2
- var buffer = new Array;
2
+ const buffer = new Array;
3
3
  return {
4
4
  onLoad: function(func) {
5
5
  buffer.push(func);
6
6
  },
7
7
 
8
8
  activate: function() {
9
- for(var i = 0; i < buffer.length; i++) {
9
+ for(let i = 0; i < buffer.length; i++) {
10
10
  buffer[i].call();
11
11
  }
12
12
  },
13
13
 
14
14
  listeners: function () {
15
- var listeners = [];
15
+ const listeners = [];
16
16
  if (typeof Turbo !== 'undefined') {
17
- listeners.push('turbo:load');
17
+ listeners.push('turbo:load', 'turbo:frame-load');
18
18
  } else if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
19
19
  // Turbolinks 5
20
20
  if (Turbolinks.BrowserAdapter) {
@@ -51,4 +51,5 @@ Blacklight.onLoad(function () {
51
51
  elem.classList.add('js')
52
52
  })
53
53
 
54
- window.Blacklight = Blacklight
54
+
55
+ export default Blacklight