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
@@ -0,0 +1,60 @@
1
+ module Spree
2
+ module PageSections
3
+ class RelatedProducts < Spree::PageSection
4
+ has_rich_text :description
5
+
6
+ before_validation :make_heading_size_valid
7
+ before_validation :make_alignment_valid
8
+
9
+ preference :heading, :string, default: Spree.t('page_sections.related_products.heading_default')
10
+ preference :heading_size, :string, default: 'medium'
11
+ preference :heading_alignment, :string, default: 'left'
12
+ preference :description_alignment, :string, default: 'left'
13
+ preference :max_products_to_show, :integer, default: 10
14
+
15
+ def icon_name
16
+ 'tags'
17
+ end
18
+
19
+ def lazy?
20
+ true
21
+ end
22
+
23
+ def layout
24
+ 'swiper'
25
+ end
26
+
27
+ def lazy_path(variables)
28
+ section_id = variables[:section].id
29
+ url_options = variables[:url_options] || {}
30
+
31
+ if variables[:product].present?
32
+ product_id = variables[:product].id
33
+ Spree::Core::Engine.routes.url_helpers.related_product_path(
34
+ product_id,
35
+ section_id: section_id,
36
+ **url_options
37
+ )
38
+ elsif variables[:post].present?
39
+ post_id = variables[:post].id
40
+ Spree::Core::Engine.routes.url_helpers.related_products_post_path(
41
+ post_id,
42
+ section_id: section_id,
43
+ **url_options
44
+ )
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def make_alignment_valid
51
+ self.preferred_heading_alignment = 'left' unless %w[left center right].include?(preferred_heading_alignment)
52
+ self.preferred_description_alignment = 'left' unless %w[left center right].include?(preferred_description_alignment)
53
+ end
54
+
55
+ def make_heading_size_valid
56
+ self.preferred_heading_size = 'small' unless %w[small medium large].include?(preferred_heading_size)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,20 @@
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 blocks_available?
12
+ true
13
+ end
14
+
15
+ def icon_name
16
+ 'text-caption'
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
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
@@ -0,0 +1,17 @@
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
@@ -0,0 +1,99 @@
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 icon_name
48
+ 'movie'
49
+ end
50
+
51
+ def blocks_available?
52
+ true
53
+ end
54
+
55
+ def video_embed
56
+ @video_embed ||= ::ActionText::VideoEmbed.find_by(id: preferred_youtube_video_embed_id) if preferred_youtube_video_embed_id.present?
57
+ end
58
+
59
+ private
60
+
61
+ def video_url_changed?
62
+ saved_change_to_preferences? &&
63
+ saved_change_to_preferences[0][:youtube_video_url] != saved_change_to_preferences[1][:youtube_video_url]
64
+ end
65
+
66
+ def create_video_embed
67
+ oembed_response = oembed_cached_response(preferred_youtube_video_url)
68
+
69
+ if oembed_response.present?
70
+ embed = ::ActionText::VideoEmbed.new
71
+ embed.url = preferred_youtube_video_url
72
+ embed.raw_html = oembed_response.html
73
+ embed.thumbnail_url = oembed_response.thumbnail_url
74
+
75
+ embed.save
76
+ update(preferred_youtube_video_embed_id: embed.id) if embed.persisted?
77
+ end
78
+ end
79
+
80
+ def update_video_embed
81
+ destroy_video_embed
82
+ create_video_embed
83
+ end
84
+
85
+ def destroy_video_embed
86
+ video_embed.destroy if video_embed.present?
87
+ end
88
+
89
+ def oembed_cached_response(url)
90
+ return nil if url.blank?
91
+
92
+ raw_response = Rails.cache.fetch(['oembed', url]) { ::OEmbed::Providers.get(url).fields.to_json }
93
+ OEmbed::Response.create_for(raw_response, OEmbed::Providers::Youtube, url, 'json')
94
+ rescue OEmbed::Error
95
+ nil
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,15 @@
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
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module Pages
3
+ class Cart < Spree::Page
4
+ def icon_name
5
+ 'shopping-cart'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module Pages
3
+ class Checkout < Spree::Page
4
+ def icon_name
5
+ 'credit-card'
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module Pages
3
+ class Custom < Spree::Page
4
+ def customizable?
5
+ true
6
+ end
7
+
8
+ def page_builder_url
9
+ return unless page_builder_url_exists?(:page_path)
10
+
11
+ Spree::Core::Engine.routes.url_helpers.page_path(self)
12
+ end
13
+
14
+ def default_sections
15
+ [
16
+ Spree::PageSections::PageTitle.new,
17
+ Spree::PageSections::RichText.new
18
+ ]
19
+ end
20
+
21
+ def promote
22
+ return unless preview?
23
+
24
+ ApplicationRecord.transaction do
25
+ old_page = parent
26
+ old_page.page_links.update_all(linkable_id: id)
27
+ update(parent: nil) # clear reference to the old page
28
+ Spree::Page.find(old_page.id).destroy # destroy the old page with their other previews, etc.
29
+ update_columns(slug: old_page.slug)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,68 @@
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 default_sections
15
+ sections = [
16
+ Spree::PageSections::ImageWithText.new(
17
+ preferred_top_padding: 0,
18
+ preferred_bottom_padding: 26
19
+ )
20
+ ]
21
+
22
+ collections_taxonomy = store.taxonomies.find_by(name: Spree.t(:taxonomy_collections_name))
23
+
24
+ if collections_taxonomy.present?
25
+ on_sale_collection = collections_taxonomy.taxons.automatic.find_by(name: Spree.t('automatic_taxon_names.on_sale'))
26
+ new_arrivals_collection = collections_taxonomy.taxons.automatic.find_by(name: Spree.t('automatic_taxon_names.new_arrivals'))
27
+
28
+ if on_sale_collection.present?
29
+ sections << Spree::PageSections::FeaturedTaxon.new(
30
+ preferred_heading: Spree.t('pages_defaults.homepage.featured_taxon_heading_on_sale'),
31
+ preferred_use_description_from_admin: true,
32
+ preferred_taxon_id: on_sale_collection.id
33
+ )
34
+ end
35
+
36
+ if new_arrivals_collection.present?
37
+ sections << Spree::PageSections::FeaturedTaxon.new(
38
+ preferred_heading: Spree.t('pages_defaults.homepage.featured_taxon_heading_new_arrivals'),
39
+ preferred_use_description_from_admin: true,
40
+ preferred_taxon_id: new_arrivals_collection.id
41
+ )
42
+ end
43
+ end
44
+
45
+ sections << Spree::PageSections::ImageWithText.new(
46
+ preferred_background_color: '#F0EFE9', # accent color,
47
+ default_blocks: [
48
+ Spree::PageBlocks::Heading.new(
49
+ text: Spree.t('pages_defaults.homepage.image_with_text_heading'),
50
+ preferred_text_alignment: 'left',
51
+ preferred_bottom_padding: 8,
52
+ preferred_top_padding: 24
53
+ ),
54
+ Spree::PageBlocks::Text.new(
55
+ text: Spree.t('pages_defaults.homepage.image_with_text_text'),
56
+ preferred_text_alignment: 'left',
57
+ preferred_bottom_padding: 16
58
+ )
59
+ ]
60
+ )
61
+ end
62
+
63
+ def customizable?
64
+ true
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,15 @@
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
+ end
14
+ end
15
+ end
@@ -0,0 +1,57 @@
1
+ module Spree
2
+ module Pages
3
+ class Password < Spree::Page
4
+ def page_builder_url
5
+ Spree::Core::Engine.routes.url_helpers.password_path
6
+ end
7
+
8
+ def preview_url(theme_preview = nil, page_preview = nil)
9
+ return unless page_builder_url_exists?(:password_path)
10
+
11
+ Spree::Core::Engine.routes.url_helpers.password_path(
12
+ theme_id: theme.id,
13
+ page_preview_id: page_preview&.id,
14
+ theme_preview_id: theme_preview&.id
15
+ )
16
+ end
17
+
18
+ def icon_name
19
+ 'key'
20
+ end
21
+
22
+ def customizable?
23
+ true
24
+ end
25
+
26
+ def layout_sections?
27
+ false
28
+ end
29
+
30
+ def default_sections
31
+ [
32
+ Spree::PageSections::MainPasswordHeader.new,
33
+ Spree::PageSections::Newsletter.new(
34
+ default_blocks: [
35
+ Spree::PageBlocks::Heading.new(
36
+ text: Spree.t('pages_defaults.password.newsletter_heading'),
37
+ preferred_width_desktop: 50, # in %
38
+ preferred_text_alignment: 'center',
39
+ preferred_container_alignment: 'center',
40
+ preferred_bottom_padding: 8
41
+ ),
42
+ Spree::PageBlocks::Text.new(
43
+ text: Spree.t('pages_defaults.password.newsletter_text'),
44
+ preferred_text_alignment: 'center',
45
+ preferred_bottom_padding: 32,
46
+ preferred_width_desktop: 50,
47
+ preferred_container_alignment: 'center'
48
+ ),
49
+ Spree::PageBlocks::NewsletterForm.new
50
+ ]
51
+ ),
52
+ Spree::PageSections::MainPasswordFooter.new,
53
+ ]
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,27 @@
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
@@ -0,0 +1,32 @@
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,
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
+ end
31
+ end
32
+ end
@@ -0,0 +1,29 @@
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::ProductDetails.new,
20
+ Spree::PageSections::RelatedProducts.new
21
+ ]
22
+ end
23
+
24
+ def customizable?
25
+ true
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,43 @@
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,
34
+ Spree::PageSections::ProductGrid.new
35
+ ]
36
+ end
37
+
38
+ def customizable?
39
+ true
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,36 @@
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,
27
+ Spree::PageSections::ProductGrid.new
28
+ ]
29
+ end
30
+
31
+ def customizable?
32
+ true
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
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
@@ -0,0 +1,41 @@
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
@@ -0,0 +1,11 @@
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
+ end
10
+ end
11
+ end