blacklight 3.0pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.gitmodules +6 -0
- data/.yardopts +4 -0
- data/Gemfile +4 -0
- data/LICENSE +14 -0
- data/README.rdoc +168 -0
- data/Rakefile +9 -0
- data/app/controllers/bookmarks_controller.rb +98 -0
- data/app/controllers/feedback_controller.rb +37 -0
- data/app/controllers/folder_controller.rb +49 -0
- data/app/controllers/saved_searches_controller.rb +45 -0
- data/app/controllers/search_history_controller.rb +25 -0
- data/app/helpers/blacklight_helper.rb +606 -0
- data/app/helpers/bookmarks_helper.rb +3 -0
- data/app/helpers/catalog_helper.rb +65 -0
- data/app/helpers/feedback_helper.rb +2 -0
- data/app/helpers/hash_as_hidden_fields.rb +57 -0
- data/app/helpers/render_constraints_helper.rb +120 -0
- data/app/helpers/saved_searches_helper.rb +2 -0
- data/app/helpers/search_history_helper.rb +2 -0
- data/app/models/bookmark.rb +6 -0
- data/app/models/record_mailer.rb +43 -0
- data/app/models/search.rb +19 -0
- data/app/views/_flash_msg.html.erb +6 -0
- data/app/views/_user_util_links.html.erb +13 -0
- data/app/views/bookmarks/index.html.erb +33 -0
- data/app/views/catalog/_bookmark_control.html.erb +25 -0
- data/app/views/catalog/_bookmark_form.html.erb +8 -0
- data/app/views/catalog/_citation.html.erb +15 -0
- data/app/views/catalog/_constraints.html.erb +7 -0
- data/app/views/catalog/_constraints_element.html.erb +33 -0
- data/app/views/catalog/_did_you_mean.html.erb +10 -0
- data/app/views/catalog/_document_list.html.erb +30 -0
- data/app/views/catalog/_email_form.html.erb +11 -0
- data/app/views/catalog/_facet_limit.html.erb +33 -0
- data/app/views/catalog/_facet_pagination.html.erb +28 -0
- data/app/views/catalog/_facets.html.erb +9 -0
- data/app/views/catalog/_folder_control.html.erb +12 -0
- data/app/views/catalog/_home.html.erb +6 -0
- data/app/views/catalog/_home_text.html.erb +6 -0
- data/app/views/catalog/_index_partials/_default.erb +11 -0
- data/app/views/catalog/_marc_view.html.erb +33 -0
- data/app/views/catalog/_opensearch_response_metadata.html.erb +3 -0
- data/app/views/catalog/_previous_next_doc.html.erb +6 -0
- data/app/views/catalog/_refworks_form.html.erb +7 -0
- data/app/views/catalog/_results_pagination.html.erb +11 -0
- data/app/views/catalog/_search_form.html.erb +14 -0
- data/app/views/catalog/_show_partials/_default.html.erb +9 -0
- data/app/views/catalog/_show_sidebar.html.erb +1 -0
- data/app/views/catalog/_show_tools.html.erb +46 -0
- data/app/views/catalog/_sms_form.html.erb +23 -0
- data/app/views/catalog/_solr_request.html.erb +5 -0
- data/app/views/catalog/_sort_and_per_page.html.erb +20 -0
- data/app/views/catalog/_unapi_microformat.html.erb +1 -0
- data/app/views/catalog/citation.html.erb +1 -0
- data/app/views/catalog/email.erb +1 -0
- data/app/views/catalog/endnote.endnote.erb +1 -0
- data/app/views/catalog/facet.html.erb +28 -0
- data/app/views/catalog/index.atom.builder +108 -0
- data/app/views/catalog/index.html.erb +37 -0
- data/app/views/catalog/index.rss.builder +19 -0
- data/app/views/catalog/librarian_view.html.erb +3 -0
- data/app/views/catalog/opensearch.json.erb +0 -0
- data/app/views/catalog/opensearch.xml.erb +11 -0
- data/app/views/catalog/send_email_record.erb +0 -0
- data/app/views/catalog/show.endnote.erb +1 -0
- data/app/views/catalog/show.html.erb +42 -0
- data/app/views/catalog/show.refworks.erb +1 -0
- data/app/views/catalog/sms.erb +1 -0
- data/app/views/catalog/unapi.xml.builder +6 -0
- data/app/views/feedback/complete.html.erb +3 -0
- data/app/views/feedback/show.html.erb +20 -0
- data/app/views/folder/_tools.html.erb +23 -0
- data/app/views/folder/index.html.erb +44 -0
- data/app/views/layouts/blacklight.html.erb +49 -0
- data/app/views/record_mailer/email_record.erb +6 -0
- data/app/views/record_mailer/sms_record.erb +4 -0
- data/app/views/saved_searches/index.html.erb +27 -0
- data/app/views/search_history/index.html.erb +23 -0
- data/blacklight.gemspec +50 -0
- data/config.ru +4 -0
- data/config/routes.rb +54 -0
- data/db/seeds.rb +7 -0
- data/features/generators.feature +77 -0
- data/features/support/aruba.rb +9 -0
- data/install.rb +0 -0
- data/install/solr.yml +8 -0
- data/lib/blacklight.rb +121 -0
- data/lib/blacklight/catalog.rb +311 -0
- data/lib/blacklight/comma_link_renderer.rb +27 -0
- data/lib/blacklight/configurable.rb +46 -0
- data/lib/blacklight/controller.rb +121 -0
- data/lib/blacklight/engine.rb +32 -0
- data/lib/blacklight/exceptions.rb +13 -0
- data/lib/blacklight/marc.rb +46 -0
- data/lib/blacklight/marc/citation.rb +251 -0
- data/lib/blacklight/search_fields.rb +107 -0
- data/lib/blacklight/solr.rb +7 -0
- data/lib/blacklight/solr/document.rb +239 -0
- data/lib/blacklight/solr/document/dublin_core.rb +40 -0
- data/lib/blacklight/solr/document/email.rb +15 -0
- data/lib/blacklight/solr/document/marc.rb +84 -0
- data/lib/blacklight/solr/document/marc_export.rb +430 -0
- data/lib/blacklight/solr/document/sms.rb +13 -0
- data/lib/blacklight/solr/facet_paginator.rb +93 -0
- data/lib/blacklight/solr_helper.rb +413 -0
- data/lib/blacklight/user.rb +55 -0
- data/lib/blacklight/version.rb +3 -0
- data/lib/colorize.rb +196 -0
- data/lib/generators/blacklight/blacklight_generator.rb +134 -0
- data/lib/generators/blacklight/templates/SolrMarc.jar +0 -0
- data/lib/generators/blacklight/templates/catalog_controller.rb +8 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/config-test.properties +37 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/config.properties +37 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/index.properties +97 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/index_scripts/dewey.bsh +47 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/index_scripts/format.bsh +126 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/README_MAPS +1 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/callnumber_map.properties +407 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/composition_era_map.properties +56 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/country_map.properties +379 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/format_map.properties +50 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/instrument_map.properties +101 -0
- data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/language_map.properties +490 -0
- data/lib/generators/blacklight/templates/config/blacklight_config.rb +245 -0
- data/lib/generators/blacklight/templates/config/solr.yml +6 -0
- data/lib/generators/blacklight/templates/migrations/add_user_types_to_bookmarks_searches.rb +11 -0
- data/lib/generators/blacklight/templates/migrations/create_bookmarks.rb +17 -0
- data/lib/generators/blacklight/templates/migrations/create_searches.rb +15 -0
- data/lib/generators/blacklight/templates/migrations/remove_editable_fields_from_bookmarks.rb +11 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/bg.png +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/border.png +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/bul_sq_gry.gif +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/checkmark.gif +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/logo.png +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/magnifying_glass.gif +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/remove.gif +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/separator.gif +0 -0
- data/lib/generators/blacklight/templates/public/images/blacklight/start_over.gif +0 -0
- data/lib/generators/blacklight/templates/public/javascripts/blacklight.js +485 -0
- data/lib/generators/blacklight/templates/public/javascripts/jquery-1.4.2.min.js +154 -0
- data/lib/generators/blacklight/templates/public/javascripts/jquery-ui-1.8.1.custom.min.js +756 -0
- data/lib/generators/blacklight/templates/public/stylesheets/blacklight.css +487 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_558fd0_500x100.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_2e4f81_256x240.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
- data/lib/generators/blacklight/templates/public/stylesheets/yui.css +31 -0
- data/lib/generators/blacklight/templates/solr_document.rb +30 -0
- data/lib/railties/blacklight.rake +66 -0
- data/lib/railties/cucumber.rake +53 -0
- data/lib/railties/rspec.rake +188 -0
- data/lib/railties/solr_marc.rake +148 -0
- data/lib/railties/test_solr_server.rb +130 -0
- data/spec/helpers/catalog_helper_spec.rb +111 -0
- data/spec/views/catalog/_sms_form.html.erb_spec.rb +19 -0
- data/tasks/blacklight_tasks.rake +4 -0
- data/uninstall.rb +1 -0
- metadata +431 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
class SearchHistoryController < ApplicationController
|
2
|
+
def index
|
3
|
+
@searches = searches_from_history
|
4
|
+
end
|
5
|
+
|
6
|
+
#TODO we may want to remove unsaved (those without user_id) items from the database when removed from history
|
7
|
+
def destroy
|
8
|
+
if session[:history].delete(params[:id].to_i)
|
9
|
+
flash[:notice] = "Successfully removed that search history item."
|
10
|
+
else
|
11
|
+
flash[:error] = "Couldn't remove that search history item."
|
12
|
+
end
|
13
|
+
redirect_to :back
|
14
|
+
end
|
15
|
+
|
16
|
+
#TODO we may want to remove unsaved (those without user_id) items from the database when removed from history
|
17
|
+
def clear
|
18
|
+
if session[:history].clear
|
19
|
+
flash[:notice] = "Cleared your search history."
|
20
|
+
else
|
21
|
+
flash[:error] = "There was a problem clearing your search history."
|
22
|
+
end
|
23
|
+
redirect_to :back
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,606 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# Methods added to this helper will be available to all templates in the hosting application
|
4
|
+
#
|
5
|
+
module BlacklightHelper
|
6
|
+
include HashAsHiddenFields
|
7
|
+
include RenderConstraintsHelper
|
8
|
+
|
9
|
+
|
10
|
+
def application_name
|
11
|
+
'Blacklight'
|
12
|
+
end
|
13
|
+
|
14
|
+
##
|
15
|
+
# This method should be included in any Blacklight layout, including
|
16
|
+
# custom ones. It will output results of #render_js_includes,
|
17
|
+
# #render_stylesheet_includes, and all the content of
|
18
|
+
# current_controller#extra_head_content.
|
19
|
+
#
|
20
|
+
# Uses controller methods #extra_head_content, #javascript_includes,
|
21
|
+
# and #stylesheet_links to find content. Tolerates it if those
|
22
|
+
# methods don't exist, silently skipping.
|
23
|
+
#
|
24
|
+
# By a layout outputting this in html HEAD, it provides an easy way for
|
25
|
+
# local config or extra plugins to add HEAD content.
|
26
|
+
#
|
27
|
+
# Add your own css or remove the defaults by simply editing
|
28
|
+
# controller.stylesheet_links, controller.javascript_includes,
|
29
|
+
# or controller.extra_head_content.
|
30
|
+
#
|
31
|
+
#
|
32
|
+
#
|
33
|
+
# in an initializer or other startup file (plugin init.rb?):
|
34
|
+
#
|
35
|
+
# == Apply to all actions in all controllers:
|
36
|
+
#
|
37
|
+
# ApplicationController.before_filter do |controller|
|
38
|
+
# # remove default jquery-ui theme.
|
39
|
+
# controller.stylesheet_links.each do |args|
|
40
|
+
# args.delete_if {|a| a =~ /^|\/jquery-ui-[\d.]+\.custom\.css$/ }
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# # add in a different jquery-ui theme, or any other css or what have you
|
44
|
+
# controller.stylesheet_links << 'my_css.css'
|
45
|
+
#
|
46
|
+
# controller.javascript_includes << "my_local_behaviors.js"
|
47
|
+
#
|
48
|
+
# controller.extra_head_content << '<link rel="something" href="something">'
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# == Apply to a particular action in a particular controller:
|
52
|
+
#
|
53
|
+
# CatalogController.before_filter :only => :show |controller|
|
54
|
+
# controller.extra_head_content << '<link rel="something" href="something">'
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# == Or in a view file that wants to add certain header content? no problem:
|
58
|
+
#
|
59
|
+
# <% stylesheet_links << "mystylesheet.css" %>
|
60
|
+
# <% javascript_includes << "my_js.js" %>
|
61
|
+
# <% extra_head_content << capture do %>
|
62
|
+
# <%= tag :link, { :href => some_method_for_something, :rel => "alternate" } %>
|
63
|
+
# <% end %>
|
64
|
+
#
|
65
|
+
# == Full power of javascript_include_tag and stylesheet_link_tag
|
66
|
+
# Note that the elements added to stylesheet_links and javascript_links
|
67
|
+
# are arguments to Rails javascript_include_tag and stylesheet_link_tag
|
68
|
+
# respectively, you can pass complex arguments. eg:
|
69
|
+
#
|
70
|
+
# stylesheet_links << ["stylesheet1.css", "stylesheet2.css", {:cache => "mykey"}]
|
71
|
+
# javascript_includes << ["myjavascript.js", {:plugin => :myplugin} ]
|
72
|
+
def render_head_content
|
73
|
+
render_stylesheet_includes +
|
74
|
+
render_js_includes +
|
75
|
+
render_extra_head_content
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# Assumes controller has a #stylesheet_link_tag method, array with
|
80
|
+
# each element being a set of arguments for stylesheet_link_tag
|
81
|
+
# See #render_head_content for instructions on local code or plugins
|
82
|
+
# adding stylesheets.
|
83
|
+
def render_stylesheet_includes
|
84
|
+
return "".html_safe unless respond_to?(:stylesheet_links)
|
85
|
+
|
86
|
+
stylesheet_links.collect do |args|
|
87
|
+
stylesheet_link_tag(*args)
|
88
|
+
end.join("\n").html_safe
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
##
|
93
|
+
# Assumes controller has a #js_includes method, array with each
|
94
|
+
# element being a set of arguments for javsascript_include_tag.
|
95
|
+
# See #render_head_content for instructions on local code or plugins
|
96
|
+
# adding js files.
|
97
|
+
def render_js_includes
|
98
|
+
return "".html_safe unless respond_to?(:javascript_includes)
|
99
|
+
|
100
|
+
javascript_includes.collect do |args|
|
101
|
+
javascript_include_tag(*args)
|
102
|
+
end.join("\n").html_safe
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# Assumes controller has a #extra_head_content method
|
107
|
+
#
|
108
|
+
def render_extra_head_content
|
109
|
+
return "".html_safe unless respond_to?(:extra_head_content)
|
110
|
+
|
111
|
+
extra_head_content.join("\n").html_safe
|
112
|
+
end
|
113
|
+
|
114
|
+
# Create <link rel="alternate"> links from a documents dynamically
|
115
|
+
# provided export formats. Currently not used by standard BL layouts,
|
116
|
+
# but available for your custom layouts to provide link rel alternates.
|
117
|
+
#
|
118
|
+
# Returns empty string if no links available.
|
119
|
+
#
|
120
|
+
# :unique => true, will ensure only one link is output for every
|
121
|
+
# content type, as required eg in atom. Which one 'wins' is arbitrary.
|
122
|
+
# :exclude => array of format shortnames, formats to not include at all.
|
123
|
+
def render_link_rel_alternates(document=@document, options = {})
|
124
|
+
options = {:unique => false, :exclude => []}.merge(options)
|
125
|
+
|
126
|
+
return nil if document.nil?
|
127
|
+
|
128
|
+
seen = Set.new
|
129
|
+
|
130
|
+
html = ""
|
131
|
+
document.export_formats.each_pair do |format, spec|
|
132
|
+
unless( options[:exclude].include?(format) ||
|
133
|
+
(options[:unique] && seen.include?(spec[:content_type]))
|
134
|
+
)
|
135
|
+
html << tag(:link, {:rel=>"alternate", :title=>format, :type => spec[:content_type], :href=> catalog_url(document[:id], format)}) << "\n"
|
136
|
+
|
137
|
+
seen.add(spec[:content_type]) if options[:unique]
|
138
|
+
end
|
139
|
+
end
|
140
|
+
return html.html_safe
|
141
|
+
end
|
142
|
+
|
143
|
+
def render_opensearch_response_metadata
|
144
|
+
render :partial => 'catalog/opensearch_response_metadata'
|
145
|
+
end
|
146
|
+
|
147
|
+
def render_body_class
|
148
|
+
extra_body_classes.join " "
|
149
|
+
end
|
150
|
+
|
151
|
+
# collection of items to be rendered in the @sidebar
|
152
|
+
def sidebar_items
|
153
|
+
@sidebar_items ||= []
|
154
|
+
end
|
155
|
+
|
156
|
+
def extra_body_classes
|
157
|
+
@extra_body_classes ||= ['blacklight-' + controller.controller_name, 'blacklight-' + [controller.controller_name, controller.action_name].join('-')]
|
158
|
+
end
|
159
|
+
|
160
|
+
#
|
161
|
+
# Blacklight.config based helpers ->
|
162
|
+
#
|
163
|
+
|
164
|
+
# used in the catalog/_facets partial
|
165
|
+
def facet_field_labels
|
166
|
+
Blacklight.config[:facet][:labels]
|
167
|
+
end
|
168
|
+
|
169
|
+
# used in the catalog/_facets partial
|
170
|
+
def facet_field_names
|
171
|
+
Blacklight.config[:facet][:field_names]
|
172
|
+
end
|
173
|
+
|
174
|
+
# used in the catalog/_facets partial and elsewhere
|
175
|
+
# Renders a single section for facet limit with a specified
|
176
|
+
# solr field used for faceting. Can be over-ridden for custom
|
177
|
+
# display on a per-facet basis.
|
178
|
+
def render_facet_limit(solr_field)
|
179
|
+
render( :partial => "catalog/facet_limit", :locals => {:solr_field =>solr_field })
|
180
|
+
end
|
181
|
+
|
182
|
+
def render_document_list_partial options={}
|
183
|
+
render :partial=>'catalog/document_list'
|
184
|
+
end
|
185
|
+
|
186
|
+
# Save function area for search results 'index' view, normally
|
187
|
+
# renders next to title. Includes just 'Folder' by default.
|
188
|
+
def render_index_doc_actions(document, options={})
|
189
|
+
content_tag("div", :class=>"documentFunctions") do
|
190
|
+
raw("#{render(:partial => 'bookmark_control', :locals => {:document=> document}.merge(options))}
|
191
|
+
#{render(:partial => 'folder_control', :locals => {:document=> document}.merge(options))}")
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
# Save function area for item detail 'show' view, normally
|
196
|
+
# renders next to title. By default includes 'Folder' and 'Bookmarks'
|
197
|
+
def render_show_doc_actions(document=@document, options={})
|
198
|
+
content_tag("div", :class=>"documentFunctions") do
|
199
|
+
raw("#{render(:partial => 'bookmark_control', :locals => {:document=> document}.merge(options))}
|
200
|
+
#{render(:partial => 'folder_control', :locals => {:document=> document}.merge(options))}")
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
# used in the catalog/_index_partials/_default view
|
205
|
+
def index_field_names
|
206
|
+
Blacklight.config[:index_fields][:field_names]
|
207
|
+
end
|
208
|
+
|
209
|
+
# used in the _index_partials/_default view
|
210
|
+
def index_field_labels
|
211
|
+
Blacklight.config[:index_fields][:labels]
|
212
|
+
end
|
213
|
+
|
214
|
+
def spell_check_max
|
215
|
+
Blacklight.config[:spell_max] || 0
|
216
|
+
end
|
217
|
+
|
218
|
+
def render_index_field_label args
|
219
|
+
field = args[:field]
|
220
|
+
html_escape index_field_labels[field]
|
221
|
+
end
|
222
|
+
|
223
|
+
def render_index_field_value args
|
224
|
+
value = args[:value]
|
225
|
+
value ||= args[:document].get(args[:field], :sep => nil) if args[:document] and args[:field]
|
226
|
+
render_field_value value
|
227
|
+
end
|
228
|
+
|
229
|
+
# Used in the show view for displaying the main solr document heading
|
230
|
+
def document_heading
|
231
|
+
@document[Blacklight.config[:show][:heading]] || @document.id
|
232
|
+
end
|
233
|
+
def render_document_heading
|
234
|
+
content_tag(:h1, document_heading)
|
235
|
+
end
|
236
|
+
|
237
|
+
# Used in the show view for setting the main html document title
|
238
|
+
def document_show_html_title
|
239
|
+
@document[Blacklight.config[:show][:html_title]]
|
240
|
+
end
|
241
|
+
|
242
|
+
# Used in citation view for displaying the title
|
243
|
+
def citation_title(document)
|
244
|
+
document[Blacklight.config[:show][:html_title]]
|
245
|
+
end
|
246
|
+
|
247
|
+
# Used in the document_list partial (search view) for building a select element
|
248
|
+
def sort_fields
|
249
|
+
Blacklight.config[:sort_fields]
|
250
|
+
end
|
251
|
+
|
252
|
+
# Used in the document list partial (search view) for creating a link to the document show action
|
253
|
+
def document_show_link_field
|
254
|
+
Blacklight.config[:index][:show_link].to_sym
|
255
|
+
end
|
256
|
+
|
257
|
+
# Used in the search form partial for building a select tag
|
258
|
+
def search_fields
|
259
|
+
Blacklight.search_field_options_for_select
|
260
|
+
end
|
261
|
+
|
262
|
+
# used in the catalog/_show/_default partial
|
263
|
+
def document_show_fields
|
264
|
+
Blacklight.config[:show_fields][:field_names]
|
265
|
+
end
|
266
|
+
|
267
|
+
# used in the catalog/_show/_default partial
|
268
|
+
def document_show_field_labels
|
269
|
+
Blacklight.config[:show_fields][:labels]
|
270
|
+
end
|
271
|
+
|
272
|
+
def render_document_show_field_label args
|
273
|
+
field = args[:field]
|
274
|
+
html_escape document_show_field_labels[field]
|
275
|
+
end
|
276
|
+
|
277
|
+
def render_document_show_field_value args
|
278
|
+
value = args[:value]
|
279
|
+
value ||= args[:document].get(args[:field], :sep => nil) if args[:document] and args[:field]
|
280
|
+
render_field_value value
|
281
|
+
end
|
282
|
+
|
283
|
+
def render_field_value value=nil
|
284
|
+
value = [value] unless value.is_a? Array
|
285
|
+
return value.map { |v| html_escape v }.join(field_value_separator).html_safe
|
286
|
+
end
|
287
|
+
|
288
|
+
def field_value_separator
|
289
|
+
', '
|
290
|
+
end
|
291
|
+
|
292
|
+
# Return a normalized partial name that can be used to contruct view partial path
|
293
|
+
def document_partial_name(document)
|
294
|
+
# .to_s is necessary otherwise the default return value is not always a string
|
295
|
+
# using "_" as sep. to more closely follow the views file naming conventions
|
296
|
+
# parameterize uses "-" as the default sep. which throws errors
|
297
|
+
display_type = document[Blacklight.config[:show][:display_type]]
|
298
|
+
if display_type
|
299
|
+
if display_type.respond_to?(:join)
|
300
|
+
"#{display_type.join(" ").gsub("-"," ")}".parameterize("_").to_s
|
301
|
+
else
|
302
|
+
"#{display_type.gsub("-"," ")}".parameterize("_").to_s
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
# given a doc and action_name, this method attempts to render a partial template
|
308
|
+
# based on the value of doc[:format]
|
309
|
+
# if this value is blank (nil/empty) the "default" is used
|
310
|
+
# if the partial is not found, the "default" partial is rendered instead
|
311
|
+
def render_document_partial(doc, action_name)
|
312
|
+
format = document_partial_name(doc)
|
313
|
+
begin
|
314
|
+
render :partial=>"catalog/_#{action_name}_partials/#{format}", :locals=>{:document=>doc}
|
315
|
+
rescue ActionView::MissingTemplate
|
316
|
+
render :partial=>"catalog/_#{action_name}_partials/default", :locals=>{:document=>doc}
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
# Search History and Saved Searches display
|
321
|
+
def link_to_previous_search(params)
|
322
|
+
link_to(raw(render_search_to_s(params)), catalog_index_path(params)).html_safe
|
323
|
+
end
|
324
|
+
|
325
|
+
#
|
326
|
+
# facet param helpers ->
|
327
|
+
#
|
328
|
+
|
329
|
+
# Standard display of a facet value in a list. Used in both _facets sidebar
|
330
|
+
# partial and catalog/facet expanded list. Will output facet value name as
|
331
|
+
# a link to add that to your restrictions, with count in parens.
|
332
|
+
# first arg item is a facet value item from rsolr-ext.
|
333
|
+
# options consist of:
|
334
|
+
# :suppress_link => true # do not make it a link, used for an already selected value for instance
|
335
|
+
def render_facet_value(facet_solr_field, item, options ={})
|
336
|
+
(link_to_unless(options[:suppress_link], item.value, add_facet_params_and_redirect(facet_solr_field, item.value), :class=>"facet_select label") + " " + render_facet_count(item.hits)).html_safe
|
337
|
+
end
|
338
|
+
|
339
|
+
# Standard display of a SELECTED facet value, no link, special span
|
340
|
+
# with class, and 'remove' button.
|
341
|
+
def render_selected_facet_value(facet_solr_field, item)
|
342
|
+
content_tag(:span, render_facet_value(facet_solr_field, item, :suppress_link => true), :class => "selected label") +
|
343
|
+
link_to("[remove]", remove_facet_params(facet_solr_field, item.value, params), :class=>"remove")
|
344
|
+
end
|
345
|
+
|
346
|
+
# Renders a count value for facet limits. Can be over-ridden locally
|
347
|
+
# to change style, for instance not use parens. And can be called
|
348
|
+
# by plugins to get consistent display.
|
349
|
+
def render_facet_count(num)
|
350
|
+
content_tag("span", "(" + format_num(num) + ")", :class => "count")
|
351
|
+
end
|
352
|
+
|
353
|
+
# adds the value and/or field to params[:f]
|
354
|
+
# Does NOT remove request keys and otherwise ensure that the hash
|
355
|
+
# is suitable for a redirect. See
|
356
|
+
# add_facet_params_and_redirect
|
357
|
+
def add_facet_params(field, value)
|
358
|
+
p = params.dup
|
359
|
+
p[:f] = params[:f].nil? ? {} : params[:f].dup # the command above is not deep in rails3, !@#$!@#$
|
360
|
+
p[:f][field] ||= []
|
361
|
+
p[:f][field].push(value)
|
362
|
+
p
|
363
|
+
end
|
364
|
+
|
365
|
+
# Used in catalog/facet action, facets.rb view, for a click
|
366
|
+
# on a facet value. Add on the facet params to existing
|
367
|
+
# search constraints. Remove any paginator-specific request
|
368
|
+
# params, or other request params that should be removed
|
369
|
+
# for a 'fresh' display.
|
370
|
+
# Change the action to 'index' to send them back to
|
371
|
+
# catalog/index with their new facet choice.
|
372
|
+
def add_facet_params_and_redirect(field, value)
|
373
|
+
new_params = add_facet_params(field, value)
|
374
|
+
|
375
|
+
# Delete page, if needed.
|
376
|
+
new_params.delete(:page)
|
377
|
+
|
378
|
+
# Delete any request params from facet-specific action, needed
|
379
|
+
# to redir to index action properly.
|
380
|
+
Blacklight::Solr::FacetPaginator.request_keys.values.each do |paginator_key|
|
381
|
+
new_params.delete(paginator_key)
|
382
|
+
end
|
383
|
+
new_params.delete(:id)
|
384
|
+
|
385
|
+
# Force action to be index.
|
386
|
+
new_params[:action] = "index"
|
387
|
+
new_params
|
388
|
+
end
|
389
|
+
# copies the current params (or whatever is passed in as the 3rd arg)
|
390
|
+
# removes the field value from params[:f]
|
391
|
+
# removes the field if there are no more values in params[:f][field]
|
392
|
+
# removes additional params (page, id, etc..)
|
393
|
+
def remove_facet_params(field, value, source_params=params)
|
394
|
+
p = source_params.dup
|
395
|
+
# need to dup the facet values too,
|
396
|
+
# if the values aren't dup'd, then the values
|
397
|
+
# from the session will get remove in the show view...
|
398
|
+
p[:f] = p[:f].dup
|
399
|
+
p.delete :page
|
400
|
+
p.delete :id
|
401
|
+
p.delete :counter
|
402
|
+
p.delete :commit
|
403
|
+
#return p unless p[field]
|
404
|
+
p[:f][field] = p[:f][field] - [value]
|
405
|
+
p[:f].delete(field) if p[:f][field].size == 0
|
406
|
+
p
|
407
|
+
end
|
408
|
+
|
409
|
+
# true or false, depending on whether the field and value is in params[:f]
|
410
|
+
def facet_in_params?(field, value)
|
411
|
+
params[:f] and params[:f][field] and params[:f][field].include?(value)
|
412
|
+
end
|
413
|
+
|
414
|
+
#
|
415
|
+
# shortcut for built-in Rails helper, "number_with_delimiter"
|
416
|
+
#
|
417
|
+
def format_num(num); number_with_delimiter(num) end
|
418
|
+
|
419
|
+
#
|
420
|
+
# link based helpers ->
|
421
|
+
#
|
422
|
+
|
423
|
+
# create link to query (e.g. spelling suggestion)
|
424
|
+
def link_to_query(query)
|
425
|
+
p = params.dup
|
426
|
+
p.delete :page
|
427
|
+
p.delete :action
|
428
|
+
p[:q]=query
|
429
|
+
link_url = catalog_index_path(p)
|
430
|
+
link_to(query, link_url)
|
431
|
+
end
|
432
|
+
|
433
|
+
def render_document_index_label doc, opts
|
434
|
+
label = nil
|
435
|
+
label ||= doc.get(opts[:label]) if opts[:label].instance_of? Symbol
|
436
|
+
label ||= opts[:label].call(doc, opts) if opts[:label].instance_of? Proc
|
437
|
+
label ||= opts[:label] if opts[:label].is_a? String
|
438
|
+
label ||= doc.id
|
439
|
+
end
|
440
|
+
|
441
|
+
# link_to_document(doc, :label=>'VIEW', :counter => 3)
|
442
|
+
# Use the catalog_path RESTful route to create a link to the show page for a specific item.
|
443
|
+
# catalog_path accepts a HashWithIndifferentAccess object. The solr query params are stored in the session,
|
444
|
+
# so we only need the +counter+ param here. We also need to know if we are viewing to document as part of search results.
|
445
|
+
def link_to_document(doc, opts={:label=>Blacklight.config[:index][:show_link].to_sym, :counter => nil, :results_view => true})
|
446
|
+
label = render_document_index_label doc, opts
|
447
|
+
link_to_with_data(label, catalog_path(doc[:id]), {:method => :put, :class => label.parameterize, :data => opts}).html_safe
|
448
|
+
end
|
449
|
+
|
450
|
+
# link_back_to_catalog(:label=>'Back to Search')
|
451
|
+
# Create a link back to the index screen, keeping the user's facet, query and paging choices intact by using session.
|
452
|
+
def link_back_to_catalog(opts={:label=>'Back to Search'})
|
453
|
+
query_params = session[:search] ? session[:search].dup : {}
|
454
|
+
query_params.delete :counter
|
455
|
+
query_params.delete :total
|
456
|
+
link_url = catalog_index_path + "?" + query_params.to_query
|
457
|
+
link_to opts[:label], link_url
|
458
|
+
end
|
459
|
+
|
460
|
+
# Create form input type=hidden fields representing the entire search context,
|
461
|
+
# for inclusion in a form meant to change some aspect of it, like
|
462
|
+
# re-sort or change records per page. Can pass in params hash
|
463
|
+
# as :params => hash, otherwise defaults to #params. Can pass
|
464
|
+
# in certain top-level params keys to _omit_, defaults to :page
|
465
|
+
def search_as_hidden_fields(options={})
|
466
|
+
|
467
|
+
options = {:params => params, :omit_keys => [:page]}.merge(options)
|
468
|
+
my_params = options[:params].dup
|
469
|
+
options[:omit_keys].each {|omit_key| my_params.delete(omit_key)}
|
470
|
+
# removing action and controller from duplicate params so that we don't get hidden fields for them.
|
471
|
+
my_params.delete(:action)
|
472
|
+
my_params.delete(:controller)
|
473
|
+
# hash_as_hidden_fields in hash_as_hidden_fields.rb
|
474
|
+
return hash_as_hidden_fields(my_params)
|
475
|
+
end
|
476
|
+
|
477
|
+
|
478
|
+
|
479
|
+
def link_to_previous_document(previous_document)
|
480
|
+
return if previous_document == nil
|
481
|
+
link_to_document previous_document, :label=>'« Previous', :counter => session[:search][:counter].to_i - 1
|
482
|
+
end
|
483
|
+
|
484
|
+
def link_to_next_document(next_document)
|
485
|
+
return if next_document == nil
|
486
|
+
link_to_document next_document, :label=>'Next »', :counter => session[:search][:counter].to_i + 1
|
487
|
+
end
|
488
|
+
|
489
|
+
# Use case, you want to render an html partial from an XML (say, atom)
|
490
|
+
# template. Rails API kind of lets us down, we need to hack Rails internals
|
491
|
+
# a bit. code taken from:
|
492
|
+
# http://stackoverflow.com/questions/339130/how-do-i-render-a-partial-of-a-different-format-in-rails
|
493
|
+
def with_format(format, &block)
|
494
|
+
old_format = @template_format
|
495
|
+
@template_format = format
|
496
|
+
result = block.call
|
497
|
+
@template_format = old_format
|
498
|
+
return result
|
499
|
+
end
|
500
|
+
|
501
|
+
|
502
|
+
# This is an updated +link_to+ that allows you to pass a +data+ hash along with the +html_options+
|
503
|
+
# which are then written to the generated form for non-GET requests. The key is the form element name
|
504
|
+
# and the value is the value:
|
505
|
+
#
|
506
|
+
# link_to_with_data('Name', some_path(some_id), :method => :post, :html)
|
507
|
+
def link_to_with_data(*args, &block)
|
508
|
+
if block_given?
|
509
|
+
options = args.first || {}
|
510
|
+
html_options = args.second
|
511
|
+
concat(link_to(capture(&block), options, html_options))
|
512
|
+
else
|
513
|
+
name = args.first
|
514
|
+
options = args.second || {}
|
515
|
+
html_options = args.third
|
516
|
+
|
517
|
+
url = url_for(options)
|
518
|
+
|
519
|
+
if html_options
|
520
|
+
html_options = html_options.stringify_keys
|
521
|
+
href = html_options['href']
|
522
|
+
convert_options_to_javascript_with_data!(html_options, url)
|
523
|
+
tag_options = tag_options(html_options)
|
524
|
+
else
|
525
|
+
tag_options = nil
|
526
|
+
end
|
527
|
+
|
528
|
+
href_attr = "href=\"#{url}\"" unless href
|
529
|
+
"<a #{href_attr}#{tag_options}>#{h(name) || h(url)}</a>".html_safe
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
# This is derived from +convert_options_to_javascript+ from module +UrlHelper+ in +url_helper.rb+
|
534
|
+
def convert_options_to_javascript_with_data!(html_options, url = '')
|
535
|
+
confirm, popup = html_options.delete("confirm"), html_options.delete("popup")
|
536
|
+
|
537
|
+
method, href = html_options.delete("method"), html_options['href']
|
538
|
+
data = html_options.delete("data")
|
539
|
+
data = data.stringify_keys if data
|
540
|
+
|
541
|
+
html_options["onclick"] = case
|
542
|
+
when method
|
543
|
+
"#{method_javascript_function_with_data(method, url, href, data)}return false;"
|
544
|
+
else
|
545
|
+
html_options["onclick"]
|
546
|
+
end
|
547
|
+
end
|
548
|
+
|
549
|
+
# This is derived from +method_javascript_function+ from module +UrlHelper+ in +url_helper.rb+
|
550
|
+
def method_javascript_function_with_data(method, url = '', href = nil, data=nil)
|
551
|
+
action = (href && url.size > 0) ? "'#{url}'" : 'this.href'
|
552
|
+
submit_function =
|
553
|
+
"var f = document.createElement('form'); f.style.display = 'none'; " +
|
554
|
+
"this.parentNode.appendChild(f); f.method = 'POST'; f.action = #{action};"+
|
555
|
+
"if(event.metaKey || event.ctrlKey){f.target = '_blank';};" # if the command or control key is being held down while the link is clicked set the form's target to _blank
|
556
|
+
if data
|
557
|
+
data.each_pair do |key, value|
|
558
|
+
submit_function << "var d = document.createElement('input'); d.setAttribute('type', 'hidden'); "
|
559
|
+
submit_function << "d.setAttribute('name', '#{key}'); d.setAttribute('value', '#{escape_javascript(value.to_s)}'); f.appendChild(d);"
|
560
|
+
end
|
561
|
+
end
|
562
|
+
unless method == :post
|
563
|
+
submit_function << "var m = document.createElement('input'); m.setAttribute('type', 'hidden'); "
|
564
|
+
submit_function << "m.setAttribute('name', '_method'); m.setAttribute('value', '#{method}'); f.appendChild(m);"
|
565
|
+
end
|
566
|
+
|
567
|
+
if protect_against_forgery?
|
568
|
+
submit_function << "var s = document.createElement('input'); s.setAttribute('type', 'hidden'); "
|
569
|
+
submit_function << "s.setAttribute('name', '#{request_forgery_protection_token}'); s.setAttribute('value', '#{escape_javascript form_authenticity_token}'); f.appendChild(s);"
|
570
|
+
end
|
571
|
+
submit_function << "f.submit();"
|
572
|
+
end
|
573
|
+
|
574
|
+
# determines if the given document id is in the folder
|
575
|
+
def item_in_folder?(doc_id)
|
576
|
+
session[:folder_document_ids] && session[:folder_document_ids].include?(doc_id) ? true : false
|
577
|
+
end
|
578
|
+
|
579
|
+
# puts together a collection of documents into one refworks export string
|
580
|
+
def render_refworks_texts(documents)
|
581
|
+
val = ''
|
582
|
+
documents.each do |doc|
|
583
|
+
if doc.respond_to?(:to_marc)
|
584
|
+
val += doc.export_as_refworks_marc_txt + "\n"
|
585
|
+
end
|
586
|
+
end
|
587
|
+
val
|
588
|
+
end
|
589
|
+
|
590
|
+
# puts together a collection of documents into one endnote export string
|
591
|
+
def render_endnote_texts(documents)
|
592
|
+
val = ''
|
593
|
+
documents.each do |doc|
|
594
|
+
if doc.respond_to?(:to_marc)
|
595
|
+
val += doc.export_as_endnote + "\n"
|
596
|
+
end
|
597
|
+
end
|
598
|
+
val
|
599
|
+
end
|
600
|
+
|
601
|
+
|
602
|
+
def render_document_unapi_microformat(document, options={})
|
603
|
+
render(:partial=>'catalog/unapi_microformat', :locals => {:document=> document}.merge(options))
|
604
|
+
end
|
605
|
+
|
606
|
+
end
|