spree_core 5.2.6 → 5.3.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 (294) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/addresses_helper.rb +1 -23
  3. data/app/helpers/spree/base_helper.rb +25 -77
  4. data/app/helpers/spree/currency_helper.rb +2 -2
  5. data/app/helpers/spree/images_helper.rb +5 -0
  6. data/app/helpers/spree/mail_helper.rb +1 -1
  7. data/app/helpers/spree/products_helper.rb +1 -1
  8. data/app/jobs/spree/events/subscriber_job.rb +58 -0
  9. data/app/jobs/spree/products/refresh_metrics_job.rb +14 -0
  10. data/app/jobs/spree/products/touch_taxons_job.rb +0 -1
  11. data/app/jobs/spree/variants/touch_job.rb +9 -0
  12. data/app/models/concerns/spree/adjustment_source.rb +8 -0
  13. data/app/models/concerns/spree/parameterizable_name.rb +1 -1
  14. data/app/models/concerns/spree/product_scopes.rb +54 -8
  15. data/app/models/concerns/spree/publishable.rb +253 -0
  16. data/app/models/concerns/spree/unique_name.rb +1 -1
  17. data/app/models/concerns/spree/user_methods.rb +21 -1
  18. data/app/models/spree/ability.rb +3 -3
  19. data/app/models/spree/address.rb +0 -3
  20. data/app/models/spree/adjustable/promotion_accumulator.rb +1 -1
  21. data/app/models/spree/adjustment.rb +32 -6
  22. data/app/models/spree/asset.rb +6 -3
  23. data/app/models/spree/base.rb +3 -1
  24. data/app/models/spree/classification.rb +2 -2
  25. data/app/models/spree/credit_card.rb +0 -3
  26. data/app/models/spree/current.rb +24 -3
  27. data/app/models/spree/custom_domain.rb +1 -1
  28. data/app/models/spree/customer_group.rb +94 -0
  29. data/app/models/spree/customer_group_user.rb +16 -0
  30. data/app/models/spree/customer_return.rb +2 -3
  31. data/app/models/spree/digital.rb +2 -4
  32. data/app/models/spree/digital_link.rb +2 -3
  33. data/app/models/spree/event.rb +104 -0
  34. data/app/models/spree/export.rb +7 -1
  35. data/app/models/spree/gift_card.rb +13 -1
  36. data/app/models/spree/gift_card_batch.rb +3 -1
  37. data/app/models/spree/image.rb +20 -5
  38. data/app/models/spree/import.rb +17 -12
  39. data/app/models/spree/import_row.rb +13 -26
  40. data/app/models/spree/inventory_unit.rb +0 -3
  41. data/app/models/spree/invitation.rb +12 -6
  42. data/app/models/spree/line_item.rb +57 -4
  43. data/app/models/spree/newsletter_subscriber.rb +2 -0
  44. data/app/models/spree/option_type.rb +2 -5
  45. data/app/models/spree/option_value.rb +1 -4
  46. data/app/models/spree/order/checkout.rb +7 -2
  47. data/app/models/spree/order/emails.rb +3 -11
  48. data/app/models/spree/order/store_credit.rb +5 -1
  49. data/app/models/spree/order.rb +80 -31
  50. data/app/models/spree/order_updater.rb +28 -9
  51. data/app/models/spree/payment/custom_events.rb +37 -0
  52. data/app/models/spree/payment.rb +13 -4
  53. data/app/models/spree/payment_capture_event.rb +0 -4
  54. data/app/models/spree/payment_method.rb +1 -1
  55. data/app/models/spree/permission_sets/default_customer.rb +3 -3
  56. data/app/models/spree/policy.rb +1 -8
  57. data/app/models/spree/post.rb +2 -7
  58. data/app/models/spree/post_category.rb +2 -0
  59. data/app/models/spree/price.rb +8 -6
  60. data/app/models/spree/price_list.rb +263 -0
  61. data/app/models/spree/price_rule.rb +26 -0
  62. data/app/models/spree/price_rules/customer_group_rule.rb +21 -0
  63. data/app/models/spree/price_rules/user_rule.rb +19 -0
  64. data/app/models/spree/price_rules/volume_rule.rb +21 -0
  65. data/app/models/spree/price_rules/zone_rule.rb +19 -0
  66. data/app/models/spree/product.rb +117 -76
  67. data/app/models/spree/product_property.rb +2 -2
  68. data/app/models/spree/promotion/rules/customer_group.rb +22 -0
  69. data/app/models/spree/promotion/rules/user.rb +2 -2
  70. data/app/models/spree/promotion.rb +3 -4
  71. data/app/models/spree/promotion_handler/coupon.rb +3 -3
  72. data/app/models/spree/property.rb +3 -6
  73. data/app/models/spree/prototype.rb +0 -3
  74. data/app/models/spree/refund.rb +2 -3
  75. data/app/models/spree/reimbursement.rb +5 -3
  76. data/app/models/spree/report.rb +7 -1
  77. data/app/models/spree/reports/products_performance.rb +1 -1
  78. data/app/models/spree/reports/sales_total.rb +1 -1
  79. data/app/models/spree/return_authorization.rb +7 -3
  80. data/app/models/spree/return_item.rb +15 -4
  81. data/app/models/spree/shipment/custom_events.rb +47 -0
  82. data/app/models/spree/shipment.rb +12 -5
  83. data/app/models/spree/shipping_category.rb +0 -3
  84. data/app/models/spree/shipping_method.rb +0 -3
  85. data/app/models/spree/stock/quantifier.rb +1 -1
  86. data/app/models/spree/stock_item.rb +2 -0
  87. data/app/models/spree/stock_location.rb +0 -3
  88. data/app/models/spree/stock_movement/custom_events.rb +44 -0
  89. data/app/models/spree/stock_movement.rb +3 -0
  90. data/app/models/spree/stock_transfer.rb +2 -3
  91. data/app/models/spree/store.rb +64 -92
  92. data/app/models/spree/store_credit.rb +3 -4
  93. data/app/models/spree/store_product.rb +14 -0
  94. data/app/models/spree/subscriber.rb +186 -0
  95. data/app/models/spree/tax_category.rb +0 -4
  96. data/app/models/spree/tax_rate.rb +0 -3
  97. data/app/models/spree/taxon.rb +3 -36
  98. data/app/models/spree/taxonomy.rb +0 -3
  99. data/app/models/spree/variant.rb +114 -21
  100. data/app/models/spree/webhook_delivery.rb +60 -0
  101. data/app/models/spree/webhook_endpoint.rb +53 -0
  102. data/app/models/spree/wished_item.rb +2 -4
  103. data/app/models/spree/wishlist.rb +2 -3
  104. data/app/models/spree/zone.rb +0 -9
  105. data/app/paginators/spree/shared/paginate.rb +4 -0
  106. data/app/serializers/spree/events/asset_serializer.rb +22 -0
  107. data/app/serializers/spree/events/base_serializer.rb +61 -0
  108. data/app/serializers/spree/events/customer_return_serializer.rb +20 -0
  109. data/app/serializers/spree/events/digital_link_serializer.rb +20 -0
  110. data/app/serializers/spree/events/digital_serializer.rb +18 -0
  111. data/app/serializers/spree/events/export_serializer.rb +22 -0
  112. data/app/serializers/spree/events/gift_card_batch_serializer.rb +24 -0
  113. data/app/serializers/spree/events/gift_card_serializer.rb +29 -0
  114. data/app/serializers/spree/events/image_serializer.rb +9 -0
  115. data/app/serializers/spree/events/import_row_serializer.rb +23 -0
  116. data/app/serializers/spree/events/import_serializer.rb +24 -0
  117. data/app/serializers/spree/events/invitation_serializer.rb +28 -0
  118. data/app/serializers/spree/events/line_item_serializer.rb +31 -0
  119. data/app/serializers/spree/events/newsletter_subscriber_serializer.rb +21 -0
  120. data/app/serializers/spree/events/order_serializer.rb +39 -0
  121. data/app/serializers/spree/events/payment_serializer.rb +24 -0
  122. data/app/serializers/spree/events/post_category_serializer.rb +20 -0
  123. data/app/serializers/spree/events/post_serializer.rb +26 -0
  124. data/app/serializers/spree/events/price_serializer.rb +22 -0
  125. data/app/serializers/spree/events/product_serializer.rb +24 -0
  126. data/app/serializers/spree/events/promotion_serializer.rb +32 -0
  127. data/app/serializers/spree/events/refund_serializer.rb +23 -0
  128. data/app/serializers/spree/events/reimbursement_serializer.rb +22 -0
  129. data/app/serializers/spree/events/report_serializer.rb +23 -0
  130. data/app/serializers/spree/events/return_authorization_serializer.rb +22 -0
  131. data/app/serializers/spree/events/return_item_serializer.rb +27 -0
  132. data/app/serializers/spree/events/shipment_serializer.rb +24 -0
  133. data/app/serializers/spree/events/stock_item_serializer.rb +22 -0
  134. data/app/serializers/spree/events/stock_movement_serializer.rb +22 -0
  135. data/app/serializers/spree/events/stock_transfer_serializer.rb +22 -0
  136. data/app/serializers/spree/events/store_credit_serializer.rb +30 -0
  137. data/app/serializers/spree/events/user_serializer.rb +18 -0
  138. data/app/serializers/spree/events/variant_serializer.rb +34 -0
  139. data/app/serializers/spree/events/wished_item_serializer.rb +20 -0
  140. data/app/serializers/spree/events/wishlist_serializer.rb +22 -0
  141. data/app/services/spree/addresses/update.rb +1 -1
  142. data/app/services/spree/cart/add_item.rb +1 -1
  143. data/app/services/spree/coupon_codes/coupon_codes_handler.rb +2 -1
  144. data/app/services/spree/data_feeds/google/required_attributes.rb +4 -4
  145. data/app/services/spree/newsletter/verify.rb +5 -0
  146. data/app/services/spree/products/auto_match_taxons.rb +1 -1
  147. data/app/services/spree/seeds/all.rb +1 -1
  148. data/app/services/spree/taxons/add_products.rb +8 -4
  149. data/app/services/spree/taxons/regenerate_products.rb +8 -0
  150. data/app/services/spree/taxons/remove_products.rb +12 -7
  151. data/app/subscribers/spree/event_log_subscriber.rb +64 -0
  152. data/app/subscribers/spree/export_subscriber.rb +26 -0
  153. data/app/subscribers/spree/invitation_email_subscriber.rb +40 -0
  154. data/app/subscribers/spree/product_metrics_subscriber.rb +29 -0
  155. data/app/subscribers/spree/report_subscriber.rb +26 -0
  156. data/config/locales/en.yml +126 -0
  157. data/db/migrate/20251110120000_create_spree_price_lists.rb +22 -0
  158. data/db/migrate/20251110120001_create_spree_price_rules.rb +13 -0
  159. data/db/migrate/20251110120002_add_price_list_id_to_spree_prices.rb +6 -0
  160. data/db/migrate/20251110120003_add_price_list_id_to_spree_line_items.rb +5 -0
  161. data/db/migrate/20251201172118_fix_indexes_on_friendly_id_slugs.rb +8 -0
  162. data/db/migrate/20251214000001_create_spree_webhook_endpoints.rb +19 -0
  163. data/db/migrate/20251214000002_create_spree_webhook_deliveries.rb +23 -0
  164. data/db/migrate/20251222000000_add_performance_indexes_to_spree_adjustments.rb +25 -0
  165. data/db/migrate/20260112000000_fix_spree_prices_unique_indexes.rb +33 -0
  166. data/db/migrate/20260115120000_create_spree_customer_groups.rb +14 -0
  167. data/db/migrate/20260115120001_create_spree_customer_group_users.rb +14 -0
  168. data/db/migrate/20260117140831_remove_not_null_constraint_from_policy_name.rb +5 -0
  169. data/db/migrate/20260118120000_add_statistics_to_store_products.rb +11 -0
  170. data/db/migrate/20260119120000_add_counter_caches_to_spree_products.rb +9 -0
  171. data/db/migrate/20260119170000_add_counter_caches_to_spree_taxons.rb +9 -0
  172. data/db/migrate/20260120120000_add_image_count_to_spree_variants.rb +9 -0
  173. data/lib/generators/spree/dummy/dummy_generator.rb +14 -2
  174. data/lib/spree/core/configuration.rb +1 -0
  175. data/lib/spree/core/controller_helpers/auth.rb +0 -15
  176. data/lib/spree/core/controller_helpers/currency.rb +13 -9
  177. data/lib/spree/core/controller_helpers/search.rb +1 -1
  178. data/lib/spree/core/controller_helpers/store.rb +5 -1
  179. data/lib/spree/core/engine.rb +61 -78
  180. data/lib/spree/core/importer/order.rb +1 -1
  181. data/lib/spree/core/importer/product.rb +1 -1
  182. data/lib/spree/core/preferences/preferable.rb +14 -1
  183. data/lib/spree/core/pricing/context.rb +63 -0
  184. data/lib/spree/core/pricing/resolver.rb +129 -0
  185. data/lib/spree/core/search/base.rb +1 -1
  186. data/lib/spree/core/token_generator.rb +1 -1
  187. data/lib/spree/core/version.rb +1 -1
  188. data/lib/spree/core.rb +42 -47
  189. data/lib/spree/events/adapters/active_support_notifications.rb +112 -0
  190. data/lib/spree/events/adapters/base.rb +193 -0
  191. data/lib/spree/events/registry.rb +99 -0
  192. data/lib/spree/events.rb +240 -0
  193. data/lib/spree/permitted_attributes.rb +13 -2
  194. data/lib/spree/testing_support/common_rake.rb +68 -35
  195. data/lib/spree/testing_support/factories/customer_group_factory.rb +6 -0
  196. data/lib/spree/testing_support/factories/customer_group_user_factory.rb +6 -0
  197. data/lib/spree/testing_support/factories/price_factory.rb +4 -0
  198. data/lib/spree/testing_support/factories/price_list_factory.rb +34 -0
  199. data/lib/spree/testing_support/factories/price_rule_factory.rb +49 -0
  200. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +12 -0
  201. data/lib/spree/testing_support/factories/stock_item_factory.rb +6 -4
  202. data/lib/spree/testing_support/factories/store_product_factory.rb +6 -0
  203. data/lib/spree/testing_support/factories/taxon_factory.rb +0 -1
  204. data/lib/spree/testing_support/factories/webhook_delivery_factory.rb +48 -0
  205. data/lib/spree/testing_support/factories/webhook_endpoint_factory.rb +22 -0
  206. data/lib/spree/testing_support/lifecycle_events.rb +38 -0
  207. data/lib/spree/testing_support/store.rb +4 -2
  208. data/lib/spree/webhooks.rb +22 -0
  209. data/lib/tasks/products.rake +40 -0
  210. data/lib/tasks/taxons.rake +19 -0
  211. data/lib/tasks/variants.rake +18 -0
  212. metadata +112 -114
  213. data/app/jobs/spree/themes/duplicate_components_job.rb +0 -59
  214. data/app/jobs/spree/themes/screenshot_job.rb +0 -81
  215. data/app/models/concerns/spree/has_page_links.rb +0 -53
  216. data/app/models/spree/page.rb +0 -188
  217. data/app/models/spree/page_block.rb +0 -73
  218. data/app/models/spree/page_blocks/buttons.rb +0 -29
  219. data/app/models/spree/page_blocks/heading.rb +0 -18
  220. data/app/models/spree/page_blocks/image.rb +0 -20
  221. data/app/models/spree/page_blocks/link.rb +0 -21
  222. data/app/models/spree/page_blocks/mega_nav.rb +0 -33
  223. data/app/models/spree/page_blocks/mega_nav_with_subcategories.rb +0 -32
  224. data/app/models/spree/page_blocks/metafields.rb +0 -18
  225. data/app/models/spree/page_blocks/nav.rb +0 -15
  226. data/app/models/spree/page_blocks/newsletter_form.rb +0 -18
  227. data/app/models/spree/page_blocks/products/brand.rb +0 -15
  228. data/app/models/spree/page_blocks/products/buy_buttons.rb +0 -24
  229. data/app/models/spree/page_blocks/products/description.rb +0 -18
  230. data/app/models/spree/page_blocks/products/price.rb +0 -18
  231. data/app/models/spree/page_blocks/products/quantity_selector.rb +0 -20
  232. data/app/models/spree/page_blocks/products/share.rb +0 -8
  233. data/app/models/spree/page_blocks/products/title.rb +0 -19
  234. data/app/models/spree/page_blocks/products/variant_picker.rb +0 -13
  235. data/app/models/spree/page_blocks/subheading.rb +0 -17
  236. data/app/models/spree/page_blocks/text.rb +0 -16
  237. data/app/models/spree/page_link.rb +0 -60
  238. data/app/models/spree/page_section.rb +0 -222
  239. data/app/models/spree/page_sections/announcement_bar.rb +0 -28
  240. data/app/models/spree/page_sections/breadcrumbs.rb +0 -12
  241. data/app/models/spree/page_sections/collection_banner.rb +0 -18
  242. data/app/models/spree/page_sections/custom_code.rb +0 -11
  243. data/app/models/spree/page_sections/featured_posts.rb +0 -45
  244. data/app/models/spree/page_sections/featured_product.rb +0 -50
  245. data/app/models/spree/page_sections/featured_taxon.rb +0 -90
  246. data/app/models/spree/page_sections/featured_taxons.rb +0 -45
  247. data/app/models/spree/page_sections/footer.rb +0 -101
  248. data/app/models/spree/page_sections/header.rb +0 -62
  249. data/app/models/spree/page_sections/image_banner.rb +0 -55
  250. data/app/models/spree/page_sections/image_with_text.rb +0 -65
  251. data/app/models/spree/page_sections/main_password_footer.rb +0 -18
  252. data/app/models/spree/page_sections/main_password_header.rb +0 -20
  253. data/app/models/spree/page_sections/newsletter.rb +0 -54
  254. data/app/models/spree/page_sections/page_title.rb +0 -19
  255. data/app/models/spree/page_sections/post_details.rb +0 -19
  256. data/app/models/spree/page_sections/post_grid.rb +0 -19
  257. data/app/models/spree/page_sections/product_details.rb +0 -53
  258. data/app/models/spree/page_sections/product_grid.rb +0 -13
  259. data/app/models/spree/page_sections/related_products.rb +0 -58
  260. data/app/models/spree/page_sections/rich_text.rb +0 -31
  261. data/app/models/spree/page_sections/taxon_banner.rb +0 -18
  262. data/app/models/spree/page_sections/taxon_grid.rb +0 -17
  263. data/app/models/spree/page_sections/video.rb +0 -107
  264. data/app/models/spree/pages/account.rb +0 -19
  265. data/app/models/spree/pages/cart.rb +0 -19
  266. data/app/models/spree/pages/checkout.rb +0 -15
  267. data/app/models/spree/pages/custom.rb +0 -38
  268. data/app/models/spree/pages/homepage.rb +0 -72
  269. data/app/models/spree/pages/login.rb +0 -19
  270. data/app/models/spree/pages/password.rb +0 -59
  271. data/app/models/spree/pages/post.rb +0 -27
  272. data/app/models/spree/pages/post_list.rb +0 -36
  273. data/app/models/spree/pages/product_details.rb +0 -30
  274. data/app/models/spree/pages/search_results.rb +0 -43
  275. data/app/models/spree/pages/shop_all.rb +0 -40
  276. data/app/models/spree/pages/taxon.rb +0 -29
  277. data/app/models/spree/pages/taxon_list.rb +0 -41
  278. data/app/models/spree/pages/wishlist.rb +0 -15
  279. data/app/models/spree/theme.rb +0 -233
  280. data/app/models/spree/themes/default.rb +0 -97
  281. data/app/services/spree/taxons/touch_featured_sections.rb +0 -21
  282. data/db/migrate/20250120094216_create_page_builder_models.rb +0 -78
  283. data/db/migrate/20250305121352_remove_page_builder_indices.rb +0 -11
  284. data/db/migrate/20250825175217_add_missing_page_builder_indexes.rb +0 -7
  285. data/db/migrate/20250913130044_add_page_links_counter_cache_to_spree_stores.rb +0 -10
  286. data/lib/generators/spree/dummy/templates/initializers/devise.rb +0 -3
  287. data/lib/generators/spree/install/install_generator.rb +0 -219
  288. data/lib/generators/spree/install/templates/config/initializers/spree.rb +0 -126
  289. data/lib/spree/core/webhooks.rb +0 -21
  290. data/lib/spree/testing_support/factories/page_block_factory.rb +0 -22
  291. data/lib/spree/testing_support/factories/page_factory.rb +0 -33
  292. data/lib/spree/testing_support/factories/page_link_factory.rb +0 -7
  293. data/lib/spree/testing_support/factories/page_section_factory.rb +0 -27
  294. data/lib/spree/testing_support/factories/theme_factory.rb +0 -14
@@ -1,58 +0,0 @@
1
- module Spree
2
- module PageSections
3
- class RelatedProducts < Spree::PageSection
4
- before_validation :make_heading_size_valid
5
- before_validation :make_alignment_valid
6
-
7
- preference :heading, :string, default: Spree.t('page_sections.related_products.heading_default')
8
- preference :heading_size, :string, default: 'medium'
9
- preference :heading_alignment, :string, default: 'left'
10
- preference :description_alignment, :string, default: 'left'
11
- preference :max_products_to_show, :integer, default: 10
12
-
13
- def icon_name
14
- 'tags'
15
- end
16
-
17
- def lazy?
18
- true
19
- end
20
-
21
- def layout
22
- 'swiper'
23
- end
24
-
25
- def lazy_path(variables)
26
- section_id = variables[:section].id
27
- url_options = variables[:url_options] || {}
28
-
29
- if variables[:product].present?
30
- product_id = variables[:product].id
31
- Spree::Core::Engine.routes.url_helpers.related_product_path(
32
- product_id,
33
- section_id: section_id,
34
- **url_options
35
- )
36
- elsif variables[:post].present?
37
- post_id = variables[:post].id
38
- Spree::Core::Engine.routes.url_helpers.related_products_post_path(
39
- post_id,
40
- section_id: section_id,
41
- **url_options
42
- )
43
- end
44
- end
45
-
46
- private
47
-
48
- def make_alignment_valid
49
- self.preferred_heading_alignment = 'left' unless %w[left center right].include?(preferred_heading_alignment)
50
- self.preferred_description_alignment = 'left' unless %w[left center right].include?(preferred_description_alignment)
51
- end
52
-
53
- def make_heading_size_valid
54
- self.preferred_heading_size = 'small' unless %w[small medium large].include?(preferred_heading_size)
55
- end
56
- end
57
- end
58
- end
@@ -1,31 +0,0 @@
1
- module Spree
2
- module PageSections
3
- class RichText < Spree::PageSection
4
- def default_blocks
5
- [
6
- Spree::PageBlocks::Heading.new(text: Spree.t('page_sections.rich_text.heading_default')),
7
- Spree::PageBlocks::Text.new(text: Spree.t('page_sections.rich_text.text_default'))
8
- ]
9
- end
10
-
11
- def available_blocks_to_add
12
- [
13
- Spree::PageBlocks::Heading,
14
- Spree::PageBlocks::Text
15
- ]
16
- end
17
-
18
- def blocks_available?
19
- true
20
- end
21
-
22
- def can_sort_blocks?
23
- true
24
- end
25
-
26
- def icon_name
27
- 'text-caption'
28
- end
29
- end
30
- end
31
- end
@@ -1,18 +0,0 @@
1
- module Spree
2
- module PageSections
3
- class TaxonBanner < Spree::PageSection
4
- TOP_PADDING_DEFAULT = 20
5
- BOTTOM_PADDING_DEFAULT = 20
6
- TOP_BORDER_WIDTH_DEFAULT = 0
7
- BOTTOM_BORDER_WIDTH_DEFAULT = 1
8
-
9
- def icon_name
10
- 'heading'
11
- end
12
-
13
- def self.role
14
- 'system'
15
- end
16
- end
17
- end
18
- end
@@ -1,17 +0,0 @@
1
- module Spree
2
- module PageSections
3
- class TaxonGrid < Spree::PageSection
4
- TOP_BORDER_WIDTH_DEFAULT = 0
5
-
6
- preference :heading, :string, default: Spree.t('page_sections.taxon_grid.heading_default')
7
-
8
- def icon_name
9
- 'layout-grid'
10
- end
11
-
12
- def self.role
13
- 'system'
14
- end
15
- end
16
- end
17
- end
@@ -1,107 +0,0 @@
1
- module Spree
2
- module PageSections
3
- class Video < Spree::PageSection
4
- alias video asset
5
-
6
- include Spree::MemoizedData
7
- MEMOIZED_METHODS = %w(video_embed)
8
-
9
- after_create :create_video_embed, if: -> { preferred_youtube_video_url.present? }
10
- after_update :update_video_embed, if: -> { video_url_changed? || video_embed.nil? }
11
- after_destroy :destroy_video_embed
12
-
13
- preference :youtube_video_url, :string
14
- preference :youtube_video_embed_id, :string
15
- preference :width_desktop, :integer, default: 70
16
- preference :separated, :string, default: 'horizontally'
17
-
18
- def default_blocks
19
- @default_blocks.presence || [
20
- Spree::PageBlocks::Heading.new(
21
- text: Spree.t('page_sections.video.heading_1_default'),
22
- preferred_text_alignment: nil,
23
- preferred_container_alignment: nil,
24
- preferred_bottom_padding: 8,
25
- preferred_top_padding: 24,
26
- preferred_size: 'small'
27
- ),
28
- Spree::PageBlocks::Heading.new(
29
- text: Spree.t('page_sections.video.heading_2_default'),
30
- preferred_text_alignment: nil,
31
- preferred_container_alignment: nil,
32
- preferred_bottom_padding: 8,
33
- preferred_top_padding: 24,
34
- preferred_size: 'large'
35
- ),
36
- Spree::PageBlocks::Heading.new(
37
- text: store.name,
38
- preferred_text_alignment: nil,
39
- preferred_container_alignment: nil,
40
- preferred_bottom_padding: 8,
41
- preferred_top_padding: 24,
42
- preferred_size: 'small'
43
- )
44
- ]
45
- end
46
-
47
- def available_blocks_to_add
48
- [Spree::PageBlocks::Heading]
49
- end
50
-
51
- def icon_name
52
- 'movie'
53
- end
54
-
55
- def blocks_available?
56
- true
57
- end
58
-
59
- def can_sort_blocks?
60
- true
61
- end
62
-
63
- def video_embed
64
- @video_embed ||= ::ActionText::VideoEmbed.find_by(id: preferred_youtube_video_embed_id) if preferred_youtube_video_embed_id.present?
65
- end
66
-
67
- private
68
-
69
- def video_url_changed?
70
- saved_change_to_preferences? &&
71
- saved_change_to_preferences[0][:youtube_video_url] != saved_change_to_preferences[1][:youtube_video_url]
72
- end
73
-
74
- def create_video_embed
75
- oembed_response = oembed_cached_response(preferred_youtube_video_url)
76
-
77
- if oembed_response.present?
78
- embed = ::ActionText::VideoEmbed.new
79
- embed.url = preferred_youtube_video_url
80
- embed.raw_html = oembed_response.html
81
- embed.thumbnail_url = oembed_response.thumbnail_url
82
-
83
- embed.save
84
- update(preferred_youtube_video_embed_id: embed.id) if embed.persisted?
85
- end
86
- end
87
-
88
- def update_video_embed
89
- destroy_video_embed
90
- create_video_embed
91
- end
92
-
93
- def destroy_video_embed
94
- video_embed.destroy if video_embed.present?
95
- end
96
-
97
- def oembed_cached_response(url)
98
- return nil if url.blank?
99
-
100
- raw_response = Rails.cache.fetch(['oembed', url]) { ::OEmbed::Providers.get(url).fields.to_json }
101
- OEmbed::Response.create_for(raw_response, OEmbed::Providers::Youtube, url, 'json')
102
- rescue OEmbed::Error
103
- nil
104
- end
105
- end
106
- end
107
- end
@@ -1,19 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Account < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:account_path)
6
-
7
- Spree::Core::Engine.routes.url_helpers.account_path
8
- end
9
-
10
- def icon_name
11
- 'user'
12
- end
13
-
14
- def linkable?
15
- true
16
- end
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Cart < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:cart_path)
6
-
7
- Spree::Core::Engine.routes.url_helpers.cart_path
8
- end
9
-
10
- def icon_name
11
- 'shopping-cart'
12
- end
13
-
14
- def linkable?
15
- true
16
- end
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Checkout < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:checkout_path)
6
-
7
- Spree::Core::Engine.routes.url_helpers.checkout_path
8
- end
9
-
10
- def icon_name
11
- 'credit-card'
12
- end
13
- end
14
- end
15
- end
@@ -1,38 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Custom < Spree::Page
4
- def customizable?
5
- true
6
- end
7
-
8
- def linkable?
9
- true
10
- end
11
-
12
- def page_builder_url
13
- return unless page_builder_url_exists?(:page_path)
14
-
15
- Spree::Core::Engine.routes.url_helpers.page_path(self)
16
- end
17
-
18
- def default_sections
19
- [
20
- Spree::PageSections::PageTitle.new,
21
- Spree::PageSections::RichText.new
22
- ]
23
- end
24
-
25
- def promote
26
- return unless preview?
27
-
28
- ApplicationRecord.transaction do
29
- old_page = parent
30
- old_page.page_links.update_all(linkable_id: id)
31
- update(parent: nil) # clear reference to the old page
32
- Spree::Page.find(old_page.id).destroy # destroy the old page with their other previews, etc.
33
- update_columns(slug: old_page.slug)
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,72 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Homepage < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:root_path)
6
-
7
- Spree::Core::Engine.routes.url_helpers.root_path
8
- end
9
-
10
- def icon_name
11
- 'home'
12
- end
13
-
14
- def linkable?
15
- true
16
- end
17
-
18
- def default_sections
19
- sections = [
20
- Spree::PageSections::ImageWithText.new(
21
- preferred_top_padding: 0,
22
- preferred_bottom_padding: 26
23
- )
24
- ]
25
-
26
- collections_taxonomy = store.taxonomies.find_by(name: Spree.t(:taxonomy_collections_name))
27
-
28
- if collections_taxonomy.present?
29
- on_sale_collection = collections_taxonomy.taxons.automatic.find_by(name: Spree.t('automatic_taxon_names.on_sale'))
30
- new_arrivals_collection = collections_taxonomy.taxons.automatic.find_by(name: Spree.t('automatic_taxon_names.new_arrivals'))
31
-
32
- if on_sale_collection.present?
33
- sections << Spree::PageSections::FeaturedTaxon.new(
34
- preferred_heading: Spree.t('pages_defaults.homepage.featured_taxon_heading_on_sale'),
35
- preferred_use_description_from_admin: true,
36
- preferred_taxon_id: on_sale_collection.id
37
- )
38
- end
39
-
40
- if new_arrivals_collection.present?
41
- sections << Spree::PageSections::FeaturedTaxon.new(
42
- preferred_heading: Spree.t('pages_defaults.homepage.featured_taxon_heading_new_arrivals'),
43
- preferred_use_description_from_admin: true,
44
- preferred_taxon_id: new_arrivals_collection.id
45
- )
46
- end
47
- end
48
-
49
- sections << Spree::PageSections::ImageWithText.new(
50
- preferred_background_color: '#F0EFE9', # accent color,
51
- default_blocks: [
52
- Spree::PageBlocks::Heading.new(
53
- text: Spree.t('pages_defaults.homepage.image_with_text_heading'),
54
- preferred_text_alignment: 'left',
55
- preferred_bottom_padding: 8,
56
- preferred_top_padding: 24
57
- ),
58
- Spree::PageBlocks::Text.new(
59
- text: Spree.t('pages_defaults.homepage.image_with_text_text'),
60
- preferred_text_alignment: 'left',
61
- preferred_bottom_padding: 16
62
- )
63
- ]
64
- )
65
- end
66
-
67
- def customizable?
68
- true
69
- end
70
- end
71
- end
72
- end
@@ -1,19 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Login < Spree::Page
4
- def icon_name
5
- 'key'
6
- end
7
-
8
- def page_builder_url
9
- return unless page_builder_url_exists?(:login_path)
10
-
11
- Spree::Core::Engine.routes.url_helpers.login_path
12
- end
13
-
14
- def linkable?
15
- true
16
- end
17
- end
18
- end
19
- end
@@ -1,59 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Password < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:password_path)
6
-
7
- Spree::Core::Engine.routes.url_helpers.password_path
8
- end
9
-
10
- def preview_url(theme_preview = nil, page_preview = nil)
11
- return unless page_builder_url_exists?(:password_path)
12
-
13
- Spree::Core::Engine.routes.url_helpers.password_path(
14
- theme_id: theme.id,
15
- page_preview_id: page_preview&.id,
16
- theme_preview_id: theme_preview&.id
17
- )
18
- end
19
-
20
- def icon_name
21
- 'key'
22
- end
23
-
24
- def customizable?
25
- true
26
- end
27
-
28
- def layout_sections?
29
- false
30
- end
31
-
32
- def default_sections
33
- [
34
- Spree::PageSections::MainPasswordHeader.new,
35
- Spree::PageSections::Newsletter.new(
36
- default_blocks: [
37
- Spree::PageBlocks::Heading.new(
38
- text: Spree.t('pages_defaults.password.newsletter_heading'),
39
- preferred_width_desktop: 50, # in %
40
- preferred_text_alignment: 'center',
41
- preferred_container_alignment: 'center',
42
- preferred_bottom_padding: 8
43
- ),
44
- Spree::PageBlocks::Text.new(
45
- text: Spree.t('pages_defaults.password.newsletter_text'),
46
- preferred_text_alignment: 'center',
47
- preferred_bottom_padding: 32,
48
- preferred_width_desktop: 50,
49
- preferred_container_alignment: 'center'
50
- ),
51
- Spree::PageBlocks::NewsletterForm.new
52
- ]
53
- ),
54
- Spree::PageSections::MainPasswordFooter.new,
55
- ]
56
- end
57
- end
58
- end
59
- end
@@ -1,27 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Post < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:post_path)
6
-
7
- post = store.posts.published.last || store.posts.last
8
- return if post.nil?
9
- Spree::Core::Engine.routes.url_helpers.post_path(post)
10
- end
11
-
12
- def icon_name
13
- 'article'
14
- end
15
-
16
- def default_sections
17
- [
18
- Spree::PageSections::PostDetails.new,
19
- ]
20
- end
21
-
22
- def customizable?
23
- true
24
- end
25
- end
26
- end
27
- end
@@ -1,36 +0,0 @@
1
- module Spree
2
- module Pages
3
- class PostList < Spree::Page
4
- DISPLAY_NAME = Spree.t(:blog).freeze
5
-
6
- def page_builder_url
7
- return unless page_builder_url_exists?(:posts_path)
8
-
9
- Spree::Core::Engine.routes.url_helpers.posts_path
10
- end
11
-
12
- def icon_name
13
- 'news'
14
- end
15
-
16
- def default_sections
17
- [
18
- Spree::PageSections::PageTitle.new(preferred_title: DISPLAY_NAME),
19
- Spree::PageSections::PostGrid.new
20
- ]
21
- end
22
-
23
- def display_name
24
- DISPLAY_NAME
25
- end
26
-
27
- def customizable?
28
- true
29
- end
30
-
31
- def linkable?
32
- true
33
- end
34
- end
35
- end
36
- end
@@ -1,30 +0,0 @@
1
- module Spree
2
- module Pages
3
- class ProductDetails < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:product_path)
6
-
7
- product = store.products.active.first || store.products.first
8
- return if product.nil?
9
-
10
- Spree::Core::Engine.routes.url_helpers.product_path(product)
11
- end
12
-
13
- def icon_name
14
- 'tag'
15
- end
16
-
17
- def default_sections
18
- [
19
- Spree::PageSections::Breadcrumbs.new,
20
- Spree::PageSections::ProductDetails.new,
21
- Spree::PageSections::RelatedProducts.new
22
- ]
23
- end
24
-
25
- def customizable?
26
- true
27
- end
28
- end
29
- end
30
- end
@@ -1,43 +0,0 @@
1
- module Spree
2
- module Pages
3
- class SearchResults < Spree::Page
4
- def icon_name
5
- 'search'
6
- end
7
-
8
- def page_builder_url
9
- return unless page_builder_url_exists?(:search_path)
10
-
11
- Spree::Core::Engine.routes.url_helpers.search_path(
12
- q: 'test',
13
- theme_id: theme.id,
14
- page_preview_id: page_preview&.id,
15
- theme_preview_id: theme_preview&.id,
16
- locale: I18n.locale
17
- )
18
- end
19
-
20
- def preview_url(theme_preview = nil, page_preview = nil)
21
- return unless page_builder_url_exists?(:search_path)
22
-
23
- Spree::Core::Engine.routes.url_helpers.search_path(
24
- q: 'test',
25
- theme_id: theme.id,
26
- page_preview_id: page_preview&.id,
27
- theme_preview_id: theme_preview&.id
28
- )
29
- end
30
-
31
- def default_sections
32
- [
33
- Spree::PageSections::PageTitle.new(preferred_title: 'Search Results'),
34
- Spree::PageSections::ProductGrid.new
35
- ]
36
- end
37
-
38
- def customizable?
39
- true
40
- end
41
- end
42
- end
43
- end
@@ -1,40 +0,0 @@
1
- module Spree
2
- module Pages
3
- class ShopAll < Spree::Page
4
- def icon_name
5
- 'shopping-bag'
6
- end
7
-
8
- def page_builder_url
9
- return unless page_builder_url_exists?(:products_path)
10
-
11
- Spree::Core::Engine.routes.url_helpers.products_path
12
- end
13
-
14
- def preview_url(theme_preview = nil, page_preview = nil)
15
- return unless page_builder_url_exists?(:products_path)
16
-
17
- Spree::Core::Engine.routes.url_helpers.products_path(
18
- theme_id: theme.id,
19
- page_preview_id: page_preview&.id,
20
- theme_preview_id: theme_preview&.id
21
- )
22
- end
23
-
24
- def default_sections
25
- [
26
- Spree::PageSections::PageTitle.new(preferred_title: Spree.t(:shop_all)),
27
- Spree::PageSections::ProductGrid.new
28
- ]
29
- end
30
-
31
- def customizable?
32
- true
33
- end
34
-
35
- def linkable?
36
- true
37
- end
38
- end
39
- end
40
- end
@@ -1,29 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Taxon < Spree::Page
4
- def icon_name
5
- 'bookmark'
6
- end
7
-
8
- def page_builder_url
9
- return unless page_builder_url_exists?(:nested_taxons_path)
10
-
11
- taxon = Spree::Taxon.first
12
- return if taxon.nil?
13
-
14
- Spree::Core::Engine.routes.url_helpers.nested_taxons_path(taxon)
15
- end
16
-
17
- def default_sections
18
- [
19
- Spree::PageSections::TaxonBanner.new,
20
- Spree::PageSections::ProductGrid.new,
21
- ]
22
- end
23
-
24
- def customizable?
25
- true
26
- end
27
- end
28
- end
29
- end