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,41 +0,0 @@
1
- module Spree
2
- module Pages
3
- class TaxonList < Spree::Page
4
- DISPLAY_NAME = Spree.t(:taxonomy_brands_name).freeze
5
-
6
-
7
- def page_builder_url
8
- return unless page_builder_url_exists?(:taxonomy_path)
9
-
10
- Spree::Core::Engine.routes.url_helpers.taxonomy_path(taxonomy.id)
11
- end
12
-
13
- def icon_name
14
- 'sort-a-z'
15
- end
16
-
17
- def default_sections
18
- [
19
- Spree::PageSections::TaxonGrid.new,
20
- ]
21
- end
22
-
23
- def customizable?
24
- false
25
- end
26
-
27
- def display_name
28
- DISPLAY_NAME
29
- end
30
-
31
- # FIXME: this should use preferences
32
- def taxonomy_id
33
- store.taxonomies.first&.id
34
- end
35
-
36
- def taxonomy
37
- @taxonomy ||= store.taxonomies.find(taxonomy_id)
38
- end
39
- end
40
- end
41
- end
@@ -1,15 +0,0 @@
1
- module Spree
2
- module Pages
3
- class Wishlist < Spree::Page
4
- def page_builder_url
5
- return unless page_builder_url_exists?(:account_wishlist_path)
6
-
7
- Spree::Core::Engine.routes.url_helpers.account_wishlist_path
8
- end
9
-
10
- def linkable?
11
- true
12
- end
13
- end
14
- end
15
- end
@@ -1,233 +0,0 @@
1
- module Spree
2
- class Theme < Spree.base_class
3
- include Spree::SingleStoreResource
4
- include Spree::Previewable
5
-
6
- #
7
- # Magic methods
8
- #
9
- acts_as_paranoid
10
-
11
- #
12
- # Validations
13
- #
14
- validates :name, :store, presence: true
15
-
16
- #
17
- # Associations
18
- #
19
- belongs_to :store, class_name: 'Spree::Store', touch: true
20
- belongs_to :parent, class_name: 'Spree::Theme', optional: true, foreign_key: :parent_id
21
- has_many :previews, class_name: 'Spree::Theme', foreign_key: :parent_id, dependent: :destroy_async
22
- has_many :pages, -> { without_previews }, class_name: 'Spree::Page', dependent: :destroy, as: :pageable
23
- has_many :page_previews, -> { only_previews }, class_name: 'Spree::Page', dependent: :destroy_async, as: :pageable
24
- has_many :layout_sections, -> { order(position: :asc) }, class_name: 'Spree::PageSection', dependent: :destroy, as: :pageable
25
- alias sections layout_sections
26
-
27
- #
28
- # Attachments
29
- #
30
- has_one_attached :screenshot, service: Spree.public_storage_service_name
31
-
32
- #
33
- #
34
- # Callbacks
35
- #
36
- before_validation :set_name, on: :create
37
- before_save :ensure_default_exists_and_is_unique
38
- after_create :create_default_pages, :create_layout_sections, unless: :duplicating?
39
- before_destroy :change_name_to_archived
40
-
41
- #
42
- # Virtual attributes
43
- #
44
- attribute :duplicating, :boolean, default: false
45
-
46
- #
47
- # Class methods
48
- #
49
- def self.to_param
50
- Spree::Theme.to_s
51
- end
52
-
53
- # Returns an array of available themes, sorted by display name
54
- #
55
- # We need to load the theme classes to get the display name, so we also load the page classes at the same time
56
- #
57
- # @return [Array<Spree::Theme>]
58
- def self.available_themes
59
- @available_themes ||= Spree.page_builder.themes.sort_by(&:display_name)
60
- end
61
-
62
- def self.metadata
63
- {
64
- authors: [], # eg. ['Spree Commerce']
65
- website: '', # eg. 'https://spreecommerce.org'
66
- license: '', # eg. 'MIT', https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository#searching-github-by-license-type
67
- description: '', # eg. 'A theme for Spree Commerce'
68
- preview_image_url: '' # eg. 'https://example.com/screenshot.png'
69
- }
70
- end
71
-
72
- def self.display_name
73
- metadata[:name].presence || name.demodulize.titleize
74
- end
75
-
76
- def self.authors
77
- metadata[:authors]
78
- end
79
-
80
- def self.license
81
- metadata[:license]
82
- end
83
-
84
- def self.description
85
- metadata[:description]
86
- end
87
-
88
- def self.preview_image_url
89
- metadata[:preview_image_url]
90
- end
91
-
92
- def self.website
93
- metadata[:website]
94
- end
95
-
96
- def duplicate
97
- Themes::Duplicator.new(self).duplicate
98
- end
99
-
100
- def create_default_pages
101
- Spree.page_builder.pages.map(&:to_s).map(&:constantize).each do |page_class|
102
- next if page_class == Spree::Pages::Custom
103
-
104
- page_class.where(pageable: self).first_or_create!
105
- end
106
- end
107
-
108
- def create_layout_sections
109
- ApplicationRecord.transaction do
110
- available_layout_sections.map(&:to_s).map(&:constantize).each do |section_class|
111
- section_class.where(pageable: self).first_or_create!
112
- end
113
- end
114
- end
115
-
116
- # Creates a new preview for the theme
117
- #
118
- # @return [Spree::Theme]
119
- def create_preview
120
- ActiveRecord::Base.connected_to(role: :writing) do
121
- ApplicationRecord.transaction do
122
- new_preview = dup
123
- new_preview.parent = self
124
- new_preview.duplicating = true
125
- new_preview.default = false
126
-
127
- # we need to deep clone layout sections and their assets
128
- sections.includes(:links, { asset_attachment: :blob }, { blocks: [:rich_text_text, :links] }).each do |section|
129
- section.deep_clone(new_preview)
130
- end
131
-
132
- new_preview.save!
133
- new_preview
134
- end
135
- end
136
- end
137
-
138
- # Promotes the preview to the main theme
139
- def promote
140
- return unless preview?
141
-
142
- ApplicationRecord.transaction do
143
- old_theme = parent
144
-
145
- # clear reference to the old theme and set default to the old theme's default
146
- update!(parent: nil, default: old_theme.default)
147
-
148
- # move pages to the new theme
149
- old_theme.pages.update_all(pageable_id: id)
150
-
151
- # destroy the old theme with their other previews, etc.
152
- store.themes.find(old_theme.id).destroy
153
-
154
- take_screenshot # update the screenshot
155
- end
156
- end
157
-
158
- # Returns an array of available layout section classes for the theme, eg. header, footer, newsletter, etc.
159
- #
160
- # @return [Array<Class>]
161
- def available_layout_sections
162
- [
163
- *Spree.page_builder.theme_layout_sections,
164
- *custom_layout_sections
165
- ]
166
- end
167
-
168
- # Returns an array of custom layout section classes for the theme
169
- #
170
- # @return [Array<Class>]
171
- def custom_layout_sections
172
- # you can override this method in your theme to return a list of custom layout sections for your theme
173
- # [Spree::PageSections::Custom, Spree::PageSections::Custom2]
174
- []
175
- end
176
-
177
- # Returns an array of available page section classes for the theme
178
- #
179
- # @return [Array<Class>]
180
- def available_page_sections
181
- return @available_page_sections if @available_page_sections
182
-
183
- @available_page_sections ||= [
184
- *Spree.page_builder.page_sections.find_all do |section_class|
185
- section_class.role == 'content'
186
- end,
187
- *custom_page_sections
188
- ].sort_by(&:name)
189
- end
190
-
191
- # Returns an array of custom page section classes for the theme
192
- #
193
- # @return [Array<Class>]
194
- def custom_page_sections
195
- # you can override this method in your theme to return a list of custom page sections for your theme
196
- # [Spree::PageSections::Custom, Spree::PageSections::Custom2]
197
- []
198
- end
199
-
200
- def restore_defaults!
201
- self.preferences = {}
202
- save!
203
- end
204
-
205
- def take_screenshot
206
- return if Spree.screenshot_api_token.blank?
207
- return if preview? # we don't want to take screenshots of previews, they aren't surfaced in the UI
208
- return if screenshot.attached?
209
-
210
- Spree::Themes::ScreenshotJob.perform_later(id)
211
- end
212
-
213
- protected
214
-
215
- def set_name
216
- self.name = type.demodulize.titleize if name.blank?
217
- end
218
-
219
- private
220
-
221
- def ensure_default_exists_and_is_unique
222
- if default
223
- store.themes.where.not(id: id).update_all(default: false, updated_at: Time.current)
224
- elsif store.themes.where(default: true).count.zero?
225
- self.default = true
226
- end
227
- end
228
-
229
- def change_name_to_archived
230
- update_columns(name: "#{name} (Archived)")
231
- end
232
- end
233
- end
@@ -1,97 +0,0 @@
1
- module Spree
2
- module Themes
3
- class Default < Spree::Theme
4
- def self.metadata
5
- {
6
- authors: ['Spree Commerce'],
7
- license: 'MIT',
8
- preview_image_url: 'https://s3.eu-central-2.wasabisys.com/w.storage.screenshotapi.net/demo_spreecommerce_org_299a49137b25.png'
9
- }
10
- end
11
-
12
- # COLORS
13
- # main colors
14
- preference :primary_color, :string, default: '#000000'
15
- preference :accent_color, :string, default: '#F0EFE9'
16
- preference :danger_color, :string, default: '#C73528'
17
- preference :neutral_color, :string, default: '#999999'
18
- preference :background_color, :string, default: '#FFFFFF'
19
- preference :text_color, :string, default: '#000000'
20
- preference :success_color, :string, default: '#00C773'
21
-
22
- # buttons
23
- preference :button_background_color, :string
24
- preference :button_text_color, :string, default: '#ffffff'
25
- preference :button_hover_background_color, :string
26
- preference :button_hover_text_color, :string
27
- preference :button_border_color, :string
28
-
29
- # borders
30
- preference :border_color, :string, default: '#E9E7DC'
31
- preference :sidebar_border_color, :string
32
-
33
- preference :secondary_button_background_color, :string
34
- preference :secondary_button_text_color, :string
35
- preference :secondary_button_hover_background_color, :string
36
- preference :secondary_button_hover_text_color, :string
37
-
38
- # inputs
39
- preference :input_text_color, :string, default: '#6b7280'
40
- preference :input_background_color, :string, default: '#ffffff'
41
- preference :input_border_color, :string
42
- preference :input_focus_border_color, :string
43
- preference :input_focus_background_color, :string
44
- preference :input_focus_text_color, :string
45
-
46
- # sidebar (checkout)
47
- preference :checkout_sidebar_background_color, :string, default: '#f3f4f6'
48
- preference :checkout_divider_background_color, :string
49
- preference :checkout_sidebar_text_color, :string
50
-
51
- # TYPOGRAPHY
52
- preference :custom_font_code, :string, default: nil
53
- # body
54
- preference :font_family, :string, default: 'Inter'
55
- preference :font_size_scale, :integer, default: 100
56
- # headers
57
- preference :header_font_family, :string, default: 'Inter'
58
- preference :header_font_size_scale, :integer, default: 100
59
- preference :headings_uppercase, :boolean, default: true
60
-
61
- # BUTTONS
62
- preference :button_border_thickness, :integer, default: 1
63
- preference :button_border_opacity, :integer, default: 100
64
- preference :button_border_radius, :integer, default: 100
65
- preference :button_shadow_opacity, :integer, default: 0
66
- preference :button_shadow_horizontal_offset, :integer, default: 0
67
- preference :button_shadow_vertical_offset, :integer, default: 4
68
- preference :button_shadow_blur, :integer, default: 5
69
-
70
- # INPUTS
71
- preference :input_border_thickness, :integer, default: 1
72
- preference :input_border_opacity, :integer, default: 100
73
- preference :input_border_radius, :integer, default: 8
74
- preference :input_shadow_opacity, :integer, default: 0
75
- preference :input_shadow_horizontal_offset, :integer, default: 0
76
- preference :input_shadow_vertical_offset, :integer, default: 4
77
- preference :input_shadow_blur, :integer, default: 5
78
-
79
- # BORDERS
80
- preference :border_width, :integer, default: 1
81
- preference :border_radius, :integer, default: 6
82
- preference :border_shadow_opacity, :integer, default: 0
83
- preference :border_shadow_horizontal_offset, :integer, default: 0
84
- preference :border_shadow_vertical_offset, :integer, default: 4
85
- preference :border_shadow_blur, :integer, default: 5
86
-
87
- # PRODUCT IMAGES
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
95
- end
96
- end
97
- end
@@ -1,21 +0,0 @@
1
- module Spree
2
- module Taxons
3
- class TouchFeaturedSections
4
- prepend Spree::ServiceModule::Base
5
-
6
- def call(taxon_ids:)
7
- return if taxon_ids.empty?
8
-
9
- featured_taxons = Spree::PageSections::FeaturedTaxon.published.by_taxon_id(taxon_ids)
10
-
11
- return if featured_taxons.empty?
12
-
13
- featured_taxons.touch_all
14
- pages = Spree::Page.where(id: featured_taxons.where(pageable_type: 'Spree::Page').pluck(:pageable_id))
15
- pages.touch_all
16
- themes = Spree::Theme.where(id: pages.where(pageable_type: 'Spree::Theme').pluck(:pageable_id).uniq)
17
- themes.touch_all
18
- end
19
- end
20
- end
21
- end
@@ -1,78 +0,0 @@
1
- class CreatePageBuilderModels < ActiveRecord::Migration[6.1]
2
- def change
3
- if !table_exists?(:spree_themes)
4
- create_table :spree_themes do |t|
5
- t.string :name
6
- t.references :store, null: false, index: true
7
- t.boolean :default, default: false, null: false
8
- t.boolean :ready, default: true
9
- t.string :type, default: 'Spree::Themes::Default', null: false
10
- t.references :parent
11
- t.text :preferences
12
-
13
- t.timestamps
14
- t.datetime :deleted_at
15
-
16
- t.index ['deleted_at'], name: 'index_spree_themes_on_deleted_at'
17
- end
18
-
19
- create_table :spree_pages do |t|
20
- t.references :pageable, polymorphic: true, null: false
21
- t.string :type, null: false
22
- t.string :slug
23
- t.string :name, null: false
24
- t.string :meta_title
25
- t.string :meta_description
26
- t.string :meta_keywords
27
- t.references :parent
28
- t.text :preferences
29
-
30
- t.timestamps
31
- t.datetime :deleted_at
32
-
33
- t.index ['pageable_id', 'name'], name: 'index_spree_pages_on_pageable_id_and_name'
34
- t.index ['pageable_id', 'pageable_type', 'type'], name: 'index_spree_pages_on_pageable_id_and_pageable_type_and_type'
35
- t.index ['pageable_id', 'pageable_type'], name: 'index_spree_pages_on_pageable_id_and_pageable_type'
36
- end
37
-
38
- create_table :spree_page_sections do |t|
39
- t.references :pageable, polymorphic: true, null: false, index: true
40
- t.string :type, null: false
41
- t.string :name, null: false
42
- t.integer :position, default: 1, null: false
43
- t.integer :page_links_count, default: 0
44
- t.text :preferences
45
-
46
- t.timestamps
47
- t.datetime :deleted_at
48
-
49
- t.index ['pageable_id', 'pageable_type', 'position'], name: 'index_spree_page_sections_on_pageable_w_position'
50
- end
51
-
52
- create_table :spree_page_blocks do |t|
53
- t.references :section, null: false, index: true
54
- t.string :name, null: false
55
- t.integer :position, default: 1, null: false
56
- t.string :type, null: false
57
- t.integer :page_links_count, default: 0
58
- t.text :preferences
59
-
60
- t.timestamps
61
- t.datetime :deleted_at
62
-
63
- t.index ['section_id', 'position'], name: 'index_spree_page_blocks_on_section_w_position'
64
- end
65
-
66
- create_table :spree_page_links do |t|
67
- t.references :parent, polymorphic: true, index: true
68
- t.references :linkable, polymorphic: true, index: true
69
- t.string :label
70
- t.string :url
71
- t.boolean :open_in_new_tab, default: false
72
- t.integer :position, default: 1, null: false
73
-
74
- t.timestamps
75
- end
76
- end
77
- end
78
- end
@@ -1,11 +0,0 @@
1
- class RemovePageBuilderIndices < ActiveRecord::Migration[7.2]
2
- def change
3
- if index_name_exists?(:spree_pages, 'index_spree_pages_on_pageable_id_and_pageable_type_and_slug')
4
- remove_index :spree_pages, name: 'index_spree_pages_on_pageable_id_and_pageable_type_and_slug'
5
- end
6
-
7
- if index_name_exists?(:spree_themes, 'index_spree_themes_on_store_id_and_default')
8
- remove_index :spree_themes, name: 'index_spree_themes_on_store_id_and_default'
9
- end
10
- end
11
- end
@@ -1,7 +0,0 @@
1
- class AddMissingPageBuilderIndexes < ActiveRecord::Migration[7.2]
2
- def change
3
- add_index :spree_themes, %w[store_id default], name: 'index_spree_themes_on_store_id_and_default', if_not_exists: true
4
- add_index :spree_page_links, %w[parent_type parent_id position], name: 'index_spree_page_links_parent_with_position', if_not_exists: true
5
- add_index :spree_page_blocks, :deleted_at, if_not_exists: true
6
- end
7
- end
@@ -1,10 +0,0 @@
1
- class AddPageLinksCounterCacheToSpreeStores < ActiveRecord::Migration[7.2]
2
- def change
3
- add_column :spree_stores, :page_links_count, :integer, default: 0, null: false
4
-
5
- Spree::Store.reset_column_information
6
- Spree::Store.find_each do |store|
7
- Spree::Store.reset_counters(store.id, :links)
8
- end
9
- end
10
- end
@@ -1,3 +0,0 @@
1
- if Object.const_defined?("Devise")
2
- Devise.secret_key = "<%= SecureRandom.hex(50) %>"
3
- end