spree_reviews 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/README.markdown +43 -0
  2. data/Rakefile +120 -0
  3. data/TODO +8 -0
  4. data/app/controllers/admin/feedback_reviews_controller.rb +16 -0
  5. data/app/controllers/admin/review_settings_controller.rb +13 -0
  6. data/app/controllers/admin/reviews_controller.rb +36 -0
  7. data/app/controllers/feedback_reviews_controller.rb +17 -0
  8. data/app/controllers/reviews_controller.rb +30 -0
  9. data/app/helpers/admin/feedback_reviews_helper.rb +2 -0
  10. data/app/helpers/feedback_reviews_helper.rb +2 -0
  11. data/app/helpers/reviews_helper.rb +17 -0
  12. data/app/models/feedback_review.rb +10 -0
  13. data/app/models/product_decorator.rb +14 -0
  14. data/app/models/rating.rb +20 -0
  15. data/app/models/review.rb +20 -0
  16. data/app/models/reviews_configuration.rb +7 -0
  17. data/app/views/admin/feedback_reviews/index.html.erb +21 -0
  18. data/app/views/admin/review_settings/edit.html.erb +18 -0
  19. data/app/views/admin/review_settings/show.html.erb +18 -0
  20. data/app/views/admin/reviews/_form.html.erb +10 -0
  21. data/app/views/admin/reviews/edit.html.erb +17 -0
  22. data/app/views/admin/reviews/index.html.erb +45 -0
  23. data/app/views/feedback_reviews/_form.html.erb +14 -0
  24. data/app/views/feedback_reviews/_summary.html.erb +6 -0
  25. data/app/views/feedback_reviews/create.js.erb +7 -0
  26. data/app/views/reviews/_fine_print.html.erb +7 -0
  27. data/app/views/reviews/_stars.html.erb +21 -0
  28. data/app/views/reviews/_stars0.html.erb +1 -0
  29. data/app/views/reviews/_stars1.html.erb +1 -0
  30. data/app/views/reviews/_stars2.html.erb +1 -0
  31. data/app/views/reviews/_stars3.html.erb +1 -0
  32. data/app/views/reviews/_stars4.html.erb +1 -0
  33. data/app/views/reviews/_stars5.html.erb +1 -0
  34. data/app/views/reviews/index.html.erb +2 -0
  35. data/app/views/reviews/new.html.erb +47 -0
  36. data/app/views/reviews/submissionguidelines.html.erb +6 -0
  37. data/app/views/reviews/terms.html.erb +6 -0
  38. data/app/views/shared/_rating.html.erb +16 -0
  39. data/app/views/shared/_review.html.erb +14 -0
  40. data/app/views/shared/_review_summary.html.erb +13 -0
  41. data/app/views/shared/_reviews.html.erb +9 -0
  42. data/app/views/shared/_shortrating.html.erb +11 -0
  43. data/config/locales/de.yml +40 -0
  44. data/config/locales/en-GB.yml +23 -0
  45. data/config/locales/en.yml +53 -0
  46. data/config/locales/fr-FR.yml +19 -0
  47. data/config/locales/ru.yml +47 -0
  48. data/config/routes.rb +22 -0
  49. data/db/migrate/20081020220700_create_ratings.rb +14 -0
  50. data/db/migrate/20081020220724_create_reviews.rb +18 -0
  51. data/db/migrate/20101222083309_create_feedback_reviews.rb +17 -0
  52. data/db/sample/ratings.yml +16 -0
  53. data/db/sample/reviews.yml +59 -0
  54. data/lib/spree/reviews/config.rb +11 -0
  55. data/lib/spree_reviews.rb +17 -0
  56. data/lib/spree_reviews_hook.rb +17 -0
  57. data/lib/tasks/reviews_extension_tasks.rake +25 -0
  58. data/public/images/delete.gif +0 -0
  59. data/public/images/star.gif +0 -0
  60. data/public/javascripts/jquery.rating.js +11 -0
  61. data/public/stylesheets/reviews.css +44 -0
  62. data/spec/controllers/reviews_controller_spec.rb +15 -0
  63. data/spec/helpers/reviews_helper_spec.rb +11 -0
  64. data/spec/models/ratings_spec.rb +11 -0
  65. data/spec/models/reviews_spec.rb +11 -0
  66. data/spec/spec.opts +6 -0
  67. data/spec/spec_helper.rb +37 -0
  68. data/spec/views/reviews/submit_view_spec.rb +12 -0
  69. data/spree_reviews.gemspec +22 -0
  70. metadata +145 -0
@@ -0,0 +1,18 @@
1
+ <%= render :partial => 'admin/shared/configuration_menu' %>
2
+
3
+ <h1><%= t("reviews.review_settings") %></h1>
4
+
5
+ <table>
6
+ <tr>
7
+ <th scope="row"><%= t("reviews.include_unapproved") %>:</th>
8
+ <td><%= Spree::Reviews::Config[:include_unapproved_reviews] %></td>
9
+ </tr>
10
+ <tr>
11
+ <th scope="row"><%= t("reviews.preview_size") %>:</th>
12
+ <td><%= Spree::Reviews::Config[:preview_size] %></td>
13
+ </tr>
14
+ </table>
15
+
16
+ <p>
17
+ <%= link_to_with_icon('edit', t("edit"), edit_admin_review_settings_path) %>
18
+ </p>
@@ -0,0 +1,10 @@
1
+ <%= error_messages_for :review %>
2
+ <br />
3
+ <p>
4
+ <%= form.text_area :review, :cols => 60, :rows => 10 %>
5
+ </p>
6
+ <br/>
7
+ <p>
8
+ <%= form.submit button_name %>
9
+ </p>
10
+
@@ -0,0 +1,17 @@
1
+ <h1>Editing review for <%= link_to @review.product.name, product_path(@review.product) %></h1>
2
+
3
+ <h2>Original version</h2>
4
+
5
+ <p>
6
+ <%= @review.review %>
7
+ </p>
8
+ <br/>
9
+
10
+ <h2>Edited version</h2>
11
+
12
+ <% form_for([:admin, @review]) do |f| %>
13
+ <%= render :partial => f,
14
+ :locals => { :button_name => "Update" } %>
15
+ <% end %>
16
+
17
+ <%= link_to t('back_reviews'), admin_reviews_path %>
@@ -0,0 +1,45 @@
1
+ <h1><%= t('review_management_description') %></h1>
2
+
3
+ <% for reviews in [["Unapproved", @unapproved_reviews], ["Approved", @approved_reviews]] %>
4
+ <h2><%= t(reviews[0]+"_reviews") %></h2>
5
+
6
+ <table cellspacing=6 class="index">
7
+ <tr>
8
+ <th><%= t('date_') %></th>
9
+ <th><%= t('user') %></th>
10
+ <th><%= t('review_title') %> / <%= t('product') %></th>
11
+ <th><%= t('review_content') %></th>
12
+ <th></th>
13
+ </tr>
14
+
15
+ <% for review in reviews[1] %>
16
+ <tr>
17
+ <td>
18
+ <%= l review.created_at %>
19
+ </td>
20
+ <td>
21
+ <%= review.name %><%= t('from') %> <%= review.location %>
22
+ </td>
23
+ <td>
24
+ <%= h review.title %>
25
+ <br/>
26
+ <%= t('for') %> <%= link_to review.product.name, product_path(review.product) %>
27
+ </td>
28
+ <td style="border: 1px dashed green" width="60%">
29
+ <br/>
30
+ <%= h review.review %>
31
+ </td>
32
+ <td>
33
+ <% unless review.approved %>
34
+ <%= link_to t('approve'), {:action => 'approve', :id => review.id} %> <br />
35
+ <% end %>
36
+ <%= link_to t('feedback'), admin_review_feedback_reviews_path(review) %>(<%= review.feedback_stars %>/<%= review.feedback_reviews.count %>) <br/>
37
+ <%= link_to t('edit'), [:edit, :admin, review] %> <br/>
38
+ <%= link_to t('destroy'), [:admin, review], :method => :delete, :confirm => t('are_you_sure_review') %>
39
+
40
+ </td>
41
+ </tr>
42
+ <% end %>
43
+ </table>
44
+ <br/>
45
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <%= render :partial => "feedback_reviews/summary", :locals => {:review => review}%>
2
+ <%= form_for((@feedback_review ||= review.feedback_reviews.build), :url => feedback_review_path(review), :method => :post, :remote => true) do |f| %>
3
+ <% unless @feedback_review.errors.empty? %>
4
+ <span class="error"><%= @feedback_review.errors[:rating] %></span>
5
+ <br />
6
+ <% end %>
7
+
8
+ <%= t(:was_this_review_helpful) %>
9
+ <% for i in 1..Rating.get_nb_stars %>
10
+ <%= radio_button_tag "feedback_review[rating]", pluralize(i, 'stars'), false, :class => "star" %>
11
+ <% end %>
12
+ <%= hidden_field_tag "feedback_review[user_id]", current_user.try(:id) %>
13
+ <button class="feedback-review"><span><%= t("yes") %></span></button>
14
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <p>
2
+ <%= t('voice', :count => review.feedback_reviews.count) %>.
3
+ <span title="<%=pluralize(review.feedback_stars, 'star')%> out of 5">
4
+ <%= render :partial => "reviews/stars", :locals => {:stars => review.feedback_stars} %>
5
+ </span> &nbsp;
6
+ </p>
@@ -0,0 +1,7 @@
1
+ <% if @feedback_review.valid? %>
2
+ $("div#feedback_review_<%= @review.id %>").html("<%= escape_javascript(render(:partial => "feedback_reviews/summary", :locals => {:review => @review})) %>");
3
+ <% else %>
4
+ $("div#feedback_review_<%= @review.id %>").html("<%= escape_javascript(render(:partial => "feedback_reviews/form", :locals => {:review => @review})) %>");
5
+
6
+ <% end %>
7
+ $(document).ready(function(){$("div#feedback_review_<%= @review.id %>").find(".star").rating({required:true});});
@@ -0,0 +1,7 @@
1
+ <br/>
2
+ <h2><%= t('the_fine_print') %></h2>
3
+ <ul>
4
+ <li><%= t('terms_text') %>: <%= link_to t("terms and conditions"), url_for(:action => 'terms') %></li>
5
+ <li><%= t('approved_text') %></li>
6
+ <li><%= t('guideline_text') %>: <%= link_to t("review guidelines"), url_for(:action => 'submissionguidelines') %></li>
7
+ </ul>
@@ -0,0 +1,21 @@
1
+ <% content_for :head do %>
2
+ <%= javascript_include_tag("jquery.rating.js") %>
3
+ <%= javascript_tag("$(document).ready(function(){$('.stars').rating({required:true});});") %>
4
+ <% end %>
5
+
6
+ <% if defined? edit_enabled
7
+ state = ""
8
+ name = "review[rating]"
9
+ else
10
+ state = 'disabled="disabled"'
11
+ name = defined?(review).nil? ? Time.now.tv_usec.to_s : "review_#{review}"
12
+ end %>
13
+ <% for i in 1..Rating.get_nb_stars %>
14
+ <input name="<%= name %>"
15
+ type="radio" class="star"
16
+ value="<%= pluralize(i, 'stars') %>" <%= state %>
17
+ <%= "checked=\"checked\"" if i==stars %> />
18
+ <% end %>
19
+
20
+
21
+
@@ -0,0 +1 @@
1
+ <span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span>
@@ -0,0 +1 @@
1
+ <span class="lit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span>
@@ -0,0 +1 @@
1
+ <span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span>
@@ -0,0 +1 @@
1
+ <span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="unlit"> &#10030; </span><span class="unlit"> &#10030; </span>
@@ -0,0 +1 @@
1
+ <span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="unlit"> &#10030; </span>
@@ -0,0 +1 @@
1
+ <span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="lit"> &#10030; </span><span class="lit"> &#10030;</span>
@@ -0,0 +1,2 @@
1
+
2
+ <%= render :partial => 'shared/reviews' %>
@@ -0,0 +1,47 @@
1
+ <% content_for :head do %>
2
+ <%= stylesheet_link_tag 'reviews.css' %>
3
+ <% end %>
4
+ <!-- <h1>Product review submission</h1> -->
5
+
6
+ <h2> <%= I18n.t('leave_us_a_review_for') + ' "' + @product.name + '"' %> </h2>
7
+
8
+ <%= form_for @review, :url => {:action => 'create'} do |f| %>
9
+ <%= render "shared/error_messages", :target => @review %>
10
+ <%= f.hidden_field :product_id, :value => @product.id %>
11
+
12
+ <table cellspacing="0" cellpadding="2">
13
+ <tbody>
14
+ <tr valign="top">
15
+ <td style="padding-top: 5px; padding-bottom: 5px;" class="fieldtitle right nowrap">
16
+ <strong><%= I18n.t('rating') %></strong>
17
+ </td>
18
+ <td style="padding-top: 5px; padding-bottom: 5px;">
19
+ <%= render :partial => "reviews/stars", :locals => {:stars => @review.rating, :edit_enabled => true} %>
20
+ </td>
21
+ </tr>
22
+ <tr valign="top">
23
+ <td class="fieldtitle right nowrap">
24
+ <%= f.label :title, raw("<strong>#{ I18n.t('review_title')}</strong>") %>
25
+ </td>
26
+ <td>
27
+ <%= f.text_field :title, :maxlength => "255", :size => "50" %>
28
+ </td>
29
+ </tr>
30
+ <tr valign="top">
31
+ <td class="fieldtitle right nowrap">
32
+ <%= f.label :review, raw("<strong>#{ I18n.t('review_content')}</strong>") %>
33
+ </td>
34
+ <td>
35
+ <%= f.text_area :review, :wrap => "virtual", :rows => "10", :cols => "50" %>
36
+ </td>
37
+ </tr>
38
+ <tr>
39
+ <td> </td>
40
+ <td style="padding-top: 5px;">
41
+ <%= f.submit I18n.t('submit_your_review'), :class => "button bg_darkfirst".html_safe %>
42
+ </td>
43
+ </tr>
44
+ </tbody></table>
45
+ <% end %>
46
+
47
+ <%= render :partial => "fine_print" %>
@@ -0,0 +1,6 @@
1
+ <h2> <%= t('submission_guidelines') %> </h2>
2
+
3
+ <p>
4
+ Dummy document - expected to be over-ridden in specific instantiations
5
+ </p>
6
+
@@ -0,0 +1,6 @@
1
+ <h2> <%= t('terms_and_conditions') %> </h2>
2
+
3
+ <p>
4
+ Dummy document - expected to be over-ridden in specific instantiations
5
+ </p>
6
+
@@ -0,0 +1,16 @@
1
+ <% content_for :head do %>
2
+ <%= stylesheet_link_tag 'reviews.css' %>
3
+ <% end %>
4
+ <% stars = product.get_stars %>
5
+ <div class="header clear">
6
+ <%= t 'average_customer_rating' %>:
7
+ <br/>
8
+ <span title="<%= txt_stars(stars[0]) %>">
9
+ <%= render :partial => "reviews/stars", :locals => {:stars => stars[0]} %>
10
+ </span> &nbsp;
11
+ <br/>
12
+ (<%= t('based_upon') %> <%= t('review', :count => stars[1]) %>)
13
+ <br/>
14
+ <br/>
15
+ </div>
16
+
@@ -0,0 +1,14 @@
1
+ <div class="review">
2
+ <span title="<%= txt_stars(review.rating) %>">
3
+ <%= render :partial => "reviews/stars", :locals => {:stars => review.rating} %>
4
+ </span>
5
+ &nbsp; <span class="title"><%= review.title %> </span>
6
+ <br/>
7
+ <span class="attribution"><%= t('submitted_on') %> <strong><%= l review.created_at.to_date %></strong></span>
8
+ <p>
9
+ <%= review.review %>
10
+ </p>
11
+ <div id="feedback_review_<%= review.id %>">
12
+ <%= render :partial => "feedback_reviews/form", :locals => {:review => review} %>
13
+ </div>
14
+ </div>
@@ -0,0 +1,13 @@
1
+ <%# provisional snapshot of review info %>
2
+ <% content_for :head do %>
3
+ <%= stylesheet_link_tag 'reviews.css' %>
4
+ <% end %>
5
+ <div id="reviews">
6
+ <%= render :partial => 'shared/rating', :locals => {:product => @product, :review => 0} %>
7
+ <% for review in @product.reviews.approval_filter.preview %>
8
+ <%= render :partial => 'shared/review', :locals => {:review => review} %>
9
+ <% end %>
10
+
11
+ <%= link_to t('write_your_own_review'), new_product_review_path(@product), :class => "button" %>
12
+ </div>
13
+
@@ -0,0 +1,9 @@
1
+ <div id="reviews">
2
+ <%= render :partial => 'shared/rating', :locals => {:product => @product, :review => 0} %>
3
+ <% for review in @product.reviews.approval_filter %>
4
+ <%= render :partial => 'shared/review', :locals => {:review => review} %>
5
+ <% end %>
6
+
7
+ <%= link_to t('write_your_own_review'), new_product_review_path(@product), :class => "button" %>
8
+ </div>
9
+
@@ -0,0 +1,11 @@
1
+ <% content_for :head do %>
2
+ <%= stylesheet_link_tag 'reviews.css' %>
3
+ <% end %>
4
+ <% stars = product.get_stars %>
5
+ <span style="float:left;" title="<%= txt_stars(stars[0]) %>">
6
+ <%= render :partial => "reviews/stars", :locals => {:stars => stars[0]} %>
7
+ </span>
8
+ <span style="float:right;">
9
+ <%= t('review', :count => stars[1]) %>
10
+ </span>
11
+ <br/>
@@ -0,0 +1,40 @@
1
+ de:
2
+ write_your_own_review: Schreibe uns deine Meinung
3
+ review_management: Meinungsverwaltung
4
+ review_management_description: Verwalte Kundenmeinungen
5
+ back_reviews: Zurück zu den Kundenmeinungen
6
+ are_you_sure_review: Bist du sicher, dass du deine Meinung löschen willst?
7
+ info_approve_review: Meinung veröffentlicht
8
+ error_approve_review: Fehler bei der Meinungsveröffentlichung
9
+ approve: Veröffentlichen
10
+ leave_us_a_review_for: Deine Meinung über
11
+ review_successfully_submitted: Meinung erfolgreich übertragen
12
+ rating: Bewertung
13
+ submit_your_review: Meinung übertragen
14
+ review_content: Inhalt
15
+ review_title: Titel
16
+ reviews:
17
+ review_settings: Meinungseinstellungen
18
+ manage_review_settings: Meinungsdarstellungesoptionen
19
+ preview_size: Größe der Meinungen
20
+ include_unapproved: Unveröffentlichte Meinungen anzeigen
21
+ your_name: Dein Anzeigename
22
+ your_location: Dein Ort
23
+ average_customer_rating: Durchschnittliche Bewertung
24
+ the_fine_print: Kleingedrucktes
25
+ terms_text: Alle Meinungen werden müssen unseren Bedingen einhalten
26
+ approved_text: Freigeschalte Kommentare werden in 1-2 Werktagen veröffentlicht.
27
+ guideline_text: Meinungen die unseren den verlinkten Richtlinen nicht genügen werden nicht veröffentlicht
28
+ "terms and conditions": Bedingungen
29
+ "review guidelines": Richtlinien
30
+ date_: Datum
31
+ for: über
32
+ Unapproved_reviews: Nicht freigeschaltete Meinungen
33
+ Approved_reviews: Freigeschaltete Meinungen
34
+ from: aus
35
+ by: Von
36
+ submitted_on: Eingeschickt am
37
+ based_upon: basiert auf
38
+ review:
39
+ one: einer Bewertung
40
+ other: %{count} Bewertungen
@@ -0,0 +1,23 @@
1
+ en-GB:
2
+ write_your_own_review: Write your own review
3
+ review_management: Review Management
4
+ review_management_description: Manage the user-submitted reviews
5
+ back_reviews: Back to the reviews
6
+ are_you_sure_review: Are you sure to delete review ?
7
+ info_approve_review: Review approved
8
+ error_approve_review: Error approving review
9
+ approve: Approve
10
+ leave_us_a_review: Please leave us a review and a rating for our
11
+ review_successfully_submitted: Review was successfully submitted
12
+ rating: rating
13
+ submit_your_review: Submit your review
14
+ review_content: Content
15
+ review_title: Title
16
+ reviews:
17
+ review_settings: Review Settings
18
+ manage_review_settings: Control the display of reviews
19
+ preview_size: Size of the review snippets
20
+ include_unapproved: Include unapproved reviews in listings
21
+ your_name: Your name
22
+ your_location: Your location
23
+
@@ -0,0 +1,53 @@
1
+ en:
2
+ write_your_own_review: Write your own review
3
+ review_management: Review Management
4
+ review_management_description: Manage the user-submitted reviews
5
+ back_reviews: Back to the reviews
6
+ are_you_sure_review: Are you sure to delete review ?
7
+ info_approve_review: Review approved
8
+ error_approve_review: Error approving review
9
+ approve: Approve
10
+ leave_us_a_review_for: Please leave us a review and a rating for our
11
+ review_successfully_submitted: Review was successfully submitted
12
+ rating: rating
13
+ submit_your_review: Submit your review
14
+ review_content: Content
15
+ review_title: Title
16
+ reviews:
17
+ review_settings: Review Settings
18
+ manage_review_settings: Control the display of reviews
19
+ preview_size: Size of the review snippets
20
+ include_unapproved: Include unapproved reviews in listings
21
+ your_name: Your name
22
+ your_location: Your location
23
+ average_customer_rating: Average rating
24
+ the_fine_print: The fine print
25
+ terms_text: All opinions must comply with our terms and conditions
26
+ approved_text: Unlocked comments will be published within 1-2 business days.
27
+ guideline_text: We reserve the right not to post opinions unrelated to your product
28
+ "terms and conditions": Terms & Conditions
29
+ "review guidelines": Review Guidelines
30
+ date_: Date
31
+ for: for
32
+ Unapproved_reviews: Unapproved
33
+ Approved_reviews: Approved
34
+ from: from
35
+ by: by
36
+ submitted_on: Submitted on
37
+ based_upon: based upon
38
+ review:
39
+ one: one review
40
+ other: %{count} reviews
41
+ star:
42
+ one: "1"
43
+ other: "%{count}"
44
+ voice:
45
+ one: "1 voice"
46
+ other: "%{count} voices"
47
+
48
+ feedback: Feedback
49
+ stars: Stars
50
+ feedback_review_for: "Review: '%{review}'"
51
+ out_of_5: "out of 5"
52
+ was_this_review_helpful: "Was this review helpful to you?"
53
+ you_must_enter_value_for_rating: "You must enter a value for rating."