blacklight 3.0pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/.gitignore +17 -0
  2. data/.gitmodules +6 -0
  3. data/.yardopts +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +14 -0
  6. data/README.rdoc +168 -0
  7. data/Rakefile +9 -0
  8. data/app/controllers/bookmarks_controller.rb +98 -0
  9. data/app/controllers/feedback_controller.rb +37 -0
  10. data/app/controllers/folder_controller.rb +49 -0
  11. data/app/controllers/saved_searches_controller.rb +45 -0
  12. data/app/controllers/search_history_controller.rb +25 -0
  13. data/app/helpers/blacklight_helper.rb +606 -0
  14. data/app/helpers/bookmarks_helper.rb +3 -0
  15. data/app/helpers/catalog_helper.rb +65 -0
  16. data/app/helpers/feedback_helper.rb +2 -0
  17. data/app/helpers/hash_as_hidden_fields.rb +57 -0
  18. data/app/helpers/render_constraints_helper.rb +120 -0
  19. data/app/helpers/saved_searches_helper.rb +2 -0
  20. data/app/helpers/search_history_helper.rb +2 -0
  21. data/app/models/bookmark.rb +6 -0
  22. data/app/models/record_mailer.rb +43 -0
  23. data/app/models/search.rb +19 -0
  24. data/app/views/_flash_msg.html.erb +6 -0
  25. data/app/views/_user_util_links.html.erb +13 -0
  26. data/app/views/bookmarks/index.html.erb +33 -0
  27. data/app/views/catalog/_bookmark_control.html.erb +25 -0
  28. data/app/views/catalog/_bookmark_form.html.erb +8 -0
  29. data/app/views/catalog/_citation.html.erb +15 -0
  30. data/app/views/catalog/_constraints.html.erb +7 -0
  31. data/app/views/catalog/_constraints_element.html.erb +33 -0
  32. data/app/views/catalog/_did_you_mean.html.erb +10 -0
  33. data/app/views/catalog/_document_list.html.erb +30 -0
  34. data/app/views/catalog/_email_form.html.erb +11 -0
  35. data/app/views/catalog/_facet_limit.html.erb +33 -0
  36. data/app/views/catalog/_facet_pagination.html.erb +28 -0
  37. data/app/views/catalog/_facets.html.erb +9 -0
  38. data/app/views/catalog/_folder_control.html.erb +12 -0
  39. data/app/views/catalog/_home.html.erb +6 -0
  40. data/app/views/catalog/_home_text.html.erb +6 -0
  41. data/app/views/catalog/_index_partials/_default.erb +11 -0
  42. data/app/views/catalog/_marc_view.html.erb +33 -0
  43. data/app/views/catalog/_opensearch_response_metadata.html.erb +3 -0
  44. data/app/views/catalog/_previous_next_doc.html.erb +6 -0
  45. data/app/views/catalog/_refworks_form.html.erb +7 -0
  46. data/app/views/catalog/_results_pagination.html.erb +11 -0
  47. data/app/views/catalog/_search_form.html.erb +14 -0
  48. data/app/views/catalog/_show_partials/_default.html.erb +9 -0
  49. data/app/views/catalog/_show_sidebar.html.erb +1 -0
  50. data/app/views/catalog/_show_tools.html.erb +46 -0
  51. data/app/views/catalog/_sms_form.html.erb +23 -0
  52. data/app/views/catalog/_solr_request.html.erb +5 -0
  53. data/app/views/catalog/_sort_and_per_page.html.erb +20 -0
  54. data/app/views/catalog/_unapi_microformat.html.erb +1 -0
  55. data/app/views/catalog/citation.html.erb +1 -0
  56. data/app/views/catalog/email.erb +1 -0
  57. data/app/views/catalog/endnote.endnote.erb +1 -0
  58. data/app/views/catalog/facet.html.erb +28 -0
  59. data/app/views/catalog/index.atom.builder +108 -0
  60. data/app/views/catalog/index.html.erb +37 -0
  61. data/app/views/catalog/index.rss.builder +19 -0
  62. data/app/views/catalog/librarian_view.html.erb +3 -0
  63. data/app/views/catalog/opensearch.json.erb +0 -0
  64. data/app/views/catalog/opensearch.xml.erb +11 -0
  65. data/app/views/catalog/send_email_record.erb +0 -0
  66. data/app/views/catalog/show.endnote.erb +1 -0
  67. data/app/views/catalog/show.html.erb +42 -0
  68. data/app/views/catalog/show.refworks.erb +1 -0
  69. data/app/views/catalog/sms.erb +1 -0
  70. data/app/views/catalog/unapi.xml.builder +6 -0
  71. data/app/views/feedback/complete.html.erb +3 -0
  72. data/app/views/feedback/show.html.erb +20 -0
  73. data/app/views/folder/_tools.html.erb +23 -0
  74. data/app/views/folder/index.html.erb +44 -0
  75. data/app/views/layouts/blacklight.html.erb +49 -0
  76. data/app/views/record_mailer/email_record.erb +6 -0
  77. data/app/views/record_mailer/sms_record.erb +4 -0
  78. data/app/views/saved_searches/index.html.erb +27 -0
  79. data/app/views/search_history/index.html.erb +23 -0
  80. data/blacklight.gemspec +50 -0
  81. data/config.ru +4 -0
  82. data/config/routes.rb +54 -0
  83. data/db/seeds.rb +7 -0
  84. data/features/generators.feature +77 -0
  85. data/features/support/aruba.rb +9 -0
  86. data/install.rb +0 -0
  87. data/install/solr.yml +8 -0
  88. data/lib/blacklight.rb +121 -0
  89. data/lib/blacklight/catalog.rb +311 -0
  90. data/lib/blacklight/comma_link_renderer.rb +27 -0
  91. data/lib/blacklight/configurable.rb +46 -0
  92. data/lib/blacklight/controller.rb +121 -0
  93. data/lib/blacklight/engine.rb +32 -0
  94. data/lib/blacklight/exceptions.rb +13 -0
  95. data/lib/blacklight/marc.rb +46 -0
  96. data/lib/blacklight/marc/citation.rb +251 -0
  97. data/lib/blacklight/search_fields.rb +107 -0
  98. data/lib/blacklight/solr.rb +7 -0
  99. data/lib/blacklight/solr/document.rb +239 -0
  100. data/lib/blacklight/solr/document/dublin_core.rb +40 -0
  101. data/lib/blacklight/solr/document/email.rb +15 -0
  102. data/lib/blacklight/solr/document/marc.rb +84 -0
  103. data/lib/blacklight/solr/document/marc_export.rb +430 -0
  104. data/lib/blacklight/solr/document/sms.rb +13 -0
  105. data/lib/blacklight/solr/facet_paginator.rb +93 -0
  106. data/lib/blacklight/solr_helper.rb +413 -0
  107. data/lib/blacklight/user.rb +55 -0
  108. data/lib/blacklight/version.rb +3 -0
  109. data/lib/colorize.rb +196 -0
  110. data/lib/generators/blacklight/blacklight_generator.rb +134 -0
  111. data/lib/generators/blacklight/templates/SolrMarc.jar +0 -0
  112. data/lib/generators/blacklight/templates/catalog_controller.rb +8 -0
  113. data/lib/generators/blacklight/templates/config/SolrMarc/config-test.properties +37 -0
  114. data/lib/generators/blacklight/templates/config/SolrMarc/config.properties +37 -0
  115. data/lib/generators/blacklight/templates/config/SolrMarc/index.properties +97 -0
  116. data/lib/generators/blacklight/templates/config/SolrMarc/index_scripts/dewey.bsh +47 -0
  117. data/lib/generators/blacklight/templates/config/SolrMarc/index_scripts/format.bsh +126 -0
  118. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/README_MAPS +1 -0
  119. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/callnumber_map.properties +407 -0
  120. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/composition_era_map.properties +56 -0
  121. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/country_map.properties +379 -0
  122. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/format_map.properties +50 -0
  123. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/instrument_map.properties +101 -0
  124. data/lib/generators/blacklight/templates/config/SolrMarc/translation_maps/language_map.properties +490 -0
  125. data/lib/generators/blacklight/templates/config/blacklight_config.rb +245 -0
  126. data/lib/generators/blacklight/templates/config/solr.yml +6 -0
  127. data/lib/generators/blacklight/templates/migrations/add_user_types_to_bookmarks_searches.rb +11 -0
  128. data/lib/generators/blacklight/templates/migrations/create_bookmarks.rb +17 -0
  129. data/lib/generators/blacklight/templates/migrations/create_searches.rb +15 -0
  130. data/lib/generators/blacklight/templates/migrations/remove_editable_fields_from_bookmarks.rb +11 -0
  131. data/lib/generators/blacklight/templates/public/images/blacklight/bg.png +0 -0
  132. data/lib/generators/blacklight/templates/public/images/blacklight/border.png +0 -0
  133. data/lib/generators/blacklight/templates/public/images/blacklight/bul_sq_gry.gif +0 -0
  134. data/lib/generators/blacklight/templates/public/images/blacklight/checkmark.gif +0 -0
  135. data/lib/generators/blacklight/templates/public/images/blacklight/logo.png +0 -0
  136. data/lib/generators/blacklight/templates/public/images/blacklight/magnifying_glass.gif +0 -0
  137. data/lib/generators/blacklight/templates/public/images/blacklight/remove.gif +0 -0
  138. data/lib/generators/blacklight/templates/public/images/blacklight/separator.gif +0 -0
  139. data/lib/generators/blacklight/templates/public/images/blacklight/start_over.gif +0 -0
  140. data/lib/generators/blacklight/templates/public/javascripts/blacklight.js +485 -0
  141. data/lib/generators/blacklight/templates/public/javascripts/jquery-1.4.2.min.js +154 -0
  142. data/lib/generators/blacklight/templates/public/javascripts/jquery-ui-1.8.1.custom.min.js +756 -0
  143. data/lib/generators/blacklight/templates/public/stylesheets/blacklight.css +487 -0
  144. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  145. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  146. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  147. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  148. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  149. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  150. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_558fd0_500x100.png +0 -0
  151. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  152. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  153. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  154. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  155. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_2e4f81_256x240.png +0 -0
  156. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  157. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  158. data/lib/generators/blacklight/templates/public/stylesheets/jquery/ui-lightness/jquery-ui-1.8.1.custom.css +486 -0
  159. data/lib/generators/blacklight/templates/public/stylesheets/yui.css +31 -0
  160. data/lib/generators/blacklight/templates/solr_document.rb +30 -0
  161. data/lib/railties/blacklight.rake +66 -0
  162. data/lib/railties/cucumber.rake +53 -0
  163. data/lib/railties/rspec.rake +188 -0
  164. data/lib/railties/solr_marc.rake +148 -0
  165. data/lib/railties/test_solr_server.rb +130 -0
  166. data/spec/helpers/catalog_helper_spec.rb +111 -0
  167. data/spec/views/catalog/_sms_form.html.erb_spec.rb +19 -0
  168. data/tasks/blacklight_tasks.rake +4 -0
  169. data/uninstall.rb +1 -0
  170. metadata +431 -0
@@ -0,0 +1,3 @@
1
+ module BookmarksHelper
2
+
3
+ end
@@ -0,0 +1,65 @@
1
+ module CatalogHelper
2
+ #
3
+ # shortcut for built-in Rails helper, "number_with_delimiter"
4
+ #
5
+ def format_num(num); number_with_delimiter(num) end
6
+
7
+ #
8
+ # Displays the "showing X through Y of N" message. Not sure
9
+ # why that's called "page_entries_info". Not entirely sure
10
+ # what collection argument is supposed to duck-type too, but
11
+ # an RSolr::Ext::Response works. Perhaps it duck-types to something
12
+ # from will_paginate?
13
+ def page_entries_info(collection, options = {})
14
+ start = (collection.current_page - 1) * collection.per_page + 1
15
+ total_hits = @response.total
16
+ start_num = format_num(start)
17
+ end_num = format_num(start + collection.size - 1)
18
+ total_num = format_num(total_hits)
19
+ # end_num = total_num if total_hits < (start + collection.per_page - 1)
20
+
21
+ entry_name = options[:entry_name] ||
22
+ (collection.empty?? 'entry' : collection.first.class.name.underscore.sub('_', ' '))
23
+
24
+ if collection.total_pages < 2
25
+ case collection.size
26
+ when 0; "No #{h(entry_name.pluralize)} found".html_safe
27
+ when 1; "Displaying <b>1</b> #{h(entry_name)}".html_safe
28
+ else; "Displaying <b>all #{total_num}</b> #{entry_name.pluralize}".html_safe
29
+ end
30
+ else
31
+ "Displaying #{h(entry_name.pluralize)} <b>#{start_num} - #{end_num}</b> of <b>#{total_num}</b>".html_safe
32
+ end
33
+ end
34
+
35
+ # Like the mysteriously named #page_entry_info above, but for an individual
36
+ # item show page. Displays "showing X of Y items" message.
37
+ # Code should call this method rather than interrogating session directly,
38
+ # because implementation of where this data is stored/retrieved may change.
39
+ def item_page_entry_info
40
+ "Showing item <b>#{session[:search][:counter].to_i} of #{format_num(session[:search][:total])}</b> from your search.".html_safe
41
+ end
42
+
43
+ # Look up search field user-displayable label
44
+ # based on params[:qt] and configuration.
45
+ def search_field_label(params)
46
+ h( Blacklight.label_for_search_field(params[:search_field]) )
47
+ end
48
+
49
+ # Export to Refworks URL, called in _show_tools
50
+ def refworks_export_url(document = @document)
51
+ "http://www.refworks.com/express/expressimport.asp?vendor=#{CGI.escape(application_name)}&filter=MARC%20Format&encoding=65001&url=#{CGI.escape(catalog_path(document[:id], :format => 'refworks_marc_txt', :only_path => false))}"
52
+ end
53
+
54
+ def render_document_class(document = @document)
55
+ 'blacklight-' + document.get(Blacklight.config[:index][:record_display_type]).parameterize rescue nil
56
+ end
57
+
58
+ def render_document_sidebar_partial(document = @document)
59
+ render :partial => 'show_sidebar'
60
+ end
61
+
62
+ def has_search_parameters?
63
+ !params[:q].blank? or !params[:f].blank? or !params[:search_field].blank?
64
+ end
65
+ end
@@ -0,0 +1,2 @@
1
+ module FeedbackHelper
2
+ end
@@ -0,0 +1,57 @@
1
+ # Rails Helper methods to take a hash and turn it to form <input type="hidden">
2
+ # fields, works with hash nested with other hashes and arrays, standard rails
3
+ # serialization style. Oddly while Hash#to_query will do this for a URL
4
+ # query parameters, there seems to be no built in way to do it to create
5
+ # hidden form fields instead.
6
+ #
7
+ # Code taken from http://marklunds.com/articles/one/314
8
+ #
9
+ # This is used to serialize a complete current query from current params
10
+ # to form fields used for sort and change per-page
11
+ module HashAsHiddenFields
12
+
13
+ # Writes out zero or more <input type="hidden"> elements, completely
14
+ # representing a hash passed in using Rails-style request parameters
15
+ # for hashes nested with arrays and other hashes.
16
+ def hash_as_hidden_fields(hash)
17
+
18
+ hidden_fields = []
19
+ flatten_hash(hash).each do |name, value|
20
+ value = [value] if !value.is_a?(Array)
21
+ value.each do |v|
22
+ hidden_fields << hidden_field_tag(name, v.to_s, :id => nil)
23
+ end
24
+ end
25
+
26
+ hidden_fields.join("\n").html_safe
27
+ end
28
+
29
+ protected
30
+
31
+ def flatten_hash(hash = params, ancestor_names = [])
32
+ flat_hash = {}
33
+ hash.each do |k, v|
34
+ names = Array.new(ancestor_names)
35
+ names << k
36
+ if v.is_a?(Hash)
37
+ flat_hash.merge!(flatten_hash(v, names))
38
+ else
39
+ key = flat_hash_key(names)
40
+ key += "[]" if v.is_a?(Array)
41
+ flat_hash[key] = v
42
+ end
43
+ end
44
+
45
+ flat_hash
46
+ end
47
+
48
+ def flat_hash_key(names)
49
+ names = Array.new(names)
50
+ name = names.shift.to_s.dup
51
+ names.each do |n|
52
+ name << "[#{n}]"
53
+ end
54
+ name
55
+ end
56
+
57
+ end
@@ -0,0 +1,120 @@
1
+ # All methods in here are 'api' that may be over-ridden by plugins and local
2
+ # code, so method signatures and semantics should not be changed casually.
3
+ # implementations can be of course.
4
+ #
5
+ # Includes methods for rendering contraints graphically on the
6
+ # search results page (render_constraints(_*)), and also
7
+ # for rendering more textually on Search History page
8
+ # (render_search_to_s(_*))
9
+ module RenderConstraintsHelper
10
+
11
+ # Render actual constraints, not including header or footer
12
+ # info.
13
+ def render_constraints(localized_params = params)
14
+ (render_constraints_query(localized_params) + render_constraints_filters(localized_params)).html_safe
15
+ end
16
+
17
+ def render_constraints_query(localized_params = params)
18
+ # So simple don't need a view template, we can just do it here.
19
+ if (!localized_params[:q].blank?)
20
+ label =
21
+ if (localized_params[:search_field] == Blacklight.default_search_field[:key] or localized_params[:search_field].blank? )
22
+ nil
23
+ else
24
+ Blacklight.label_for_search_field(localized_params[:search_field])
25
+ end
26
+
27
+ render_constraint_element(label,
28
+ localized_params[:q],
29
+ :classes => ["query"],
30
+ :remove => catalog_index_path(localized_params.merge(:q=>nil, :action=>'index')))
31
+ else
32
+ "".html_safe
33
+ end
34
+ end
35
+
36
+ def render_constraints_filters(localized_params = params)
37
+ return "".html_safe unless localized_params[:f]
38
+ content = ""
39
+ localized_params[:f].each_pair do |facet,values|
40
+ values.each do |val|
41
+ content << render_constraint_element( facet_field_labels[facet],
42
+ val,
43
+ :remove => catalog_index_path(remove_facet_params(facet, val, localized_params)),
44
+ :classes => ["filter", "filter-" + facet.parameterize]
45
+ ) + "\n"
46
+ end
47
+ end
48
+
49
+ return content.html_safe
50
+ end
51
+
52
+ # Render a label/value constraint on the screen. Can be called
53
+ # by plugins and such to get application-defined rendering.
54
+ #
55
+ # Can be over-ridden locally to render differently if desired,
56
+ # although in most cases you can just change CSS instead.
57
+ #
58
+ # Can pass in nil label if desired.
59
+ #
60
+ # options:
61
+ # [:remove]
62
+ # url to execute for a 'remove' action
63
+ # [:classes]
64
+ # can be an array of classes to add to container span for constraint.
65
+ # [:escape_label]
66
+ # default true, HTML escape.
67
+ # [:escape_value]
68
+ # default true, HTML escape.
69
+ def render_constraint_element(label, value, options = {})
70
+ render(:partial => "catalog/constraints_element", :locals => {:label => label, :value => value, :options => options})
71
+ end
72
+
73
+
74
+ # Simpler textual version of constraints, used on Search History page.
75
+ # Theoretically can may be DRY'd up with results page render_constraints,
76
+ # maybe even using the very same HTML with different CSS?
77
+ # But too tricky for now, too many changes to existing CSS. TODO.
78
+ def render_search_to_s(params)
79
+ render_search_to_s_q(params) +
80
+ render_search_to_s_filters(params)
81
+ end
82
+
83
+ def render_search_to_s_q(params)
84
+ return "".html_safe if params[:q].blank?
85
+
86
+ label = (params[:search_field] == Blacklight.default_search_field[:key]) ?
87
+ nil :
88
+ Blacklight.label_for_search_field(params[:search_field])
89
+
90
+ render_search_to_s_element(label , params[:q] )
91
+ end
92
+ def render_search_to_s_filters(params)
93
+ return "".html_safe unless params[:f]
94
+
95
+ params[:f].collect do |facet_field, value_list|
96
+ render_search_to_s_element(Blacklight.config[:facet][:labels][facet_field],
97
+ value_list.collect do |value|
98
+ render_filter_value(value)
99
+ end.join(content_tag(:span, 'and', :class =>'label')).html_safe
100
+ )
101
+ end.join(" \n ").html_safe
102
+ end
103
+
104
+ # value can be Array, in which case elements are joined with
105
+ # 'and'. Pass in option :escape_value => false to pass in pre-rendered
106
+ # html for value. key with escape_key if needed.
107
+ def render_search_to_s_element(key, value, options = {})
108
+ content_tag(:span, render_filter_name(key) + render_filter_value(value), :class => 'constraint')
109
+ end
110
+
111
+ def render_filter_name name
112
+ return "".html_safe if name.blank?
113
+ content_tag(:span, h(name) + ":", :class => 'filterName')
114
+ end
115
+
116
+ def render_filter_value value
117
+ content_tag(:span, h(value), :class => 'filterValue')
118
+ end
119
+
120
+ end
@@ -0,0 +1,2 @@
1
+ module SavedSearchesHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ module SearchHistoryHelper
2
+ end
@@ -0,0 +1,6 @@
1
+ class Bookmark < ActiveRecord::Base
2
+
3
+ belongs_to :user
4
+ validates_presence_of :user_id, :scope=>:document_id
5
+
6
+ end
@@ -0,0 +1,43 @@
1
+ # Only works for documents with a #to_marc right now.
2
+ class RecordMailer < ActionMailer::Base
3
+
4
+ def email_record(documents, details, from_host, url_gen_params)
5
+ #raise ArgumentError.new("RecordMailer#email_record only works with documents with a #to_marc") unless document.respond_to?(:to_marc)
6
+
7
+ recipients details[:to]
8
+ if documents.size == 1
9
+ subject = "Item Record: #{documents.first.to_semantic_values[:title] rescue 'N/A'}"
10
+ else
11
+ subject = "Item records"
12
+ end
13
+
14
+ @documents = documents
15
+ @message = details[:message]
16
+ @url_gen_params = url_gen_params
17
+
18
+ mail(:to => details[:to], :from => "no-reply@" << from_host, :subject => subject)
19
+ end
20
+
21
+ def sms_record(documents, details, from_host, url_gen_params)
22
+ if sms_mapping[details[:carrier]]
23
+ to = "#{details[:to]}@#{sms_mapping[details[:carrier]]}"
24
+ end
25
+ @documents = documents
26
+ @host = from_host
27
+ @url_gen_params = url_gen_params
28
+ mail(:to => to, :from => "no-reply@" << from_host, :subject => "")
29
+ end
30
+
31
+ protected
32
+
33
+ def sms_mapping
34
+ {'virgin' => 'vmobl.com',
35
+ 'att' => 'txt.att.net',
36
+ 'verizon' => 'vtext.com',
37
+ 'nextel' => 'messaging.nextel.com',
38
+ 'sprint' => 'messaging.sprintpcs.com',
39
+ 'tmobile' => 'tmomail.net',
40
+ 'alltel' => 'message.alltel.com',
41
+ 'cricket' => 'mms.mycricket.com'}
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ class Search < ActiveRecord::Base
2
+
3
+ belongs_to :user
4
+
5
+ serialize :query_params
6
+
7
+ # A Search instance is considered a saved search if it has a user_id.
8
+ def saved?
9
+ self.user_id?
10
+ end
11
+
12
+ # delete old, unsaved searches
13
+ def self.delete_old_searches(days_old)
14
+ raise ArgumentError.new('days_old is expected to be a number') unless days_old.is_a?(Numeric)
15
+ raise ArgumentError.new('days_old is expected to be greater than 0') if days_old <= 0
16
+ self.destroy_all(['created_at < ? AND user_id IS NULL', Date.today - days_old])
17
+ end
18
+
19
+ end
@@ -0,0 +1,6 @@
1
+ <% if flash_notice = flash[:notice] %>
2
+ <div class="ui-state-highlight ui-corner-all notice"><%= flash_notice %></div>
3
+ <% end %>
4
+ <% if flash_error = flash[:error] %>
5
+ <div class="ui-state-error ui-corner-all error"><%= flash_error %></div>
6
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <% if current_user %>
2
+ <%= link_to "Log Out", destroy_user_session_path %> [<%= link_to current_user, edit_user_registration_path %>]
3
+ <% if current_user.last_search_url %>
4
+ | <%= link_to('View your last search', catalog_index_path(current_user.last_search_url)) %><% end %> |
5
+ <%= link_to 'Your Bookmarks', bookmarks_path %> |
6
+ <%= link_to "Saved Searches", saved_searches_path %>
7
+ <% else %>
8
+ <%= link_to 'Login', new_user_session_path %>
9
+ <% end %>
10
+ |
11
+ <%= link_to "Selected Items", folder_index_path %> (<span id="folder_number"><%= "#{session[:folder_document_ids] ? session[:folder_document_ids].length : 0}" %></span>)
12
+ |
13
+ <%= link_to "Search History", search_history_path %>
@@ -0,0 +1,33 @@
1
+ <h1>Bookmarks</h1>
2
+
3
+ <%- if current_user.blank? -%>
4
+
5
+ <h2>Please log in to see your bookmarks.</h2>
6
+
7
+ <%- elsif @bookmarks.blank? -%>
8
+
9
+ <h2>You have no bookmarks</h2>
10
+
11
+ <%- else -%>
12
+
13
+ <%= will_paginate @bookmarks %>
14
+ <div id="userBookmarks">
15
+ <p>
16
+ <%= link_to "Clear Bookmarks", clear_bookmarks_path, :method => :delete, :confirm => "Clear your bookmarks?" %>
17
+ </p>
18
+
19
+ <h2>Your Bookmarks</h2>
20
+
21
+ <table class="zebra">
22
+ <% @bookmarks.each do |bm| %>
23
+ <tr>
24
+ <td><%= link_to h(bm.title), catalog_path(bm.document_id) %></td>
25
+ <td><%= button_to 'Remove', {:controller => "bookmarks", :action => "destroy", :id => bm.document_id},
26
+ :method => :delete, :confirm => 'Remove this bookmark?' %></td>
27
+ </tr>
28
+ <% end %>
29
+ </table>
30
+ </div>
31
+
32
+ <% end %>
33
+
@@ -0,0 +1,25 @@
1
+ <% if current_user %>
2
+ <%- existing_bookmark = current_user.existing_bookmark_for(document[:id]) -%>
3
+ <%-
4
+ # Note these two forms are pretty similar but for different :methods, classes, and labels.
5
+ # but it was simpler to leave them seperate instead of DRYing them, got confusing trying that.
6
+ # the data-doc-id attribute is used by our JS that converts to a checkbox/label.
7
+ -%>
8
+ <% unless existing_bookmark %>
9
+
10
+ <%= form_tag( bookmark_path( document[:id]), :method => :put, :class => "bookmark_toggle", "data-doc-id" => document[:id], :title=> document[document_show_link_field] ) do %>
11
+ <%= hidden_field(:bookmark, :title, :value => document[document_show_link_field] ) %>
12
+ <%= submit_tag("Bookmark", :id => "bookmark_toggle_#{document[:id]}", :class => "bookmark_add") %>
13
+ <% end %>
14
+
15
+ <% else %>
16
+
17
+ <%= form_tag( bookmark_path( document[:id]), :method => :delete, :class => "bookmark_toggle", "data-doc-id" => document[:id], :title=> document[document_show_link_field]) do %>
18
+ <%= hidden_field(:bookmark, :title, :value => document[document_show_link_field] ) %>
19
+ <%= submit_tag("Remove bookmark", :id => "bookmark_toggle_#{document[:id]}", :class => "bookmark_remove") %>
20
+ <% end %>
21
+
22
+ <% end %>
23
+ <% else %>
24
+ &nbsp;
25
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%= form_tag '/bookmarks', :name => "bookmarks" do %>
2
+ <% documents.each_with_index do |document, index| %>
3
+ <%= hidden_field_tag "bookmarks[#{index}][document_id]", document.get(:id)%>
4
+ <%= hidden_field_tag "bookmarks[#{index}][title]", h(document[document_show_link_field])%>
5
+ <% end %>
6
+ <%= link_to_function "Add to Bookmarks", "document.bookmarks.submit()" %>
7
+ <%= submit_tag 'Add to Bookmarks', :class => 'hide' %>
8
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <% @documents.each do |document| %>
2
+
3
+ <h1><%= citation_title(document) %></h1>
4
+
5
+ <% if document.respond_to?(:export_as_mla_citation_txt) %>
6
+ <h4>MLA</h4>
7
+ <%= document.send(:export_as_mla_citation_txt).html_safe %><br/><br/>
8
+ <% end %>
9
+
10
+ <% if document.respond_to?(:export_as_apa_citation_txt) %>
11
+ <h4>APA</h4>
12
+ <%= document.send(:export_as_apa_citation_txt).html_safe %>
13
+ <% end %>
14
+
15
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <div id="appliedParams">
2
+
3
+ <h3 class="label">You searched for:</h3>
4
+
5
+ <%= render_constraints(localized_params) %>
6
+
7
+ </div>