spree_product_reviews 1.0.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.
- checksums.yaml +7 -0
- data/app/controllers/spree/admin/product_reviews_controller.rb +71 -0
- data/app/controllers/spree/home_controller.rb +7 -0
- data/app/controllers/spree/product_reviews_controller.rb +72 -0
- data/app/models/spree/page_blocks/product_review_form.rb +13 -0
- data/app/models/spree/page_blocks/products/reviews.rb +37 -0
- data/app/models/spree/page_sections/add_a_review.rb +80 -0
- data/app/models/spree/page_sections/product_details_decorator.rb +10 -0
- data/app/models/spree/product_review.rb +73 -0
- data/app/models/spree/product_reviews_ability.rb +25 -0
- data/app/models/spree_product_reviews/spree/product_decorator.rb +13 -0
- data/app/models/spree_product_reviews/spree/product_review_decorator.rb +12 -0
- data/app/models/spree_product_reviews/spree/user_decorator.rb +22 -0
- data/app/views/spree/admin/page_blocks/forms/_product_review_form.html.erb +22 -0
- data/app/views/spree/admin/page_blocks/forms/_reviews.html.erb +52 -0
- data/app/views/spree/admin/page_sections/forms/_add_a_review.html.erb +112 -0
- data/app/views/spree/admin/product_reviews/_product_review.html.erb +89 -0
- data/app/views/spree/admin/product_reviews/_table.html.erb +31 -0
- data/app/views/spree/admin/product_reviews/edit.html.erb +103 -0
- data/app/views/spree/admin/product_reviews/index.html.erb +15 -0
- data/app/views/spree/admin/product_reviews/update.turbo_stream.erb +1 -0
- data/app/views/spree/page_blocks/products/reviews/_reviews.html.erb +42 -0
- data/app/views/spree/page_sections/_add_a_review.html.erb +75 -0
- data/app/views/spree/page_sections/_product_reviews.html.erb +95 -0
- data/app/views/spree/product_reviews/_form.html.erb +275 -0
- data/app/views/spree/product_reviews/_images.html.erb +80 -0
- data/app/views/spree/product_reviews/_pending.html.erb +15 -0
- data/app/views/spree/product_reviews/_review.html.erb +38 -0
- data/app/views/spree/products/_json_ld.html.erb +97 -0
- data/app/views/spree_product_reviews/admin/_product_reviews_dropdown.html.erb +6 -0
- data/app/views/themes/default/spree/page_sections/_product_details.html.erb +89 -0
- data/config/initializers/spree_product_reviews.rb +9 -0
- data/config/locales/en.yml +59 -0
- data/config/routes.rb +20 -0
- data/db/migrate/20250501173852_add_reviews.rb +27 -0
- data/db/migrate/20250501174531_add_review_info_to_products.rb +13 -0
- data/lib/generators/spree_product_reviews/install/install_generator.rb +44 -0
- data/lib/spree_product_reviews/configuration.rb +13 -0
- data/lib/spree_product_reviews/engine.rb +24 -0
- data/lib/spree_product_reviews/factories.rb +6 -0
- data/lib/spree_product_reviews/version.rb +8 -0
- data/lib/spree_product_reviews.rb +5 -0
- metadata +156 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
|
2
|
+
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
|
3
|
+
|
|
4
|
+
en:
|
|
5
|
+
spree:
|
|
6
|
+
review_approved: "Review approved successfully."
|
|
7
|
+
review_disapproved: "Review disapproved."
|
|
8
|
+
approve: "Approve"
|
|
9
|
+
approve: "Approve"
|
|
10
|
+
product_reviews: "Product Reviews"
|
|
11
|
+
new_product_review: "Leave a new product review"
|
|
12
|
+
review_title: "Review Title"
|
|
13
|
+
review_images: "Review Images"
|
|
14
|
+
product_review_rating: "Rating"
|
|
15
|
+
add_a_review_heading: "Leave a Review"
|
|
16
|
+
thanks_for_review_heading: "Thank you for your review! Your Review is Approved!"
|
|
17
|
+
thanks_for_review_heading_pending: "Thank you for your review! Your Review is waiting for Approval!"
|
|
18
|
+
add_a_review_text: "We value your feedback! Please leave a review for this product."
|
|
19
|
+
product_review:
|
|
20
|
+
flash_messages:
|
|
21
|
+
create:
|
|
22
|
+
success: "Your review has been submitted and is pending approval."
|
|
23
|
+
error: "There was an error submitting your review. Please try again."
|
|
24
|
+
failure: "There was an error submitting your review. Please try again."
|
|
25
|
+
approve: "Review approved successfully."
|
|
26
|
+
update:
|
|
27
|
+
success: "Your review has been updated."
|
|
28
|
+
error: "There was an error updating your review. Please try again."
|
|
29
|
+
failure: "There was an error updating your review. Please try again."
|
|
30
|
+
page_blocks:
|
|
31
|
+
reviews_summary: "Reviews"
|
|
32
|
+
product_review_form:
|
|
33
|
+
button_text_default: "Add your review"
|
|
34
|
+
placeholder_default: "Write your review here..."
|
|
35
|
+
page_sections:
|
|
36
|
+
product_reviews:
|
|
37
|
+
reviewed_by: "Reviewed by:"
|
|
38
|
+
pending_product_review_instructions: "Thanks for your review! It is currently pending approval."
|
|
39
|
+
admin:
|
|
40
|
+
page_sections:
|
|
41
|
+
product_reviews:
|
|
42
|
+
display_description: "If a user is not logged in, this section will not be displayed."
|
|
43
|
+
display_style:
|
|
44
|
+
label: "Display style"
|
|
45
|
+
inline: "Inline"
|
|
46
|
+
stacked: "Stacked"
|
|
47
|
+
heading_options: "Heading layout options"
|
|
48
|
+
heading_labels:
|
|
49
|
+
heading: "Heading labels"
|
|
50
|
+
no_review_yet: "Customer needs to review"
|
|
51
|
+
review_pending: "Customer's review is pending"
|
|
52
|
+
review_approved: "Customer's review was approved"
|
|
53
|
+
control_preferences:
|
|
54
|
+
label: "Control preferences"
|
|
55
|
+
allow_unverified_reviews: "Allow reviews for unverified purchase"
|
|
56
|
+
allow_unverified_reviews_enabled_description: "Enable to post reviews from any customer, without the verified badge."
|
|
57
|
+
allow_unverified_reviews_disabled_description: "Disable to limit reviews strictly to only verified buyers."
|
|
58
|
+
review_settings: "Review Settings"
|
|
59
|
+
upload_preferences: "Upload Settings"
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Spree::Core::Engine.add_routes do
|
|
2
|
+
namespace :admin do
|
|
3
|
+
resources :products do
|
|
4
|
+
resources :product_reviews, only: %i[index destroy edit update] do
|
|
5
|
+
member do
|
|
6
|
+
get :approve
|
|
7
|
+
get :disapprove
|
|
8
|
+
post :attach_image # Attach images to review
|
|
9
|
+
delete :purge_images # Delete selected images
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
resources :products, only: [] do
|
|
16
|
+
resources :product_reviews, only: %i[index new create]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
get '/forbidden', to: 'spree/home#forbidden', as: :product_reviews_forbidden
|
|
20
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class AddReviews < ActiveRecord::Migration[7.2]
|
|
2
|
+
def change
|
|
3
|
+
unless table_exists?(:spree_product_reviews)
|
|
4
|
+
create_table :spree_product_reviews do |t|
|
|
5
|
+
t.references :product, null: false, foreign_key: { to_table: :spree_products }
|
|
6
|
+
t.references :user, null: false, foreign_key: { to_table: :spree_users }
|
|
7
|
+
t.references :variant, foreign_key: { to_table: :spree_variants }
|
|
8
|
+
|
|
9
|
+
t.integer :rating, null: false
|
|
10
|
+
t.string :title, null: false
|
|
11
|
+
t.string :review, null: false
|
|
12
|
+
t.string :product_name, null: false
|
|
13
|
+
t.datetime :purchase_date
|
|
14
|
+
t.string :ip_address, null: false
|
|
15
|
+
t.string :locale, null: false, default: "en"
|
|
16
|
+
|
|
17
|
+
t.boolean :approved, default: false, null: false
|
|
18
|
+
t.boolean :show_identifier, default: false, null: false
|
|
19
|
+
|
|
20
|
+
t.timestamps
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
add_index :spree_product_reviews, :product_id, name: "index_reviews_on_product_id" unless index_exists?(:spree_product_reviews, :product_id, name: "index_reviews_on_product_id")
|
|
25
|
+
add_index :spree_product_reviews, :variant_id, name: "index_reviews_on_variant_id" unless index_exists?(:spree_product_reviews, :variant_id, name: "index_reviews_on_variant_id")
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class AddReviewInfoToProducts < ActiveRecord::Migration[7.2]
|
|
2
|
+
def change
|
|
3
|
+
unless column_exists?(:spree_products, :average_rating)
|
|
4
|
+
add_column :spree_products, :average_rating, :decimal,
|
|
5
|
+
precision: 7, scale: 5, default: 0.0, null: false
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
unless column_exists?(:spree_products, :review_count)
|
|
9
|
+
add_column :spree_products, :review_count, :integer,
|
|
10
|
+
default: 0, null: false
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module SpreeProductReviews
|
|
2
|
+
module Generators
|
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
|
4
|
+
class_option :migrate, type: :boolean, default: true
|
|
5
|
+
|
|
6
|
+
def add_migrations
|
|
7
|
+
run 'bundle exec rake railties:install:migrations FROM=spree_product_reviews'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def run_migrations
|
|
11
|
+
run_migrations = options[:migrate] || ['', 'y', 'Y'].include?(
|
|
12
|
+
ask('Would you like to run the migrations now? [Y/n]')
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
if run_migrations
|
|
16
|
+
run 'bin/rails db:migrate'
|
|
17
|
+
else
|
|
18
|
+
puts 'Skipping rails db:migrate, don\'t forget to run it!'
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_reviews_page_block
|
|
23
|
+
say_status :spree_product_reviews, "Adding Reviews block to Product Details sections", :green
|
|
24
|
+
|
|
25
|
+
# Load app environment explicitly (important for generators)
|
|
26
|
+
require Rails.root.join("config/environment")
|
|
27
|
+
|
|
28
|
+
Spree::PageSection
|
|
29
|
+
.where(type: "Spree::PageSections::ProductDetails")
|
|
30
|
+
.find_each do |section|
|
|
31
|
+
|
|
32
|
+
next if section.blocks.exists?(
|
|
33
|
+
type: "Spree::PageBlocks::Products::Reviews"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
section.blocks.create!(
|
|
37
|
+
type: "Spree::PageBlocks::Products::Reviews",
|
|
38
|
+
position: section.blocks.maximum(:position).to_i + 1
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module SpreeProductReviews
|
|
2
|
+
class Configuration < Spree::Preferences::Configuration
|
|
3
|
+
|
|
4
|
+
# Some example preferences are shown below, for more information visit:
|
|
5
|
+
# https://docs.spreecommerce.org/developer/contributing/creating-an-extension
|
|
6
|
+
|
|
7
|
+
# preference :enabled, :boolean, default: true
|
|
8
|
+
# preference :dark_chocolate, :boolean, default: true
|
|
9
|
+
# preference :color, :string, default: 'Red'
|
|
10
|
+
# preference :favorite_number, :integer
|
|
11
|
+
# preference :supported_locales, :array, default: [:en]
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module SpreeProductReviews
|
|
2
|
+
class Engine < Rails::Engine
|
|
3
|
+
require 'spree/core'
|
|
4
|
+
isolate_namespace Spree
|
|
5
|
+
engine_name 'spree_product_reviews'
|
|
6
|
+
|
|
7
|
+
# use rspec for tests
|
|
8
|
+
config.generators do |g|
|
|
9
|
+
g.test_framework :rspec
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
initializer 'spree_product_reviews.environment', before: :load_config_initializers do |_app|
|
|
13
|
+
SpreeProductReviews::Config = SpreeProductReviews::Configuration.new
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.activate
|
|
17
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
|
18
|
+
Rails.configuration.cache_classes ? require(c) : load(c)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
config.to_prepare(&method(:activate).to_proc)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
FactoryBot.define do
|
|
2
|
+
# Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
|
|
3
|
+
#
|
|
4
|
+
# Example adding this to your spec_helper will load these Factories for use:
|
|
5
|
+
# require 'spree_product_reviews/factories'
|
|
6
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: spree_product_reviews
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Umesh Ravani
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2025-12-17 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: spree_core
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '5.2'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '5.2'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: spree_auth_devise
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: spree_extension
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: spree_dev_tools
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: faker
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
description: Product reviews and ratings system for Spree Commerce 5.x stores.
|
|
84
|
+
email:
|
|
85
|
+
- umeshravani98@gmail.com
|
|
86
|
+
executables: []
|
|
87
|
+
extensions: []
|
|
88
|
+
extra_rdoc_files: []
|
|
89
|
+
files:
|
|
90
|
+
- app/controllers/spree/admin/product_reviews_controller.rb
|
|
91
|
+
- app/controllers/spree/home_controller.rb
|
|
92
|
+
- app/controllers/spree/product_reviews_controller.rb
|
|
93
|
+
- app/models/spree/page_blocks/product_review_form.rb
|
|
94
|
+
- app/models/spree/page_blocks/products/reviews.rb
|
|
95
|
+
- app/models/spree/page_sections/add_a_review.rb
|
|
96
|
+
- app/models/spree/page_sections/product_details_decorator.rb
|
|
97
|
+
- app/models/spree/product_review.rb
|
|
98
|
+
- app/models/spree/product_reviews_ability.rb
|
|
99
|
+
- app/models/spree_product_reviews/spree/product_decorator.rb
|
|
100
|
+
- app/models/spree_product_reviews/spree/product_review_decorator.rb
|
|
101
|
+
- app/models/spree_product_reviews/spree/user_decorator.rb
|
|
102
|
+
- app/views/spree/admin/page_blocks/forms/_product_review_form.html.erb
|
|
103
|
+
- app/views/spree/admin/page_blocks/forms/_reviews.html.erb
|
|
104
|
+
- app/views/spree/admin/page_sections/forms/_add_a_review.html.erb
|
|
105
|
+
- app/views/spree/admin/product_reviews/_product_review.html.erb
|
|
106
|
+
- app/views/spree/admin/product_reviews/_table.html.erb
|
|
107
|
+
- app/views/spree/admin/product_reviews/edit.html.erb
|
|
108
|
+
- app/views/spree/admin/product_reviews/index.html.erb
|
|
109
|
+
- app/views/spree/admin/product_reviews/update.turbo_stream.erb
|
|
110
|
+
- app/views/spree/page_blocks/products/reviews/_reviews.html.erb
|
|
111
|
+
- app/views/spree/page_sections/_add_a_review.html.erb
|
|
112
|
+
- app/views/spree/page_sections/_product_reviews.html.erb
|
|
113
|
+
- app/views/spree/product_reviews/_form.html.erb
|
|
114
|
+
- app/views/spree/product_reviews/_images.html.erb
|
|
115
|
+
- app/views/spree/product_reviews/_pending.html.erb
|
|
116
|
+
- app/views/spree/product_reviews/_review.html.erb
|
|
117
|
+
- app/views/spree/products/_json_ld.html.erb
|
|
118
|
+
- app/views/spree_product_reviews/admin/_product_reviews_dropdown.html.erb
|
|
119
|
+
- app/views/themes/default/spree/page_sections/_product_details.html.erb
|
|
120
|
+
- config/initializers/spree_product_reviews.rb
|
|
121
|
+
- config/locales/en.yml
|
|
122
|
+
- config/routes.rb
|
|
123
|
+
- db/migrate/20250501173852_add_reviews.rb
|
|
124
|
+
- db/migrate/20250501174531_add_review_info_to_products.rb
|
|
125
|
+
- lib/generators/spree_product_reviews/install/install_generator.rb
|
|
126
|
+
- lib/spree_product_reviews.rb
|
|
127
|
+
- lib/spree_product_reviews/configuration.rb
|
|
128
|
+
- lib/spree_product_reviews/engine.rb
|
|
129
|
+
- lib/spree_product_reviews/factories.rb
|
|
130
|
+
- lib/spree_product_reviews/version.rb
|
|
131
|
+
homepage: https://github.com/umeshravani/spree_product_reviews
|
|
132
|
+
licenses:
|
|
133
|
+
- AGPL-3.0-or-later
|
|
134
|
+
metadata:
|
|
135
|
+
source_code_uri: https://github.com/umeshravani/spree_product_reviews
|
|
136
|
+
changelog_uri: https://github.com/umeshravani/spree_product_reviews/blob/main/CHANGELOG.md
|
|
137
|
+
post_install_message:
|
|
138
|
+
rdoc_options: []
|
|
139
|
+
require_paths:
|
|
140
|
+
- lib
|
|
141
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - ">="
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '3.2'
|
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
|
+
requirements:
|
|
148
|
+
- - ">="
|
|
149
|
+
- !ruby/object:Gem::Version
|
|
150
|
+
version: '0'
|
|
151
|
+
requirements: []
|
|
152
|
+
rubygems_version: 3.5.3
|
|
153
|
+
signing_key:
|
|
154
|
+
specification_version: 4
|
|
155
|
+
summary: Spree Commerce Product Reviews Extension
|
|
156
|
+
test_files: []
|