blacklight 6.24.0 → 7.0.0.rc1

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 (393) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.npmignore +23 -0
  4. data/.rubocop.yml +15 -3
  5. data/.rubocop_todo.yml +242 -379
  6. data/.solr_wrapper.yml +1 -1
  7. data/.travis.yml +20 -24
  8. data/Gemfile +1 -4
  9. data/README.md +21 -4
  10. data/Rakefile +1 -2
  11. data/VERSION +1 -1
  12. data/app/assets/images/blacklight/list.svg +1 -0
  13. data/app/assets/images/blacklight/search.svg +1 -0
  14. data/app/assets/javascripts/blacklight/blacklight.js +496 -56
  15. data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
  16. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +3 -1
  17. data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
  18. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
  19. data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
  20. data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
  21. data/app/assets/stylesheets/blacklight/_facets.scss +74 -92
  22. data/app/assets/stylesheets/blacklight/_header.scss +35 -48
  23. data/app/assets/stylesheets/blacklight/_icons.scss +29 -0
  24. data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
  25. data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
  26. data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
  27. data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
  28. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
  29. data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
  30. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
  31. data/app/builders/blacklight/action_builder.rb +56 -0
  32. data/app/controllers/bookmarks_controller.rb +2 -2
  33. data/app/controllers/catalog_controller.rb +2 -2
  34. data/app/controllers/concerns/blacklight/base.rb +0 -33
  35. data/app/controllers/concerns/blacklight/bookmarks.rb +20 -37
  36. data/app/controllers/concerns/blacklight/catalog.rb +254 -213
  37. data/app/controllers/concerns/blacklight/controller.rb +117 -133
  38. data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
  39. data/app/controllers/concerns/blacklight/search_context.rb +10 -14
  40. data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
  41. data/app/controllers/concerns/blacklight/token_based_user.rb +6 -10
  42. data/app/helpers/blacklight/blacklight_helper_behavior.rb +32 -118
  43. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  44. data/app/helpers/blacklight/component_helper_behavior.rb +19 -19
  45. data/app/helpers/blacklight/configuration_helper_behavior.rb +25 -54
  46. data/app/helpers/blacklight/facets_helper_behavior.rb +40 -39
  47. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
  48. data/app/helpers/blacklight/icon_helper_behavior.rb +16 -0
  49. data/app/helpers/blacklight/layout_helper_behavior.rb +3 -10
  50. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +6 -6
  51. data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
  52. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +18 -11
  53. data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
  54. data/app/helpers/blacklight/url_helper_behavior.rb +21 -27
  55. data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
  56. data/app/javascript/blacklight/autofocus.js +20 -0
  57. data/app/javascript/blacklight/bookmark_toggle.js +25 -0
  58. data/app/javascript/blacklight/checkbox_submit.js +133 -0
  59. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  60. data/app/javascript/blacklight/core.js +39 -0
  61. data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
  62. data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +63 -63
  63. data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -2
  64. data/app/models/blacklight/facet_paginator.rb +3 -3
  65. data/app/models/blacklight/icon.rb +53 -0
  66. data/app/models/blacklight/solr/facet_paginator.rb +3 -3
  67. data/app/models/blacklight/suggest_search.rb +15 -4
  68. data/app/models/bookmark.rb +4 -9
  69. data/app/models/concerns/blacklight/configurable.rb +13 -13
  70. data/app/models/concerns/blacklight/document.rb +8 -42
  71. data/app/models/concerns/blacklight/document/active_model_shim.rb +8 -11
  72. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  73. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  74. data/app/models/concerns/blacklight/document/email.rb +1 -1
  75. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  76. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  77. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  78. data/app/models/concerns/blacklight/solr/document.rb +7 -8
  79. data/app/models/concerns/blacklight/suggest/response.rb +3 -5
  80. data/app/models/concerns/blacklight/user.rb +6 -6
  81. data/app/models/record_mailer.rb +5 -6
  82. data/app/models/search.rb +4 -7
  83. data/app/presenters/blacklight/field_presenter.rb +5 -5
  84. data/app/presenters/blacklight/index_presenter.rb +34 -71
  85. data/app/presenters/blacklight/json_presenter.rb +7 -4
  86. data/app/presenters/blacklight/link_alternate_presenter.rb +1 -1
  87. data/app/presenters/blacklight/rendering/abstract_step.rb +5 -5
  88. data/app/presenters/blacklight/rendering/helper_method.rb +8 -8
  89. data/app/presenters/blacklight/rendering/join.rb +3 -3
  90. data/app/presenters/blacklight/rendering/link_to_facet.rb +19 -19
  91. data/app/presenters/blacklight/rendering/microdata.rb +3 -3
  92. data/app/presenters/blacklight/rendering/pipeline.rb +5 -5
  93. data/app/presenters/blacklight/search_bar_presenter.rb +37 -0
  94. data/app/presenters/blacklight/show_presenter.rb +20 -69
  95. data/app/presenters/blacklight/thumbnail_presenter.rb +72 -0
  96. data/app/services/blacklight/document_factory.rb +11 -0
  97. data/app/services/blacklight/field_retriever.rb +24 -24
  98. data/app/services/blacklight/search_service.rb +154 -0
  99. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  100. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  101. data/app/views/bookmarks/_tools.html.erb +2 -2
  102. data/app/views/bookmarks/index.html.erb +2 -2
  103. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  104. data/app/views/catalog/_citation.html.erb +18 -23
  105. data/app/views/catalog/_constraints.html.erb +5 -8
  106. data/app/views/catalog/_constraints_element.html.erb +6 -6
  107. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +2 -2
  108. data/app/views/catalog/_document.html.erb +5 -3
  109. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +0 -0
  110. data/app/views/catalog/_document_action.html.erb +2 -1
  111. data/app/views/catalog/_email_form.html.erb +8 -4
  112. data/app/views/catalog/_facet_index_navigation.html.erb +3 -3
  113. data/app/views/catalog/_facet_layout.html.erb +5 -7
  114. data/app/views/catalog/_facet_limit.html.erb +3 -2
  115. data/app/views/catalog/_facet_pagination.html.erb +10 -10
  116. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  117. data/app/views/catalog/_facets.html.erb +8 -12
  118. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +0 -0
  119. data/app/views/catalog/_home_text.html.erb +32 -36
  120. data/app/views/catalog/_index.html.erb +12 -0
  121. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +2 -2
  122. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  123. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  124. data/app/views/catalog/_search_form.html.erb +12 -8
  125. data/app/views/catalog/_search_header.html.erb +0 -3
  126. data/app/views/catalog/_search_results.html.erb +4 -0
  127. data/app/views/catalog/_show.html.erb +10 -0
  128. data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
  129. data/app/views/catalog/_show_main_content.html.erb +4 -4
  130. data/app/views/catalog/_show_sidebar.html.erb +3 -3
  131. data/app/views/catalog/_show_tools.html.erb +9 -11
  132. data/app/views/catalog/_sms_form.html.erb +8 -4
  133. data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
  134. data/app/views/catalog/_sort_widget.html.erb +7 -7
  135. data/app/views/catalog/_thumbnail.html.erb +5 -0
  136. data/app/views/catalog/_view_type_group.html.erb +2 -2
  137. data/app/views/catalog/citation.html.erb +1 -1
  138. data/app/views/catalog/citation.js.erb +9 -1
  139. data/app/views/catalog/email.html.erb +5 -5
  140. data/app/views/catalog/email_success.html.erb +11 -9
  141. data/app/views/catalog/facet.html.erb +5 -6
  142. data/app/views/catalog/index.atom.builder +10 -15
  143. data/app/views/catalog/index.html.erb +9 -11
  144. data/app/views/catalog/index.json.jbuilder +65 -3
  145. data/app/views/catalog/index.rss.builder +5 -5
  146. data/app/views/catalog/opensearch.xml.builder +10 -10
  147. data/app/views/catalog/show.html.erb +11 -6
  148. data/app/views/catalog/sms.html.erb +2 -3
  149. data/app/views/catalog/sms_success.html.erb +11 -10
  150. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  151. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  152. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  153. data/app/views/kaminari/blacklight/_next_page.html.erb +4 -4
  154. data/app/views/kaminari/blacklight/_page.html.erb +3 -3
  155. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  156. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  157. data/app/views/layouts/blacklight.html.erb +14 -41
  158. data/app/views/layouts/blacklight/base.html.erb +43 -0
  159. data/app/views/layouts/catalog_result.html.erb +11 -0
  160. data/app/views/search_history/index.html.erb +16 -21
  161. data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  162. data/app/views/shared/_header_navbar.html.erb +8 -13
  163. data/app/views/shared/_modal.html.erb +6 -0
  164. data/app/views/shared/_user_util_links.html.erb +22 -0
  165. data/blacklight.gemspec +10 -11
  166. data/config/locales/blacklight.de.yml +0 -30
  167. data/config/locales/blacklight.en.yml +1 -27
  168. data/config/locales/blacklight.es.yml +0 -30
  169. data/config/locales/blacklight.fr.yml +0 -30
  170. data/config/locales/blacklight.hu.yml +210 -0
  171. data/config/locales/blacklight.it.yml +0 -30
  172. data/config/locales/blacklight.nl.yml +210 -0
  173. data/config/locales/blacklight.pt-BR.yml +6 -32
  174. data/config/locales/blacklight.sq.yml +1 -28
  175. data/config/locales/blacklight.zh.yml +0 -25
  176. data/config/routes.rb +3 -10
  177. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  178. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  179. data/lib/blacklight.rb +4 -5
  180. data/lib/blacklight/abstract_repository.rb +9 -21
  181. data/lib/blacklight/configuration.rb +82 -89
  182. data/lib/blacklight/configuration/context.rb +1 -1
  183. data/lib/blacklight/configuration/facet_field.rb +16 -9
  184. data/lib/blacklight/configuration/field.rb +32 -3
  185. data/lib/blacklight/configuration/fields.rb +41 -48
  186. data/lib/blacklight/configuration/search_field.rb +2 -2
  187. data/lib/blacklight/configuration/sort_field.rb +2 -2
  188. data/lib/blacklight/configuration/view_config.rb +4 -0
  189. data/lib/blacklight/engine.rb +6 -10
  190. data/lib/blacklight/exceptions.rb +4 -7
  191. data/lib/blacklight/nested_open_struct_with_hash_access.rb +107 -0
  192. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  193. data/lib/blacklight/parameters.rb +1 -1
  194. data/lib/blacklight/routes/searchable.rb +1 -0
  195. data/lib/blacklight/search_builder.rb +26 -35
  196. data/lib/blacklight/search_state.rb +8 -8
  197. data/lib/blacklight/solr/repository.rb +3 -36
  198. data/lib/blacklight/solr/request.rb +1 -1
  199. data/lib/blacklight/solr/response.rb +29 -30
  200. data/lib/blacklight/solr/response/facets.rb +29 -31
  201. data/lib/blacklight/solr/response/group.rb +3 -3
  202. data/lib/blacklight/solr/response/group_response.rb +1 -1
  203. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  204. data/lib/blacklight/solr/response/response.rb +2 -2
  205. data/lib/blacklight/solr/response/spelling.rb +3 -3
  206. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  207. data/lib/blacklight/version.rb +1 -1
  208. data/lib/generators/blacklight/assets_generator.rb +8 -8
  209. data/lib/generators/blacklight/controller_generator.rb +4 -5
  210. data/lib/generators/blacklight/document_generator.rb +1 -1
  211. data/lib/generators/blacklight/install_generator.rb +18 -21
  212. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  213. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +4 -6
  214. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  215. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  216. data/lib/generators/blacklight/templates/catalog_controller.rb +52 -51
  217. data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  218. data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  219. data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  220. data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  221. data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  222. data/lib/generators/blacklight/templates/solr/conf/schema.xml +390 -0
  223. data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  224. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  225. data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  226. data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  227. data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  228. data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  229. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  230. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  231. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  232. data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
  233. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  234. data/lib/generators/blacklight/user_generator.rb +3 -6
  235. data/lib/railties/blacklight.rake +19 -14
  236. data/package-lock.json +2057 -0
  237. data/package.json +28 -0
  238. data/spec/controllers/alternate_controller_spec.rb +1 -1
  239. data/spec/controllers/application_controller_spec.rb +1 -1
  240. data/spec/controllers/blacklight/base_spec.rb +1 -1
  241. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  242. data/spec/controllers/blacklight/facet_spec.rb +1 -1
  243. data/spec/controllers/blacklight/search_fields_spec.rb +1 -13
  244. data/spec/controllers/bookmarks_controller_spec.rb +1 -36
  245. data/spec/controllers/catalog_controller_spec.rb +153 -53
  246. data/spec/controllers/search_history_controller_spec.rb +2 -2
  247. data/spec/features/alternate_controller_spec.rb +1 -1
  248. data/spec/features/autocomplete_spec.rb +2 -2
  249. data/spec/features/bookmarks_spec.rb +10 -10
  250. data/spec/features/did_you_mean_spec.rb +3 -9
  251. data/spec/features/facets_spec.rb +11 -11
  252. data/spec/features/record_view_spec.rb +1 -6
  253. data/spec/features/search_context_spec.rb +2 -2
  254. data/spec/features/search_filters_spec.rb +41 -41
  255. data/spec/features/search_formats_spec.rb +1 -1
  256. data/spec/features/search_history_spec.rb +1 -26
  257. data/spec/features/search_pagination_spec.rb +1 -1
  258. data/spec/features/search_results_spec.rb +3 -4
  259. data/spec/features/search_sort_spec.rb +2 -2
  260. data/spec/features/search_spec.rb +5 -10
  261. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  262. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +70 -65
  263. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +7 -8
  264. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +1 -1
  265. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +8 -0
  266. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -15
  267. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +2 -3
  268. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +80 -0
  269. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +9 -9
  270. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +4 -2
  271. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +11 -15
  272. data/spec/helpers/blacklight_helper_spec.rb +36 -141
  273. data/spec/helpers/catalog_helper_spec.rb +37 -56
  274. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +3 -3
  275. data/spec/lib/blacklight/configuration/facet_field_spec.rb +11 -0
  276. data/spec/lib/blacklight/configuration/field_spec.rb +12 -0
  277. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  278. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +153 -0
  279. data/spec/lib/blacklight/parameters_spec.rb +1 -1
  280. data/spec/lib/blacklight/search_state_spec.rb +2 -2
  281. data/spec/lib/blacklight_spec.rb +1 -1
  282. data/spec/lib/tasks/blacklight_task_spec.rb +1 -1
  283. data/spec/models/blacklight/configurable_spec.rb +15 -16
  284. data/spec/models/blacklight/configuration/context_spec.rb +1 -1
  285. data/spec/models/blacklight/configuration_spec.rb +146 -135
  286. data/spec/models/blacklight/document/active_model_shim_spec.rb +11 -1
  287. data/spec/models/blacklight/document/cache_key_spec.rb +1 -1
  288. data/spec/models/blacklight/document/dublin_core_spec.rb +5 -5
  289. data/spec/models/blacklight/document/email_spec.rb +3 -3
  290. data/spec/models/blacklight/document/sms_spec.rb +3 -3
  291. data/spec/models/blacklight/document_spec.rb +3 -16
  292. data/spec/models/blacklight/facet_paginator_spec.rb +1 -1
  293. data/spec/models/blacklight/icon_spec.rb +34 -0
  294. data/spec/models/blacklight/search_builder_spec.rb +33 -27
  295. data/spec/models/blacklight/solr/document_spec.rb +18 -7
  296. data/spec/models/blacklight/solr/facet_paginator_spec.rb +1 -1
  297. data/spec/models/blacklight/solr/repository_spec.rb +32 -27
  298. data/spec/models/blacklight/solr/request_spec.rb +1 -1
  299. data/spec/models/blacklight/solr/response/facets_spec.rb +1 -1
  300. data/spec/models/blacklight/solr/response/group_response_spec.rb +1 -1
  301. data/spec/models/blacklight/solr/response/group_spec.rb +1 -1
  302. data/spec/models/blacklight/solr/response_spec.rb +9 -6
  303. data/spec/models/blacklight/solr/search_builder_spec.rb +35 -48
  304. data/spec/models/blacklight/suggest/response_spec.rb +4 -5
  305. data/spec/models/blacklight/suggest_search_spec.rb +14 -7
  306. data/spec/models/blacklight/user_spec.rb +1 -1
  307. data/spec/models/bookmark_spec.rb +1 -1
  308. data/spec/models/record_mailer_spec.rb +2 -2
  309. data/spec/models/search_spec.rb +1 -1
  310. data/spec/models/solr_document_spec.rb +3 -3
  311. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +72 -0
  312. data/spec/presenters/index_presenter_spec.rb +70 -143
  313. data/spec/presenters/pipeline_spec.rb +4 -4
  314. data/spec/presenters/show_presenter_spec.rb +83 -145
  315. data/spec/presenters/thumbnail_presenter_spec.rb +171 -0
  316. data/spec/routing/catalog_routing_spec.rb +1 -17
  317. data/spec/services/blacklight/search_service_spec.rb +446 -0
  318. data/spec/spec_helper.rb +22 -9
  319. data/spec/test_app_templates/Gemfile.extra +2 -5
  320. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  321. data/spec/views/catalog/_constraints.html.erb_spec.rb +1 -3
  322. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +8 -8
  323. data/spec/views/catalog/_document.html.erb_spec.rb +7 -7
  324. data/spec/views/catalog/_document_list.html.erb_spec.rb +1 -1
  325. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +1 -1
  326. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  327. data/spec/views/catalog/_facets.html.erb_spec.rb +2 -2
  328. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +1 -1
  329. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +4 -4
  330. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +4 -27
  331. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  332. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +1 -1
  333. data/spec/views/catalog/_show_sidebar.erb_spec.rb +3 -3
  334. data/spec/views/catalog/_show_tools.html.erb_spec.rb +3 -3
  335. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -1
  336. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +3 -3
  337. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +5 -1
  338. data/spec/views/catalog/email_success.html.erb_spec.rb +9 -0
  339. data/spec/views/catalog/facet.html.erb_spec.rb +1 -1
  340. data/spec/views/catalog/facet.json.jbuilder_spec.rb +1 -1
  341. data/spec/views/catalog/index.atom.builder_spec.rb +2 -2
  342. data/spec/views/catalog/index.html.erb_spec.rb +4 -7
  343. data/spec/views/catalog/index.json.jbuilder_spec.rb +66 -21
  344. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  345. data/spec/views/catalog/show.html.erb_spec.rb +2 -2
  346. data/spec/views/catalog/sms_success.html.erb_spec.rb +9 -0
  347. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -4
  348. data/tasks/blacklight.rake +10 -8
  349. data/template.demo.rb +1 -11
  350. metadata +171 -189
  351. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  352. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  353. data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -139
  354. data/app/assets/javascripts/blacklight/core.js +0 -30
  355. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  356. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  357. data/app/controllers/concerns/blacklight/search_helper.rb +0 -161
  358. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  359. data/app/controllers/saved_searches_controller.rb +0 -4
  360. data/app/controllers/suggest_controller.rb +0 -4
  361. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  362. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  363. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  364. data/app/helpers/blacklight_url_helper.rb +0 -4
  365. data/app/helpers/component_helper.rb +0 -4
  366. data/app/helpers/facets_helper.rb +0 -4
  367. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  368. data/app/helpers/layout_helper.rb +0 -4
  369. data/app/helpers/render_constraints_helper.rb +0 -4
  370. data/app/helpers/search_history_constraints_helper.rb +0 -4
  371. data/app/helpers/suggest_helper.rb +0 -4
  372. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  373. data/app/presenters/blacklight/document_presenter.rb +0 -153
  374. data/app/views/_user_util_links.html.erb +0 -26
  375. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  376. data/app/views/catalog/_index_default.html.erb +0 -12
  377. data/app/views/catalog/_show_default.html.erb +0 -10
  378. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  379. data/app/views/saved_searches/index.html.erb +0 -32
  380. data/app/views/shared/_ajax_modal.html.erb +0 -6
  381. data/lib/blacklight/utils.rb +0 -183
  382. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  383. data/solr/conf/schema.xml +0 -627
  384. data/solr/conf/solrconfig.xml +0 -411
  385. data/spec/controllers/blacklight/search_helper_spec.rb +0 -489
  386. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  387. data/spec/controllers/suggest_controller_spec.rb +0 -17
  388. data/spec/features/saved_searches_spec.rb +0 -47
  389. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  390. data/spec/lib/blacklight/utils_spec.rb +0 -167
  391. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  392. data/spec/presenters/document_presenter_spec.rb +0 -438
  393. data/spec/support/backport_test.rb +0 -14
data/.solr_wrapper.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  # Place any default configuration for solr_wrapper here
2
2
  # port: 8983
3
3
  collection:
4
- dir: solr/conf/
4
+ dir: lib/generators/blacklight/templates/solr/conf/
5
5
  name: blacklight-core
data/.travis.yml CHANGED
@@ -1,28 +1,32 @@
1
- dist: bionic
1
+ dist: trusty
2
2
  addons:
3
3
  chrome: stable
4
4
  language: ruby
5
+ sudo: false
5
6
 
6
7
  notifications:
7
8
  email: false
8
9
 
9
- rvm:
10
- - 2.5.7
11
- - 2.6.5
12
- - 2.7.0
10
+ matrix:
11
+ include:
12
+ - rvm: 2.5.0
13
+ env: "RAILS_VERSION=5.1.5"
14
+ - rvm: 2.4.3
15
+ env: "RAILS_VERSION=5.2.0.rc2"
16
+ - rvm: 2.4.3
17
+ env: "RAILS_VERSION=5.1.5"
18
+ - rvm: 2.3.4
19
+ env: "RAILS_VERSION=5.0.6"
20
+ - rvm: jruby-9.1.16.0
21
+ env: "RAILS_VERSION=5.1.5 JRUBY_OPTS=\"-J-Xms512m -J-Xmx1024m\""
22
+ allow_failures:
23
+ - rvm: jruby-9.1.16.0
24
+ fast_finish: true
13
25
 
14
26
  before_install:
15
27
  - gem update --system
16
28
  - gem install bundler
17
- - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
18
-
19
- before_script:
20
- - if [[ "${RAILS_VERSION}" =~ ^4.2.* ]]; then perl -pi -e "s/ActiveRecord::Migration\[[\d\.]+\]/ActiveRecord::Migration/" db/migrate/*; fi
21
-
22
- env:
23
- - "RAILS_VERSION=5.1.7"
24
- - "RAILS_VERSION=5.2.0"
25
-
29
+ - google-chrome-stable --headless --disable-gpu --no-sandbox --remote-debugging-port=9222 http://localhost &
26
30
 
27
31
  notifications:
28
32
  irc: "irc.freenode.org#blacklight"
@@ -31,14 +35,6 @@ notifications:
31
35
 
32
36
  global_env:
33
37
  - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
34
- - ENGINE_CART_RAILS_OPTIONS='--skip-git --skip-bundle --skip-listen --skip-spring --skip-yarn --skip-keeps --skip-action-cable --skip-coffee --skip-test'
35
- - CC_TEST_REPORTER_ID=5042c7358c96b0b926088a4cda3e132fffe7a66ce8047cdb1dc6f0b4b6676b79
36
-
37
- jdk: openjdk11
38
+ - ENGINE_CART_RAILS_OPTIONS='--skip-git --skip-bundle --skip-listen --skip-spring --skip-yarn --skip-keeps --skip-action-cable --skip-coffee --skip-puma --skip-test'
38
39
 
39
- before_script:
40
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
41
- - chmod +x ./cc-test-reporter
42
- - ./cc-test-reporter before-build
43
- after_script:
44
- - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
40
+ jdk: oraclejdk8
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ source 'https://rubygems.org'
4
4
  gemspec path: File.expand_path('..', __FILE__)
5
5
 
6
6
  group :test do
7
- gem 'activerecord-jdbcsqlite3-adapter', :platform => :jruby
7
+ gem 'activerecord-jdbcsqlite3-adapter', platform: :jruby
8
8
  end
9
9
 
10
10
  # BEGIN ENGINE_CART BLOCK
@@ -32,14 +32,11 @@ else
32
32
  end
33
33
 
34
34
  case ENV['RAILS_VERSION']
35
- when /^5.[12]/
36
- gem 'sass-rails', '~> 5.0'
37
35
  when /^4.2/
38
36
  gem 'responders', '~> 2.0'
39
37
  gem 'sass-rails', '>= 5.0'
40
38
  gem 'coffee-rails', '~> 4.1.0'
41
39
  gem 'json', '~> 1.8'
42
- gem 'capybara', '~> 2.0'
43
40
  when /^4.[01]/
44
41
  gem 'sass-rails', '< 5.0'
45
42
  end
data/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Blacklight
2
2
 
3
- [![Build Status](https://travis-ci.org/projectblacklight/blacklight.png?branch=master)](https://travis-ci.org/projectblacklight/blacklight) [![Gem Version](https://badge.fury.io/rb/blacklight.png)](http://badge.fury.io/rb/blacklight) [![Test Coverage](https://api.codeclimate.com/v1/badges/83fd270492c136594e59/test_coverage)](https://codeclimate.com/github/projectblacklight/blacklight/test_coverage)
3
+ [![Build Status](https://travis-ci.org/projectblacklight/blacklight.png?branch=master)](https://travis-ci.org/projectblacklight/blacklight) [![Gem Version](https://badge.fury.io/rb/blacklight.png)](http://badge.fury.io/rb/blacklight) [![Coverage Status](https://coveralls.io/repos/github/projectblacklight/blacklight/badge.svg?branch=master)](https://coveralls.io/github/projectblacklight/blacklight?branch=master)
4
4
 
5
5
  Blacklight is an open source Solr user interface discovery platform.
6
6
  You can use Blacklight to enable searching and browsing of your collections.
7
7
  Blacklight uses the [Apache Solr](http://lucene.apache.org/solr) search engine
8
8
  to search full text and/or metadata. Blacklight has a highly
9
9
  configurable Ruby on Rails front-end. Blacklight was originally developed at
10
- the University of Virginia Library and is made public under an Apache 2.0 license.
10
+ the University of Virginia Library and is made public under an Apache 2.0 license.
11
11
 
12
12
  ## Installation
13
13
 
@@ -36,7 +36,24 @@ rails generate blacklight:install
36
36
 
37
37
  * Ruby 2.1+
38
38
  * Bundler
39
- * Rails 4.2+
39
+ * Rails 5.0+
40
40
 
41
- ## Configuring Apache Solr
41
+ ## Configuring Apache Solr
42
42
  You'll also want some information about how Blacklight expects [Apache Solr](http://lucene.apache.org/solr ) to run, which you can find in [README_SOLR](https://github.com/projectblacklight/blacklight/wiki/README_SOLR)
43
+
44
+ ## Building the javascript
45
+ The javascript is built by npm from sources in `app/javascript` into a bundle
46
+ in `app/assets/javascripts/blacklight/blacklight.js`. This file should not be edited
47
+ by hand as any changes would be overwritten. When any of the javascript
48
+ components in the gem are changed, this bundle should be rebuild with the
49
+ following steps:
50
+ 1. [Install npm](https://www.npmjs.com/get-npm)
51
+ 1. run `npm install` to download dependencies
52
+ 1. run `npm run js-compile-bundle` to build the bundle
53
+ 1. run `npm publish` to push the javascript package to https://npmjs.org/package/blacklight-frontend
54
+
55
+ ## Using the javascript
56
+ Blacklight ships with Javascript that can be compiled either by Webpacker or by
57
+ Sprockets. To use Webpacker see the directions at https://github.com/projectblacklight/blacklight/wiki/Using-Webpacker-to-compile-javascript-assets
58
+
59
+ If you prefer to use Sprockets, simply run the install generator, which will run the assets generator. For details see https://github.com/projectblacklight/blacklight/wiki/Using-Sprockets-to-compile-javascript-assets
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
- # encoding: UTF-8
2
1
  require 'rubygems'
3
2
  require 'rails'
4
3
  begin
@@ -12,4 +11,4 @@ Bundler::GemHelper.install_tasks
12
11
  load "tasks/blacklight.rake"
13
12
  load "lib/railties/blacklight.rake"
14
13
 
15
- task :default => [:rubocop, :ci]
14
+ task default: [:rubocop, :ci]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 6.24.0
1
+ 7.0.0.rc1
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><style>.a{stroke-width:2;}</style><title>List</title><desc> Created with Sketch.</desc><g fill="none"><path d="M4.9 2L14 2" class="a"/><path d="M5 6L14 6" class="a"/><path d="M5 10L14 10" class="a"/><path d="M5 14L14 14" class="a"/><circle cx="2" cy="2" r="1"/><circle cx="2" cy="6" r="1"/><circle cx="2" cy="10" r="1"/><circle cx="2" cy="14" r="1"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><title>Search</title><g fill="none"><g stroke="#000"><circle cx="6" cy="6" r="5"/><path d="M14 14L10 10" style="stroke-linejoin:round;stroke-width:2"/></g></g></svg>
@@ -1,59 +1,499 @@
1
- // This file is generated by Blacklight. You probably don't want to edit
2
- // this file directly, or you'll have to manually merge your changes if later
3
- // versions of Blacklight change this file. Instead, use your own JS file
4
- // which over-rides things in this JS file, as described below.
5
- //
6
- // These javascript files are compiled in via the Rails asset pipeline:
1
+ Blacklight = function () {
2
+ var buffer = new Array();
3
+ return {
4
+ onLoad: function (func) {
5
+ buffer.push(func);
6
+ },
7
+
8
+ activate: function () {
9
+ for (var i = 0; i < buffer.length; i++) {
10
+ buffer[i].call();
11
+ }
12
+ },
13
+
14
+ listeners: function () {
15
+ var listeners = [];
16
+ if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
17
+ // Turbolinks 5
18
+ if (Turbolinks.BrowserAdapter) {
19
+ listeners.push('turbolinks:load');
20
+ } else {
21
+ // Turbolinks < 5
22
+ listeners.push('page:load', 'ready');
23
+ }
24
+ } else {
25
+ listeners.push('ready');
26
+ }
27
+
28
+ return listeners.join(' ');
29
+ }
30
+ };
31
+ }();
32
+
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
+
39
+ $('.no-js').removeClass('no-js').addClass('js');
40
+ /*global Bloodhound */
41
+
42
+ Blacklight.onLoad(function () {
43
+ 'use strict';
44
+
45
+ $('[data-autocomplete-enabled="true"]').each(function () {
46
+ var $el = $(this);
47
+ if ($el.hasClass('tt-hint')) {
48
+ return;
49
+ }
50
+ var suggestUrl = $el.data().autocompletePath;
51
+
52
+ var terms = new Bloodhound({
53
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
54
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
55
+ remote: {
56
+ url: suggestUrl + '?q=%QUERY',
57
+ wildcard: '%QUERY'
58
+ }
59
+ });
60
+
61
+ terms.initialize();
62
+
63
+ $el.typeahead({
64
+ hint: true,
65
+ highlight: true,
66
+ minLength: 2
67
+ }, {
68
+ name: 'terms',
69
+ displayKey: 'term',
70
+ source: terms.ttAdapter()
71
+ });
72
+ });
73
+ });
74
+ (function ($) {
75
+ //change form submit toggle to checkbox
76
+ Blacklight.doBookmarkToggleBehavior = function () {
77
+ if (typeof Blacklight.do_bookmark_toggle_behavior == 'function') {
78
+ console.warn("do_bookmark_toggle_behavior is deprecated. Use doBookmarkToggleBehavior instead.");
79
+ return Blacklight.do_bookmark_toggle_behavior();
80
+ }
81
+ $(Blacklight.doBookmarkToggleBehavior.selector).blCheckboxSubmit({
82
+ // cssClass is added to elements added, plus used for id base
83
+ cssClass: 'toggle-bookmark',
84
+ success: function (checked, response) {
85
+ if (response.bookmarks) {
86
+ $('[data-role=bookmark-counter]').text(response.bookmarks.count);
87
+ }
88
+ }
89
+ });
90
+ };
91
+ Blacklight.doBookmarkToggleBehavior.selector = 'form.bookmark-toggle';
92
+
93
+ Blacklight.onLoad(function () {
94
+ Blacklight.doBookmarkToggleBehavior();
95
+ });
96
+ })(jQuery);
97
+ /* A JQuery plugin (should this be implemented as a widget instead? not sure)
98
+ that will convert a "toggle" form, with single submit button to add/remove
99
+ something, like used for Bookmarks, into an AJAXy checkbox instead.
100
+
101
+ Apply to a form. Does require certain assumption about the form:
102
+ 1) The same form 'action' href must be used for both ADD and REMOVE
103
+ actions, with the different being the hidden input name="_method"
104
+ being set to "put" or "delete" -- that's the Rails method to pretend
105
+ to be doing a certain HTTP verb. So same URL, PUT to add, DELETE
106
+ to remove. This plugin assumes that.
107
+
108
+ Plus, the form this is applied to should provide a data-doc-id
109
+ attribute (HTML5-style doc-*) that contains the id/primary key
110
+ of the object in question -- used by plugin for a unique value for
111
+ DOM id's.
112
+
113
+ Uses HTML for a checkbox compatible with Bootstrap 3.
114
+
115
+ Pass in options for your class name and labels:
116
+ $("form.something").blCheckboxSubmit({
117
+ checked_label: "Selected",
118
+ unchecked_label: "Select",
119
+ progress_label: "Saving...",
120
+ //cssClass is added to elements added, plus used for id base
121
+ cssClass: "toggle_my_kinda_form",
122
+ success: function(after_success_check_state) {
123
+ #optional callback
124
+ }
125
+ });
126
+ */
127
+ (function ($) {
128
+ $.fn.blCheckboxSubmit = function (argOpts) {
129
+ this.each(function () {
130
+ var options = $.extend({}, $.fn.blCheckboxSubmit.defaults, argOpts);
131
+
132
+ var form = $(this);
133
+ form.children().hide();
134
+ //We're going to use the existing form to actually send our add/removes
135
+ //This works conveneintly because the exact same action href is used
136
+ //for both bookmarks/$doc_id. But let's take out the irrelevant parts
137
+ //of the form to avoid any future confusion.
138
+ form.find('input[type=submit]').remove();
139
+
140
+ //View needs to set data-doc-id so we know a unique value
141
+ //for making DOM id
142
+ var uniqueId = form.attr('data-doc-id') || Math.random();
143
+ // if form is currently using method delete to change state,
144
+ // then checkbox is currently checked
145
+ var checked = form.find('input[name=_method][value=delete]').size() != 0;
146
+
147
+ var checkbox = $('<input type="checkbox">').addClass(options.cssClass).attr('id', options.cssClass + '_' + uniqueId);
148
+ var label = $('<label>').addClass(options.cssClass).attr('for', options.cssClass + '_' + uniqueId).attr('title', form.attr('title') || '');
149
+ var span = $('<span>');
150
+
151
+ label.append(checkbox);
152
+ label.append(' ');
153
+ label.append(span);
154
+
155
+ var checkboxDiv = $('<div class="checkbox" />').addClass(options.cssClass).append(label);
156
+
157
+ function updateStateFor(state) {
158
+ checkbox.prop('checked', state);
159
+ label.toggleClass('checked', state);
160
+ if (state) {
161
+ //Set the Rails hidden field that fakes an HTTP verb
162
+ //properly for current state action.
163
+ form.find('input[name=_method]').val('delete');
164
+ span.text(form.attr('data-present'));
165
+ } else {
166
+ form.find('input[name=_method]').val('put');
167
+ span.text(form.attr('data-absent'));
168
+ }
169
+ }
170
+
171
+ form.append(checkboxDiv);
172
+ updateStateFor(checked);
173
+
174
+ checkbox.click(function () {
175
+ span.text(form.attr('data-inprogress'));
176
+ label.attr('disabled', 'disabled');
177
+ checkbox.attr('disabled', 'disabled');
178
+
179
+ $.ajax({
180
+ url: form.attr('action'),
181
+ dataType: 'json',
182
+ type: form.attr('method').toUpperCase(),
183
+ data: form.serialize(),
184
+ error: function () {
185
+ alert('Error');
186
+ updateStateFor(checked);
187
+ label.removeAttr('disabled');
188
+ checkbox.removeAttr('disabled');
189
+ },
190
+ success: function (data, status, xhr) {
191
+ //if app isn't running at all, xhr annoyingly
192
+ //reports success with status 0.
193
+ if (xhr.status != 0) {
194
+ checked = !checked;
195
+ updateStateFor(checked);
196
+ label.removeAttr('disabled');
197
+ checkbox.removeAttr('disabled');
198
+ options.success.call(form, checked, xhr.responseJSON);
199
+ } else {
200
+ alert('Error');
201
+ updateStateFor(checked);
202
+ label.removeAttr('disabled');
203
+ checkbox.removeAttr('disabled');
204
+ }
205
+ }
206
+ });
207
+
208
+ return false;
209
+ }); //checkbox.click
210
+
211
+ }); //this.each
212
+ return this;
213
+ };
214
+
215
+ $.fn.blCheckboxSubmit.defaults = {
216
+ //cssClass is added to elements added, plus used for id base
217
+ cssClass: 'blCheckboxSubmit',
218
+ success: function () {} //callback
219
+ };
220
+ })(jQuery);
221
+ (function ($) {
222
+ Blacklight.onLoad(function () {
223
+ // when clicking on a link that toggles the collapsing behavior, don't do anything
224
+ // with the hash or the page could jump around.
225
+ $(document).on('click', 'a[data-toggle=collapse][href="#"], [data-toggle=collapse] a[href="#"]', function (event) {
226
+ event.preventDefault();
227
+ });
228
+ });
229
+ })(jQuery);
230
+ /*global Blacklight */
231
+
232
+ (function ($) {
233
+ 'use strict';
234
+
235
+ Blacklight.doResizeFacetLabelsAndCounts = function () {
236
+ // adjust width of facet columns to fit their contents
237
+ function longer(a, b) {
238
+ return b.textContent.length - a.textContent.length;
239
+ }
240
+
241
+ $('ul.facet-values, ul.pivot-facet').each(function () {
242
+ var longest = $(this).find('span.facet-count').sort(longer)[0];
243
+
244
+ if (longest && longest.textContent) {
245
+ var width = longest.textContent.length + 1 + 'ch';
246
+ $(this).find('.facet-count').first().width(width);
247
+ }
248
+ });
249
+ };
250
+
251
+ Blacklight.onLoad(function () {
252
+ Blacklight.doResizeFacetLabelsAndCounts();
253
+ });
254
+ })(jQuery);
7
255
  //= require blacklight/core
8
- //= require blacklight/autocomplete
9
- //= require blacklight/bookmark_toggle
10
- //= require blacklight/collapsable
11
- //= require blacklight/facet_load
12
- //= require blacklight/ajax_modal
13
- //= require blacklight/search_context
14
- //= require blacklight/autofocus
15
- //
16
- //Bootstrap JS for providing collapsable tablet/mobile menu/alert boxes
17
- //= require bootstrap/transition
18
- //= require bootstrap/collapse
19
- //= require bootstrap/dropdown
20
- //= require bootstrap/alert
21
- //= require bootstrap/modal
22
-
23
- // Twitter Typeahead for autocomplete
24
- //= require twitter/typeahead
25
-
26
- /* Blacklight has a Javascript setup meant to support local disabling,
27
- modification, and use of Blacklight behaviors.
28
-
29
- There is a global Blacklight object, available to your local JS.
30
-
31
- Individual logic to apply JS behaviors to particular elements is
32
- stored in functions on that Blacklight object.
33
-
34
- The actual behaviors themselves are implemented as JQuery plugins,
35
- JQuery-UI widgets (a special kind of JQuery plugin), or in some cases
36
- just as logic in the Blacklight global object.
37
-
38
- All of these things can be modified by your local JS code -- these functions
39
- are all set up on js load, and only called on document ready, so do your
40
- modifications just on js load, and they'll be made by the time document ready
41
- comes along.
42
-
43
- Examples, in your application's own JS:
44
-
45
- Turn off adding of behavior to facet 'more' links, using a no-op function:
46
-
47
- Blacklight.do_more_facets_behavior = function() {};
48
-
49
- Change the implementation of facet 'more' link behavior to use entirely
50
- different JS.
51
-
52
- Blacklight.do_more_facets_behavior = function() {
53
- $(Blacklight.do_more_facets_behavior.selector).each(function() {
54
- //my own thing!
55
- });
56
- };
256
+
257
+ /*
258
+ The blacklight modal plugin can display some interactions inside a Bootstrap
259
+ modal window, including some multi-page interactions.
260
+
261
+ It supports unobtrusive Javascript, where a link or form that would have caused
262
+ a new page load is changed to display it's results inside a modal dialog,
263
+ by this plugin. The plugin assumes there is a Bootstrap modal div
264
+ on the page with id #blacklight-modal to use as the modal -- the standard Blacklight
265
+ layout provides this.
266
+
267
+ To make a link or form have their results display inside a modal, add
268
+ `data-blacklight-modal="trigger"` to the link or form. (Note, form itself not submit input)
269
+ With Rails link_to helper, you'd do that like:
270
+
271
+ link_to something, link, data: { blacklight_modal: "trigger" }
272
+
273
+ The results of the link href or form submit will be displayed inside
274
+ a modal -- they should include the proper HTML markup for a bootstrap modal's
275
+ contents. Also, you ordinarily won't want the Rails template with wrapping
276
+ navigational elements to be used. The Rails controller could suppress
277
+ the layout when a JS AJAX request is detected, OR the response
278
+ can include a `<div data-blacklight-modal="container">` -- only the contents
279
+ of the container will be placed inside the modal, the rest of the
280
+ page will be ignored.
281
+
282
+ If you'd like to have a link or button that closes the modal,
283
+ you can just add a `data-dismiss="modal"` to the link,
284
+ standard Bootstrap convention. But you can also have
285
+ an href on this link for non-JS contexts, we'll make sure
286
+ inside the modal it closes the modal and the link is NOT followed.
287
+
288
+ Link or forms inside the modal will ordinarily cause page loads
289
+ when they are triggered. However, if you'd like their results
290
+ to stay within the modal, just add `data-blacklight-modal="preserve"`
291
+ to the link or form.
292
+
293
+ Here's an example of what might be returned, demonstrating most of the devices available:
294
+
295
+ <div data-blacklight-modal="container">
296
+ <div class="modal-header">
297
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
298
+ <h3 class="modal-title">Request Placed</h3>
299
+ </div>
300
+
301
+ <div class="modal-body">
302
+ <p>Some message</p>
303
+ <%= link_to "This result will still be within modal", some_link, data: { blacklight: "preserve" } %>
304
+ </div>
305
+
306
+
307
+ <div class="modal-footer">
308
+ <%= link_to "Close the modal", request_done_path, class: "submit button dialog-close", data: { dismiss: "modal" } %>
309
+ </div>
310
+ </div>
311
+
312
+
313
+ One additional feature. If the content returned from the AJAX modal load
314
+ has an element with `data-blacklight-modal=close`, that will trigger the modal
315
+ to be closed. And if this element includes a node with class "flash_messages",
316
+ the flash-messages node will be added to the main page inside #main-flahses.
317
+
318
+ == Events
319
+
320
+ We'll send out an event 'loaded.blacklight.blacklight-modal' with the #blacklight-modal
321
+ dialog as the target, right after content is loaded into the modal but before
322
+ it is shown (if not already a shown modal). In an event handler, you can
323
+ inspect loaded content by looking inside $(this). If you call event.preventDefault(),
324
+ we won't 'show' the dialog (although it may already have been shown, you may want to
325
+ $(this).modal("hide") if you want to ensure hidden/closed.
326
+
327
+ The data-blacklight-modal=close behavior is implemented with this event, see for example.
57
328
  */
58
329
 
59
- $('.no-js').removeClass('no-js').addClass('js');
330
+ // We keep all our data in Blacklight.modal object.
331
+ // Create lazily if someone else created first.
332
+ if (Blacklight.modal === undefined) {
333
+ Blacklight.modal = {};
334
+ }
335
+
336
+ // a Bootstrap modal div that should be already on the page hidden
337
+ Blacklight.modal.modalSelector = '#blacklight-modal';
338
+
339
+ // Trigger selectors identify forms or hyperlinks that should open
340
+ // inside a modal dialog.
341
+ Blacklight.modal.triggerLinkSelector = 'a[data-blacklight-modal~=trigger]';
342
+ Blacklight.modal.triggerFormSelector = 'form[data-blacklight-modal~=trigger]';
343
+
344
+ // preserve selectors identify forms or hyperlinks that, if activated already
345
+ // inside a modal dialog, should have destinations remain inside the modal -- but
346
+ // won't trigger a modal if not already in one.
347
+ //
348
+ // No need to repeat selectors from trigger selectors, those will already
349
+ // be preserved. MUST be manually prefixed with the modal selector,
350
+ // so they only apply to things inside a modal.
351
+ Blacklight.modal.preserveLinkSelector = Blacklight.modal.modalSelector + ' a[data-blacklight-modal~=preserve]';
352
+
353
+ Blacklight.modal.containerSelector = '[data-blacklight-modal~=container]';
354
+
355
+ Blacklight.modal.modalCloseSelector = '[data-blacklight-modal~=close]';
356
+
357
+ // Called on fatal failure of ajax load, function returns content
358
+ // to show to user in modal. Right now called only for extreme
359
+ // network errors.
360
+ Blacklight.modal.onFailure = function (data) {
361
+ var contents = '<div class="modal-header">' + '<div class="modal-title">Network Error</div>' + '<button type="button" class="blacklight-modal-close close" data-dismiss="modal" aria-label="Close">' + ' <span aria-hidden="true">&times;</span>' + '</button>';
362
+ $(Blacklight.modal.modalSelector).find('.modal-content').html(contents);
363
+ $(Blacklight.modal.modalSelector).modal('show');
364
+ };
365
+
366
+ Blacklight.modal.receiveAjax = function (contents) {
367
+ // does it have a data- selector for container?
368
+ // important we don't execute script tags, we shouldn't.
369
+ // code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/master/src/ajax/load.js?source=c#L62
370
+ var container = $('<div>').append(jQuery.parseHTML(contents)).find(Blacklight.modal.containerSelector).first();
371
+ if (container.size() !== 0) {
372
+ contents = container.html();
373
+ }
374
+
375
+ $(Blacklight.modal.modalSelector).find('.modal-content').html(contents);
376
+
377
+ // send custom event with the modal dialog div as the target
378
+ var e = $.Event('loaded.blacklight.blacklight-modal');
379
+ $(Blacklight.modal.modalSelector).trigger(e);
380
+ // if they did preventDefault, don't show the dialog
381
+ if (e.isDefaultPrevented()) return;
382
+
383
+ $(Blacklight.modal.modalSelector).modal('show');
384
+ };
385
+
386
+ Blacklight.modal.modalAjaxLinkClick = function (e) {
387
+ e.preventDefault();
388
+
389
+ $.ajax({
390
+ url: $(this).attr('href')
391
+ }).fail(Blacklight.modal.onFailure).done(Blacklight.modal.receiveAjax);
392
+ };
393
+
394
+ Blacklight.modal.modalAjaxFormSubmit = function (e) {
395
+ e.preventDefault();
396
+
397
+ $.ajax({
398
+ url: $(this).attr('action'),
399
+ data: $(this).serialize(),
400
+ type: $(this).attr('method') // POST
401
+ }).fail(Blacklight.modal.onFailure).done(Blacklight.modal.receiveAjax);
402
+ };
403
+
404
+ Blacklight.modal.setupModal = function () {
405
+ // Event indicating blacklight is setting up a modal link,
406
+ // you can catch it and call e.preventDefault() to abort
407
+ // setup.
408
+ var e = $.Event('setup.blacklight.blacklight-modal');
409
+ $('body').trigger(e);
410
+ if (e.isDefaultPrevented()) return;
411
+
412
+ // Register both trigger and preserve selectors in ONE event handler, combining
413
+ // into one selector with a comma, so if something matches BOTH selectors, it
414
+ // still only gets the event handler called once.
415
+ $('body').on('click', Blacklight.modal.triggerLinkSelector + ', ' + Blacklight.modal.preserveLinkSelector, Blacklight.modal.modalAjaxLinkClick);
416
+ $('body').on('submit', Blacklight.modal.triggerFormSelector + ', ' + Blacklight.modal.preserveFormSelector, Blacklight.modal.modalAjaxFormSubmit);
417
+
418
+ // Catch our own custom loaded event to implement data-blacklight-modal=closed
419
+ $('body').on('loaded.blacklight.blacklight-modal', Blacklight.modal.checkCloseModal);
420
+
421
+ // we support doing data-dismiss=modal on a <a> with a href for non-ajax
422
+ // use, we need to suppress following the a's href that's there for
423
+ // non-JS contexts.
424
+ $('body').on('click', Blacklight.modal.modalSelector + ' a[data-dismiss~=modal]', function (e) {
425
+ e.preventDefault();
426
+ });
427
+ };
428
+
429
+ // A function used as an event handler on loaded.blacklight.blacklight-modal
430
+ // to catch contained data-blacklight-modal=closed directions
431
+ Blacklight.modal.checkCloseModal = function (event) {
432
+ if ($(event.target).find(Blacklight.modal.modalCloseSelector).length) {
433
+ var modalFlashes = $(this).find('.flash_messages');
434
+
435
+ $(event.target).modal('hide');
436
+ event.preventDefault();
437
+
438
+ var mainFlashes = $('#main-flashes');
439
+ mainFlashes.append(modalFlashes);
440
+ modalFlashes.fadeIn(500);
441
+ }
442
+ };
443
+
444
+ Blacklight.onLoad(function () {
445
+ Blacklight.modal.setupModal();
446
+ });
447
+ //= require blacklight/core
448
+ (function ($) {
449
+ Blacklight.doSearchContextBehavior = function () {
450
+ if (typeof Blacklight.do_search_context_behavior == 'function') {
451
+ console.warn("do_search_context_behavior is deprecated. Use doSearchContextBehavior instead.");
452
+ return Blacklight.do_search_context_behavior();
453
+ }
454
+ $('a[data-context-href]').on('click.search-context', Blacklight.handleSearchContextMethod);
455
+ };
456
+
457
+ // this is the $.rails.handleMethod with a couple adjustments, described inline:
458
+ // first, we're attaching this directly to the event handler, so we can check for meta-keys
459
+ Blacklight.handleSearchContextMethod = function (event) {
460
+ if (typeof Blacklight.handle_search_context_method == 'function') {
461
+ console.warn("handle_search_context_method is deprecated. Use handleSearchContextMethod instead.");
462
+ return Blacklight.handle_search_context_method(event);
463
+ }
464
+ var link = $(this);
465
+
466
+ // instead of using the normal href, we need to use the context href instead
467
+ var href = link.data('context-href'),
468
+ method = 'post',
469
+ target = link.attr('target'),
470
+ csrfToken = $('meta[name=csrf-token]').attr('content'),
471
+ csrfParam = $('meta[name=csrf-param]').attr('content'),
472
+ form = $('<form method="post" action="' + href + '"></form>'),
473
+ metadataInput = '<input name="_method" value="' + method + '" type="hidden" />',
474
+ redirectHref = '<input name="redirect" value="' + link.attr('href') + '" type="hidden" />';
475
+
476
+ // check for meta keys.. if set, we should open in a new tab
477
+ if (event.metaKey || event.ctrlKey) {
478
+ target = '_blank';
479
+ }
480
+
481
+ if (csrfParam !== undefined && csrfToken !== undefined) {
482
+ metadataInput += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
483
+ }
484
+
485
+ if (target) {
486
+ form.attr('target', target);
487
+ }
488
+
489
+ form.hide().append(metadataInput).append(redirectHref).appendTo('body');
490
+ form.submit();
491
+
492
+ return false;
493
+ };
494
+
495
+ Blacklight.onLoad(function () {
496
+ Blacklight.doSearchContextBehavior();
497
+ });
498
+ })(jQuery);
499
+