commonwealth-vlr-engine 0.0.4 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_120x120.png +0 -0
  4. data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_152x152.png +0 -0
  5. data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_60x60.png +0 -0
  6. data/app/assets/images/commonwealth-vlr-engine/vlr_mobile-icons_76x76.png +0 -0
  7. data/app/assets/javascripts/blacklight_google_analytics/blacklight_google_analytics.js.erb +11 -0
  8. data/app/assets/javascripts/commonwealth-vlr-engine.js +3 -0
  9. data/app/assets/javascripts/commonwealth-vlr-engine/download_utils.js +4 -0
  10. data/app/assets/stylesheets/commonwealth-vlr-engine/commonwealth-vlr-engine.css +1 -0
  11. data/app/assets/stylesheets/commonwealth-vlr-engine/downloads.scss +18 -0
  12. data/app/assets/stylesheets/commonwealth-vlr-engine/facets.scss +64 -0
  13. data/app/assets/stylesheets/commonwealth-vlr-engine/vlr_dependencies.css +3 -1
  14. data/app/controllers/bookmarks_controller.rb +7 -2
  15. data/app/controllers/collections_controller.rb +1 -109
  16. data/app/controllers/concerns/commonwealth_vlr_engine/collections_controller_behavior.rb +132 -0
  17. data/app/controllers/concerns/commonwealth_vlr_engine/downloads_controller_behavior.rb +184 -0
  18. data/app/controllers/concerns/commonwealth_vlr_engine/institutions_controller_behavior.rb +70 -0
  19. data/app/controllers/downloads_controller.rb +4 -0
  20. data/app/controllers/iiif_manifest_controller.rb +2 -7
  21. data/app/controllers/image_viewer_controller.rb +3 -13
  22. data/app/controllers/institutions_controller.rb +1 -65
  23. data/app/controllers/ocr_search_controller.rb +1 -1
  24. data/app/controllers/saved_searches_controller.rb +2 -0
  25. data/app/controllers/search_history_controller.rb +2 -0
  26. data/app/helpers/commonwealth_vlr_engine/application_helper.rb +20 -2
  27. data/app/helpers/commonwealth_vlr_engine/catalog_helper.rb +36 -53
  28. data/app/helpers/commonwealth_vlr_engine/downloads_helper_behavior.rb +192 -0
  29. data/app/helpers/commonwealth_vlr_engine/facets_helper.rb +3 -1
  30. data/app/helpers/commonwealth_vlr_engine/ocr_search_helper_behavior.rb +5 -0
  31. data/app/helpers/commonwealth_vlr_engine/search_history_constraints_helper.rb +25 -0
  32. data/app/helpers/downloads_helper.rb +3 -0
  33. data/app/views/catalog/_add_this.html.erb +3 -1
  34. data/app/views/catalog/_folder_item_control.html.erb +2 -1
  35. data/app/views/catalog/_index_mapview.html.erb +9 -0
  36. data/app/views/catalog/_more_like_this.html.erb +1 -1
  37. data/app/views/catalog/_show_cite_tools.html.erb +3 -0
  38. data/app/views/catalog/_show_default.html.erb +13 -12
  39. data/app/views/catalog/_show_partials/_show_book_viewer_link.html.erb +1 -1
  40. data/app/views/catalog/_show_partials/_show_default_metadata.html.erb +3 -3
  41. data/app/views/catalog/_show_partials/_show_downloads.html.erb +1 -1
  42. data/app/views/catalog/_show_partials/_show_volumes.html.erb +1 -1
  43. data/app/views/catalog/_show_sharing_tools.html.erb +3 -0
  44. data/app/views/collections/show.html.erb +1 -0
  45. data/app/views/downloads/_terms_of_use.html.erb +29 -0
  46. data/app/views/downloads/show.html.erb +29 -0
  47. data/app/views/image_viewer/_render_book_viewer.html.erb +1 -1
  48. data/app/views/institutions/show.html.erb +2 -10
  49. data/app/views/layouts/commonwealth-vlr-engine.html.erb +1 -4
  50. data/app/views/ocr_search/_index_ocr_list.html.erb +3 -3
  51. data/app/views/shared/_mobile_icon_tags.html.erb +4 -0
  52. data/app/views/shared/_search_form_header.html.erb +1 -1
  53. data/app/views/shared/_tools.html.erb +5 -5
  54. data/commonwealth-vlr-engine.gemspec +8 -6
  55. data/config/initializers/patch_blacklight_advanced_search.rb +6 -6
  56. data/config/initializers/patch_blacklight_range_limit.rb +18 -0
  57. data/config/jetty.yml +1 -1
  58. data/config/locales/commonwealth-vlr-engine.en.yml +12 -0
  59. data/config/routes.rb +6 -0
  60. data/lib/commonwealth-vlr-engine.rb +1 -0
  61. data/lib/commonwealth-vlr-engine/controller.rb +18 -3
  62. data/lib/commonwealth-vlr-engine/controller_override.rb +79 -21
  63. data/lib/commonwealth-vlr-engine/engine.rb +1 -0
  64. data/lib/commonwealth-vlr-engine/render_constraints_override.rb +15 -14
  65. data/lib/commonwealth-vlr-engine/search_builder/collections_search_builder.rb +1 -1
  66. data/lib/commonwealth-vlr-engine/search_builder/commonwealth_search_builder_behavior.rb +13 -1
  67. data/lib/commonwealth-vlr-engine/search_builder/flagged_search_builder.rb +1 -1
  68. data/lib/commonwealth-vlr-engine/search_builder/institutions_search_builder.rb +1 -1
  69. data/lib/commonwealth-vlr-engine/search_builder/mlt_search_builder.rb +2 -1
  70. data/lib/commonwealth-vlr-engine/streaming.rb +50 -0
  71. data/lib/commonwealth-vlr-engine/version.rb +1 -1
  72. data/lib/generators/commonwealth_vlr_engine/routes_generator.rb +8 -0
  73. data/lib/generators/commonwealth_vlr_engine/templates/commonwealth_search_builder.rb +4 -3
  74. data/lib/generators/commonwealth_vlr_engine/templates/config/vlr.yml +3 -0
  75. data/solr_conf/conf/solrconfig.xml +42 -5
  76. data/spec/controllers/collections_controller_spec.rb +20 -0
  77. data/spec/controllers/downloads_controller_spec.rb +65 -0
  78. data/spec/controllers/image_viewer_controller_spec.rb +0 -18
  79. data/spec/controllers/institutions_controller_spec.rb +7 -0
  80. data/spec/features/advanced_search_date_range_spec.rb +36 -0
  81. data/spec/features/collections/index_spec.rb +6 -0
  82. data/spec/features/collections/show_spec.rb +38 -0
  83. data/spec/features/more_like_this_search_spec.rb +18 -1
  84. data/spec/fixtures/sample_solr_documents.yml +107 -19
  85. data/spec/helpers/application_helper_spec.rb +9 -2
  86. data/spec/helpers/catalog_helper_spec.rb +26 -42
  87. data/spec/helpers/downloads_helper_spec.rb +173 -0
  88. data/spec/helpers/ocr_search_helper_spec.rb +15 -7
  89. data/spec/helpers/range_limit_helper_spec.rb +20 -0
  90. data/spec/helpers/search_history_constraints_helper_spec.rb +39 -0
  91. data/spec/lib/commonwealth-vlr-engine/controller_override_spec.rb +37 -0
  92. data/spec/lib/commonwealth-vlr-engine/render_constraints_override_spec.rb +0 -10
  93. data/spec/lib/commonwealth-vlr-engine/search_builder/commonwealth_search_builder_behavior_spec.rb +21 -3
  94. data/spec/lib/commonwealth-vlr-engine/search_builder/mlt_search_builder_spec.rb +1 -1
  95. metadata +99 -12
  96. data/app/helpers/commonwealth_vlr_engine/component_helper.rb +0 -22
  97. data/app/views/catalog/_show_tools.html.erb +0 -42
  98. data/spec/helpers/component_helper_spec.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12adb972f11e1c352a4b2bcfe5e70f7312807711
4
- data.tar.gz: cfc7b95d77885b301c07bd70dd887e94b895b807
3
+ metadata.gz: 080fbde6b3ffc26b744a723c8e6d47b3a5a5c1e3
4
+ data.tar.gz: 0003b8e33adcffa223a1a58e49aa5cef0b7e017e
5
5
  SHA512:
6
- metadata.gz: 23c4ce866b7522f680305fa90c571361a086988251ba7078896661ed90cab7c7f6a250f4f20e923bd7d55f30bec8aad5a61892372ba6be678d7f536f78cdeee4
7
- data.tar.gz: 3de19dc71372e41177939e9dfe5d13d69dc73130a9d331115fec1884a205656d0eb319cdeafb282e9d5016dd990020e45f7cd2af54eee74a1cfd8f1329fb539d
6
+ metadata.gz: 7efc248209d8fa6bf744c1266d3db57d73c3aab18d18c64a531c349cd7e371e14c2f5a3debdd97b082af109a521e3898b192b3303f44a50c8ff3f2312138baea
7
+ data.tar.gz: c79fa6e0c8d619ab9c33a7ac81a01062a549e887f11269e487b26f1b3f29251fedc197429f14fef4edc4ae210eb8b45dab77c87e959c89581bb8fe2a9df5a4ba
data/README.md CHANGED
@@ -42,5 +42,6 @@ The table below indicates which versions of Commonwealth-VLR-Engine are compatib
42
42
 
43
43
  VLR-Engine version | works with Blacklight version
44
44
  ----------------------- | ---------------------
45
- 0.0.2 | >= 6.1.0
45
+ 0.0.7 | >= 6.3.0 to < 7.*
46
+ 0.0.2 | >= 6.1.0 to < 6.3
46
47
  0.0.1 | >= 5.14.0 to < 6.*
@@ -162,4 +162,15 @@ $(function() {
162
162
  }
163
163
  })
164
164
 
165
+ // start download button clicks
166
+ $("#downloads_start_links").find("a").off("click").click(function(){
167
+ try{
168
+ var action = 'trigger_download';
169
+ var label = $(this).attr('class').split(' ').pop();
170
+ ga('send', 'event', category, action, label);
171
+ } catch(err) {
172
+ BlacklightGoogleAnalytics.console_log_error(err, [category, action, label]);
173
+ }
174
+ })
175
+
165
176
  });
@@ -17,6 +17,9 @@
17
17
  // bootstrap-accessibility-plugin
18
18
  //= require bootstrap-accessibility-plugin/bootstrap-accessibility
19
19
 
20
+ // blacklight_range_limit
21
+ //= require 'blacklight_range_limit'
22
+
20
23
  // WARNING: require tree disabled to avoid heavy JS files such as modernizr, openseadragon, etc.
21
24
  // from being automatically included on pages that don't need them
22
25
  // WARNING: to require any further app-specific JS, you must use the 'require_directory' directive
@@ -0,0 +1,4 @@
1
+ /* close the modal when the download button is clicked */
2
+ $('.trigger_download').on('click', function () {
3
+ $('#ajax-modal').modal('hide');
4
+ });
@@ -16,6 +16,7 @@
16
16
  @import 'book_viewer';
17
17
  @import 'carousel';
18
18
  @import 'collections';
19
+ @import 'downloads';
19
20
  @import 'facets';
20
21
  @import 'feedback';
21
22
  @import 'folders';
@@ -0,0 +1,18 @@
1
+ /* styles for download popup modal */
2
+
3
+ #downloads_modal {
4
+
5
+ ul.downloads_terms {
6
+ padding-bottom: 10px;
7
+
8
+ li {
9
+ padding-top: 10px;
10
+ }
11
+
12
+ }
13
+
14
+ }
15
+
16
+ #downloads_start_links {
17
+ text-align: left;
18
+ }
@@ -75,6 +75,70 @@ body.blacklight-catalog-formats_facet {
75
75
  font-size: 12px;
76
76
  }
77
77
 
78
+ /* blacklight_range_limit */
79
+ .range_limit {
80
+ margin-bottom: 10px;
81
+
82
+ form.range_limit {
83
+ line-height: 2;
84
+ }
85
+
86
+ input.range_begin, input.range_end {
87
+ height: 25px;
88
+ padding: 6px;
89
+ width: 46px;
90
+ }
91
+
92
+ input.submit {
93
+ height: 25px;
94
+ padding: 2px 6px 6px;
95
+ margin-left: 3px;
96
+ }
97
+
98
+ .slider {
99
+ margin-left: 5px;
100
+
101
+ &.slider-horizontal {
102
+
103
+ & .slider-track {
104
+ height: 7px;
105
+ background-color: $light_gray;
106
+ background-image: linear-gradient(to bottom, #d9d9d9, $lighter_gray);
107
+ border-bottom: 1px solid #d9d9d9;
108
+ }
109
+
110
+ & .slider-handle {
111
+ margin-left: -5px;
112
+ background-color: $dark_gray;
113
+ background-image: linear-gradient(to bottom, $dark_gray, $dark_gray)
114
+ }
115
+
116
+ }
117
+
118
+ }
119
+
120
+ .slider_js .slider-selection {
121
+ background-color: $light_gray;
122
+ box-shadow: none;
123
+ }
124
+
125
+ .slider-handle {
126
+ height: 15px;
127
+ width: 10px;
128
+ opacity: 1;
129
+
130
+ &.round {
131
+ border-radius: 5px;
132
+ }
133
+
134
+ }
135
+
136
+ .distribution {
137
+ margin-left: -8px;
138
+ }
139
+
140
+ }
141
+
78
142
  }
79
143
 
80
144
  /* responsive styles */
@@ -5,4 +5,6 @@
5
5
  @import 'bootstrap-accessibility-plugin/bootstrap-accessibility';
6
6
  @import 'blacklight_advanced_search';
7
7
  @import 'font-awesome';
8
- @import 'openseadragon';
8
+ @import 'openseadragon';
9
+ @import 'blacklight_range_limit/blacklight_range_limit';
10
+ @import 'slider'; /* blacklight_range_limit */
@@ -19,7 +19,7 @@ class BookmarksController < CatalogController
19
19
 
20
20
  if request.xhr?
21
21
  # success ? render(json: { bookmarks: { count: current_or_guest_user.bookmarks.count }}) : render(:text => "", :status => "500")
22
- success ? render(:update) : render(:text => "", :status => "500")
22
+ success ? render(:update) : render(plain: '', status: '500')
23
23
  else
24
24
  if @bookmarks.any? && success
25
25
  flash[:notice] = I18n.t('blacklight.bookmarks.add.success', :count => @bookmarks.length)
@@ -27,7 +27,12 @@ class BookmarksController < CatalogController
27
27
  flash[:error] = I18n.t('blacklight.bookmarks.add.failure', :count => @bookmarks.length)
28
28
  end
29
29
 
30
- redirect_to :back
30
+ if respond_to? :redirect_back
31
+ redirect_back fallback_location: bookmarks_path
32
+ else
33
+ # Deprecated in Rails 5.0
34
+ redirect_to :back
35
+ end
31
36
  end
32
37
  end
33
38
 
@@ -1,112 +1,4 @@
1
1
  class CollectionsController < CatalogController
2
-
3
- ##
4
- # Give CollectionsController access to the CatalogController configuration
5
- include Blacklight::Configurable
6
- include Blacklight::SearchHelper
7
-
8
- copy_blacklight_config_from(CatalogController)
9
-
10
- # remove collection facet and collapse others
11
- before_filter :relation_base_blacklight_config, :only => [:index, :show]
12
- before_filter :add_series_facet, :only => :show
13
- before_filter :collections_limit, :only => [:index, :facet]
14
- before_filter :collapse_institution_facet, :only => :index
15
-
16
- # Blacklight uses #search_action_url to figure out the right URL for
17
- # the global search box
18
- def search_action_url options = {}
19
- search_catalog_url(options.except(:controller, :action))
20
- end
21
- helper_method :search_action_url
22
-
23
- def index
24
- @nav_li_active = 'explore'
25
- (@response, @document_list) = search_results(params)
26
- params[:view] = 'list'
27
- params[:sort] = 'title_info_primary_ssort asc'
28
-
29
- respond_to do |format|
30
- format.html
31
- end
32
- end
33
-
34
- def show
35
- @nav_li_active = 'explore'
36
- @show_response, @document = fetch(params[:id])
37
- @collection_title = @document[blacklight_config.index.title_field.to_sym]
38
-
39
- # add params[:f] for proper facet links
40
- params[:f] = set_collection_facet_params(@collection_title, @document)
41
-
42
- # get the response for the facets representing items in collection
43
- (@response, @document_list) = search_results({:f => params[:f]})
44
-
45
- # get an image for the collection
46
- if @document[:exemplary_image_ssi]
47
- @collection_image_pid = @document[:exemplary_image_ssi]
48
- @collection_image_info = get_collection_image_info(@collection_image_pid,
49
- @document[:id])
50
- end
51
-
52
- respond_to do |format|
53
- format.html
54
- end
55
-
56
- end
57
-
58
- private
59
-
60
- # show series facet
61
- def add_series_facet
62
- blacklight_config.facet_fields['related_item_series_ssim'].include_in_request = true
63
- end
64
-
65
- # collapse the institution facet, if Institutions supported
66
- def collapse_institution_facet
67
- return unless t('blacklight.home.browse.institutions.enabled')
68
- blacklight_config.facet_fields['physical_location_ssim'].collapse = true
69
- end
70
-
71
- # filter out non-collection items
72
- def collections_limit
73
- blacklight_config.search_builder_class = CommonwealthCollectionsSearchBuilder
74
- end
75
-
76
- # find the title and pid for the object representing the collection image
77
- def get_collection_image_info(image_pid, collection_pid)
78
- col_img_info = {title: '', pid: collection_pid, access_master: false}
79
- col_img_file_doc = fetch(image_pid)[1]
80
- if col_img_file_doc
81
- col_img_info[:access_master] = true if col_img_file_doc[:is_image_of_ssim]
82
- col_img_field = col_img_file_doc[:is_image_of_ssim].presence || col_img_file_doc[:is_file_of_ssim].presence
83
- if col_img_field
84
- col_img_obj_pid = col_img_field.first.gsub(/info:fedora\//,'')
85
- col_img_obj_doc = fetch(col_img_obj_pid)[1]
86
- if col_img_obj_doc
87
- col_img_info[:title] = col_img_obj_doc[blacklight_config.index.title_field.to_sym]
88
- col_img_info[:pid] = col_img_obj_pid
89
- end
90
- end
91
- end
92
- col_img_info
93
- end
94
-
95
- # find a representative image/item for a series
96
- def get_series_image_obj(series_title,collection_title)
97
- blacklight_config.search_builder_class = CommonwealthFlaggedSearchBuilder # ignore flagged items
98
- series_doc_list = search_results({f: {'related_item_series_ssim' => series_title,
99
- blacklight_config.collection_field => collection_title},
100
- rows: 1})[1]
101
- series_doc_list.first
102
- end
103
- helper_method :get_series_image_obj
104
-
105
- # set the correct facet params for facets from the collection
106
- def set_collection_facet_params(collection_title, document)
107
- facet_params = {blacklight_config.collection_field => [collection_title]}
108
- facet_params[blacklight_config.institution_field] = document[blacklight_config.institution_field.to_sym] if t('blacklight.home.browse.institutions.enabled')
109
- facet_params
110
- end
2
+ include CommonwealthVlrEngine::CollectionsControllerBehavior
111
3
 
112
4
  end
@@ -0,0 +1,132 @@
1
+ module CommonwealthVlrEngine
2
+ module CollectionsControllerBehavior
3
+ extend ActiveSupport::Concern
4
+ ##
5
+ # Give CollectionsController 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
+ # remove collection facet and collapse others
13
+ before_filter :relation_base_blacklight_config, :only => [:index, :show]
14
+ before_filter :add_series_facet, :only => :show
15
+ before_filter :collections_limit, :only => :index
16
+ before_filter :collections_limit_for_facets, :only => :facet
17
+ before_filter :collapse_institution_facet, :only => :index
18
+
19
+ helper_method :search_action_url
20
+ helper_method :get_series_image_obj
21
+ end
22
+
23
+ def index
24
+ @nav_li_active = 'explore'
25
+ (@response, @document_list) = search_results(params)
26
+ params[:view] = 'list'
27
+ params[:sort] = 'title_info_primary_ssort asc'
28
+
29
+ respond_to do |format|
30
+ format.html
31
+ end
32
+ end
33
+
34
+ def show
35
+ @nav_li_active = 'explore'
36
+ @show_response, @document = fetch(params[:id])
37
+ @collection_title = @document[blacklight_config.index.title_field.to_sym]
38
+
39
+ # add params[:f] for proper facet links
40
+ params[:f] = set_collection_facet_params(@collection_title, @document)
41
+
42
+ # get the response for the facets representing items in collection
43
+ (@response, @document_list) = search_results({:f => params[:f]})
44
+
45
+ # get an image for the collection
46
+ if @document[:exemplary_image_ssi]
47
+ @collection_image_pid = @document[:exemplary_image_ssi]
48
+ @collection_image_info = get_collection_image_info(@collection_image_pid,
49
+ @document[:id])
50
+ end
51
+
52
+ respond_to do |format|
53
+ format.html
54
+ end
55
+
56
+ end
57
+
58
+ def range_limit
59
+ redirect_to range_limit_catalog_path(params.except('controller', 'action')) and return
60
+ end
61
+
62
+ protected
63
+
64
+ # Blacklight uses #search_action_url to figure out the right URL for the global search box
65
+ def search_action_url options = {}
66
+ search_catalog_url(options.except(:controller, :action))
67
+ end
68
+
69
+ # find a representative image/item for a series
70
+ def get_series_image_obj(series_title,collection_title)
71
+ blacklight_config.search_builder_class = CommonwealthFlaggedSearchBuilder # ignore flagged items
72
+ series_doc_list = search_results({f: {'related_item_series_ssim' => series_title,
73
+ blacklight_config.collection_field => collection_title},
74
+ rows: 1})[1]
75
+ series_doc_list.first
76
+ end
77
+
78
+ # show series facet
79
+ def add_series_facet
80
+ blacklight_config.facet_fields['related_item_series_ssim'].include_in_request = true
81
+ end
82
+
83
+ # collapse the institution facet, if Institutions supported
84
+ def collapse_institution_facet
85
+ return unless t('blacklight.home.browse.institutions.enabled')
86
+ blacklight_config.facet_fields['physical_location_ssim'].collapse = true
87
+ end
88
+
89
+ # find only collection objects
90
+ def collections_limit
91
+ blacklight_config.search_builder_class = CommonwealthCollectionsSearchBuilder
92
+ end
93
+
94
+ # find object data for facet results
95
+ # collections#facet can be called within BOTH collections#index and collections#show contexts
96
+ # when collections#index, want to limit to collection objects
97
+ # when collections#show, should be objects that are child of collection
98
+ # so we use the check below, since request.query_parameters['f'] is only added in collections#show
99
+ # via set_collection_facet_params
100
+ def collections_limit_for_facets
101
+ unless request.query_parameters['f'] && request.query_parameters['f'][blacklight_config.collection_field]
102
+ self.collections_limit
103
+ end
104
+ end
105
+
106
+ # find the title and pid for the object representing the collection image
107
+ def get_collection_image_info(image_pid, collection_pid)
108
+ col_img_info = {title: '', pid: collection_pid, access_master: false}
109
+ col_img_file_doc = fetch(image_pid)[1]
110
+ if col_img_file_doc
111
+ col_img_info[:access_master] = true if col_img_file_doc[:is_image_of_ssim]
112
+ col_img_field = col_img_file_doc[:is_image_of_ssim].presence || col_img_file_doc[:is_file_of_ssim].presence
113
+ if col_img_field
114
+ col_img_obj_pid = col_img_field.first.gsub(/info:fedora\//,'')
115
+ col_img_obj_doc = fetch(col_img_obj_pid)[1]
116
+ if col_img_obj_doc
117
+ col_img_info[:title] = col_img_obj_doc[blacklight_config.index.title_field.to_sym]
118
+ col_img_info[:pid] = col_img_obj_pid
119
+ end
120
+ end
121
+ end
122
+ col_img_info
123
+ end
124
+
125
+ # set the correct facet params for facets from the collection
126
+ def set_collection_facet_params(collection_title, document)
127
+ facet_params = {blacklight_config.collection_field => [collection_title]}
128
+ facet_params[blacklight_config.institution_field] = document[blacklight_config.institution_field.to_sym] if t('blacklight.home.browse.institutions.enabled')
129
+ facet_params
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,184 @@
1
+ # heavily based on Hydra::Controller::DownloadBehavior
2
+ module CommonwealthVlrEngine
3
+ module DownloadsControllerBehavior
4
+ extend ActiveSupport::Concern
5
+
6
+ include Blacklight::Catalog
7
+ include CommonwealthVlrEngine::Streaming
8
+ include CommonwealthVlrEngine::ApplicationHelper
9
+ include CommonwealthVlrEngine::Finder
10
+ # for some reason have to require AND include Zipline, or you get errors
11
+ require 'zipline'
12
+ include Zipline
13
+ require 'open-uri'
14
+
15
+ included do
16
+ copy_blacklight_config_from(CatalogController)
17
+ helper_method :search_action_url
18
+ end
19
+
20
+ # render a page/modal with license terms, download links, etc
21
+ def show
22
+ @doc_response, @document = fetch(params[:id])
23
+ if @document[:has_model_ssim].include? 'info:fedora/afmodel:Bplmodels_File'
24
+ parent_response, @parent_document = fetch(parent_id(@document))
25
+ @object_profile = JSON.parse(@document['object_profile_ssm'].first)
26
+ else
27
+ @parent_document = @document
28
+ @object_profile = nil
29
+ end
30
+
31
+ respond_to do |format|
32
+ format.html # for users w/o JS
33
+ format.js { render :layout => false } # download modal window
34
+ end
35
+ end
36
+
37
+ # initiates the file download
38
+ def trigger_download
39
+ response, @solr_document = fetch(params[:id])
40
+ if !@solr_document.to_h.empty? && params[:datastream_id]
41
+ if @solr_document[:has_model_ssim].include? 'info:fedora/afmodel:Bplmodels_File'
42
+ @object_id = parent_id(@solr_document)
43
+ send_content
44
+ elsif @solr_document[:has_model_ssim].include? 'info:fedora/afmodel:Bplmodels_ObjectBase'
45
+ @file_list = get_image_files(params[:id])
46
+ if !@file_list.empty?
47
+ @object_id = params[:id]
48
+ send_zipped_content
49
+ else
50
+ not_found
51
+ end
52
+ else
53
+ not_found
54
+ end
55
+ end
56
+ end
57
+
58
+ protected
59
+
60
+ # Blacklight uses #search_action_url to figure out the right URL for
61
+ # the global search box
62
+ def search_action_url options = {}
63
+ search_catalog_url(options.except(:controller, :action))
64
+ end
65
+
66
+ # Handle the HTTP show request
67
+ def send_content
68
+ response.headers['Accept-Ranges'] = 'bytes'
69
+ if request.head?
70
+ content_head
71
+ elsif request.headers['HTTP_RANGE']
72
+ send_range
73
+ else
74
+ send_file_contents
75
+ end
76
+ end
77
+
78
+ # send multiple files as a zip archive
79
+ def send_zipped_content
80
+ files_array = []
81
+ @file_list.each_with_index do |file,index|
82
+ params[:id] = file[:id] # hack this so file_url returns correct value
83
+ @solr_document = file
84
+ files_array << [file_url, "#{(index+1).to_s}_#{file_name_with_extension}"]
85
+ end
86
+ file_mappings = files_array.lazy.map { |url, path| [open(url), path] }
87
+ zipline(file_mappings, "#{file_name}.zip")
88
+ end
89
+
90
+ # render an HTTP HEAD response
91
+ def content_head
92
+ response.headers['Content-Length'] = file_size if file_size
93
+ head :ok, content_type: mime_type
94
+ end
95
+
96
+ # Create some headers for the datastream
97
+ def content_options
98
+ { disposition: 'attachment', type: mime_type, filename: file_name_with_extension }
99
+ end
100
+
101
+ # returns a Fedora datastream url or IIIF url
102
+ def file_url
103
+ if params[:datastream_id] == 'accessFull'
104
+ iiif_image_url(params[:id], {})
105
+ else
106
+ datastream_disseminator_url(params[:id], params[:datastream_id])
107
+ end
108
+ end
109
+
110
+ def file_extension
111
+ if params[:datastream_id] =~ /Master/
112
+ JSON.parse(@solr_document[:object_profile_ssm].first)["objLabel"].split('.')[1]
113
+ else
114
+ 'jpg'
115
+ end
116
+ end
117
+
118
+ # @return [String] the filename
119
+ def file_name
120
+ "#{@object_id}_#{params[:datastream_id]}"
121
+ end
122
+
123
+ # @return [String] the filename with extension
124
+ def file_name_with_extension
125
+ "#{file_name}.#{file_extension}"
126
+ end
127
+
128
+ def file_size
129
+ return false if params[:datastream_id] == 'accessFull'
130
+ JSON.parse(@solr_document[:object_profile_ssm].first)["datastreams"][params[:datastream_id]]["dsSize"]
131
+ end
132
+
133
+ def mime_type
134
+ if params[:datastream_id] =~ /Master/
135
+ @solr_document[:mime_type_tesim].first
136
+ else
137
+ 'image/jpeg'
138
+ end
139
+ end
140
+
141
+ def prepare_file_headers
142
+ send_file_headers! content_options
143
+ response.headers['Content-Type'] = mime_type
144
+ response.headers['Content-Length'] ||= file_size.to_s if file_size
145
+ # Prevent Rack::ETag from calculating a digest over body
146
+ response.headers['Last-Modified'] = Time.new(@solr_document[:system_modified_dtsi]).utc.strftime("%a, %d %b %Y %T GMT")
147
+ self.content_type = mime_type
148
+ end
149
+
150
+ def send_file_contents
151
+ self.status = 200
152
+ prepare_file_headers
153
+ stream_body file_stream(file_url)
154
+ end
155
+
156
+ # render an HTTP Range response
157
+ def send_range
158
+ _, range = request.headers['HTTP_RANGE'].split('bytes=')
159
+ from, to = range.split('-').map(&:to_i)
160
+ to = file_size.to_i - 1 unless to
161
+ length = to - from + 1
162
+ response.headers['Content-Range'] = "bytes #{from}-#{to}/#{file_size}"
163
+ response.headers['Content-Length'] = "#{length}"
164
+ self.status = 206
165
+ prepare_file_headers
166
+ stream_body file_stream(file_url, request.headers['HTTP_RANGE'])
167
+ end
168
+
169
+ private
170
+
171
+ def parent_id(document)
172
+ document[:is_file_of_ssim].first.gsub(/info:fedora\//,'')
173
+ end
174
+
175
+ def stream_body(iostream)
176
+ iostream.each do |in_buff|
177
+ response.stream.write in_buff
178
+ end
179
+ ensure
180
+ response.stream.close
181
+ end
182
+
183
+ end
184
+ end