spree_core 5.2.0 → 5.2.2

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 (65) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/spree/line_items/find_by_variant.rb +1 -1
  3. data/app/helpers/spree/images_helper.rb +34 -18
  4. data/app/helpers/spree/mail_helper.rb +1 -1
  5. data/app/jobs/spree/imports/create_rows_job.rb +1 -1
  6. data/app/jobs/spree/variants/remove_line_item_job.rb +1 -1
  7. data/app/models/spree/ability.rb +75 -10
  8. data/app/models/spree/asset.rb +26 -2
  9. data/app/models/spree/export.rb +1 -1
  10. data/app/models/spree/image/configuration/active_storage.rb +6 -15
  11. data/app/models/spree/image.rb +2 -1
  12. data/app/models/spree/import.rb +1 -1
  13. data/app/models/spree/order/gift_card.rb +3 -3
  14. data/app/models/spree/order/store_credit.rb +2 -2
  15. data/app/models/spree/order.rb +4 -4
  16. data/app/models/spree/order_contents.rb +9 -9
  17. data/app/models/spree/order_merger.rb +3 -3
  18. data/app/models/spree/page_sections/featured_taxon.rb +1 -2
  19. data/app/models/spree/permission_sets/base.rb +81 -0
  20. data/app/models/spree/permission_sets/configuration_management.rb +47 -0
  21. data/app/models/spree/permission_sets/dashboard_display.rb +17 -0
  22. data/app/models/spree/permission_sets/default_customer.rb +66 -0
  23. data/app/models/spree/permission_sets/order_display.rb +27 -0
  24. data/app/models/spree/permission_sets/order_management.rb +33 -0
  25. data/app/models/spree/permission_sets/product_display.rb +27 -0
  26. data/app/models/spree/permission_sets/product_management.rb +27 -0
  27. data/app/models/spree/permission_sets/promotion_management.rb +22 -0
  28. data/app/models/spree/permission_sets/role_management.rb +21 -0
  29. data/app/models/spree/permission_sets/stock_display.rb +19 -0
  30. data/app/models/spree/permission_sets/stock_management.rb +19 -0
  31. data/app/models/spree/permission_sets/super_user.rb +28 -0
  32. data/app/models/spree/permission_sets/user_display.rb +19 -0
  33. data/app/models/spree/permission_sets/user_management.rb +20 -0
  34. data/app/models/spree/promotion/actions/create_line_items.rb +6 -6
  35. data/app/models/spree/promotion_handler/coupon.rb +1 -1
  36. data/app/models/spree/shipping_method.rb +1 -1
  37. data/app/models/spree/store.rb +1 -1
  38. data/app/models/spree/themes/default.rb +7 -4
  39. data/app/presenters/spree/csv/product_variant_presenter.rb +1 -4
  40. data/app/services/spree/cart/add_item.rb +2 -2
  41. data/app/services/spree/cart/remove_item.rb +4 -4
  42. data/app/services/spree/cart/remove_line_item.rb +3 -3
  43. data/app/services/spree/cart/remove_out_of_stock_items.rb +1 -1
  44. data/app/services/spree/cart/set_quantity.rb +1 -1
  45. data/app/services/spree/checkout/advance.rb +1 -1
  46. data/app/services/spree/checkout/complete.rb +1 -1
  47. data/app/services/spree/data_feeds/google/rss.rb +4 -4
  48. data/app/services/spree/line_items/helper.rb +1 -1
  49. data/app/services/spree/shipments/helper.rb +2 -2
  50. data/config/locales/en.yml +1 -0
  51. data/lib/friendly_id/history_decorator.rb +26 -0
  52. data/lib/generators/spree/install/templates/config/initializers/spree.rb +25 -0
  53. data/lib/spree/core/configuration.rb +30 -0
  54. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  55. data/lib/spree/core/controller_helpers/store.rb +1 -1
  56. data/lib/spree/core/dependencies.rb +2 -2
  57. data/lib/spree/core/dependencies_helper.rb +100 -5
  58. data/lib/spree/core/permission_configuration.rb +102 -0
  59. data/lib/spree/core/search/base.rb +1 -1
  60. data/lib/spree/core/version.rb +1 -1
  61. data/lib/spree/core.rb +51 -0
  62. data/lib/spree/testing_support/authorization_helpers.rb +2 -2
  63. data/lib/spree_core.rb +1 -0
  64. data/lib/tasks/dependencies.rake +76 -0
  65. metadata +25 -7
@@ -0,0 +1,66 @@
1
+ # Permission set for default storefront customers (both authenticated and guests).
2
+ #
3
+ # This permission set provides the standard permissions needed for browsing
4
+ # the store and making purchases.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:default, Spree::PermissionSets::DefaultCustomer)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class DefaultCustomer < Base
12
+ def activate!
13
+ # Read-only access to catalog
14
+ can :read, Spree::Country
15
+ can :read, Spree::OptionType
16
+ can :read, Spree::OptionValue
17
+ can :read, Spree::Product
18
+ can :read, Spree::ProductProperty
19
+ can :read, Spree::Property
20
+ can :read, Spree::State
21
+ can :read, Spree::Store
22
+ can :read, Spree::Taxon
23
+ can :read, Spree::Taxonomy
24
+ can :read, Spree::Variant
25
+ can :read, Spree::Zone
26
+
27
+ # Content pages
28
+ can :read, Spree::Policy
29
+ can :read, Spree::Page
30
+ can :read, Spree::Post
31
+ can :read, Spree::PostCategory
32
+
33
+ # Order management for the user's own orders
34
+ can :create, Spree::Order
35
+ can :show, Spree::Order do |order, token|
36
+ order.user == user || order.token && token == order.token
37
+ end
38
+ can :update, Spree::Order do |order, token|
39
+ !order.completed? && (order.user == user || order.token && token == order.token)
40
+ end
41
+
42
+ # User account management - available to all users (including guests for their own record)
43
+ can :create, Spree.user_class
44
+ can [:show, :update, :destroy], Spree.user_class, id: user.id
45
+
46
+ # Address management
47
+ can :manage, Spree::Address, user_id: user.id
48
+
49
+ # Credit card management
50
+ can [:read, :destroy], Spree::CreditCard, user_id: user.id
51
+
52
+ # Wishlist management
53
+ can :manage, Spree::Wishlist, user_id: user.id
54
+ can :show, Spree::Wishlist do |wishlist|
55
+ wishlist.user == user || wishlist.is_private == false
56
+ end
57
+ can [:create, :update, :destroy], Spree::WishedItem do |wished_item|
58
+ wished_item.wishlist.user == user
59
+ end
60
+
61
+ # Invitation acceptance
62
+ can :accept, Spree::Invitation, invitee_id: [user.id, nil], invitee_type: user.class.name, status: 'pending'
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,27 @@
1
+ # Permission set for viewing orders and related resources.
2
+ #
3
+ # This permission set provides read-only access to orders and associated
4
+ # models like payments, shipments, and refunds.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:customer_service, Spree::PermissionSets::OrderDisplay)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class OrderDisplay < Base
12
+ def activate!
13
+ can [:read, :admin, :index], Spree::Order
14
+ can [:read, :admin], Spree::Payment
15
+ can [:read, :admin], Spree::Shipment
16
+ can [:read, :admin], Spree::Adjustment
17
+ can [:read, :admin], Spree::LineItem
18
+ can [:read, :admin], Spree::ReturnAuthorization
19
+ can [:read, :admin], Spree::CustomerReturn
20
+ can [:read, :admin], Spree::Reimbursement
21
+ can [:read, :admin], Spree::Refund
22
+ can [:read, :admin], Spree::StoreCredit
23
+ can [:read, :admin], Spree::GiftCard
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ # Permission set for full order management.
2
+ #
3
+ # This permission set provides complete access to manage orders,
4
+ # including creating, updating, and processing payments and shipments.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:order_manager, Spree::PermissionSets::OrderManagement)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class OrderManagement < Base
12
+ def activate!
13
+ can :manage, Spree::Order
14
+ can :manage, Spree::Payment
15
+ can :manage, Spree::Shipment
16
+ can :manage, Spree::Adjustment
17
+ can :manage, Spree::LineItem
18
+ can :manage, Spree::ReturnAuthorization
19
+ can :manage, Spree::CustomerReturn
20
+ can :manage, Spree::Reimbursement
21
+ can :manage, Spree::Refund
22
+ can :manage, Spree::StoreCredit
23
+ can :manage, Spree::GiftCard
24
+
25
+ # Order-specific restrictions
26
+ cannot :cancel, Spree::Order
27
+ can :cancel, Spree::Order, &:allow_cancel?
28
+ cannot :destroy, Spree::Order
29
+ can :destroy, Spree::Order, &:can_be_deleted?
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ # Permission set for viewing products and catalog information.
2
+ #
3
+ # This permission set provides read-only access to products, variants,
4
+ # and related catalog models.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:content_editor, Spree::PermissionSets::ProductDisplay)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class ProductDisplay < Base
12
+ def activate!
13
+ can [:read, :admin, :index], Spree::Product
14
+ can [:read, :admin], Spree::Variant
15
+ can [:read, :admin], Spree::OptionType
16
+ can [:read, :admin], Spree::OptionValue
17
+ can [:read, :admin], Spree::Property
18
+ can [:read, :admin], Spree::ProductProperty
19
+ can [:read, :admin], Spree::Metafield
20
+ can [:read, :admin], Spree::Taxon
21
+ can [:read, :admin], Spree::Taxonomy
22
+ can [:read, :admin], Spree::Classification
23
+ can [:read, :admin], Spree::Price
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # Permission set for full product and catalog management.
2
+ #
3
+ # This permission set provides complete access to manage products, variants,
4
+ # and related catalog models like taxonomies and properties.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:merchandiser, Spree::PermissionSets::ProductManagement)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class ProductManagement < Base
12
+ def activate!
13
+ can :manage, Spree::Product
14
+ can :manage, Spree::Variant
15
+ can :manage, Spree::OptionType
16
+ can :manage, Spree::OptionValue
17
+ can :manage, Spree::Property
18
+ can :manage, Spree::ProductProperty
19
+ can :manage, Spree::Taxon
20
+ can :manage, Spree::Taxonomy
21
+ can :manage, Spree::Classification
22
+ can :manage, Spree::Price
23
+ can :manage, Spree::Asset
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,22 @@
1
+ # Permission set for managing promotions and discounts.
2
+ #
3
+ # This permission set provides access to create and manage promotions,
4
+ # coupon codes, and promotion rules.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:marketing, Spree::PermissionSets::PromotionManagement)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class PromotionManagement < Base
12
+ def activate!
13
+ can :manage, Spree::Promotion
14
+ can :manage, Spree::PromotionRule
15
+ can :manage, Spree::PromotionAction
16
+ can :manage, Spree::PromotionCategory
17
+ can :manage, Spree::CouponCode
18
+ can [:read, :admin], Spree::Metafield
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ # Permission set for managing roles and permissions.
2
+ #
3
+ # This permission set provides access to manage roles and user assignments.
4
+ # Note: The admin role cannot be modified.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:admin, Spree::PermissionSets::RoleManagement)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class RoleManagement < Base
12
+ def activate!
13
+ can :manage, Spree::Role
14
+ can :manage, Spree::RoleUser
15
+
16
+ # Protect the admin role from modification
17
+ cannot [:update, :destroy], Spree::Role, name: ['admin']
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ # Permission set for viewing stock and inventory information.
2
+ #
3
+ # This permission set provides read-only access to stock items,
4
+ # locations, and movements.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:warehouse_viewer, Spree::PermissionSets::StockDisplay)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class StockDisplay < Base
12
+ def activate!
13
+ can [:read, :admin, :index], Spree::StockItem
14
+ can [:read, :admin], Spree::StockLocation
15
+ can [:read, :admin], Spree::StockMovement
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # Permission set for full stock and inventory management.
2
+ #
3
+ # This permission set provides complete access to manage stock items,
4
+ # locations, and movements.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:warehouse_manager, Spree::PermissionSets::StockManagement)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class StockManagement < Base
12
+ def activate!
13
+ can :manage, Spree::StockItem
14
+ can :manage, Spree::StockLocation
15
+ can :manage, Spree::StockMovement
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # Permission set granting full administrative access.
2
+ #
3
+ # This permission set provides unrestricted access to all resources,
4
+ # with some safety restrictions for critical operations.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:admin, Spree::PermissionSets::SuperUser)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class SuperUser < Base
12
+ def activate!
13
+ can :manage, :all
14
+
15
+ # Safety restrictions
16
+ cannot :cancel, Spree::Order
17
+ can :cancel, Spree::Order, &:allow_cancel?
18
+ cannot :destroy, Spree::Order
19
+ can :destroy, Spree::Order, &:can_be_deleted?
20
+ cannot [:edit, :update], Spree::RefundReason, mutable: false
21
+ cannot [:edit, :update], Spree::ReimbursementType, mutable: false
22
+
23
+ # Protect the admin role from modification
24
+ cannot [:update, :destroy], Spree::Role, name: ['admin']
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ # Permission set for viewing users and related information.
2
+ #
3
+ # This permission set provides read-only access to user accounts,
4
+ # addresses, and credit cards.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:support_staff, Spree::PermissionSets::UserDisplay)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class UserDisplay < Base
12
+ def activate!
13
+ can [:read, :admin, :index], Spree.user_class
14
+ can [:read, :admin], Spree::Address
15
+ can [:read, :admin], Spree::CreditCard
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ # Permission set for full user management.
2
+ #
3
+ # This permission set provides complete access to manage user accounts,
4
+ # addresses, and credit cards.
5
+ #
6
+ # @example
7
+ # Spree.permissions.assign(:customer_service, Spree::PermissionSets::UserManagement)
8
+ #
9
+ module Spree
10
+ module PermissionSets
11
+ class UserManagement < Base
12
+ def activate!
13
+ can :manage, Spree.user_class
14
+ can :manage, Spree::Address
15
+ can :manage, Spree::CreditCard
16
+ can [:read, :admin], Spree::Metafield
17
+ end
18
+ end
19
+ end
20
+ end
@@ -47,9 +47,9 @@ module Spree
47
47
  current_quantity = order.quantity_of(item.variant)
48
48
  next unless current_quantity < item.quantity && item_available?(item)
49
49
 
50
- line_item = Spree::Dependencies.cart_add_item_service.constantize.call(order: order,
51
- variant: item.variant,
52
- quantity: item.quantity - current_quantity).value
50
+ line_item = Spree.cart_add_item_service.call(order: order,
51
+ variant: item.variant,
52
+ quantity: item.quantity - current_quantity).value
53
53
  action_taken = true if line_item.try(:valid?)
54
54
  end
55
55
  action_taken
@@ -68,9 +68,9 @@ module Spree
68
68
  line_item = order.find_line_item_by_variant(item.variant)
69
69
  next unless line_item.present?
70
70
 
71
- Spree::Dependencies.cart_remove_item_service.constantize.call(order: order,
72
- variant: item.variant,
73
- quantity: (item.quantity || 1))
71
+ Spree.cart_remove_item_service.call(order: order,
72
+ variant: item.variant,
73
+ quantity: (item.quantity || 1))
74
74
  action_taken = true
75
75
  end
76
76
 
@@ -133,7 +133,7 @@ module Spree
133
133
  line_item = order.find_line_item_by_variant(item.variant)
134
134
  next if line_item.blank?
135
135
 
136
- Spree::Dependencies.cart_remove_item_service.constantize.call(order: order, variant: item.variant, quantity: item.quantity)
136
+ Spree.cart_remove_item_service.call(order: order, variant: item.variant, quantity: item.quantity)
137
137
  end
138
138
  end
139
139
 
@@ -77,7 +77,7 @@ module Spree
77
77
 
78
78
  # your shipping method subclasses can override this method to provide a custom tracking number service
79
79
  def tracking_number_service(tracking)
80
- @tracking_number_service ||= Spree::Dependencies.tracking_number_service.constantize.new(tracking)
80
+ @tracking_number_service ||= Spree.tracking_number_service.new(tracking)
81
81
  end
82
82
 
83
83
  def self.calculators
@@ -210,7 +210,7 @@ module Spree
210
210
 
211
211
  def self.current(url = nil)
212
212
  if url.present?
213
- Spree::Dependencies.current_store_finder.constantize.new(url: url).execute
213
+ Spree.current_store_finder.new(url: url).execute
214
214
  else
215
215
  Spree::Current.store
216
216
  end
@@ -85,10 +85,13 @@ module Spree
85
85
  preference :border_shadow_blur, :integer, default: 5
86
86
 
87
87
  # PRODUCT IMAGES
88
- preference :product_listing_image_height, :integer, default: 300
89
- preference :product_listing_image_width, :integer, default: 300
90
- preference :product_listing_image_height_mobile, :integer, default: 190
91
- preference :product_listing_image_width_mobile, :integer, default: 190
88
+ # These defaults match preprocessed variant sizes for optimal performance:
89
+ # Desktop (360x360) large variant (720x720 at 2x)
90
+ # Mobile (200x200) medium variant (400x400 at 2x)
91
+ preference :product_listing_image_height, :integer, default: 360
92
+ preference :product_listing_image_width, :integer, default: 360
93
+ preference :product_listing_image_height_mobile, :integer, default: 200
94
+ preference :product_listing_image_width_mobile, :integer, default: 200
92
95
  end
93
96
  end
94
97
  end
@@ -135,10 +135,7 @@ module Spree
135
135
  private
136
136
 
137
137
  def image_url_options
138
- {
139
- width: 1000,
140
- height: 1000
141
- }
138
+ { variant: :xlarge }
142
139
  end
143
140
  end
144
141
  end
@@ -6,7 +6,7 @@ module Spree
6
6
  def call(order:, variant:, quantity: nil, public_metadata: {}, private_metadata: {}, options: {})
7
7
  ApplicationRecord.transaction do
8
8
  run :add_to_line_item
9
- run Spree::Dependencies.cart_recalculate_service.constantize
9
+ run Spree.cart_recalculate_service
10
10
  end
11
11
  end
12
12
 
@@ -18,7 +18,7 @@ module Spree
18
18
 
19
19
  return failure(variant, "#{variant.name} is not available in #{order.currency}") if variant.amount_in(order.currency).nil?
20
20
 
21
- line_item = Spree::Dependencies.line_item_by_variant_finder.constantize.new.execute(order: order, variant: variant, options: options)
21
+ line_item = Spree.line_item_by_variant_finder.new.execute(order: order, variant: variant, options: options)
22
22
 
23
23
  line_item_created = line_item.nil?
24
24
  if line_item.nil?
@@ -9,9 +9,9 @@ module Spree
9
9
 
10
10
  ActiveRecord::Base.transaction do
11
11
  line_item = remove_from_line_item(order: order, variant: variant, quantity: quantity, options: options)
12
- Spree::Dependencies.cart_recalculate_service.constantize.call(line_item: line_item,
13
- order: order,
14
- options: options)
12
+ Spree.cart_recalculate_service.call(line_item: line_item,
13
+ order: order,
14
+ options: options)
15
15
  success(line_item)
16
16
  end
17
17
  end
@@ -19,7 +19,7 @@ module Spree
19
19
  private
20
20
 
21
21
  def remove_from_line_item(order:, variant:, quantity:, options:)
22
- line_item = Spree::Dependencies.line_item_by_variant_finder.constantize.new.execute(order: order, variant: variant, options: options)
22
+ line_item = Spree.line_item_by_variant_finder.new.execute(order: order, variant: variant, options: options)
23
23
 
24
24
  raise ActiveRecord::RecordNotFound if line_item.nil?
25
25
 
@@ -7,9 +7,9 @@ module Spree
7
7
  options ||= {}
8
8
  ActiveRecord::Base.transaction do
9
9
  order.line_items.destroy(line_item)
10
- Spree::Dependencies.cart_recalculate_service.constantize.new.call(order: order,
11
- line_item: line_item,
12
- options: options)
10
+ Spree.cart_recalculate_service.new.call(order: order,
11
+ line_item: line_item,
12
+ options: options)
13
13
  end
14
14
  success(line_item)
15
15
  end
@@ -49,7 +49,7 @@ module Spree
49
49
  end
50
50
 
51
51
  def cart_remove_line_item_service
52
- Spree::Dependencies.cart_remove_line_item_service.constantize
52
+ Spree.cart_remove_line_item_service
53
53
  end
54
54
  end
55
55
  end
@@ -6,7 +6,7 @@ module Spree
6
6
  def call(order:, line_item:, quantity: nil)
7
7
  ActiveRecord::Base.transaction do
8
8
  run :change_item_quantity
9
- run Spree::Dependencies.cart_recalculate_service.constantize
9
+ run Spree.cart_recalculate_service
10
10
  end
11
11
  end
12
12
 
@@ -15,7 +15,7 @@ module Spree
15
15
  transitions_count = 0
16
16
 
17
17
  until cannot_make_transition?(order, state)
18
- next_result = Spree::Dependencies.checkout_next_service.constantize.call(order: order)
18
+ next_result = Spree.checkout_next_service.call(order: order)
19
19
  return failure(order, order.errors) if next_result.failure? && (transitions_count.zero? || state.present?)
20
20
 
21
21
  transitions_count +=1
@@ -4,7 +4,7 @@ module Spree
4
4
  prepend Spree::ServiceModule::Base
5
5
 
6
6
  def call(order:)
7
- Spree::Dependencies.checkout_next_service.constantize.call(order: order) until cannot_make_transition?(order)
7
+ Spree.checkout_next_service.call(order: order) until cannot_make_transition?(order)
8
8
 
9
9
  if order.reload.complete?
10
10
  success(order)
@@ -87,19 +87,19 @@ module Spree
87
87
  end
88
88
 
89
89
  def optional_attributes
90
- Spree::Dependencies.data_feeds_google_optional_attributes_service.constantize.new
90
+ Spree.data_feeds_google_optional_attributes_service.new
91
91
  end
92
92
 
93
93
  def required_attributes
94
- Spree::Dependencies.data_feeds_google_required_attributes_service.constantize.new
94
+ Spree.data_feeds_google_required_attributes_service.new
95
95
  end
96
96
 
97
97
  def optional_sub_attributes
98
- Spree::Dependencies.data_feeds_google_optional_sub_attributes_service.constantize.new
98
+ Spree.data_feeds_google_optional_sub_attributes_service.new
99
99
  end
100
100
 
101
101
  def products_list
102
- Spree::Dependencies.data_feeds_google_products_list.constantize.new
102
+ Spree.data_feeds_google_products_list.new
103
103
  end
104
104
  end
105
105
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  protected
5
5
 
6
6
  def recalculate_service
7
- Spree::Dependencies.cart_recalculate_service.constantize
7
+ Spree.cart_recalculate_service
8
8
  end
9
9
  end
10
10
  end
@@ -12,11 +12,11 @@ module Spree
12
12
  end
13
13
 
14
14
  def add_item_service
15
- Spree::Dependencies.cart_add_item_service.constantize
15
+ Spree.cart_add_item_service
16
16
  end
17
17
 
18
18
  def remove_item_service
19
- Spree::Dependencies.cart_remove_item_service.constantize
19
+ Spree.cart_remove_item_service
20
20
  end
21
21
  end
22
22
  end
@@ -624,6 +624,7 @@ en:
624
624
  add_new_style: Add New Style
625
625
  add_one: Add One
626
626
  add_option_value: Add Option Value
627
+ add_page_block: Add Block
627
628
  add_product: Add Product
628
629
  add_product_properties: Add Product Properties
629
630
  add_products: Add Products
@@ -0,0 +1,26 @@
1
+ module FriendlyId
2
+ module HistoryDecorator
3
+ private
4
+
5
+ # This a patch to friendly_id history module.
6
+ # Originally, it removes and re-creates a slug record if it already exists. The issue is that we use `acts_as_paranoid`
7
+ # for slugs so it sets the `deleted_at` timestamp instead of deleting the record. We need to delete the record instead.
8
+ def create_slug
9
+ return unless friendly_id
10
+ return if history_is_up_to_date?
11
+ # Allow reversion back to a previously used slug
12
+ relation = slugs.where(slug: friendly_id)
13
+ if friendly_id_config.uses?(:scoped)
14
+ relation = relation.where(scope: serialized_scope)
15
+ end
16
+ # Use `delete_all` instead of `destroy_all` to avoid the unique index error.
17
+ relation.delete_all unless relation.empty?
18
+ slugs.create! do |record|
19
+ record.slug = friendly_id
20
+ record.scope = serialized_scope if friendly_id_config.uses?(:scoped)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ FriendlyId::History.prepend(FriendlyId::HistoryDecorator)
@@ -95,6 +95,31 @@ Rails.application.config.after_initialize do
95
95
 
96
96
  # Admin partials
97
97
  # Spree.admin.partials.product_form << 'spree/admin/products/custom_section'
98
+
99
+ # Role-based permissions
100
+ # Configure which permission sets are assigned to each role
101
+ # More on permission sets: https://spreecommerce.org/docs/developer/customization/permissions
102
+ Spree.permissions.assign(:default, [Spree::PermissionSets::DefaultCustomer])
103
+ Spree.permissions.assign(:admin, [Spree::PermissionSets::SuperUser])
104
+
105
+ # Example: Create a custom role with specific permissions
106
+ # Spree.permissions.assign(:customer_service, [
107
+ # Spree::PermissionSets::DashboardDisplay,
108
+ # Spree::PermissionSets::OrderManagement,
109
+ # Spree::PermissionSets::UserDisplay
110
+ # ])
111
+ #
112
+ # Available permission sets:
113
+ # - Spree::PermissionSets::SuperUser (full admin access)
114
+ # - Spree::PermissionSets::DefaultCustomer (storefront access)
115
+ # - Spree::PermissionSets::DashboardDisplay (view admin dashboard)
116
+ # - Spree::PermissionSets::OrderDisplay / OrderManagement
117
+ # - Spree::PermissionSets::ProductDisplay / ProductManagement
118
+ # - Spree::PermissionSets::UserDisplay / UserManagement
119
+ # - Spree::PermissionSets::StockDisplay / StockManagement
120
+ # - Spree::PermissionSets::PromotionManagement
121
+ # - Spree::PermissionSets::ConfigurationManagement
122
+ # - Spree::PermissionSets::RoleManagement
98
123
  end
99
124
 
100
125
  Spree.user_class = <%= (options[:user_class].blank? ? 'Spree::LegacyUser' : options[:user_class]).inspect %>