spree_admin 5.3.5 → 5.4.0.beta

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 (123) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/app/controllers/concerns/spree/admin/order_concern.rb +1 -1
  4. data/app/controllers/spree/admin/action_text/video_embeds_controller.rb +1 -1
  5. data/app/controllers/spree/admin/addresses_controller.rb +1 -1
  6. data/app/controllers/spree/admin/admin_users_controller.rb +3 -3
  7. data/app/controllers/spree/admin/api_keys_controller.rb +56 -0
  8. data/app/controllers/spree/admin/assets_controller.rb +2 -2
  9. data/app/controllers/spree/admin/base_controller.rb +4 -4
  10. data/app/controllers/spree/admin/classifications_controller.rb +5 -4
  11. data/app/controllers/spree/admin/coupon_codes_controller.rb +1 -1
  12. data/app/controllers/spree/admin/customer_group_users_controller.rb +3 -2
  13. data/app/controllers/spree/admin/dashboard_controller.rb +2 -1
  14. data/app/controllers/spree/admin/digital_assets_controller.rb +1 -1
  15. data/app/controllers/spree/admin/exports_controller.rb +1 -2
  16. data/app/controllers/spree/admin/gift_cards_controller.rb +5 -5
  17. data/app/controllers/spree/admin/import_mappings_controller.rb +1 -1
  18. data/app/controllers/spree/admin/import_rows_controller.rb +1 -1
  19. data/app/controllers/spree/admin/integrations_controller.rb +1 -1
  20. data/app/controllers/spree/admin/invitations_controller.rb +6 -5
  21. data/app/controllers/spree/admin/line_items_controller.rb +1 -1
  22. data/app/controllers/spree/admin/markets_controller.rb +28 -0
  23. data/app/controllers/spree/admin/option_values_controller.rb +1 -1
  24. data/app/controllers/spree/admin/orders/adjustments_controller.rb +4 -4
  25. data/app/controllers/spree/admin/orders/billing_address_controller.rb +4 -4
  26. data/app/controllers/spree/admin/orders/customer_returns_controller.rb +1 -1
  27. data/app/controllers/spree/admin/orders/shipping_address_controller.rb +3 -3
  28. data/app/controllers/spree/admin/orders/user_controller.rb +4 -4
  29. data/app/controllers/spree/admin/orders_controller.rb +8 -4
  30. data/app/controllers/spree/admin/payments_controller.rb +3 -3
  31. data/app/controllers/spree/admin/price_list_products_controller.rb +1 -1
  32. data/app/controllers/spree/admin/price_rules_controller.rb +1 -1
  33. data/app/controllers/spree/admin/products_controller.rb +24 -15
  34. data/app/controllers/spree/admin/profile_controller.rb +1 -1
  35. data/app/controllers/spree/admin/promotion_actions_controller.rb +1 -1
  36. data/app/controllers/spree/admin/promotion_rules_controller.rb +1 -1
  37. data/app/controllers/spree/admin/promotions_controller.rb +1 -1
  38. data/app/controllers/spree/admin/refunds_controller.rb +1 -1
  39. data/app/controllers/spree/admin/reimbursements_controller.rb +2 -2
  40. data/app/controllers/spree/admin/resource_controller.rb +30 -11
  41. data/app/controllers/spree/admin/shipments_controller.rb +3 -3
  42. data/app/controllers/spree/admin/shipping_methods_controller.rb +1 -1
  43. data/app/controllers/spree/admin/store_credits_controller.rb +5 -5
  44. data/app/controllers/spree/admin/stores_controller.rb +1 -32
  45. data/app/controllers/spree/admin/taxons_controller.rb +3 -3
  46. data/app/controllers/spree/admin/translations_controller.rb +1 -0
  47. data/app/controllers/spree/admin/users_controller.rb +2 -2
  48. data/app/helpers/spree/admin/api_keys_helper.rb +32 -0
  49. data/app/helpers/spree/admin/base_helper.rb +6 -1
  50. data/app/helpers/spree/admin/json_preview_helper.rb +29 -25
  51. data/app/helpers/spree/admin/orders_filters_helper.rb +1 -1
  52. data/app/helpers/spree/admin/sortable_tree_helper.rb +1 -1
  53. data/app/helpers/spree/admin/stores_helper.rb +0 -4
  54. data/app/javascript/spree/admin/controllers/autocomplete_select_controller.js +5 -1
  55. data/app/javascript/spree/admin/controllers/search_clear_controller.js +1 -1
  56. data/app/javascript/spree/admin/controllers/select_controller.js +4 -0
  57. data/app/javascript/spree/admin/controllers/variants_form_controller.js +4 -3
  58. data/app/views/spree/admin/api_keys/_details.html.erb +51 -0
  59. data/app/views/spree/admin/api_keys/_form.html.erb +26 -0
  60. data/app/views/spree/admin/api_keys/_token_card.html.erb +28 -0
  61. data/app/views/spree/admin/api_keys/_usage_info.html.erb +16 -0
  62. data/app/views/spree/admin/api_keys/index.html.erb +9 -0
  63. data/app/views/spree/admin/api_keys/show.html.erb +26 -0
  64. data/app/views/spree/admin/classifications/_classification.html.erb +2 -2
  65. data/app/views/spree/admin/classifications/index.html.erb +1 -1
  66. data/app/views/spree/admin/classifications/new.html.erb +1 -1
  67. data/app/views/spree/admin/exports/create.turbo_stream.erb +1 -1
  68. data/app/views/spree/admin/exports/new.html.erb +3 -3
  69. data/app/views/spree/admin/json_previews/show.html.erb +6 -6
  70. data/app/views/spree/admin/markets/_form.html.erb +28 -0
  71. data/app/views/spree/admin/markets/edit.html.erb +1 -0
  72. data/app/views/spree/admin/markets/index.html.erb +9 -0
  73. data/app/views/spree/admin/markets/new.html.erb +1 -0
  74. data/app/views/spree/admin/orders/billing_address/_form.html.erb +2 -2
  75. data/app/views/spree/admin/orders/shipping_address/_form.html.erb +2 -2
  76. data/app/views/spree/admin/payment_methods/_form.html.erb +0 -12
  77. data/app/views/spree/admin/price_rules/forms/_market_rule.html.erb +7 -0
  78. data/app/views/spree/admin/products/_form.html.erb +0 -1
  79. data/app/views/spree/admin/products/form/_variants.html.erb +4 -3
  80. data/app/views/spree/admin/promotion_rules/forms/_country.html.erb +1 -1
  81. data/app/views/spree/admin/shared/_content_header.html.erb +1 -1
  82. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +0 -33
  83. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +2 -2
  84. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +2 -2
  85. data/app/views/spree/admin/stores/form/_basic.html.erb +10 -7
  86. data/app/views/spree/admin/stores/form/_checkout.html.erb +5 -8
  87. data/app/views/spree/admin/tables/columns/_api_key_status.html.erb +2 -0
  88. data/app/views/spree/admin/tables/columns/_api_key_type.html.erb +2 -0
  89. data/app/views/spree/admin/taxonomies/show.html.erb +1 -1
  90. data/app/views/spree/admin/taxons/_form.html.erb +2 -2
  91. data/app/views/spree/admin/taxons/edit.html.erb +1 -2
  92. data/app/views/spree/admin/taxons/update.turbo_stream.erb +1 -1
  93. data/app/views/spree/admin/users/_billing.html.erb +2 -2
  94. data/app/views/spree/admin/users/_shipping.html.erb +1 -1
  95. data/app/views/spree/admin/variants/_variant.html.erb +1 -1
  96. data/config/brakeman.ignore +28 -0
  97. data/config/initializers/spree_admin_navigation.rb +16 -16
  98. data/config/initializers/spree_admin_tables.rb +94 -0
  99. data/config/locales/en.yml +31 -0
  100. data/config/routes.rb +6 -6
  101. data/lib/spree/admin/engine.rb +1 -0
  102. data/lib/spree/admin/tailwind_helper.rb +11 -1
  103. data/lib/spree/admin/testing_support/tom_select.rb +1 -1
  104. metadata +30 -27
  105. data/LICENSE.md +0 -13
  106. data/app/controllers/spree/admin/custom_domains_controller.rb +0 -21
  107. data/app/controllers/spree/admin/oauth_applications_controller.rb +0 -23
  108. data/app/views/spree/admin/custom_domains/_custom_domain.html.erb +0 -11
  109. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +0 -19
  110. data/app/views/spree/admin/custom_domains/_form.html.erb +0 -7
  111. data/app/views/spree/admin/custom_domains/index.html.erb +0 -65
  112. data/app/views/spree/admin/oauth_applications/_form.html.erb +0 -6
  113. data/app/views/spree/admin/oauth_applications/_table_header.html.erb +0 -7
  114. data/app/views/spree/admin/oauth_applications/_table_row.html.erb +0 -34
  115. data/app/views/spree/admin/oauth_applications/create.turbo_stream.erb +0 -31
  116. data/app/views/spree/admin/oauth_applications/edit.html.erb +0 -1
  117. data/app/views/spree/admin/oauth_applications/index.html.erb +0 -21
  118. data/app/views/spree/admin/oauth_applications/new.html.erb +0 -1
  119. data/app/views/spree/admin/products/form/_stores.html.erb +0 -27
  120. data/app/views/spree/admin/stores/new.html.erb +0 -128
  121. data/app/views/spree/admin/stores/new.turbo_stream.erb +0 -1
  122. /data/app/views/spree/admin/{custom_domains → api_keys}/edit.html.erb +0 -0
  123. /data/app/views/spree/admin/{custom_domains → api_keys}/new.html.erb +0 -0
@@ -7,8 +7,7 @@
7
7
  <%= external_page_preview_link(@taxon, name: Spree.t(:taxonomy)) %>
8
8
  <% end %>
9
9
 
10
- <%# Because otherwise the form would attempt to use to_param of @taxon %>
11
- <% form_url = admin_taxonomy_taxon_path(@taxonomy.id, @taxon.id) %>
10
+ <% form_url = admin_taxonomy_taxon_path(@taxonomy, @taxon) %>
12
11
 
13
12
  <%= render partial: 'spree/admin/shared/error_messages', locals: { target: @taxon } %>
14
13
 
@@ -1,7 +1,7 @@
1
1
  <%= turbo_render_alerts %>
2
2
 
3
3
  <%= turbo_stream.replace :classifications do %>
4
- <%= turbo_frame_tag :classifications, src: spree.admin_taxon_classifications_path(@taxon.id) do %>
4
+ <%= turbo_frame_tag :classifications, src: spree.admin_taxon_classifications_path(@taxon) do %>
5
5
  <%= render 'spree/admin/shared/spinner' %>
6
6
  <% end %>
7
7
  <% end %>
@@ -13,7 +13,7 @@
13
13
  </button>
14
14
  <% else %>
15
15
  <%= link_to_with_icon 'plus', Spree.t(:add),
16
- spree.new_admin_address_path(user_id: @user.id, default_billing: true, type: 'billing'),
16
+ spree.new_admin_address_path(user_id: @user.to_param, default_billing: true, type: 'billing'),
17
17
  class: 'btn btn-light btn-sm',
18
18
  data: { turbo_frame: :new_address_billing } if can?(:create, Spree::Address) && can?(:update, @user) %>
19
19
  <% end %>
@@ -42,7 +42,7 @@
42
42
  </div>
43
43
 
44
44
  <div class="custom-control custom-radio">
45
- <%= link_to spree.new_admin_address_path(user_id: @user.id, default_billing: true, type: 'billing'), data: { turbo_frame: :new_address_billing } do %>
45
+ <%= link_to spree.new_admin_address_path(user_id: @user.to_param, default_billing: true, type: 'billing'), data: { turbo_frame: :new_address_billing } do %>
46
46
  <%= radio_button_tag :user_bill_address_id, nil, false,
47
47
  id: 'user_bill_address_id_new_address',
48
48
  class: 'custom-control-input' %>
@@ -9,7 +9,7 @@
9
9
  data: { turbo_frame: :edit_address_shipping } if can?(:update, @user.shipping_address) %>
10
10
  <% else %>
11
11
  <%= link_to_with_icon 'plus', Spree.t(:add),
12
- spree.new_admin_address_path(user_id: @user.id, default_shipping: true, type: 'shipping'),
12
+ spree.new_admin_address_path(user_id: @user.to_param, default_shipping: true, type: 'shipping'),
13
13
  class: 'btn btn-light btn-sm',
14
14
  data: { turbo_frame: :new_address_shipping } if can?(:create, Spree::Address) && can?(:update, @user) %>
15
15
  <% end %>
@@ -5,7 +5,7 @@
5
5
  <% variant_url = spree.edit_admin_product_variant_path(variant.product, variant) %>
6
6
  <% end %>
7
7
 
8
- <%= link_to variant_url, id: spree_dom_id(variant), data: { turbo_permanent: true, turbo_frame: :_top }, class: 'flex items-center justify-start no-underline' do %>
8
+ <%= link_to variant_url, id: dom_id(variant, 'spree'), data: { turbo_permanent: true, turbo_frame: :_top }, class: 'flex items-center justify-start no-underline' do %>
9
9
  <%= render "spree/admin/shared/product_image", object: variant %>
10
10
  <div class="ml-6">
11
11
  <strong><%= variant.name %></strong>
@@ -0,0 +1,28 @@
1
+ {
2
+ "ignored_warnings": [
3
+ {
4
+ "warning_type": "SQL Injection",
5
+ "warning_code": 0,
6
+ "fingerprint": "88419e0a9641c91da76b4b9030cf728cfea25fc84f9715a660f85ae805284d0d",
7
+ "check_name": "SQL",
8
+ "message": "Possible SQL injection",
9
+ "file": "lib/spree/admin/testing_support/capybara_utils.rb",
10
+ "line": 6,
11
+ "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
12
+ "code": "first(\".ti-#{type}\")",
13
+ "render_path": null,
14
+ "location": {
15
+ "type": "method",
16
+ "class": "Spree::Admin::TestingSupport::CapybaraUtils",
17
+ "method": "click_icon"
18
+ },
19
+ "user_input": "type",
20
+ "confidence": "Medium",
21
+ "cwe_id": [
22
+ 89
23
+ ],
24
+ "note": "False positive: this is a Capybara CSS selector, not SQL"
25
+ }
26
+ ],
27
+ "brakeman_version": "7.1.0"
28
+ }
@@ -258,15 +258,6 @@ Rails.application.config.after_initialize do
258
258
  active: -> { controller_name == 'policies' },
259
259
  if: -> { can?(:manage, Spree::Policy) }
260
260
 
261
- # Domains
262
- settings_nav.add :domains,
263
- label: :domains,
264
- url: :admin_custom_domains_path,
265
- icon: 'world-www',
266
- position: 60,
267
- active: -> { controller_name == 'custom_domains' },
268
- if: -> { can?(:manage, Spree::CustomDomain) }
269
-
270
261
  # Payment Methods
271
262
  settings_nav.add :payment_methods,
272
263
  label: :payments,
@@ -276,11 +267,20 @@ Rails.application.config.after_initialize do
276
267
  active: -> { controller_name == 'payment_methods' },
277
268
  if: -> { can?(:manage, Spree::PaymentMethod) }
278
269
 
270
+ # Markets
271
+ settings_nav.add :markets,
272
+ label: :markets,
273
+ url: :admin_markets_path,
274
+ icon: 'world',
275
+ position: 78,
276
+ active: -> { controller_name == 'markets' },
277
+ if: -> { can?(:manage, Spree::Market) }
278
+
279
279
  # Zones
280
280
  settings_nav.add :zones,
281
281
  label: :zones,
282
282
  url: :admin_zones_path,
283
- icon: 'world',
283
+ icon: 'map-2',
284
284
  position: 80,
285
285
  active: -> { %w[zones countries states].include?(controller_name) },
286
286
  if: -> { can?(:manage, Spree::Zone) }
@@ -346,11 +346,11 @@ Rails.application.config.after_initialize do
346
346
  # Developers
347
347
  settings_nav.add :developers,
348
348
  label: :developers,
349
- url: :admin_oauth_applications_path,
349
+ url: :admin_api_keys_path,
350
350
  icon: 'terminal',
351
351
  position: 150,
352
- active: -> { %w[oauth_applications webhooks_subscribers webhook_endpoints webhook_deliveries].include?(controller_name) },
353
- if: -> { can?(:manage, Spree::OauthApplication) }
352
+ active: -> { %w[oauth_applications api_keys webhooks_subscribers webhook_endpoints webhook_deliveries].include?(controller_name) },
353
+ if: -> { can?(:manage, Spree::ApiKey) }
354
354
 
355
355
  # Edit Profile
356
356
  settings_nav.add :edit_profile,
@@ -459,10 +459,10 @@ Rails.application.config.after_initialize do
459
459
 
460
460
  developers_tabs_nav.add :api_keys,
461
461
  label: :api_keys,
462
- url: :admin_oauth_applications_path,
462
+ url: :admin_api_keys_path,
463
463
  position: 10,
464
- active: -> { controller_name == 'oauth_applications' },
465
- if: -> { can?(:manage, Spree::OauthApplication) }
464
+ active: -> { controller_name == 'api_keys' },
465
+ if: -> { can?(:manage, Spree::ApiKey) }
466
466
 
467
467
  developers_tabs_nav.add :webhook_endpoints,
468
468
  label: :webhook_endpoints,
@@ -1408,6 +1408,66 @@ Rails.application.config.after_initialize do
1408
1408
  default: false,
1409
1409
  position: 80
1410
1410
 
1411
+ # ==========================================
1412
+ # API Keys Table
1413
+ # ==========================================
1414
+ Spree.admin.tables.register(:api_keys, model_class: Spree::ApiKey, search_param: :name_cont, row_actions: false, link_to_action: :show)
1415
+
1416
+ Spree.admin.tables.api_keys.add :name,
1417
+ label: :name,
1418
+ type: :link,
1419
+ sortable: true,
1420
+ filterable: true,
1421
+ default: true,
1422
+ position: 10
1423
+
1424
+ Spree.admin.tables.api_keys.add :key_type,
1425
+ label: 'admin.api_keys.key_type',
1426
+ type: :custom,
1427
+ sortable: true,
1428
+ filterable: true,
1429
+ default: true,
1430
+ position: 20,
1431
+ partial: 'spree/admin/tables/columns/api_key_type',
1432
+ filter_type: :select,
1433
+ value_options: [
1434
+ { value: 'publishable', label: 'Publishable' },
1435
+ { value: 'secret', label: 'Secret' }
1436
+ ]
1437
+
1438
+ Spree.admin.tables.api_keys.add :status,
1439
+ label: :status,
1440
+ type: :custom,
1441
+ sortable: false,
1442
+ filterable: false,
1443
+ default: true,
1444
+ position: 30,
1445
+ partial: 'spree/admin/tables/columns/api_key_status'
1446
+
1447
+ Spree.admin.tables.api_keys.add :last_used_at,
1448
+ label: 'admin.api_keys.last_used_at',
1449
+ type: :datetime,
1450
+ sortable: true,
1451
+ filterable: false,
1452
+ default: true,
1453
+ position: 40
1454
+
1455
+ Spree.admin.tables.api_keys.add :created_at,
1456
+ label: :created_at,
1457
+ type: :datetime,
1458
+ sortable: true,
1459
+ filterable: true,
1460
+ default: true,
1461
+ position: 50
1462
+
1463
+ Spree.admin.tables.api_keys.add :updated_at,
1464
+ label: :updated_at,
1465
+ type: :datetime,
1466
+ sortable: true,
1467
+ filterable: true,
1468
+ default: false,
1469
+ position: 60
1470
+
1411
1471
  # ==========================================
1412
1472
  # Price Lists Table
1413
1473
  # ==========================================
@@ -1619,4 +1679,38 @@ Rails.application.config.after_initialize do
1619
1679
  button_class: 'btn-danger',
1620
1680
  method: :delete,
1621
1681
  position: 10
1682
+
1683
+ # ==========================================
1684
+ # Register Markets table
1685
+ # ==========================================
1686
+ Spree.admin.tables.register(:markets, model_class: Spree::Market, search_param: :name_cont)
1687
+
1688
+ Spree.admin.tables.markets.add :name,
1689
+ label: :name,
1690
+ type: :string,
1691
+ sortable: true,
1692
+ filterable: true,
1693
+ default: true,
1694
+ position: 10
1695
+
1696
+ Spree.admin.tables.markets.add :currency,
1697
+ label: :currency,
1698
+ type: :string,
1699
+ sortable: true,
1700
+ default: true,
1701
+ position: 20
1702
+
1703
+ Spree.admin.tables.markets.add :default_locale,
1704
+ label: :default_locale,
1705
+ type: :string,
1706
+ sortable: true,
1707
+ default: true,
1708
+ position: 30
1709
+
1710
+ Spree.admin.tables.markets.add :default,
1711
+ label: :default,
1712
+ type: :boolean,
1713
+ sortable: true,
1714
+ default: true,
1715
+ position: 40
1622
1716
  end
@@ -3,6 +3,31 @@ en:
3
3
  spree:
4
4
  admin:
5
5
  amount_spent: Amount spent
6
+ api_keys:
7
+ example_request: Example Request
8
+ key_revoked_message: This API key has been revoked and can no longer be used.
9
+ key_type_descriptions:
10
+ publishable: Safe to use in client-side code like mobile apps or browsers.
11
+ secret: Keep this secure and only use it server-side. Never expose it publicly.
12
+ key_types:
13
+ publishable: Publishable
14
+ secret: Secret
15
+ last_used_at: Last used
16
+ list: API Keys
17
+ name_placeholder: e.g. Mobile App Production
18
+ revoke: Revoke
19
+ revoke_confirmation: Are you sure you want to revoke this API key? This action cannot be undone.
20
+ revoked: API key has been revoked
21
+ revoked_at: Revoked at
22
+ revoked_by: Revoked by
23
+ statuses:
24
+ active: Active
25
+ revoked: Revoked
26
+ token_warning: Store this key securely. It will be shown only this once.
27
+ usage: Usage
28
+ usage_instructions:
29
+ publishable: Use this key for client-side requests. It can be safely included in your frontend code.
30
+ secret: Use this key for server-side requests only. Keep it confidential and never expose it in client-side code.
6
31
  audit_log: Audit Log
7
32
  avg_order_value: Avg. Order Value
8
33
  back_to_dashboard: Back to dashboard
@@ -49,6 +74,7 @@ en:
49
74
  description: Links to these pages will be displayed in the checkout footer.
50
75
  label: Checkout links
51
76
  checkout_message_description: Visible to your customers on the checkout page in the right sidebar.
77
+ countries_managed_by_markets_html: Countries and shipping zones are managed through %{link}.
52
78
  guest_checkout:
53
79
  description: Allow customers to checkout without creating an account.
54
80
  label: Allow guest checkout
@@ -118,6 +144,11 @@ en:
118
144
  manage_stock_locations: Manage Stock Locations
119
145
  manage_taxons: Manage Taxons
120
146
  manage_zones: Manage Zones
147
+ markets:
148
+ edit: Edit Market
149
+ list: Markets
150
+ new: New Market
151
+ supported_locales_hint: Comma-separated list of additional locale codes (e.g. fr,de,es)
121
152
  metafield_definitions:
122
153
  edit_warning: You can't change the resource type or metafield type after the definition has been used.
123
154
  used_in: Used in
data/config/routes.rb CHANGED
@@ -208,9 +208,6 @@ Spree::Core::Engine.add_routes do
208
208
  member do
209
209
  get :edit_emails
210
210
  end
211
- end
212
- # setting up a new store
213
- resources :stores, only: [:new, :create] do
214
211
  resources :role_users, only: [:destroy]
215
212
  resources :links, controller: 'page_links', only: [:create]
216
213
  end
@@ -224,14 +221,13 @@ Spree::Core::Engine.add_routes do
224
221
  resources :reimbursement_types
225
222
  resources :refund_reasons, except: :show
226
223
  resources :return_authorization_reasons, except: :show
224
+ resources :markets
227
225
  resources :zones
228
226
  resources :stock_locations, except: :show do
229
227
  member do
230
228
  put :mark_as_default
231
229
  end
232
230
  end
233
- resources :custom_domains, except: :show
234
-
235
231
  # integrations
236
232
  resources :integrations
237
233
 
@@ -266,7 +262,11 @@ Spree::Core::Engine.add_routes do
266
262
  end
267
263
 
268
264
  # developer tools
269
- resources :oauth_applications
265
+ resources :api_keys, except: :destroy do
266
+ member do
267
+ put :revoke
268
+ end
269
+ end
270
270
  resources :webhook_endpoints do
271
271
  resources :webhook_deliveries, only: [:index, :show]
272
272
  end
@@ -47,6 +47,7 @@ module Spree
47
47
  :pages_actions_partials,
48
48
  :pages_header_partials,
49
49
  :payment_methods_actions_partials,
50
+ :payment_method_form_partials,
50
51
  :payment_methods_header_partials,
51
52
  :post_categories_actions_partials,
52
53
  :post_categories_header_partials,
@@ -22,6 +22,16 @@ module Spree
22
22
  css = File.read(input_path)
23
23
  css = css.gsub("$SPREE_ADMIN_PATH", Spree::Admin::Engine.root.to_s)
24
24
  css = css.gsub("/* $SPREE_ENGINE_SOURCES */", spree_engine_sources)
25
+
26
+ # Resolve relative @source paths to absolute paths since the resolved
27
+ # CSS is written to tmp/ which changes the relative path base
28
+ source_base = input_path.dirname
29
+ css = css.gsub(%r{@source\s+"(\.\./[^"]+)"}) do |_match|
30
+ relative = Regexp.last_match(1)
31
+ absolute = File.expand_path(relative, source_base)
32
+ %(@source "#{absolute}")
33
+ end
34
+
25
35
  css
26
36
  end
27
37
 
@@ -33,7 +43,7 @@ module Spree
33
43
 
34
44
  def spree_engines
35
45
  Rails::Engine.subclasses.select do |engine|
36
- engine.name&.start_with?("Spree::") && engine != Spree::Admin::Engine
46
+ engine.name&.start_with?("Spree::")
37
47
  end
38
48
  end
39
49
 
@@ -8,7 +8,7 @@ module Spree
8
8
  if create
9
9
  first('.ts-dropdown .ts-dropdown-content .create.active').click
10
10
  else
11
- first('.ts-dropdown .ts-dropdown-content .option', text: /#{Regexp.quote(value)}/i).click
11
+ find('.ts-dropdown .ts-dropdown-content .option', text: /#{Regexp.quote(value)}/i, match: :first).click
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.5
4
+ version: 5.4.0.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-02-25 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: spree
@@ -15,14 +16,14 @@ dependencies:
15
16
  requirements:
16
17
  - - ">="
17
18
  - !ruby/object:Gem::Version
18
- version: 5.3.5
19
+ version: 5.4.0.beta
19
20
  type: :runtime
20
21
  prerelease: false
21
22
  version_requirements: !ruby/object:Gem::Requirement
22
23
  requirements:
23
24
  - - ">="
24
25
  - !ruby/object:Gem::Version
25
- version: 5.3.5
26
+ version: 5.4.0.beta
26
27
  - !ruby/object:Gem::Dependency
27
28
  name: active_link_to
28
29
  requirement: !ruby/object:Gem::Requirement
@@ -240,7 +241,6 @@ executables: []
240
241
  extensions: []
241
242
  extra_rdoc_files: []
242
243
  files:
243
- - LICENSE.md
244
244
  - README.md
245
245
  - Rakefile
246
246
  - app/assets/config/spree_admin_manifest.js
@@ -296,6 +296,7 @@ files:
296
296
  - app/controllers/spree/admin/action_text/video_embeds_controller.rb
297
297
  - app/controllers/spree/admin/addresses_controller.rb
298
298
  - app/controllers/spree/admin/admin_users_controller.rb
299
+ - app/controllers/spree/admin/api_keys_controller.rb
299
300
  - app/controllers/spree/admin/assets_controller.rb
300
301
  - app/controllers/spree/admin/base_controller.rb
301
302
  - app/controllers/spree/admin/bulk_operations_controller.rb
@@ -303,7 +304,6 @@ files:
303
304
  - app/controllers/spree/admin/classifications_controller.rb
304
305
  - app/controllers/spree/admin/countries_controller.rb
305
306
  - app/controllers/spree/admin/coupon_codes_controller.rb
306
- - app/controllers/spree/admin/custom_domains_controller.rb
307
307
  - app/controllers/spree/admin/customer_group_users_controller.rb
308
308
  - app/controllers/spree/admin/customer_groups_controller.rb
309
309
  - app/controllers/spree/admin/customer_returns_controller.rb
@@ -320,10 +320,10 @@ files:
320
320
  - app/controllers/spree/admin/invitations_controller.rb
321
321
  - app/controllers/spree/admin/json_previews_controller.rb
322
322
  - app/controllers/spree/admin/line_items_controller.rb
323
+ - app/controllers/spree/admin/markets_controller.rb
323
324
  - app/controllers/spree/admin/metafield_definitions_controller.rb
324
325
  - app/controllers/spree/admin/metafields_controller.rb
325
326
  - app/controllers/spree/admin/newsletter_subscribers_controller.rb
326
- - app/controllers/spree/admin/oauth_applications_controller.rb
327
327
  - app/controllers/spree/admin/option_types_controller.rb
328
328
  - app/controllers/spree/admin/option_values_controller.rb
329
329
  - app/controllers/spree/admin/orders/adjustments_controller.rb
@@ -385,6 +385,7 @@ files:
385
385
  - app/controllers/spree/admin/webhook_deliveries_controller.rb
386
386
  - app/controllers/spree/admin/webhook_endpoints_controller.rb
387
387
  - app/controllers/spree/admin/zones_controller.rb
388
+ - app/helpers/spree/admin/api_keys_helper.rb
388
389
  - app/helpers/spree/admin/assets_helper.rb
389
390
  - app/helpers/spree/admin/avatars_helper.rb
390
391
  - app/helpers/spree/admin/base_helper.rb
@@ -519,6 +520,14 @@ files:
519
520
  - app/views/spree/admin/admin_users/index.html.erb
520
521
  - app/views/spree/admin/admin_users/new.html.erb
521
522
  - app/views/spree/admin/admin_users/show.html.erb
523
+ - app/views/spree/admin/api_keys/_details.html.erb
524
+ - app/views/spree/admin/api_keys/_form.html.erb
525
+ - app/views/spree/admin/api_keys/_token_card.html.erb
526
+ - app/views/spree/admin/api_keys/_usage_info.html.erb
527
+ - app/views/spree/admin/api_keys/edit.html.erb
528
+ - app/views/spree/admin/api_keys/index.html.erb
529
+ - app/views/spree/admin/api_keys/new.html.erb
530
+ - app/views/spree/admin/api_keys/show.html.erb
522
531
  - app/views/spree/admin/assets/bulk_destroy.turbo_stream.erb
523
532
  - app/views/spree/admin/assets/create.turbo_stream.erb
524
533
  - app/views/spree/admin/assets/destroy.turbo_stream.erb
@@ -539,12 +548,6 @@ files:
539
548
  - app/views/spree/admin/coupon_codes/_table_row.html.erb
540
549
  - app/views/spree/admin/coupon_codes/index.csv.erb
541
550
  - app/views/spree/admin/coupon_codes/index.html.erb
542
- - app/views/spree/admin/custom_domains/_custom_domain.html.erb
543
- - app/views/spree/admin/custom_domains/_custom_domains.html.erb
544
- - app/views/spree/admin/custom_domains/_form.html.erb
545
- - app/views/spree/admin/custom_domains/edit.html.erb
546
- - app/views/spree/admin/custom_domains/index.html.erb
547
- - app/views/spree/admin/custom_domains/new.html.erb
548
551
  - app/views/spree/admin/customer_group_users/bulk_create.turbo_stream.erb
549
552
  - app/views/spree/admin/customer_group_users/bulk_destroy.turbo_stream.erb
550
553
  - app/views/spree/admin/customer_group_users/bulk_new.html.erb
@@ -627,6 +630,10 @@ files:
627
630
  - app/views/spree/admin/json_previews/show.html.erb
628
631
  - app/views/spree/admin/line_items/edit.html.erb
629
632
  - app/views/spree/admin/line_items/new.html.erb
633
+ - app/views/spree/admin/markets/_form.html.erb
634
+ - app/views/spree/admin/markets/edit.html.erb
635
+ - app/views/spree/admin/markets/index.html.erb
636
+ - app/views/spree/admin/markets/new.html.erb
630
637
  - app/views/spree/admin/metafield_definitions/_filters.html.erb
631
638
  - app/views/spree/admin/metafield_definitions/_form.html.erb
632
639
  - app/views/spree/admin/metafield_definitions/_table_header.html.erb
@@ -647,13 +654,6 @@ files:
647
654
  - app/views/spree/admin/newsletter_subscribers/_table_header.html.erb
648
655
  - app/views/spree/admin/newsletter_subscribers/_table_row.html.erb
649
656
  - app/views/spree/admin/newsletter_subscribers/index.html.erb
650
- - app/views/spree/admin/oauth_applications/_form.html.erb
651
- - app/views/spree/admin/oauth_applications/_table_header.html.erb
652
- - app/views/spree/admin/oauth_applications/_table_row.html.erb
653
- - app/views/spree/admin/oauth_applications/create.turbo_stream.erb
654
- - app/views/spree/admin/oauth_applications/edit.html.erb
655
- - app/views/spree/admin/oauth_applications/index.html.erb
656
- - app/views/spree/admin/oauth_applications/new.html.erb
657
657
  - app/views/spree/admin/option_types/_filters.html.erb
658
658
  - app/views/spree/admin/option_types/_form.html.erb
659
659
  - app/views/spree/admin/option_types/_option_value_fields.html.erb
@@ -792,6 +792,7 @@ files:
792
792
  - app/views/spree/admin/price_rules/_price_rule.html.erb
793
793
  - app/views/spree/admin/price_rules/edit.html.erb
794
794
  - app/views/spree/admin/price_rules/forms/_customer_group_rule.html.erb
795
+ - app/views/spree/admin/price_rules/forms/_market_rule.html.erb
795
796
  - app/views/spree/admin/price_rules/forms/_user_rule.html.erb
796
797
  - app/views/spree/admin/price_rules/forms/_volume_rule.html.erb
797
798
  - app/views/spree/admin/price_rules/forms/_zone_rule.html.erb
@@ -813,7 +814,6 @@ files:
813
814
  - app/views/spree/admin/products/form/_properties.html.erb
814
815
  - app/views/spree/admin/products/form/_shipping.html.erb
815
816
  - app/views/spree/admin/products/form/_status.html.erb
816
- - app/views/spree/admin/products/form/_stores.html.erb
817
817
  - app/views/spree/admin/products/form/_tax.html.erb
818
818
  - app/views/spree/admin/products/form/_variants.html.erb
819
819
  - app/views/spree/admin/products/form/variants/_option_template.html.erb
@@ -1044,8 +1044,6 @@ files:
1044
1044
  - app/views/spree/admin/stores/form/_checkout_links.html.erb
1045
1045
  - app/views/spree/admin/stores/form/_emails.html.erb
1046
1046
  - app/views/spree/admin/stores/form/_policies.html.erb
1047
- - app/views/spree/admin/stores/new.html.erb
1048
- - app/views/spree/admin/stores/new.turbo_stream.erb
1049
1047
  - app/views/spree/admin/stores/update.turbo_stream.erb
1050
1048
  - app/views/spree/admin/tables/_column_selector.html.erb
1051
1049
  - app/views/spree/admin/tables/_filter_group.html.erb
@@ -1055,6 +1053,8 @@ files:
1055
1053
  - app/views/spree/admin/tables/_table.html.erb
1056
1054
  - app/views/spree/admin/tables/_table_body.html.erb
1057
1055
  - app/views/spree/admin/tables/_table_row.html.erb
1056
+ - app/views/spree/admin/tables/columns/_api_key_status.html.erb
1057
+ - app/views/spree/admin/tables/columns/_api_key_type.html.erb
1058
1058
  - app/views/spree/admin/tables/columns/_gift_card_status.html.erb
1059
1059
  - app/views/spree/admin/tables/columns/_metafield_definition_display_on.html.erb
1060
1060
  - app/views/spree/admin/tables/columns/_newsletter_subscriber_customer.html.erb
@@ -1172,6 +1172,7 @@ files:
1172
1172
  - app/views/spree/admin/zones/edit.html.erb
1173
1173
  - app/views/spree/admin/zones/index.html.erb
1174
1174
  - app/views/spree/admin/zones/new.html.erb
1175
+ - config/brakeman.ignore
1175
1176
  - config/i18n-tasks.yml
1176
1177
  - config/importmap.rb
1177
1178
  - config/initializers/action_text.rb
@@ -1254,12 +1255,13 @@ files:
1254
1255
  - vendor/javascript/w3c-keyname.js
1255
1256
  homepage: https://getvendo.com
1256
1257
  licenses:
1257
- - AGPL-3.0-or-later
1258
+ - BSD-3-Clause
1258
1259
  metadata:
1259
1260
  bug_tracker_uri: https://github.com/spree/spree/issues
1260
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.3.5
1261
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.beta
1261
1262
  documentation_uri: https://docs.spreecommerce.org/
1262
- source_code_uri: https://github.com/spree/spree/tree/v5.3.5
1263
+ source_code_uri: https://github.com/spree/spree/tree/v5.4.0.beta
1264
+ post_install_message:
1263
1265
  rdoc_options: []
1264
1266
  require_paths:
1265
1267
  - lib
@@ -1274,7 +1276,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1274
1276
  - !ruby/object:Gem::Version
1275
1277
  version: '0'
1276
1278
  requirements: []
1277
- rubygems_version: 4.0.3
1279
+ rubygems_version: 3.5.22
1280
+ signing_key:
1278
1281
  specification_version: 4
1279
1282
  summary: Admin Dashboard for Spree Commerce developed by Vendo Connect Inc.
1280
1283
  test_files: []
data/LICENSE.md DELETED
@@ -1,13 +0,0 @@
1
- # License
2
-
3
- Copyright © 2024-present, Vendo Connect Inc.
4
-
5
- This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6
-
7
- This program is distributed in the hope that it will be useful,
8
- but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- GNU Affero General Public License for more details.
11
-
12
- You should have received a copy of the GNU Affero General Public License
13
- along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
@@ -1,21 +0,0 @@
1
- module Spree
2
- module Admin
3
- class CustomDomainsController < ResourceController
4
- include Spree::Admin::SettingsConcern
5
-
6
- protected
7
-
8
- def collection_url
9
- spree.admin_custom_domains_path
10
- end
11
-
12
- def location_after_save
13
- spree.admin_custom_domains_path
14
- end
15
-
16
- def permitted_resource_params
17
- params.require(:custom_domain).permit(Spree::PermittedAttributes.custom_domain_attributes)
18
- end
19
- end
20
- end
21
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- module Admin
3
- class OauthApplicationsController < ResourceController
4
- include Spree::Admin::SettingsConcern
5
-
6
- before_action :set_default_scopes, only: [:new, :edit]
7
-
8
- private
9
-
10
- def create_turbo_stream_enabled?
11
- true
12
- end
13
-
14
- def set_default_scopes
15
- @object.scopes = 'admin' if @object.scopes.blank?
16
- end
17
-
18
- def permitted_resource_params
19
- params.require(:oauth_application).permit(:name, :scopes)
20
- end
21
- end
22
- end
23
- end