spree_core 4.10.1 → 5.0.0.rc1

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 (476) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/spree_core_manifest.js +4 -0
  3. data/app/assets/images/google_on_white_hdpi.png +0 -0
  4. data/app/controllers/spree/base_controller.rb +1 -4
  5. data/app/finders/spree/orders/find_complete.rb +14 -2
  6. data/app/finders/spree/products/find.rb +74 -23
  7. data/app/finders/spree/stores/find_current.rb +6 -2
  8. data/app/helpers/spree/addresses_helper.rb +106 -0
  9. data/app/helpers/spree/base_helper.rb +83 -55
  10. data/app/helpers/spree/currency_helper.rb +12 -0
  11. data/app/helpers/spree/images_helper.rb +18 -0
  12. data/app/helpers/spree/mail_helper.rb +24 -0
  13. data/app/helpers/spree/products_helper.rb +1 -20
  14. data/app/javascript/spree/core/controllers/address_autocomplete_controller.js +233 -0
  15. data/app/javascript/spree/core/controllers/address_form_controller.js +98 -0
  16. data/app/javascript/spree/core/controllers/enable_button_controller.js +29 -0
  17. data/app/javascript/spree/core/helpers/address_autocomplete/google_places_suggestions_provider.js +179 -0
  18. data/app/javascript/spree/core/helpers/debounce.js +9 -0
  19. data/app/javascript/spree/core/helpers/scroll_lock.js +25 -0
  20. data/app/jobs/spree/addresses/geocode_address_job.rb +31 -0
  21. data/app/jobs/spree/base_job.rb +1 -0
  22. data/app/jobs/spree/coupon_codes/bulk_generate_job.rb +17 -0
  23. data/app/jobs/spree/exports/generate_job.rb +12 -0
  24. data/app/jobs/spree/products/auto_match_taxons_job.rb +14 -0
  25. data/app/jobs/spree/products/touch_taxons_job.rb +12 -0
  26. data/app/jobs/spree/reports/generate_job.rb +12 -0
  27. data/app/jobs/spree/stock_locations/stock_items/create_job.rb +1 -1
  28. data/app/jobs/spree/themes/duplicate_components_job.rb +59 -0
  29. data/app/jobs/spree/themes/screenshot_job.rb +81 -0
  30. data/app/jobs/spree/variants/remove_from_incomplete_orders_job.rb +2 -0
  31. data/app/jobs/spree/variants/remove_line_item_job.rb +2 -0
  32. data/app/mailers/spree/base_mailer.rb +51 -0
  33. data/app/mailers/spree/export_mailer.rb +19 -0
  34. data/app/mailers/spree/report_mailer.rb +20 -0
  35. data/app/mailers/spree/test_mailer.rb +8 -0
  36. data/app/models/action_text/rich_text_decorator.rb +11 -0
  37. data/app/models/action_text/video_embed.rb +13 -0
  38. data/app/models/acts_as_taggable_on/tag_decorator.rb +10 -0
  39. data/app/models/concerns/spree/calculated_adjustments.rb +2 -0
  40. data/app/models/concerns/spree/display_on.rb +13 -0
  41. data/app/models/concerns/spree/has_one_link.rb +42 -0
  42. data/app/models/concerns/spree/has_page_links.rb +53 -0
  43. data/app/models/concerns/spree/metadata.rb +3 -7
  44. data/app/models/concerns/spree/multi_searchable.rb +21 -0
  45. data/app/models/concerns/spree/multi_store_resource.rb +9 -0
  46. data/app/models/concerns/spree/number_as_param.rb +4 -2
  47. data/app/models/concerns/spree/parameterizable_name.rb +21 -0
  48. data/app/models/concerns/spree/previewable.rb +17 -0
  49. data/app/models/concerns/spree/product_scopes.rb +7 -7
  50. data/app/models/concerns/spree/stores/setup.rb +52 -0
  51. data/app/models/concerns/spree/stores/socials.rb +68 -0
  52. data/app/models/concerns/spree/user_address.rb +4 -0
  53. data/app/models/concerns/spree/user_methods.rb +61 -11
  54. data/app/models/concerns/spree/user_reporting.rb +14 -6
  55. data/app/models/concerns/spree/user_roles.rb +1 -1
  56. data/app/models/spree/ability.rb +4 -2
  57. data/app/models/spree/address.rb +122 -28
  58. data/app/models/spree/adjustment.rb +4 -1
  59. data/app/models/spree/asset/support/active_storage.rb +1 -1
  60. data/app/models/spree/asset.rb +18 -6
  61. data/app/models/spree/base.rb +38 -7
  62. data/app/models/spree/base_analytics_event_handler.rb +49 -0
  63. data/app/models/spree/calculator.rb +1 -1
  64. data/app/models/spree/classification.rb +10 -1
  65. data/app/models/spree/country.rb +1 -1
  66. data/app/models/spree/coupon_code.rb +38 -0
  67. data/app/models/spree/credit_card.rb +4 -3
  68. data/app/models/spree/current.rb +9 -0
  69. data/app/models/spree/custom_domain.rb +53 -0
  70. data/app/models/spree/customer_return.rb +13 -1
  71. data/app/models/spree/data_feed.rb +1 -1
  72. data/app/models/spree/digital.rb +5 -6
  73. data/app/models/spree/digital_link.rb +11 -6
  74. data/app/models/spree/export.rb +172 -0
  75. data/app/models/spree/exports/orders.rb +23 -0
  76. data/app/models/spree/exports/products.rb +35 -0
  77. data/app/models/spree/gateway/bogus.rb +5 -0
  78. data/app/models/spree/gateway.rb +14 -4
  79. data/app/models/spree/gateway_customer.rb +13 -0
  80. data/app/models/spree/image/configuration/active_storage.rb +1 -1
  81. data/app/models/spree/inventory_unit.rb +1 -1
  82. data/app/models/spree/legacy_user.rb +3 -1
  83. data/app/models/spree/line_item.rb +37 -2
  84. data/app/models/spree/log_entry.rb +1 -1
  85. data/app/models/spree/option_type.rb +40 -6
  86. data/app/models/spree/option_type_prototype.rb +1 -1
  87. data/app/models/spree/option_value.rb +35 -5
  88. data/app/models/spree/option_value_variant.rb +2 -2
  89. data/app/models/spree/order/address_book.rb +34 -15
  90. data/app/models/spree/order/checkout.rb +12 -2
  91. data/app/models/spree/order/currency_updater.rb +1 -1
  92. data/app/models/spree/order/digital.rb +14 -3
  93. data/app/models/spree/order/emails.rb +1 -1
  94. data/app/models/spree/order/payments.rb +1 -13
  95. data/app/models/spree/order/store_credit.rb +17 -5
  96. data/app/models/spree/order/webhooks.rb +1 -1
  97. data/app/models/spree/order.rb +179 -49
  98. data/app/models/spree/order_promotion.rb +1 -1
  99. data/app/models/spree/order_updater.rb +9 -3
  100. data/app/models/spree/page.rb +184 -0
  101. data/app/models/spree/page_block.rb +69 -0
  102. data/app/models/spree/page_blocks/buttons.rb +29 -0
  103. data/app/models/spree/page_blocks/heading.rb +18 -0
  104. data/app/models/spree/page_blocks/image.rb +17 -0
  105. data/app/models/spree/page_blocks/link.rb +21 -0
  106. data/app/models/spree/page_blocks/mega_nav.rb +33 -0
  107. data/app/models/spree/page_blocks/mega_nav_with_subcategories.rb +32 -0
  108. data/app/models/spree/page_blocks/nav.rb +15 -0
  109. data/app/models/spree/page_blocks/newsletter_form.rb +18 -0
  110. data/app/models/spree/page_blocks/products/buy_buttons.rb +12 -0
  111. data/app/models/spree/page_blocks/products/price.rb +18 -0
  112. data/app/models/spree/page_blocks/products/quantity_selector.rb +12 -0
  113. data/app/models/spree/page_blocks/products/share.rb +8 -0
  114. data/app/models/spree/page_blocks/products/title.rb +15 -0
  115. data/app/models/spree/page_blocks/products/variant_picker.rb +9 -0
  116. data/app/models/spree/page_blocks/subheading.rb +17 -0
  117. data/app/models/spree/page_blocks/text.rb +16 -0
  118. data/app/models/spree/page_link.rb +59 -0
  119. data/app/models/spree/page_section.rb +215 -0
  120. data/app/models/spree/page_sections/announcement_bar.rb +30 -0
  121. data/app/models/spree/page_sections/collection_banner.rb +18 -0
  122. data/app/models/spree/page_sections/custom_code.rb +11 -0
  123. data/app/models/spree/page_sections/featured_posts.rb +43 -0
  124. data/app/models/spree/page_sections/featured_product.rb +46 -0
  125. data/app/models/spree/page_sections/featured_taxon.rb +88 -0
  126. data/app/models/spree/page_sections/featured_taxons.rb +45 -0
  127. data/app/models/spree/page_sections/footer.rb +94 -0
  128. data/app/models/spree/page_sections/header.rb +62 -0
  129. data/app/models/spree/page_sections/image_banner.rb +38 -0
  130. data/app/models/spree/page_sections/image_with_text.rb +48 -0
  131. data/app/models/spree/page_sections/main_password_footer.rb +18 -0
  132. data/app/models/spree/page_sections/main_password_header.rb +20 -0
  133. data/app/models/spree/page_sections/newsletter.rb +47 -0
  134. data/app/models/spree/page_sections/page_title.rb +19 -0
  135. data/app/models/spree/page_sections/post_details.rb +19 -0
  136. data/app/models/spree/page_sections/post_grid.rb +19 -0
  137. data/app/models/spree/page_sections/product_details.rb +16 -0
  138. data/app/models/spree/page_sections/product_grid.rb +13 -0
  139. data/app/models/spree/page_sections/related_products.rb +60 -0
  140. data/app/models/spree/page_sections/rich_text.rb +20 -0
  141. data/app/models/spree/page_sections/taxon_banner.rb +18 -0
  142. data/app/models/spree/page_sections/taxon_grid.rb +17 -0
  143. data/app/models/spree/page_sections/video.rb +99 -0
  144. data/app/models/spree/pages/account.rb +15 -0
  145. data/app/models/spree/pages/cart.rb +9 -0
  146. data/app/models/spree/pages/checkout.rb +9 -0
  147. data/app/models/spree/pages/custom.rb +34 -0
  148. data/app/models/spree/pages/homepage.rb +68 -0
  149. data/app/models/spree/pages/login.rb +15 -0
  150. data/app/models/spree/pages/password.rb +57 -0
  151. data/app/models/spree/pages/post.rb +27 -0
  152. data/app/models/spree/pages/post_list.rb +32 -0
  153. data/app/models/spree/pages/product_details.rb +29 -0
  154. data/app/models/spree/pages/search_results.rb +43 -0
  155. data/app/models/spree/pages/shop_all.rb +36 -0
  156. data/app/models/spree/pages/taxon.rb +29 -0
  157. data/app/models/spree/pages/taxon_list.rb +41 -0
  158. data/app/models/spree/pages/wishlist.rb +11 -0
  159. data/app/models/spree/payment/gateway_options.rb +13 -15
  160. data/app/models/spree/payment/processing.rb +1 -1
  161. data/app/models/spree/payment/webhooks.rb +1 -1
  162. data/app/models/spree/payment.rb +61 -12
  163. data/app/models/spree/payment_capture_event.rb +1 -1
  164. data/app/models/spree/payment_method/store_credit.rb +9 -1
  165. data/app/models/spree/payment_method.rb +26 -8
  166. data/app/models/spree/payment_source.rb +2 -2
  167. data/app/models/spree/post.rb +108 -0
  168. data/app/models/spree/post_category.rb +33 -0
  169. data/app/models/spree/preference.rb +1 -1
  170. data/app/models/spree/price.rb +10 -3
  171. data/app/models/spree/product/webhooks.rb +1 -1
  172. data/app/models/spree/product.rb +325 -54
  173. data/app/models/spree/product_option_type.rb +1 -1
  174. data/app/models/spree/product_promotion_rule.rb +1 -1
  175. data/app/models/spree/product_property.rb +4 -1
  176. data/app/models/spree/promotion/actions/create_line_items.rb +37 -2
  177. data/app/models/spree/promotion/rules/country.rb +22 -4
  178. data/app/models/spree/promotion/rules/currency.rb +21 -0
  179. data/app/models/spree/promotion/rules/item_total.rb +12 -3
  180. data/app/models/spree/promotion/rules/option_value.rb +5 -20
  181. data/app/models/spree/promotion/rules/product.rb +33 -1
  182. data/app/models/spree/promotion/rules/taxon.rb +31 -0
  183. data/app/models/spree/promotion/rules/user.rb +33 -4
  184. data/app/models/spree/promotion.rb +136 -15
  185. data/app/models/spree/promotion_action.rb +31 -1
  186. data/app/models/spree/promotion_action_line_item.rb +1 -1
  187. data/app/models/spree/promotion_category.rb +1 -1
  188. data/app/models/spree/promotion_handler/cart.rb +1 -1
  189. data/app/models/spree/promotion_handler/coupon.rb +46 -8
  190. data/app/models/spree/promotion_handler/free_shipping.rb +1 -1
  191. data/app/models/spree/promotion_handler/promotion_duplicator.rb +6 -5
  192. data/app/models/spree/promotion_rule.rb +23 -1
  193. data/app/models/spree/promotion_rule_taxon.rb +1 -1
  194. data/app/models/spree/promotion_rule_user.rb +1 -1
  195. data/app/models/spree/property.rb +11 -3
  196. data/app/models/spree/property_prototype.rb +1 -1
  197. data/app/models/spree/prototype.rb +1 -1
  198. data/app/models/spree/prototype_taxon.rb +1 -1
  199. data/app/models/spree/refund.rb +24 -4
  200. data/app/models/spree/refund_reason.rb +12 -2
  201. data/app/models/spree/reimbursement/credit.rb +1 -1
  202. data/app/models/spree/reimbursement/emails.rb +1 -1
  203. data/app/models/spree/reimbursement.rb +5 -3
  204. data/app/models/spree/reimbursement_type.rb +1 -1
  205. data/app/models/spree/report.rb +110 -0
  206. data/app/models/spree/report_line_item.rb +27 -0
  207. data/app/models/spree/report_line_items/products_performance.rb +76 -0
  208. data/app/models/spree/report_line_items/sales_total.rb +49 -0
  209. data/app/models/spree/reports/products_performance.rb +44 -0
  210. data/app/models/spree/reports/sales_total.rb +14 -0
  211. data/app/models/spree/return_authorization.rb +4 -1
  212. data/app/models/spree/return_authorization_reason.rb +1 -1
  213. data/app/models/spree/return_item.rb +2 -1
  214. data/app/models/spree/role.rb +5 -2
  215. data/app/models/spree/role_user.rb +2 -2
  216. data/app/models/spree/shipment/emails.rb +1 -1
  217. data/app/models/spree/shipment/webhooks.rb +1 -1
  218. data/app/models/spree/shipment.rb +14 -4
  219. data/app/models/spree/shipping_category.rb +1 -1
  220. data/app/models/spree/shipping_method.rb +48 -8
  221. data/app/models/spree/shipping_method_category.rb +1 -1
  222. data/app/models/spree/shipping_method_zone.rb +1 -1
  223. data/app/models/spree/shipping_rate.rb +21 -3
  224. data/app/models/spree/state.rb +1 -1
  225. data/app/models/spree/state_change.rb +1 -1
  226. data/app/models/spree/stock_item/webhooks.rb +1 -1
  227. data/app/models/spree/stock_item.rb +9 -6
  228. data/app/models/spree/stock_location.rb +35 -8
  229. data/app/models/spree/stock_movement/webhooks.rb +1 -1
  230. data/app/models/spree/stock_movement.rb +9 -3
  231. data/app/models/spree/stock_transfer.rb +41 -3
  232. data/app/models/spree/store.rb +345 -72
  233. data/app/models/spree/store_credit.rb +12 -4
  234. data/app/models/spree/store_credit_category.rb +1 -1
  235. data/app/models/spree/store_credit_event.rb +21 -1
  236. data/app/models/spree/store_credit_type.rb +1 -1
  237. data/app/models/spree/store_payment_method.rb +1 -1
  238. data/app/models/spree/store_product.rb +1 -1
  239. data/app/models/spree/store_promotion.rb +1 -1
  240. data/app/models/spree/tax_category.rb +15 -1
  241. data/app/models/spree/tax_rate.rb +1 -1
  242. data/app/models/spree/taxon.rb +210 -27
  243. data/app/models/spree/taxon_image/configuration/active_storage.rb +1 -1
  244. data/app/models/spree/taxon_rule.rb +25 -0
  245. data/app/models/spree/taxon_rules/available_on.rb +20 -0
  246. data/app/models/spree/taxon_rules/sale.rb +16 -0
  247. data/app/models/spree/taxon_rules/tag.rb +19 -0
  248. data/app/models/spree/taxonomy.rb +3 -2
  249. data/app/models/spree/theme.rb +200 -0
  250. data/app/models/spree/themes/default.rb +94 -0
  251. data/app/models/spree/variant/webhooks.rb +1 -1
  252. data/app/models/spree/variant.rb +211 -62
  253. data/app/models/spree/wished_item.rb +1 -1
  254. data/app/models/spree/wishlist.rb +1 -1
  255. data/app/models/spree/zone.rb +1 -1
  256. data/app/models/spree/zone_member.rb +1 -1
  257. data/app/presenters/spree/csv/order_line_item_presenter.rb +145 -0
  258. data/app/presenters/spree/csv/product_presenter.rb +63 -0
  259. data/app/presenters/spree/csv/product_variant_presenter.rb +130 -0
  260. data/app/services/spree/addresses/create.rb +31 -6
  261. data/app/services/spree/addresses/helper.rb +7 -4
  262. data/app/services/spree/addresses/update.rb +79 -12
  263. data/app/services/spree/cart/remove_out_of_stock_items.rb +56 -0
  264. data/app/services/spree/checkout/add_store_credit.rb +6 -1
  265. data/app/services/spree/checkout/advance.rb +44 -4
  266. data/app/services/spree/checkout/select_shipping_method.rb +2 -0
  267. data/app/services/spree/coupon_codes/bulk_generate.rb +37 -0
  268. data/app/services/spree/coupon_codes/coupon_codes_handler.rb +34 -0
  269. data/app/services/spree/orders/create_user_account.rb +70 -0
  270. data/app/services/spree/orders/update_contact_information.rb +19 -0
  271. data/app/services/spree/products/auto_match_taxons.rb +64 -0
  272. data/app/services/spree/products/duplicator.rb +121 -0
  273. data/app/services/spree/products/prepare_nested_attributes.rb +169 -0
  274. data/app/services/spree/seeds/admin_user.rb +22 -0
  275. data/app/services/spree/seeds/all.rb +1 -0
  276. data/app/services/spree/seeds/stores.rb +5 -10
  277. data/app/services/spree/seeds/zones.rb +2 -0
  278. data/app/services/spree/tags/bulk_add.rb +38 -0
  279. data/app/services/spree/tags/bulk_remove.rb +24 -0
  280. data/app/services/spree/taxons/add_products.rb +39 -0
  281. data/app/services/spree/taxons/regenerate_products.rb +53 -0
  282. data/app/services/spree/taxons/remove_products.rb +53 -0
  283. data/app/services/spree/taxons/touch_featured_sections.rb +21 -0
  284. data/app/services/spree/themes/duplicator.rb +40 -0
  285. data/app/services/spree/variants/remove_line_items.rb +1 -1
  286. data/app/sorters/spree/classifications/sort.rb +68 -0
  287. data/app/sorters/spree/products/sort.rb +2 -3
  288. data/app/views/action_text/video_embeds/_thumbnail.html.erb +1 -0
  289. data/app/views/action_text/video_embeds/_video_embed.html.erb +3 -0
  290. data/app/views/active_storage/blobs/_blob.html.erb +20 -0
  291. data/app/views/layouts/action_text/contents/_content.html.erb +3 -0
  292. data/app/views/layouts/spree/base_mailer.html.erb +46 -0
  293. data/app/views/spree/addresses/_form.html.erb +58 -0
  294. data/app/views/spree/addresses/_suggestions_box.erb +14 -0
  295. data/app/views/spree/export_mailer/export_done.html.erb +15 -0
  296. data/app/views/spree/report_mailer/report_done.html.erb +15 -0
  297. data/app/views/spree/shared/_base_mailer_footer.html.erb +12 -0
  298. data/app/views/spree/shared/_base_mailer_header.html.erb +6 -0
  299. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +456 -0
  300. data/app/views/spree/shared/_google_places_api_loader.html.erb +7 -0
  301. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  302. data/app/views/spree/shared/_mailer_logo.html.erb +41 -0
  303. data/app/views/spree/shared/_payment.html.erb +41 -0
  304. data/app/views/spree/test_mailer/test_email.html.erb +40 -0
  305. data/app/views/spree/test_mailer/test_email.text.erb +4 -0
  306. data/config/i18n-tasks.yml +178 -0
  307. data/config/importmap.rb +14 -0
  308. data/config/initializers/acts_as_taggable_on.rb +2 -0
  309. data/config/initializers/inflections.rb +2 -0
  310. data/config/initializers/mobility.rb +4 -0
  311. data/config/initializers/oembed.rb +1 -0
  312. data/config/locales/en.yml +823 -413
  313. data/config/routes.rb +6 -5
  314. data/db/migrate/20210914000000_spree_four_three.rb +0 -79
  315. data/db/migrate/20240913143518_change_default_value_of_spree_option_types_filterable.rb +5 -0
  316. data/db/migrate/20240914153106_add_display_on_to_spree_properties.rb +5 -0
  317. data/db/migrate/20240915144935_add_position_to_spree_properties.rb +6 -0
  318. data/db/migrate/20241004181911_create_spree_coupon_codes.rb +15 -0
  319. data/db/migrate/20241005093437_add_multi_code_to_spree_promotions.rb +14 -0
  320. data/db/migrate/20241014140140_translate_rich_texts.rb +17 -0
  321. data/db/migrate/20241030134309_create_spree_exports.rb +23 -0
  322. data/db/migrate/20241104083457_migrate_spree_promotion_rules_option_value_eligible_values.rb +16 -0
  323. data/db/migrate/20241123110646_add_estimated_transit_fields_to_spree_shipping_methods.rb +6 -0
  324. data/db/migrate/20241127193411_create_spree_taxon_rules.rb +13 -0
  325. data/db/migrate/20241127223627_add_rules_match_policy_and_sort_order_to_spree_taxons.rb +6 -0
  326. data/db/migrate/20241128103947_add_automatic_to_spree_taxons.rb +5 -0
  327. data/db/migrate/20241218183905_add_gateway_customer_profile_id_to_spree_payment_sources.rb +5 -0
  328. data/db/migrate/20250107220432_add_accept_marketing_and_signup_for_an_account_to_spree_orders.rb +6 -0
  329. data/db/migrate/20250110171203_add_quick_checkout_to_spree_addresses.rb +6 -0
  330. data/db/migrate/20250113180019_add_preferences_to_spree_stores.rb +5 -0
  331. data/db/migrate/20250114193857_add_metadata_to_spree_stores.rb +13 -0
  332. data/db/migrate/20250119165904_create_spree_custom_domains.rb +22 -0
  333. data/db/migrate/20250120094216_create_page_builder_models.rb +78 -0
  334. data/db/migrate/20250120152208_add_default_locale_to_action_text_rich_texts.rb +7 -0
  335. data/db/migrate/20250121160028_create_spree_posts_and_spree_post_categories.rb +33 -0
  336. data/db/migrate/20250122113708_add_first_and_last_name_to_spree_admin_class.rb +9 -0
  337. data/db/migrate/20250123135358_add_custom_code_fields_to_spree_store.rb +7 -0
  338. data/db/migrate/20250127083740_add_kind_to_spree_properties.rb +5 -0
  339. data/db/migrate/20250127112758_add_latitude_and_longitude_to_spree_addresses.rb +6 -0
  340. data/db/migrate/20250127151258_add_phone_to_spree_users.rb +5 -0
  341. data/db/migrate/20250204162453_create_spree_reports.rb +13 -0
  342. data/db/migrate/20250207084000_add_accepts_email_marketing_field_to_spree_users_table.rb +6 -0
  343. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +11 -0
  344. data/db/migrate/20250304115943_add_performed_by_to_spree_reimbursements.rb +5 -0
  345. data/db/migrate/20250305121352_remove_page_builder_indices.rb +11 -0
  346. data/db/migrate/20250305121657_remove_spree_posts_indices.rb +7 -0
  347. data/db/migrate/20250311105934_create_spree_gateway_customers.rb +18 -0
  348. data/db/migrate/20250312202705_add_unique_index_on_promotion_rules_associations.rb +75 -0
  349. data/db/migrate/20250313104226_add_user_type_to_spree_role_users.rb +18 -0
  350. data/db/migrate/20250313175830_add_unique_index_on_promotion_action_line_items.rb +29 -0
  351. data/db/migrate/20250314144210_create_spree_taggings_and_spree_tags.rb +38 -0
  352. data/lib/generators/spree/authentication/custom/custom_generator.rb +49 -0
  353. data/lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt +50 -0
  354. data/lib/generators/spree/authentication/devise/devise_generator.rb +57 -0
  355. data/lib/generators/spree/authentication/devise/templates/authentication_helpers.rb.tt +50 -0
  356. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  357. data/lib/generators/spree/dummy/templates/rails/database.yml +1 -0
  358. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  359. data/lib/generators/spree/install/install_generator.rb +21 -36
  360. data/lib/generators/spree/install/templates/config/initializers/spree.rb +40 -6
  361. data/lib/normalize_string.rb +18 -0
  362. data/lib/spree/analytics.rb +11 -0
  363. data/lib/spree/core/components.rb +1 -1
  364. data/lib/spree/core/configuration.rb +14 -11
  365. data/lib/spree/core/controller_helpers/auth.rb +0 -26
  366. data/lib/spree/core/controller_helpers/order.rb +77 -12
  367. data/lib/spree/core/controller_helpers/search.rb +2 -0
  368. data/lib/spree/core/controller_helpers/store.rb +0 -5
  369. data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -0
  370. data/lib/spree/core/controller_helpers/turbo.rb +19 -0
  371. data/lib/spree/core/dependencies.rb +3 -5
  372. data/lib/spree/core/engine.rb +158 -7
  373. data/lib/spree/core/preferences/configuration.rb +2 -44
  374. data/lib/spree/core/preferences/preferable.rb +9 -0
  375. data/lib/spree/core/preferences/preferable_class_methods.rb +11 -1
  376. data/lib/spree/core/preferences/runtime_configuration.rb +13 -2
  377. data/lib/spree/core/search/base.rb +2 -0
  378. data/lib/spree/core/version.rb +1 -1
  379. data/lib/spree/core.rb +61 -11
  380. data/lib/spree/i18n.rb +5 -8
  381. data/lib/spree/migrations.rb +1 -1
  382. data/lib/spree/permitted_attributes.rb +24 -15
  383. data/lib/spree/testing_support/authorization_helpers.rb +9 -6
  384. data/lib/spree/testing_support/capybara_config.rb +11 -0
  385. data/lib/spree/testing_support/common_rake.rb +20 -12
  386. data/lib/spree/testing_support/factories/calculator_factory.rb +16 -0
  387. data/lib/spree/testing_support/factories/country_factory.rb +8 -0
  388. data/lib/spree/testing_support/factories/coupon_code_factory.rb +7 -0
  389. data/lib/spree/testing_support/factories/custom_domain_factory.rb +7 -0
  390. data/lib/spree/testing_support/factories/export_factory.rb +32 -0
  391. data/lib/spree/testing_support/factories/gateway_customer_factory.rb +7 -0
  392. data/lib/spree/testing_support/factories/order_factory.rb +14 -3
  393. data/lib/spree/testing_support/factories/page_block_factory.rb +21 -0
  394. data/lib/spree/testing_support/factories/page_factory.rb +33 -0
  395. data/lib/spree/testing_support/factories/page_link_factory.rb +7 -0
  396. data/lib/spree/testing_support/factories/page_section_factory.rb +24 -0
  397. data/lib/spree/testing_support/factories/payment_factory.rb +2 -2
  398. data/lib/spree/testing_support/factories/post_category_factory.rb +7 -0
  399. data/lib/spree/testing_support/factories/post_factory.rb +10 -0
  400. data/lib/spree/testing_support/factories/product_factory.rb +3 -8
  401. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  402. data/lib/spree/testing_support/factories/promotion_action_factory.rb +5 -0
  403. data/lib/spree/testing_support/factories/promotion_factory.rb +7 -9
  404. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +12 -0
  405. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  406. data/lib/spree/testing_support/factories/report_factory.rb +33 -0
  407. data/lib/spree/testing_support/factories/role_user_factory.rb +7 -0
  408. data/lib/spree/testing_support/factories/shipping_method_factory.rb +9 -0
  409. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +5 -2
  410. data/lib/spree/testing_support/factories/store_factory.rb +6 -9
  411. data/lib/spree/testing_support/factories/taxon_factory.rb +13 -0
  412. data/lib/spree/testing_support/factories/taxon_rule_factory.rb +38 -0
  413. data/lib/spree/testing_support/factories/theme_factory.rb +14 -0
  414. data/lib/spree/testing_support/factories/user_factory.rb +13 -11
  415. data/lib/spree/testing_support/factories/variant_factory.rb +23 -5
  416. data/lib/spree/testing_support/jobs.rb +1 -7
  417. data/lib/spree/testing_support/metadata.rb +13 -1
  418. data/lib/spree/testing_support/order_walkthrough.rb +1 -7
  419. data/lib/spree/testing_support/preferences.rb +1 -4
  420. data/lib/spree/testing_support/store.rb +26 -0
  421. data/lib/spree_core.rb +1 -0
  422. data/vendor/javascript/@rails--request.js.js +4 -0
  423. data/vendor/javascript/@stimulus-components--auto-submit.js +4 -0
  424. data/vendor/javascript/stimulus-reveal-controller.js +4 -0
  425. data/vendor/javascript/tailwindcss-stimulus-components.js +4 -0
  426. metadata +340 -197
  427. data/Gemfile +0 -3
  428. data/app/finders/spree/cms_pages/find.rb +0 -41
  429. data/app/finders/spree/menus/find.rb +0 -11
  430. data/app/models/concerns/spree/display_link.rb +0 -30
  431. data/app/models/spree/cms/pages/feature_page.rb +0 -7
  432. data/app/models/spree/cms/pages/homepage.rb +0 -20
  433. data/app/models/spree/cms/pages/standard_page.rb +0 -4
  434. data/app/models/spree/cms/sections/featured_article.rb +0 -22
  435. data/app/models/spree/cms/sections/hero_image.rb +0 -38
  436. data/app/models/spree/cms/sections/image_gallery.rb +0 -97
  437. data/app/models/spree/cms/sections/product_carousel.rb +0 -14
  438. data/app/models/spree/cms/sections/rich_text_content.rb +0 -13
  439. data/app/models/spree/cms/sections/side_by_side_images.rb +0 -68
  440. data/app/models/spree/cms_page.rb +0 -70
  441. data/app/models/spree/cms_section.rb +0 -69
  442. data/app/models/spree/cms_section_image.rb +0 -9
  443. data/app/models/spree/cms_section_image_one.rb +0 -4
  444. data/app/models/spree/cms_section_image_three.rb +0 -4
  445. data/app/models/spree/cms_section_image_two.rb +0 -4
  446. data/app/models/spree/icon.rb +0 -7
  447. data/app/models/spree/linkable/homepage.rb +0 -3
  448. data/app/models/spree/linkable/uri.rb +0 -3
  449. data/app/models/spree/menu.rb +0 -66
  450. data/app/models/spree/menu_item.rb +0 -72
  451. data/brakeman.ignore +0 -328
  452. data/db/migrate/20211201202851_update_linkable_resource_types.rb +0 -10
  453. data/db/migrate/20220329113557_fix_cms_pages_unique_indexes.rb +0 -8
  454. data/lib/generators/spree/custom_authentication/custom_authentication_generator.rb +0 -23
  455. data/lib/generators/spree/custom_authentication/templates/authentication_helpers.rb.tt +0 -23
  456. data/lib/generators/spree/custom_user/custom_user_generator.rb +0 -46
  457. data/lib/generators/spree/custom_user/templates/current_user_helpers.rb.tt +0 -15
  458. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +0 -1
  459. data/lib/generators/spree/custom_user/templates/migration.rb.tt +0 -7
  460. data/lib/generators/spree/dummy/templates/package.json +0 -12
  461. data/lib/spree/core/product_duplicator.rb +0 -85
  462. data/lib/spree/core/runtime_configuration.rb +0 -10
  463. data/lib/spree/testing_support/factories/cms_page_factory.rb +0 -20
  464. data/lib/spree/testing_support/factories/cms_section_factory.rb +0 -31
  465. data/lib/spree/testing_support/factories/icon_factory.rb +0 -9
  466. data/lib/spree/testing_support/factories/menu_factory.rb +0 -16
  467. data/lib/spree/testing_support/factories/menu_item_factory.rb +0 -10
  468. data/script/rails +0 -9
  469. data/spec/fixtures/favicon.ico +0 -0
  470. data/spec/fixtures/files/icon_256x256.gif +0 -0
  471. data/spec/fixtures/files/icon_256x256.png +0 -0
  472. data/spec/fixtures/files/icon_512x512.png +0 -0
  473. data/spec/fixtures/files/img_256x128.png +0 -0
  474. data/spec/fixtures/text-file.txt +0 -1
  475. data/spec/fixtures/thinking-cat.jpg +0 -0
  476. data/spree_core.gemspec +0 -62
@@ -16,20 +16,24 @@
16
16
  # a.preferred_color
17
17
  #
18
18
  require 'spree/core/search/base'
19
- require 'spree/core/preferences/configuration'
19
+ require 'spree/core/preferences/configuration' # for compatibility reasons
20
+ require 'spree/core/preferences/runtime_configuration'
21
+ require 'spree/core/preferences/preferable'
20
22
 
21
23
  module Spree
22
24
  module Core
23
- class Configuration < Preferences::Configuration
25
+ class Configuration < Preferences::RuntimeConfiguration
24
26
  # Alphabetized to more easily lookup particular preferences
25
27
  preference :address_requires_state, :boolean, default: true, deprecated: true # should state/state_name be required
26
- preference :address_requires_phone, :boolean, default: true # Determines whether we require phone in address
28
+ preference :address_requires_phone, :boolean, default: false # Determines whether we require phone in address
27
29
  preference :allow_checkout_on_gateway_error, :boolean, default: false
28
- preference :allow_guest_checkout, :boolean, default: true # this is only used in the rails frontend, and is not implemented in API
30
+ preference :allow_empty_price_amount, :boolean, default: false
31
+ preference :allow_guest_checkout, :boolean, default: true, deprecated: true # this is only used in the rails frontend, and is not implemented in API
29
32
  preference :alternative_shipping_phone, :boolean, default: false # Request extra phone for ship addr
30
33
  preference :always_include_confirm_step, :boolean, default: false # Ensures confirmation step is always in checkout_progress bar, but does not force a confirm step if your payment methods do not support it.
31
34
  preference :always_put_site_name_in_title, :boolean, deprecated: true
32
- preference :auto_capture, :boolean, default: false # automatically capture the credit card (as opposed to just authorize and capture later)
35
+ preference :always_use_translations, :boolean, default: false
36
+ preference :auto_capture, :boolean, default: true # automatically capture the credit card (as opposed to just authorize and capture later)
33
37
  preference :auto_capture_on_dispatch, :boolean, default: false # Captures payment for each shipment in Shipment#after_ship callback, and makes Shipment.ready when payment authorized.
34
38
  preference :binary_inventory_cache, :boolean, default: false, deprecated: true # only invalidate product cache when a stock item changes whether it is in_stock
35
39
  preference :checkout_zone, :string, default: nil, deprecated: true # replace with the name of a zone if you would like to limit the countries
@@ -40,13 +44,14 @@ module Spree
40
44
  preference :disable_store_presence_validation, :boolean, default: false # when turned off disables Store presence validation for Products and Payment Methods
41
45
  preference :expedited_exchanges, :boolean, default: false # NOTE this requires payment profiles to be supported on your gateway of choice as well as a delayed job handler to be configured with activejob. kicks off an exchange shipment upon return authorization save. charge customer if they do not return items within timely manner.
42
46
  preference :expedited_exchanges_days_window, :integer, default: 14 # the amount of days the customer has to return their item after the expedited exchange is shipped in order to avoid being charged
47
+ preference :geocode_addresses, :boolean, default: true
43
48
  preference :layout, :string, deprecated: 'Please use Spree::Frontend::Config[:layout] instead'
44
49
  preference :logo, :string, deprecated: true
45
50
  preference :mailer_logo, :string, deprecated: true
46
51
  preference :max_level_in_taxons_menu, :integer, deprecated: true
47
52
  preference :non_expiring_credit_types, :array, default: []
48
53
  preference :products_per_page, :integer, default: 12
49
- preference :require_master_price, :boolean, default: true
54
+ preference :require_master_price, :boolean, default: false
50
55
  preference :restock_inventory, :boolean, default: true # Determines if a return item is restocked automatically once it has been received
51
56
  preference :return_eligibility_number_of_days, :integer, default: 365
52
57
  preference :send_core_emails, :boolean, default: true # Default mail headers settings
@@ -65,11 +70,9 @@ module Spree
65
70
  preference :storefront_taxons_path, :string, default: 't'
66
71
  preference :storefront_pages_path, :string, default: 'pages'
67
72
 
68
- # searcher_class allows spree extension writers to provide their own Search class
69
- def searcher_class
70
- Spree::Deprecation.warn('`Spree::Config.searcher_class` is deprecated and will be removed in Spree v5, please use `Spree.searcher_class` instead.')
71
- @searcher_class ||= Spree.searcher_class
72
- end
73
+ # coupon codes
74
+ preference :coupon_codes_web_limit, :integer, default: 500 # number of coupon codes to be generated in the web process, more than this will be generated in a background job
75
+ preference :coupon_codes_total_limit, :integer, default: 5000 # the maximum number of coupon codes to be generated
73
76
 
74
77
  attr_writer :searcher_class
75
78
  end
@@ -6,7 +6,6 @@ module Spree
6
6
  include Spree::Core::TokenGenerator
7
7
 
8
8
  included do
9
- before_action :set_token
10
9
  if defined?(helper_method)
11
10
  helper_method :try_spree_current_user
12
11
  end
@@ -70,31 +69,6 @@ module Spree
70
69
  current_spree_user
71
70
  end
72
71
  end
73
-
74
- # Redirect as appropriate when an access request fails. The default action is to redirect to the login screen.
75
- # Override this method in your controllers if you want to have special behavior in case the user is not authorized
76
- # to access the requested action. For example, a popup window might simply close itself.
77
- def redirect_unauthorized_access
78
- Spree::Deprecation.warn(<<-DEPRECATION, caller)
79
- Core::ControllerHelpers#redirect_unauthorized_access is deprecated and will be removed in Spree 5.0.
80
- This method is implemented differently for Storefront and Admin
81
- DEPRECATION
82
- if try_spree_current_user
83
- flash[:error] = Spree.t(:authorization_failure)
84
- redirect_to spree.forbidden_path
85
- else
86
- store_location
87
- if Spree.respond_to?(:admin_path) && request.fullpath.match(Spree.admin_path) && defined?(spree.admin_login_path)
88
- redirect_to spree.admin_login_path
89
- elsif respond_to?(:spree_login_path)
90
- redirect_to spree_login_path
91
- elsif spree.respond_to?(:root_path)
92
- redirect_to spree.root_path
93
- else
94
- redirect_to main_app.respond_to?(:root_path) ? main_app.root_path : '/'
95
- end
96
- end
97
- end
98
72
  end
99
73
  end
100
74
  end
@@ -11,6 +11,10 @@ module Spree
11
11
  end
12
12
  end
13
13
 
14
+ def order_token
15
+ @order_token ||= cookies.signed[:token] || params[:order_token]
16
+ end
17
+
14
18
  # Used in the link_to_cart helper.
15
19
  def simple_current_order
16
20
  return @simple_current_order if @simple_current_order
@@ -28,21 +32,29 @@ module Spree
28
32
  # The current incomplete order from the token for use in cart and during checkout
29
33
  def current_order(options = {})
30
34
  options[:create_order_if_necessary] ||= false
31
- options[:includes] ||= true
35
+ options[:includes] ||= false
32
36
 
33
37
  if @current_order
34
38
  @current_order.last_ip_address = ip_address
35
39
  return @current_order
36
40
  end
37
41
 
38
- @current_order = find_order_by_token_or_user(options, true)
42
+ @current_order = find_order_by_token_or_user(options, false)
39
43
 
40
44
  if options[:create_order_if_necessary] && (@current_order.nil? || @current_order.completed?)
41
- @current_order = current_store.orders.create!(current_order_params)
45
+ @current_order = current_store.orders.create!(current_order_params.except(:token))
42
46
  @current_order.associate_user! try_spree_current_user if try_spree_current_user
43
47
  @current_order.last_ip_address = ip_address
48
+
49
+ create_token_cookie(@current_order.token)
44
50
  end
45
51
 
52
+ # There is some edge case where the order doesn't have a token.
53
+ # but can't reproduce it. So let's generate one on the fly in that case.
54
+ @current_order.regenerate_token if @current_order && @current_order.token.blank?
55
+
56
+ create_token_cookie(@current_order&.token || current_order_params[:token] || params[:token]) if create_cookie_from_token?
57
+
46
58
  @current_order
47
59
  end
48
60
 
@@ -56,14 +68,26 @@ module Spree
56
68
  def set_current_order
57
69
  return unless try_spree_current_user && current_order
58
70
 
59
- orders_scope = try_spree_current_user.orders.
60
- incomplete.
61
- where.not(id: current_order.id).
62
- where(store_id: current_store.id)
71
+ orders_scope = user_orders_scope
63
72
 
64
- orders_scope.each do |order|
65
- current_order.merge!(order, try_spree_current_user)
73
+ orders_to_merge = orders_scope.limit(10)
74
+ order_ids_to_delete = orders_scope.ids - orders_to_merge.ids
75
+
76
+ orders_scope_exists = orders_scope.exists?
77
+
78
+ if orders_scope.exists?
79
+ ActiveRecord::Base.connected_to(role: :writing) do
80
+ orders_to_merge.find_each do |order|
81
+ current_order.merge!(order, try_spree_current_user)
82
+ end
83
+
84
+ Spree::Order.where(id: order_ids_to_delete).find_each do |order|
85
+ Rails.logger.error("Failed to destroy order #{order.id} while merging") unless order.destroy
86
+ end
87
+ end
66
88
  end
89
+
90
+ orders_scope_exists
67
91
  end
68
92
 
69
93
  def ip_address
@@ -72,21 +96,49 @@ module Spree
72
96
 
73
97
  private
74
98
 
99
+ def user_orders_scope
100
+ try_spree_current_user.orders.
101
+ incomplete.
102
+ not_canceled.
103
+ where.not(id: current_order.id).
104
+ where(store_id: current_store.id)
105
+ end
106
+
107
+ def create_cookie_from_token?
108
+ cookies.signed[:token].blank? &&
109
+ (current_order_params[:token].present? || params[:token].present?)
110
+ end
111
+
112
+ def checkout_complete_path?
113
+ request.path == spree.checkout_complete_path(current_order_params[:token] || params[:token])
114
+ end
115
+
116
+ def create_token_cookie(token)
117
+ cookies.signed[:token] = {
118
+ value: token,
119
+ expires: 90.days.from_now,
120
+ secure: Rails.configuration.force_ssl || Rails.application.config.ssl_options[:secure_cookies],
121
+ domain: current_store.url_or_custom_domain
122
+ }
123
+ end
124
+
75
125
  def last_incomplete_order(includes = {})
76
126
  @last_incomplete_order ||= try_spree_current_user.last_incomplete_spree_order(current_store, includes: includes)
77
127
  end
78
128
 
79
129
  def current_order_params
80
- { currency: current_currency, token: cookies.signed[:token], user_id: try_spree_current_user.try(:id) }
130
+ @current_order_params ||= { currency: current_currency, token: order_token, user_id: try_spree_current_user.try(:id) }
81
131
  end
82
132
 
83
133
  def find_order_by_token_or_user(options = {}, with_adjustments = false)
134
+ return nil if try_spree_current_user.nil? && order_token.blank?
135
+
84
136
  options[:lock] ||= false
85
137
 
86
138
  includes = options[:includes] ? order_includes : {}
87
139
 
88
140
  # Find any incomplete orders for the token
89
- incomplete_orders = current_store.orders.incomplete.includes(includes)
141
+ incomplete_orders = current_store.orders.incomplete.not_canceled.includes(includes)
90
142
 
91
143
  token_order_params = current_order_params.except(:user_id)
92
144
  order = if with_adjustments
@@ -102,7 +154,20 @@ module Spree
102
154
  end
103
155
 
104
156
  def order_includes
105
- { line_items: [variant: [:images, :option_values, :product]] }
157
+ {
158
+ line_items: {
159
+ variant: [
160
+ :images,
161
+ :prices,
162
+ :default_price,
163
+ :stock_items,
164
+ :stock_locations,
165
+ { option_values: :option_type },
166
+ { stock_items: :stock_location },
167
+ { product: :master }
168
+ ]
169
+ }
170
+ }
106
171
  end
107
172
  end
108
173
  end
@@ -3,6 +3,8 @@ module Spree
3
3
  module ControllerHelpers
4
4
  module Search
5
5
  def build_searcher(params)
6
+ Spree::Deprecation.warn("Spree::Core::ControllerHelpers::Search is deprecated and will be removed in Spree 6.")
7
+
6
8
  Spree.searcher_class.new(params).tap do |searcher|
7
9
  searcher.current_user = try_spree_current_user
8
10
  searcher.current_currency = current_currency&.upcase
@@ -8,7 +8,6 @@ module Spree
8
8
  if defined?(helper_method)
9
9
  helper_method :current_store
10
10
  helper_method :current_price_options
11
- helper_method :available_menus
12
11
  end
13
12
  end
14
13
 
@@ -16,10 +15,6 @@ module Spree
16
15
  @current_store ||= current_store_finder.new(url: request.env['SERVER_NAME']).execute
17
16
  end
18
17
 
19
- def available_menus
20
- @available_menus ||= current_store.menus
21
- end
22
-
23
18
  def store_locale
24
19
  current_store.default_locale
25
20
  end
@@ -37,6 +37,10 @@ module Spree
37
37
  product_properties_attributes: permitted_product_properties_attributes
38
38
  ]
39
39
  end
40
+
41
+ def permitted_store_attributes
42
+ permitted_attributes.store_attributes + Spree::Store::SUPPORTED_SOCIAL_NETWORKS.map { |social| "store_#{social}" }
43
+ end
40
44
  end
41
45
  end
42
46
  end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module Core
3
+ module ControllerHelpers
4
+ module Turbo
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ if defined?(helper_method)
9
+ helper_method :turbo_frame_request?, :turbo_stream_request?
10
+ end
11
+ end
12
+
13
+ def turbo_stream_request?
14
+ request.format.turbo_stream?
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -21,6 +21,7 @@ module Spree
21
21
  cart_destroy_service: 'Spree::Cart::Destroy',
22
22
  cart_associate_service: 'Spree::Cart::Associate',
23
23
  cart_change_currency_service: 'Spree::Cart::ChangeCurrency',
24
+ cart_remove_out_of_stock_items_service: 'Spree::Cart::RemoveOutOfStockItems',
24
25
 
25
26
  # checkout
26
27
  checkout_next_service: 'Spree::Checkout::Next',
@@ -79,9 +80,6 @@ module Spree
79
80
 
80
81
  payment_create_service: 'Spree::Payments::Create',
81
82
 
82
- # errors
83
- error_handler: 'Spree::ErrorReporter',
84
-
85
83
  # data feeds
86
84
  data_feeds_google_rss_service: 'Spree::DataFeeds::Google::Rss',
87
85
  data_feeds_google_optional_attributes_service: 'Spree::DataFeeds::Google::OptionalAttributes',
@@ -92,8 +90,8 @@ module Spree
92
90
  # finders
93
91
  address_finder: 'Spree::Addresses::Find',
94
92
  country_finder: 'Spree::Countries::Find',
95
- cms_page_finder: 'Spree::CmsPages::Find',
96
- menu_finder: 'Spree::Menus::Find',
93
+ cms_page_finder: 'Spree::CmsPages::Find', # LEGACY
94
+ menu_finder: 'Spree::Menus::Find', # LEGACY
97
95
  current_order_finder: 'Spree::Orders::FindCurrent',
98
96
  current_store_finder: 'Spree::Stores::FindCurrent',
99
97
  completed_order_finder: 'Spree::Orders::FindComplete',
@@ -1,20 +1,28 @@
1
1
  require_relative 'dependencies'
2
2
  require_relative 'configuration'
3
- require_relative 'runtime_configuration'
4
3
 
5
4
  module Spree
6
5
  module Core
7
6
  class Engine < ::Rails::Engine
8
7
  Environment = Struct.new(:calculators,
9
8
  :preferences,
10
- :runtime_preferences,
11
9
  :dependencies,
12
10
  :payment_methods,
13
11
  :adjusters,
14
12
  :stock_splitters,
15
13
  :promotions,
16
14
  :line_item_comparison_hooks,
17
- :data_feed_types)
15
+ :data_feed_types,
16
+ :export_types,
17
+ :taxon_rules,
18
+ :themes,
19
+ :theme_layout_sections,
20
+ :pages,
21
+ :page_sections,
22
+ :page_blocks,
23
+ :reports,
24
+ :analytics_events,
25
+ :analytics_event_handlers)
18
26
  SpreeCalculators = Struct.new(:shipping_methods, :tax_rates, :promotion_actions_create_adjustments, :promotion_actions_create_item_adjustments)
19
27
  PromoEnvironment = Struct.new(:rules, :actions)
20
28
  isolate_namespace Spree
@@ -25,11 +33,12 @@ module Spree
25
33
  end
26
34
 
27
35
  initializer 'spree.environment', before: :load_config_initializers do |app|
28
- app.config.spree = Environment.new(SpreeCalculators.new, Spree::Core::Configuration.new, Spree::Core::RuntimeConfiguration.new, Spree::Core::Dependencies.new)
36
+ app.config.spree = Environment.new(SpreeCalculators.new, Spree::Core::Configuration.new, Spree::Core::Dependencies.new)
37
+
29
38
  app.config.active_record.yaml_column_permitted_classes ||= []
30
- app.config.active_record.yaml_column_permitted_classes << [Symbol, BigDecimal, ActiveSupport::HashWithIndifferentAccess]
39
+ app.config.active_record.yaml_column_permitted_classes.concat([Symbol, BigDecimal, ActiveSupport::HashWithIndifferentAccess])
31
40
  Spree::Config = app.config.spree.preferences
32
- Spree::RuntimeConfig = app.config.spree.runtime_preferences
41
+ Spree::RuntimeConfig = app.config.spree.preferences # for compatibility
33
42
  Spree::Dependencies = app.config.spree.dependencies
34
43
  Spree::Deprecation = ActiveSupport::Deprecation.new
35
44
  end
@@ -111,6 +120,8 @@ module Spree
111
120
  ]
112
121
 
113
122
  Rails.application.config.spree.promotions.rules.concat [
123
+ Spree::Promotion::Rules::Currency,
124
+ Spree::Promotion::Rules::Country,
114
125
  Spree::Promotion::Rules::ItemTotal,
115
126
  Spree::Promotion::Rules::Product,
116
127
  Spree::Promotion::Rules::User,
@@ -119,7 +130,6 @@ module Spree
119
130
  Spree::Promotion::Rules::OneUsePerUser,
120
131
  Spree::Promotion::Rules::Taxon,
121
132
  Spree::Promotion::Rules::OptionValue,
122
- Spree::Promotion::Rules::Country
123
133
  ]
124
134
 
125
135
  Rails.application.config.spree.promotions.actions = [
@@ -132,6 +142,131 @@ module Spree
132
142
  Rails.application.config.spree.data_feed_types = [
133
143
  Spree::DataFeed::Google
134
144
  ]
145
+
146
+ Rails.application.config.spree.export_types = [
147
+ Spree::Exports::Products,
148
+ Spree::Exports::Orders
149
+ ]
150
+
151
+ Rails.application.config.spree.taxon_rules = [
152
+ Spree::TaxonRules::Tag,
153
+ Spree::TaxonRules::AvailableOn,
154
+ Spree::TaxonRules::Sale,
155
+ ]
156
+
157
+ Rails.application.config.spree.themes = [
158
+ Spree::Themes::Default
159
+ ]
160
+
161
+ Rails.application.config.spree.theme_layout_sections = [
162
+ Spree::PageSections::AnnouncementBar,
163
+ Spree::PageSections::Header,
164
+ Spree::PageSections::Newsletter,
165
+ Spree::PageSections::Footer
166
+ ]
167
+
168
+ Rails.application.config.spree.pages = [
169
+ Spree::Pages::Cart,
170
+ Spree::Pages::Post,
171
+ Spree::Pages::TaxonList,
172
+ Spree::Pages::Custom,
173
+ Spree::Pages::ProductDetails,
174
+ Spree::Pages::ShopAll,
175
+ Spree::Pages::Taxon,
176
+ Spree::Pages::Wishlist,
177
+ Spree::Pages::SearchResults,
178
+ Spree::Pages::Checkout,
179
+ Spree::Pages::Password,
180
+ Spree::Pages::Homepage,
181
+ Spree::Pages::Login,
182
+ Spree::Pages::PostList,
183
+ Spree::Pages::Account
184
+ ]
185
+
186
+ Rails.application.config.spree.page_sections = [
187
+ Spree::PageSections::FeaturedPosts,
188
+ Spree::PageSections::TaxonGrid,
189
+ Spree::PageSections::ImageWithText,
190
+ Spree::PageSections::FeaturedTaxon,
191
+ Spree::PageSections::CollectionBanner,
192
+ Spree::PageSections::ProductDetails,
193
+ Spree::PageSections::MainPasswordFooter,
194
+ Spree::PageSections::RelatedProducts,
195
+ Spree::PageSections::CustomCode,
196
+ Spree::PageSections::TaxonBanner,
197
+ Spree::PageSections::FeaturedProduct,
198
+ Spree::PageSections::ProductGrid,
199
+ Spree::PageSections::ImageBanner,
200
+ Spree::PageSections::PageTitle,
201
+ Spree::PageSections::MainPasswordHeader,
202
+ Spree::PageSections::PostDetails,
203
+ Spree::PageSections::PostGrid,
204
+ Spree::PageSections::FeaturedTaxons,
205
+ Spree::PageSections::RichText,
206
+ Spree::PageSections::Video,
207
+ Spree::PageSections::Footer,
208
+ Spree::PageSections::Newsletter,
209
+ Spree::PageSections::Header,
210
+ Spree::PageSections::AnnouncementBar
211
+ ]
212
+
213
+ Rails.application.config.spree.page_blocks = [
214
+ Spree::PageBlocks::Link,
215
+ Spree::PageBlocks::MegaNav,
216
+ Spree::PageBlocks::MegaNavWithSubcategories,
217
+ Spree::PageBlocks::Subheading,
218
+ Spree::PageBlocks::Heading,
219
+ Spree::PageBlocks::Nav,
220
+ Spree::PageBlocks::Buttons,
221
+ Spree::PageBlocks::Text,
222
+ Spree::PageBlocks::NewsletterForm,
223
+ Spree::PageBlocks::Image,
224
+ Spree::PageBlocks::Products::Title,
225
+ Spree::PageBlocks::Products::Share,
226
+ Spree::PageBlocks::Products::Price,
227
+ Spree::PageBlocks::Products::QuantitySelector,
228
+ Spree::PageBlocks::Products::VariantPicker,
229
+ Spree::PageBlocks::Products::BuyButtons
230
+ ]
231
+
232
+ Rails.application.config.spree.reports = [
233
+ Spree::Reports::ProductsPerformance,
234
+ Spree::Reports::SalesTotal
235
+ ]
236
+
237
+ Rails.application.config.spree.analytics_events = {
238
+ product_viewed: 'Product Viewed',
239
+ product_list_viewed: 'Product List Viewed',
240
+ product_searched: 'Product Searched',
241
+ product_added: 'Product Added',
242
+ product_removed: 'Product Removed',
243
+
244
+ product_added_to_wishlist: 'Product Added to Wishlist',
245
+ product_removed_from_wishlist: 'Product Removed from Wishlist',
246
+
247
+ subscribed_to_newsletter: 'Subscribed to Newsletter',
248
+ unsubscribed_from_newsletter: 'Unsubscribed from Newsletter',
249
+
250
+ payment_info_entered: 'Payment Info Entered',
251
+ coupon_entered: 'Coupon Entered',
252
+ coupon_removed: 'Coupon Removed',
253
+ coupon_applied: 'Coupon Applied',
254
+ coupon_denied: 'Coupon Denied',
255
+
256
+ checkout_started: 'Checkout Started',
257
+ checkout_email_entered: 'Checkout Email Entered',
258
+ checkout_step_viewed: 'Checkout Step Viewed',
259
+ checkout_step_completed: 'Checkout Step Completed',
260
+
261
+ order_completed: 'Order Completed',
262
+ order_cancelled: 'Order Cancelled',
263
+ order_refunded: 'Order Refunded',
264
+ package_shipped: 'Package Shipped',
265
+ order_fulfilled: 'Order Fulfilled',
266
+
267
+ gift_card_issued: 'Gift Card Issued'
268
+ }
269
+ Rails.application.config.spree.analytics_event_handlers = []
135
270
  end
136
271
 
137
272
  initializer 'spree.promo.register.promotions.actions' do |app|
@@ -154,6 +289,22 @@ module Spree
154
289
  Migrations.new(config, engine_name).check
155
290
  end
156
291
 
292
+ initializer 'spree.core.assets' do |app|
293
+ if app.config.respond_to?(:assets)
294
+ app.config.assets.paths << root.join('app/javascript')
295
+ app.config.assets.paths << root.join('vendor/javascript')
296
+ app.config.assets.precompile += %w[spree_core_manifest]
297
+ end
298
+ end
299
+
300
+ initializer 'spree.core.importmap', before: 'importmap' do |app|
301
+ if app.config.respond_to?(:importmap)
302
+ app.config.importmap.paths << root.join('config/importmap.rb')
303
+ # https://github.com/rails/importmap-rails?tab=readme-ov-file#sweeping-the-cache-in-development-and-test
304
+ app.config.importmap.cache_sweepers << root.join('app/javascript')
305
+ end
306
+ end
307
+
157
308
  config.to_prepare do
158
309
  # Ensure spree locale paths are present before decorators
159
310
  I18n.load_path.unshift(*(Dir.glob(
@@ -21,51 +21,9 @@
21
21
  #
22
22
  #
23
23
 
24
- require 'spree/core/preferences/preferable'
24
+ require_relative 'runtime_configuration'
25
25
 
26
26
  module Spree::Preferences
27
- class Configuration
28
- include Spree::Preferences::Preferable
29
-
30
- def configure
31
- yield(self) if block_given?
32
- end
33
-
34
- def preferences
35
- ::Spree::Preferences::ScopedStore.new(self.class.name.underscore)
36
- end
37
-
38
- def reset
39
- preferences.each do |name, _value|
40
- set_preference name, preference_default(name)
41
- end
42
- end
43
-
44
- alias [] get_preference
45
- alias []= set_preference
46
-
47
- alias get get_preference
48
-
49
- def set(*args)
50
- options = args.extract_options!
51
- options.each do |name, value|
52
- set_preference name, value
53
- end
54
-
55
- set_preference args[0], args[1] if args.size == 2
56
- end
57
-
58
- def method_missing(method, *args)
59
- name = method.to_s.delete('=')
60
- if has_preference? name
61
- if method.to_s =~ /=$/
62
- set_preference(name, args.first)
63
- else
64
- get_preference name
65
- end
66
- else
67
- super
68
- end
69
- end
27
+ class Configuration < Spree::Preferences::RuntimeConfiguration
70
28
  end
71
29
  end
@@ -38,6 +38,7 @@ module Spree::Preferences::Preferable
38
38
  extend ActiveSupport::Concern
39
39
 
40
40
  included do
41
+ serialize :preferences, type: Hash, coder: YAML if defined?(serialize)
41
42
  extend Spree::Preferences::PreferableClassMethods
42
43
  end
43
44
 
@@ -95,10 +96,18 @@ module Spree::Preferences::Preferable
95
96
  ]
96
97
  end
97
98
 
99
+ def preferences_of_type(type)
100
+ defined_preferences.find_all { |preference| preference_type(preference) == type.to_sym }
101
+ end
102
+
98
103
  def clear_preferences
99
104
  preferences.keys.each { |pref| preferences.delete pref }
100
105
  end
101
106
 
107
+ def restore_preferences_for(preference_keys)
108
+ preference_keys.each { |pref| preferences[pref] = preference_default(pref) }
109
+ end
110
+
102
111
  private
103
112
 
104
113
  def convert_preference_value(value, type, nullable: false)