blacklight 4.0.0.pre7 → 4.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 (29) hide show
  1. data/.gitignore +1 -1
  2. data/VERSION +1 -1
  3. data/app/assets/stylesheets/blacklight/_catalog.css.scss +3 -3
  4. data/app/assets/stylesheets/blacklight/_dropdown.css.scss +0 -1
  5. data/app/assets/stylesheets/blacklight/_facets.css.scss +48 -43
  6. data/app/helpers/blacklight/blacklight_helper_behavior.rb +13 -11
  7. data/app/helpers/blacklight/catalog_helper_behavior.rb +45 -29
  8. data/app/helpers/blacklight/facets_helper_behavior.rb +74 -14
  9. data/app/views/_user_util_links.html.erb +1 -1
  10. data/app/views/catalog/_facet_pivot.html.erb +16 -0
  11. data/app/views/catalog/_per_page_widget.html.erb +5 -3
  12. data/app/views/catalog/_sort_and_per_page.html.erb +1 -1
  13. data/app/views/catalog/_sort_widget.html.erb +3 -1
  14. data/app/views/catalog/index.html.erb +3 -4
  15. data/config/locales/blacklight.en.yml +3 -3
  16. data/lib/blacklight.rb +1 -0
  17. data/lib/blacklight/catalog.rb +1 -1
  18. data/lib/blacklight/configuration.rb +5 -4
  19. data/lib/blacklight/controller.rb +16 -72
  20. data/lib/blacklight/legacy_controller_methods.rb +69 -0
  21. data/lib/blacklight/solr_helper.rb +14 -8
  22. data/lib/blacklight/solr_response/facets.rb +24 -5
  23. data/lib/generators/blacklight/blacklight_generator.rb +2 -1
  24. data/lib/generators/blacklight/templates/catalog_controller.rb +1 -0
  25. data/test_support/spec/helpers/blacklight_helper_spec.rb +18 -1
  26. data/test_support/spec/helpers/facets_helper_spec.rb +63 -0
  27. data/test_support/spec/lib/blacklight_solr_response_spec.rb +35 -0
  28. data/test_support/spec/views/catalog/_facets.html.erb_spec.rb +2 -2
  29. metadata +5 -3
@@ -2,7 +2,7 @@
2
2
  <% if has_user_authentication_provider? %>
3
3
  <div class="util-links-login">
4
4
  <% if current_user %>
5
- <%= link_to t('blacklight.header_links.logout'), destroy_user_session_path %> <%= "[#{ link_to current_user, edit_user_registration_path }]" unless current_user.to_s.blank? %>
5
+ <%= link_to t('blacklight.header_links.logout'), destroy_user_session_path %> <%= "[#{ link_to current_user, edit_user_registration_path }]".html_safe unless current_user.to_s.blank? %>
6
6
  <% else %>
7
7
  <%= link_to t('blacklight.header_links.login'), new_user_session_path %>
8
8
  <% end %>
@@ -0,0 +1,16 @@
1
+ <ul>
2
+ <% display_facet.items.each do |item| -%>
3
+ <li>
4
+ <% if facet_in_params?( solr_field, item ) %>
5
+ <%= render_selected_facet_value(solr_field, item) %>
6
+ <% else %>
7
+ <%= render_facet_value(solr_field, item) %>
8
+ <% end -%>
9
+
10
+ <% unless item.items.blank? %>
11
+ <%= render :partial => 'facet_pivot', :locals => { :display_facet => item, :solr_field => solr_field } %>
12
+ <% end %>
13
+ </li>
14
+ <% end %>
15
+
16
+ </ul>
@@ -1,13 +1,15 @@
1
+ <% if show_sort_and_per_page? and !blacklight_config.per_page.blank? %>
1
2
  <div id="per_page-dropdown" class="dropdown pull-right hidden-phone">
2
3
  <span class="hide-text"><%= t('blacklight.search.per_page.title') %></span>
3
4
  <ul class="css-dropdown">
4
5
  <li class="btn">
5
- <%= link_to("#{@response.rows} per page", "#") %> <span class="caret"></span>
6
+ <%= link_to(t(:'blacklight.search.per_page.button_label', :count => current_per_page), "#") %> <span class="caret"></span>
6
7
  <ul>
7
8
  <%- blacklight_config.per_page.each do |count| %>
8
- <li><%= link_to("#{count} #{content_tag(:span, t('blacklight.search.per_page.post_label'), :class =>'hide-text')}".html_safe, url_for(params_for_search.merge(:per_page => count))) %></li>
9
+ <li><%= link_to(t(:'blacklight.search.per_page.label', :count => count).html_safe, url_for(params_for_search.merge(:per_page => count))) %></li>
9
10
  <%- end -%>
10
11
  </ul>
11
12
  </li>
12
13
  </ul>
13
- </div>
14
+ </div>
15
+ <% end %>
@@ -1,6 +1,6 @@
1
1
  <div id="sortAndPerPage">
2
2
 
3
- <%= render :partial => "paginate_compact" %>
3
+ <%= render :partial => "paginate_compact" %>
4
4
 
5
5
  <%= render :partial => 'sort_widget' %>
6
6
 
@@ -1,7 +1,8 @@
1
+ <% if show_sort_and_per_page? and !blacklight_config.sort_fields.blank? %>
1
2
  <div id="sort-dropdown" class="dropdown pull-right hidden-phone">
2
3
  <ul class="css-dropdown">
3
4
  <li class="btn">
4
- <%= link_to("#{t('blacklight.search.sort.label')} #{current_sort_field ? current_sort_field.label : 'default'}".html_safe, "#") %> <span class="caret"></span>
5
+ <%= link_to(t('blacklight.search.sort.label', :field =>current_sort_field.label), "#") %> <span class="caret"></span>
5
6
  <ul>
6
7
  <%- blacklight_config.sort_fields.each do |sort_key, field| %>
7
8
  <li><%= link_to(field.label, url_for(params_for_search.merge(:sort => sort_key))) %></li>
@@ -10,3 +11,4 @@
10
11
  </li>
11
12
  </ul>
12
13
  </div>
14
+ <% end %>
@@ -1,7 +1,6 @@
1
-
2
- <div id="sidebar" class="span3">
3
- <%= render :partial=>'facets' %>
4
- </div><!--/well -->
1
+ <div id="sidebar" class="span3">
2
+ <%= render :partial=>'facets' %>
3
+ </div><!--/well -->
5
4
 
6
5
  <div id="content" class="span9">
7
6
 
@@ -164,12 +164,12 @@ en:
164
164
  request_error: "Sorry, I don't understand your search."
165
165
  invalid_solr_id: "Sorry, you have requested a record that doesn't exist."
166
166
  per_page:
167
- post_label: 'per page'
168
- label: 'Show %{select} per page'
167
+ label: '%{count}<span class="hide-text"> per page</span>'
168
+ button_label: '%{count} per page'
169
169
  title: 'Number of results to display per page'
170
170
  submit: 'Update'
171
171
  sort:
172
- label: 'Sort by'
172
+ label: 'Sort by %{field}'
173
173
  submit: 'sort results'
174
174
  form:
175
175
  search_field:
data/lib/blacklight.rb CHANGED
@@ -18,6 +18,7 @@ module Blacklight
18
18
  autoload :User, 'blacklight/user'
19
19
 
20
20
  autoload :Controller, 'blacklight/controller'
21
+ autoload :LegacyControllerMethods, 'blacklight/legacy_controller_methods'
21
22
  autoload :Catalog, 'blacklight/catalog'
22
23
 
23
24
  autoload :Routes, 'blacklight/routes'
@@ -100,7 +100,7 @@ module Blacklight::Catalog
100
100
  def endnote
101
101
  @response, @documents = get_solr_response_for_field_values(SolrDocument.unique_key,params[:id])
102
102
  respond_to do |format|
103
- format.endnote
103
+ format.endnote :layout => false
104
104
  end
105
105
  end
106
106
 
@@ -4,13 +4,13 @@ module Blacklight
4
4
  # fields to display, facets to show, sort options, and search fields.
5
5
  class Configuration < OpenStructWithHashAccess
6
6
 
7
- # Set up Blacklight::Configuration.default_values to contain
7
+ # Set up Blacklight::Configuration.default_values to contain
8
8
  # the basic, required Blacklight fields
9
9
  class << self
10
10
  def default_values
11
11
  @default_values ||= begin
12
12
  unique_key = ((SolrDocument.unique_key if defined?(SolrDocument)) || 'id')
13
-
13
+
14
14
  {
15
15
  :solr_path => 'select',
16
16
  :qt => 'search',
@@ -22,6 +22,7 @@ module Blacklight
22
22
  :spell_max => 5,
23
23
  :max_per_page => 100,
24
24
  :per_page => [10,20,50,100],
25
+ :document_index_view_types => ['list'],
25
26
  :add_facet_fields_to_solr_request => false,
26
27
  :add_field_configuration_to_solr_request => false
27
28
  }
@@ -91,7 +92,7 @@ module Blacklight
91
92
  end
92
93
 
93
94
  def facet_fields_to_add_to_solr
94
- return facet_fields.reject { |k,v| v[:query] }.map { |k,v| v.field } if self.add_facet_fields_to_solr_request
95
+ return facet_fields.reject { |k,v| v[:query] || v[:pivot] }.map { |k,v| v.field } if self.add_facet_fields_to_solr_request
95
96
 
96
97
  []
97
98
  end
@@ -107,7 +108,7 @@ module Blacklight
107
108
 
108
109
  ##
109
110
  # DSL helper
110
- def configure
111
+ def configure
111
112
  yield self if block_given?
112
113
  self
113
114
  end
@@ -4,35 +4,32 @@
4
4
  # as this module is mixed-in to the application controller in the hosting app on installation.
5
5
  module Blacklight::Controller
6
6
 
7
- def self.included(base)
8
- base.send :include, Blacklight::SearchFields
9
- base.send :include, ActiveSupport::Callbacks
7
+ extend ActiveSupport::Concern
8
+ include Blacklight::LegacyControllerMethods
9
+
10
+ included do
11
+ include Blacklight::SearchFields
12
+ include ActiveSupport::Callbacks
10
13
 
11
- base.send :before_filter, :default_html_head # add JS/stylesheet stuff
12
14
  # now in application.rb file under config.filter_parameters
13
15
  # filter_parameter_logging :password, :password_confirmation
14
- base.send :helper_method, :current_user_session, :current_user, :current_or_guest_user
15
- base.send :after_filter, :discard_flash_if_xhr
16
+ helper_method :current_user_session, :current_user, :current_or_guest_user
17
+ after_filter :discard_flash_if_xhr
16
18
 
17
19
  # handle basic authorization exception with #access_denied
18
- base.send :rescue_from, Blacklight::Exceptions::AccessDenied, :with => :access_denied
20
+ rescue_from Blacklight::Exceptions::AccessDenied, :with => :access_denied
19
21
 
20
- base.send :helper_method, [:request_is_for_user_resource?]#, :user_logged_in?]
22
+ helper_method :request_is_for_user_resource?
21
23
 
22
- base.send :layout, :choose_layout
23
-
24
24
  # extra head content
25
- base.send :helper_method, :extra_head_content
26
- base.send :helper_method, :stylesheet_links
27
- base.send :helper_method, :javascript_includes
28
- base.send :helper_method, :has_user_authentication_provider?
29
- base.send :helper_method, :blacklight_config
25
+ helper_method :has_user_authentication_provider?
26
+ helper_method :blacklight_config
30
27
 
31
28
 
32
29
  # This callback runs when a user first logs in
33
30
 
34
- base.define_callbacks :logging_in_user
35
- base.set_callback :logging_in_user, :before, :transfer_guest_user_actions_to_current_user
31
+ define_callbacks :logging_in_user
32
+ set_callback :logging_in_user, :before, :transfer_guest_user_actions_to_current_user
36
33
 
37
34
  end
38
35
 
@@ -43,47 +40,7 @@ module Blacklight::Controller
43
40
  def blacklight_config
44
41
  default_catalog_controller.blacklight_config
45
42
  end
46
-
47
- # test for exception notifier plugin
48
- def error
49
- raise RuntimeError, "Generating a test error..."
50
- end
51
-
52
- #############
53
- # Display-related methods.
54
- #############
55
-
56
- # before filter to set up our default html HEAD content. Sub-class
57
- # controllers can over-ride this method, or instead turn off the before_filter
58
- # if they like. See:
59
- # http://api.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html
60
- # for how to turn off a filter in a sub-class and such.
61
- def default_html_head
62
-
63
- end
64
-
65
-
66
- # An array of strings to be added to HTML HEAD section of view.
67
- # See ApplicationHelper#render_head_content for details.
68
- def extra_head_content
69
- @extra_head_content ||= []
70
- end
71
-
72
-
73
- # Array, where each element is an array of arguments to
74
- # Rails stylesheet_link_tag helper. See
75
- # ApplicationHelper#render_head_content for details.
76
- def stylesheet_links
77
- @stylesheet_links ||= []
78
- end
79
-
80
- # Array, where each element is an array of arguments to
81
- # Rails javascript_include_tag helper. See
82
- # ApplicationHelper#render_head_content for details.
83
- def javascript_includes
84
- @javascript_includes ||= []
85
- end
86
-
43
+
87
44
  protected
88
45
 
89
46
  # Returns a list of Searches from the ids in the user's history.
@@ -98,20 +55,7 @@ module Blacklight::Controller
98
55
  request.env['PATH_INFO'] =~ /\/?users\/?/
99
56
  end
100
57
 
101
- #
102
- # If a param[:no_layout] is set OR
103
- # request.env['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'
104
- # don't use a layout, otherwise use the "application.html.erb" layout
105
- #
106
- def choose_layout
107
- layout_name unless request.xml_http_request? || ! params[:no_layout].blank?
108
- end
109
-
110
- #over-ride this one locally to change what layout BL controllers use, usually
111
- #by defining it in your own application_controller.rb
112
- def layout_name
113
- 'blacklight'
114
- end
58
+
115
59
 
116
60
  # Should be provided by authentication provider
117
61
  # def current_user
@@ -0,0 +1,69 @@
1
+ ##
2
+ # These controller methods are mixed into the ApplicationController, and
3
+ # are likely things new Blacklight apps won't need (e.g. because of advancements in Rails)
4
+ # but are ideas that are firmly baked into existing application or plugins, so we're
5
+ # keeping around for now. There are probably better ways of doing some of the things
6
+ # in here, but you may find them useful.
7
+ module Blacklight
8
+ module LegacyControllerMethods
9
+ extend ActiveSupport::Concern
10
+
11
+ included do
12
+
13
+ before_filter :default_html_head # add JS/stylesheet stuff
14
+
15
+ helper_method :extra_head_content, :stylesheet_links, :javascript_includes
16
+ end
17
+
18
+ #############
19
+ # Display-related methods.
20
+ #############
21
+
22
+ # before filter to set up our default html HEAD content. Sub-class
23
+ # controllers can over-ride this method, or instead turn off the before_filter
24
+ # if they like. See:
25
+ # http://api.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html
26
+ # for how to turn off a filter in a sub-class and such.
27
+ def default_html_head
28
+
29
+ end
30
+
31
+
32
+ # An array of strings to be added to HTML HEAD section of view.
33
+ # See ApplicationHelper#render_head_content for details.
34
+ def extra_head_content
35
+ @extra_head_content ||= []
36
+ end
37
+
38
+
39
+ # Array, where each element is an array of arguments to
40
+ # Rails stylesheet_link_tag helper. See
41
+ # ApplicationHelper#render_head_content for details.
42
+ def stylesheet_links
43
+ @stylesheet_links ||= []
44
+ end
45
+
46
+ # Array, where each element is an array of arguments to
47
+ # Rails javascript_include_tag helper. See
48
+ # ApplicationHelper#render_head_content for details.
49
+ def javascript_includes
50
+ @javascript_includes ||= []
51
+ end
52
+
53
+ protected
54
+ #
55
+ # If a param[:no_layout] is set OR
56
+ # request.env['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'
57
+ # don't use a layout, otherwise use the "application.html.erb" layout
58
+ #
59
+ def choose_layout
60
+ layout_name unless request.xml_http_request? || ! params[:no_layout].blank?
61
+ end
62
+
63
+ #over-ride this one locally to change what layout BL controllers use, usually
64
+ #by defining it in your own application_controller.rb
65
+ def layout_name
66
+ 'blacklight'
67
+ end
68
+ end
69
+ end
@@ -154,9 +154,9 @@ module Blacklight::SolrHelper
154
154
  end
155
155
 
156
156
  # Now any over-rides from current URL?
157
- solr_params[:rows] = user_params[:per_page] unless user_params[:per_page].blank?
158
-
159
- # Do we need to translate :page to Solr :start?
157
+ solr_params[:rows] = user_params[:per_page].to_i unless user_params[:per_page].blank?
158
+
159
+ # Do we need to translate :page to Solr :start?
160
160
  unless user_params[:page].blank?
161
161
  # already set solr_params["rows"] might not be the one we just set,
162
162
  # could have been from app defaults too. But we need one.
@@ -166,13 +166,13 @@ module Blacklight::SolrHelper
166
166
  if solr_params[:rows].blank?
167
167
  raise Exception.new("To use pagination when no :per_page is supplied in the URL, :rows must be configured in blacklight_config default_solr_params")
168
168
  end
169
-
170
- solr_params[:page] = user_params[:page]
169
+
170
+ solr_params[:page] = user_params[:page].to_i
171
171
  end
172
172
 
173
- # limit to MaxPerPage (100). Tests want this to be a string not an integer,
174
- # not sure why.
175
- solr_params[:rows] = solr_params[:rows].to_i > blacklight_config.max_per_page ? blacklight_config.max_per_page : solr_params[:rows]
173
+ solr_params[:rows] ||= blacklight_config.per_page.first unless blacklight_config.per_page.blank?
174
+
175
+ solr_params[:rows] = blacklight_config.max_per_page if solr_params[:rows].to_i > blacklight_config.max_per_page
176
176
  end
177
177
 
178
178
  ###
@@ -316,12 +316,18 @@ module Blacklight::SolrHelper
316
316
  if blacklight_config.facet_fields.any? { |k,v| v[:query] }
317
317
  solr_parameters[:'facet.query'] ||= []
318
318
  end
319
+
320
+ if blacklight_config.facet_fields.any? { |k,v| v[:pivot] }
321
+ solr_parameters[:'facet.pivot'] ||= []
322
+ end
319
323
  end
320
324
 
321
325
  blacklight_config.facet_fields.each do |field_name, facet|
322
326
 
323
327
  if blacklight_config.add_facet_fields_to_solr_request
324
328
  case
329
+ when facet.pivot
330
+ solr_parameters[:'facet.pivot'] << facet.pivot.join(",")
325
331
  when facet.query
326
332
  solr_parameters[:'facet.query'] += facet.query.map { |k, x| x[:fq] }
327
333
 
@@ -1,10 +1,24 @@
1
+ require 'ostruct'
2
+
1
3
  module Blacklight::SolrResponse::Facets
2
4
 
3
5
  # represents a facet value; which is a field value and its hit count
4
- class FacetItem
5
- attr_reader :value, :hits
6
- def initialize value, hits
7
- @value, @hits = value, hits
6
+ class FacetItem < OpenStruct
7
+ def initialize *args
8
+ options = args.extract_options!
9
+
10
+ # Backwards-compat method signature
11
+ value = args.shift
12
+ hits = args.shift
13
+
14
+ options[:value] = value if value
15
+ options[:hits] = hits if hits
16
+
17
+ super(options)
18
+ end
19
+
20
+ def label
21
+ super || value
8
22
  end
9
23
  end
10
24
 
@@ -26,7 +40,7 @@ module Blacklight::SolrResponse::Facets
26
40
  facet_fields.map do |(facet_field_name,values_and_hits)|
27
41
  items = []
28
42
  values_and_hits.each_slice(2) do |k,v|
29
- items << FacetItem.new(k, v)
43
+ items << FacetItem.new(:value => k, :hits => v)
30
44
  end
31
45
  FacetField.new(facet_field_name, items)
32
46
  end
@@ -55,4 +69,9 @@ module Blacklight::SolrResponse::Facets
55
69
  @facet_queries ||= facet_counts['facet_queries'] || {}
56
70
  end
57
71
 
72
+ # Returns all of the facet queries
73
+ def facet_pivot
74
+ @facet_pivot ||= facet_counts['facet_pivot'] || {}
75
+ end
76
+
58
77
  end # end Facets