solidus_reviews 1.0.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +35 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +17 -0
  5. data/.gitignore +12 -8
  6. data/.rspec +1 -1
  7. data/.rubocop.yml +2 -0
  8. data/.rubocop_todo.yml +221 -0
  9. data/CHANGELOG.md +132 -0
  10. data/Gemfile +17 -3
  11. data/{LICENSE.md → LICENSE} +2 -2
  12. data/README.md +33 -50
  13. data/Rakefile +5 -18
  14. data/app/controllers/spree/admin/feedback_reviews_controller.rb +3 -1
  15. data/app/controllers/spree/admin/review_settings_controller.rb +3 -1
  16. data/app/controllers/spree/admin/reviews_controller.rb +9 -6
  17. data/app/controllers/spree/feedback_reviews_controller.rb +19 -19
  18. data/app/controllers/spree/reviews_controller.rb +38 -7
  19. data/app/decorators/controllers/solidus_reviews/spree/products_controller_decorator.rb +15 -0
  20. data/app/decorators/helpers/solidus_reviews/spree/api/api_helpers_decorator.rb +33 -0
  21. data/app/decorators/models/solidus_reviews/spree/product_decorator.rb +31 -0
  22. data/app/decorators/models/solidus_reviews/spree/user_decorator.rb +15 -0
  23. data/app/helpers/spree/reviews_helper.rb +15 -5
  24. data/app/models/spree/feedback_review.rb +7 -6
  25. data/app/models/spree/permission_sets/review_display.rb +11 -0
  26. data/app/models/spree/permission_sets/review_management.rb +11 -0
  27. data/app/models/spree/review.rb +46 -13
  28. data/app/models/spree/reviews_ability.rb +24 -5
  29. data/app/models/spree/reviews_configuration.rb +25 -8
  30. data/app/overrides/add_reviews_after_product_properties.rb +7 -5
  31. data/app/overrides/add_reviews_tab_to_admin.rb +20 -4
  32. data/app/overrides/add_reviews_to_admin_configuration_sidebar.rb +20 -5
  33. data/app/views/spree/admin/feedback_reviews/index.html.erb +9 -9
  34. data/app/views/spree/admin/review_settings/edit.html.erb +71 -35
  35. data/app/views/spree/admin/reviews/_form.html.erb +26 -5
  36. data/app/views/spree/admin/reviews/edit.html.erb +5 -3
  37. data/app/views/spree/admin/reviews/index.html.erb +104 -88
  38. data/app/views/spree/api/reviews/_feedback_review.json.jbuilder +5 -0
  39. data/app/views/spree/api/reviews/_review.json.jbuilder +11 -0
  40. data/app/views/spree/api/reviews/index.json.jbuilder +6 -0
  41. data/app/views/spree/api/reviews/show.json.jbuilder +3 -0
  42. data/app/views/spree/feedback_reviews/_form.html.erb +5 -5
  43. data/app/views/spree/feedback_reviews/_summary.html.erb +3 -3
  44. data/app/views/spree/feedback_reviews/create.js.erb +2 -2
  45. data/app/views/spree/reviews/_form.html.erb +17 -10
  46. data/app/views/spree/reviews/edit.html.erb +3 -0
  47. data/app/views/spree/reviews/new.html.erb +2 -2
  48. data/app/views/spree/shared/_rating.html.erb +3 -3
  49. data/app/views/spree/shared/_review.html.erb +31 -19
  50. data/app/views/spree/shared/_review_summary.html.erb +3 -3
  51. data/app/views/spree/shared/_reviews.html.erb +6 -6
  52. data/app/views/spree/shared/_shortrating.html.erb +2 -2
  53. data/bin/console +17 -0
  54. data/bin/rails +13 -3
  55. data/bin/setup +8 -0
  56. data/config/initializers/constants.rb +2 -0
  57. data/config/initializers/load_preferences.rb +2 -0
  58. data/config/locales/de-CH.yml +15 -2
  59. data/config/locales/de.yml +15 -2
  60. data/config/locales/en-GB.yml +16 -3
  61. data/config/locales/en.yml +16 -2
  62. data/config/locales/es.yml +16 -3
  63. data/config/locales/fr.yml +15 -3
  64. data/config/locales/it.yml +79 -0
  65. data/config/locales/pl.yml +15 -3
  66. data/config/locales/pt-BR.yml +15 -3
  67. data/config/locales/pt.yml +15 -3
  68. data/config/locales/ro.yml +16 -4
  69. data/config/locales/ru.yml +14 -2
  70. data/config/locales/sv.yml +15 -2
  71. data/config/locales/tr.yml +15 -3
  72. data/config/locales/uk.yml +15 -2
  73. data/config/locales/zh-CN.yml +15 -2
  74. data/config/locales/zh-TW.yml +15 -2
  75. data/config/routes.rb +21 -2
  76. data/db/migrate/20081020220724_create_reviews.rb +4 -2
  77. data/db/migrate/20101222083309_create_feedback_reviews.rb +5 -3
  78. data/db/migrate/20110406083603_add_rating_to_products.rb +7 -5
  79. data/db/migrate/20110606150524_add_user_to_reviews.rb +4 -2
  80. data/db/migrate/20110806093221_add_ip_address_to_reviews.rb +3 -1
  81. data/db/migrate/20120110172331_namespace_tables.rb +3 -1
  82. data/db/migrate/20120123141326_recalculate_ratings.rb +7 -7
  83. data/db/migrate/20120712182514_add_locale_to_reviews.rb +4 -2
  84. data/db/migrate/20120712182627_add_locale_to_feedback_reviews.rb +4 -2
  85. data/db/migrate/20140703200946_add_show_identifier_to_reviews.rb +3 -1
  86. data/db/migrate/20190613165528_add_verified_purchaser_to_reviews.rb +7 -0
  87. data/lib/controllers/spree/api/feedback_reviews_controller.rb +91 -0
  88. data/lib/controllers/spree/api/reviews_controller.rb +113 -0
  89. data/lib/generators/solidus_reviews/install/install_generator.rb +5 -4
  90. data/lib/solidus_reviews.rb +7 -5
  91. data/lib/solidus_reviews/engine.rb +26 -0
  92. data/lib/solidus_reviews/factories.rb +3 -1
  93. data/lib/solidus_reviews/factories/feedback_review_factory.rb +6 -5
  94. data/lib/solidus_reviews/factories/review_factory.rb +19 -9
  95. data/lib/solidus_reviews/version.rb +5 -0
  96. data/solidus_reviews.gemspec +32 -32
  97. data/spec/controllers/{admin → spree/admin}/feedback_reviews_controller_spec.rb +10 -8
  98. data/spec/controllers/spree/admin/review_settings_controller_spec.rb +58 -0
  99. data/spec/controllers/spree/admin/reviews_controller_spec.rb +65 -0
  100. data/spec/controllers/spree/api/feedback_reviews_controller_spec.rb +136 -0
  101. data/spec/controllers/spree/api/reviews_controller_spec.rb +238 -0
  102. data/spec/controllers/spree/feedback_reviews_controller_spec.rb +75 -0
  103. data/spec/controllers/spree/reviews_controller_spec.rb +298 -0
  104. data/spec/features/admin_spec.rb +9 -6
  105. data/spec/features/reviews_spec.rb +54 -37
  106. data/spec/helpers/review_helper_spec.rb +3 -2
  107. data/spec/models/feedback_review_spec.rb +19 -17
  108. data/spec/models/product_spec.rb +49 -24
  109. data/spec/models/review_spec.rb +133 -52
  110. data/spec/models/reviews_ability_spec.rb +16 -14
  111. data/spec/models/reviews_configuration_spec.rb +46 -26
  112. data/spec/spec_helper.rb +13 -44
  113. data/spec/support/config.rb +7 -0
  114. data/spec/support/factories.rb +3 -0
  115. data/vendor/assets/javascripts/jquery.rating.js +389 -376
  116. metadata +81 -190
  117. data/.travis.yml +0 -18
  118. data/CONTRIBUTING.md +0 -28
  119. data/app/controllers/spree/products_controller_decorator.rb +0 -5
  120. data/app/models/spree/product_decorator.rb +0 -21
  121. data/lib/spree_reviews/engine.rb +0 -17
  122. data/spec/controllers/admin/review_settings_controller_spec.rb +0 -57
  123. data/spec/controllers/admin/reviews_controller_spec.rb +0 -63
  124. data/spec/controllers/feedback_reviews_controller_spec.rb +0 -71
  125. data/spec/controllers/products_controller_spec.rb +0 -9
  126. data/spec/controllers/reviews_controller_spec.rb +0 -136
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusReviews
4
+ module Spree
5
+ module ProductDecorator
6
+ def self.prepended(base)
7
+ base.class_eval do
8
+ has_many :reviews
9
+ end
10
+ end
11
+
12
+ def stars
13
+ avg_rating.try(:round) || 0
14
+ end
15
+
16
+ def recalculate_rating
17
+ reviews_count = reviews.reload.default_approval_filter.count
18
+
19
+ self.reviews_count = reviews_count
20
+ self.avg_rating = if reviews_count > 0
21
+ '%.1f' % (reviews.default_approval_filter.sum(:rating).to_f / reviews_count)
22
+ else
23
+ 0
24
+ end
25
+ save
26
+ end
27
+
28
+ ::Spree::Product.prepend self
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusReviews
4
+ module Spree
5
+ module UserDecorator
6
+ def self.prepended(base)
7
+ base.class_eval do
8
+ has_many :reviews, class_name: 'Spree::Review'
9
+ end
10
+ end
11
+
12
+ ::Spree.user_class.prepend self
13
+ end
14
+ end
15
+ end
@@ -1,17 +1,27 @@
1
- module Spree::ReviewsHelper
1
+ # frozen_string_literal: true
2
2
 
3
+ module Spree::ReviewsHelper
3
4
  def star(the_class)
4
- content_tag(:span, " ✮ ".html_safe, :class => the_class)
5
+ content_tag(:span, " ✮ ".html_safe, class: the_class)
5
6
  end
6
7
 
7
8
  def mk_stars(m)
8
- (1..5).collect {|n| n <= m ? star("lit") : star("unlit") }.join
9
+ (1..5).collect { |n| n <= m ? star("lit") : star("unlit") }.join
9
10
  end
10
11
 
11
12
  def txt_stars(n, show_out_of = true)
12
- res = Spree.t('star', :count => n)
13
- res += " #{Spree.t('out_of_5')}" if show_out_of
13
+ res = I18n.t('spree.star', count: n)
14
+ res += " #{I18n.t('spree.out_of_5')}" if show_out_of
14
15
  res
15
16
  end
16
17
 
18
+ def display_verified_purchaser?(review)
19
+ Spree::Reviews::Config[:show_verified_purchaser] && review.user &&
20
+ Spree::LineItem.joins(:order, :variant)
21
+ .where.not(spree_orders: { completed_at: nil })
22
+ .find_by(
23
+ spree_variants: { product_id: review.product_id },
24
+ spree_orders: { user_id: review.user_id }
25
+ ).present?
26
+ end
17
27
  end
@@ -1,17 +1,18 @@
1
- class Spree::FeedbackReview < ActiveRecord::Base
2
- belongs_to :user, :class_name => Spree.user_class.to_s
1
+ # frozen_string_literal: true
3
2
 
4
- belongs_to :review, dependent: :destroy
3
+ class Spree::FeedbackReview < ApplicationRecord
4
+ belongs_to :user, class_name: Spree.user_class.to_s, optional: true
5
+
6
+ belongs_to :review, touch: true
5
7
  validates :review, presence: true
6
8
 
7
9
  validates :rating, numericality: { only_integer: true,
8
- greater_than_or_equal_to: 1,
10
+ greater_than_or_equal_to: 1,
9
11
  less_than_or_equal_to: 5,
10
- message: Spree.t('you_must_enter_value_for_rating') }
12
+ message: :you_must_enter_value_for_rating }
11
13
 
12
14
  scope :most_recent_first, -> { order("spree_feedback_reviews.created_at DESC") }
13
15
  default_scope { most_recent_first }
14
16
 
15
17
  scope :localized, lambda { |lc| where('spree_feedback_reviews.locale = ?', lc) }
16
-
17
18
  end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module PermissionSets
5
+ class ReviewDisplay < PermissionSets::Base
6
+ def activate!
7
+ can [:display, :admin], Spree::Review
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module PermissionSets
5
+ class ReviewManagement < PermissionSets::Base
6
+ def activate!
7
+ can :manage, Spree::Review
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,22 +1,24 @@
1
- class Spree::Review < ActiveRecord::Base
2
- belongs_to :product, touch: true
3
- belongs_to :user, :class_name => Spree.user_class.to_s
4
- has_many :feedback_reviews
1
+ # frozen_string_literal: true
5
2
 
6
- after_save :recalculate_product_rating, :if => :approved?
7
- after_destroy :recalculate_product_rating
3
+ class Spree::Review < ApplicationRecord
4
+ belongs_to :product, touch: true, optional: true
5
+ belongs_to :user, class_name: Spree.user_class.to_s, optional: true
6
+ has_many :feedback_reviews, dependent: :destroy
7
+ has_many :images, -> { order(:position) }, as: :viewable,
8
+ dependent: :destroy, class_name: "Spree::Image"
8
9
 
9
- validates :name, presence: true
10
- validates :review, presence: true
10
+ before_save :verify_purchaser
11
+ before_save :approve_review, unless: :approved?
12
+ after_save :recalculate_product_rating, if: :approved?
13
+ after_destroy :recalculate_product_rating
11
14
 
12
15
  validates :rating, numericality: { only_integer: true,
13
- greater_than_or_equal_to: 1,
16
+ greater_than_or_equal_to: 1,
14
17
  less_than_or_equal_to: 5,
15
- message: Spree.t('you_must_enter_value_for_rating') }
16
-
18
+ message: :you_must_enter_value_for_rating }
17
19
 
18
20
  default_scope { order("spree_reviews.created_at DESC") }
19
-
21
+
20
22
  scope :localized, ->(lc) { where('spree_reviews.locale = ?', lc) }
21
23
  scope :most_recent_first, -> { order('spree_reviews.created_at DESC') }
22
24
  scope :oldest_first, -> { reorder('spree_reviews.created_at ASC') }
@@ -27,10 +29,41 @@ class Spree::Review < ActiveRecord::Base
27
29
 
28
30
  def feedback_stars
29
31
  return 0 if feedback_reviews.size <= 0
32
+
30
33
  ((feedback_reviews.sum(:rating) / feedback_reviews.size) + 0.5).floor
31
34
  end
32
35
 
33
36
  def recalculate_product_rating
34
- self.product.recalculate_rating if product.present?
37
+ product.recalculate_rating if product.present?
38
+ end
39
+
40
+ def email
41
+ user&.email
42
+ end
43
+
44
+ def verify_purchaser
45
+ return unless user_id && product_id
46
+
47
+ verified_purchase = Spree::LineItem.joins(:order, :variant)
48
+ .where.not(spree_orders: { completed_at: nil })
49
+ .find_by(
50
+ spree_variants: { product_id: product_id },
51
+ spree_orders: { user_id: user_id }
52
+ ).present?
53
+
54
+ self.verified_purchaser = verified_purchase
55
+ end
56
+
57
+ def star_only?
58
+ [title, review].all?(&:blank?) && rating.present?
59
+ end
60
+
61
+ def approve_review
62
+ # Checks if we should auto approve the review.
63
+ if Spree::Reviews::Config[:approve_star_only]
64
+ self.approved = true if star_only?
65
+ elsif Spree::Reviews::Config[:approve_star_only_for_verified_purchaser]
66
+ self.approved = true if star_only? && verified_purchaser?
67
+ end
35
68
  end
36
69
  end
@@ -1,13 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Spree::ReviewsAbility
2
4
  include CanCan::Ability
3
5
 
4
- def initialize user
6
+ def initialize(user)
5
7
  review_ability_class = self.class
6
- can :create, Spree::Review do |review|
7
- review_ability_class.allow_anonymous_reviews? || !user.email.blank?
8
+
9
+ can :create, Spree::Review do |_review|
10
+ review_ability_class.allow_anonymous_reviews? || user.email.present?
8
11
  end
9
- can :create, Spree::FeedbackReview do |review|
10
- review_ability_class.allow_anonymous_reviews? || !user.email.blank?
12
+
13
+ can :create, Spree::FeedbackReview do |_review|
14
+ review_ability_class.allow_anonymous_reviews? || user.email.present?
15
+ end
16
+
17
+ # You can only change your own feedback_review
18
+ can [:update, :destroy], Spree::FeedbackReview do |feedback_review|
19
+ feedback_review.user == user
20
+ end
21
+
22
+ # You can read your own reviews, and everyone can read approved ones
23
+ can :read, Spree::Review do |review|
24
+ review.user == user || review.approved?
25
+ end
26
+
27
+ # You can only change your own review
28
+ can [:update, :destroy], Spree::Review do |review|
29
+ review.user == user
11
30
  end
12
31
  end
13
32
 
@@ -1,26 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Spree::ReviewsConfiguration < Spree::Preferences::Configuration
2
4
  def self.boolean_preferences
3
- %w(include_unapproved_reviews feedback_rating show_email require_login track_locale)
5
+ %w(display_unapproved_reviews include_unapproved_reviews feedback_rating show_email require_login track_locale allow_image_upload)
4
6
  end
5
7
 
6
8
  # include non-approved reviews in (public) listings
7
- preference :include_unapproved_reviews, :boolean, :default => false
9
+ preference :include_unapproved_reviews, :boolean, default: false
10
+
11
+ # displays non-approved reviews in (public) listings
12
+ preference :display_unapproved_reviews, :boolean, default: false
8
13
 
9
14
  # control how many reviews are shown in summaries etc.
10
- preference :preview_size, :integer, :default => 3
15
+ preference :preview_size, :integer, default: 3
11
16
 
12
17
  # show a reviewer's email address
13
- preference :show_email, :boolean, :default => false
18
+ preference :show_email, :boolean, default: false
19
+
20
+ # show if a reviewer actually purchased the product
21
+ preference :show_verified_purchaser, :boolean, default: false
14
22
 
15
23
  # show helpfullness rating form elements
16
- preference :feedback_rating, :boolean, :default => false
24
+ preference :feedback_rating, :boolean, default: false
17
25
 
18
26
  # require login to post reviews
19
- preference :require_login, :boolean, :default => true
27
+ preference :require_login, :boolean, default: true
20
28
 
21
29
  # whether to keep track of the reviewer's locale
22
- preference :track_locale, :boolean, :default => false
30
+ preference :track_locale, :boolean, default: false
23
31
 
24
32
  # render checkbox for a user to approve to show their identifier (name or email) on their review
25
- preference :render_show_identifier_checkbox, :boolean, :default => false
33
+ preference :render_show_identifier_checkbox, :boolean, default: false
34
+
35
+ # Approves star only reviews automatically (Reviews without a Title/Review)
36
+ preference :approve_star_only, :boolean, default: false
37
+
38
+ # Approves star only reviews for verified purchasers only.
39
+ preference :approve_star_only_for_verified_purchaser, :boolean, default: false
40
+
41
+ # allow customer to update image with the review
42
+ preference :allow_image_upload, :boolean, default: true
26
43
  end
@@ -1,5 +1,7 @@
1
- Deface::Override.new(:virtual_path => "spree/products/show",
2
- :name => "converted_product_properties_767643482",
3
- :insert_after => "[data-hook='product_properties']",
4
- :partial => "spree/shared/reviews",
5
- :disabled => false)
1
+ # frozen_string_literal: true
2
+
3
+ Deface::Override.new(virtual_path: "spree/products/show",
4
+ name: "converted_product_properties_767643482",
5
+ insert_after: "[data-hook='product_properties']",
6
+ partial: "spree/shared/reviews",
7
+ disabled: false)
@@ -1,4 +1,20 @@
1
- Deface::Override.new(:virtual_path => "spree/admin/shared/_product_sub_menu",
2
- :name => "reviews_admin_tab",
3
- :insert_bottom => "[data-hook='admin_product_sub_tabs']",
4
- :text => "<%= tab(:reviews, :label => 'review_management') %>")
1
+ # frozen_string_literal: true
2
+
3
+ Spree::Backend::Config.configure do |config|
4
+ config.menu_items.detect { |menu_item|
5
+ menu_item.label == :products
6
+ }.sections << :reviews
7
+ end
8
+
9
+ Deface::Override.new(
10
+ virtual_path: "spree/admin/shared/_product_sub_menu",
11
+ name: "reviews_admin_tab",
12
+ insert_bottom: "[data-hook='admin_product_sub_tabs']",
13
+ disabled: false
14
+ ) do
15
+ <<-HTML
16
+ <% if can? :admin, Spree::Review %>
17
+ <%= tab(:reviews, label: 'review_management') %>
18
+ <% end %>
19
+ HTML
20
+ end
@@ -1,5 +1,20 @@
1
- Deface::Override.new(:virtual_path => "spree/admin/shared/_configuration_menu",
2
- :name => "converted_admin_configurations_menu",
3
- :insert_bottom => "[data-hook='admin_configurations_sidebar_menu'], #admin_configurations_sidebar_menu[data-hook]",
4
- :text => "<%= configurations_sidebar_menu_item Spree.t('spree_reviews.review_settings'), edit_admin_review_settings_path %>",
5
- :disabled => false)
1
+ # frozen_string_literal: true
2
+
3
+ Spree::Backend::Config.configure do |config|
4
+ config.menu_items.detect { |menu_item|
5
+ menu_item.label == :settings
6
+ }.sections << :review_settings
7
+ end
8
+
9
+ Deface::Override.new(
10
+ virtual_path: "spree/admin/shared/_settings_sub_menu",
11
+ name: "converted_admin_configurations_menu",
12
+ insert_bottom: "[data-hook='admin_settings_sub_tabs']",
13
+ disabled: false
14
+ ) do
15
+ <<-HTML
16
+ <% if can? :admin, Spree::ReviewsConfiguration %>
17
+ <%= tab :reviews, url: spree.edit_admin_review_settings_path, match_path: /review_settings/ %>
18
+ <% end %>
19
+ HTML
20
+ end
@@ -1,9 +1,9 @@
1
1
  <% content_for :page_title do %>
2
- <%= Spree.t('feedback_review_for', :review => @review.title) %>
2
+ <%= I18n.t("spree.feedback_review_for", review: @review.title) %>
3
3
  <% end %>
4
4
 
5
5
  <% content_for :page_actions do %>
6
- <li><%= button_link_to Spree.t(:back_to_reviews), admin_reviews_path, { :icon => 'icon-arrow-left' } %></li>
6
+ <li><%= link_to I18n.t("spree.back_to_reviews"), admin_reviews_path %></li>
7
7
  <% end %>
8
8
 
9
9
  <% render 'spree/admin/shared/product_sub_menu' %>
@@ -18,20 +18,20 @@
18
18
  </colgroup>
19
19
  <thead>
20
20
  <tr>
21
- <th><%= Spree.t('user') %></th>
22
- <th><%= Spree.t('stars') %></th>
23
- <th><%= Spree.t('date') %></th>
24
- <th></th>
21
+ <th><%= I18n.t("spree.user") %></th>
22
+ <th><%= I18n.t("spree.stars") %></th>
23
+ <th><%= I18n.t("spree.date") %></th>
24
+ <th class="actions"></th>
25
25
  </tr>
26
26
  </thead>
27
27
  <tbody>
28
28
  <%- @collection.each do |feedback| -%>
29
29
  <tr id="<%= dom_id(feedback) %>">
30
30
  <td><%= l feedback.created_at %></td>
31
- <td><%= feedback.user.try(:login) || Spree.t(:anonymous) %></td>
31
+ <td><%= feedback.user.try(:login) || I18n.t("spree.anonymous") %></td>
32
32
  <td><%= feedback.rating %></td>
33
33
  <td class="actions">
34
- <%= link_to_delete feedback, :no_text => true %>
34
+ <%= link_to_delete feedback, no_text: true %>
35
35
  </td>
36
36
  </tr>
37
37
  <% end %>
@@ -39,6 +39,6 @@
39
39
  </table>
40
40
  <% else %>
41
41
  <div class="no-objects-found">
42
- <%= Spree.t(:no_results) %>
42
+ <%= I18n.t("spree.no_results") %>
43
43
  </div>
44
44
  <% end %>
@@ -1,40 +1,76 @@
1
- <%= render 'spree/admin/shared/configuration_menu' %>
2
-
3
1
  <% content_for :page_title do %>
4
- <%= Spree.t("spree_reviews.review_settings") %>
2
+ <%= I18n.t("spree.spree_reviews.review_settings") %>
5
3
  <% end %>
6
4
 
7
- <%= form_tag(admin_review_settings_path, :method => :put) do %>
8
- <fieldset class="no-border-top">
9
- <div class="field">
10
- <%= check_box_tag('preferences[include_unapproved_reviews]', "1", Spree::Reviews::Config[:include_unapproved_reviews]) %>
11
- <label><%= Spree.t("spree_reviews.include_unapproved") %></label>
12
- </div>
13
- <div class="field">
14
- <%= check_box_tag('preferences[feedback_rating]', "1", Spree::Reviews::Config[:feedback_rating]) %>
15
- <label><%= Spree.t("spree_reviews.feedback_rating") %></label>
16
- </div>
17
- <div class="field">
18
- <%= check_box_tag('preferences[show_email]', "1", Spree::Reviews::Config[:show_email]) %>
19
- <label><%= Spree.t("spree_reviews.show_email") %></label>
20
- </div>
21
- <div class="field">
22
- <%= check_box_tag('preferences[require_login]', "1", Spree::Reviews::Config[:require_login]) %>
23
- <label><%= Spree.t("spree_reviews.require_login") %></label>
24
- </div>
25
- <div class="field">
26
- <%= check_box_tag('preferences[track_locale]', "1", Spree::Reviews::Config[:track_locale]) %>
27
- <label><%= Spree.t("spree_reviews.track_locale") %></label>
28
- </div>
29
- <div class="field">
30
- <label><%= Spree.t('spree_reviews.preview_size') %></label><br>
31
- <%= text_field_tag('preferences[preview_size]', Spree::Reviews::Config[:preview_size], :size => 3) %>
32
- </div>
5
+ <% admin_breadcrumb(I18n.t("spree.settings")) %>
6
+
7
+ <% content_for :tabs do %>
8
+ <nav>
9
+ <ul class="tabs">
10
+ <%= settings_tab_item I18n.t("spree.spree_reviews.review_settings"), spree.admin_review_settings_path %>
11
+ </ul>
12
+ </nav>
13
+ <% end %>
14
+
15
+ <%= form_tag(admin_review_settings_path, method: :put) do %>
16
+ <fieldset class="no-border-top">
17
+ <div class="field">
18
+ <label>
19
+ <%= check_box_tag('preferences[include_unapproved_reviews]', "1", Spree::Reviews::Config[:include_unapproved_reviews]) %>
20
+ <%= I18n.t("spree.spree_reviews.include_unapproved") %>
21
+ </label>
22
+ </div>
23
+ <div class="field">
24
+ <label>
25
+ <%= check_box_tag('preferences[display_unapproved_reviews]', "1", Spree::Reviews::Config[:display_unapproved_reviews]) %>
26
+ <%= I18n.t("spree.spree_reviews.display_unapproved") %>
27
+ </label>
28
+ </div>
29
+ <div class="field">
30
+ <label>
31
+ <%= check_box_tag('preferences[feedback_rating]', "1", Spree::Reviews::Config[:feedback_rating]) %>
32
+ <%= I18n.t("spree.spree_reviews.feedback_rating") %>
33
+ </label>
34
+ </div>
35
+ <div class="field">
36
+ <label>
37
+ <%= check_box_tag('preferences[show_email]', "1", Spree::Reviews::Config[:show_email]) %>
38
+ <%= I18n.t("spree.spree_reviews.show_email") %>
39
+ </label>
40
+ </div>
41
+ <div class="field">
42
+ <label>
43
+ <%= check_box_tag('preferences[show_verified_purchaser]', "1", Spree::Reviews::Config[:show_verified_purchaser]) %>
44
+ <%= I18n.t("spree.spree_reviews.show_verified_purchaser") %>
45
+ </label>
46
+ </div>
47
+ <div class="field">
48
+ <label>
49
+ <%= check_box_tag('preferences[require_login]', "1", Spree::Reviews::Config[:require_login]) %>
50
+ <%= I18n.t("spree.spree_reviews.require_login") %>
51
+ </label>
52
+ </div>
53
+ <div class="field">
54
+ <label>
55
+ <%= check_box_tag('preferences[track_locale]', "1", Spree::Reviews::Config[:track_locale]) %>
56
+ <%= I18n.t("spree.spree_reviews.track_locale") %>
57
+ </label>
58
+ </div>
59
+ <div class="field">
60
+ <label>
61
+ <%= check_box_tag('preferences[allow_image_upload]', "1", Spree::Reviews::Config[:allow_image_upload]) %>
62
+ <%= I18n.t("spree.spree_reviews.allow_image_upload") %>
63
+ </label>
64
+ </div>
65
+
66
+ <div class="field">
67
+ <label><%= I18n.t("spree.spree_reviews.preview_size") %></label><br>
68
+ <%= text_field_tag('preferences[preview_size]', Spree::Reviews::Config[:preview_size], size: 3) %>
69
+ </div>
33
70
 
34
- <div class="form-buttons filter-actions actions" data-hook="buttons">
35
- <%= button Spree.t('actions.update'), 'icon-refresh' %>
36
- <span class="or"><%= Spree.t(:or) %></span>
37
- <%= link_to_with_icon 'icon-remove', Spree.t('actions.cancel'), edit_admin_general_settings_url, :class => 'button' %>
38
- </div>
39
- </fieldset>
71
+ <div class="form-buttons filter-actions actions" data-hook="buttons">
72
+ <%= button_tag I18n.t("spree.actions.update") %>
73
+ <%= link_to I18n.t("spree.actions.cancel"), edit_admin_general_settings_url, class: 'button' %>
74
+ </div>
75
+ </fieldset>
40
76
  <% end %>