blacklight 3.7.2 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/app/assets/javascripts/blacklight/blacklight.js +0 -1
- data/app/assets/javascripts/blacklight/checkbox_submit.js +1 -1
- data/app/assets/javascripts/blacklight/lightbox_dialog.js +2 -1
- data/app/assets/javascripts/blacklight/more_facets.js +1 -0
- data/app/assets/stylesheets/blacklight/_blacklight_base.css.scss +1 -1
- data/app/assets/stylesheets/blacklight/_bookmark.css.scss +20 -0
- data/app/assets/stylesheets/blacklight/_catalog.css.scss +2 -6
- data/app/controllers/bookmarks_controller.rb +10 -2
- data/app/helpers/blacklight/blacklight_helper_behavior.rb +20 -12
- data/app/helpers/blacklight/catalog_helper_behavior.rb +8 -3
- data/app/helpers/blacklight/facets_helper_behavior.rb +5 -0
- data/app/helpers/blacklight/render_constraints_helper_behavior.rb +4 -0
- data/app/views/{folder → bookmarks}/_tools.html.erb +8 -13
- data/app/views/bookmarks/index.html.erb +14 -22
- data/app/views/catalog/_document_header.html.erb +1 -1
- data/app/views/catalog/_facet_pagination.html.erb +8 -12
- data/app/views/catalog/_per_page_widget.html.erb +7 -0
- data/app/views/catalog/_search_form.html.erb +1 -1
- data/app/views/catalog/_sort_and_per_page.html.erb +2 -12
- data/app/views/catalog/_sort_widget.html.erb +6 -0
- data/config/locales/blacklight.en.yml +0 -12
- data/lib/blacklight/catalog.rb +4 -0
- data/lib/blacklight/configuration.rb +1 -0
- data/lib/blacklight/controller.rb +9 -0
- data/lib/blacklight/solr/facet_paginator.rb +13 -21
- data/lib/blacklight/solr_helper.rb +12 -9
- data/lib/generators/blacklight/blacklight_generator.rb +1 -1
- data/test_support/features/bookmarks.feature +4 -20
- data/test_support/features/support/paths.rb +2 -2
- data/test_support/spec/helpers/facets_helper_spec.rb +20 -0
- data/test_support/spec/lib/facet_paginator_spec.rb +3 -18
- data/test_support/spec/lib/solr_helper_spec.rb +3 -3
- metadata +8 -8
- data/app/assets/javascripts/blacklight/folder_toggle.js +0 -24
- data/app/assets/stylesheets/blacklight/_folder.css.scss +0 -38
- data/app/views/folder/index.html.erb +0 -44
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.8.0
|
@@ -7,7 +7,6 @@
|
|
7
7
|
//= require blacklight/core
|
8
8
|
//= require blacklight/bookmark_toggle
|
9
9
|
//= require blacklight/facet_expand_contract
|
10
|
-
//= require blacklight/folder_toggle
|
11
10
|
//= require blacklight/lightbox_dialog
|
12
11
|
//= require blacklight/more_facets
|
13
12
|
//= require blacklight/search_context
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* A JQuery plugin (should this be implemented as a widget instead? not sure)
|
2
2
|
that will convert a "toggle" form, with single submit button to add/remove
|
3
|
-
something, like used for Bookmarks
|
3
|
+
something, like used for Bookmarks, into an AJAXy checkbox instead.
|
4
4
|
|
5
5
|
Apply to a form. Does require certain assumption about the form:
|
6
6
|
1) The same form 'action' href must be used for both ADD and REMOVE
|
@@ -2,7 +2,8 @@
|
|
2
2
|
(function($) {
|
3
3
|
Blacklight.do_lightbox_dialog = function() {
|
4
4
|
$("a.lightboxLink").ajaxyDialog({
|
5
|
-
chainAjaxySelector: false
|
5
|
+
chainAjaxySelector: false,
|
6
|
+
position: ['center', 50]
|
6
7
|
});
|
7
8
|
//But make the librarian link wider than 300px default.
|
8
9
|
$('a.lightboxLink#librarianLink').ajaxyDialog("option", "width", 650);
|
@@ -16,8 +16,8 @@
|
|
16
16
|
@import "blacklight/formatting";
|
17
17
|
@import "blacklight/header";
|
18
18
|
@import "blacklight/catalog";
|
19
|
+
@import "blacklight/bookmark";
|
19
20
|
@import "blacklight/facets";
|
20
|
-
@import "blacklight/folder";
|
21
21
|
@import "blacklight/search_history";
|
22
22
|
@import "blacklight/print";
|
23
23
|
|
@@ -217,7 +217,7 @@
|
|
217
217
|
margin-bottom:0.5em;
|
218
218
|
margin-left:1em;
|
219
219
|
|
220
|
-
.
|
220
|
+
.bookmark_toggle
|
221
221
|
{
|
222
222
|
display:inline;
|
223
223
|
}
|
@@ -349,7 +349,7 @@ label.checked
|
|
349
349
|
font-weight:700;
|
350
350
|
}
|
351
351
|
|
352
|
-
label.toggle_bookmark
|
352
|
+
label.toggle_bookmark
|
353
353
|
{
|
354
354
|
color:inherit;
|
355
355
|
display:inline-block;
|
@@ -358,10 +358,6 @@ label.toggle_bookmark,label.toggle_folder
|
|
358
358
|
text-align:left;
|
359
359
|
}
|
360
360
|
|
361
|
-
label.toggle_folder
|
362
|
-
{
|
363
|
-
min-width:6em;
|
364
|
-
}
|
365
361
|
|
366
362
|
span.page a,span.page.current
|
367
363
|
{
|
@@ -1,12 +1,20 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
# note that while this is mostly restful routing, the #update and #destroy actions
|
3
3
|
# take the Solr document ID as the :id, NOT the id of the actual Bookmark action.
|
4
|
-
class BookmarksController <
|
4
|
+
class BookmarksController < CatalogController
|
5
|
+
include Blacklight::Configurable
|
6
|
+
include Blacklight::SolrHelper
|
7
|
+
|
8
|
+
copy_blacklight_config_from(CatalogController)
|
9
|
+
|
5
10
|
|
6
11
|
before_filter :verify_user
|
7
12
|
|
8
13
|
def index
|
9
|
-
@bookmarks = current_or_guest_user.bookmarks
|
14
|
+
@bookmarks = current_or_guest_user.bookmarks
|
15
|
+
bookmark_ids = @bookmarks.collect { |b| b.document_id.to_s }
|
16
|
+
|
17
|
+
@response, @document_list = get_solr_response_for_field_values("id", bookmark_ids)
|
10
18
|
end
|
11
19
|
|
12
20
|
def update
|
@@ -284,16 +284,11 @@ module Blacklight::BlacklightHelperBehavior
|
|
284
284
|
link_url = url_for(query_params)
|
285
285
|
link_to opts[:label], link_url
|
286
286
|
end
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
# in certain top-level params keys to _omit_, defaults to :page
|
293
|
-
def search_as_hidden_fields(options={})
|
294
|
-
|
295
|
-
options = {:params => params, :omit_keys => [:page]}.merge(options)
|
296
|
-
my_params = options[:params].dup
|
287
|
+
|
288
|
+
def params_for_search(options={})
|
289
|
+
my_params = (options[:params] || params).dup
|
290
|
+
options[:omit_keys] ||= []
|
291
|
+
|
297
292
|
options[:omit_keys].each do |omit_key|
|
298
293
|
case omit_key
|
299
294
|
when Hash
|
@@ -307,13 +302,26 @@ module Blacklight::BlacklightHelperBehavior
|
|
307
302
|
else
|
308
303
|
my_params.delete(omit_key)
|
309
304
|
end
|
310
|
-
end
|
305
|
+
end
|
306
|
+
|
311
307
|
# removing action and controller from duplicate params so that we don't get hidden fields for them.
|
312
308
|
my_params.delete(:action)
|
313
309
|
my_params.delete(:controller)
|
314
310
|
# commit is just an artifact of submit button, we don't need it, and
|
315
311
|
# don't want it to pile up with another every time we press submit again!
|
316
312
|
my_params.delete(:commit)
|
313
|
+
|
314
|
+
my_params
|
315
|
+
end
|
316
|
+
|
317
|
+
# Create form input type=hidden fields representing the entire search context,
|
318
|
+
# for inclusion in a form meant to change some aspect of it, like
|
319
|
+
# re-sort or change records per page. Can pass in params hash
|
320
|
+
# as :params => hash, otherwise defaults to #params. Can pass
|
321
|
+
# in certain top-level params keys to _omit_, defaults to :page
|
322
|
+
def search_as_hidden_fields(options={})
|
323
|
+
my_params = params_for_search({:omit_keys => [:page]}.merge(options))
|
324
|
+
|
317
325
|
# hash_as_hidden_fields in hash_as_hidden_fields.rb
|
318
326
|
return hash_as_hidden_fields(my_params)
|
319
327
|
end
|
@@ -341,7 +349,7 @@ module Blacklight::BlacklightHelperBehavior
|
|
341
349
|
@template_format = old_format
|
342
350
|
return result
|
343
351
|
end
|
344
|
-
|
352
|
+
|
345
353
|
# puts together a collection of documents into one refworks export string
|
346
354
|
def render_refworks_texts(documents)
|
347
355
|
val = ''
|
@@ -9,8 +9,9 @@ module Blacklight::CatalogHelperBehavior
|
|
9
9
|
per_page = 1 if per_page < 1
|
10
10
|
current_page = (response.start / per_page).ceil + 1
|
11
11
|
num_pages = (response.total / per_page.to_f).ceil
|
12
|
-
|
13
|
-
|
12
|
+
|
13
|
+
Struct.new(:current_page, :num_pages, :limit_value, :total_count, :first_page?, :last_page?).new(current_page, num_pages, per_page, response.total, current_page > 1, current_page < num_pages)
|
14
|
+
end
|
14
15
|
|
15
16
|
# Equivalent to kaminari "paginate", but takes an RSolr::Response as first argument.
|
16
17
|
# Will convert it to something kaminari can deal with (using #paginate_params), and
|
@@ -46,7 +47,7 @@ module Blacklight::CatalogHelperBehavior
|
|
46
47
|
entry_name = options[:entry_name] ||
|
47
48
|
(response.empty?? t('blacklight.entry_name.default') : response.docs.first.class.name.underscore.sub('_', ' '))
|
48
49
|
|
49
|
-
case response.
|
50
|
+
case response.total
|
50
51
|
when 0; t('blacklight.search.pagination_info.no_items_found', :entry_name => entry_name.pluralize ).html_safe
|
51
52
|
when 1; t('blacklight.search.pagination_info.single_item_found', :entry_name => entry_name).html_safe
|
52
53
|
else; t('blacklight.search.pagination_info.pages', :entry_name => entry_name.pluralize, :current_page => current_page, :num_pages => num_pages, :start_num => start_num, :end_num => end_num, :total_num => total_num, :count => num_pages).html_safe
|
@@ -67,6 +68,10 @@ module Blacklight::CatalogHelperBehavior
|
|
67
68
|
def search_field_label(params)
|
68
69
|
h( label_for_search_field(params[:search_field]) )
|
69
70
|
end
|
71
|
+
|
72
|
+
def current_sort_field
|
73
|
+
blacklight_config.sort_fields[params[:sort]] || blacklight_config.sort_fields.first.last
|
74
|
+
end
|
70
75
|
|
71
76
|
# Export to Refworks URL, called in _show_tools
|
72
77
|
def refworks_export_url(document = @document)
|
@@ -19,6 +19,11 @@ module Blacklight::FacetsHelperBehavior
|
|
19
19
|
blacklight_config.facet_fields.keys
|
20
20
|
end
|
21
21
|
|
22
|
+
def has_facet_values? fields = facet_field_names, options = {}
|
23
|
+
solr_fields = fields.map { |solr_field| facet_by_field_name(solr_field) }.compact
|
24
|
+
solr_fields.any? { |display_facet| !display_facet.items.empty? }
|
25
|
+
end
|
26
|
+
|
22
27
|
# Render a collection of facet fields
|
23
28
|
def render_facet_partials fields = facet_field_names, options = {}
|
24
29
|
solr_fields = fields.map { |solr_field| facet_by_field_name(solr_field) }.compact
|
@@ -7,6 +7,10 @@
|
|
7
7
|
# search results page (render_constraints(_*))
|
8
8
|
module Blacklight::RenderConstraintsHelperBehavior
|
9
9
|
|
10
|
+
def query_has_constraints?(localized_params = params)
|
11
|
+
!(localized_params[:q].blank? and localized_params[:f].blank?)
|
12
|
+
end
|
13
|
+
|
10
14
|
# Render actual constraints, not including header or footer
|
11
15
|
# info.
|
12
16
|
def render_constraints(localized_params = params)
|
@@ -1,23 +1,18 @@
|
|
1
|
-
<ul class="
|
1
|
+
<ul class="tools">
|
2
2
|
<li class="cite">
|
3
|
-
<%= link_to t('blacklight.tools.cite'), citation_catalog_path(:sort=>params[:sort], :per_page=>params[:per_page], :id => @
|
3
|
+
<%= link_to t('blacklight.tools.cite'), citation_catalog_path(:sort=>params[:sort], :per_page=>params[:per_page], :id => @bookmarks.collect{|doc| doc.document_id}), {:id => 'citeLink', :name => 'citation', :class => 'lightboxLink'} %>
|
4
4
|
</li>
|
5
5
|
<li class="refworks">
|
6
|
-
<%= render :partial => 'catalog/refworks_form', :locals => {:documents=>@
|
6
|
+
<%= render :partial => 'catalog/refworks_form', :locals => {:documents=>@bookmarks.collect{|doc| doc.document_id}} %>
|
7
7
|
</li>
|
8
|
+
|
8
9
|
<li class="endnote">
|
9
|
-
<%= link_to t('blacklight.tools.endnote'), endnote_catalog_path(:sort=>params[:sort], :per_page=>params[:per_page], :id => @
|
10
|
+
<%= link_to t('blacklight.tools.endnote'), endnote_catalog_path(:sort=>params[:sort], :per_page=>params[:per_page], :id => @bookmarks.collect {|doc| doc.document_id}, :format => 'endnote')%>
|
10
11
|
</li>
|
11
12
|
<li class="email">
|
12
|
-
<%= link_to t('blacklight.tools.email'), email_catalog_path(:sort=>params[:sort], :per_page=>params[:per_page], :id => @
|
13
|
+
<%= link_to t('blacklight.tools.email'), email_catalog_path(:sort=>params[:sort], :per_page=>params[:per_page], :id => @bookmarks.collect {|doc| doc.document_id}), :class=>"lightboxLink", :id => "emailLink" %>
|
13
14
|
</li>
|
14
|
-
<% if has_user_authentication_provider? and current_user %>
|
15
|
-
<li>
|
16
|
-
<%= render :partial=>'catalog/bookmark_form', :locals=>{:documents=>@documents} %>
|
17
|
-
</li>
|
18
|
-
<% end %>
|
19
15
|
<li>
|
20
|
-
<%= link_to t('blacklight.
|
16
|
+
<%= link_to t('blacklight.bookmarks.clear.action_title'), clear_bookmarks_path, :method => :delete, :data => { :confirm => t('blacklight.bookmarks.clear.action_confirm') } %>
|
21
17
|
</li>
|
22
|
-
|
23
|
-
|
18
|
+
</ul>
|
@@ -4,30 +4,22 @@
|
|
4
4
|
|
5
5
|
<h2><%= t('blacklight.bookmarks.need_login') %></h2>
|
6
6
|
|
7
|
-
<%- elsif @
|
7
|
+
<%- elsif @document_list.blank? -%>
|
8
8
|
|
9
|
-
<
|
9
|
+
<h3><%= t('blacklight.bookmarks.no_bookmarks') %></h3>
|
10
|
+
<% else %>
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
<%= paginate @bookmarks, :theme => 'blacklight' %>
|
14
|
-
<div id="userBookmarks">
|
15
|
-
<p>
|
16
|
-
<%= link_to t('blacklight.bookmarks.clear.action_title'), clear_bookmarks_path, :method => :delete, :data => { :confirm => t('blacklight.bookmarks.clear.action_confirm') } %>
|
17
|
-
</p>
|
18
|
-
|
19
|
-
<h2><%= t('blacklight.bookmarks.list_title') %></h2>
|
20
|
-
|
21
|
-
<table class="zebra">
|
22
|
-
<% @bookmarks.each do |bm| %>
|
23
|
-
<tr>
|
24
|
-
<td><%= link_to h(bm.title), polymorphic_path(bm.document) %></td>
|
25
|
-
<td><%= button_to t('blacklight.bookmarks.delete'), {:controller => "bookmarks", :action => "destroy", :id => CGI.escape(bm.document_id)},
|
26
|
-
:method => :delete, :data => { :confirm => t('blacklight.bookmarks.remove.action_confirm') } %></td>
|
27
|
-
</tr>
|
28
|
-
<% end %>
|
29
|
-
</table>
|
12
|
+
<div class="pageEntriesInfo">
|
13
|
+
<%= render_pagination_info @response, :entry_name=>'item' %>
|
30
14
|
</div>
|
31
15
|
|
32
|
-
|
16
|
+
<%= render 'sort_and_per_page' %>
|
17
|
+
<%= render 'results_pagination' %>
|
33
18
|
|
19
|
+
<% sidebar_items << capture do %>
|
20
|
+
<%= render 'tools' %>
|
21
|
+
<% end %>
|
22
|
+
<%= render :partial => 'catalog/document_list' %>
|
23
|
+
<%= render 'results_pagination' %>
|
24
|
+
<% end %>
|
25
|
+
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<% # header bar for doc items in index view -%>
|
3
3
|
<div class="documentHeader">
|
4
4
|
|
5
|
-
<% # bookmark
|
5
|
+
<% # bookmark functions for items/docs -%>
|
6
6
|
<%= render_index_doc_actions document %>
|
7
7
|
|
8
8
|
<% # main title container for doc partial view -%>
|
@@ -1,17 +1,13 @@
|
|
1
1
|
<% if @pagination.has_previous? || @pagination.has_next? %>
|
2
2
|
<div class="prev_next_links">
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
<%
|
10
|
-
|
11
|
-
<% else -%>
|
12
|
-
<span class="disabled ui-state-active next_page"><%= raw(t 'views.pagination.next') %></span>
|
13
|
-
<% end -%>
|
14
|
-
|
3
|
+
<%= link_to_previous_page @pagination, raw(t('views.pagination.previous')), :params => params, :param_name => Blacklight::Solr::FacetPaginator.request_keys[:page], :class => 'ui-state-active next_page' do %>
|
4
|
+
<span class="disabled ui-state-active prev_page"><%= raw(t('views.pagination.previous')) %></span>
|
5
|
+
<% end %>
|
6
|
+
<%= link_to_next_page @pagination, raw(t('views.pagination.next')), :params => params, :param_name => Blacklight::Solr::FacetPaginator.request_keys[:page], :class => 'ui-state-active prev_page' do %>
|
7
|
+
|
8
|
+
<span class="disabled ui-state-active next_page"><%= raw(t('views.pagination.next')) %></span>
|
9
|
+
<% end %>
|
10
|
+
|
15
11
|
</div>
|
16
12
|
<% end %>
|
17
13
|
|
@@ -0,0 +1,7 @@
|
|
1
|
+
|
2
|
+
<%-# kind of hacky way to get this to work on catalog and folder controllers. May be able to simple do {:action=>"index"} but I'm not sure -%>
|
3
|
+
<%= form_tag params[:controller] == "folder" ? folder_index_path : url_for(:action=>'index'), :method=>:get, :class=>'sort', :id => "sort_form" do %>
|
4
|
+
<%= label_tag(:sort, t('blacklight.search.sort.label', :select => select_tag(:sort, options_for_select(sort_fields, h(params[:sort])))).html_safe) %>
|
5
|
+
<%= search_as_hidden_fields(:omit_keys => [:page, :sort]) %>
|
6
|
+
<%= submit_tag t('blacklight.search.sort.submit') %>
|
7
|
+
<% end unless sort_fields.empty? %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div id="search" class="search">
|
2
|
-
<%= form_tag
|
2
|
+
<%= form_tag search_action_url, :method => :get do %>
|
3
3
|
<h2 class="search"><%= label_tag(:q, t('blacklight.search.form.q')) %></h2>
|
4
4
|
<%= text_field_tag :q, params[:q], :class => "q" %>
|
5
5
|
<% unless search_fields.empty? %>
|
@@ -1,17 +1,7 @@
|
|
1
1
|
<div id="sortAndPerPage">
|
2
2
|
<% unless @response.total < 2 %>
|
3
|
-
|
4
|
-
<%= form_tag params[:controller] == "folder" ? folder_index_path : url_for(:action=>'index'), :method=>:get, :class=>'per_page' do %>
|
5
|
-
<%= label_tag(:per_page, t('blacklight.search.per_page.label', :select => select_tag(:per_page, options_for_select(['10', '20', '50', '100'], h(params[:per_page])), :title => t('blacklight.search.per_page.title'))).html_safe) %>
|
6
|
-
<%= search_as_hidden_fields(:omit_keys => [:page, :per_page]) %>
|
7
|
-
<%= submit_tag t('blacklight.search.per_page.submit') %>
|
8
|
-
<% end %>
|
3
|
+
<%= render :partial => 'sort_widget' %>
|
9
4
|
|
10
|
-
|
11
|
-
<%= form_tag params[:controller] == "folder" ? folder_index_path : url_for(:action=>'index'), :method=>:get, :class=>'sort', :id => "sort_form" do %>
|
12
|
-
<%= label_tag(:sort, t('blacklight.search.sort.label', :select => select_tag(:sort, options_for_select(sort_fields, h(params[:sort])))).html_safe) %>
|
13
|
-
<%= search_as_hidden_fields(:omit_keys => [:page, :sort]) %>
|
14
|
-
<%= submit_tag t('blacklight.search.sort.submit') %>
|
15
|
-
<% end unless sort_fields.empty? %>
|
5
|
+
<%= render :partial => 'per_page_widget' %>
|
16
6
|
<% end %>
|
17
7
|
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<%-# kind of hacky way to get this to work on catalog and folder controllers. May be able to simple do {:action=>"index"} but I'm not sure -%>
|
2
|
+
<%= form_tag params[:controller] == "folder" ? folder_index_path : url_for(:action=>'index'), :method=>:get, :class=>'per_page' do %>
|
3
|
+
<%= label_tag(:per_page, t('blacklight.search.per_page.label', :select => select_tag(:per_page, options_for_select(blacklight_config.per_page, h(params[:per_page])), :title => t('blacklight.search.per_page.title'))).html_safe) %>
|
4
|
+
<%= search_as_hidden_fields(:omit_keys => [:page, :per_page]) %>
|
5
|
+
<%= submit_tag t('blacklight.search.per_page.submit') %>
|
6
|
+
<% end %>
|
@@ -66,15 +66,6 @@ en:
|
|
66
66
|
complete:
|
67
67
|
title: 'Thank-you for your feedback'
|
68
68
|
|
69
|
-
folder:
|
70
|
-
title: 'Selected Items'
|
71
|
-
add:
|
72
|
-
success: '%{title} successfully added to selected items'
|
73
|
-
remove:
|
74
|
-
success: '%{title} successfully removed from selected items'
|
75
|
-
clear:
|
76
|
-
success: 'Selected items cleared.'
|
77
|
-
|
78
69
|
saved_searches:
|
79
70
|
add:
|
80
71
|
success: 'Successfully saved your search.'
|
@@ -192,9 +183,6 @@ en:
|
|
192
183
|
other: 'Showing item <b>%{current} of %{total}</b> from your search.'
|
193
184
|
documents:
|
194
185
|
counter: '%{counter}. '
|
195
|
-
folder:
|
196
|
-
select: 'Select'
|
197
|
-
unselect: 'Unselect'
|
198
186
|
facets:
|
199
187
|
title: 'Limit your search'
|
200
188
|
sort:
|
data/lib/blacklight/catalog.rb
CHANGED
@@ -10,6 +10,7 @@ module Blacklight::Catalog
|
|
10
10
|
# The following code is executed when someone includes blacklight::catalog in their
|
11
11
|
# own controller.
|
12
12
|
included do
|
13
|
+
helper_method :search_action_url
|
13
14
|
before_filter :search_session, :history_session
|
14
15
|
before_filter :delete_or_assign_search_session_params, :only => :index
|
15
16
|
after_filter :set_additional_search_session_values, :only=>:index
|
@@ -24,6 +25,9 @@ module Blacklight::Catalog
|
|
24
25
|
rescue_from RSolr::Error::Http, :with => :rsolr_request_error
|
25
26
|
end
|
26
27
|
|
28
|
+
def search_action_url
|
29
|
+
url_for(:action => 'index', :only_path => true)
|
30
|
+
end
|
27
31
|
|
28
32
|
# get search results from the solr index
|
29
33
|
def index
|
@@ -25,6 +25,7 @@ module Blacklight::Controller
|
|
25
25
|
base.send :helper_method, :stylesheet_links
|
26
26
|
base.send :helper_method, :javascript_includes
|
27
27
|
base.send :helper_method, :has_user_authentication_provider?
|
28
|
+
base.send :helper_method, :blacklight_config
|
28
29
|
|
29
30
|
|
30
31
|
# This callback runs when a user first logs in
|
@@ -32,6 +33,14 @@ module Blacklight::Controller
|
|
32
33
|
|
33
34
|
end
|
34
35
|
|
36
|
+
def default_catalog_controller
|
37
|
+
CatalogController
|
38
|
+
end
|
39
|
+
|
40
|
+
def blacklight_config
|
41
|
+
default_catalog_controller.blacklight_config
|
42
|
+
end
|
43
|
+
|
35
44
|
# test for exception notifier plugin
|
36
45
|
def error
|
37
46
|
raise RuntimeError, "Generating a test error..."
|
@@ -17,7 +17,7 @@ module Blacklight::Solr
|
|
17
17
|
# and need to make them accessible in a list so we can easily
|
18
18
|
# strip em out before redirecting to catalog/index.
|
19
19
|
# class variable (via class-level ivar)
|
20
|
-
@request_keys = {:sort => :'
|
20
|
+
@request_keys = {:sort => :'facet.sort', :page => :'facet.page'}
|
21
21
|
class << self; attr_accessor :request_keys end # create a class method
|
22
22
|
def request_keys ; self.class.request_keys ; end # shortcut
|
23
23
|
|
@@ -49,34 +49,27 @@ module Blacklight::Solr
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
def current_page
|
53
|
+
1 + @offset/@limit
|
54
|
+
end
|
55
|
+
|
52
56
|
def has_next?
|
53
57
|
@has_next
|
54
58
|
end
|
55
59
|
|
56
|
-
# Pass in your current request params, returns a param hash
|
57
|
-
# suitable to passing to an ActionHelper method (resource-based url_for, or
|
58
|
-
# link_to or url_for) navigating to the next facet value batch. Returns nil
|
59
|
-
# if there is no has_next?
|
60
|
-
def params_for_next_url(params)
|
61
|
-
return nil unless has_next?
|
62
|
-
|
63
|
-
return params.merge(request_keys[:offset] => offset + limit )
|
64
|
-
end
|
65
|
-
|
66
60
|
def has_previous?
|
67
61
|
@has_previous
|
68
62
|
end
|
69
|
-
|
70
|
-
# Pass in your current request params, returns a param hash
|
71
|
-
# suitable to passing to an ActionHelper method (resource-based url_for, or
|
72
|
-
# link_to or url_for) navigating to the previous facet value batch. Returns
|
73
|
-
# nil if there is no has_previous?
|
74
|
-
def params_for_previous_url(params)
|
75
|
-
return nil unless has_previous?
|
76
63
|
|
77
|
-
|
64
|
+
def last_page?
|
65
|
+
!has_next?
|
66
|
+
end
|
67
|
+
|
68
|
+
def first_page?
|
69
|
+
!has_previous?
|
78
70
|
end
|
79
71
|
|
72
|
+
|
80
73
|
# Pass in a desired solr facet solr key ('count' or 'index', see
|
81
74
|
# http://wiki.apache.org/solr/SimpleFacetParameters#facet.limit
|
82
75
|
# under facet.sort ), and your current request params.
|
@@ -85,8 +78,7 @@ module Blacklight::Solr
|
|
85
78
|
def params_for_resort_url(sort_method, params)
|
86
79
|
# When resorting, we've got to reset the offset to start at beginning,
|
87
80
|
# no way to make it make sense otherwise.
|
88
|
-
return params.merge(request_keys[:sort] => sort_method,
|
89
|
-
request_keys[:offset] => 0)
|
81
|
+
return params.merge(request_keys[:sort] => sort_method, request_keys[:page] => nil)
|
90
82
|
end
|
91
83
|
|
92
84
|
end
|
@@ -436,17 +436,20 @@ module Blacklight::SolrHelper
|
|
436
436
|
# Now override with our specific things for fetching facet values
|
437
437
|
solr_params[:"facet.field"] = facet_field
|
438
438
|
|
439
|
-
|
440
|
-
|
441
|
-
solr_params[:"f.#{facet_field}.facet.limit"] =
|
439
|
+
|
440
|
+
limit =
|
442
441
|
if respond_to?(:facet_list_limit)
|
443
|
-
facet_list_limit.to_s.to_i
|
442
|
+
facet_list_limit.to_s.to_i
|
444
443
|
elsif solr_params["facet.limit"]
|
445
|
-
solr_params["facet.limit"].to_i
|
444
|
+
solr_params["facet.limit"].to_i
|
446
445
|
else
|
447
|
-
20
|
446
|
+
20
|
448
447
|
end
|
449
|
-
|
448
|
+
|
449
|
+
# Need to set as f.facet_field.facet.* to make sure we
|
450
|
+
# override any field-specific default in the solr request handler.
|
451
|
+
solr_params[:"f.#{facet_field}.facet.limit"] = limit + 1
|
452
|
+
solr_params[:"f.#{facet_field}.facet.offset"] = ( input.fetch(Blacklight::Solr::FacetPaginator.request_keys[:page] , 1).to_i - 1 ) * ( limit )
|
450
453
|
solr_params[:"f.#{facet_field}.facet.sort"] = input[ Blacklight::Solr::FacetPaginator.request_keys[:sort] ] if input[ Blacklight::Solr::FacetPaginator.request_keys[:sort] ]
|
451
454
|
solr_params[:rows] = 0
|
452
455
|
|
@@ -456,9 +459,9 @@ module Blacklight::SolrHelper
|
|
456
459
|
# a solr query method
|
457
460
|
# used to paginate through a single facet field's values
|
458
461
|
# /catalog/facet/language_facet
|
459
|
-
def get_facet_pagination(facet_field, extra_controller_params={})
|
462
|
+
def get_facet_pagination(facet_field, user_params=params || {}, extra_controller_params={})
|
460
463
|
|
461
|
-
solr_params = solr_facet_params(facet_field,
|
464
|
+
solr_params = solr_facet_params(facet_field, user_params, extra_controller_params)
|
462
465
|
|
463
466
|
# Make the solr call
|
464
467
|
response =find(blacklight_config.solr_request_handler, solr_params)
|
@@ -123,7 +123,7 @@ EOF
|
|
123
123
|
file_path = "app/models/#{model_name.underscore}.rb"
|
124
124
|
if File.exists?(file_path)
|
125
125
|
inject_into_class file_path, model_name.classify do
|
126
|
-
"# Connects this user object to Blacklights Bookmarks
|
126
|
+
"# Connects this user object to Blacklights Bookmarks. " +
|
127
127
|
"\n include Blacklight::User\n"
|
128
128
|
end
|
129
129
|
else
|
@@ -17,26 +17,10 @@ Feature: Bookmarks
|
|
17
17
|
When I go to the bookmarks page
|
18
18
|
Then I should see "You have no bookmarks"
|
19
19
|
|
20
|
-
Scenario: User Has Bookmarks
|
21
|
-
Given I am logged in as "user1"
|
22
|
-
And "user1" has bookmarked an item with title "foo bar"
|
23
|
-
When I go to the bookmarks page
|
24
|
-
Then I should see "Your Bookmarks"
|
25
|
-
And I should see "foo bar"
|
26
|
-
|
27
|
-
Scenario: Deleting a Bookmark
|
28
|
-
Given I am logged in as "user1"
|
29
|
-
And "user1" has bookmarked an item with title "foo bar"
|
30
|
-
And I am on the bookmarks page
|
31
|
-
Then I should see a "Remove" button
|
32
|
-
When I press "Remove"
|
33
|
-
Then I should see "Successfully removed bookmark."
|
34
|
-
|
35
20
|
Scenario: Clearing Bookmarks
|
36
|
-
Given I am
|
37
|
-
And
|
38
|
-
|
39
|
-
And I am on the bookmarks page
|
21
|
+
Given I am on the document page for id 2007020969
|
22
|
+
And I press "Bookmark"
|
23
|
+
When I am on the bookmarks page
|
40
24
|
Then I should see "Clear Bookmarks"
|
41
25
|
When I follow "Clear Bookmarks"
|
42
26
|
Then I should see "Cleared your bookmarks."
|
@@ -74,5 +58,5 @@ Feature: Bookmarks
|
|
74
58
|
And I press "Bookmark"
|
75
59
|
And I am logged in as "user1"
|
76
60
|
When I go to the bookmarks page
|
77
|
-
Then I should see a "Remove" button
|
61
|
+
Then I should see a "Remove bookmark" button
|
78
62
|
|
@@ -6,6 +6,26 @@ describe FacetsHelper do
|
|
6
6
|
helper.stub(:blacklight_config).and_return blacklight_config
|
7
7
|
end
|
8
8
|
|
9
|
+
describe "has_facet_values?" do
|
10
|
+
it "should be true if there are any facets to display" do
|
11
|
+
|
12
|
+
a = mock(:items => [1,2])
|
13
|
+
b = mock(:items => ['b','c'])
|
14
|
+
empty = mock(:items => [])
|
15
|
+
|
16
|
+
fields = [a,b,empty]
|
17
|
+
helper.has_facet_values?(fields).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be false if all facets are empty" do
|
21
|
+
|
22
|
+
empty = mock(:items => [])
|
23
|
+
|
24
|
+
fields = [empty]
|
25
|
+
helper.has_facet_values?(fields).should_not be_true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
9
29
|
describe "should_render_facet?" do
|
10
30
|
before do
|
11
31
|
@config = Blacklight::Configuration.new do |config|
|
@@ -11,23 +11,16 @@ describe 'Blacklight::Solr::FacetPaginator' do
|
|
11
11
|
@limit = 6
|
12
12
|
|
13
13
|
@sort_key = Blacklight::Solr::FacetPaginator.request_keys[:sort]
|
14
|
-
@
|
15
|
-
@limit_key = Blacklight::Solr::FacetPaginator.request_keys[:limit]
|
14
|
+
@page_key = Blacklight::Solr::FacetPaginator.request_keys[:page]
|
16
15
|
end
|
17
16
|
context 'when there are limit+1 results' do
|
18
17
|
before(:each) do
|
19
|
-
@paginator = Blacklight::Solr::FacetPaginator.new(@seven_facet_values,
|
18
|
+
@paginator = Blacklight::Solr::FacetPaginator.new(@seven_facet_values, :limit => 6)
|
20
19
|
end
|
21
20
|
it 'should have next' do
|
22
21
|
@paginator.should be_has_next
|
23
22
|
end
|
24
|
-
it 'should generate proper next params' do
|
25
|
-
next_params = @paginator.params_for_next_url(:original1 => "original1", :original2 => "original2")
|
26
23
|
|
27
|
-
next_params[:original1].should == "original1"
|
28
|
-
next_params[:original2].should == "original2"
|
29
|
-
next_params[@offset_key].should == 0 + @limit
|
30
|
-
end
|
31
24
|
end
|
32
25
|
it 'should not have next when there are fewer results' do
|
33
26
|
paginator = Blacklight::Solr::FacetPaginator.new(@six_facet_values, :offset => 0, :limit => @limit)
|
@@ -44,14 +37,6 @@ describe 'Blacklight::Solr::FacetPaginator' do
|
|
44
37
|
@paginator.should be_has_previous
|
45
38
|
end
|
46
39
|
|
47
|
-
it 'should generate proper previous params' do
|
48
|
-
next_params = @paginator.params_for_previous_url(:original1 => "original1", :original2 => "original2")
|
49
|
-
|
50
|
-
next_params[:original1].should == "original1"
|
51
|
-
next_params[:original2].should == "original2"
|
52
|
-
next_params[@offset_key].should == @offset - @limit
|
53
|
-
end
|
54
|
-
|
55
40
|
end
|
56
41
|
it 'should not have previous when offset is 0' do
|
57
42
|
paginator = Blacklight::Solr::FacetPaginator.new(@seven_facet_values, :offset => 0, :limit => @limit)
|
@@ -66,7 +51,7 @@ describe 'Blacklight::Solr::FacetPaginator' do
|
|
66
51
|
click_params = paginator.params_for_resort_url('count', {})
|
67
52
|
|
68
53
|
click_params[ @sort_key ].should == 'count'
|
69
|
-
click_params[ @
|
54
|
+
click_params[ @page_key ].should be_nil
|
70
55
|
end
|
71
56
|
it 'should limit items to limit, if limit is smaller than items.length' do
|
72
57
|
paginator = Blacklight::Solr::FacetPaginator.new(@seven_facet_values, :offset => 100, :limit => 6, :sort => 'index')
|
@@ -433,7 +433,7 @@ describe 'Blacklight::SolrHelper' do
|
|
433
433
|
@generated_solr_facet_params = solr_facet_params(@facet_field)
|
434
434
|
|
435
435
|
@sort_key = Blacklight::Solr::FacetPaginator.request_keys[:sort]
|
436
|
-
@
|
436
|
+
@page_key = Blacklight::Solr::FacetPaginator.request_keys[:page]
|
437
437
|
@config = Blacklight::Configuration.new do |config|
|
438
438
|
config.add_facet_fields_to_solr_request!
|
439
439
|
config.add_facet_field 'format'
|
@@ -452,8 +452,8 @@ describe 'Blacklight::SolrHelper' do
|
|
452
452
|
@generated_solr_facet_params[:"f.#{@facet_field}.facet.offset"].should == 0
|
453
453
|
end
|
454
454
|
it 'uses offset manually set, and converts it to an integer' do
|
455
|
-
solr_params = solr_facet_params(@facet_field, @
|
456
|
-
solr_params[:"f.#{@facet_field}.facet.offset"].should ==
|
455
|
+
solr_params = solr_facet_params(@facet_field, @page_key => 2)
|
456
|
+
solr_params[:"f.#{@facet_field}.facet.offset"].should == 20
|
457
457
|
end
|
458
458
|
it 'defaults limit to 20' do
|
459
459
|
solr_params = solr_facet_params(@facet_field)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blacklight
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.8.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -17,7 +17,7 @@ authors:
|
|
17
17
|
autorequire:
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
|
-
date: 2012-
|
20
|
+
date: 2012-11-02 00:00:00.000000000 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: rails
|
@@ -233,7 +233,6 @@ files:
|
|
233
233
|
- app/assets/javascripts/blacklight/checkbox_submit.js
|
234
234
|
- app/assets/javascripts/blacklight/core.js
|
235
235
|
- app/assets/javascripts/blacklight/facet_expand_contract.js
|
236
|
-
- app/assets/javascripts/blacklight/folder_toggle.js
|
237
236
|
- app/assets/javascripts/blacklight/lightbox_dialog.js
|
238
237
|
- app/assets/javascripts/blacklight/more_facets.js
|
239
238
|
- app/assets/javascripts/blacklight/search_context.js
|
@@ -243,9 +242,9 @@ files:
|
|
243
242
|
- app/assets/javascripts/jquery-ui-1.8.1.custom.min.js
|
244
243
|
- app/assets/javascripts/jquery.uiExt.ajaxyDialog.js
|
245
244
|
- app/assets/stylesheets/blacklight/_blacklight_base.css.scss
|
245
|
+
- app/assets/stylesheets/blacklight/_bookmark.css.scss
|
246
246
|
- app/assets/stylesheets/blacklight/_catalog.css.scss
|
247
247
|
- app/assets/stylesheets/blacklight/_facets.css.scss
|
248
|
-
- app/assets/stylesheets/blacklight/_folder.css.scss
|
249
248
|
- app/assets/stylesheets/blacklight/_formatting.css.scss
|
250
249
|
- app/assets/stylesheets/blacklight/_header.css.scss
|
251
250
|
- app/assets/stylesheets/blacklight/_layout.css.scss
|
@@ -295,6 +294,7 @@ files:
|
|
295
294
|
- app/models/search.rb
|
296
295
|
- app/views/_flash_msg.html.erb
|
297
296
|
- app/views/_user_util_links.html.erb
|
297
|
+
- app/views/bookmarks/_tools.html.erb
|
298
298
|
- app/views/bookmarks/index.html.erb
|
299
299
|
- app/views/catalog/_bookmark_control.html.erb
|
300
300
|
- app/views/catalog/_bookmark_form.html.erb
|
@@ -315,6 +315,7 @@ files:
|
|
315
315
|
- app/views/catalog/_index_default.html.erb
|
316
316
|
- app/views/catalog/_marc_view.html.erb
|
317
317
|
- app/views/catalog/_opensearch_response_metadata.html.erb
|
318
|
+
- app/views/catalog/_per_page_widget.html.erb
|
318
319
|
- app/views/catalog/_previous_next_doc.html.erb
|
319
320
|
- app/views/catalog/_refworks_form.html.erb
|
320
321
|
- app/views/catalog/_results_pagination.html.erb
|
@@ -324,6 +325,7 @@ files:
|
|
324
325
|
- app/views/catalog/_show_tools.html.erb
|
325
326
|
- app/views/catalog/_sms_form.html.erb
|
326
327
|
- app/views/catalog/_sort_and_per_page.html.erb
|
328
|
+
- app/views/catalog/_sort_widget.html.erb
|
327
329
|
- app/views/catalog/citation.html.erb
|
328
330
|
- app/views/catalog/email.erb
|
329
331
|
- app/views/catalog/endnote.endnote.erb
|
@@ -341,8 +343,6 @@ files:
|
|
341
343
|
- app/views/catalog/sms.erb
|
342
344
|
- app/views/feedback/complete.html.erb
|
343
345
|
- app/views/feedback/show.html.erb
|
344
|
-
- app/views/folder/_tools.html.erb
|
345
|
-
- app/views/folder/index.html.erb
|
346
346
|
- app/views/kaminari/blacklight/_first_page.html.erb
|
347
347
|
- app/views/kaminari/blacklight/_gap.html.erb
|
348
348
|
- app/views/kaminari/blacklight/_last_page.html.erb
|
@@ -508,7 +508,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
508
508
|
version: '0'
|
509
509
|
segments:
|
510
510
|
- 0
|
511
|
-
hash: -
|
511
|
+
hash: -3050377984529966753
|
512
512
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
513
513
|
none: false
|
514
514
|
requirements:
|
@@ -517,7 +517,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
517
517
|
version: '0'
|
518
518
|
segments:
|
519
519
|
- 0
|
520
|
-
hash: -
|
520
|
+
hash: -3050377984529966753
|
521
521
|
requirements: []
|
522
522
|
rubyforge_project: blacklight
|
523
523
|
rubygems_version: 1.8.23
|
@@ -1,24 +0,0 @@
|
|
1
|
-
//= require blacklight/core
|
2
|
-
//= require blacklight/checkbox_submit
|
3
|
-
(function($) {
|
4
|
-
Blacklight.do_folder_toggle_behavior = function() {
|
5
|
-
$( Blacklight.do_folder_toggle_behavior.selector ).bl_checkbox_submit({
|
6
|
-
checked_label: "Selected",
|
7
|
-
unchecked_label: "Select",
|
8
|
-
css_class: "toggle_folder",
|
9
|
-
success: function(new_state) {
|
10
|
-
|
11
|
-
if (new_state) {
|
12
|
-
$("#folder_number").text(parseInt($("#folder_number").text()) + 1);
|
13
|
-
}
|
14
|
-
else {
|
15
|
-
$("#folder_number").text(parseInt($("#folder_number").text()) - 1);
|
16
|
-
}
|
17
|
-
}
|
18
|
-
});
|
19
|
-
};
|
20
|
-
Blacklight.do_folder_toggle_behavior.selector = "form.folder_toggle";
|
21
|
-
$(document).ready(function() {
|
22
|
-
Blacklight.do_folder_toggle_behavior();
|
23
|
-
});
|
24
|
-
})(jQuery);
|
@@ -1,38 +0,0 @@
|
|
1
|
-
ul.folderTools
|
2
|
-
{
|
3
|
-
@include border-radius(0 0 4px 4px);
|
4
|
-
background-color: $search_ui_bg_color;
|
5
|
-
border-color: $search_ui_border_color;
|
6
|
-
border-style:solid;
|
7
|
-
border-width:0 1px 1px;
|
8
|
-
margin:0;
|
9
|
-
padding:0.66em;
|
10
|
-
|
11
|
-
li
|
12
|
-
{
|
13
|
-
display:inline-block;
|
14
|
-
margin:0 10px;
|
15
|
-
}
|
16
|
-
|
17
|
-
li form
|
18
|
-
{
|
19
|
-
display:inline;
|
20
|
-
}
|
21
|
-
|
22
|
-
li.refworks form input.submit
|
23
|
-
{
|
24
|
-
display:none;
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
ul.tools
|
29
|
-
{
|
30
|
-
margin:0;
|
31
|
-
padding:0;
|
32
|
-
|
33
|
-
li
|
34
|
-
{
|
35
|
-
display:inline;
|
36
|
-
margin:0 10px;
|
37
|
-
}
|
38
|
-
}
|
@@ -1,44 +0,0 @@
|
|
1
|
-
<% sidebar_items << capture do %>
|
2
|
-
<p><%= link_back_to_catalog %></p>
|
3
|
-
<% end %>
|
4
|
-
<h1><%= t('blacklight.folder.title') %></h1>
|
5
|
-
|
6
|
-
<% unless @documents.empty? %>
|
7
|
-
<%- # just adding pageEntriedInfo div to get the proper rounded corners at the top -%>
|
8
|
-
<div class="pageEntriesInfo"></div>
|
9
|
-
<%= render "catalog/sort_and_per_page" %>
|
10
|
-
<%= render "catalog/results_pagination" %>
|
11
|
-
|
12
|
-
<%= render 'tools' %>
|
13
|
-
<% end %>
|
14
|
-
|
15
|
-
<div id="documents">
|
16
|
-
<% @documents.each_with_index do |document, i| %>
|
17
|
-
<% # container for a single doc -%>
|
18
|
-
<div class="document">
|
19
|
-
<% # header bar for doc items in index view -%>
|
20
|
-
<div class="documentHeader">
|
21
|
-
<div class="documentFunctions">
|
22
|
-
<div class="in_folder">
|
23
|
-
<%= render :partial=>'catalog/folder_control', :locals=>{:document=>document} %>
|
24
|
-
</div>
|
25
|
-
</div>
|
26
|
-
|
27
|
-
<h3 class="index_title"><%= i + 1 + @response.params[:start].to_i%>. <%= link_to_document document, :label => document_show_link_field, :results_view => false %></h3>
|
28
|
-
|
29
|
-
|
30
|
-
</div>
|
31
|
-
|
32
|
-
<%= render_document_partial document, :index %>
|
33
|
-
<% if document.respond_to?(:export_as_openurl_ctx_kev) %>
|
34
|
-
<!--
|
35
|
-
// COinS, for Zotero among others.
|
36
|
-
// This document_partial_name(@document) business is not quite right,
|
37
|
-
// but has been there for a while.
|
38
|
-
-->
|
39
|
-
<span class="Z3988" title="<%= document.export_as_openurl_ctx_kev(document_partial_name(document)) %>"></span>
|
40
|
-
<% end %>
|
41
|
-
</div>
|
42
|
-
|
43
|
-
<% end %>
|
44
|
-
</div>
|