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
@@ -23,12 +23,6 @@
23
23
  of the container will be placed inside the modal, the rest of the
24
24
  page will be ignored.
25
25
 
26
- If you'd like to have a link or button that closes the modal,
27
- you can just add a `data-dismiss="modal"` to the link,
28
- standard Bootstrap convention. But you can also have
29
- an href on this link for non-JS contexts, we'll make sure
30
- inside the modal it closes the modal and the link is NOT followed.
31
-
32
26
  Link or forms inside the modal will ordinarily cause page loads
33
27
  when they are triggered. However, if you'd like their results
34
28
  to stay within the modal, just add `data-blacklight-modal="preserve"`
@@ -49,178 +43,119 @@
49
43
 
50
44
 
51
45
  <div class="modal-footer">
52
- <%= link_to "Close the modal", request_done_path, class: "submit button dialog-close", data: { dismiss: "modal" } %>
46
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
53
47
  </div>
54
48
  </div>
55
49
 
56
50
 
57
- One additional feature. If the content returned from the AJAX modal load
58
- has an element with `data-blacklight-modal=close`, that will trigger the modal
59
- to be closed. And if this element includes a node with class "flash_messages",
60
- the flash-messages node will be added to the main page inside #main-flahses.
51
+ One additional feature. If the content returned from the AJAX form submission
52
+ can be a turbo-stream that defines some HTML fragementsand where on the page to put them:
53
+ https://turbo.hotwired.dev/handbook/streams
54
+ */
55
+ import Blacklight from './core'
56
+ import ModalForm from './modalForm'
57
+
58
+ const Modal = (() => {
59
+ // We keep all our data in Blacklight.modal object.
60
+ // Create lazily if someone else created first.
61
+ if (Blacklight.modal === undefined) {
62
+ Blacklight.modal = {};
63
+ }
61
64
 
62
- == Events
65
+ const modal = Blacklight.modal
66
+
67
+ // a Bootstrap modal div that should be already on the page hidden
68
+ modal.modalSelector = '#blacklight-modal';
69
+
70
+ // Trigger selectors identify forms or hyperlinks that should open
71
+ // inside a modal dialog.
72
+ modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';
73
+
74
+ // preserve selectors identify forms or hyperlinks that, if activated already
75
+ // inside a modal dialog, should have destinations remain inside the modal -- but
76
+ // won't trigger a modal if not already in one.
77
+ //
78
+ // No need to repeat selectors from trigger selectors, those will already
79
+ // be preserved. MUST be manually prefixed with the modal selector,
80
+ // so they only apply to things inside a modal.
81
+ modal.preserveLinkSelector = modal.modalSelector + ' a[data-blacklight-modal~=preserve]';
82
+
83
+ modal.containerSelector = '[data-blacklight-modal~=container]';
84
+
85
+ // Called on fatal failure of ajax load, function returns content
86
+ // to show to user in modal. Right now called only for extreme
87
+ // network errors.
88
+ modal.onFailure = function (jqXHR, textStatus, errorThrown) {
89
+ console.error('Server error:', this.url, jqXHR.status, errorThrown);
90
+
91
+ const contents = `<div class="modal-header">
92
+ <div class="modal-title">There was a problem with your request.</div>
93
+ <button type="button" class="blacklight-modal-close btn-close close" data-dismiss="modal" data-bs-dismiss="modal" aria-label="Close">
94
+ <span aria-hidden="true">&times;</span>
95
+ </button>
96
+ </div>
97
+ <div class="modal-body">
98
+ <p>Expected a successful response from the server, but got an error</p>
99
+ <pre>${this.type} ${this.url}\n${jqXHR.status}: ${errorThrown}</pre>
100
+ </div>`
101
+
102
+ document.querySelector(`${modal.modalSelector} .modal-content`).innerHTML = contents
103
+
104
+ modal.show();
105
+ }
63
106
 
64
- We'll send out an event 'loaded.blacklight.blacklight-modal' with the #blacklight-modal
65
- dialog as the target, right after content is loaded into the modal but before
66
- it is shown (if not already a shown modal). In an event handler, you can
67
- inspect loaded content by looking inside $(this). If you call event.preventDefault(),
68
- we won't 'show' the dialog (although it may already have been shown, you may want to
69
- $(this).modal("hide") if you want to ensure hidden/closed.
107
+ // Add the passed in contents to the modal and display it.
108
+ modal.receiveAjax = function (contents) {
109
+ const domparser = new DOMParser();
110
+ const dom = domparser.parseFromString(contents, "text/html")
111
+ const elements = dom.querySelectorAll(`${modal.containerSelector} > *`)
112
+ document.querySelector(`${modal.modalSelector} .modal-content`).replaceChildren(...elements)
70
113
 
71
- The data-blacklight-modal=close behavior is implemented with this event, see for example.
72
- */
114
+ modal.show();
115
+ };
73
116
 
74
- // We keep all our data in Blacklight.modal object.
75
- // Create lazily if someone else created first.
76
- if (Blacklight.modal === undefined) {
77
- Blacklight.modal = {};
78
- }
79
-
80
- // a Bootstrap modal div that should be already on the page hidden
81
- Blacklight.modal.modalSelector = '#blacklight-modal';
82
-
83
- // Trigger selectors identify forms or hyperlinks that should open
84
- // inside a modal dialog.
85
- Blacklight.modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';
86
- Blacklight.modal.triggerFormSelector = 'form[data-blacklight-modal~=trigger]';
87
-
88
- // preserve selectors identify forms or hyperlinks that, if activated already
89
- // inside a modal dialog, should have destinations remain inside the modal -- but
90
- // won't trigger a modal if not already in one.
91
- //
92
- // No need to repeat selectors from trigger selectors, those will already
93
- // be preserved. MUST be manually prefixed with the modal selector,
94
- // so they only apply to things inside a modal.
95
- Blacklight.modal.preserveLinkSelector = Blacklight.modal.modalSelector + ' a[data-blacklight-modal~=preserve]';
96
-
97
- Blacklight.modal.containerSelector = '[data-blacklight-modal~=container]';
98
-
99
- Blacklight.modal.modalCloseSelector = '[data-blacklight-modal~=close]';
100
-
101
- // Called on fatal failure of ajax load, function returns content
102
- // to show to user in modal. Right now called only for extreme
103
- // network errors.
104
- Blacklight.modal.onFailure = function(jqXHR, textStatus, errorThrown) {
105
- console.error('Server error:', this.url, jqXHR.status, errorThrown);
106
-
107
- var contents = '<div class="modal-header">' +
108
- '<div class="modal-title">There was a problem with your request.</div>' +
109
- '<button type="button" class="blacklight-modal-close btn-close close" data-dismiss="modal" aria-label="Close">' +
110
- ' <span aria-hidden="true">&times;</span>' +
111
- '</button></div>' +
112
- ' <div class="modal-body"><p>Expected a successful response from the server, but got an error</p>' +
113
- '<pre>' +
114
- this.type + ' ' + this.url + "\n" + jqXHR.status + ': ' + errorThrown +
115
- '</pre></div>';
116
- $(Blacklight.modal.modalSelector).find('.modal-content').html(contents);
117
- Blacklight.modal.show();
118
- }
119
-
120
- Blacklight.modal.receiveAjax = function (contents) {
121
- // does it have a data- selector for container?
122
- // important we don't execute script tags, we shouldn't.
123
- // code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/main/src/ajax/load.js?source=c#L62
124
- var container = $('<div>').
125
- append( jQuery.parseHTML(contents) ).find( Blacklight.modal.containerSelector ).first();
126
- if (container.length !== 0) {
127
- contents = container.html();
128
- }
129
-
130
- $(Blacklight.modal.modalSelector).find('.modal-content').html(contents);
131
-
132
- // send custom event with the modal dialog div as the target
133
- var e = $.Event('loaded.blacklight.blacklight-modal')
134
- $(Blacklight.modal.modalSelector).trigger(e);
135
- // if they did preventDefault, don't show the dialog
136
- if (e.isDefaultPrevented()) return;
137
-
138
- Blacklight.modal.show();
139
- };
140
-
141
-
142
- Blacklight.modal.modalAjaxLinkClick = function(e) {
143
- e.preventDefault();
144
-
145
- $.ajax({
146
- url: $(this).attr('href')
147
- })
148
- .fail(Blacklight.modal.onFailure)
149
- .done(Blacklight.modal.receiveAjax)
150
- };
151
-
152
- Blacklight.modal.modalAjaxFormSubmit = function(e) {
153
- e.preventDefault();
154
117
 
155
- $.ajax({
156
- url: $(this).attr('action'),
157
- data: $(this).serialize(),
158
- type: $(this).attr('method') // POST
159
- })
160
- .fail(Blacklight.modal.onFailure)
161
- .done(Blacklight.modal.receiveAjax)
162
- }
163
-
164
-
165
-
166
- Blacklight.modal.setupModal = function() {
167
- // Event indicating blacklight is setting up a modal link,
168
- // you can catch it and call e.preventDefault() to abort
169
- // setup.
170
- var e = $.Event('setup.blacklight.blacklight-modal');
171
- $('body').trigger(e);
172
- if (e.isDefaultPrevented()) return;
173
-
174
- // Register both trigger and preserve selectors in ONE event handler, combining
175
- // into one selector with a comma, so if something matches BOTH selectors, it
176
- // still only gets the event handler called once.
177
- $('body').on('click', Blacklight.modal.triggerLinkSelector + ', ' + Blacklight.modal.preserveLinkSelector,
178
- Blacklight.modal.modalAjaxLinkClick);
179
- $('body').on('submit', Blacklight.modal.triggerFormSelector + ', ' + Blacklight.modal.preserveFormSelector,
180
- Blacklight.modal.modalAjaxFormSubmit);
181
-
182
- // Catch our own custom loaded event to implement data-blacklight-modal=closed
183
- $('body').on('loaded.blacklight.blacklight-modal', Blacklight.modal.checkCloseModal);
184
-
185
- // we support doing data-dismiss=modal on a <a> with a href for non-ajax
186
- // use, we need to suppress following the a's href that's there for
187
- // non-JS contexts.
188
- $('body').on('click', Blacklight.modal.modalSelector + ' a[data-dismiss~=modal]', function (e) {
118
+ modal.modalAjaxLinkClick = function(e) {
189
119
  e.preventDefault();
190
- });
191
- };
192
-
193
- // A function used as an event handler on loaded.blacklight.blacklight-modal
194
- // to catch contained data-blacklight-modal=closed directions
195
- Blacklight.modal.checkCloseModal = function(event) {
196
- if ($(event.target).find(Blacklight.modal.modalCloseSelector).length) {
197
- var modalFlashes = $(this).find('.flash_messages');
120
+ const href = e.target.getAttribute('href')
121
+ fetch(href)
122
+ .then(response => {
123
+ if (!response.ok) {
124
+ throw new TypeError("Request failed");
125
+ }
126
+ return response.text();
127
+ })
128
+ .then(data => modal.receiveAjax(data))
129
+ .catch(error => modal.onFailure(error))
130
+ };
131
+
132
+ modal.setupModal = function() {
133
+ // Register both trigger and preserve selectors in ONE event handler, combining
134
+ // into one selector with a comma, so if something matches BOTH selectors, it
135
+ // still only gets the event handler called once.
136
+ document.addEventListener('click', (e) => {
137
+ if (e.target.matches(`${modal.triggerLinkSelector}, ${modal.preserveLinkSelector}`))
138
+ modal.modalAjaxLinkClick(e)
139
+ else if (e.target.matches('[data-bl-dismiss="modal"]'))
140
+ modal.hide()
141
+ })
142
+ };
198
143
 
199
- Blacklight.modal.hide(event.target);
200
- event.preventDefault();
144
+ modal.hide = function (el) {
145
+ const dom = document.querySelector(Blacklight.modal.modalSelector)
201
146
 
202
- var mainFlashes = $('#main-flashes');
203
- mainFlashes.append(modalFlashes);
204
- modalFlashes.fadeIn(500);
147
+ if (!dom.open) return
148
+ dom.close()
205
149
  }
206
- }
207
150
 
208
- Blacklight.modal.hide = function(el) {
209
- if (typeof bootstrap !== 'undefined' && typeof bootstrap.Modal !== 'undefined' && bootstrap.Modal.VERSION >= "5") {
210
- bootstrap.Modal.getOrCreateInstance(el || document.querySelector(Blacklight.modal.modalSelector)).hide();
211
- } else {
212
- $(el || Blacklight.modal.modalSelector).modal('hide');
213
- }
214
- }
151
+ modal.show = function(el) {
152
+ const dom = document.querySelector(Blacklight.modal.modalSelector)
215
153
 
216
- Blacklight.modal.show = function(el) {
217
- if (typeof bootstrap !== 'undefined' && typeof bootstrap.Modal !== 'undefined' && bootstrap.Modal.VERSION >= "5") {
218
- bootstrap.Modal.getOrCreateInstance(el || document.querySelector(Blacklight.modal.modalSelector)).show();
219
- } else {
220
- $(el || Blacklight.modal.modalSelector).modal('show');
154
+ if (dom.open) return
155
+ dom.showModal()
221
156
  }
222
- }
223
157
 
224
- Blacklight.onLoad(function() {
225
- Blacklight.modal.setupModal();
226
- });
158
+ modal.setupModal()
159
+ })()
160
+
161
+ export default Modal
@@ -0,0 +1,60 @@
1
+ // The email and sms forms are displayed inside a modal. When the form is submitted,
2
+ // this script closes the modal and puts the output on the main part of the page.
3
+ // By default it is rendering catalog/sms_success and catalog/email_succcess.
4
+ // These templates deliver a payload of the format used by turbo-streams.
5
+ // See https://turbo.hotwired.dev/handbook/streams
6
+ // That format allows a downstream application to override the template to define
7
+ // multiple customizable areas of the page to get updated.
8
+ export default class {
9
+ constructor(errorHandler, badRequestHandler, hideModal) {
10
+ this.errorHandler = errorHandler
11
+ this.badRequestHandler = badRequestHandler
12
+ this.hideModal = hideModal
13
+ }
14
+
15
+ get triggerFormSelector() {
16
+ return 'form[data-blacklight-modal~=trigger]'
17
+ }
18
+
19
+ bind() {
20
+ document.addEventListener('submit', (e) => {
21
+ if (e.target.matches(this.triggerFormSelector))
22
+ this.onSubmit(e)
23
+ })
24
+ }
25
+
26
+ // This is like a light-weight version of turbo that only supports append presently.
27
+ updateTurboStream(data) {
28
+ this.hideModal()
29
+ const domparser = new DOMParser();
30
+ const dom = domparser.parseFromString(data, "text/html")
31
+ dom.querySelectorAll("turbo-stream[action='append']").forEach((node) => {
32
+ const target = node.getAttribute('target')
33
+ const element = document.getElementById(target)
34
+ if (element)
35
+ element.append(node.querySelector('template').content.cloneNode(true))
36
+ else
37
+ console.error(`Unable to find an element on the page with and ID of "${target}""`)
38
+ })
39
+ }
40
+
41
+ onSubmit(e) {
42
+ e.preventDefault();
43
+ const form = e.target
44
+ fetch(form.action, {
45
+ body: new FormData(form),
46
+ headers: { "X-Requested-With": "XMLHttpRequest" }, // Ensures rails will return true when checking request.xhr?
47
+ method: form.method,
48
+ })
49
+ .then(response => {
50
+ if (response.status === 422) {
51
+ return response.text().then(content => this.badRequestHandler(content) )
52
+ }
53
+ if (!response.ok) {
54
+ throw new TypeError("Request failed");
55
+ }
56
+ response.text().then(content => this.updateTurboStream(content))
57
+ })
58
+ .catch(error => this.errorHandler(error))
59
+ }
60
+ }
@@ -1,67 +1,59 @@
1
- Blacklight.doSearchContextBehavior = function() {
2
- if (typeof Blacklight.do_search_context_behavior == 'function') {
3
- console.warn("do_search_context_behavior is deprecated. Use doSearchContextBehavior instead.");
4
- return Blacklight.do_search_context_behavior();
5
- }
6
-
7
- const elements = document.querySelectorAll('a[data-context-href]')
8
- // Equivalent to Array.from(), but supports ie11
9
- const nodes = Array.prototype.slice.call(elements)
10
-
11
- nodes.forEach(function(element) {
12
- element.addEventListener('click', function(e) {
13
- Blacklight.handleSearchContextMethod.call(e.currentTarget, e)
1
+ import Blacklight from './core'
2
+
3
+ const SearchContext = (() => {
4
+ Blacklight.doSearchContextBehavior = function() {
5
+ document.addEventListener('click', (e) => {
6
+ if (e.target.matches('[data-context-href]')) {
7
+ Blacklight.handleSearchContextMethod.call(e.target, e)
8
+ }
14
9
  })
15
- })
16
- };
10
+ };
17
11
 
18
- // this is the Rails.handleMethod with a couple adjustments, described inline:
19
- // first, we're attaching this directly to the event handler, so we can check for meta-keys
20
- Blacklight.handleSearchContextMethod = function(event) {
21
- if (typeof Blacklight.handle_search_context_method == 'function') {
22
- console.warn("handle_search_context_method is deprecated. Use handleSearchContextMethod instead.");
23
- return Blacklight.handle_search_context_method(event);
24
- }
25
- var link = this
12
+ Blacklight.csrfToken = () => document.querySelector('meta[name=csrf-token]')?.content
13
+ Blacklight.csrfParam = () => document.querySelector('meta[name=csrf-param]')?.content
26
14
 
27
- // instead of using the normal href, we need to use the context href instead
28
- let href = link.getAttribute('data-context-href')
29
- let target = link.getAttribute('target')
30
- let csrfToken = Blacklight.csrfToken()
31
- let csrfParam = Blacklight.csrfParam()
32
- let form = document.createElement('form')
33
- form.method = 'post'
34
- form.action = href
15
+ // this is the Rails.handleMethod with a couple adjustments, described inline:
16
+ // first, we're attaching this directly to the event handler, so we can check for meta-keys
17
+ Blacklight.handleSearchContextMethod = function(event) {
18
+ const link = this
35
19
 
20
+ // instead of using the normal href, we need to use the context href instead
21
+ let href = link.getAttribute('data-context-href')
22
+ let target = link.getAttribute('target')
23
+ let csrfToken = Blacklight.csrfToken()
24
+ let csrfParam = Blacklight.csrfParam()
25
+ let form = document.createElement('form')
26
+ form.method = 'post'
27
+ form.action = href
36
28
 
37
- let formContent = `<input name="_method" value="post" type="hidden" />
38
- <input name="redirect" value="${link.getAttribute('href')}" type="hidden" />`
39
29
 
40
- // check for meta keys.. if set, we should open in a new tab
41
- if(event.metaKey || event.ctrlKey) {
42
- form.dataset.turbo = "false";
43
- target = '_blank';
44
- }
30
+ let formContent = `<input name="_method" value="post" type="hidden" />
31
+ <input name="redirect" value="${link.getAttribute('href')}" type="hidden" />`
45
32
 
46
- if (csrfParam !== undefined && csrfToken !== undefined) {
47
- formContent += `<input name="${csrfParam}" value="${csrfToken}" type="hidden" />`
48
- }
33
+ // check for meta keys.. if set, we should open in a new tab
34
+ if(event.metaKey || event.ctrlKey) {
35
+ target = '_blank';
36
+ }
49
37
 
50
- // Must trigger submit by click on a button, else "submit" event handler won't work!
51
- // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
52
- formContent += '<input type="submit" />'
38
+ if (csrfParam !== undefined && csrfToken !== undefined) {
39
+ formContent += `<input name="${csrfParam}" value="${csrfToken}" type="hidden" />`
40
+ }
53
41
 
54
- if (target) { form.setAttribute('target', target); }
42
+ // Must trigger submit by click on a button, else "submit" event handler won't work!
43
+ // https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit
44
+ formContent += '<input type="submit" />'
55
45
 
56
- form.style.display = 'none'
57
- form.innerHTML = formContent
58
- document.body.appendChild(form)
59
- form.querySelector('[type="submit"]').click()
46
+ if (target) { form.setAttribute('target', target); }
60
47
 
61
- event.preventDefault()
62
- event.stopPropagation()
63
- };
48
+ form.style.display = 'none'
49
+ form.innerHTML = formContent
50
+ document.body.appendChild(form)
51
+ form.querySelector('[type="submit"]').click()
52
+
53
+ event.preventDefault()
54
+ };
64
55
 
65
- Blacklight.onLoad(function() {
66
56
  Blacklight.doSearchContextBehavior();
67
- });
57
+ })()
58
+
59
+ export default SearchContext
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight
3
4
  # Pagination for facet values -- works by setting the limit to max
4
5
  # displayable. You have to ask Solr for limit+1, to get enough
@@ -52,10 +53,10 @@ module Blacklight
52
53
 
53
54
  def current_page
54
55
  # A nil limit is unlimited, thus only one page.
55
- if limit.nil? || limit.zero? #check for divide by zero
56
+ if limit.nil? || limit.zero? # check for divide by zero
56
57
  1
57
58
  else
58
- @offset / limit + 1
59
+ (@offset / limit) + 1
59
60
  end
60
61
  end
61
62
 
@@ -4,6 +4,8 @@ module Blacklight
4
4
  class Icon
5
5
  attr_reader :icon_name, :aria_hidden, :label, :role, :additional_options
6
6
 
7
+ delegate :present?, to: :file
8
+
7
9
  ##
8
10
  # @param [String, Symbol] icon_name
9
11
  # @param [String] classes additional classes separated by a string
@@ -32,7 +34,7 @@ module Blacklight
32
34
  end
33
35
 
34
36
  def icon_label
35
- I18n.translate("blacklight.icon.#{icon_name_context}", default: icon_name.to_s.titleize)
37
+ I18n.t("blacklight.icon.#{icon_name_context}", default: icon_name.to_s.titleize)
36
38
  end
37
39
 
38
40
  ##
@@ -40,7 +42,7 @@ module Blacklight
40
42
  def options
41
43
  {
42
44
  class: classes,
43
- "aria-hidden": (true if aria_hidden)
45
+ 'aria-hidden': (true if aria_hidden)
44
46
  }
45
47
  end
46
48
 
@@ -4,8 +4,6 @@ class Bookmark < ApplicationRecord
4
4
  belongs_to :user, polymorphic: true
5
5
  belongs_to :document, polymorphic: true
6
6
 
7
- validates :user_id, presence: true
8
-
9
7
  def document
10
8
  document_type.new document_type.unique_key => document_id
11
9
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Configurable
3
4
  extend ActiveSupport::Concern
4
5
 
@@ -6,7 +7,7 @@ module Blacklight::Configurable
6
7
  helper_method :blacklight_config if respond_to? :helper_method
7
8
  end
8
9
 
9
- #instance methods for blacklight_config, so get a deep copy of the class-level config
10
+ # instance methods for blacklight_config, so get a deep copy of the class-level config
10
11
  def blacklight_config
11
12
  @blacklight_config ||= self.class.blacklight_config.deep_copy
12
13
  end
@@ -31,9 +32,9 @@ module Blacklight::Configurable
31
32
  end
32
33
  attr_writer :blacklight_config
33
34
 
34
- #simply a convenience method for blacklight_config.configure
35
- def configure_blacklight(*args, &block)
36
- blacklight_config.configure(*args, &block)
35
+ # simply a convenience method for blacklight_config.configure
36
+ def configure_blacklight(...)
37
+ blacklight_config.configure(...)
37
38
  end
38
39
 
39
40
  ##
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'active_model/conversion'
3
4
 
4
5
  module Blacklight::Document
@@ -28,16 +29,6 @@ module Blacklight::Document
28
29
  def find id
29
30
  repository.find(id).documents.first
30
31
  end
31
-
32
- # In Rails 7.1+, needs this method
33
- def composite_primary_key?
34
- false
35
- end
36
-
37
- # In Rails 7.1+, needs this method
38
- def has_query_constraints?
39
- false
40
- end
41
32
  end
42
33
 
43
34
  ##
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This module provides the cache key which can be used by rails
3
4
  # caching to determine when to expire a particular object's cache
4
5
  # See http://apidock.com/rails/ActiveRecord/Integration/cache_key
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'builder'
3
4
 
4
5
  # This module provide Dublin Core export based on the document's semantic values
@@ -26,7 +27,7 @@ module Blacklight::Document::DublinCore
26
27
  'xmlns:dc' => "http://purl.org/dc/elements/1.1/",
27
28
  'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
28
29
  'xsi:schemaLocation' => %(http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd)) do
29
- to_semantic_values.select { |field, _values| dublin_core_field_name? field }.each do |field, values|
30
+ to_semantic_values.select { |field, _values| dublin_core_field_name? field }.each do |field, values|
30
31
  Array.wrap(values).each do |v|
31
32
  xml.tag! "dc:#{field}", v
32
33
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This module provides the body of an email export based on the document's semantic values
3
4
  module Blacklight::Document::Email
4
5
  # Return a text string that will be the body of the email
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # == Transformation conventions
3
4
  # The main use case for extensions is for transforming a Document to another
4
5
  # format. Either to another type of Ruby object, or to an exportable string in
@@ -55,7 +56,7 @@ module Blacklight::Document::Export
55
56
  # register it using Mime::Type.register_alias if it's not previously
56
57
  # registered. This is a bit sketchy though.
57
58
  def will_export_as(short_name, content_type = nil)
58
- #Lookup in Rails Mime::Type, register if needed, otherwise take
59
+ # Lookup in Rails Mime::Type, register if needed, otherwise take
59
60
  # content-type from registration if needed.
60
61
  if defined?(Mime) && Mime[short_name.to_sym]
61
62
  content_type ||= Mime[short_name.to_sym]
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # = Document Extensions
3
4
  # An Blacklight::Document extension is simply a ruby module which is mixed
4
5
  # in to individual Document instances. The intended use case is for documents
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Document::SchemaOrg
3
4
  def itemtype
4
5
  "http://schema.org/Thing"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Blacklight::Document
3
4
  module SemanticFields
4
5
  extend ActiveSupport::Concern
@@ -30,7 +31,7 @@ module Blacklight::Document
30
31
  # but extensions should call super and modify hash returned, to avoid
31
32
  # unintentionally erasing values provided by other extensions.
32
33
  def to_semantic_values
33
- @semantic_value_hash ||= self.class.field_semantics.each_with_object(Hash.new { |hash, key| hash[key] = [] }) do |(key, field_names), hash|
34
+ @semantic_value_hash ||= self.class.field_semantics.each_with_object(Hash.new([])) do |(key, field_names), hash|
34
35
  ##
35
36
  # Handles single string field_name or an array of field_names
36
37
  value = Array.wrap(field_names).map { |field_name| self[field_name] }.flatten.compact
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This module provides the body of an email export based on the document's semantic values
3
4
  module Blacklight::Document::Sms
4
5
  # Return a text string that will be the body of the email