blacklight 6.14.0 → 7.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 (422) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.npmignore +23 -0
  4. data/.rubocop.yml +40 -16
  5. data/.rubocop_todo.yml +479 -375
  6. data/.solr_wrapper.yml +9 -2
  7. data/.travis.yml +27 -20
  8. data/Gemfile +3 -1
  9. data/README.md +22 -5
  10. data/Rakefile +3 -2
  11. data/VERSION +1 -1
  12. data/Vagrantfile +2 -0
  13. data/app/assets/images/blacklight/list.svg +1 -0
  14. data/app/assets/images/blacklight/search.svg +1 -0
  15. data/app/assets/javascripts/blacklight/blacklight.js +497 -57
  16. data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +18 -15
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
  20. data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
  21. data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
  22. data/app/assets/stylesheets/blacklight/_facets.scss +64 -93
  23. data/app/assets/stylesheets/blacklight/_header.scss +35 -48
  24. data/app/assets/stylesheets/blacklight/_icons.scss +35 -0
  25. data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
  26. data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
  27. data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
  28. data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
  29. data/app/assets/stylesheets/blacklight/_search_form.scss +7 -0
  30. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
  31. data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
  32. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
  33. data/app/assets/stylesheets/blacklight/blacklight.scss +1 -1
  34. data/app/builders/blacklight/action_builder.rb +57 -0
  35. data/app/controllers/bookmarks_controller.rb +2 -2
  36. data/app/controllers/catalog_controller.rb +2 -2
  37. data/app/controllers/concerns/blacklight/base.rb +0 -33
  38. data/app/controllers/concerns/blacklight/bookmarks.rb +36 -33
  39. data/app/controllers/concerns/blacklight/catalog.rb +266 -210
  40. data/app/controllers/concerns/blacklight/controller.rb +111 -126
  41. data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
  42. data/app/controllers/concerns/blacklight/facet.rb +3 -0
  43. data/app/controllers/concerns/blacklight/search_context.rb +16 -14
  44. data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
  45. data/app/controllers/concerns/blacklight/search_history.rb +1 -6
  46. data/app/controllers/concerns/blacklight/token_based_user.rb +24 -9
  47. data/app/helpers/blacklight/blacklight_helper_behavior.rb +39 -119
  48. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  49. data/app/helpers/blacklight/component_helper_behavior.rb +21 -19
  50. data/app/helpers/blacklight/configuration_helper_behavior.rb +30 -57
  51. data/app/helpers/blacklight/facets_helper_behavior.rb +55 -51
  52. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
  53. data/app/helpers/blacklight/icon_helper_behavior.rb +18 -0
  54. data/app/helpers/blacklight/layout_helper_behavior.rb +3 -3
  55. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +8 -6
  56. data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
  57. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +19 -11
  58. data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
  59. data/app/helpers/blacklight/url_helper_behavior.rb +50 -41
  60. data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
  61. data/app/javascript/blacklight/bookmark_toggle.js +25 -0
  62. data/app/javascript/blacklight/checkbox_submit.js +134 -0
  63. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  64. data/app/{assets/javascripts → javascript}/blacklight/core.js +10 -8
  65. data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
  66. data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +62 -64
  67. data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -3
  68. data/app/models/blacklight/facet_paginator.rb +3 -3
  69. data/app/models/blacklight/icon.rb +56 -0
  70. data/app/models/blacklight/solr/facet_paginator.rb +3 -3
  71. data/app/models/blacklight/suggest_search.rb +4 -15
  72. data/app/models/bookmark.rb +5 -10
  73. data/app/models/concerns/blacklight/configurable.rb +13 -13
  74. data/app/models/concerns/blacklight/document/active_model_shim.rb +13 -11
  75. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  76. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  77. data/app/models/concerns/blacklight/document/email.rb +1 -1
  78. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  79. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  80. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  81. data/app/models/concerns/blacklight/document.rb +26 -40
  82. data/app/models/concerns/blacklight/solr/document.rb +8 -8
  83. data/app/models/concerns/blacklight/suggest/response.rb +5 -3
  84. data/app/models/concerns/blacklight/user.rb +7 -6
  85. data/app/models/record_mailer.rb +5 -6
  86. data/app/models/search.rb +5 -7
  87. data/app/presenters/blacklight/document_presenter.rb +25 -140
  88. data/app/presenters/blacklight/field_presenter.rb +7 -5
  89. data/app/presenters/blacklight/index_presenter.rb +41 -58
  90. data/app/presenters/blacklight/json_presenter.rb +10 -14
  91. data/app/presenters/blacklight/link_alternate_presenter.rb +3 -1
  92. data/app/presenters/blacklight/rendering/abstract_step.rb +7 -5
  93. data/app/presenters/blacklight/rendering/helper_method.rb +10 -8
  94. data/app/presenters/blacklight/rendering/join.rb +5 -3
  95. data/app/presenters/blacklight/rendering/link_to_facet.rb +23 -19
  96. data/app/presenters/blacklight/rendering/microdata.rb +6 -3
  97. data/app/presenters/blacklight/rendering/pipeline.rb +7 -5
  98. data/app/presenters/blacklight/rendering/terminator.rb +2 -0
  99. data/app/presenters/blacklight/search_bar_presenter.rb +39 -0
  100. data/app/presenters/blacklight/show_presenter.rb +26 -63
  101. data/app/presenters/blacklight/thumbnail_presenter.rb +74 -0
  102. data/app/services/blacklight/document_factory.rb +13 -0
  103. data/app/services/blacklight/field_retriever.rb +26 -24
  104. data/app/services/blacklight/search_service.rb +152 -0
  105. data/app/values/blacklight/types.rb +31 -0
  106. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  107. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  108. data/app/views/bookmarks/_tools.html.erb +2 -2
  109. data/app/views/bookmarks/index.html.erb +12 -13
  110. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  111. data/app/views/catalog/_citation.html.erb +4 -4
  112. data/app/views/catalog/_constraints.html.erb +6 -7
  113. data/app/views/catalog/_constraints_element.html.erb +6 -6
  114. data/app/views/catalog/_did_you_mean.html.erb +1 -1
  115. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +19 -18
  116. data/app/views/catalog/_document.html.erb +5 -3
  117. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +2 -0
  118. data/app/views/catalog/_document_action.html.erb +2 -1
  119. data/app/views/catalog/_email_form.html.erb +8 -4
  120. data/app/views/catalog/_facet_index_navigation.html.erb +5 -4
  121. data/app/views/catalog/_facet_layout.html.erb +6 -10
  122. data/app/views/catalog/_facet_limit.html.erb +3 -2
  123. data/app/views/catalog/_facet_pagination.html.erb +8 -8
  124. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  125. data/app/views/catalog/_facets.html.erb +9 -12
  126. data/app/views/catalog/_field.json.jbuilder +10 -0
  127. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +1 -1
  128. data/app/views/catalog/_home_text.html.erb +32 -36
  129. data/app/views/catalog/_index.html.erb +10 -0
  130. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +3 -3
  131. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  132. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  133. data/app/views/catalog/_results_pagination.html.erb +2 -2
  134. data/app/views/catalog/_search_form.html.erb +12 -8
  135. data/app/views/catalog/_search_header.html.erb +0 -3
  136. data/app/views/catalog/_search_results.html.erb +6 -2
  137. data/app/views/catalog/_show.html.erb +8 -0
  138. data/app/views/catalog/_show_main_content.html.erb +4 -4
  139. data/app/views/catalog/_show_more_like_this.html.erb +1 -1
  140. data/app/views/catalog/_show_sidebar.html.erb +3 -3
  141. data/app/views/catalog/_show_tools.html.erb +10 -12
  142. data/app/views/catalog/_sms_form.html.erb +8 -4
  143. data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
  144. data/app/views/catalog/_sort_widget.html.erb +7 -7
  145. data/app/views/catalog/_thumbnail.html.erb +5 -0
  146. data/app/views/catalog/_view_type_group.html.erb +2 -2
  147. data/app/views/catalog/_zero_results.html.erb +1 -1
  148. data/app/views/catalog/citation.js.erb +4 -2
  149. data/app/views/catalog/email.html.erb +5 -3
  150. data/app/views/catalog/email_success.html.erb +12 -8
  151. data/app/views/catalog/facet.html.erb +10 -8
  152. data/app/views/catalog/facet.json.jbuilder +2 -0
  153. data/app/views/catalog/index.atom.builder +13 -16
  154. data/app/views/catalog/index.html.erb +9 -11
  155. data/app/views/catalog/index.json.jbuilder +84 -3
  156. data/app/views/catalog/index.rss.builder +7 -5
  157. data/app/views/catalog/opensearch.xml.builder +12 -10
  158. data/app/views/catalog/show.html.erb +11 -6
  159. data/app/views/catalog/show.json.jbuilder +21 -0
  160. data/app/views/catalog/sms.html.erb +3 -1
  161. data/app/views/catalog/sms_success.html.erb +12 -8
  162. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  163. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  164. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  165. data/app/views/kaminari/blacklight/_next_page.html.erb +5 -5
  166. data/app/views/kaminari/blacklight/_page.html.erb +5 -3
  167. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  168. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  169. data/app/views/layouts/blacklight/base.html.erb +35 -0
  170. data/app/views/layouts/blacklight.html.erb +14 -41
  171. data/app/views/layouts/catalog_result.html.erb +11 -0
  172. data/app/views/search_history/index.html.erb +16 -21
  173. data/app/views/shared/_header_navbar.html.erb +8 -13
  174. data/app/views/shared/_modal.html.erb +6 -0
  175. data/app/views/shared/_user_util_links.html.erb +22 -0
  176. data/blacklight.gemspec +10 -11
  177. data/config/i18n-tasks.yml +17 -0
  178. data/config/locales/blacklight.de.yml +71 -82
  179. data/config/locales/blacklight.en.yml +15 -27
  180. data/config/locales/blacklight.es.yml +14 -26
  181. data/config/locales/blacklight.fr.yml +16 -33
  182. data/config/locales/blacklight.hu.yml +212 -0
  183. data/config/locales/blacklight.it.yml +15 -26
  184. data/config/locales/blacklight.nl.yml +212 -0
  185. data/config/locales/blacklight.pt-BR.yml +24 -29
  186. data/config/locales/blacklight.sq.yml +4 -28
  187. data/config/locales/blacklight.zh.yml +3 -25
  188. data/config/routes.rb +2 -10
  189. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  190. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  191. data/lib/blacklight/abstract_repository.rb +22 -10
  192. data/lib/blacklight/configuration/context.rb +12 -1
  193. data/lib/blacklight/configuration/facet_field.rb +16 -9
  194. data/lib/blacklight/configuration/field.rb +32 -3
  195. data/lib/blacklight/configuration/fields.rb +61 -58
  196. data/lib/blacklight/configuration/null_field.rb +2 -0
  197. data/lib/blacklight/configuration/search_field.rb +2 -2
  198. data/lib/blacklight/configuration/sort_field.rb +2 -2
  199. data/lib/blacklight/configuration/view_config.rb +4 -0
  200. data/lib/blacklight/configuration.rb +101 -88
  201. data/lib/blacklight/engine.rb +11 -7
  202. data/lib/blacklight/exceptions.rb +4 -7
  203. data/lib/blacklight/{utils.rb → nested_open_struct_with_hash_access.rb} +9 -81
  204. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  205. data/lib/blacklight/parameters.rb +1 -1
  206. data/lib/blacklight/routes/exportable.rb +1 -3
  207. data/lib/blacklight/routes/searchable.rb +3 -3
  208. data/lib/blacklight/runtime_registry.rb +2 -0
  209. data/lib/blacklight/search_builder.rb +28 -35
  210. data/lib/blacklight/search_state.rb +10 -8
  211. data/lib/blacklight/solr/repository.rb +40 -6
  212. data/lib/blacklight/solr/request.rb +1 -1
  213. data/lib/blacklight/solr/response/facets.rb +29 -31
  214. data/lib/blacklight/solr/response/group.rb +3 -3
  215. data/lib/blacklight/solr/response/group_response.rb +1 -1
  216. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  217. data/lib/blacklight/solr/response/response.rb +2 -2
  218. data/lib/blacklight/solr/response/spelling.rb +4 -3
  219. data/lib/blacklight/solr/response.rb +29 -30
  220. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  221. data/lib/blacklight/version.rb +1 -1
  222. data/lib/blacklight.rb +10 -8
  223. data/lib/generators/blacklight/assets_generator.rb +18 -12
  224. data/lib/generators/blacklight/controller_generator.rb +4 -5
  225. data/lib/generators/blacklight/document_generator.rb +1 -1
  226. data/lib/generators/blacklight/install_generator.rb +18 -28
  227. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  228. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +12 -6
  229. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  230. data/lib/generators/blacklight/templates/alternate_controller.rb +4 -4
  231. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  232. data/lib/generators/blacklight/templates/catalog_controller.rb +59 -49
  233. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -13
  234. data/lib/generators/blacklight/templates/solr/conf/schema.xml +388 -0
  235. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  236. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  237. data/lib/generators/blacklight/user_generator.rb +5 -6
  238. data/lib/railties/blacklight.rake +17 -21
  239. data/package-lock.json +2195 -0
  240. data/package.json +29 -0
  241. data/spec/controllers/alternate_controller_spec.rb +5 -4
  242. data/spec/controllers/application_controller_spec.rb +1 -5
  243. data/spec/controllers/blacklight/base_spec.rb +6 -3
  244. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  245. data/spec/controllers/blacklight/facet_spec.rb +1 -2
  246. data/spec/controllers/blacklight/search_fields_spec.rb +25 -34
  247. data/spec/controllers/bookmarks_controller_spec.rb +46 -11
  248. data/spec/controllers/catalog_controller_spec.rb +334 -161
  249. data/spec/controllers/search_history_controller_spec.rb +6 -6
  250. data/spec/features/alternate_controller_spec.rb +4 -4
  251. data/spec/features/autocomplete_spec.rb +4 -2
  252. data/spec/features/bookmarks_spec.rb +10 -10
  253. data/spec/features/did_you_mean_spec.rb +7 -12
  254. data/spec/features/facets_spec.rb +29 -17
  255. data/spec/features/record_view_spec.rb +12 -18
  256. data/spec/features/search_context_spec.rb +6 -7
  257. data/spec/features/search_crawler_spec.rb +3 -5
  258. data/spec/features/search_filters_spec.rb +80 -80
  259. data/spec/features/search_formats_spec.rb +1 -1
  260. data/spec/features/search_history_spec.rb +6 -29
  261. data/spec/features/search_pagination_spec.rb +4 -2
  262. data/spec/features/search_results_spec.rb +14 -12
  263. data/spec/features/search_sort_spec.rb +2 -2
  264. data/spec/features/search_spec.rb +8 -9
  265. data/spec/features/sitelinks_search_box.rb +4 -4
  266. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  267. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +97 -92
  268. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +72 -67
  269. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +2 -2
  270. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +10 -0
  271. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -5
  272. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +10 -6
  273. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +92 -0
  274. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +29 -30
  275. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +9 -2
  276. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +56 -54
  277. data/spec/helpers/blacklight_helper_spec.rb +65 -150
  278. data/spec/helpers/catalog_helper_spec.rb +80 -96
  279. data/spec/i18n_spec.rb +18 -0
  280. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +21 -13
  281. data/spec/lib/blacklight/configuration/facet_field_spec.rb +13 -0
  282. data/spec/lib/blacklight/configuration/field_spec.rb +15 -0
  283. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  284. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +148 -0
  285. data/spec/lib/blacklight/parameters_spec.rb +4 -2
  286. data/spec/lib/blacklight/search_state_spec.rb +53 -36
  287. data/spec/lib/blacklight_spec.rb +14 -15
  288. data/spec/lib/tasks/blacklight_task_spec.rb +4 -6
  289. data/spec/models/blacklight/configurable_spec.rb +24 -27
  290. data/spec/models/blacklight/configuration/context_spec.rb +9 -10
  291. data/spec/models/blacklight/configuration_spec.rb +248 -223
  292. data/spec/models/blacklight/document/active_model_shim_spec.rb +15 -6
  293. data/spec/models/blacklight/document/cache_key_spec.rb +9 -2
  294. data/spec/models/blacklight/document/dublin_core_spec.rb +17 -20
  295. data/spec/models/blacklight/document/email_spec.rb +10 -10
  296. data/spec/models/blacklight/document/sms_spec.rb +10 -10
  297. data/spec/models/blacklight/document_spec.rb +10 -22
  298. data/spec/models/blacklight/facet_paginator_spec.rb +40 -30
  299. data/spec/models/blacklight/icon_spec.rb +44 -0
  300. data/spec/models/blacklight/search_builder_spec.rb +41 -26
  301. data/spec/models/blacklight/solr/document_spec.rb +224 -216
  302. data/spec/models/blacklight/solr/facet_paginator_spec.rb +6 -4
  303. data/spec/models/blacklight/solr/repository_spec.rb +61 -46
  304. data/spec/models/blacklight/solr/request_spec.rb +17 -18
  305. data/spec/models/blacklight/solr/response/facets_spec.rb +58 -58
  306. data/spec/models/blacklight/solr/response/group_response_spec.rb +16 -22
  307. data/spec/models/blacklight/solr/response/group_spec.rb +18 -25
  308. data/spec/models/blacklight/solr/response_spec.rb +56 -55
  309. data/spec/models/blacklight/solr/search_builder_spec.rb +150 -164
  310. data/spec/models/blacklight/suggest/response_spec.rb +6 -4
  311. data/spec/models/blacklight/suggest_search_spec.rb +9 -16
  312. data/spec/models/blacklight/user_spec.rb +9 -11
  313. data/spec/models/bookmark_spec.rb +7 -6
  314. data/spec/models/record_mailer_spec.rb +23 -21
  315. data/spec/models/search_spec.rb +19 -18
  316. data/spec/models/solr_document_spec.rb +33 -5
  317. data/spec/presenters/blacklight/document_presenter_spec.rb +86 -0
  318. data/spec/presenters/blacklight/index_presenter_spec.rb +186 -0
  319. data/spec/presenters/blacklight/json_presenter_spec.rb +59 -0
  320. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -0
  321. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +79 -0
  322. data/spec/presenters/blacklight/show_presenter_spec.rb +333 -0
  323. data/spec/presenters/pipeline_spec.rb +18 -11
  324. data/spec/presenters/thumbnail_presenter_spec.rb +174 -0
  325. data/spec/routing/catalog_routing_spec.rb +13 -15
  326. data/spec/services/blacklight/search_service_spec.rb +488 -0
  327. data/spec/spec_helper.rb +20 -19
  328. data/spec/support/features/session_helpers.rb +4 -4
  329. data/spec/support/features.rb +1 -1
  330. data/spec/test_app_templates/Gemfile.extra +2 -4
  331. data/spec/test_app_templates/lib/generators/test_app_generator.rb +12 -13
  332. data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -6
  333. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +17 -13
  334. data/spec/views/catalog/_document.html.erb_spec.rb +11 -11
  335. data/spec/views/catalog/_document_list.html.erb_spec.rb +2 -1
  336. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +5 -5
  337. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  338. data/spec/views/catalog/_facets.html.erb_spec.rb +10 -12
  339. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +14 -15
  340. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +6 -9
  341. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +7 -30
  342. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  343. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +13 -14
  344. data/spec/views/catalog/_show_sidebar.erb_spec.rb +6 -9
  345. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -5
  346. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -2
  347. data/spec/views/catalog/_sort_widget.html.erb_spec.rb +3 -1
  348. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +7 -9
  349. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +12 -10
  350. data/spec/views/catalog/email_success.html.erb_spec.rb +8 -0
  351. data/spec/views/catalog/facet.html.erb_spec.rb +4 -3
  352. data/spec/views/catalog/facet.json.jbuilder_spec.rb +3 -2
  353. data/spec/views/catalog/index.atom.builder_spec.rb +11 -6
  354. data/spec/views/catalog/index.html.erb_spec.rb +6 -8
  355. data/spec/views/catalog/index.json.jbuilder_spec.rb +119 -26
  356. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  357. data/spec/views/catalog/show.html.erb_spec.rb +8 -8
  358. data/spec/views/catalog/show.json.jbuilder_spec.rb +40 -0
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +8 -0
  360. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -7
  361. data/tasks/blacklight.rake +10 -8
  362. data/template.demo.rb +3 -11
  363. metadata +188 -189
  364. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  365. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  366. data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -135
  367. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  368. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  369. data/app/controllers/concerns/blacklight/search_helper.rb +0 -155
  370. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  371. data/app/controllers/saved_searches_controller.rb +0 -4
  372. data/app/controllers/suggest_controller.rb +0 -4
  373. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  374. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  375. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  376. data/app/helpers/blacklight_url_helper.rb +0 -4
  377. data/app/helpers/component_helper.rb +0 -4
  378. data/app/helpers/facets_helper.rb +0 -4
  379. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  380. data/app/helpers/layout_helper.rb +0 -4
  381. data/app/helpers/render_constraints_helper.rb +0 -4
  382. data/app/helpers/search_history_constraints_helper.rb +0 -4
  383. data/app/helpers/suggest_helper.rb +0 -4
  384. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  385. data/app/views/_user_util_links.html.erb +0 -26
  386. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  387. data/app/views/catalog/_index_default.html.erb +0 -12
  388. data/app/views/catalog/_show_default.html.erb +0 -10
  389. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  390. data/app/views/saved_searches/index.html.erb +0 -32
  391. data/app/views/shared/_ajax_modal.html.erb +0 -6
  392. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  393. data/lib/generators/blacklight/templates/config/jetty.yml +0 -13
  394. data/solr/conf/schema.xml +0 -629
  395. data/solr/conf/solrconfig.xml +0 -411
  396. data/spec/controllers/blacklight/search_helper_spec.rb +0 -470
  397. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  398. data/spec/controllers/suggest_controller_spec.rb +0 -17
  399. data/spec/features/saved_searches_spec.rb +0 -47
  400. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  401. data/spec/lib/blacklight/utils_spec.rb +0 -167
  402. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  403. data/spec/presenters/document_presenter_spec.rb +0 -438
  404. data/spec/presenters/index_presenter_spec.rb +0 -173
  405. data/spec/presenters/show_presenter_spec.rb +0 -313
  406. data/spec/support/backport_test.rb +0 -14
  407. /data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
  408. /data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  409. /data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  410. /data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  411. /data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  412. /data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  413. /data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  414. /data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  415. /data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  416. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  417. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  418. /data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  419. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  420. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  421. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  422. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
@@ -0,0 +1,195 @@
1
+ # frozen_string_literal: true
2
+ module Blacklight::RenderPartialsHelperBehavior
3
+ ##
4
+ # Render the document index view
5
+ #
6
+ # @param [Array<SolrDocument>] documents list of documents to render
7
+ # @param [Hash] locals to pass to the render call
8
+ # @return [String]
9
+ def render_document_index documents = nil, locals = {}
10
+ documents ||= @response.documents
11
+ render_document_index_with_view(document_index_view_type, documents, locals)
12
+ end
13
+
14
+ ##
15
+ # Render the document index for a grouped response
16
+ def render_grouped_document_index
17
+ render 'catalog/group'
18
+ end
19
+
20
+ ##
21
+ # Return the list of partials for a given solr document
22
+ # @param [SolrDocument] doc solr document to render partials for
23
+ # @param [Array<String>] partials list of partials to render
24
+ # @param [Hash] locals local variables to pass to the render call
25
+ # @return [String]
26
+ def render_document_partials(doc, partials = [], locals = {})
27
+ safe_join(partials.map do |action_name|
28
+ render_document_partial(doc, action_name, locals)
29
+ end, "\n")
30
+ end
31
+
32
+ ##
33
+ # Given a doc and a base name for a partial, this method will attempt to render
34
+ # an appropriate partial based on the document format and view type.
35
+ #
36
+ # If a partial that matches the document format is not found,
37
+ # render a default partial for the base name.
38
+ #
39
+ # @see #document_partial_path_templates
40
+ #
41
+ # @param [SolrDocument] doc
42
+ # @param [String] base_name base name for the partial
43
+ # @param [Hash] locals local variables to pass through to the partials
44
+ def render_document_partial(doc, base_name, locals = {})
45
+ format = document_partial_name(doc, base_name)
46
+
47
+ view_type = document_index_view_type
48
+ template = cached_view ['show', view_type, base_name, format].join('_') do
49
+ find_document_show_template_with_view(view_type, base_name, format, locals)
50
+ end
51
+ if template
52
+ template.render(self, locals.merge(document: doc))
53
+ else
54
+ ''
55
+ end
56
+ end
57
+
58
+ ##
59
+ # Render the document index for the given view type with the
60
+ # list of documents.
61
+ #
62
+ # This method will interpolate the list of templates with
63
+ # the current view, and gracefully handles missing templates.
64
+ #
65
+ # @see #document_index_path_templates
66
+ #
67
+ # @param [String] view type
68
+ # @param [Array<SolrDocument>] documents list of documents to render
69
+ # @param [Hash] locals to pass to the render call
70
+ # @return [String]
71
+ def render_document_index_with_view view, documents, locals = {}
72
+ template = cached_view ['index', view].join('_') do
73
+ find_document_index_template_with_view(view, locals)
74
+ end
75
+
76
+ if template
77
+ template.render(self, locals.merge(documents: documents))
78
+ else
79
+ ''
80
+ end
81
+ end
82
+
83
+ ##
84
+ # A list of document partial templates to attempt to render
85
+ #
86
+ # @see #render_document_index_with_view
87
+ # @return [Array<String>]
88
+ def document_index_path_templates
89
+ # first, the legacy template names for backwards compatbility
90
+ # followed by the new, inheritable style
91
+ # finally, a controller-specific path for non-catalog subclasses
92
+ @document_index_path_templates ||= [
93
+ "document_%{index_view_type}",
94
+ "catalog/document_%{index_view_type}",
95
+ "catalog/document_list"
96
+ ]
97
+ end
98
+
99
+ ##
100
+ # Return a normalized partial name for rendering a single document
101
+ #
102
+ # @param [SolrDocument] document
103
+ # @param [Symbol] base_name base name for the partial
104
+ # @return [String]
105
+ def document_partial_name(document, base_name = nil)
106
+ view_config = blacklight_config.view_config(:show)
107
+
108
+ display_type = if base_name && view_config.key?(:"#{base_name}_display_type_field")
109
+ document[view_config[:"#{base_name}_display_type_field"]]
110
+ end
111
+
112
+ display_type ||= document[view_config.display_type_field]
113
+
114
+ display_type ||= 'default'
115
+
116
+ type_field_to_partial_name(document, display_type)
117
+ end
118
+
119
+ private
120
+
121
+ ##
122
+ # Return a partial name for rendering a document
123
+ # this method can be overridden in order to transform the value
124
+ # (e.g. 'PdfBook' => 'pdf_book')
125
+ #
126
+ # @param [SolrDocument] document
127
+ # @param [String, Array] display_type a value suggestive of a partial
128
+ # @return [String] the name of the partial to render
129
+ # @example
130
+ # type_field_to_partial_name(['a book-article'])
131
+ # => 'a_book_article'
132
+ def type_field_to_partial_name(_document, display_type)
133
+ # using "_" as sep. to more closely follow the views file naming conventions
134
+ # parameterize uses "-" as the default sep. which throws errors
135
+ underscore = '_'
136
+ Array(display_type).join(' ').tr('-', underscore).parameterize(separator: underscore)
137
+ end
138
+
139
+ ##
140
+ # A list of document partial templates to try to render for a document
141
+ #
142
+ # The partial names will be interpolated with the following variables:
143
+ # - action_name: (e.g. index, show)
144
+ # - index_view_type: (the current view type, e.g. list, gallery)
145
+ # - format: the document's format (e.g. book)
146
+ #
147
+ # @see #render_document_partial
148
+ def document_partial_path_templates
149
+ # first, the legacy template names for backwards compatbility
150
+ # followed by the new, inheritable style
151
+ # finally, a controller-specific path for non-catalog subclasses
152
+ @partial_path_templates ||= [
153
+ "%{action_name}_%{index_view_type}_%{format}",
154
+ "%{action_name}_%{index_view_type}_default",
155
+ "%{action_name}_%{format}",
156
+ "%{action_name}_default",
157
+ "%{action_name}",
158
+ "catalog/%{action_name}_%{format}",
159
+ "catalog/_%{action_name}_partials/%{format}",
160
+ "catalog/_%{action_name}_partials/default"
161
+ ]
162
+ end
163
+
164
+ def find_document_show_template_with_view view_type, base_name, format, locals
165
+ document_partial_path_templates.each do |str|
166
+ partial = format(str, action_name: base_name, format: format, index_view_type: view_type)
167
+ logger.debug "Looking for document partial #{partial}"
168
+ template = lookup_context.find_all(partial, lookup_context.prefixes + [""], true, locals.keys + [:document], {}).first
169
+ return template if template
170
+ end
171
+ nil
172
+ end
173
+
174
+ def find_document_index_template_with_view view_type, locals
175
+ document_index_path_templates.each do |str|
176
+ partial = format(str, index_view_type: view_type)
177
+ logger.debug "Looking for document index partial #{partial}"
178
+ template = lookup_context.find_all(partial, lookup_context.prefixes + [""], true, locals.keys + [:documents], {}).first
179
+ return template if template
180
+ end
181
+ nil
182
+ end
183
+
184
+ ##
185
+ # @param key fetches or writes data to a cache, using the given key.
186
+ # @yield the block to evaluate (and cache) if there is a cache miss
187
+ def cached_view key
188
+ @view_cache ||= {}
189
+ if @view_cache.key?(key)
190
+ @view_cache[key]
191
+ else
192
+ @view_cache[key] = yield
193
+ end
194
+ end
195
+ end
@@ -8,8 +8,8 @@
8
8
  module Blacklight::SearchHistoryConstraintsHelperBehavior
9
9
  # Simpler textual version of constraints, used on Search History page.
10
10
  # Theoretically can may be DRY'd up with results page render_constraints,
11
- # maybe even using the very same HTML with different CSS?
12
- # But too tricky for now, too many changes to existing CSS. TODO.
11
+ # maybe even using the very same HTML with different CSS?
12
+ # But too tricky for now, too many changes to existing CSS. TODO.
13
13
  def render_search_to_s(params)
14
14
  render_search_to_s_q(params) +
15
15
  render_search_to_s_filters(params)
@@ -22,7 +22,7 @@ module Blacklight::SearchHistoryConstraintsHelperBehavior
22
22
 
23
23
  label = label_for_search_field(params[:search_field]) unless default_search_field && params[:search_field] == default_search_field[:key]
24
24
 
25
- render_search_to_s_element(label , render_filter_value(params['q']) )
25
+ render_search_to_s_element(label, render_filter_value(params['q']))
26
26
  end
27
27
 
28
28
  ##
@@ -32,24 +32,30 @@ module Blacklight::SearchHistoryConstraintsHelperBehavior
32
32
 
33
33
  safe_join(params[:f].collect do |facet_field, value_list|
34
34
  render_search_to_s_element(facet_field_label(facet_field),
35
- safe_join(value_list.collect do |value|
36
- render_filter_value(value, facet_field)
37
- end, content_tag(:span, " #{t('blacklight.and')} ", :class =>'filterSeparator')))
35
+ safe_join(value_list.collect do |value|
36
+ render_filter_value(value, facet_field)
37
+ end,
38
+ content_tag(:span, " #{t('blacklight.and')} ", class: 'filter-separator')))
38
39
  end, " \n ")
39
40
  end
40
41
 
41
42
  # value can be Array, in which case elements are joined with
42
43
  # 'and'. Pass in option :escape_value => false to pass in pre-rendered
43
- # html for value. key with escape_key if needed.
44
- def render_search_to_s_element(key, value, options = {})
45
- content_tag(:span, render_filter_name(key) + content_tag(:span, value, :class => 'filterValues'), :class => 'constraint')
44
+ # html for value. key with escape_key if needed.
45
+ def render_search_to_s_element(key, value, _options = {})
46
+ content_tag(:span,
47
+ render_filter_name(key) + content_tag(:span, value, class: 'filter-values'),
48
+ class: 'constraint')
46
49
  end
47
50
 
48
51
  ##
49
52
  # Render the name of the facet
50
53
  def render_filter_name name
51
54
  return "".html_safe if name.blank?
52
- content_tag(:span, t('blacklight.search.filters.label', :label => name), :class => 'filterName')
55
+
56
+ content_tag(:span,
57
+ t('blacklight.search.filters.label', label: name),
58
+ class: 'filter-name')
53
59
  end
54
60
 
55
61
  ##
@@ -57,6 +63,8 @@ module Blacklight::SearchHistoryConstraintsHelperBehavior
57
63
  def render_filter_value value, key = nil
58
64
  display_value = value
59
65
  display_value = facet_display_value(key, value) if key
60
- content_tag(:span, h(display_value), :class => 'filterValue')
66
+ content_tag(:span,
67
+ h(display_value),
68
+ class: 'filter-value')
61
69
  end
62
70
  end
@@ -7,5 +7,6 @@ module Blacklight
7
7
  blacklight_config.autocomplete_enabled.present? &&
8
8
  blacklight_config.autocomplete_path.present?
9
9
  end
10
+ deprecation_deprecate autocomplete_enabled?: "use SearchBarPresenter#autocomplete_enabled?"
10
11
  end
11
12
  end
@@ -2,53 +2,61 @@
2
2
  ##
3
3
  # URL helper methods
4
4
  module Blacklight::UrlHelperBehavior
5
- include Blacklight::DeprecatedUrlHelperBehavior
6
-
7
- ##
8
- # Extension point for downstream applications
9
- # to provide more interesting routing to
10
- # documents
11
5
  def url_for_document(doc, options = {})
12
6
  search_state.url_for_document(doc, options)
13
7
  end
14
8
 
15
- # link_to_document(doc, 'VIEW', :counter => 3)
16
- # Use the catalog_path RESTful route to create a link to the show page for a specific item.
9
+ # Uses the catalog_path route to create a link to the show page for an item.
17
10
  # catalog_path accepts a hash. The solr query params are stored in the session,
18
11
  # 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
12
  # TODO: move this to the IndexPresenter
20
- def link_to_document(doc, field_or_opts = nil, opts={:counter => nil})
21
- if field_or_opts.is_a? Hash
22
- opts = field_or_opts
23
- else
24
- field = field_or_opts
25
- end
13
+ # @param doc [SolrDocument] the document
14
+ # @param field_or_opts [Hash, String] either a string to render as the link text or options
15
+ # @param opts [Hash] the options to create the link with
16
+ # @option opts [Number] :counter (nil) the count to set in the session (for paging through a query result)
17
+ # @example Passing in an image
18
+ # 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>
19
+ # @example With the default document link field
20
+ # link_to_document(doc, counter: 3) #=> "<a href=\"catalog/123\" data-tracker-href=\"/catalog/123/track?counter=3&search_id=999\">My Title</a>
21
+ def link_to_document(doc, field_or_opts = nil, opts = { counter: nil })
22
+ label = case field_or_opts
23
+ when NilClass
24
+ index_presenter(doc).label document_show_link_field(doc), opts
25
+ when Hash
26
+ opts = field_or_opts
27
+ index_presenter(doc).label document_show_link_field(doc), opts
28
+ when Proc, Symbol
29
+ Deprecation.warn(self, "passing a #{field_or_opts.class} to link_to_document is deprecated and will be removed in Blacklight 8")
30
+ Deprecation.silence(Blacklight::IndexPresenter) do
31
+ index_presenter(doc).label field_or_opts, opts
32
+ end
33
+ else # String
34
+ field_or_opts
35
+ end
26
36
 
27
- field ||= document_show_link_field(doc)
28
- label = index_presenter(doc).label field, opts
29
37
  link_to label, url_for_document(doc), document_link_params(doc, opts)
30
38
  end
31
39
 
32
40
  def document_link_params(doc, opts)
33
41
  session_tracking_params(doc, opts[:counter]).deep_merge(opts.except(:label, :counter))
34
42
  end
35
- protected :document_link_params
43
+ private :document_link_params
36
44
 
37
45
  ##
38
46
  # Link to the previous document in the current search context
39
47
  def link_to_previous_document(previous_document)
40
- link_opts = session_tracking_params(previous_document, search_session['counter'].to_i - 1).merge(:class => "previous", :rel => 'prev')
48
+ link_opts = session_tracking_params(previous_document, search_session['counter'].to_i - 1).merge(class: "previous", rel: 'prev')
41
49
  link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), url_for_document(previous_document), link_opts do
42
- content_tag :span, raw(t('views.pagination.previous')), :class => 'previous'
50
+ content_tag :span, raw(t('views.pagination.previous')), class: 'previous'
43
51
  end
44
52
  end
45
53
 
46
54
  ##
47
55
  # Link to the next document in the current search context
48
56
  def link_to_next_document(next_document)
49
- link_opts = session_tracking_params(next_document, search_session['counter'].to_i + 1).merge(:class => "next", :rel => 'next')
57
+ link_opts = session_tracking_params(next_document, search_session['counter'].to_i + 1).merge(class: "next", rel: 'next')
50
58
  link_to_unless next_document.nil?, raw(t('views.pagination.next')), url_for_document(next_document), link_opts do
51
- content_tag :span, raw(t('views.pagination.next')), :class => 'next'
59
+ content_tag :span, raw(t('views.pagination.next')), class: 'next'
52
60
  end
53
61
  end
54
62
 
@@ -66,20 +74,21 @@ module Blacklight::UrlHelperBehavior
66
74
  return {}
67
75
  end
68
76
 
69
- { data: {:'context-href' => path } }
77
+ { data: { :'context-href' => path } }
70
78
  end
71
- protected :session_tracking_params
79
+ private :session_tracking_params
72
80
 
73
81
  ##
74
82
  # Get the URL for tracking search sessions across pages using polymorphic routing
75
83
  def session_tracking_path document, params = {}
76
- return if document.nil?
84
+ return if document.nil? || controller_name == 'bookmarks'
77
85
 
78
- if respond_to?(controller_tracking_method)
79
- send(controller_tracking_method, params.merge(id: document))
80
- else
81
- blacklight.track_search_context_path(params.merge(id: document))
86
+ if main_app.respond_to?(controller_tracking_method)
87
+ return main_app.public_send(controller_tracking_method, params.merge(id: document))
82
88
  end
89
+
90
+ raise "Unable to find #{controller_tracking_method} route helper. " \
91
+ "Did you add `concerns :searchable` routing mixin to your `config/routes.rb`?"
83
92
  end
84
93
 
85
94
  def controller_tracking_method
@@ -101,7 +110,7 @@ module Blacklight::UrlHelperBehavior
101
110
  # Get the path to the search action with any parameters (e.g. view type)
102
111
  # that should be persisted across search sessions.
103
112
  def start_over_path query_params = params
104
- h = { }
113
+ h = {}
105
114
  current_index_view_type = document_index_view_type(query_params)
106
115
  h[:view] = current_index_view_type unless current_index_view_type == default_document_index_view_type
107
116
 
@@ -112,23 +121,23 @@ module Blacklight::UrlHelperBehavior
112
121
  # @example
113
122
  # link_back_to_catalog(label: 'Back to Search')
114
123
  # link_back_to_catalog(label: 'Back to Search', route_set: my_engine)
115
- def link_back_to_catalog(opts={:label=>nil})
124
+ def link_back_to_catalog(opts = { label: nil })
116
125
  scope = opts.delete(:route_set) || self
117
126
  query_params = search_state.reset(current_search_session.try(:query_params)).to_hash
118
127
 
119
128
  if search_session['counter']
120
- per_page = (search_session['per_page'] || default_per_page).to_i
129
+ per_page = (search_session['per_page'] || blacklight_config.default_per_page).to_i
121
130
  counter = search_session['counter'].to_i
122
131
 
123
- query_params[:per_page] = per_page unless search_session['per_page'].to_i == default_per_page
124
- query_params[:page] = ((counter - 1)/ per_page) + 1
132
+ query_params[:per_page] = per_page unless search_session['per_page'].to_i == blacklight_config.default_per_page
133
+ query_params[:page] = ((counter - 1) / per_page) + 1
125
134
  end
126
135
 
127
136
  link_url = if query_params.empty?
128
- search_action_path(only_path: true)
129
- else
130
- scope.url_for(query_params)
131
- end
137
+ search_action_path(only_path: true)
138
+ else
139
+ scope.url_for(query_params)
140
+ end
132
141
  label = opts.delete(:label)
133
142
 
134
143
  if link_url =~ /bookmarks/
@@ -153,11 +162,11 @@ module Blacklight::UrlHelperBehavior
153
162
  search_state.add_facet_params_and_redirect(group.field, group.key)
154
163
  end
155
164
 
156
- # A URL to refworks export, with an embedded callback URL to this app.
157
- # the callback URL is to bookmarks#export, which delivers a list of
165
+ # A URL to refworks export, with an embedded callback URL to this app.
166
+ # the callback URL is to bookmarks#export, which delivers a list of
158
167
  # user's bookmarks in 'refworks marc txt' format -- we tell refworks
159
- # to expect that format.
168
+ # to expect that format.
160
169
  def bookmarks_export_url(format, params = {})
161
- bookmarks_url(params.merge(format: format, encrypted_user_id: encrypt_user_id(current_or_guest_user.id) ))
170
+ bookmarks_url(params.merge(format: format, encrypted_user_id: encrypt_user_id(current_or_guest_user.id)))
162
171
  end
163
172
  end
@@ -1,4 +1,5 @@
1
1
  /*global Bloodhound */
2
+ import Bloodhound from 'typeahead.js/dist/bloodhound.js'
2
3
 
3
4
  Blacklight.onLoad(function() {
4
5
  'use strict';
@@ -9,7 +10,7 @@ Blacklight.onLoad(function() {
9
10
  return;
10
11
  }
11
12
  var suggestUrl = $el.data().autocompletePath;
12
-
13
+
13
14
  var terms = new Bloodhound({
14
15
  datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
15
16
  queryTokenizer: Bloodhound.tokenizers.whitespace,
@@ -18,7 +19,7 @@ Blacklight.onLoad(function() {
18
19
  wildcard: '%QUERY'
19
20
  }
20
21
  });
21
-
22
+
22
23
  terms.initialize();
23
24
 
24
25
  $el.typeahead({
@@ -0,0 +1,25 @@
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';
19
+
20
+ Blacklight.onLoad(function() {
21
+ Blacklight.doBookmarkToggleBehavior();
22
+ });
23
+
24
+
25
+ })(jQuery);
@@ -0,0 +1,134 @@
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
3
+ something, like used for Bookmarks, into an AJAXy checkbox instead.
4
+
5
+ Apply to a form. Does require certain assumption about the form:
6
+ 1) The same form 'action' href must be used for both ADD and REMOVE
7
+ actions, with the different being the hidden input name="_method"
8
+ being set to "put" or "delete" -- that's the Rails method to pretend
9
+ to be doing a certain HTTP verb. So same URL, PUT to add, DELETE
10
+ to remove. This plugin assumes that.
11
+
12
+ Plus, the form this is applied to should provide a data-doc-id
13
+ attribute (HTML5-style doc-*) that contains the id/primary key
14
+ of the object in question -- used by plugin for a unique value for
15
+ 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
+ });
30
+ */
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.text(form.attr('data-present'));
77
+ } else {
78
+ form.find('input[name=_method]').val('put');
79
+ span.text(form.attr('data-absent'));
80
+ }
81
+ }
82
+
83
+ form.append(checkboxDiv);
84
+ updateStateFor(checked);
85
+
86
+ checkbox.click(function() {
87
+ span.text(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);
@@ -2,7 +2,7 @@
2
2
  Blacklight.onLoad(function() {
3
3
  // when clicking on a link that toggles the collapsing behavior, don't do anything
4
4
  // with the hash or the page could jump around.
5
- $(document).on("click", "a[data-toggle=collapse][href='#'], [data-toggle=collapse] a[href='#']", function(event) {
5
+ $(document).on('click', 'a[data-toggle=collapse][href="#"], [data-toggle=collapse] a[href="#"]', function(event) {
6
6
  event.preventDefault();
7
7
  });
8
8
  });
@@ -19,21 +19,23 @@ Blacklight = function() {
19
19
  listeners.push('turbolinks:load');
20
20
  } else {
21
21
  // Turbolinks < 5
22
- listeners.push('page:load', 'ready');
22
+ listeners.push('page:load', 'DOMContentLoaded');
23
23
  }
24
24
  } else {
25
- listeners.push('ready');
25
+ listeners.push('DOMContentLoaded');
26
26
  }
27
27
 
28
- return listeners.join(' ');
28
+ return listeners;
29
29
  }
30
30
  };
31
31
  }();
32
32
 
33
33
  // turbolinks triggers page:load events on page transition
34
- // If app isn't using turbolinks, this event will never be triggered, no prob.
35
- $(document).on(Blacklight.listeners(), function() {
36
- Blacklight.activate();
37
- });
38
-
34
+ // If app isn't using turbolinks, this event will never be triggered, no prob.
35
+ Blacklight.listeners().forEach(function(listener) {
36
+ document.addEventListener(listener, function() {
37
+ Blacklight.activate()
38
+ })
39
+ })
39
40
 
41
+ $('.no-js').removeClass('no-js').addClass('js');