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
@@ -0,0 +1,29 @@
1
+ .blacklight-icons {
2
+ display: inline-block;
3
+ height: $font-size-base;
4
+ vertical-align: text-top;
5
+ width: $font-size-base;
6
+ }
7
+
8
+ @each $color, $value in $theme-colors {
9
+ .btn-#{$color} {
10
+ .blacklight-icons g {
11
+ @include stroke-yiq(theme-color($color));
12
+ }
13
+ }
14
+
15
+ .btn-outline-#{$color} {
16
+ .blacklight-icons g {
17
+ stroke: $value;
18
+ }
19
+
20
+ &.hover,
21
+ &:hover,
22
+ &:active,
23
+ &.active {
24
+ .blacklight-icons g {
25
+ @include stroke-yiq(theme-color($color));
26
+ }
27
+ }
28
+ }
29
+ }
@@ -1,11 +1 @@
1
1
  /* Generic layout stuff */
2
-
3
- .navbar + .navbar {
4
- margin-top: -$navbar-margin-bottom;
5
- }
6
-
7
- .navbar-inverse .navbar-toggle {
8
- &:focus, &:hover {
9
- border-color: $gray-light;
10
- }
11
- }
@@ -0,0 +1,15 @@
1
+ // Stroke contrast
2
+ // Ripped off from https://github.com/twbs/bootstrap/commit/c31d52499811d5c68d122db806ce27a112b489bd
3
+ @mixin stroke-yiq($color) {
4
+ $r: red($color);
5
+ $g: green($color);
6
+ $b: blue($color);
7
+
8
+ $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
9
+
10
+ @if ($yiq >= 150) {
11
+ stroke: #111;
12
+ } @else {
13
+ stroke: #fff;
14
+ }
15
+ }
@@ -1,29 +1,21 @@
1
- #ajax-modal {
1
+ .modal-content {
2
+ @extend .clearfix;
2
3
 
3
- .modal-content {
4
- @extend .clearfix;
5
- }
6
-
7
- #email_form {
8
- width: auto;
9
- }
10
-
11
- .facet_pagination.top {
4
+ .facet-pagination.top {
12
5
  display: none;
13
6
  }
14
7
 
15
- #sidebar {
8
+ .page-sidebar {
16
9
  display: none;
17
10
  }
18
11
 
19
- button.close {
20
- display: block;
12
+ .blacklight-modal-close {
13
+ display: block;
21
14
  }
22
15
  }
23
16
 
24
-
25
- /* app/views/catalog/facet.html.erb may be rendered as a modal or a whole page.
26
- When it's a whole page, don't show the close button. */
27
- button.ajax-modal-close.close {
17
+ // app/views/catalog/facet.html.erb may be rendered as a modal or a whole page.
18
+ // When it's a whole page, don't show the close button.
19
+ .blacklight-modal-close {
28
20
  display: none;
29
21
  }
@@ -1,21 +1,6 @@
1
- .page_links {
1
+ .page-links {
2
2
  display: inline-block;
3
3
  border: 1px solid transparent;
4
- padding: $padding-base-vertical $padding-base-horizontal;
4
+ padding: $input-btn-padding-y $input-btn-padding-x;
5
5
  padding-left: 0;
6
6
  }
7
-
8
- .pagination {
9
- text-align: center ;
10
- }
11
-
12
-
13
- .pagination-xs {
14
- li {
15
- a,
16
- span {
17
- border: none;
18
- padding: $padding-xs-vertical $padding-xs-horizontal;
19
- }
20
- }
21
- }
@@ -1,20 +1,12 @@
1
1
  /* Search History */
2
- .search_history
3
- {
4
-
5
- .constraint
6
- {
2
+ .search-history {
3
+ .constraint {
4
+ @extend .px-3;
7
5
  display: block;
8
- text-indent: -$padding-large-horizontal;
9
- padding-left: $padding-large-horizontal;
10
-
6
+ text-indent: -1 * map-get($spacers, 3);
11
7
  }
12
8
 
13
- .filterName, .filterSeparator
14
- {
9
+ .filter-name, .filter-separator {
15
10
  @extend .text-muted;
16
11
  }
17
12
  }
18
-
19
-
20
-
@@ -1,10 +1,10 @@
1
1
  // the search results on the index view of the catalog
2
- #documents {
2
+ .documents-list {
3
3
  .document {
4
- margin-top: $padding-base-vertical;
5
- padding-top: $padding-base-vertical;
6
- border-bottom:1px dotted $table-border-color;
7
4
  @extend .clearfix;
5
+ border-bottom: 1px dotted $table-border-color;
6
+ margin-top: $spacer;
7
+ padding-top: $spacer;
8
8
 
9
9
  .document-title-heading {
10
10
  @extend h5;
@@ -13,16 +13,17 @@
13
13
  // bookmarks checkbox on index, give it some
14
14
  // lower margin when it collapses
15
15
  .index-document-functions {
16
- margin-bottom: ($line-height-computed / 2);
17
- @media (min-width: $screen-sm-min) {
16
+ margin-bottom: ($line-height-base / 2);
17
+
18
+ @media (min-width: breakpoint-min(sm)) {
18
19
  margin-bottom: 0;
19
20
  }
20
21
  }
21
22
 
22
23
  .document-thumbnail {
23
24
  float: right;
24
- padding-left: $line-height-computed;
25
- margin-bottom: $line-height-computed;
25
+ margin-bottom: $line-height-base;
26
+ padding-left: $line-height-base;
26
27
  }
27
28
  }
28
29
  }
@@ -1,6 +1,5 @@
1
1
  .twitter-typeahead {
2
- float: left;
3
- width: 100%;
2
+ flex-grow: 2;
4
3
  z-index: $zindex-typeahead;
5
4
 
6
5
  input.tt-input.form-control {
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Blacklight
4
+ # Dynamically creates methods on the given controller (typically CatalogController)
5
+ # for handling configured show tools
6
+ class ActionBuilder
7
+ def initialize(klass, name, opts)
8
+ @klass = klass
9
+ @name = name
10
+ @opts = opts
11
+ end
12
+
13
+ attr_reader :klass, :name, :opts
14
+
15
+ # Define a simple action handler for the tool as long as the method
16
+ # doesn't already exist or the `:define_method` option is not `false`
17
+ def build
18
+ return if skip?
19
+ callback = opts.fetch(:callback, nil).inspect
20
+ validator = opts.fetch(:validator, nil).inspect
21
+ klass.class_eval <<EORUBY, __FILE__, __LINE__ + 1
22
+ def #{name}
23
+ @response, @documents = action_documents
24
+
25
+ if request.post? && #{callback} &&
26
+ (#{validator}.blank? || send(#{validator}))
27
+
28
+ send(#{callback}, @documents)
29
+
30
+ flash[:success] ||= I18n.t("blacklight.#{name}.success", default: nil)
31
+
32
+ respond_to do |format|
33
+ format.html do
34
+ return render "#{name}_success" if request.xhr?
35
+ redirect_to action_success_redirect_path
36
+ end
37
+ end
38
+ else
39
+ respond_to do |format|
40
+ format.html do
41
+ return render layout: false if request.xhr?
42
+ # Otherwise draw the full page
43
+ end
44
+ end
45
+ end
46
+ end
47
+ EORUBY
48
+ end
49
+
50
+ private
51
+
52
+ def skip?
53
+ klass.method_defined?(name) || opts[:define_method] == false
54
+ end
55
+ end
56
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
- class BookmarksController < CatalogController
2
+ class BookmarksController < CatalogController
3
3
  include Blacklight::Bookmarks
4
- end
4
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
- class CatalogController < ApplicationController
2
+ class CatalogController < ApplicationController
3
3
  include Blacklight::Catalog
4
- end
4
+ end
@@ -3,38 +3,5 @@ module Blacklight::Base
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  include Blacklight::Configurable
6
- include Blacklight::SearchHelper
7
-
8
6
  include Blacklight::SearchContext
9
-
10
- included do
11
- # When Blacklight::Exceptions::InvalidRequest is raised, the rsolr_request_error method is executed.
12
- # The index action will more than likely throw this one.
13
- # Example, when the standard query parser is used, and a user submits a "bad" query.
14
- rescue_from Blacklight::Exceptions::InvalidRequest, with: :handle_request_error if respond_to? :rescue_from
15
- end
16
-
17
- protected
18
-
19
- # when The index throws an error (Blacklight::Exceptions::InvalidRequest), this method is executed.
20
- def handle_request_error(exception)
21
- if Rails.env.development? || Rails.env.test?
22
- raise exception # Rails own code will catch and give usual Rails error page with stack trace
23
- else
24
-
25
- flash_notice = I18n.t('blacklight.search.errors.request_error')
26
-
27
- # If there are errors coming from the index page, we want to trap those sensibly
28
-
29
- if flash[:notice] == flash_notice
30
- logger.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
31
- raise exception
32
- end
33
-
34
- logger.error exception
35
-
36
- flash[:notice] = flash_notice
37
- redirect_to root_path
38
- end
39
- end
40
7
  end
@@ -8,7 +8,6 @@ module Blacklight::Bookmarks
8
8
  ##
9
9
  # Give Bookmarks access to the CatalogController configuration
10
10
  include Blacklight::Configurable
11
- include Blacklight::SearchHelper
12
11
  include Blacklight::TokenBasedUser
13
12
 
14
13
  copy_blacklight_config_from(CatalogController)
@@ -25,7 +24,7 @@ module Blacklight::Bookmarks
25
24
  def action_documents
26
25
  bookmarks = token_or_current_or_guest_user.bookmarks
27
26
  bookmark_ids = bookmarks.collect { |b| b.document_id.to_s }
28
- fetch(bookmark_ids)
27
+ search_service.fetch(bookmark_ids)
29
28
  end
30
29
 
31
30
  def action_success_redirect_path
@@ -41,13 +40,13 @@ module Blacklight::Bookmarks
41
40
  def index
42
41
  @bookmarks = token_or_current_or_guest_user.bookmarks
43
42
  bookmark_ids = @bookmarks.collect { |b| b.document_id.to_s }
44
-
45
- @response, @document_list = fetch(bookmark_ids)
43
+ @response, deprecated_document_list = search_service.fetch(bookmark_ids)
44
+ @document_list = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_document_list, "The @document_list instance variable is now deprecated and will be removed in Blacklight 8.0")
46
45
 
47
46
  respond_to do |format|
48
- format.html { }
49
- format.rss { render :layout => false }
50
- format.atom { render :layout => false }
47
+ format.html {}
48
+ format.rss { render layout: false }
49
+ format.atom { render layout: false }
51
50
  format.json do
52
51
  render json: render_search_results_as_json
53
52
  end
@@ -71,7 +70,7 @@ module Blacklight::Bookmarks
71
70
  # is simpler.
72
71
  def create
73
72
  @bookmarks = if params[:bookmarks]
74
- permit_bookmarks[:bookmarks]
73
+ params[:bookmarks]
75
74
  else
76
75
  [{ document_id: params[:id], document_type: blacklight_config.document_model.to_s }]
77
76
  end
@@ -79,16 +78,16 @@ module Blacklight::Bookmarks
79
78
  current_or_guest_user.save! unless current_or_guest_user.persisted?
80
79
 
81
80
  success = @bookmarks.all? do |bookmark|
82
- current_or_guest_user.bookmarks.where(bookmark).exists? || current_or_guest_user.bookmarks.create(bookmark)
81
+ current_or_guest_user.bookmarks.where(bookmark).exists? || current_or_guest_user.bookmarks.create(bookmark)
83
82
  end
84
83
 
85
84
  if request.xhr?
86
- success ? render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count }}) : render(plain: "", status: "500")
85
+ success ? render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count } }) : render(plain: "", status: "500")
87
86
  else
88
87
  if @bookmarks.any? && success
89
- flash[:notice] = I18n.t('blacklight.bookmarks.add.success', :count => @bookmarks.length)
88
+ flash[:notice] = I18n.t('blacklight.bookmarks.add.success', count: @bookmarks.length)
90
89
  elsif @bookmarks.any?
91
- flash[:error] = I18n.t('blacklight.bookmarks.add.failure', :count => @bookmarks.length)
90
+ flash[:error] = I18n.t('blacklight.bookmarks.add.failure', count: @bookmarks.length)
92
91
  end
93
92
 
94
93
  if respond_to? :redirect_back
@@ -103,21 +102,11 @@ module Blacklight::Bookmarks
103
102
  # Beware, :id is the Solr document_id, not the actual Bookmark id.
104
103
  # idempotent, as DELETE is supposed to be.
105
104
  def destroy
106
- @bookmarks =
107
- if params[:bookmarks]
108
- permit_bookmarks[:bookmarks]
109
- else
110
- [{ document_id: params[:id], document_type: blacklight_config.document_model.to_s }]
111
- end
112
-
113
- success = @bookmarks.all? do |bookmark|
114
- bookmark = current_or_guest_user.bookmarks.find_by(bookmark)
115
- bookmark && bookmark.delete && bookmark.destroyed?
116
- end
105
+ bookmark = current_or_guest_user.bookmarks.find_by(document_id: params[:id], document_type: blacklight_config.document_model.to_s)
117
106
 
118
- if success
107
+ if bookmark && bookmark.delete && bookmark.destroyed?
119
108
  if request.xhr?
120
- render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count }})
109
+ render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count } })
121
110
  elsif respond_to? :redirect_back
122
111
  redirect_back fallback_location: bookmarks_path, notice: I18n.t('blacklight.bookmarks.remove.success')
123
112
  else
@@ -126,11 +115,8 @@ module Blacklight::Bookmarks
126
115
  end
127
116
  elsif request.xhr?
128
117
  head 500 # ajaxy request needs no redirect and should not have flash set
129
- elsif respond_to? :redirect_back
130
- redirect_back fallback_location: bookmarks_path, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
131
118
  else
132
- # Deprecated in Rails 5.0
133
- redirect_to :back, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
119
+ redirect_back fallback_location: bookmarks_path, flash: { error: I18n.t('blacklight.bookmarks.remove.failure') }
134
120
  end
135
121
  end
136
122
 
@@ -140,22 +126,19 @@ module Blacklight::Bookmarks
140
126
  else
141
127
  flash[:error] = I18n.t('blacklight.bookmarks.clear.failure')
142
128
  end
143
- redirect_to :action => "index"
129
+ redirect_to action: "index"
144
130
  end
145
131
 
146
- protected
132
+ private
147
133
 
148
134
  def verify_user
149
- unless current_or_guest_user or (action == "index" and token_or_current_or_guest_user)
150
- flash[:notice] = I18n.t('blacklight.bookmarks.need_login') and raise Blacklight::Exceptions::AccessDenied
135
+ unless current_or_guest_user || (action == "index" && token_or_current_or_guest_user)
136
+ flash[:notice] = I18n.t('blacklight.bookmarks.need_login')
137
+ raise Blacklight::Exceptions::AccessDenied
151
138
  end
152
139
  end
153
140
 
154
141
  def start_new_search_session?
155
142
  action_name == "index"
156
143
  end
157
-
158
- def permit_bookmarks
159
- params.permit(bookmarks: [:document_id, :document_type])
160
- end
161
144
  end
@@ -3,270 +3,311 @@ module Blacklight::Catalog
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  include Blacklight::Base
6
- include Blacklight::DefaultComponentConfiguration
7
6
  include Blacklight::Facet
8
7
 
9
8
  # The following code is executed when someone includes blacklight::catalog in their
10
9
  # own controller.
11
10
  included do
12
- if respond_to? :helper_method
13
- helper_method :sms_mappings, :has_search_parameters?
14
- end
11
+ helper_method :sms_mappings, :has_search_parameters?, :facet_limit_for
15
12
 
16
- helper Blacklight::Facet if respond_to? :helper
13
+ helper Blacklight::Facet
17
14
 
18
- # When an action raises Blacklight::Exceptions::RecordNotFound, handle
19
- # the exception appropriately.
20
- rescue_from Blacklight::Exceptions::RecordNotFound, with: :invalid_document_id_error
15
+ # The index action will more than likely throw this one.
16
+ # Example: when the standard query parser is used, and a user submits a "bad" query.
17
+ rescue_from Blacklight::Exceptions::InvalidRequest, with: :handle_request_error
21
18
 
22
19
  record_search_parameters
23
20
  end
24
21
 
25
- # get search results from the solr index
26
- def index
27
- (@response, @document_list) = search_results(params)
28
-
29
- respond_to do |format|
30
- format.html { store_preferred_view }
31
- format.rss { render :layout => false }
32
- format.atom { render :layout => false }
33
- format.json do
34
- @presenter = Blacklight::JsonPresenter.new(@response,
35
- @document_list,
36
- facets_from_request,
37
- blacklight_config)
38
- end
39
- additional_response_formats(format)
40
- document_export_formats(format)
41
- end
42
- end
22
+ # get search results from the solr index
23
+ def index
24
+ (@response, deprecated_document_list) = search_service.search_results
25
+
26
+ @document_list = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_document_list, 'The @document_list instance variable is deprecated; use @response.documents instead.')
43
27
 
44
- # get a single document from the index
45
- # to add responses for formats other than html or json see _Blacklight::Document::Export_
46
- def show
47
- @response, @document = fetch params[:id]
48
- respond_to do |format|
49
- format.html { setup_next_and_previous_documents }
50
- format.json { render json: { response: { document: @document } } }
51
- additional_export_formats(@document, format)
28
+ respond_to do |format|
29
+ format.html { store_preferred_view }
30
+ format.rss { render layout: false }
31
+ format.atom { render layout: false }
32
+ format.json do
33
+ @presenter = Blacklight::JsonPresenter.new(@response,
34
+ facets_from_request,
35
+ blacklight_config)
52
36
  end
37
+ additional_response_formats(format)
38
+ document_export_formats(format)
53
39
  end
40
+ end
54
41
 
55
- # updates the search counter (allows the show view to paginate)
56
- def track
57
- search_session['counter'] = params[:counter]
58
- search_session['id'] = params[:search_id]
59
- search_session['per_page'] = params[:per_page]
42
+ # get a single document from the index
43
+ # to add responses for formats other than html or json see _Blacklight::Document::Export_
44
+ def show
45
+ deprecated_response, @document = search_service.fetch(params[:id])
46
+ @response = ActiveSupport::Deprecation::DeprecatedObjectProxy.new(deprecated_response, 'The @response instance variable is deprecated; use @document.response instead.')
60
47
 
61
- if params[:redirect] and (params[:redirect].starts_with?('/') or params[:redirect] =~ URI::DEFAULT_PARSER.make_regexp)
62
- uri = URI.parse(params[:redirect])
63
- path = uri.query ? "#{uri.path}?#{uri.query}" : uri.path
64
- redirect_to path, status: 303
65
- else
66
- redirect_to blacklight_config.document_model.new(id: params[:id]), status: 303
67
- end
48
+ respond_to do |format|
49
+ format.html { @search_context = setup_next_and_previous_documents }
50
+ format.json { render json: { response: { document: @document } } }
51
+ additional_export_formats(@document, format)
68
52
  end
53
+ end
69
54
 
70
- # displays values and pagination links for a single facet field
71
- def facet
72
- @facet = blacklight_config.facet_fields[params[:id]]
73
- raise ActionController::RoutingError, 'Not Found' unless @facet
74
- @response = get_facet_field_response(@facet.key, params)
75
- @display_facet = @response.aggregations[@facet.field]
76
- @pagination = facet_paginator(@facet, @display_facet)
77
- respond_to do |format|
78
- format.html do
79
- # Draw the partial for the "more" facet modal window:
80
- return render layout: false if request.xhr?
81
- # Otherwise draw the facet selector for users who have javascript disabled.
82
- end
83
- format.json
84
- end
55
+ # updates the search counter (allows the show view to paginate)
56
+ def track
57
+ search_session['counter'] = params[:counter]
58
+ search_session['id'] = params[:search_id]
59
+ search_session['per_page'] = params[:per_page]
60
+
61
+ if params[:redirect] && (params[:redirect].starts_with?('/') || params[:redirect] =~ URI::DEFAULT_PARSER.make_regexp)
62
+ uri = URI.parse(params[:redirect])
63
+ path = uri.query ? "#{uri.path}?#{uri.query}" : uri.path
64
+ redirect_to path, status: 303
65
+ else
66
+ redirect_to blacklight_config.document_model.new(id: params[:id]), status: 303
85
67
  end
68
+ end
86
69
 
87
- # method to serve up XML OpenSearch description and JSON autocomplete response
88
- def opensearch
89
- respond_to do |format|
90
- format.xml { render layout: false }
91
- format.json { render json: get_opensearch_response }
70
+ # displays values and pagination links for a single facet field
71
+ def facet
72
+ @facet = blacklight_config.facet_fields[params[:id]]
73
+ raise ActionController::RoutingError, 'Not Found' unless @facet
74
+ @response = search_service.facet_field_response(@facet.key)
75
+ @display_facet = @response.aggregations[@facet.field]
76
+ @pagination = facet_paginator(@facet, @display_facet)
77
+ respond_to do |format|
78
+ format.html do
79
+ # Draw the partial for the "more" facet modal window:
80
+ return render layout: false if request.xhr?
81
+ # Otherwise draw the facet selector for users who have javascript disabled.
92
82
  end
83
+ format.json
93
84
  end
85
+ end
94
86
 
95
- def action_documents
96
- fetch(Array(params[:id]))
97
- end
98
-
99
- def action_success_redirect_path
100
- search_state.url_for_document(blacklight_config.document_model.new(id: params[:id]))
87
+ # method to serve up XML OpenSearch description and JSON autocomplete response
88
+ def opensearch
89
+ respond_to do |format|
90
+ format.xml { render layout: false }
91
+ format.json { render json: search_service.opensearch_response }
101
92
  end
93
+ end
102
94
 
103
- ##
104
- # Check if any search parameters have been set
105
- # @return [Boolean]
106
- def has_search_parameters?
107
- !params[:q].blank? or !params[:f].blank? or !params[:search_field].blank?
95
+ def suggest
96
+ respond_to do |format|
97
+ format.json do
98
+ render json: suggestions_service.suggestions
99
+ end
108
100
  end
101
+ end
109
102
 
110
- protected
103
+ def action_documents
104
+ search_service.fetch(Array(params[:id]))
105
+ end
111
106
 
112
- #
113
- # non-routable methods ->
114
- #
107
+ def action_success_redirect_path
108
+ search_state.url_for_document(blacklight_config.document_model.new(id: params[:id]))
109
+ end
115
110
 
116
- ##
117
- # If the params specify a view, then store it in the session. If the params
118
- # do not specifiy the view, set the view parameter to the value stored in the
119
- # session. This enables a user with a session to do subsequent searches and have
120
- # them default to the last used view.
121
- def store_preferred_view
122
- session[:preferred_view] = params[:view] if params[:view]
123
- end
111
+ ##
112
+ # Check if any search parameters have been set
113
+ # @return [Boolean]
114
+ def has_search_parameters?
115
+ !params[:q].blank? || !params[:f].blank? || !params[:search_field].blank?
116
+ end
124
117
 
125
- ##
126
- # Render additional response formats for the index action, as provided by the
127
- # blacklight configuration
128
- # @param [Hash] format
129
- # @note Make sure your format has a well known mime-type or is registered in config/initializers/mime_types.rb
130
- # @example
131
- # config.index.respond_to.txt = Proc.new { render plain: "A list of docs." }
132
- def additional_response_formats format
133
- blacklight_config.index.respond_to.each do |key, config|
134
- format.send key do
135
- case config
136
- when false
137
- raise ActionController::RoutingError, 'Not Found'
138
- when Hash
139
- render config
140
- when Proc
141
- instance_exec(&config)
142
- when Symbol, String
143
- send config
144
- else
145
- render({})
146
- end
147
- end
118
+ DEFAULT_FACET_LIMIT = 10
119
+
120
+ # Look up facet limit for given facet_field. Will look at config, and
121
+ # if config is 'true' will look up from Solr @response if available. If
122
+ # no limit is available, returns nil. Used from #add_facetting_to_solr
123
+ # to supply f.fieldname.facet.limit values in solr request (no @response
124
+ # available), and used in display (with @response available) to create
125
+ # a facet paginator with the right limit.
126
+ def facet_limit_for(facet_field)
127
+ facet = blacklight_config.facet_fields[facet_field]
128
+ return if facet.blank?
129
+
130
+ if facet.limit && @response && @response.aggregations[facet.field]
131
+ limit = @response.aggregations[facet.field].limit
132
+
133
+ if limit.nil? # we didn't get or a set a limit, so infer one.
134
+ facet.limit if facet.limit != true
135
+ elsif limit == -1 # limit -1 is solr-speak for unlimited
136
+ nil
137
+ else
138
+ limit.to_i - 1 # we added 1 to find out if we needed to paginate
148
139
  end
140
+ elsif facet.limit
141
+ facet.limit == true ? DEFAULT_FACET_LIMIT : facet.limit
149
142
  end
143
+ end
150
144
 
151
- ##
152
- # Render additional export formats for the show action, as provided by
153
- # the document extension framework. See _Blacklight::Document::Export_
154
- def additional_export_formats(document, format)
155
- document.export_formats.each_key do | format_name |
156
- format.send(format_name.to_sym) { render body: document.export_as(format_name), layout: false }
157
- end
158
- end
145
+ private
146
+
147
+ #
148
+ # non-routable methods ->
149
+ #
150
+
151
+ def render_sms_action?(_config, _options)
152
+ sms_mappings.present?
153
+ end
154
+
155
+ def search_service
156
+ search_service_class.new(blacklight_config, search_state.to_h)
157
+ end
158
+
159
+ ##
160
+ # If the params specify a view, then store it in the session. If the params
161
+ # do not specifiy the view, set the view parameter to the value stored in the
162
+ # session. This enables a user with a session to do subsequent searches and have
163
+ # them default to the last used view.
164
+ def store_preferred_view
165
+ session[:preferred_view] = params[:view] if params[:view]
166
+ end
159
167
 
160
- ##
161
- # Try to render a response from the document export formats available
162
- def document_export_formats format
163
- format.any do
164
- format_name = params.fetch(:format, '').to_sym
165
- if @response.export_formats.include? format_name
166
- render_document_export_format format_name
168
+ ##
169
+ # Render additional response formats for the index action, as provided by the
170
+ # blacklight configuration
171
+ # @param [Hash] format
172
+ # @note Make sure your format has a well known mime-type or is registered in config/initializers/mime_types.rb
173
+ # @example
174
+ # config.index.respond_to.txt = Proc.new { render plain: "A list of docs." }
175
+ def additional_response_formats format
176
+ blacklight_config.index.respond_to.each do |key, config|
177
+ format.send key do
178
+ case config
179
+ when false
180
+ raise ActionController::RoutingError, 'Not Found'
181
+ when Hash
182
+ render config
183
+ when Proc
184
+ instance_exec(&config)
185
+ when Symbol, String
186
+ send config
167
187
  else
168
- raise ActionController::UnknownFormat
188
+ render({})
169
189
  end
170
190
  end
171
191
  end
192
+ end
172
193
 
173
- ##
174
- # Render the document export formats for a response
175
- # First, try to render an appropriate template (e.g. index.endnote.erb)
176
- # If that fails, just concatenate the document export responses with a newline.
177
- def render_document_export_format format_name
178
- render
179
- rescue ActionView::MissingTemplate
180
- render plain: @response.documents.map { |x| x.export_as(format_name) if x.exports_as? format_name }.compact.join("\n"), layout: false
194
+ ##
195
+ # Render additional export formats for the show action, as provided by
196
+ # the document extension framework. See _Blacklight::Document::Export_
197
+ def additional_export_formats(document, format)
198
+ document.export_formats.each_key do |format_name|
199
+ format.send(format_name.to_sym) { render body: document.export_as(format_name), layout: false }
181
200
  end
201
+ end
182
202
 
183
- # Overrides the Blacklight::Controller provided #search_action_url.
184
- # By default, any search action from a Blacklight::Catalog controller
185
- # should use the current controller when constructing the route.
186
- def search_action_url options = {}
187
- url_for(options.reverse_merge(action: 'index'))
203
+ ##
204
+ # Try to render a response from the document export formats available
205
+ def document_export_formats format
206
+ format.any do
207
+ format_name = params.fetch(:format, '').to_sym
208
+ if @response.export_formats.include? format_name
209
+ render_document_export_format format_name
210
+ else
211
+ raise ActionController::UnknownFormat
212
+ end
188
213
  end
214
+ end
189
215
 
190
- # Email Action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
191
- def email_action documents
192
- mail = RecordMailer.email_record(documents, {:to => params[:to], :message => params[:message]}, url_options)
193
- if mail.respond_to? :deliver_now
194
- mail.deliver_now
195
- else
196
- mail.deliver
197
- end
198
- end
199
-
200
- # SMS action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
201
- def sms_action documents
202
- to = "#{params[:to].gsub(/[^\d]/, '')}@#{params[:carrier]}"
203
- mail = RecordMailer.sms_record(documents, { :to => to }, url_options)
204
- if mail.respond_to? :deliver_now
205
- mail.deliver_now
206
- else
207
- mail.deliver
208
- end
209
- end
210
-
211
- def validate_sms_params
212
- if params[:to].blank?
213
- flash[:error] = I18n.t('blacklight.sms.errors.to.blank')
214
- elsif params[:carrier].blank?
215
- flash[:error] = I18n.t('blacklight.sms.errors.carrier.blank')
216
- elsif params[:to].gsub(/[^\d]/, '').length != 10
217
- flash[:error] = I18n.t('blacklight.sms.errors.to.invalid', :to => params[:to])
218
- elsif !sms_mappings.values.include?(params[:carrier])
219
- flash[:error] = I18n.t('blacklight.sms.errors.carrier.invalid')
220
- end
216
+ ##
217
+ # Render the document export formats for a response
218
+ # First, try to render an appropriate template (e.g. index.endnote.erb)
219
+ # If that fails, just concatenate the document export responses with a newline.
220
+ def render_document_export_format format_name
221
+ render
222
+ rescue ActionView::MissingTemplate
223
+ render plain: @response.documents.map { |x| x.export_as(format_name) if x.exports_as? format_name }.compact.join("\n"), layout: false
224
+ end
221
225
 
222
- flash[:error].blank?
223
- end
226
+ # Overrides the Blacklight::Controller provided #search_action_url.
227
+ # By default, any search action from a Blacklight::Catalog controller
228
+ # should use the current controller when constructing the route.
229
+ def search_action_url options = {}
230
+ url_for(options.reverse_merge(action: 'index'))
231
+ end
224
232
 
225
- def sms_mappings
226
- Blacklight::Engine.config.sms_mappings
233
+ # Email Action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
234
+ def email_action documents
235
+ mail = RecordMailer.email_record(documents, { to: params[:to], message: params[:message] }, url_options)
236
+ if mail.respond_to? :deliver_now
237
+ mail.deliver_now
238
+ else
239
+ mail.deliver
227
240
  end
241
+ end
228
242
 
229
- def validate_email_params
230
- if params[:to].blank?
231
- flash[:error] = I18n.t('blacklight.email.errors.to.blank')
232
- elsif !params[:to].match(Blacklight::Engine.config.email_regexp)
233
- flash[:error] = I18n.t('blacklight.email.errors.to.invalid', :to => params[:to])
234
- end
243
+ # SMS action (this will render the appropriate view on GET requests and process the form and send the email on POST requests)
244
+ def sms_action documents
245
+ to = "#{params[:to].gsub(/[^\d]/, '')}@#{params[:carrier]}"
246
+ mail = RecordMailer.sms_record(documents, { to: to }, url_options)
247
+ if mail.respond_to? :deliver_now
248
+ mail.deliver_now
249
+ else
250
+ mail.deliver
251
+ end
252
+ end
235
253
 
236
- flash[:error].blank?
254
+ def validate_sms_params
255
+ if params[:to].blank?
256
+ flash[:error] = I18n.t('blacklight.sms.errors.to.blank')
257
+ elsif params[:carrier].blank?
258
+ flash[:error] = I18n.t('blacklight.sms.errors.carrier.blank')
259
+ elsif params[:to].gsub(/[^\d]/, '').length != 10
260
+ flash[:error] = I18n.t('blacklight.sms.errors.to.invalid', to: params[:to])
261
+ elsif !sms_mappings.values.include?(params[:carrier])
262
+ flash[:error] = I18n.t('blacklight.sms.errors.carrier.invalid')
237
263
  end
238
264
 
239
- ##
240
- # when a request for /catalog/BAD_SOLR_ID is made, this method is executed.
241
- # Just returns a 404 response, but you can override locally in your own
242
- # CatalogController to do something else -- older BL displayed a Catalog#inde
243
- # page with a flash message and a 404 status.
244
- def invalid_document_id_error(exception)
245
- raise exception unless Pathname.new("#{Rails.root}/public/404.html").exist?
246
-
247
- error_info = {
248
- "status" => "404",
249
- "error" => "#{exception.class}: #{exception.message}"
250
- }
251
-
252
- respond_to do |format|
253
- format.xml { render :xml => error_info, :status => 404 }
254
- format.json { render :json => error_info, :status => 404 }
255
-
256
- # default to HTML response, even for other non-HTML formats we don't
257
- # neccesarily know about, seems to be consistent with what Rails4 does
258
- # by default with uncaught ActiveRecord::RecordNotFound in production
259
- format.any do
260
- # use standard, possibly locally overridden, 404.html file. Even for
261
- # possibly non-html formats, this is consistent with what Rails does
262
- # on raising an ActiveRecord::RecordNotFound. Rails.root IS needed
263
- # for it to work under testing, without worrying about CWD.
264
- render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false, :content_type => 'text/html'
265
- end
266
- end
265
+ flash[:error].blank?
266
+ end
267
+
268
+ def sms_mappings
269
+ Blacklight::Engine.config.sms_mappings
270
+ end
271
+
272
+ def validate_email_params
273
+ if params[:to].blank?
274
+ flash[:error] = I18n.t('blacklight.email.errors.to.blank')
275
+ elsif !params[:to].match(Blacklight::Engine.config.email_regexp)
276
+ flash[:error] = I18n.t('blacklight.email.errors.to.invalid', to: params[:to])
267
277
  end
268
278
 
269
- def start_new_search_session?
270
- action_name == "index"
279
+ flash[:error].blank?
280
+ end
281
+
282
+ def start_new_search_session?
283
+ action_name == "index"
284
+ end
285
+
286
+ def suggestions_service
287
+ Blacklight::SuggestSearch.new(params, search_service.repository).suggestions
288
+ end
289
+
290
+ def determine_layout
291
+ action_name == 'show' ? 'catalog_result' : super
292
+ end
293
+
294
+ # when a method throws a Blacklight::Exceptions::InvalidRequest, this method is executed.
295
+ def handle_request_error(exception)
296
+ # Rails own code will catch and give usual Rails error page with stack trace
297
+ raise exception if Rails.env.development? || Rails.env.test?
298
+
299
+ flash_notice = I18n.t('blacklight.search.errors.request_error')
300
+
301
+ # If there are errors coming from the index page, we want to trap those sensibly
302
+
303
+ if flash[:notice] == flash_notice
304
+ logger.error "Cowardly aborting rsolr_request_error exception handling, because we redirected to a page that raises another exception"
305
+ raise exception
271
306
  end
307
+
308
+ logger.error exception
309
+
310
+ flash[:notice] = flash_notice
311
+ redirect_to search_action_url
312
+ end
272
313
  end