blacklight 5.1.1 → 5.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/VERSION +1 -1
  4. data/app/assets/javascripts/blacklight/search_context.js +38 -24
  5. data/app/helpers/blacklight/blacklight_helper_behavior.rb +49 -70
  6. data/app/helpers/blacklight/catalog_helper_behavior.rb +1 -8
  7. data/app/helpers/blacklight/configuration_helper_behavior.rb +10 -2
  8. data/app/helpers/blacklight/facets_helper_behavior.rb +4 -1
  9. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +2 -2
  10. data/app/helpers/blacklight/url_helper_behavior.rb +41 -7
  11. data/app/views/catalog/_facet_layout.html.erb +2 -2
  12. data/app/views/catalog/_per_page_widget.html.erb +4 -4
  13. data/app/views/catalog/_previous_next_doc.html.erb +1 -1
  14. data/app/views/catalog/_show_tools.html.erb +1 -1
  15. data/app/views/catalog/show.html.erb +1 -1
  16. data/app/views/layouts/blacklight.html.erb +1 -1
  17. data/blacklight.gemspec +1 -1
  18. data/config/jetty.yml +3 -0
  19. data/config/locales/blacklight.es.yml +220 -0
  20. data/gemfiles/rails4.1.gemfile +10 -0
  21. data/lib/blacklight/base.rb +1 -1
  22. data/lib/blacklight/catalog/search_context.rb +15 -15
  23. data/lib/blacklight/catalog.rb +19 -6
  24. data/lib/blacklight/configuration.rb +126 -31
  25. data/lib/blacklight/document_presenter.rb +168 -0
  26. data/lib/blacklight/request_builders.rb +288 -0
  27. data/lib/blacklight/routes.rb +6 -2
  28. data/lib/blacklight/solr/request.rb +1 -1
  29. data/lib/blacklight/solr_helper.rb +50 -323
  30. data/lib/blacklight/solr_response/facets.rb +7 -3
  31. data/lib/blacklight/utils.rb +39 -7
  32. data/lib/blacklight.rb +5 -3
  33. data/lib/generators/blacklight/install_generator.rb +17 -5
  34. data/lib/generators/blacklight/models_generator.rb +0 -1
  35. data/lib/generators/blacklight/templates/catalog_controller.rb +6 -0
  36. data/lib/generators/blacklight/templates/config/jetty.yml +8 -4
  37. data/lib/generators/blacklight/templates/config/solr.yml +2 -0
  38. data/spec/controllers/catalog_controller_spec.rb +41 -22
  39. data/spec/features/alternate_controller_spec.rb +1 -1
  40. data/spec/features/search_filters_spec.rb +24 -24
  41. data/spec/features/search_results_spec.rb +9 -4
  42. data/spec/features/search_sort_spec.rb +1 -1
  43. data/spec/helpers/blacklight_helper_spec.rb +87 -0
  44. data/spec/helpers/catalog_helper_spec.rb +5 -10
  45. data/spec/helpers/configuration_helper_spec.rb +22 -1
  46. data/spec/helpers/facets_helper_spec.rb +6 -0
  47. data/spec/helpers/render_constraints_helper_spec.rb +1 -2
  48. data/spec/helpers/url_helper_spec.rb +45 -2
  49. data/spec/lib/blacklight/routes_spec.rb +4 -4
  50. data/spec/lib/blacklight/solr_helper_spec.rb +364 -253
  51. data/spec/lib/blacklight/solr_response/facets_spec.rb +82 -0
  52. data/spec/lib/blacklight/solr_response_spec.rb +3 -1
  53. data/spec/lib/document_presenter_spec.rb +216 -0
  54. data/spec/lib/utils_spec.rb +8 -0
  55. data/spec/test_app_templates/lib/generators/test_app_generator.rb +1 -1
  56. data/spec/views/catalog/index.html.erb_spec.rb +29 -21
  57. data/spec/views/catalog/show.html.erb_spec.rb +11 -7
  58. data/template.demo.rb +20 -0
  59. metadata +12 -4
  60. data/lib/generators/blacklight/jetty_generator.rb +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a001b98201040df18b0c251d644db58d7b462cb
4
- data.tar.gz: f193d5ea8bb6f8b106e525884982a34578c50cf1
3
+ metadata.gz: fea671a4828e18416d64b657b46a176d12825b99
4
+ data.tar.gz: 559e98ff68f295b5f353eb50272eebf4b856443e
5
5
  SHA512:
6
- metadata.gz: 632d7373d5a5060a2459df1d57c57d26bfe5584bb7c7883e3382f9190f8b53eef02450bd971e282fb1e8912c9411ce1b665efab6bc2f6c81beb02c7cc00c720d
7
- data.tar.gz: 991c52e5c79ececb1a29300ce97a8f457c8489cbb2447a6913374d6c24bfb8b9a7fc5802a9af279dfeaf0aaa95bb6b2089b7503377a98cc4c246c00016a2260f
6
+ metadata.gz: 665816f47ac58bbdff19053888a885fe2b4b682e56b59bcf390e859c0d2c4f8b2aac7dd07bdd269eb620ff2d5271bcd9e0527dba75423c920a83d08502bf24e8
7
+ data.tar.gz: 37756999f96379e3908381a2959e6437533a7f0c860ccd29479bac5e64a24f9ed0014b207169641d6de1368b8204b6bd81c52ae8e6a7bff58b4631cb4d624697
data/.travis.yml CHANGED
@@ -2,6 +2,7 @@ notifications:
2
2
  email: false
3
3
 
4
4
  rvm:
5
+ - 2.1.1
5
6
  - 2.1.0
6
7
  - 2.0.0
7
8
  - 1.9.3
@@ -13,6 +14,7 @@ before_install:
13
14
  gemfile:
14
15
  - gemfiles/rails3.gemfile
15
16
  - gemfiles/rails4.gemfile
17
+ - gemfiles/rails4.1.gemfile
16
18
 
17
19
  notifications:
18
20
  irc: "irc.freenode.org#blacklight"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.1.1
1
+ 5.2.0
@@ -1,28 +1,42 @@
1
1
  //= require blacklight/core
2
2
  (function($) {
3
3
  Blacklight.do_search_context_behavior = function() {
4
- $('a[data-counter]').click(function(event) {
5
- var f = document.createElement('form'); f.style.display = 'none';
6
- this.parentNode.appendChild(f);
7
- f.method = 'POST';
8
- f.action = $(this).attr('href');
9
- if(event.metaKey || event.ctrlKey){f.target = '_blank';};
10
- var d = document.createElement('input'); d.setAttribute('type', 'hidden');
11
- d.setAttribute('name', 'counter'); d.setAttribute('value', $(this).data('counter')); f.appendChild(d);
12
- var id = document.createElement('input'); id.setAttribute('type', 'hidden');
13
- id.setAttribute('name', 'search_id'); id.setAttribute('value', $(this).data('search_id')); f.appendChild(id);
14
- var m = document.createElement('input'); m.setAttribute('type', 'hidden');
15
- m.setAttribute('name', '_method'); m.setAttribute('value', 'put'); f.appendChild(m);
16
- var m = document.createElement('input'); m.setAttribute('type', 'hidden');
17
- m.setAttribute('name', $('meta[name="csrf-param"]').attr('content')); m.setAttribute('value', $('meta[name="csrf-token"]').attr('content')); f.appendChild(m);
18
-
19
- f.submit();
20
-
21
- return false;
22
- });
23
-
24
- };
25
- Blacklight.onLoad(function() {
26
- Blacklight.do_search_context_behavior();
27
- });
4
+ $('a[data-context-href]').on('click.search-context', Blacklight.handleSearchContextMethod);
5
+ };
6
+
7
+ // this is the $.rails.handleMethod with a couple adjustments, described inline:
8
+ // first, we're attaching this directly to the event handler, so we can check for meta-keys
9
+ Blacklight.handleSearchContextMethod = function(event) {
10
+ var link = $(this);
11
+
12
+ // instead of using the normal href, we need to use the context href instead
13
+ var href = link.data('context-href'),
14
+ method = 'post',
15
+ target = link.attr('target'),
16
+ csrfToken = $('meta[name=csrf-token]').attr('content'),
17
+ csrfParam = $('meta[name=csrf-param]').attr('content'),
18
+ form = $('<form method="post" action="' + href + '"></form>'),
19
+ metadataInput = '<input name="_method" value="' + method + '" type="hidden" />',
20
+ redirectHref = '<input name="redirect" value="' + link.attr('href') + '" type="hidden" />';
21
+
22
+ // check for meta keys.. if set, we should open in a new tab
23
+ if(event.metaKey || event.ctrlKey) {
24
+ target = '_blank';
25
+ }
26
+
27
+ if (csrfParam !== undefined && csrfToken !== undefined) {
28
+ metadataInput += '<input name="' + csrfParam + '" value="' + csrfToken + '" type="hidden" />';
29
+ }
30
+
31
+ if (target) { form.attr('target', target); }
32
+
33
+ form.hide().append(metadataInput).append(redirectHref).appendTo('body');
34
+ form.submit();
35
+
36
+ return false;
37
+ };
38
+
39
+ Blacklight.onLoad(function() {
40
+ Blacklight.do_search_context_behavior();
41
+ });
28
42
  })(jQuery);
@@ -15,13 +15,21 @@ module Blacklight::BlacklightHelperBehavior
15
15
  # - the Rails configuration
16
16
  # - an i18n string (key: blacklight.application_name; preferred)
17
17
  #
18
- # @return [String] the application named
18
+ # @return [String] the application name
19
19
  def application_name
20
20
  return Rails.application.config.application_name if Rails.application.config.respond_to? :application_name
21
21
 
22
22
  t('blacklight.application_name')
23
23
  end
24
24
 
25
+ ##
26
+ # Get the page's HTML title
27
+ #
28
+ # @return [String]
29
+ def render_page_title
30
+ (content_for(:page_title) if content_for?(:page_title)) || @page_title || application_name
31
+ end
32
+
25
33
  ##
26
34
  # Create <link rel="alternate"> links from a documents dynamically
27
35
  # provided export formats. Currently not used by standard BL layouts,
@@ -201,10 +209,7 @@ module Blacklight::BlacklightHelperBehavior
201
209
  document = args.shift || options[:document]
202
210
 
203
211
  field = args.shift || options[:field]
204
- field_config = index_fields(document)[field]
205
- value = options[:value] || get_field_values(document, field, field_config, options)
206
-
207
- render_field_value value, field_config
212
+ presenter(document).render_index_field_value field, options
208
213
  end
209
214
 
210
215
  ##
@@ -226,7 +231,7 @@ module Blacklight::BlacklightHelperBehavior
226
231
 
227
232
  field = options[:field]
228
233
 
229
- html_escape t(:'blacklight.search.show.label', label: document_show_field_label(document, field))
234
+ t(:'blacklight.search.show.label', label: document_show_field_label(document, field))
230
235
  end
231
236
 
232
237
  ##
@@ -257,10 +262,7 @@ module Blacklight::BlacklightHelperBehavior
257
262
  document = args.shift || options[:document]
258
263
 
259
264
  field = args.shift || options[:field]
260
- field_config = document_show_fields(document)[field]
261
- value = options[:value] || get_field_values(document, field, field_config, options)
262
-
263
- render_field_value value, field_config
265
+ presenter(document).render_document_show_field_value field, options
264
266
  end
265
267
 
266
268
  ##
@@ -271,7 +273,7 @@ module Blacklight::BlacklightHelperBehavior
271
273
  # @return [String]
272
274
  def document_heading document=nil
273
275
  document ||= @document
274
- render_field_value(document[blacklight_config.view_config(:show).title_field] || document.id)
276
+ presenter(document).document_heading
275
277
  end
276
278
 
277
279
  ##
@@ -284,11 +286,7 @@ module Blacklight::BlacklightHelperBehavior
284
286
  def document_show_html_title document=nil
285
287
  document ||= @document
286
288
 
287
- if blacklight_config.view_config(:show).html_title_field
288
- render_field_value(document[blacklight_config.view_config(:show).html_title_field])
289
- else
290
- document_heading document
291
- end
289
+ presenter(document).document_show_html_title
292
290
  end
293
291
 
294
292
  ##
@@ -310,7 +308,7 @@ module Blacklight::BlacklightHelperBehavior
310
308
 
311
309
  tag ||= :h4
312
310
 
313
- content_tag(tag, render_field_value(document_heading(document)), :itemprop => "name")
311
+ content_tag(tag, presenter(document).document_heading, :itemprop => "name")
314
312
  end
315
313
 
316
314
  ##
@@ -329,55 +327,18 @@ module Blacklight::BlacklightHelperBehavior
329
327
  # @param [Blacklight::Solr::Configuration::SolrField] solr field configuration
330
328
  # @param [Hash] options additional options to pass to the rendering helpers
331
329
  def get_field_values document, field, field_config, options = {}
332
- # retrieving values
333
- value = case
334
- when (field_config and field_config.highlight)
335
- # retrieve the document value from the highlighting response
336
- document.highlight_field(field_config.field).map { |x| x.html_safe } if document.has_highlight_field? field_config.field
337
- when (field_config and field_config.accessor)
338
- # implicit method call
339
- if field_config.accessor === true
340
- document.send(field)
341
- # arity-1 method call (include the field name in the call)
342
- elsif !field_config.accessor.is_a?(Array) && document.method(field_config.accessor).arity != 0
343
- document.send(field_config.accessor, field)
344
- # chained method calls
345
- else
346
- Array(field_config.accessor).inject(document) do |result, method|
347
- result.send(method)
348
- end
349
- end
350
- else
351
- # regular solr
352
- document.get(field, :sep => nil) if field
353
- end
354
-
355
- # rendering values
356
- case
357
- when (field_config and field_config.helper_method)
358
- send(field_config.helper_method, options.merge(:document => document, :field => field, :value => value))
359
- when (field_config and field_config.link_to_search)
360
- link_field = if field_config.link_to_search === true
361
- field_config.field
362
- else
363
- field_config.link_to_search
364
- end
365
-
366
- Array(value).map do |v|
367
- link_to render_field_value(v, field_config), search_action_path(add_facet_params(link_field, v, {}))
368
- end if field
369
- else
370
- value
371
- end
330
+ presenter(document).get_field_values field, field_config, options
372
331
  end
373
332
 
374
333
  ##
375
334
  # Render a value (or array of values) from a field
376
335
  #
336
+ # @deprecated Use DocumentPresenter instead
377
337
  # @param [String] value or list of values to display
378
338
  # @param [Blacklight::Solr::Configuration::SolrField] solr field configuration
379
339
  # @return [String]
380
340
  def render_field_value value=nil, field_config=nil
341
+ Deprecation.warn self, "render_field_value is deprecated. Use DocumentPresenter.render_field_value instead"
381
342
  safe_values = Array(value).collect { |x| x.respond_to?(:force_encoding) ? x.force_encoding("UTF-8") : x }
382
343
 
383
344
  if field_config and field_config.itemprop
@@ -392,6 +353,7 @@ module Blacklight::BlacklightHelperBehavior
392
353
  #
393
354
  # @return [String]
394
355
  def field_value_separator
356
+ Deprecation.warn self, "field_value_separator is deprecated. Use DocumentPresenter.field_value_separator instead"
395
357
  ', '
396
358
  end
397
359
 
@@ -466,19 +428,25 @@ module Blacklight::BlacklightHelperBehavior
466
428
 
467
429
  ##
468
430
  # Return a normalized partial name for rendering a single document
469
- #
431
+ #
470
432
  # @param [SolrDocument]
433
+ # @param [Symbol] base name for the partial
471
434
  # @return [String]
472
- def document_partial_name(document)
473
- display_type = document[blacklight_config.view_config(:show).display_type_field]
435
+ def document_partial_name(document, base_name = nil)
436
+ view_config = blacklight_config.view_config(:show)
437
+
438
+ display_type = if base_name and view_config.has_key? :"#{base_name}_display_type_field"
439
+ document[view_config[:"#{base_name}_display_type_field"]]
440
+ end
441
+
442
+ display_type ||= document[view_config.display_type_field]
474
443
 
475
- return 'default' unless display_type
476
- display_type = display_type.join(" ") if display_type.respond_to?(:join)
444
+ display_type ||= 'default'
477
445
 
478
446
  # .to_s is necessary otherwise the default return value is not always a string
479
447
  # using "_" as sep. to more closely follow the views file naming conventions
480
448
  # parameterize uses "-" as the default sep. which throws errors
481
- "#{display_type.gsub("-"," ")}".parameterize("_").to_s
449
+ Array(display_type).join(" ").gsub("-","_").parameterize("_")
482
450
  end
483
451
 
484
452
  ##
@@ -504,7 +472,12 @@ module Blacklight::BlacklightHelperBehavior
504
472
  # @param [String] base name for the partial
505
473
  # @param [Hash] locales to pass through to the partials
506
474
  def render_document_partial(doc, base_name, locals = {})
507
- format = document_partial_name(doc)
475
+ format = if method(:document_partial_name).arity == 1
476
+ Deprecation.warn self, "The #document_partial_name with a single argument is deprecated. Update your override to include a second argument for the 'base name'"
477
+ document_partial_name(doc)
478
+ else
479
+ document_partial_name(doc, base_name)
480
+ end
508
481
 
509
482
  document_partial_path_templates.each do |str|
510
483
  # XXX rather than handling this logic through exceptions, maybe there's a Rails internals method
@@ -544,12 +517,7 @@ module Blacklight::BlacklightHelperBehavior
544
517
  # @option opts [Proc] :label Evaluate the given proc
545
518
  # @option opts [String] :label Render the given string
546
519
  def render_document_index_label doc, opts = {}
547
- label = nil
548
- label ||= doc.get(opts[:label], :sep => nil) if opts[:label].instance_of? Symbol
549
- label ||= opts[:label].call(doc, opts) if opts[:label].instance_of? Proc
550
- label ||= opts[:label] if opts[:label].is_a? String
551
- label ||= doc.id
552
- render_field_value label
520
+ presenter(doc).render_document_index_label opts
553
521
  end
554
522
 
555
523
  ##
@@ -582,4 +550,15 @@ module Blacklight::BlacklightHelperBehavior
582
550
  has_user_authentication_provider? and current_or_guest_user.present?
583
551
  end
584
552
 
553
+ ##
554
+ # Returns a document presenter for the given document
555
+ def presenter(document)
556
+ presenter_class.new(document, self)
557
+ end
558
+
559
+ ##
560
+ # Override this method if you want to use a different presenter class
561
+ def presenter_class
562
+ Blacklight::DocumentPresenter
563
+ end
585
564
  end
@@ -61,7 +61,7 @@ module Blacklight::CatalogHelperBehavior
61
61
  # @see #page_entries_info
62
62
  # @return [String]
63
63
  def item_page_entry_info
64
- t('blacklight.search.entry_pagination_info.other', :current => number_with_delimiter(search_session[:counter]), :total => number_with_delimiter(search_session[:total]), :count => search_session[:total].to_i).html_safe
64
+ t('blacklight.search.entry_pagination_info.other', :current => number_with_delimiter(search_session['counter']), :total => number_with_delimiter(search_session['total']), :count => search_session['total'].to_i).html_safe
65
65
  end
66
66
 
67
67
  ##
@@ -113,13 +113,6 @@ module Blacklight::CatalogHelperBehavior
113
113
  render :partial => 'show_sidebar'
114
114
  end
115
115
 
116
- ##
117
- # Check if any search parameters have been set
118
- # @return [Boolean]
119
- def has_search_parameters?
120
- !params[:q].blank? or !params[:f].blank? or !params[:search_field].blank?
121
- end
122
-
123
116
  ##
124
117
  # Should we display the sort and per page widget?
125
118
  #
@@ -116,6 +116,14 @@ module Blacklight::ConfigurationHelperBehavior
116
116
  ##
117
117
  # The default value for search results per page
118
118
  def default_per_page
119
- blacklight_config.per_page.first unless blacklight_config.per_page.blank?
119
+ blacklight_config.default_per_page || blacklight_config.per_page.first
120
120
  end
121
- end
121
+
122
+ ##
123
+ # The available options for results per page, in the style of #options_for_select
124
+ def per_page_options_for_select
125
+ blacklight_config.per_page.map do |count|
126
+ [t(:'blacklight.search.per_page.label', :count => count).html_safe, count]
127
+ end
128
+ end
129
+ end
@@ -166,7 +166,7 @@ module Blacklight::FacetsHelperBehavior
166
166
 
167
167
  value = facet_value_for_facet_item(item)
168
168
 
169
- facet_field_in_params?(field) and params[:f][field].include?(value)
169
+ params[:f] and params[:f][field] and params[:f][field].include?(value)
170
170
  end
171
171
 
172
172
  ##
@@ -198,6 +198,9 @@ module Blacklight::FacetsHelperBehavior
198
198
  end
199
199
  end
200
200
 
201
+ def facet_field_id facet_field
202
+ "facet-#{facet_field.field.parameterize}"
203
+ end
201
204
 
202
205
  private
203
206
 
@@ -19,13 +19,13 @@ module Blacklight::SearchHistoryConstraintsHelperBehavior
19
19
  ##
20
20
  # Render the search query constraint
21
21
  def render_search_to_s_q(params)
22
- return "".html_safe if params[:q].blank?
22
+ return "".html_safe if params['q'].blank?
23
23
 
24
24
  label = (default_search_field && params[:search_field] == default_search_field[:key]) ?
25
25
  nil :
26
26
  label_for_search_field(params[:search_field])
27
27
 
28
- render_search_to_s_element(label , render_filter_value(params[:q]) )
28
+ render_search_to_s_element(label , render_filter_value(params['q']) )
29
29
  end
30
30
 
31
31
  ##
@@ -1,11 +1,19 @@
1
+ require 'deprecation'
1
2
  module Blacklight::UrlHelperBehavior
3
+ extend Deprecation
4
+ self.deprecation_horizon = 'blacklight 6.0'
2
5
 
3
6
  ##
4
7
  # Extension point for downstream applications
5
- # to provide more interesting routing to
8
+ # to provide more interesting routing to
6
9
  # documents
7
10
  def url_for_document doc
8
- doc
11
+ if controller.is_a? Blacklight::Catalog and doc.is_a? SolrDocument and
12
+ (!doc.respond_to?(:to_model) or doc.to_model.is_a? SolrDocument)
13
+ { controller: controller_name, action: :show, id: doc }
14
+ else
15
+ doc
16
+ end
9
17
  end
10
18
 
11
19
  # link_to_document(doc, :label=>'VIEW', :counter => 3)
@@ -15,13 +23,19 @@ module Blacklight::UrlHelperBehavior
15
23
  def link_to_document(doc, opts={:label=>nil, :counter => nil})
16
24
  opts[:label] ||= document_show_link_field(doc)
17
25
  label = render_document_index_label doc, opts
18
- link_to label, url_for_document(doc), search_session_params(opts[:counter]).merge(opts.reject { |k,v| [:label, :counter].include? k })
26
+ link_to label, url_for_document(doc), document_link_params(doc, opts)
19
27
  end
20
28
 
29
+ def document_link_params(doc, opts)
30
+ session_tracking_params(doc, opts[:counter]).deep_merge(opts.except(:label, :counter))
31
+ end
32
+ protected :document_link_params
33
+
21
34
  ##
22
35
  # Link to the previous document in the current search context
23
36
  def link_to_previous_document(previous_document)
24
- link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), url_for_document(previous_document), search_session_params(search_session[:counter].to_i - 1).merge(:class => "previous", :rel => 'prev') do
37
+ link_opts = session_tracking_params(previous_document, search_session['counter'].to_i - 1).merge(:class => "previous", :rel => 'prev')
38
+ link_to_unless previous_document.nil?, raw(t('views.pagination.previous')), url_for_document(previous_document), link_opts do
25
39
  content_tag :span, raw(t('views.pagination.previous')), :class => 'previous'
26
40
  end
27
41
  end
@@ -29,16 +43,35 @@ module Blacklight::UrlHelperBehavior
29
43
  ##
30
44
  # Link to the next document in the current search context
31
45
  def link_to_next_document(next_document)
32
- link_to_unless next_document.nil?, raw(t('views.pagination.next')), url_for_document(next_document), search_session_params(search_session[:counter].to_i + 1).merge(:class => "next", :rel => 'next') do
46
+ link_opts = session_tracking_params(next_document, search_session['counter'].to_i + 1).merge(:class => "next", :rel => 'next')
47
+ link_to_unless next_document.nil?, raw(t('views.pagination.next')), url_for_document(next_document), link_opts do
33
48
  content_tag :span, raw(t('views.pagination.next')), :class => 'next'
34
49
  end
35
50
  end
36
51
 
37
52
  ##
38
53
  # Current search context parameters
39
- def search_session_params counter
54
+ def search_session_params counter
40
55
  { :'data-counter' => counter, :'data-search_id' => current_search_session.try(:id) }
41
56
  end
57
+ deprecation_deprecate :search_session_params
58
+
59
+ ##
60
+ # Attributes for a link that gives a URL we can use to track clicks for the current search session
61
+ # @param [SolrDocument] document
62
+ # @param [Integer] counter
63
+ # @example
64
+ # session_tracking_params(SolrDocument.new(id: 123), 7)
65
+ # => { data: { :'tracker-href' => '/catalog/123/track?counter=7&search_id=999' } }
66
+ def session_tracking_params document, counter
67
+ if document.nil?
68
+ return {}
69
+ end
70
+
71
+ { :data => {:'context-href' => track_solr_document_path(document, counter: counter, search_id: current_search_session.try(:id))}}
72
+ end
73
+ protected :session_tracking_params
74
+
42
75
 
43
76
  #
44
77
  # link based helpers ->
@@ -140,7 +173,7 @@ module Blacklight::UrlHelperBehavior
140
173
  # Reset any search parameters that store search context
141
174
  # and need to be reset when e.g. constraints change
142
175
  def reset_search_params source_params
143
- sanitize_search_params(source_params).except :page, :counter
176
+ sanitize_search_params(source_params).except(:page, :counter).with_indifferent_access
144
177
  end
145
178
 
146
179
  # adds the value and/or field to params[:f]
@@ -212,6 +245,7 @@ module Blacklight::UrlHelperBehavior
212
245
  p[:f][field] = (p[:f][field] || []).dup
213
246
  p[:f][field] = p[:f][field] - [value]
214
247
  p[:f].delete(field) if p[:f][field].size == 0
248
+ p.delete(:f) if p[:f].empty?
215
249
  p
216
250
  end
217
251
 
@@ -1,10 +1,10 @@
1
1
  <div class="panel panel-default facet_limit blacklight-<%= facet_field.field.parameterize %> <%= 'facet_limit-active' if facet_field_in_params?(facet_field.field) %>">
2
- <div class="<%= "collapsed" if should_collapse_facet?(facet_field) %> collapse-toggle panel-heading" data-toggle="collapse" data-target="#facet-<%= facet_field.label.parameterize %>">
2
+ <div class="<%= "collapsed" if should_collapse_facet?(facet_field) %> collapse-toggle panel-heading" data-toggle="collapse" data-target="#<%= facet_field_id(facet_field) %>">
3
3
  <h5 class="panel-title">
4
4
  <%= link_to facet_field_label(facet_field.field), "#", :"data-no-turbolink" => true %>
5
5
  </h5>
6
6
  </div>
7
- <div id="facet-<%= facet_field.label.parameterize %>" class="panel-collapse facet-content <%= should_collapse_facet?(facet_field) ? 'collapse' : 'in' %>">
7
+ <div id="<%= facet_field_id(facet_field) %>" class="panel-collapse facet-content <%= should_collapse_facet?(facet_field) ? 'collapse' : 'in' %>">
8
8
  <div class="panel-body">
9
9
  <%= yield %>
10
10
  </div>
@@ -4,9 +4,9 @@
4
4
  <div id="per_page-dropdown" class="btn-group">
5
5
  <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"><%= link_to(t(:'blacklight.search.per_page.button_label', :count => current_per_page), "#") %> <span class="caret"></span></button>
6
6
  <ul class="dropdown-menu">
7
- <%- blacklight_config.per_page.each do |count| %>
8
- <li><%= link_to(t(:'blacklight.search.per_page.label', :count => count).html_safe, url_for(params_for_search(:per_page => count))) %></li>
9
- <%- end -%>
7
+ <%- per_page_options_for_select.each do |(label, count)| %>
8
+ <li><%= link_to(label, url_for(params_for_search(:per_page => count))) %></li>
9
+ <%- end -%>
10
10
  </ul>
11
11
  </div>
12
- <% end %>
12
+ <% end %>
@@ -15,4 +15,4 @@
15
15
  <%=link_to "#{t('blacklight.search.start_over')}", start_over_path(current_search_session.try(:query_params) || {}), :id=>"startOverLink", :class => 'btn' %>
16
16
  </div>
17
17
  </div>
18
- <% end %>
18
+ <% end %>
@@ -13,7 +13,7 @@
13
13
  </div>
14
14
 
15
15
  <div class="panel-body">
16
- <ul class="nav nav-list">
16
+ <ul class="nav">
17
17
  <li>
18
18
  <%= render_show_doc_actions @document %>
19
19
  </li>
@@ -3,7 +3,7 @@
3
3
  <%= render 'previous_next_doc' %>
4
4
 
5
5
 
6
- <% @page_title = t('blacklight.search.show.title', :document_title => document_show_html_title, :application_name => application_name) -%>
6
+ <% @page_title = t('blacklight.search.show.title', :document_title => document_show_html_title, :application_name => application_name).html_safe -%>
7
7
  <% content_for(:head) { render_link_rel_alternates } -%>
8
8
  <%# this should be in a partial -%>
9
9
 
@@ -13,7 +13,7 @@
13
13
  <meta http-equiv="cleartype" content="on">
14
14
  <![endif]-->
15
15
 
16
- <title><%= h(@page_title || application_name) %></title>
16
+ <title><%= render_page_title %></title>
17
17
  <link href="<%= opensearch_catalog_path(:format => 'xml', :only_path => false) %>" title="<%= application_name%>" type="application/opensearchdescription+xml" rel="search"/>
18
18
  <%= favicon_link_tag asset_path('favicon.ico') %>
19
19
  <%= stylesheet_link_tag "application" %>
data/blacklight.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  s.add_dependency "bootstrap-sass", "~> 3.0"
25
25
  s.add_dependency "deprecation"
26
26
 
27
- s.add_development_dependency "jettywrapper", ">= 1.5.2"
27
+ s.add_development_dependency "jettywrapper", ">= 1.7.0"
28
28
  s.add_development_dependency "blacklight-marc", "~> 5.0"
29
29
  s.add_development_dependency "rspec-rails"
30
30
  s.add_development_dependency "capybara"
data/config/jetty.yml CHANGED
@@ -5,3 +5,6 @@ test:
5
5
  startup_wait: 60
6
6
  jetty_port: <%= ENV['TEST_JETTY_PORT'] || 8888 %>
7
7
  <%= ENV['TEST_JETTY_PATH'] ? "jetty_home: " + ENV['TEST_JETTY_PATH'] : '' %>
8
+ production:
9
+ startup_wait: 15
10
+ jetty_port: 8983