atrium 0.0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. data/.gitignore +13 -0
  2. data/.gitmodules +3 -0
  3. data/.rvmrc +32 -0
  4. data/GETTING_STARTED.textile +109 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +320 -0
  7. data/Guardfile +10 -0
  8. data/README.mkd +56 -0
  9. data/Rakefile +6 -0
  10. data/app/assets/images/atrium/ajax-loader.gif +0 -0
  11. data/app/assets/images/atrium/lightbox-ico-loading.gif +0 -0
  12. data/app/assets/images/atrium/logo.png +0 -0
  13. data/app/assets/javascripts/atrium/atrium.js +281 -0
  14. data/app/assets/javascripts/chosen.jquery.js +899 -0
  15. data/app/assets/javascripts/ckeditor.warning.js +65 -0
  16. data/app/assets/javascripts/ckeditor/config.js.coffee +6 -0
  17. data/app/assets/javascripts/ckeditor/jquery.generateId.js +13 -0
  18. data/app/assets/javascripts/ckeditor/jquery.jeditable.ckeditor.js +59 -0
  19. data/app/assets/javascripts/ckeditor/plugins/linkItem/application_link.png +0 -0
  20. data/app/assets/javascripts/ckeditor/plugins/linkItem/dialogs/linkItem.js +1470 -0
  21. data/app/assets/javascripts/ckeditor/plugins/linkItem/plugin.js +16 -0
  22. data/app/assets/javascripts/ckeditor/plugins/linkItem/ui_toolbar_pencil.png +0 -0
  23. data/app/assets/javascripts/jquery.colorbox.js +864 -0
  24. data/app/assets/javascripts/jquery.jeditable.js +543 -0
  25. data/app/assets/stylesheets/atrium/atrium.css +216 -0
  26. data/app/assets/stylesheets/atrium/chosen-sprite.png +0 -0
  27. data/app/assets/stylesheets/atrium/chosen.css +367 -0
  28. data/app/assets/stylesheets/colorbox.css +42 -0
  29. data/app/assets/stylesheets/controls.png +0 -0
  30. data/app/assets/stylesheets/loading.gif +0 -0
  31. data/app/controllers/atrium/base_controller.rb +25 -0
  32. data/app/controllers/atrium/collection_exhibit_order_controller.rb +21 -0
  33. data/app/controllers/atrium/collections_controller.rb +165 -0
  34. data/app/controllers/atrium/customization_controller.rb +41 -0
  35. data/app/controllers/atrium/descriptions_controller.rb +177 -0
  36. data/app/controllers/atrium/exhibit_facet_order_controller.rb +19 -0
  37. data/app/controllers/atrium/exhibits_controller.rb +108 -0
  38. data/app/controllers/atrium/showcases_controller.rb +193 -0
  39. data/app/helpers/atrium/base_helper.rb +6 -0
  40. data/app/models/ability.rb +14 -0
  41. data/app/models/atrium/browse_level.rb +41 -0
  42. data/app/models/atrium/collection.rb +121 -0
  43. data/app/models/atrium/description.rb +128 -0
  44. data/app/models/atrium/essay.rb +21 -0
  45. data/app/models/atrium/exhibit.rb +58 -0
  46. data/app/models/atrium/search/facet.rb +29 -0
  47. data/app/models/atrium/search/facet_selection.rb +17 -0
  48. data/app/models/atrium/showcase.rb +173 -0
  49. data/app/models/atrium/showcase/facet_selection.rb +21 -0
  50. data/app/models/atrium/showcase/item.rb +19 -0
  51. data/app/models/role_mapper.rb +23 -0
  52. data/app/views/_user_util_links.html.erb +25 -0
  53. data/app/views/atrium/collections/_bookmark_control.html.erb +25 -0
  54. data/app/views/atrium/collections/_browse_index.html.erb +20 -0
  55. data/app/views/atrium/collections/_collection_items_index.html.erb +10 -0
  56. data/app/views/atrium/collections/_document.html.erb +24 -0
  57. data/app/views/atrium/collections/_document_list.html.erb +6 -0
  58. data/app/views/atrium/collections/_edit_navigation.html.erb +20 -0
  59. data/app/views/atrium/collections/_folder_control.html.erb +12 -0
  60. data/app/views/atrium/collections/_form.html.erb +93 -0
  61. data/app/views/atrium/collections/_listing.html.erb +18 -0
  62. data/app/views/atrium/collections/_navigation.html.erb +45 -0
  63. data/app/views/atrium/collections/_results_pagination.html.erb +9 -0
  64. data/app/views/atrium/collections/_sort_and_per_page.html.erb +23 -0
  65. data/app/views/atrium/collections/edit.html.erb +5 -0
  66. data/app/views/atrium/collections/new.html.erb +6 -0
  67. data/app/views/atrium/collections/show.html.erb +22 -0
  68. data/app/views/atrium/descriptions/_form.html.erb +64 -0
  69. data/app/views/atrium/descriptions/edit.html.erb +4 -0
  70. data/app/views/atrium/descriptions/index.html.erb +4 -0
  71. data/app/views/atrium/descriptions/new.html.erb +2 -0
  72. data/app/views/atrium/descriptions/show.html.erb +20 -0
  73. data/app/views/atrium/exhibits/_bookmark_control.html.erb +25 -0
  74. data/app/views/atrium/exhibits/_folder_control.html.erb +12 -0
  75. data/app/views/atrium/exhibits/_form.html.erb +108 -0
  76. data/app/views/atrium/exhibits/edit.html.erb +9 -0
  77. data/app/views/atrium/exhibits/new.html.erb +6 -0
  78. data/app/views/atrium/exhibits/show.html.erb +26 -0
  79. data/app/views/atrium/showcases/_showcase_navigation.html.erb +23 -0
  80. data/app/views/atrium/showcases/show.html.erb +1 -0
  81. data/app/views/catalog/_collection_home_text.html.erb +6 -0
  82. data/app/views/catalog/_constraints.html.erb +9 -0
  83. data/app/views/catalog/_default_collection_text.html.erb +18 -0
  84. data/app/views/catalog/_default_home_text.html.erb +6 -0
  85. data/app/views/catalog/_home_text.html.erb +6 -0
  86. data/app/views/catalog/_index_partials/_description.html.erb +8 -0
  87. data/app/views/catalog/_search_form.html.erb +66 -0
  88. data/app/views/catalog/_show_partials/_description.html.erb +15 -0
  89. data/app/views/catalog/browse_show.html.erb +18 -0
  90. data/app/views/catalog/index.html.erb +35 -0
  91. data/app/views/catalog/list_description.html.erb +24 -0
  92. data/app/views/catalog/list_item.html.erb +3 -0
  93. data/app/views/layouts/atrium.html.erb +86 -0
  94. data/app/views/layouts/atrium_themes/default.html.erb +4 -0
  95. data/app/views/layouts/item_listing.html.erb +36 -0
  96. data/app/views/listing/_document.html.erb +27 -0
  97. data/app/views/listing/_document_list.html.erb +3 -0
  98. data/app/views/listing/_item_search.html.erb +27 -0
  99. data/app/views/shared/_banner.html.erb +5 -0
  100. data/app/views/shared/_collection_complete_list.html.erb +33 -0
  101. data/app/views/shared/_collection_search_form.html.erb +12 -0
  102. data/app/views/shared/_collection_title_header.html.erb +3 -0
  103. data/app/views/shared/_featured_sources.html.erb +20 -0
  104. data/app/views/shared/_list_descriptions.html.erb +38 -0
  105. data/app/views/shared/_navigation_browse_levels.html.erb +34 -0
  106. data/app/views/shared/_showcase_configure_menu.html.erb +22 -0
  107. data/app/views/shared/_top_navigation.html.erb +9 -0
  108. data/atrium.gemspec +76 -0
  109. data/config/routes.rb +12 -0
  110. data/init.rb +3 -0
  111. data/lib/application_controller.rb +24 -0
  112. data/lib/atrium.rb +42 -0
  113. data/lib/atrium/application_helper.rb +24 -0
  114. data/lib/atrium/atrium_helper_behavior.rb +162 -0
  115. data/lib/atrium/catalog.rb +203 -0
  116. data/lib/atrium/collections_helper.rb +139 -0
  117. data/lib/atrium/controller.rb +10 -0
  118. data/lib/atrium/descriptions_helper.rb +23 -0
  119. data/lib/atrium/engine.rb +12 -0
  120. data/lib/atrium/layout_helper.rb +13 -0
  121. data/lib/atrium/routes.rb +99 -0
  122. data/lib/atrium/solr_helper.rb +440 -0
  123. data/lib/atrium/version.rb +3 -0
  124. data/lib/generators/atrium/assets_generator.rb +44 -0
  125. data/lib/generators/atrium/atrium_generator.rb +149 -0
  126. data/lib/generators/atrium/cucumber_support_generator.rb +29 -0
  127. data/lib/generators/atrium/templates/config/role_map_cucumber.yml +2 -0
  128. data/lib/generators/atrium/templates/config/role_map_development.yml +2 -0
  129. data/lib/generators/atrium/templates/config/role_map_production.yml +2 -0
  130. data/lib/generators/atrium/templates/config/role_map_test.yml +2 -0
  131. data/lib/generators/atrium/templates/config/solr.yml +10 -0
  132. data/lib/generators/atrium/templates/db/seeds.rb +87 -0
  133. data/lib/generators/atrium/templates/migrations/create_atrium_browse_levels.rb +18 -0
  134. data/lib/generators/atrium/templates/migrations/create_atrium_collections.rb +20 -0
  135. data/lib/generators/atrium/templates/migrations/create_atrium_descriptions.rb +16 -0
  136. data/lib/generators/atrium/templates/migrations/create_atrium_essays.rb +15 -0
  137. data/lib/generators/atrium/templates/migrations/create_atrium_exhibits.rb +16 -0
  138. data/lib/generators/atrium/templates/migrations/create_atrium_search_facets.rb +14 -0
  139. data/lib/generators/atrium/templates/migrations/create_atrium_showcase_facet_selections.rb +15 -0
  140. data/lib/generators/atrium/templates/migrations/create_atrium_showcase_items.rb +17 -0
  141. data/lib/generators/atrium/templates/migrations/create_atrium_showcases.rb +16 -0
  142. data/lib/generators/atrium/templates/themes/example.html.erb +21 -0
  143. data/lib/railties/all_tests.rake +23 -0
  144. data/lib/railties/atrium_cucumber.rake +121 -0
  145. data/lib/railties/index.rake +37 -0
  146. data/tasks/atrium.rake +268 -0
  147. data/tasks/atrium_rspec.rake +91 -0
  148. data/test_support/etc/Gemfile +33 -0
  149. data/test_support/etc/bundle_config +3 -0
  150. data/test_support/etc/rvmrc +32 -0
  151. data/test_support/features/atrium_collections.feature +162 -0
  152. data/test_support/features/atrium_exhibits.feature +164 -0
  153. data/test_support/features/step_definitions/atrium_collection_steps.rb +102 -0
  154. data/test_support/features/step_definitions/atrium_exhibit_steps.rb +53 -0
  155. data/test_support/features/step_definitions/bookmarks_steps.rb +6 -0
  156. data/test_support/features/step_definitions/error_steps.rb +5 -0
  157. data/test_support/features/step_definitions/folder_steps.rb +27 -0
  158. data/test_support/features/step_definitions/general_steps.rb +50 -0
  159. data/test_support/features/step_definitions/record_view_steps.rb +12 -0
  160. data/test_support/features/step_definitions/saved_searches_steps.rb +22 -0
  161. data/test_support/features/step_definitions/search_facets_steps.rb +29 -0
  162. data/test_support/features/step_definitions/search_history_steps.rb +9 -0
  163. data/test_support/features/step_definitions/search_result_steps.rb +114 -0
  164. data/test_support/features/step_definitions/search_steps.rb +103 -0
  165. data/test_support/features/step_definitions/user_steps.rb +5 -0
  166. data/test_support/features/step_definitions/web_steps.rb +213 -0
  167. data/test_support/features/support/env.rb +67 -0
  168. data/test_support/features/support/paths.rb +76 -0
  169. data/test_support/features/support/selectors.rb +40 -0
  170. data/test_support/fixtures/atrium_exhibits.yml +3 -0
  171. data/test_support/spec/controllers/atrium/base_controller_spec.rb +13 -0
  172. data/test_support/spec/controllers/atrium/collection_exhibit_order_controller_spec.rb +29 -0
  173. data/test_support/spec/controllers/atrium/collections_controller_spec.rb +185 -0
  174. data/test_support/spec/controllers/atrium/customization_controller_spec.rb +38 -0
  175. data/test_support/spec/controllers/atrium/descriptions_controller_spec.rb +150 -0
  176. data/test_support/spec/controllers/atrium/exhibit_facet_order_controller_spec.rb +36 -0
  177. data/test_support/spec/controllers/atrium/exhibits_controller_spec.rb +192 -0
  178. data/test_support/spec/controllers/atrium/showcases_controller_spec.rb +185 -0
  179. data/test_support/spec/helpers/atrium_collections_helper_spec.rb +147 -0
  180. data/test_support/spec/helpers/atrium_description_helper_spec.rb +47 -0
  181. data/test_support/spec/helpers/atrium_solr_helper_spec.rb +512 -0
  182. data/test_support/spec/models/atrium/browse_level_spec.rb +31 -0
  183. data/test_support/spec/models/atrium/collection_spec.rb +30 -0
  184. data/test_support/spec/models/atrium/description_spec.rb +67 -0
  185. data/test_support/spec/models/atrium/essay_spec.rb +12 -0
  186. data/test_support/spec/models/atrium/exhibit_spec.rb +76 -0
  187. data/test_support/spec/models/atrium/search/facet_selection_spec.rb +24 -0
  188. data/test_support/spec/models/atrium/search/facet_spec.rb +11 -0
  189. data/test_support/spec/models/atrium/search_facet_spec.rb +54 -0
  190. data/test_support/spec/models/atrium/showcase/facet_selection_spec.rb +15 -0
  191. data/test_support/spec/models/atrium/showcase/item_spec.rb +12 -0
  192. data/test_support/spec/models/atrium/showcase_facet_selection_spec.rb +65 -0
  193. data/test_support/spec/models/atrium/showcase_spec.rb +134 -0
  194. data/test_support/spec/rcov.opts +3 -0
  195. data/test_support/spec/routing/atrium/collections_routing_spec.rb +33 -0
  196. data/test_support/spec/spec.opts +4 -0
  197. data/test_support/spec/spec_helper.rb +47 -0
  198. data/test_support/spec/support/be_accessible_matcher.rb +8 -0
  199. data/test_support/spec/support/be_routed_mixin.rb +7 -0
  200. data/test_support/tmp/step_definitions/catalog_index_steps.rb +14 -0
  201. data/test_support/tmp/step_definitions/edit_document_steps.rb +67 -0
  202. data/test_support/tmp/step_definitions/hydra_metadata_steps.rb +3 -0
  203. data/test_support/tmp/step_definitions/hydra_steps.rb +8 -0
  204. data/test_support/tmp/step_definitions/search_steps.rb +86 -0
  205. data/test_support/tmp/step_definitions/searching_steps.rb +22 -0
  206. data/test_support/tmp/step_definitions/select_steps.rb +8 -0
  207. data/test_support/tmp/step_definitions/show_document_steps.rb +73 -0
  208. data/test_support/tmp/step_definitions/user_steps.rb +15 -0
  209. data/test_support/tmp/step_definitions/web_steps.rb +273 -0
  210. data/test_support/tmp/support/env.rb +54 -0
  211. data/test_support/tmp/support/paths.rb +57 -0
  212. metadata +1047 -0
@@ -0,0 +1,139 @@
1
+ module Atrium::CollectionsHelper
2
+
3
+ # Standard display of a facet value in a list. Used in both _facets sidebar
4
+ # partial and catalog/facet expanded list. Will output facet value name as
5
+ # a link to add that to your restrictions, with count in parens.
6
+ # first arg item is a facet value item from rsolr-ext.
7
+ # options consist of:
8
+ # :suppress_link => true # do not make it a link, used for an already selected value for instance
9
+ def get_browse_facet_path(facet_solr_field, value, browse_facets, exhibit_number, exhibit_id, opts={})
10
+ p = HashWithIndifferentAccess.new
11
+ p.merge!(:f=>params[:f].dup) if params[:f]
12
+ if params[:collection_id]
13
+ #p.merge!(:id=>params[:collection_id])
14
+ p.merge!(:collection_id=>params[:collection_id])
15
+ elsif params[:id] && params[:controller] == "atrium_collections"
16
+ #p.merge!(:id=>params[:id])
17
+ p.merge!(:collection_id=>params[:id])
18
+ #p.merge!(:controller=>params[:controller])
19
+ end
20
+ #if params[:edit_showcase]
21
+ # p.merge!(:edit_showcase=>true)
22
+ #end
23
+ p.merge!(:id=>exhibit_id)
24
+ p = remove_related_facet_params(facet_solr_field, p, browse_facets, exhibit_number)
25
+ p = add_browse_facet_params(facet_solr_field,value,p)
26
+ #it should only return a path for current facet selection plus parent selected values so if generating for multiple levels, than need to ignore some potentially
27
+ #params[:action] == "edit" ? edit_atrium_collection_path(p.merge!({:class=>"browse_facet_select"})) : atrium_collection_path(p.merge!({:class=>"browse_facet_select"}))
28
+ atrium_exhibit_path(p.merge!({:class=>"browse_facet_select"}))
29
+ end
30
+
31
+ def add_browse_facet_params(field, value, p=HashWithIndifferentAccess.new)
32
+ p[:f]||={}
33
+ p[:f][field] ||= []
34
+ p[:f][field].push(value)
35
+ p
36
+ end
37
+
38
+ def get_exhibit_set_number(exhibit_id)
39
+ Atrium::Exhibit.find(exhibit_id).set_number
40
+ end
41
+
42
+ # Standard display of a SELECTED facet value, no link, special span
43
+ # with class, and 'remove' button.
44
+ def get_selected_browse_facet_path(facet_solr_field, value, browse_facets, exhibit_number, exhibit_id, opts={})
45
+ value = [value] unless value.is_a? Array
46
+ p = HashWithIndifferentAccess.new
47
+ p.merge!(:f=>params[:f].dup) if params[:f]
48
+ p = remove_related_facet_params(facet_solr_field, p, browse_facets, exhibit_number)
49
+ if params[:collection_id]
50
+ p.merge!(:id=>params[:collection_id])
51
+ p.merge!(:collection_id=>params[:collection_id])
52
+ elsif params[:id] && params[:controller] == "atrium_collections"
53
+ p.merge!(:id=>params[:id])
54
+ p.merge!(:collection_id=>params[:id])
55
+ p.merge!(:controller=>params[:controller])
56
+ end
57
+ #if params[:edit_showcase]
58
+ # p.merge!(:edit_showcase=>true)
59
+ #end
60
+ p.merge!(:id=>exhibit_id)
61
+ # params[:action] == "edit" ? edit_atrium_collection_path(p) : atrium_collection_path(p)
62
+ atrium_exhibit_path(p)
63
+ end
64
+
65
+ #Remove current selected facet plus any child facets selected
66
+ def remove_related_facet_params(solr_facet_field, p, browse_facets, exhibit_number)
67
+ if params[:exhibit_number] && params[:exhibit_number].to_i != exhibit_number.to_i
68
+ p.delete(:f) if p[:f]
69
+ elsif browse_facets.include?(solr_facet_field)
70
+ #iterate through browseable facets from current on down
71
+ index = browse_facets.index(solr_facet_field)
72
+ if p[:f]
73
+ browse_facets.slice(index, browse_facets.length - index).each do |f|
74
+ p[:f].delete(f)
75
+ end
76
+ end
77
+ end
78
+ p
79
+ end
80
+
81
+ def get_selected_browse_facets(browse_facets)
82
+ selected = {}
83
+ if params[:f]
84
+ browse_facets.each do |facet|
85
+ selected.merge!({facet.to_sym=>params[:f][facet].first}) if params[:f][facet]
86
+ end
87
+ end
88
+ selected
89
+ end
90
+
91
+ def grouped_result_count(response, facet_name=nil, facet_value=nil)
92
+ if facet_name && facet_value
93
+ facet = response.facets.detect {|f| f.name == facet_name}
94
+ facet_item = facet.items.detect {|i| i.value == facet_value} if facet
95
+ count = facet_item ? facet_item.hits : 0
96
+ else
97
+ count = response.docs.total
98
+ end
99
+ pluralize(count, 'document')
100
+ end
101
+
102
+ def get_collections_list
103
+ Atrium::Collection.find(:all)
104
+ end
105
+
106
+ # Return the link to browse an collection
107
+ # @return [String] a formatted url to be used in href's etc.
108
+ def browse_collection_link
109
+ atrium_collection_path(get_collection_id)
110
+ end
111
+
112
+ # Returns the current collection id in the parameters.
113
+ # If the current controller is atrium_collections it expects the collection id to be in params[:id]
114
+ # Otherwise, it expects it to be in params[:collection_id]
115
+ # @return [String] the collection id
116
+ def get_collection_id
117
+ params[:controller] == "atrium_collections" ? params[:id] : params[:collection_id]
118
+ end
119
+
120
+ # Return the link to edit an collection
121
+ # @param [String] a css class to use in the link if necessary
122
+ # @return [String] a formatted url to be used in href's etc.
123
+ def edit_collection_link(css_class=nil)
124
+ edit_atrium_collection_path(get_collection_id, :class => css_class, :render_search=>"false")
125
+ end
126
+
127
+ def get_customize_page_path
128
+ if params[:controller] == "atrium/exhibits"
129
+ exhibit=Atrium::Exhibit.find(params[:id])
130
+ path = new_atrium_exhibit_showcases_path(exhibit, :facet_selection => params[:f])
131
+ elsif params[:controller] == "atrium/collections"
132
+ collection=Atrium::Collection.find(params[:id])
133
+ path= new_atrium_collection_showcases_path(collection)
134
+ end
135
+ return path
136
+ end
137
+
138
+ end
139
+
@@ -0,0 +1,10 @@
1
+ require 'atrium/layout_helper'
2
+
3
+ # Adds behaviors that Atrium needs all controllers to have. (mostly view helpers)
4
+ module Atrium::Controller
5
+ include Atrium::LayoutHelper
6
+
7
+ def self.included(base)
8
+ base.helper 'atrium/solr_helper'
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module Atrium::DescriptionsHelper
2
+
3
+ def get_description_for_showcase(showcase)
4
+ solr_desc_arr=[]
5
+ showcase.descriptions.each do |desc|
6
+ solr_desc_arr<< desc.description_solr_id unless desc.description_solr_id.blank?
7
+ end
8
+ @description_hash={}
9
+ unless solr_desc_arr.empty?
10
+ p = params.dup
11
+ params.delete :f
12
+ params.delete :q
13
+ desc_response, desc_documents = get_solr_response_for_field_values("id",solr_desc_arr.uniq)
14
+ desc_documents.each do |doc|
15
+ @description_hash[doc["id"]]= doc["description_content_s"].blank? ? "" : doc["description_content_s"].first
16
+ end
17
+ params.merge!(:f=>p[:f])
18
+ params.merge!(:q=>p[:q])
19
+ end
20
+ return @description_hash
21
+ end
22
+
23
+ end
@@ -0,0 +1,12 @@
1
+ require "atrium"
2
+ require "rails"
3
+ module Atrium
4
+ class Engine < Rails::Engine
5
+
6
+ # AtriumHelper is needed by all helpers, so we inject it
7
+ # into action view base here.
8
+ initializer 'atrium.helpers' do |app|
9
+ ActionView::Base.send :include, Atrium::BaseHelper
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # This module is a controller level mixin that helps render the appropriate layout for the given context
2
+ module Atrium::LayoutHelper
3
+ def current_layout
4
+ @atrium_collection ? @atrium_collection.theme_path : 'atrium'
5
+ end
6
+
7
+ def collection_theme_if_present
8
+ unless params[:collection_id].blank?
9
+ @atrium_collection ||= Atrium::Collection.find(params[:collection_id])
10
+ end
11
+ current_layout
12
+ end
13
+ end
@@ -0,0 +1,99 @@
1
+ # -*- encoding : utf-8 -*-
2
+ module Atrium
3
+ class Routes
4
+
5
+ def initialize(router, options)
6
+ @router = router
7
+ @options = options
8
+ end
9
+
10
+ def draw
11
+ route_sets.each do |r|
12
+ self.send(r)
13
+ end
14
+ end
15
+
16
+ protected
17
+
18
+ def add_routes &blk
19
+ @router.instance_exec(@options, &blk)
20
+ end
21
+
22
+ def route_sets
23
+ (@options[:only] || default_route_sets) - (@options[:except] || [])
24
+ end
25
+
26
+ def default_route_sets
27
+ [:atrium_collections, :catalog, :get]
28
+ end
29
+
30
+ module RouteSets
31
+
32
+ def atrium_collections
33
+ add_routes do |options|
34
+ namespace :atrium do
35
+ resources :collections, :exhibits do
36
+ resource :showcases, :only => [:new]
37
+ end
38
+ resources :showcases, :only => [:show]
39
+ resources :descriptions do
40
+ resource :essays
41
+ end
42
+ end
43
+ match 'atrium_collections/:id/exhibit_order', :to => 'atrium/collection_exhibit_order#index', :as => 'atrium_collection_exhibit_order'
44
+ match 'atrium_collections/:id/exhibit_order/update', :to => 'atrium/collection_exhibit_order#update', :as => 'update_atrium_collection_exhibit_order', :via => :post
45
+ match 'atrium_collections/:collection_id/catalog', :to => 'catalog#index', :as => 'atrium_collection_home', :via => :get
46
+ match 'atrium_collections/configure/:id', :to => 'atrium/collections#home_page_text_config', :as => 'atrium_collection_text_configure'
47
+ match 'atrium_collections/set_scope/:id', :to => 'atrium/collections#set_collection_scope', :as => 'atrium_set_collection_scope'
48
+ match 'atrium_collections/unset_scope/:id', :to => 'atrium/collections#unset_collection_scope', :as => 'atrium_unset_collection_scope'
49
+ match 'atrium_exhibits/:id/facet_order', :to => 'atrium/exhibit_facet_order#index', :as => 'atrium_exhibit_facet_order'
50
+ match 'atrium_exhibits/:id/facet_order/update', :to => 'atrium/exhibit_facet_order#update', :as => 'update_atrium_exhibit_facet_order', :via => :post
51
+ match 'atrium_exhibits/set_scope/:id', :to => 'atrium/exhibits#set_exhibit_scope', :as => 'atrium_set_exhibit_scope'
52
+ match 'atrium_exhibits/unset_scope/:id', :to => 'atrium/exhibits#unset_exhibit_scope', :as => 'atrium_unset_exhibit_scope'
53
+ match 'atrium_exhibits/:id/showcases/:showcase_id', :to => 'atrium/exhibits#show', :as => 'atrium_exhibit_showcase'
54
+ match 'atrium_showcases/featured/:id', :to => 'atrium/showcases#featured', :as => 'atrium_showcase_featured'
55
+ match 'atrium_showcases/refresh/:id', :to => 'atrium/showcases#refresh_showcase', :as => 'atrium_showcase_refresh'
56
+ match 'atrium_collections/:collection_id/catalog/:id', :to => 'catalog#show', :as => 'atrium_collection_catalog'
57
+ match 'atrium_collections/:collection_id/browse/:id', :to => 'catalog#show', :as => 'atrium_collection_browse', :defaults=>{:atrium_collection_browse=>true}
58
+ match 'atrium_collections/:collection_id/exhibits/:exhibit_id/browse/:id', :to => 'catalog#show', :as => 'atrium_collection_exhibit_browse', :defaults=>{:atrium_exhibit_browse=>true}
59
+ match 'atrium_collections/:id/showcases/:showcase_id', :to => 'atrium/collections#show', :as => 'atrium_collection_showcase'
60
+ match 'atrium_exhibits/:exhibit_id/browse/:id', :to => 'catalog#show', :as => 'atrium_exhibit_browse', :defaults=>{:atrium_exhibit_browse=>true}
61
+ match 'atrium_showcases/:showcase_id/descriptions', :to => 'atrium/descriptions#index', :as => 'atrium_descriptions', :via => :get
62
+ match 'atrium_showcases/:showcase_id/descriptions', :to => 'atrium/descriptions#create', :as => 'atrium_descriptions', :via => :post
63
+ match 'atrium_showcases/:showcase_id/descriptions/new', :to => 'atrium/descriptions#new', :as => 'new_atrium_description'
64
+ match 'atrium/customization/start', :to => 'atrium/customization#start', :as => 'start_atrium_customization'
65
+ match 'atrium/customization/stop', :to => 'atrium/customization#stop', :as => 'stop_atrium_customization'
66
+ match 'atrium_descriptions/add/:showcase_id', :to => 'atrium/descriptions#add_from_solr', :as => 'atrium_descriptions_add'
67
+ match 'atrium_descriptions/link/:showcase_id', :to => 'atrium/descriptions#save_ids_to_descriptions', :as => 'atrium_descriptions_link'
68
+ end
69
+ end
70
+
71
+ def catalog
72
+ add_routes do |options|
73
+ match 'catalog/:id/edit', :to => 'catalog#edit', :as => 'edit_catalog'
74
+ # The delete method renders a confirmation page with a button to submit actual destroy request
75
+ match 'catalog/:id/delete', :to => 'catalog#delete', :as => 'delete_catalog'
76
+ ### The rest of these routes are defined in blacklight
77
+ #resources :catalog, :id=> /.+/
78
+ # resources :catalog, :only => [:index, :show], :controller => "hydra_head/catalog", :path_prefix => HydraHead::Engine.config.mount_at, :as => "hydra_head", :id=> /.+/
79
+ #match 'catalog/:id', :to => "hydra_head/catalog#show", :path_prefix => HydraHead::Engine.config.mount_at, :as => "catalog", :id => /.+/
80
+ #match 'catalog/:id', :to => "hydra_head/catalog#show", :id => /.+/
81
+ # match 'about', :to => 'catalog#about', :as => 'about'
82
+ end
83
+ end
84
+
85
+
86
+ def get
87
+ add_routes do |options|
88
+ resources :get, :only=>:show
89
+ end
90
+ end
91
+
92
+
93
+ end
94
+ include RouteSets
95
+
96
+ #match 'generic_contents_object/content/:container_id', :to => 'generic_content_objects#create', :as => 'generic_content_object', :via => :post
97
+ end
98
+ end
99
+
@@ -0,0 +1,440 @@
1
+ # This module is a controller level mixin that uses Blacklight::SolrHelper to make calls to solr in an collection context
2
+ module Atrium::SolrHelper
3
+
4
+ def grouped_result_count(response, facet_name=nil, facet_value=nil)
5
+ if facet_name && facet_value
6
+ facet = response.facets.detect {|f| f.name == facet_name}
7
+ facet_item = facet.items.detect {|i| i.value == facet_value} if facet
8
+ count = facet_item ? facet_item.hits : 0
9
+ else
10
+ count = response.docs.total
11
+ end
12
+ pluralize(count, 'document')
13
+ end
14
+
15
+ # Return the link to browse an collection
16
+ # @return [String] a formatted url to be used in href's etc.
17
+ def browse_collection_link
18
+ atrium_collection_path(get_collection_id)
19
+ end
20
+
21
+ # Returns the current collection id in the parameters.
22
+ # If the current controller is atrium_collections it expects the collection id to be in params[:id]
23
+ # Otherwise, it expects it to be in params[:collection_id]
24
+ # @return [String] the collection id
25
+ def get_collection_id
26
+ params[:controller] == "atrium_collections" ? params[:id] : params[:collection_id]
27
+ end
28
+
29
+ # Return the link to edit an collection
30
+ # @param [String] a css class to use in the link if necessary
31
+ # @return [String] a formatted url to be used in href's etc.
32
+ def edit_collection_link(css_class=nil)
33
+ edit_atrium_collection_path(get_collection_id, :class => css_class, :render_search=>"false")
34
+ end
35
+
36
+ # Returns the current atrium_collection instance variable
37
+ # @return [Atrium::Collection]
38
+ def atrium_collection
39
+ @atrium_collection
40
+ end
41
+
42
+ # Returns the current exhibit instance variable
43
+ # @return [Atrium::Exhibit]
44
+ def exhibit
45
+ @exhibit
46
+ end
47
+
48
+ # Returns the current browse_levels instance variable
49
+ # @return [Array] Array of Atrium::BrowseLevel for current Atrium::Collection
50
+ def exhibits
51
+ @exhibits
52
+ end
53
+
54
+ # Returns the current Blacklight solr response for results that should be displayed in current browse navigation scope
55
+ # @return [RSolr::Ext::Response]
56
+ def browse_response
57
+ @browse_response
58
+ end
59
+
60
+ # Returns the current document list from Blacklight solr response for results that should be displayed in current browse navigation scope
61
+ # @return [Array] array of SolrDocument returned by search result
62
+ def browse_document_list
63
+ @browse_document_list
64
+ end
65
+
66
+ # Returns the current extra controller params used in the query to Solr for Browsing response results
67
+ # @return [Hash]
68
+ def current_extra_controller_params
69
+ @extra_controller_params
70
+ end
71
+
72
+ # Initialize the collection and browse instance variables for a current collection scope. To initialize
73
+ # anything it expects params[:id] to the be collection id if the current controller is "atrium_collections".
74
+ # If it sees params[:collection_id] defined that will be used. If neither are present then nothing will
75
+ # be initialized.
76
+ # If possibled the following will be initialized:
77
+ # @atrium_collection [Atrium::Collection] The collection object
78
+ # @browse_levels [Array] The array of Atrium::BrowseLevel objects for this collection
79
+ # @browse_response [Solr::Response] The response from solr for current collection browse scope (will include any filters/facets applied by browse)
80
+ # @browse_document_list [Array] An array of SolrDocuments for the current browse scope
81
+ #
82
+ def __initialize_collection(collection_id)
83
+
84
+ unless collection_id
85
+ logger.error("Could not initialize collection. If controller is 'atrium_collections' than :id must be defined. Otherwise, :collection_id must be defined. Params were: #{params.inspect}")
86
+ return
87
+ end
88
+
89
+ begin
90
+ @atrium_collection = Atrium::Collection.find(collection_id) if @atrium_collection.nil?
91
+ #raise "No collection was found with id: #{collection_id}" if @atrium_collection.nil?
92
+ @exhibits = @atrium_collection.exhibits
93
+ if params[:exhibit_number]
94
+ exhibit_index = params[:exhibit_number].to_i
95
+ @exhibit = @exhibits.fetch(exhibit_index-1) if @exhibits && exhibit_index && exhibit_index <= @exhibits.size
96
+ elsif params[:exhibit_id]
97
+ @exhibit = Atrium::Exhibit.find(params[:exhibit_id])
98
+ end
99
+ ##logger.debug("Collection: #{@atrium_collection}")
100
+ @extra_controller_params ||= {}
101
+ params[:browse_level_id] ? @browse_level = Atrium::BrowseLevel.find(params[:browse_level_id]): @browse_level = get_current_browse_level(@exhibit)
102
+ @extra_controller_params = prepare_extra_controller_params_for_collection_query(@atrium_collection,@exhibit,@browse_level,params,@extra_controller_params)
103
+ (@response, @document_list) = get_search_results(params, @extra_controller_params)
104
+ @images = get_all_children(@document_list, "is_part_of_s")
105
+ #@members = get_all_children(@document_list, "is_member_of_s")
106
+ #reset to just filters in collection filter
107
+ @extra_controller_params = reset_extra_controller_params_after_collection_query(@atrium_collection,@exhibit,@browse_level,@extra_controller_params)
108
+ @browse_response = @response
109
+ @browse_document_list = @document_list
110
+ ##logger.debug("Collection: #{@atrium_collection}, Exhibit: #{@atrium_collection.exhibits}")
111
+ @collection_showcase = Atrium::Showcase.with_selected_facets(@atrium_collection.id,@atrium_collection.class.name, params[:f]).first
112
+ ##logger.debug("Collection level showcase: #{@collection_showcase.inspect}")
113
+ rescue Exception=>e
114
+ logger.error("Could not initialize collection information for id #{collection_id}. Reason - #{e.to_s}")
115
+ end
116
+ end
117
+
118
+ # added as part of solr search params to exclude items from search result
119
+ # as :f, to solr as appropriate :fq query.
120
+ def add_exclude_fq_to_solr(solr_parameters, user_params)
121
+ # :fq, map from :f.
122
+ ##logger.debug("Solr exclude!!!: #{solr_parameters.inspect}, #{user_params.inspect}")
123
+ if ( user_params[:exclude])
124
+ exclude_request_params = user_params[:exclude]
125
+ ##logger.debug("user_params[:exclude]!!!: #{user_params[:exclude].inspect}")
126
+ solr_parameters[:fq] ||= []
127
+ exclude_request_params.each_pair do |facet_field, value_list|
128
+ value_list ||= []
129
+ value_list = [value_list] unless value_list.respond_to? :each
130
+ value_list.each do |value|
131
+ exclude_query="-(#{facet_value_to_fq_string(facet_field, value)})"
132
+ solr_parameters[:fq] << exclude_query
133
+ ##logger.debug("Solr exclude!!!: #{exclude_query.inspect}, #{solr_parameters.inspect}, #{user_params.inspect}")
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ def get_current_filter_query_params(collection,exhibit,browse_level)
140
+ #params[:exclude]={:f=>{"collection_0_did_0_unittitle_0_imprint_0_publisher_facet"=>["Continental Currency"]}}
141
+ filter_query_params = nil
142
+ ex_filter_query_params = solr_search_params(collection.filter_query_params) if collection && !collection.filter_query_params.nil?
143
+ exhibit_filter_query_params = solr_search_params(exhibit.filter_query_params) if exhibit && !exhibit.filter_query_params.nil?
144
+ bl_filter_query_params = solr_search_params(browse_level.filter_query_params) if browse_level && !browse_level.filter_query_params.nil?
145
+ bl_exclude_query_params = solr_search_params(browse_level.exclude_query_params) if browse_level && !browse_level.exclude_query_params.nil?
146
+ ##logger.debug("##### Exclude: #{bl_exclude_query_params.inspect}")
147
+ queries = []
148
+ queries << ex_filter_query_params[:q] if (ex_filter_query_params && ex_filter_query_params[:q])
149
+ queries << exhibit_filter_query_params[:q] if (exhibit_filter_query_params && exhibit_filter_query_params[:q])
150
+ queries << bl_filter_query_params[:q] if (bl_filter_query_params && bl_filter_query_params[:q])
151
+ fq = []
152
+ fq.concat(ex_filter_query_params[:fq]) if (ex_filter_query_params && ex_filter_query_params[:fq])
153
+ #mixin exhibit facet filters
154
+ if exhibit_filter_query_params && exhibit_filter_query_params[:fq]
155
+ exhibit_filter_query_params[:fq].each do |fq_param|
156
+ fq << fq_param unless fq.include?(fq_param)
157
+ end
158
+ end
159
+ #mixin browse level facet filters
160
+ if bl_filter_query_params && bl_filter_query_params[:fq]
161
+ bl_filter_query_params[:fq].each do |fq_param|
162
+ fq << fq_param unless fq.include?(fq_param)
163
+ end
164
+ end
165
+ if bl_exclude_query_params && bl_exclude_query_params[:fq]
166
+ bl_exclude_query_params[:fq].each do |fq_exclude_param|
167
+ fq << fq_exclude_param unless fq.include?(fq_exclude_param)
168
+ end
169
+ end
170
+
171
+ unless fq.empty? && queries.empty?
172
+ filter_query_params = {}
173
+ filter_query_params.merge!(:fq=>fq) unless fq.empty?
174
+ filter_query_params.merge!(:q=>queries.join(" AND ")) unless queries.empty?
175
+ end
176
+ filter_query_params
177
+ end
178
+
179
+ # This method will get extra controller params that are necessary to apply an
180
+ # collection scope filter. If there are facets selected in the collection filter and
181
+ # a menu item is selected it will combine the facet selection from params into
182
+ # extra controller params to ensure that both are in the query correctly.
183
+
184
+ def prepare_extra_controller_params_for_collection_query(collection,exhibit,browse_level,params, extra_controller_params)
185
+ extra_controller_params ||= {}
186
+ filter_query_params = get_current_filter_query_params(collection,exhibit,browse_level)
187
+ queries = []
188
+ #build_lucene_query will be defined if hydra is present to add hydra rights into query etc, otherwise it will be ignored
189
+ queries << build_lucene_query(params[:q]) if respond_to?(:build_lucene_query)
190
+ queries << filter_query_params[:q] if (filter_query_params && filter_query_params[:q])
191
+ queries << params[:q] if params[:q]
192
+ queries.empty? ? q = params[:q] : q = queries.join(" AND ")
193
+ extra_controller_params.merge!(:q=>q) unless q.nil?
194
+ extra_controller_params.merge!(:fq=>filter_query_params[:fq]) if filter_query_params && filter_query_params[:fq]
195
+ #merge in user params before doing query to correctly handle facets in both extra controller params and params
196
+ if (extra_controller_params && extra_controller_params[:fq])
197
+ session_search_params = solr_search_params(params)
198
+ if session_search_params[:fq]
199
+ extra_controller_params[:fq].each do |extra_param|
200
+ #only add if it is not already in params
201
+ session_search_params[:fq] << extra_param unless session_search_params[:fq].include?(extra_param)
202
+ end
203
+ extra_controller_params.merge!(:fq=>session_search_params[:fq])
204
+ end
205
+ end
206
+ extra_controller_params
207
+ end
208
+
209
+ def reset_extra_controller_params_after_collection_query(collection,exhibit,browse_level,extra_controller_params)
210
+ extra_controller_params ||= {}
211
+ filter_query_params = get_current_filter_query_params(collection,exhibit,browse_level)
212
+ extra_controller_params.merge!(:fq=>filter_query_params[:fq]) if filter_query_params && filter_query_params[:fq]
213
+ extra_controller_params
214
+ end
215
+
216
+ # Returns an array of Atrium::Exhibit objects with its BrowseLevel objects populated with current display
217
+ # data. It is expected that it will be used for generating current navigation controls when browsing an collection.
218
+ # All possible browse levels will be present but values will only be filled in for levels that should be
219
+ # in view. It will fill in values for the top browse level, and then will only fill in values for the second browse level
220
+ # if something is selected, and so on for any deeper browse levels. If no label is defined
221
+ # for a browse level, it will fill in the default label for the browse level facet.
222
+ # If nothing is selected in the first level, there will be no second element. This pattern
223
+ # continues as it maintains the state for a user drilling into the content by expanding and collapses
224
+ # browse category values at each browse level. This method calls get_browse_level_data
225
+ # to actually retrieve the array of data after it makes sure a response for browse information
226
+ # has come back from Blacklight Solr
227
+ # @return [Array] An array of Atrium::Exhibit objects defind for an collection with BrowseLevel objects populated with view data
228
+ # @example Get First Browse Level data
229
+ # You would access the first level of the first browse set as follows:
230
+ #
231
+ # top_browse_level = exhibits.first.browse_levels.first
232
+ # #get menu values to display
233
+ # top_browse_level.values
234
+ # #get label for the browse category
235
+ # top_browse_level.label
236
+ # #check if level has a selected value
237
+ # top_browse_level.selected?
238
+ #
239
+ # One should use the above methods to generate data for expand/collapse controls, breadcrumbs, etc.
240
+ def get_exhibit_navigation_data
241
+ ##logger.debug("get_exhibit_navigation_data browse response: #{browse_response.inspect}")
242
+ initialize_collection if atrium_collection.nil?
243
+ browse_data = []
244
+ unless atrium_collection.nil? || atrium_collection.exhibits.nil?
245
+ atrium_collection.exhibits.each do |exhibit|
246
+ if exhibit.respond_to?(:browse_levels) && !exhibit.browse_levels.nil?
247
+ updated_browse_levels = get_browse_level_data(atrium_collection,exhibit,exhibit.browse_levels,browse_response,current_extra_controller_params,true)
248
+ ##logger.debug("Updated Browse Levels: #{updated_browse_levels.inspect}")
249
+ exhibit.browse_levels.each_index do |index|
250
+ ##logger.debug("#{exhibit.browse_levels.inspect}")
251
+ exhibit.browse_levels.fetch(index).values = updated_browse_levels.fetch(index).values
252
+ exhibit.browse_levels.fetch(index).label = updated_browse_levels.fetch(index).label
253
+ exhibit.browse_levels.fetch(index).selected = updated_browse_levels.fetch(index).selected
254
+ end
255
+ exhibit.browse_levels.flatten!(1)
256
+ browse_data << exhibit
257
+ end
258
+ end
259
+ end
260
+ ##logger.debug("Before BrowseData: #{browse_data.inspect}")
261
+
262
+ browse_data=[] if check_for_scope(browse_data)
263
+ @exhibit_navigation_data=browse_data
264
+
265
+ ##logger.debug("After BrowseData: #{browse_data.inspect}")
266
+ browse_data
267
+ end
268
+
269
+ private
270
+
271
+ def check_for_scope(exhibit_list)
272
+ scoped_to_items=false
273
+ if atrium_collection && atrium_collection.filter_query_params && atrium_collection.filter_query_params[:solr_doc_ids]
274
+ scoped_to_items=true
275
+ end
276
+ return scoped_to_items
277
+ end
278
+
279
+ # This is a private method and should not be called directly.
280
+ # get_exhibit_navigation_data calls this method to fill out the browse_level_navigation_data array
281
+ # This method calls itself recursively as it generates the current browse state data.
282
+ # It returns the browse levels array with its browse level objects passed in updated
283
+ # with any values, label, and selected value if one is selected. It will fill in values
284
+ # for the top browse level, and then will only fill in values for the second browse level
285
+ # if something is selected, and so on for any deeper browse levels. If no label is defined
286
+ # for a browse level, it will fill in the default label for the browse level facet.
287
+ # @param [Atrium::Collection] The current collection
288
+ # @param [Atrium::Exhibit] the current exhibit
289
+ # @params [Array] The current browse levels (will reduce as this method recurses)
290
+ # @param [SolrResponse] the browse response from solr
291
+ # @param [Hash] the extra controller params that need to be passed to solr if we query for another response if necessary to get child level data
292
+ # @param [Boolean] true if the top level of the exhibit
293
+ # @return [Array] An array of update BrowseLevel objects that are enhanced with current navigation data such as selected, values, and label filled in
294
+ # The relevant attributes of a BrowseLevel are
295
+ # :solr_facet_name [String] the facet used as the category for that browse level
296
+ # :label [String] browse level category label
297
+ # :values [Array] values to display for the browse level
298
+ # :selected [String] the selected value if one
299
+ def get_browse_level_data(collection, exhibit, browse_levels, response, extra_controller_params={},top_level=false)
300
+ exhibit_number = exhibit.set_number
301
+ updated_browse_levels = []
302
+ unless browse_levels.nil? || browse_levels.empty?
303
+ browse_level = browse_levels.first
304
+ browse_facet_name = browse_level.solr_facet_name
305
+ browse_level.label = facet_field_labels[browse_facet_name] if (browse_level.label.nil? || browse_level.label.blank?)
306
+ #always add whether there should be values set or not
307
+ updated_browse_levels << browse_level
308
+ if params.has_key?(:f) && !params[:f].nil?
309
+ temp = params[:f].dup
310
+ unless top_level && !params[:f][browse_facet_name] && !params[:f][browse_facet_name.to_s]
311
+ browse_levels.each_with_index do |cur_browse_level,index|
312
+ params[:f].delete(cur_browse_level.solr_facet_name)
313
+ end
314
+ else
315
+ params[:f] = {}
316
+ end
317
+ extra_controller_params = prepare_extra_controller_params_for_collection_query(collection,exhibit,browse_level,params,extra_controller_params)
318
+ (response_without_f_param, @new_document_list) = get_search_results(params,extra_controller_params)
319
+ extra_controller_params = reset_extra_controller_params_after_collection_query(collection,exhibit,browse_level,extra_controller_params)
320
+ params[:f] = temp
321
+ else
322
+ extra_controller_params = prepare_extra_controller_params_for_collection_query(collection,exhibit,browse_level,params,extra_controller_params)
323
+ (response_without_f_param, @new_document_list) = get_search_results(params,extra_controller_params)
324
+ extra_controller_params = reset_extra_controller_params_after_collection_query(collection,exhibit,browse_level,extra_controller_params)
325
+ end
326
+ display_facet = response_without_f_param.facets.detect {|f| f.name == browse_facet_name}
327
+ display_facet_with_f = response.facets.detect {|f| f.name == browse_facet_name}
328
+ unless display_facet.nil?
329
+ level_has_selected = false
330
+ if display_facet.items.any?
331
+ display_facet.items.each do |item|
332
+ if facet_in_params?(display_facet.name, item.value )
333
+ level_has_selected = true
334
+ updated_browse_levels.first.selected = item.value
335
+ if browse_levels.length > 1
336
+ updated_browse_levels << get_browse_level_data(collection,exhibit,browse_levels.slice(1,browse_levels.length-1), response, extra_controller_params)
337
+ #make sure to flatten any nested arrays from recursive calls
338
+ updated_browse_levels.flatten!(1)
339
+ end
340
+ end
341
+ updated_browse_levels.first.values << item.value
342
+ end
343
+ end
344
+ #check if facet_in_params and if not just add rest of levels so all are represented since nothing below will be selected
345
+ unless level_has_selected
346
+ updated_browse_levels << browse_levels.slice(1,browse_levels.length-1)
347
+ updated_browse_levels.flatten!(1)
348
+ end
349
+ end
350
+ end
351
+ updated_browse_levels
352
+ end
353
+
354
+ def get_atrium_showcase(exhibit_id, facet_hash={})
355
+ atrium_showcase= Atrium::Showcase.with_selected_facets(exhibit_id,facet_hash)
356
+ return atrium_showcase
357
+ end
358
+
359
+ # Checks if a browse level has been navigated to for a exhibit
360
+ # @param [Atrium::Exhibit] The current exhibit in view
361
+ # @return [Atrium::BrowseLevel] It will return a browse level that is selected, otherwise it will return nil
362
+ def get_current_browse_level(exhibit)
363
+ cur_browse_level = nil
364
+ if exhibit
365
+ #keep recursing until lowest level that has a facet selected is found
366
+ exhibit.browse_levels.each do |browse_level|
367
+ cur_browse_level = browse_level if browse_level.solr_facet_name && facet_selected?(browse_level.solr_facet_name)
368
+ end
369
+ end
370
+ cur_browse_level
371
+ end
372
+
373
+ def facet_selected?(facet_name)
374
+ params[:f].include?(facet_name) if params[:f]
375
+ end
376
+
377
+ def display_solr_essay(pid)
378
+ ##logger.debug("description: #{pid.inspect}")
379
+ response, document = get_solr_response_for_doc_id(pid)
380
+ content = render_document_show_field_value :document => document, :field => 'description_content_s'
381
+ ##logger.debug("Content:#{content}")
382
+ return content.html_safe
383
+ end
384
+
385
+ def get_all_children(doc_list, relationship_field_names, opts={})
386
+ @child_hash={}
387
+ parent_arr=[]
388
+ modified_arr=[]
389
+ #logger.debug("Get children for list: #{doc_list.count}")
390
+ doc_list.each_with_index do |doc, i|
391
+ parent_arr<< doc["id"] unless (doc["id"].blank?)
392
+ end
393
+ parent_arr.each do |id|
394
+ rel_id="info:fedora/#{id}"
395
+ modified_arr<< rel_id
396
+ end
397
+ #logger.debug("Get children for list: #{parent_arr.inspect}, #{modified_arr.inspect}")
398
+ p = params.dup
399
+ params.delete(:f)
400
+ params.delete(:page)
401
+ params.delete(:q)
402
+ params.delete(:fq)
403
+ params.delete(:per_page)
404
+ params[:rows] = 1000
405
+ params[:per_page] = 1000
406
+ response, response_list = get_solr_response_for_field_values(relationship_field_names,modified_arr) ##get child pages
407
+ #response, is_member_response_list = get_solr_response_for_field_values("is_member_of_s",modified_arr) ## get any child components
408
+ logger.debug("Relationship:#{relationship_field_names.inspect}, Children count:#{response_list.count}")
409
+ params.delete(:rows)
410
+ params[:f] = p[:f]
411
+ params[:page] = p[:page]
412
+ params[:q] = p[:q]
413
+ params[:fq] = p[:fq]
414
+ params[:per_page] = p[:per_page]
415
+ parent_arr.each do |parent|
416
+ ##logger.debug("Processing id: #{parent.inspect}")
417
+ child_arr=[]
418
+ member_arr=[]
419
+ response_list.each do |doc|
420
+ parent_id = doc[relationship_field_names].first.split("/").last
421
+ if parent_id.eql?(parent)
422
+ #logger.debug("is_part_response_list parent #{doc[relationship_field_names.to_s].inspect}, id: #{doc["id"].inspect} ")
423
+ child_arr<<doc
424
+ end
425
+ end
426
+ #is_member_response_list.each do |doc|
427
+ # parent_id = doc["is_member_of_s"].first.split("/").last
428
+ # if parent_id.eql?(parent)
429
+ # ##logger.debug("is_member_of_s_response_list parent #{doc["is_member_of_s"].inspect}, id: #{doc["id"].inspect} ")
430
+ # member_arr<<doc
431
+ # end
432
+ #end
433
+ #@image_hash[parent]=image_arr
434
+ #@member_hash[parent]=member_arr
435
+ @child_hash[parent]=child_arr
436
+ end
437
+ #return [@image_hash, @member_hash ]
438
+ return @child_hash
439
+ end
440
+ end