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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/app/controllers/spree/admin/product_reviews_controller.rb +71 -0
  3. data/app/controllers/spree/home_controller.rb +7 -0
  4. data/app/controllers/spree/product_reviews_controller.rb +72 -0
  5. data/app/models/spree/page_blocks/product_review_form.rb +13 -0
  6. data/app/models/spree/page_blocks/products/reviews.rb +37 -0
  7. data/app/models/spree/page_sections/add_a_review.rb +80 -0
  8. data/app/models/spree/page_sections/product_details_decorator.rb +10 -0
  9. data/app/models/spree/product_review.rb +73 -0
  10. data/app/models/spree/product_reviews_ability.rb +25 -0
  11. data/app/models/spree_product_reviews/spree/product_decorator.rb +13 -0
  12. data/app/models/spree_product_reviews/spree/product_review_decorator.rb +12 -0
  13. data/app/models/spree_product_reviews/spree/user_decorator.rb +22 -0
  14. data/app/views/spree/admin/page_blocks/forms/_product_review_form.html.erb +22 -0
  15. data/app/views/spree/admin/page_blocks/forms/_reviews.html.erb +52 -0
  16. data/app/views/spree/admin/page_sections/forms/_add_a_review.html.erb +112 -0
  17. data/app/views/spree/admin/product_reviews/_product_review.html.erb +89 -0
  18. data/app/views/spree/admin/product_reviews/_table.html.erb +31 -0
  19. data/app/views/spree/admin/product_reviews/edit.html.erb +103 -0
  20. data/app/views/spree/admin/product_reviews/index.html.erb +15 -0
  21. data/app/views/spree/admin/product_reviews/update.turbo_stream.erb +1 -0
  22. data/app/views/spree/page_blocks/products/reviews/_reviews.html.erb +42 -0
  23. data/app/views/spree/page_sections/_add_a_review.html.erb +75 -0
  24. data/app/views/spree/page_sections/_product_reviews.html.erb +95 -0
  25. data/app/views/spree/product_reviews/_form.html.erb +275 -0
  26. data/app/views/spree/product_reviews/_images.html.erb +80 -0
  27. data/app/views/spree/product_reviews/_pending.html.erb +15 -0
  28. data/app/views/spree/product_reviews/_review.html.erb +38 -0
  29. data/app/views/spree/products/_json_ld.html.erb +97 -0
  30. data/app/views/spree_product_reviews/admin/_product_reviews_dropdown.html.erb +6 -0
  31. data/app/views/themes/default/spree/page_sections/_product_details.html.erb +89 -0
  32. data/config/initializers/spree_product_reviews.rb +9 -0
  33. data/config/locales/en.yml +59 -0
  34. data/config/routes.rb +20 -0
  35. data/db/migrate/20250501173852_add_reviews.rb +27 -0
  36. data/db/migrate/20250501174531_add_review_info_to_products.rb +13 -0
  37. data/lib/generators/spree_product_reviews/install/install_generator.rb +44 -0
  38. data/lib/spree_product_reviews/configuration.rb +13 -0
  39. data/lib/spree_product_reviews/engine.rb +24 -0
  40. data/lib/spree_product_reviews/factories.rb +6 -0
  41. data/lib/spree_product_reviews/version.rb +8 -0
  42. data/lib/spree_product_reviews.rb +5 -0
  43. 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
@@ -0,0 +1,8 @@
1
+ module SpreeProductReviews
2
+ VERSION = "1.0.0".freeze
3
+
4
+ def gem_version
5
+ Gem::Version.new(VERSION)
6
+ end
7
+ end
8
+
@@ -0,0 +1,5 @@
1
+ require 'spree_core'
2
+ require 'spree_extension'
3
+ require 'spree_product_reviews/engine'
4
+ require 'spree_product_reviews/version'
5
+ require 'spree_product_reviews/configuration'
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: []