spree_core 5.5.3 → 5.6.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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +12 -2
  3. data/app/helpers/spree/currency_helper.rb +1 -4
  4. data/app/helpers/spree/locale_helper.rb +18 -13
  5. data/app/helpers/spree/localized_names_helper.rb +25 -0
  6. data/app/mailers/spree/admin_user_mailer.rb +71 -0
  7. data/app/mailers/spree/base_mailer.rb +73 -11
  8. data/app/mailers/spree/export_mailer.rb +7 -7
  9. data/app/mailers/spree/import_mailer.rb +19 -0
  10. data/app/mailers/spree/invitation_mailer.rb +16 -11
  11. data/app/mailers/spree/report_mailer.rb +6 -6
  12. data/app/mailers/spree/webhook_mailer.rb +7 -6
  13. data/app/models/concerns/spree/admin_user_methods.rb +44 -0
  14. data/app/models/concerns/spree/legacy_multi_store_support.rb +48 -0
  15. data/app/models/concerns/spree/presentation_translatable.rb +39 -0
  16. data/app/models/concerns/spree/product_scopes.rb +21 -3
  17. data/app/models/concerns/spree/single_store_resource.rb +5 -0
  18. data/app/models/concerns/spree/store_scoped_resource.rb +10 -0
  19. data/app/models/concerns/spree/stores/markets.rb +9 -1
  20. data/app/models/concerns/spree/stores/setup.rb +37 -23
  21. data/app/models/concerns/spree/translatable_resource.rb +95 -5
  22. data/app/models/concerns/spree/user_methods.rb +27 -2
  23. data/app/models/spree/ability.rb +5 -4
  24. data/app/models/spree/allowed_origin.rb +31 -0
  25. data/app/models/spree/category.rb +12 -2
  26. data/app/models/spree/channel/gating.rb +67 -0
  27. data/app/models/spree/channel.rb +1 -0
  28. data/app/models/spree/classification.rb +12 -0
  29. data/app/models/spree/country.rb +22 -1
  30. data/app/models/spree/credit_card.rb +29 -0
  31. data/app/models/spree/currency.rb +47 -0
  32. data/app/models/spree/current.rb +12 -1
  33. data/app/models/spree/customer_group.rb +1 -0
  34. data/app/models/spree/export.rb +19 -0
  35. data/app/models/spree/exports/coupon_codes.rb +1 -2
  36. data/app/models/spree/import.rb +84 -1
  37. data/app/models/spree/import_row.rb +7 -1
  38. data/app/models/spree/imports/product_translations.rb +6 -0
  39. data/app/models/spree/locale.rb +104 -0
  40. data/app/models/spree/option_type.rb +11 -13
  41. data/app/models/spree/option_value.rb +5 -17
  42. data/app/models/spree/order.rb +19 -2
  43. data/app/models/spree/payment_method.rb +6 -5
  44. data/app/models/spree/policy.rb +2 -1
  45. data/app/models/spree/product.rb +23 -2
  46. data/app/models/spree/promotion/rules/channel.rb +37 -0
  47. data/app/models/spree/promotion/rules/market.rb +37 -0
  48. data/app/models/spree/promotion.rb +5 -3
  49. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -1
  50. data/app/models/spree/role_user.rb +4 -0
  51. data/app/models/spree/search_provider/meilisearch.rb +22 -9
  52. data/app/models/spree/setup_task.rb +12 -0
  53. data/app/models/spree/setup_tasks.rb +86 -0
  54. data/app/models/spree/shipment.rb +38 -1
  55. data/app/models/spree/shipment_handler.rb +1 -1
  56. data/app/models/spree/stock/availability_validator.rb +1 -1
  57. data/app/models/spree/stock/quantifier.rb +21 -1
  58. data/app/models/spree/stock_item.rb +2 -1
  59. data/app/models/spree/stock_location.rb +4 -1
  60. data/app/models/spree/store.rb +45 -9
  61. data/app/models/spree/store_payment_method.rb +5 -1
  62. data/app/models/spree/store_promotion.rb +4 -0
  63. data/app/models/spree/taxon.rb +112 -9
  64. data/app/models/spree/taxonomy.rb +1 -1
  65. data/app/models/spree/translations/batch.rb +104 -0
  66. data/app/models/spree/variant.rb +29 -2
  67. data/app/presenters/spree/search_provider/product_presenter.rb +3 -0
  68. data/app/services/spree/carts/complete.rb +3 -0
  69. data/app/services/spree/fulfillments/create.rb +259 -0
  70. data/app/services/spree/locales/set_fallback_locale_for_store.rb +7 -1
  71. data/app/services/spree/locales.rb +52 -0
  72. data/app/services/spree/products/prepare_nested_attributes.rb +40 -12
  73. data/app/services/spree/shipments/update.rb +1 -1
  74. data/app/services/spree/stock_reservations/reserve.rb +4 -1
  75. data/app/services/spree/taxons/add_products.rb +3 -0
  76. data/app/services/spree/taxons/remove_products.rb +3 -0
  77. data/app/subscribers/spree/admin_user_email_subscriber.rb +29 -0
  78. data/app/subscribers/spree/import_email_subscriber.rb +26 -0
  79. data/app/views/layouts/spree/base_mailer.html.erb +14 -17
  80. data/app/views/spree/admin_user_mailer/confirmation_email.html.erb +7 -0
  81. data/app/views/spree/admin_user_mailer/password_reset_email.html.erb +8 -0
  82. data/app/views/spree/export_mailer/export_done.html.erb +6 -14
  83. data/app/views/spree/import_mailer/import_done.html.erb +12 -0
  84. data/app/views/spree/invitation_mailer/invitation_accepted.html.erb +4 -12
  85. data/app/views/spree/invitation_mailer/invitation_email.html.erb +11 -24
  86. data/app/views/spree/report_mailer/report_done.html.erb +6 -14
  87. data/app/views/spree/shared/_base_mailer_footer.html.erb +15 -8
  88. data/app/views/spree/shared/_base_mailer_header.html.erb +7 -5
  89. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +211 -273
  90. data/app/views/spree/shared/_mailer_button.html.erb +10 -0
  91. data/app/views/spree/shared/_mailer_hero.html.erb +12 -0
  92. data/app/views/spree/shared/_purchased_items_styles.html.erb +112 -0
  93. data/app/views/spree/webhook_mailer/endpoint_disabled.html.erb +39 -14
  94. data/config/initializers/spree_store_setup_tasks.rb +23 -0
  95. data/config/locales/en.yml +42 -992
  96. data/db/migrate/20260613000001_add_store_id_to_spree_role_users.rb +10 -0
  97. data/db/migrate/20260626000001_add_store_id_to_spree_taxons.rb +11 -0
  98. data/db/migrate/20260627000001_add_products_count_to_spree_taxons.rb +6 -0
  99. data/db/migrate/20260628000001_add_store_id_to_spree_promotions.rb +10 -0
  100. data/db/migrate/20260628000002_add_store_id_to_spree_payment_methods.rb +11 -0
  101. data/db/migrate/20260630000001_add_preorder_fields_to_spree_variants.rb +7 -0
  102. data/db/migrate/20260707000001_add_fingerprint_to_spree_credit_cards.rb +39 -0
  103. data/db/migrate/20260710000001_add_import_id_status_index_to_spree_import_rows.rb +7 -0
  104. data/db/migrate/20260711000001_add_preferences_to_spree_exports.rb +7 -0
  105. data/db/sample_data/promotions.rb +1 -1
  106. data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +0 -1
  107. data/lib/mobility/plugins/store_based_fallbacks.rb +7 -5
  108. data/lib/spree/core/configuration.rb +1 -0
  109. data/lib/spree/core/controller_helpers/locale.rb +4 -1
  110. data/lib/spree/core/controller_helpers/strong_parameters.rb +1 -0
  111. data/lib/spree/core/dependencies.rb +3 -0
  112. data/lib/spree/core/engine.rb +24 -0
  113. data/lib/spree/core/preferences/preferable.rb +6 -1
  114. data/lib/spree/core/previews/admin_user_preview.rb +22 -0
  115. data/lib/spree/core/previews/export_preview.rb +37 -0
  116. data/lib/spree/core/previews/invitation_preview.rb +47 -0
  117. data/lib/spree/core/previews/preview_data.rb +52 -0
  118. data/lib/spree/core/previews/report_preview.rb +40 -0
  119. data/lib/spree/core/previews/webhook_preview.rb +34 -0
  120. data/lib/spree/core/version.rb +1 -1
  121. data/lib/spree/core.rb +22 -1
  122. data/lib/spree/permitted_attributes.rb +5 -4
  123. data/lib/spree/testing_support/factories/export_factory.rb +4 -0
  124. data/lib/spree/testing_support/factories/payment_method_factory.rb +1 -9
  125. data/lib/spree/testing_support/factories/promotion_factory.rb +1 -9
  126. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +24 -0
  127. data/lib/spree/translations.rb +113 -0
  128. data/lib/spree/upgrades/5_5_to_5_6/manifest.yml +59 -0
  129. data/lib/tasks/role_users.rake +21 -0
  130. data/lib/tasks/single_store_associations.rake +65 -0
  131. data/lib/tasks/taxons.rake +62 -1
  132. metadata +47 -5
  133. data/app/models/spree/product/legacy_multi_store_support.rb +0 -40
@@ -0,0 +1,112 @@
1
+ <%# Per-email stylesheet for the line item tiles + order summary rows.
2
+ Render it once at the top of any mailer template that uses these components —
3
+ it lands in the layout <head> via `content_for :head`. %>
4
+ <% content_for :head do %>
5
+ <style type="text/css" rel="stylesheet" media="all">
6
+ /* Line item tiles ------------------------------ */
7
+
8
+ .item {
9
+ width: 100%;
10
+ background-color: #F0F0F0;
11
+ border-radius: 16px;
12
+ margin: 0 0 8px;
13
+ }
14
+
15
+ .item .item_image {
16
+ padding: 8px;
17
+ width: 96px;
18
+ }
19
+
20
+ .item .item_thumb {
21
+ display: block;
22
+ width: 80px;
23
+ height: auto;
24
+ border-radius: 12px;
25
+ }
26
+
27
+ .item .item_info {
28
+ padding: 8px 16px 8px 8px;
29
+ }
30
+
31
+ .item .item_name {
32
+ display: inline-block;
33
+ font-size: 15px;
34
+ line-height: 1.5;
35
+ font-weight: 500;
36
+ color: #332C2C;
37
+ text-decoration: none;
38
+ }
39
+
40
+ .item .item_meta {
41
+ margin: 2px 0 0;
42
+ font-size: 13px;
43
+ line-height: 1.5;
44
+ color: #726A6A;
45
+ }
46
+
47
+ .item .item_amount {
48
+ padding: 8px 16px 8px 8px;
49
+ text-align: right;
50
+ white-space: nowrap;
51
+ }
52
+
53
+ .item .item_qty {
54
+ margin: 0;
55
+ font-size: 13px;
56
+ line-height: 1.5;
57
+ color: #726A6A;
58
+ }
59
+
60
+ .item .item_price {
61
+ margin: 2px 0 0;
62
+ font-size: 15px;
63
+ line-height: 1.5;
64
+ font-weight: 500;
65
+ color: #332C2C;
66
+ }
67
+
68
+ /* Summary rows ------------------------------ */
69
+
70
+ .summary {
71
+ width: 100%;
72
+ margin: 16px 0 0;
73
+ }
74
+
75
+ .summary td {
76
+ padding: 6px 0;
77
+ font-size: 14px;
78
+ line-height: 1.6;
79
+ font-weight: 450;
80
+ color: #726A6A;
81
+ }
82
+
83
+ .summary .summary_value {
84
+ font-size: 15px;
85
+ font-weight: 500;
86
+ text-align: right;
87
+ white-space: nowrap;
88
+ }
89
+
90
+ .summary .summary_sub {
91
+ display: block;
92
+ font-size: 13px;
93
+ line-height: 1.5;
94
+ color: #726A6A;
95
+ }
96
+
97
+ .summary .summary_strong {
98
+ color: #332C2C;
99
+ }
100
+
101
+ .summary_total td {
102
+ padding: 14px 0 0;
103
+ border-top: 1px solid #E8E9E9;
104
+ font-weight: 500;
105
+ color: #332C2C;
106
+ }
107
+
108
+ .summary_total .summary_value {
109
+ font-weight: 600;
110
+ }
111
+ </style>
112
+ <% end %>
@@ -1,26 +1,51 @@
1
- <h1><%= Spree.t('webhook_mailer.endpoint_disabled.heading') %></h1>
1
+ <%= render 'spree/shared/purchased_items_styles' %>
2
2
 
3
- <p><%= Spree.t('webhook_mailer.endpoint_disabled.message', endpoint_name: @endpoint.name || @endpoint.url) %></p>
3
+ <%= render layout: 'spree/shared/mailer_hero' do %>
4
+ <h1><%= Spree.t('webhook_mailer.endpoint_disabled.heading') %></h1>
5
+ <p><%= Spree.t('webhook_mailer.endpoint_disabled.message', endpoint_name: @endpoint.name || @endpoint.url) %></p>
6
+ <% end %>
4
7
 
5
- <table role="presentation" style="width: 100%; border-collapse: collapse; margin: 20px 0;">
8
+ <table class="section summary" width="100%" cellpadding="0" cellspacing="0" role="presentation">
6
9
  <tr>
7
- <td style="padding: 8px 0; color: #6b7280;"><strong><%= Spree.t('webhook_mailer.endpoint_disabled.url_label') %></strong></td>
8
- <td style="padding: 8px 0;"><%= @endpoint.url %></td>
10
+ <td valign="top">
11
+ <span class="f-fallback"><%= Spree.t('webhook_mailer.endpoint_disabled.url_label') %></span>
12
+ </td>
13
+ <td class="summary_value summary_strong" align="right" valign="top">
14
+ <span class="f-fallback"><%= @endpoint.url %></span>
15
+ </td>
9
16
  </tr>
10
17
  <% if @endpoint.name.present? %>
11
- <tr>
12
- <td style="padding: 8px 0; color: #6b7280;"><strong><%= Spree.t('webhook_mailer.endpoint_disabled.name_label') %></strong></td>
13
- <td style="padding: 8px 0;"><%= @endpoint.name %></td>
14
- </tr>
18
+ <tr>
19
+ <td valign="top">
20
+ <span class="f-fallback"><%= Spree.t('webhook_mailer.endpoint_disabled.name_label') %></span>
21
+ </td>
22
+ <td class="summary_value summary_strong" align="right" valign="top">
23
+ <span class="f-fallback"><%= @endpoint.name %></span>
24
+ </td>
25
+ </tr>
15
26
  <% end %>
16
27
  <tr>
17
- <td style="padding: 8px 0; color: #6b7280;"><strong><%= Spree.t('webhook_mailer.endpoint_disabled.reason_label') %></strong></td>
18
- <td style="padding: 8px 0;"><%= @endpoint.disabled_reason %></td>
28
+ <td valign="top">
29
+ <span class="f-fallback"><%= Spree.t('webhook_mailer.endpoint_disabled.reason_label') %></span>
30
+ </td>
31
+ <td class="summary_value summary_strong" align="right" valign="top">
32
+ <span class="f-fallback"><%= @endpoint.disabled_reason %></span>
33
+ </td>
19
34
  </tr>
20
35
  <tr>
21
- <td style="padding: 8px 0; color: #6b7280;"><strong><%= Spree.t('webhook_mailer.endpoint_disabled.disabled_at_label') %></strong></td>
22
- <td style="padding: 8px 0;"><%= @endpoint.disabled_at&.strftime('%Y-%m-%d %H:%M %Z') %></td>
36
+ <td valign="top">
37
+ <span class="f-fallback"><%= Spree.t('webhook_mailer.endpoint_disabled.disabled_at_label') %></span>
38
+ </td>
39
+ <td class="summary_value summary_strong" align="right" valign="top">
40
+ <span class="f-fallback"><%= @endpoint.disabled_at&.strftime('%Y-%m-%d %H:%M %Z') %></span>
41
+ </td>
23
42
  </tr>
24
43
  </table>
25
44
 
26
- <p><%= Spree.t('webhook_mailer.endpoint_disabled.instructions') %></p>
45
+ <table class="section" width="100%" cellpadding="0" cellspacing="0" role="presentation">
46
+ <tr>
47
+ <td>
48
+ <p class="f-fallback"><%= Spree.t('webhook_mailer.endpoint_disabled.instructions') %></p>
49
+ </td>
50
+ </tr>
51
+ </table>
@@ -0,0 +1,23 @@
1
+ # Default Getting Started tasks shown on the admin dashboard.
2
+ # See Spree::SetupTasks for how to add or remove tasks.
3
+ Rails.application.config.after_initialize do
4
+ Spree.store_setup_tasks.add :setup_payment_method,
5
+ position: 10,
6
+ done: ->(store) { store.payment_method_setup? }
7
+
8
+ Spree.store_setup_tasks.add :add_products,
9
+ position: 20,
10
+ done: ->(store) { store.products.any? }
11
+
12
+ Spree.store_setup_tasks.add :set_customer_support_email,
13
+ position: 30,
14
+ done: ->(store) { store.customer_support_email.present? }
15
+
16
+ Spree.store_setup_tasks.add :setup_taxes_collection,
17
+ position: 40,
18
+ done: ->(_store) { Spree::TaxRate.any? }
19
+
20
+ Spree.store_setup_tasks.add :setup_storefront,
21
+ position: 50,
22
+ done: ->(store) { store.storefront_setup? }
23
+ end