commonwealth-vlr-engine 0.0.4 → 0.0.7
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.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_120x120.png +0 -0
- data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_152x152.png +0 -0
- data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_60x60.png +0 -0
- data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_76x76.png +0 -0
- data/app/assets/javascripts/blacklight_google_analytics/blacklight_google_analytics.js.erb +11 -0
- data/app/assets/javascripts/commonwealth-vlr-engine.js +3 -0
- data/app/assets/javascripts/commonwealth-vlr-engine/download_utils.js +4 -0
- data/app/assets/stylesheets/commonwealth-vlr-engine/commonwealth-vlr-engine.css +1 -0
- data/app/assets/stylesheets/commonwealth-vlr-engine/downloads.scss +18 -0
- data/app/assets/stylesheets/commonwealth-vlr-engine/facets.scss +64 -0
- data/app/assets/stylesheets/commonwealth-vlr-engine/vlr_dependencies.css +3 -1
- data/app/controllers/bookmarks_controller.rb +7 -2
- data/app/controllers/collections_controller.rb +1 -109
- data/app/controllers/concerns/commonwealth_vlr_engine/collections_controller_behavior.rb +132 -0
- data/app/controllers/concerns/commonwealth_vlr_engine/downloads_controller_behavior.rb +184 -0
- data/app/controllers/concerns/commonwealth_vlr_engine/institutions_controller_behavior.rb +70 -0
- data/app/controllers/downloads_controller.rb +4 -0
- data/app/controllers/iiif_manifest_controller.rb +2 -7
- data/app/controllers/image_viewer_controller.rb +3 -13
- data/app/controllers/institutions_controller.rb +1 -65
- data/app/controllers/ocr_search_controller.rb +1 -1
- data/app/controllers/saved_searches_controller.rb +2 -0
- data/app/controllers/search_history_controller.rb +2 -0
- data/app/helpers/commonwealth_vlr_engine/application_helper.rb +20 -2
- data/app/helpers/commonwealth_vlr_engine/catalog_helper.rb +36 -53
- data/app/helpers/commonwealth_vlr_engine/downloads_helper_behavior.rb +192 -0
- data/app/helpers/commonwealth_vlr_engine/facets_helper.rb +3 -1
- data/app/helpers/commonwealth_vlr_engine/ocr_search_helper_behavior.rb +5 -0
- data/app/helpers/commonwealth_vlr_engine/search_history_constraints_helper.rb +25 -0
- data/app/helpers/downloads_helper.rb +3 -0
- data/app/views/catalog/_add_this.html.erb +3 -1
- data/app/views/catalog/_folder_item_control.html.erb +2 -1
- data/app/views/catalog/_index_mapview.html.erb +9 -0
- data/app/views/catalog/_more_like_this.html.erb +1 -1
- data/app/views/catalog/_show_cite_tools.html.erb +3 -0
- data/app/views/catalog/_show_default.html.erb +13 -12
- data/app/views/catalog/_show_partials/_show_book_viewer_link.html.erb +1 -1
- data/app/views/catalog/_show_partials/_show_default_metadata.html.erb +3 -3
- data/app/views/catalog/_show_partials/_show_downloads.html.erb +1 -1
- data/app/views/catalog/_show_partials/_show_volumes.html.erb +1 -1
- data/app/views/catalog/_show_sharing_tools.html.erb +3 -0
- data/app/views/collections/show.html.erb +1 -0
- data/app/views/downloads/_terms_of_use.html.erb +29 -0
- data/app/views/downloads/show.html.erb +29 -0
- data/app/views/image_viewer/_render_book_viewer.html.erb +1 -1
- data/app/views/institutions/show.html.erb +2 -10
- data/app/views/layouts/commonwealth-vlr-engine.html.erb +1 -4
- data/app/views/ocr_search/_index_ocr_list.html.erb +3 -3
- data/app/views/shared/_mobile_icon_tags.html.erb +4 -0
- data/app/views/shared/_search_form_header.html.erb +1 -1
- data/app/views/shared/_tools.html.erb +5 -5
- data/commonwealth-vlr-engine.gemspec +8 -6
- data/config/initializers/patch_blacklight_advanced_search.rb +6 -6
- data/config/initializers/patch_blacklight_range_limit.rb +18 -0
- data/config/jetty.yml +1 -1
- data/config/locales/commonwealth-vlr-engine.en.yml +12 -0
- data/config/routes.rb +6 -0
- data/lib/commonwealth-vlr-engine.rb +1 -0
- data/lib/commonwealth-vlr-engine/controller.rb +18 -3
- data/lib/commonwealth-vlr-engine/controller_override.rb +79 -21
- data/lib/commonwealth-vlr-engine/engine.rb +1 -0
- data/lib/commonwealth-vlr-engine/render_constraints_override.rb +15 -14
- data/lib/commonwealth-vlr-engine/search_builder/collections_search_builder.rb +1 -1
- data/lib/commonwealth-vlr-engine/search_builder/commonwealth_search_builder_behavior.rb +13 -1
- data/lib/commonwealth-vlr-engine/search_builder/flagged_search_builder.rb +1 -1
- data/lib/commonwealth-vlr-engine/search_builder/institutions_search_builder.rb +1 -1
- data/lib/commonwealth-vlr-engine/search_builder/mlt_search_builder.rb +2 -1
- data/lib/commonwealth-vlr-engine/streaming.rb +50 -0
- data/lib/commonwealth-vlr-engine/version.rb +1 -1
- data/lib/generators/commonwealth_vlr_engine/routes_generator.rb +8 -0
- data/lib/generators/commonwealth_vlr_engine/templates/commonwealth_search_builder.rb +4 -3
- data/lib/generators/commonwealth_vlr_engine/templates/config/vlr.yml +3 -0
- data/solr_conf/conf/solrconfig.xml +42 -5
- data/spec/controllers/collections_controller_spec.rb +20 -0
- data/spec/controllers/downloads_controller_spec.rb +65 -0
- data/spec/controllers/image_viewer_controller_spec.rb +0 -18
- data/spec/controllers/institutions_controller_spec.rb +7 -0
- data/spec/features/advanced_search_date_range_spec.rb +36 -0
- data/spec/features/collections/index_spec.rb +6 -0
- data/spec/features/collections/show_spec.rb +38 -0
- data/spec/features/more_like_this_search_spec.rb +18 -1
- data/spec/fixtures/sample_solr_documents.yml +107 -19
- data/spec/helpers/application_helper_spec.rb +9 -2
- data/spec/helpers/catalog_helper_spec.rb +26 -42
- data/spec/helpers/downloads_helper_spec.rb +173 -0
- data/spec/helpers/ocr_search_helper_spec.rb +15 -7
- data/spec/helpers/range_limit_helper_spec.rb +20 -0
- data/spec/helpers/search_history_constraints_helper_spec.rb +39 -0
- data/spec/lib/commonwealth-vlr-engine/controller_override_spec.rb +37 -0
- data/spec/lib/commonwealth-vlr-engine/render_constraints_override_spec.rb +0 -10
- data/spec/lib/commonwealth-vlr-engine/search_builder/commonwealth_search_builder_behavior_spec.rb +21 -3
- data/spec/lib/commonwealth-vlr-engine/search_builder/mlt_search_builder_spec.rb +1 -1
- metadata +99 -12
- data/app/helpers/commonwealth_vlr_engine/component_helper.rb +0 -22
- data/app/views/catalog/_show_tools.html.erb +0 -42
- data/spec/helpers/component_helper_spec.rb +0 -34
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module CommonwealthVlrEngine
|
|
2
|
+
module InstitutionsControllerBehavior
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
##
|
|
5
|
+
# Give Bookmarks access to the CatalogController configuration
|
|
6
|
+
include Blacklight::Configurable
|
|
7
|
+
include Blacklight::SearchHelper
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
copy_blacklight_config_from(CatalogController)
|
|
11
|
+
|
|
12
|
+
before_filter :institutions_index_config, :only => [:index]
|
|
13
|
+
# remove collection facet and collapse others
|
|
14
|
+
before_filter :relation_base_blacklight_config, :only => [:show]
|
|
15
|
+
|
|
16
|
+
helper_method :search_action_url
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def index
|
|
20
|
+
@nav_li_active = 'explore'
|
|
21
|
+
params[:per_page] = params[:per_page].presence || '50'
|
|
22
|
+
(@response, @document_list) = search_results(params)
|
|
23
|
+
params[:view] ||= 'list' # still need this or grid view is invoked
|
|
24
|
+
params[:sort] = 'title_info_primary_ssort asc'
|
|
25
|
+
|
|
26
|
+
respond_to do |format|
|
|
27
|
+
format.html
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def show
|
|
32
|
+
@nav_li_active = 'explore'
|
|
33
|
+
@show_response, @document = fetch(params[:id])
|
|
34
|
+
@institution_title = @document[blacklight_config.index.title_field.to_sym]
|
|
35
|
+
|
|
36
|
+
# get the response for collection objects
|
|
37
|
+
@collex_response, @collex_documents = search_results({:f => {'active_fedora_model_suffix_ssi' => 'Collection','institution_pid_ssi' => params[:id]},:rows => 100, :sort => 'title_info_primary_ssort asc'})
|
|
38
|
+
|
|
39
|
+
# add params[:f] for proper facet links
|
|
40
|
+
params[:f] = {blacklight_config.institution_field => [@institution_title]}
|
|
41
|
+
|
|
42
|
+
# get the response for the facets representing items in collection
|
|
43
|
+
(@response, @document_list) = search_results({:f => params[:f]})
|
|
44
|
+
|
|
45
|
+
respond_to do |format|
|
|
46
|
+
format.html
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def range_limit
|
|
52
|
+
redirect_to range_limit_catalog_path(params.except('controller', 'action')) and return
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
protected
|
|
56
|
+
|
|
57
|
+
# Blacklight uses #search_action_url to figure out the right URL for the global search box
|
|
58
|
+
def search_action_url options = {}
|
|
59
|
+
search_catalog_url(options.except(:controller, :action))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# remove grid view from blacklight_config, use correct SearchBuilder for index view
|
|
63
|
+
def institutions_index_config
|
|
64
|
+
blacklight_config.search_builder_class = CommonwealthInstitutionsSearchBuilder
|
|
65
|
+
blacklight_config.view.delete(:gallery)
|
|
66
|
+
blacklight_config.view.delete(:masonry)
|
|
67
|
+
blacklight_config.view.delete(:slideshow)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -21,7 +21,7 @@ class IiifManifestController < CatalogController
|
|
|
21
21
|
canvas_response, canvas_document = fetch(params[:canvas_object_id])
|
|
22
22
|
if canvas_document[:is_file_of_ssim]
|
|
23
23
|
response, document = fetch(params[:id])
|
|
24
|
-
image_files =
|
|
24
|
+
image_files = image_file_pids(get_image_files(params[:id]))
|
|
25
25
|
if image_files
|
|
26
26
|
image_index = Hash[image_files.map.with_index.to_a][params[:canvas_object_id]]
|
|
27
27
|
iiif_canvas = canvas_from_id(params[:canvas_object_id],
|
|
@@ -38,7 +38,7 @@ class IiifManifestController < CatalogController
|
|
|
38
38
|
|
|
39
39
|
def annotation
|
|
40
40
|
response, document = fetch(params[:id])
|
|
41
|
-
if
|
|
41
|
+
if image_file_pids(get_image_files(params[:id])).include?(params[:annotation_object_id])
|
|
42
42
|
annotation = image_annotation_from_image_id(params[:annotation_object_id], document)
|
|
43
43
|
render :json => annotation.to_json
|
|
44
44
|
else
|
|
@@ -66,9 +66,4 @@ class IiifManifestController < CatalogController
|
|
|
66
66
|
headers['Access-Control-Allow-Origin'] = "*"
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
-
def not_found
|
|
70
|
-
raise ActionController::RoutingError.new('Not Found')
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
|
|
74
69
|
end
|
|
@@ -5,9 +5,9 @@ class ImageViewerController < CatalogController
|
|
|
5
5
|
|
|
6
6
|
def show
|
|
7
7
|
@response, @document = fetch(params[:id])
|
|
8
|
-
#@img_to_show = params[:view]
|
|
9
8
|
@title = @document[blacklight_config.index.title_field.to_sym]
|
|
10
|
-
@
|
|
9
|
+
# @object_files is already set by before_filter in CommonwealthVlrEngine::ControllerOverride
|
|
10
|
+
@page_sequence = create_img_sequence(image_file_pids(@object_files[:images]), params[:view])
|
|
11
11
|
respond_to do |format|
|
|
12
12
|
format.js
|
|
13
13
|
format.html { redirect_to solr_document_path(@document.id,
|
|
@@ -17,18 +17,8 @@ class ImageViewerController < CatalogController
|
|
|
17
17
|
|
|
18
18
|
def book_viewer
|
|
19
19
|
@response, @document = fetch(params[:id])
|
|
20
|
-
@image_files =
|
|
20
|
+
@image_files = image_file_pids(get_image_files(params[:id]))
|
|
21
21
|
render(:layout => 'book_viewer')
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def get_page_sequence(document_id, current_img_id)
|
|
27
|
-
image_files = []
|
|
28
|
-
get_image_files(document_id).each do |img_file|
|
|
29
|
-
image_files << img_file['id']
|
|
30
|
-
end
|
|
31
|
-
create_img_sequence(image_files, current_img_id)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
24
|
end
|
|
@@ -1,68 +1,4 @@
|
|
|
1
1
|
class InstitutionsController < CatalogController
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
# Give Bookmarks access to the CatalogController configuration
|
|
5
|
-
include Blacklight::Configurable
|
|
6
|
-
include Blacklight::SearchHelper
|
|
7
|
-
|
|
8
|
-
copy_blacklight_config_from(CatalogController)
|
|
9
|
-
|
|
10
|
-
before_filter :institutions_index_config, :only => [:index]
|
|
11
|
-
# remove collection facet and collapse others
|
|
12
|
-
before_filter :relation_base_blacklight_config, :only => [:show]
|
|
13
|
-
|
|
14
|
-
# Blacklight uses #search_action_url to figure out the right URL for
|
|
15
|
-
# the global search box
|
|
16
|
-
def search_action_url options = {}
|
|
17
|
-
search_catalog_url(options.except(:controller, :action))
|
|
18
|
-
end
|
|
19
|
-
helper_method :search_action_url
|
|
20
|
-
|
|
21
|
-
def index
|
|
22
|
-
@nav_li_active = 'explore'
|
|
23
|
-
params[:per_page] = params[:per_page].presence || '50'
|
|
24
|
-
(@response, @document_list) = search_results(params)
|
|
25
|
-
params[:view] ||= 'list' # still need this or grid view is invoked
|
|
26
|
-
params[:sort] = 'title_info_primary_ssort asc'
|
|
27
|
-
|
|
28
|
-
respond_to do |format|
|
|
29
|
-
format.html
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def show
|
|
34
|
-
@nav_li_active = 'explore'
|
|
35
|
-
@show_response, @document = fetch(params[:id])
|
|
36
|
-
@institution_title = @document[blacklight_config.index.title_field.to_sym]
|
|
37
|
-
|
|
38
|
-
# get the response for collection objects
|
|
39
|
-
@collex_response, @collex_documents = search_results({:f => {'active_fedora_model_suffix_ssi' => 'Collection','institution_pid_ssi' => params[:id]},:rows => 100, :sort => 'title_info_primary_ssort asc'})
|
|
40
|
-
|
|
41
|
-
# add params[:f] for proper facet links
|
|
42
|
-
params[:f] = {blacklight_config.institution_field => [@institution_title]}
|
|
43
|
-
|
|
44
|
-
# get the response for the facets representing items in collection
|
|
45
|
-
(@response, @document_list) = search_results({:f => params[:f]})
|
|
46
|
-
|
|
47
|
-
# get an image for the institution
|
|
48
|
-
if @document[:exemplary_image_ssi]
|
|
49
|
-
@institution_image_pid = @document[:exemplary_image_ssi]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
respond_to do |format|
|
|
53
|
-
format.html
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
private
|
|
59
|
-
|
|
60
|
-
# remove grid view from blacklight_config, use correct SearchBuilder for index view
|
|
61
|
-
def institutions_index_config
|
|
62
|
-
blacklight_config.search_builder_class = CommonwealthInstitutionsSearchBuilder
|
|
63
|
-
blacklight_config.view.delete(:gallery)
|
|
64
|
-
blacklight_config.view.delete(:masonry)
|
|
65
|
-
blacklight_config.view.delete(:slideshow)
|
|
66
|
-
end
|
|
2
|
+
include CommonwealthVlrEngine::InstitutionsControllerBehavior
|
|
67
3
|
|
|
68
4
|
end
|
|
@@ -13,7 +13,7 @@ class OcrSearchController < CatalogController
|
|
|
13
13
|
def index
|
|
14
14
|
@doc_response, @document = fetch(params[:id])
|
|
15
15
|
if params[:ocr_q]
|
|
16
|
-
@image_pid_list =
|
|
16
|
+
@image_pid_list = image_file_pids(get_image_files(params[:id]))
|
|
17
17
|
ocr_search_params = {q: params[:ocr_q],
|
|
18
18
|
f: {'is_file_of_ssim' => "info:fedora/#{params[:id]}"}}
|
|
19
19
|
ocr_search_params[:page] = params[:page] if params[:page]
|
|
@@ -4,5 +4,7 @@ class SavedSearchesController < ApplicationController
|
|
|
4
4
|
|
|
5
5
|
helper BlacklightAdvancedSearch::RenderConstraintsOverride
|
|
6
6
|
helper BlacklightMaps::RenderConstraintsOverride
|
|
7
|
+
helper BlacklightRangeLimit::ViewHelperOverride
|
|
8
|
+
helper RangeLimitHelper
|
|
7
9
|
helper CommonwealthVlrEngine::RenderConstraintsOverride
|
|
8
10
|
end
|
|
@@ -4,5 +4,7 @@ class SearchHistoryController < ApplicationController
|
|
|
4
4
|
|
|
5
5
|
helper BlacklightAdvancedSearch::RenderConstraintsOverride
|
|
6
6
|
helper BlacklightMaps::RenderConstraintsOverride
|
|
7
|
+
helper BlacklightRangeLimit::ViewHelperOverride
|
|
8
|
+
helper RangeLimitHelper
|
|
7
9
|
helper CommonwealthVlrEngine::RenderConstraintsOverride
|
|
8
10
|
end
|
|
@@ -29,8 +29,8 @@ module CommonwealthVlrEngine
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
def render_format_index(
|
|
33
|
-
|
|
32
|
+
def render_format_index(options={})
|
|
33
|
+
options[:value].map { |v| render_format(v) }.join('; ')
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
# return the path to the icon for objects with no thumbnail
|
|
@@ -48,6 +48,19 @@ module CommonwealthVlrEngine
|
|
|
48
48
|
"commonwealth-vlr-engine/dc_#{icon}-icon.png"
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
+
# render date range constraints from Advanced Search form
|
|
52
|
+
# used by CommonwealthVlrEngine::RenderConstraintsOverride
|
|
53
|
+
# and CommonwealthVlrEngine::SearchHistoryConstraintsHelper
|
|
54
|
+
def date_range_constraints_to_s(params)
|
|
55
|
+
if params[:date_start].blank?
|
|
56
|
+
"before #{params[:date_end]}"
|
|
57
|
+
elsif params[:date_end].blank?
|
|
58
|
+
"after #{params[:date_start]}"
|
|
59
|
+
else
|
|
60
|
+
"#{params[:date_start]}-#{params[:date_end]}"
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
51
64
|
#from psu scholarsphere
|
|
52
65
|
# TODO: this isn't used anywhere in the app, get rid of it?
|
|
53
66
|
def link_to_field(fieldname, fieldvalue, displayvalue = nil)
|
|
@@ -195,6 +208,11 @@ module CommonwealthVlrEngine
|
|
|
195
208
|
}.to_json
|
|
196
209
|
end
|
|
197
210
|
|
|
211
|
+
# adds apple-touch-icon tags to <head>
|
|
212
|
+
def render_mobile_icon_tags
|
|
213
|
+
render partial: 'shared/mobile_icon_tags'
|
|
214
|
+
end
|
|
215
|
+
|
|
198
216
|
end
|
|
199
217
|
end
|
|
200
218
|
|
|
@@ -32,25 +32,6 @@ module CommonwealthVlrEngine
|
|
|
32
32
|
'commonwealth-vlr-engine/dc_collection-icon.png'
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
def create_download_links(document, files_hash, link_class)
|
|
36
|
-
file_types = [files_hash[:audio], files_hash[:documents], files_hash[:ereader], files_hash[:generic]]
|
|
37
|
-
download_links = []
|
|
38
|
-
file_types.each do |file_type|
|
|
39
|
-
file_type.each do |file|
|
|
40
|
-
object_profile_json = JSON.parse(file['object_profile_ssm'].first)
|
|
41
|
-
file_name_ext = object_profile_json["objLabel"].split('.')
|
|
42
|
-
download_link_title = document['identifier_ia_id_ssi'] ? ia_download_title(file_name_ext[1]) : file_name_ext[0]
|
|
43
|
-
download_links << link_to(download_link_title,
|
|
44
|
-
datastream_disseminator_url(file['id'],'productionMaster'),
|
|
45
|
-
:target => '_blank',
|
|
46
|
-
:class => link_class) + content_tag(:span,
|
|
47
|
-
"(#{file_name_ext[1].upcase}, #{number_to_human_size(object_profile_json["datastreams"]["productionMaster"]["dsSize"])})",
|
|
48
|
-
:class => 'download_info')
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
download_links
|
|
52
|
-
end
|
|
53
|
-
|
|
54
35
|
def create_thumb_img_element(document, img_class=[])
|
|
55
36
|
image_classes = img_class.class == Array ? img_class.join(' ') : ''
|
|
56
37
|
image_tag(thumbnail_url(document),
|
|
@@ -68,38 +49,16 @@ module CommonwealthVlrEngine
|
|
|
68
49
|
end
|
|
69
50
|
end
|
|
70
51
|
|
|
71
|
-
def has_downloadable_files? files_hash
|
|
72
|
-
files_hash[:documents].present? ||
|
|
73
|
-
files_hash[:audio].present? ||
|
|
74
|
-
files_hash[:generic].present? ||
|
|
75
|
-
files_hash[:ereader].present?
|
|
76
|
-
end
|
|
77
|
-
|
|
78
52
|
def has_image_files? files_hash
|
|
79
|
-
|
|
80
|
-
unless files_hash[:images].empty?
|
|
81
|
-
image_file_pids = []
|
|
82
|
-
files_hash[:images].each do |image_file|
|
|
83
|
-
image_file_pids << image_file['id']
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
image_file_pids
|
|
53
|
+
files_hash[:images].present?
|
|
87
54
|
end
|
|
88
55
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
'Kindle'
|
|
94
|
-
when 'zip'
|
|
95
|
-
'Daisy'
|
|
96
|
-
when 'pdf'
|
|
97
|
-
'PDF'
|
|
98
|
-
when 'epub'
|
|
99
|
-
'EPUB'
|
|
100
|
-
else
|
|
101
|
-
file_extension.upcase
|
|
56
|
+
def image_file_pids images_hash
|
|
57
|
+
image_file_pids = []
|
|
58
|
+
images_hash.each do |image_file|
|
|
59
|
+
image_file_pids << image_file['id']
|
|
102
60
|
end
|
|
61
|
+
image_file_pids
|
|
103
62
|
end
|
|
104
63
|
|
|
105
64
|
# render collection name as a link in catalog#index list view
|
|
@@ -266,12 +225,11 @@ module CommonwealthVlrEngine
|
|
|
266
225
|
|
|
267
226
|
# render the 'more like this' search link if doc has subjects
|
|
268
227
|
def render_mlt_search_link(document)
|
|
269
|
-
if document[:subject_facet_ssim] || document[:subject_geo_city_ssim]
|
|
270
|
-
content_tag :div, :
|
|
228
|
+
if document[:subject_facet_ssim] || document[:subject_geo_city_ssim] || document[:related_item_host_ssim]
|
|
229
|
+
content_tag :div, id: 'more_mlt_link_wrapper' do
|
|
271
230
|
link_to t('blacklight.more_like_this.more_mlt_link'),
|
|
272
|
-
search_catalog_path(:
|
|
273
|
-
|
|
274
|
-
:id => 'more_mlt_link'
|
|
231
|
+
search_catalog_path(mlt_id: document.id),
|
|
232
|
+
id: 'more_mlt_link'
|
|
275
233
|
end
|
|
276
234
|
end
|
|
277
235
|
end
|
|
@@ -297,7 +255,7 @@ module CommonwealthVlrEngine
|
|
|
297
255
|
prefix = date_qualifier == 'approximate' ? '[ca. ' : '['
|
|
298
256
|
suffix = date_qualifier == 'questionable' ? '?]' : ']'
|
|
299
257
|
end
|
|
300
|
-
prefix << 'c' if date_type == 'copyrightDate'
|
|
258
|
+
prefix << '(c) ' if date_type == 'copyrightDate'
|
|
301
259
|
if date_end && date_end != 'nil'
|
|
302
260
|
date_start_suffix = '?' if date_qualifier == 'questionable'
|
|
303
261
|
prefix + normalize_date(date_start) + date_start_suffix + t('blacklight.metadata_display.date_range_connector') + normalize_date(date_end) + suffix
|
|
@@ -306,6 +264,31 @@ module CommonwealthVlrEngine
|
|
|
306
264
|
end
|
|
307
265
|
end
|
|
308
266
|
|
|
267
|
+
# have to override to display non-typical constraints
|
|
268
|
+
# (e.g. coordinates, mlt, range limit, advanced search)
|
|
269
|
+
# need this until:
|
|
270
|
+
# https://github.com/projectblacklight/blacklight_advanced_search/issues/53
|
|
271
|
+
# https://github.com/projectblacklight/blacklight-maps/issues/84
|
|
272
|
+
# https://github.com/projectblacklight/blacklight_range_limit/issues/49
|
|
273
|
+
# are resolved
|
|
274
|
+
def render_search_to_page_title(params)
|
|
275
|
+
# this is ugly, but easiest way to deal with it; too many gems to try and solve it all here
|
|
276
|
+
html_constraints = render_search_to_s(params).gsub(/<span class="filterValues">/,' ')
|
|
277
|
+
html_constraints = html_constraints.gsub(/<\/span>[\s]*<span class="constraint">/,' / ')
|
|
278
|
+
sanitize(html_constraints, :tags=>[])
|
|
279
|
+
|
|
280
|
+
## TODO: remove above and uncomment lines below after all issues have been resolved with
|
|
281
|
+
## blacklight_advanced_search, blacklight_range_limit, and blacklight-maps
|
|
282
|
+
# constraints = [render_search_to_page_title_mlt(params), super(params)]
|
|
283
|
+
# constraints.reject { |item| item.blank? }.join(' / ')
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
# TODO: uncomment and write spec after issues identified with render_search_to_page_title resolved
|
|
287
|
+
#def render_search_to_page_title_mlt(params)
|
|
288
|
+
# return "".html_safe if params[:mlt_id].blank?
|
|
289
|
+
# "#{t('blacklight.search.filters.label', :label => t('blacklight.more_like_this.constraint_label'))} #{h(params[:mlt_id])}"
|
|
290
|
+
#end
|
|
291
|
+
|
|
309
292
|
def render_mods_xml_record(document_id)
|
|
310
293
|
mods_xml_file_path = datastream_disseminator_url(document_id, 'descMetadata')
|
|
311
294
|
mods_response = Typhoeus::Request.get(mods_xml_file_path)
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
module CommonwealthVlrEngine
|
|
2
|
+
module DownloadsHelperBehavior
|
|
3
|
+
|
|
4
|
+
# create an array of download links
|
|
5
|
+
# images have to be handled by a separate function since there are multiple sizes
|
|
6
|
+
def create_download_links(document, files_hash)
|
|
7
|
+
download_links = []
|
|
8
|
+
non_img_file_types = [files_hash[:audio], files_hash[:documents], files_hash[:ereader], files_hash[:generic]]
|
|
9
|
+
if has_downloadable_images?(document, files_hash) && !files_hash[:images].empty?
|
|
10
|
+
download_links.concat(image_download_links(document, files_hash[:images]))
|
|
11
|
+
end
|
|
12
|
+
non_img_file_types.each do |file_type|
|
|
13
|
+
file_type.each do |file|
|
|
14
|
+
object_profile_json = JSON.parse(file['object_profile_ssm'].first)
|
|
15
|
+
download_links << file_download_link(file['id'],
|
|
16
|
+
download_link_title(document, object_profile_json),
|
|
17
|
+
object_profile_json,
|
|
18
|
+
'productionMaster',
|
|
19
|
+
download_link_options)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
download_links
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def download_link_class
|
|
26
|
+
'sidebar_downloads_link'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def download_link_options
|
|
30
|
+
{class: download_link_class, rel: 'nofollow', data: {:ajax_modal => 'trigger'}}
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def download_link_title(document, object_profile, datastream_id=nil)
|
|
34
|
+
if !object_profile || (document[:has_model_ssim].include? "info:fedora/afmodel:Bplmodels_ImageFile")
|
|
35
|
+
link_title = t("blacklight.downloads.images.#{datastream_id}")
|
|
36
|
+
else
|
|
37
|
+
file_name_ext = object_profile["objLabel"].split('.')
|
|
38
|
+
if document[:identifier_ia_id_ssi] || (document[:active_fedora_model_ssi] == "Bplmodels::EreaderFile")
|
|
39
|
+
link_title = ia_download_title(file_name_ext[1])
|
|
40
|
+
else
|
|
41
|
+
link_title = file_name_ext[0]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
link_title
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def has_downloadable_files?(document, files_hash)
|
|
48
|
+
has_downloadable_images?(document, files_hash) ||
|
|
49
|
+
files_hash[:documents].present? ||
|
|
50
|
+
files_hash[:audio].present? ||
|
|
51
|
+
files_hash[:generic].present? ||
|
|
52
|
+
files_hash[:ereader].present?
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def has_downloadable_images?(document, files_hash)
|
|
56
|
+
has_image_files?(files_hash) && license_allows_download?(document)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# render the file type names for Internet Archive book item download links
|
|
60
|
+
def ia_download_title(file_extension)
|
|
61
|
+
case file_extension
|
|
62
|
+
when 'mobi'
|
|
63
|
+
'Kindle'
|
|
64
|
+
when 'zip'
|
|
65
|
+
'Daisy'
|
|
66
|
+
else
|
|
67
|
+
file_extension.upcase
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def image_datastreams(object_profile_json)
|
|
72
|
+
image_datastreams = []
|
|
73
|
+
stored_datastreams = %w(productionMaster access800 georectifiedMaster)
|
|
74
|
+
stored_datastreams.each do |datastream_id|
|
|
75
|
+
image_datastreams << datastream_id if object_profile_json["datastreams"][datastream_id]
|
|
76
|
+
end
|
|
77
|
+
image_datastreams.insert(1, 'accessFull')
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def image_download_links(document, image_files_hash)
|
|
81
|
+
if document[:identifier_ia_id_ssi]
|
|
82
|
+
[file_download_link(document[:id],
|
|
83
|
+
t("blacklight.downloads.images.accessFull"),
|
|
84
|
+
nil,
|
|
85
|
+
'JPEG2000',
|
|
86
|
+
download_link_options)]
|
|
87
|
+
else
|
|
88
|
+
object_profile_json = JSON.parse(image_files_hash.first['object_profile_ssm'].first)
|
|
89
|
+
image_links = []
|
|
90
|
+
image_datastreams(object_profile_json).each do |datastream_id|
|
|
91
|
+
if image_files_hash.length == 1
|
|
92
|
+
object_profile = object_profile_json
|
|
93
|
+
object_id = image_files_hash.first['id']
|
|
94
|
+
else
|
|
95
|
+
object_profile = setup_zip_object_profile(image_files_hash, datastream_id)
|
|
96
|
+
object_id = document[:id]
|
|
97
|
+
end
|
|
98
|
+
image_links << file_download_link(object_id,
|
|
99
|
+
t("blacklight.downloads.images.#{datastream_id}"),
|
|
100
|
+
object_profile,
|
|
101
|
+
datastream_id,
|
|
102
|
+
download_link_options)
|
|
103
|
+
end
|
|
104
|
+
image_links
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# parse the license statement and return true if image downloads are allowed
|
|
109
|
+
def license_allows_download? document
|
|
110
|
+
document[:license_ssm].to_s =~ /(Creative Commons|No known restrictions)/
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def file_download_link(object_pid, link_title, object_profile_json, datastream_id, link_options={})
|
|
114
|
+
link_to(link_title,
|
|
115
|
+
download_path(object_pid, datastream_id: datastream_id),
|
|
116
|
+
link_options) + content_tag(:span,
|
|
117
|
+
"(#{file_type_string(datastream_id, object_profile_json)}, #{file_size_string(datastream_id, object_profile_json)})",
|
|
118
|
+
class: 'download_info')
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def file_type_string(datastream_id, object_profile_json)
|
|
122
|
+
if object_profile_json
|
|
123
|
+
if datastream_id == 'accessFull' || datastream_id == 'access800'
|
|
124
|
+
file_type_string = 'JPEG'
|
|
125
|
+
else
|
|
126
|
+
#file_type_string = object_profile_json["datastreams"][datastream_id]["dsMIME"].split('/')[1].upcase
|
|
127
|
+
file_type_string = object_profile_json["objLabel"].split('.')[1].upcase
|
|
128
|
+
end
|
|
129
|
+
file_type_string << ', multi-file ZIP' if object_profile_json["zip"]
|
|
130
|
+
else
|
|
131
|
+
file_type_string = case datastream_id
|
|
132
|
+
when 'productionMaster'
|
|
133
|
+
'TIF'
|
|
134
|
+
when 'JPEG2000'
|
|
135
|
+
datastream_id
|
|
136
|
+
else
|
|
137
|
+
'JPEG'
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
file_type_string
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def file_size_string(datastream_id, object_profile_json)
|
|
144
|
+
if object_profile_json
|
|
145
|
+
if datastream_id == 'accessFull'
|
|
146
|
+
file_size_string = '~' +
|
|
147
|
+
number_to_human_size((object_profile_json["datastreams"]["productionMaster"]["dsSize"] * 0.083969078))
|
|
148
|
+
else
|
|
149
|
+
file_size_string = number_to_human_size(object_profile_json["datastreams"][datastream_id]["dsSize"])
|
|
150
|
+
file_size_string.insert(0,'~') if object_profile_json["zip"]
|
|
151
|
+
end
|
|
152
|
+
else
|
|
153
|
+
file_size_string = 'multi-file ZIP'
|
|
154
|
+
end
|
|
155
|
+
file_size_string
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# create a composite object_profile_json object from multiple file objects
|
|
159
|
+
# used to display size of ZIP archive
|
|
160
|
+
def setup_zip_object_profile(image_files_hash, datastream_id)
|
|
161
|
+
datastream_id_to_use = datastream_id == 'accessFull' ? 'productionMaster' : datastream_id
|
|
162
|
+
object_profile = {zip: true,
|
|
163
|
+
objLabel: datastream_id == 'productionMaster' ? '.TIF' : '.JPEG',
|
|
164
|
+
datastreams: {datastream_id_to_use.to_sym => {}}}
|
|
165
|
+
zip_size = 0
|
|
166
|
+
image_files_hash.each do |image_file|
|
|
167
|
+
img_object_profile_json = JSON.parse(image_file['object_profile_ssm'].first)
|
|
168
|
+
zip_size += img_object_profile_json["datastreams"][datastream_id_to_use]["dsSize"]
|
|
169
|
+
end
|
|
170
|
+
# estimate compression, pretty rough
|
|
171
|
+
zip_size = case datastream_id
|
|
172
|
+
when 'productionMaster'
|
|
173
|
+
zip_size * 0.798
|
|
174
|
+
when 'accessFull'
|
|
175
|
+
zip_size * 0.839
|
|
176
|
+
else
|
|
177
|
+
zip_size * 0.927
|
|
178
|
+
end
|
|
179
|
+
object_profile[:datastreams][datastream_id_to_use.to_sym][:dsSize] = zip_size
|
|
180
|
+
object_profile.deep_stringify_keys
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def url_for_download(document, datastream_id)
|
|
184
|
+
if document[:identifier_ia_id_ssi] && datastream_id == 'JPEG2000'
|
|
185
|
+
"https://archive.org/download/#{document[:identifier_ia_id_ssi]}/#{document[:identifier_ia_id_ssi]}_jp2.zip"
|
|
186
|
+
else
|
|
187
|
+
trigger_downloads_path(document.id, datastream_id: datastream_id)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
end
|