spree_admin 5.4.0.rc3 → 5.4.0.rc4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ca74c8ed8e383bcc1bd52d20db41e88aa9924a62305219e34af249b307d832d
4
- data.tar.gz: f7e712fe81c3d2a56cf1c0407755878feead32a54a3bdfeb277581a95055249f
3
+ metadata.gz: 9750b782ff733d29c8bd3317c5ff0df08a1e00cc87e6b298bd16443aa14001ee
4
+ data.tar.gz: 432da97b2f3fa68dff9fd4d4402b05598aa6c9486a1b686e3de18e43d4a2bb14
5
5
  SHA512:
6
- metadata.gz: 3d0d5c786e70948d127f38621773498ebdbad6bfba3e6951b32ba34e1572185c2d72277b6d1cdcd293dfaaef04107d9f72e3572e6cbc34907005531ef28692be
7
- data.tar.gz: 9158b307eaae7635cbdbc09e26ef622ef43077db911373f948966c6d104eb95f66ae845d0cd696ac6c317dc3dddfead396adffa78efad46f027b5e942bdc147b
6
+ metadata.gz: b9e635debf7dd86a93de73f055d7f78d2c66740b1cccfeb1667fce479f0d810a903f56b52065a3779859cf22cf40f95344224671b6b9a35198af5e6430f69a5e
7
+ data.tar.gz: 430d124d5325a384714ec73ffcbe6fd2f052e4f2b0d93a798977471b3397abba6d8f0a5c79bbe6d774a73be665c515fc16e2ac82760e636045fd2e1c38d2ee3d
@@ -76,7 +76,12 @@
76
76
  @apply block mt-1 text-sm text-danger;
77
77
  }
78
78
 
79
- /* Select */
79
+ /* Select — ensure text doesn't overlap the dropdown arrow */
80
+ .form-select,
81
+ .custom-select {
82
+ @apply pr-10;
83
+ }
84
+
80
85
  .custom-select:disabled,
81
86
  .custom-select[readonly],
82
87
  .form-select:disabled,
@@ -10,6 +10,14 @@ module Spree
10
10
 
11
11
  belongs_to 'spree/webhook_endpoint'
12
12
 
13
+ def redeliver
14
+ load_resource
15
+ authorize! :update, @object.webhook_endpoint
16
+ new_delivery = @object.redeliver!
17
+ flash[:success] = Spree.t('admin.webhook_deliveries.redelivered')
18
+ redirect_back(fallback_location: spree.admin_webhook_endpoint_webhook_delivery_path(@object.webhook_endpoint, new_delivery))
19
+ end
20
+
13
21
  private
14
22
 
15
23
  def collection_default_sort
@@ -8,6 +8,19 @@ module Spree
8
8
 
9
9
  helper 'spree/admin/webhook_endpoints'
10
10
 
11
+ def test
12
+ load_resource
13
+ authorize! :update, @object
14
+ begin
15
+ @object.send_test!
16
+ flash[:success] = Spree.t('admin.webhook_endpoints.test_sent')
17
+ rescue StandardError => e
18
+ Rails.error.report(e, context: { webhook_endpoint_id: @object.id, url: @object.url })
19
+ flash[:error] = Spree.t('admin.webhook_endpoints.test_failed')
20
+ end
21
+ redirect_back(fallback_location: spree.admin_webhook_endpoint_path(@object))
22
+ end
23
+
11
24
  private
12
25
 
13
26
  def permitted_resource_params
@@ -66,15 +66,33 @@ module Spree
66
66
  end
67
67
 
68
68
  def webhook_endpoint_success_percentage(webhook_endpoint)
69
- return '' if webhook_endpoint.webhook_deliveries.none?
69
+ return nil if webhook_endpoint.webhook_deliveries.none?
70
70
 
71
71
  (webhook_endpoint.webhook_deliveries.successful.count / webhook_endpoint.webhook_deliveries.count.to_f * 100).round(2)
72
72
  end
73
73
 
74
+ def webhook_endpoint_health_badge(endpoint)
75
+ if endpoint.auto_disabled?
76
+ content_tag(:span, Spree.t('admin.webhook_endpoints.health.disabled'), class: 'badge badge-danger')
77
+ elsif endpoint.webhook_deliveries.none?
78
+ content_tag(:span, Spree.t('admin.webhook_endpoints.health.no_deliveries'), class: 'badge badge-light')
79
+ else
80
+ pct = webhook_endpoint_success_percentage(endpoint)
81
+ if pct >= 95
82
+ content_tag(:span, Spree.t('admin.webhook_endpoints.health.healthy', percentage: pct), class: 'badge badge-success')
83
+ elsif pct >= 80
84
+ content_tag(:span, Spree.t('admin.webhook_endpoints.health.degraded', percentage: pct), class: 'badge badge-warning')
85
+ else
86
+ content_tag(:span, Spree.t('admin.webhook_endpoints.health.failing', percentage: pct), class: 'badge badge-danger')
87
+ end
88
+ end
89
+ end
90
+
74
91
  private
75
92
 
76
93
  def custom_webhook_events
77
94
  %w[
95
+ customer.password_reset_requested
78
96
  order.completed
79
97
  order.paid
80
98
  order.canceled
@@ -0,0 +1,2 @@
1
+ <%# locals: (record:, column:, value:) %>
2
+ <%= webhook_endpoint_health_badge(record) %>
@@ -57,5 +57,15 @@
57
57
  <%= code_block @webhook_delivery.response_body.truncate(2000) %>
58
58
  <% end %>
59
59
 
60
+ <% if @webhook_delivery.failed? %>
61
+ <div class="pt-2">
62
+ <%= button_to Spree.t('admin.webhook_deliveries.redeliver_button'),
63
+ spree.redeliver_admin_webhook_endpoint_webhook_delivery_path(@webhook_delivery.webhook_endpoint, @webhook_delivery),
64
+ method: :post,
65
+ class: 'btn btn-primary w-full',
66
+ data: { turbo: false } %>
67
+ </div>
68
+ <% end %>
69
+
60
70
  </div>
61
71
  <% end %>
@@ -3,7 +3,8 @@
3
3
  <h5 class="card-title"><%= Spree.t('admin.webhook_endpoints.endpoint_settings') %></h5>
4
4
  </div>
5
5
  <div class="card-body">
6
- <%= f.spree_text_field :url, required: true, autofocus: f.object.new_record?, placeholder: 'https://example.com/webhooks', disabled: f.object.persisted? %>
6
+ <%= f.spree_text_field :name, placeholder: 'e.g. Storefront emails, Fulfillment service' %>
7
+ <%= f.spree_text_field :url, required: true, autofocus: f.object.new_record?, placeholder: 'https://example.com/webhooks' %>
7
8
  <%= f.spree_check_box :active %>
8
9
  </div>
9
10
  </div>
@@ -1,6 +1,21 @@
1
+ <% if @webhook_endpoint.auto_disabled? %>
2
+ <div class="alert alert-danger mb-6">
3
+ <%= Spree.t('admin.webhook_endpoints.auto_disabled') %>
4
+ <%= button_to Spree.t('admin.webhook_endpoints.re_enable'), spree.admin_webhook_endpoint_path(@webhook_endpoint), method: :patch,
5
+ params: { webhook_endpoint: { active: true } }, class: 'btn btn-sm btn-outline-danger ms-2', data: { turbo: false } %>
6
+ </div>
7
+ <% end %>
8
+
1
9
  <div class="card mb-6">
2
10
  <div class="card-body">
3
- <div class="grid grid-cols-2 lg:grid-cols-3 gap-6">
11
+ <div class="grid grid-cols-2 lg:grid-cols-4 gap-6">
12
+ <div class="flex flex-col mb-6 lg:mb-0 border-r gap-2">
13
+ <span class="text-sm text-gray-500"><%= Spree.t('admin.webhook_endpoints.health_label') %></span>
14
+ <span class="text-lg">
15
+ <%= webhook_endpoint_health_badge(@webhook_endpoint) %>
16
+ </span>
17
+ </div>
18
+
4
19
  <div class="flex flex-col mb-6 lg:mb-0 border-r gap-2">
5
20
  <span class="text-sm text-gray-500"><%= Spree.t('admin.webhook_endpoints.deliveries') %></span>
6
21
  <span class="text-lg text-gray-900 font-bold">
@@ -1,6 +1,14 @@
1
1
  <%= content_for :page_title do %>
2
2
  <%= page_header_back_button(collection_url) %>
3
- <%= @webhook_endpoint.url %>
3
+ <%= @webhook_endpoint.name.presence || @webhook_endpoint.url %>
4
+ <% end %>
5
+
6
+ <%= content_for :page_actions do %>
7
+ <%= button_to Spree.t('admin.webhook_endpoints.send_test'),
8
+ spree.test_admin_webhook_endpoint_path(@webhook_endpoint),
9
+ method: :post,
10
+ class: 'btn btn-light',
11
+ data: { turbo: false } %>
4
12
  <% end %>
5
13
 
6
14
  <div class="grid grid-cols-12 gap-6">
@@ -1178,11 +1178,20 @@ Rails.application.config.after_initialize do
1178
1178
  # ==========================================
1179
1179
  # Webhook Endpoints Table
1180
1180
  # ==========================================
1181
- Spree.admin.tables.register(:webhook_endpoints, model_class: Spree::WebhookEndpoint, search_param: :url_cont, row_actions: false, link_to_action: :show)
1181
+ Spree.admin.tables.register(:webhook_endpoints, model_class: Spree::WebhookEndpoint, search_param: :name_or_url_cont, row_actions: false, link_to_action: :show)
1182
+
1183
+ Spree.admin.tables.webhook_endpoints.add :name,
1184
+ label: :name,
1185
+ type: :link,
1186
+ sortable: true,
1187
+ filterable: true,
1188
+ default: true,
1189
+ position: 5,
1190
+ method: ->(endpoint) { endpoint.name.presence || endpoint.url }
1182
1191
 
1183
1192
  Spree.admin.tables.webhook_endpoints.add :url,
1184
1193
  label: :url,
1185
- type: :link,
1194
+ type: :string,
1186
1195
  sortable: true,
1187
1196
  filterable: true,
1188
1197
  default: true,
@@ -1201,6 +1210,15 @@ Rails.application.config.after_initialize do
1201
1210
  { value: 'false', label: 'Inactive' }
1202
1211
  ]
1203
1212
 
1213
+ Spree.admin.tables.webhook_endpoints.add :health,
1214
+ label: 'admin.webhook_endpoints.health_label',
1215
+ type: :custom,
1216
+ sortable: false,
1217
+ filterable: false,
1218
+ default: true,
1219
+ position: 25,
1220
+ partial: 'spree/admin/tables/columns/webhook_endpoint_health'
1221
+
1204
1222
  Spree.admin.tables.webhook_endpoints.add :subscriptions_count,
1205
1223
  label: 'admin.webhook_endpoints.events',
1206
1224
  type: :string,
@@ -402,11 +402,14 @@ en:
402
402
  execution_time: Execution Time
403
403
  failed: Failed
404
404
  pending: Pending
405
+ redeliver_button: Redeliver
406
+ redelivered: Webhook redelivered successfully.
405
407
  request_errors: Request Errors
406
408
  request_payload: Request Payload
407
409
  response_body: Response Body
408
410
  response_code: Response Code
409
411
  webhook_endpoints:
412
+ auto_disabled: This endpoint was automatically disabled after repeated delivery failures.
410
413
  back_to_endpoint: Back to endpoint
411
414
  deliveries: Deliveries
412
415
  endpoint_settings: Endpoint Settings
@@ -414,11 +417,22 @@ en:
414
417
  event_subscriptions_help: Select which events should trigger a webhook delivery to this endpoint.
415
418
  events: events
416
419
  failed_deliveries: Failed Deliveries
420
+ health:
421
+ degraded: "%{percentage}% success"
422
+ disabled: Disabled
423
+ failing: "%{percentage}% success"
424
+ healthy: "%{percentage}% success"
425
+ no_deliveries: No data
426
+ health_label: Health
417
427
  new: New Webhook Endpoint
428
+ re_enable: Re-enable
418
429
  secret_key: Secret Key
419
430
  secret_key_help: Use this key to verify webhook signatures. Keep it secure and do not share it publicly.
431
+ send_test: Send Test
420
432
  subscriptions: Subscriptions
421
433
  successful_deliveries: Successful Deliveries
434
+ test_failed: Failed to send test webhook. Please check the endpoint configuration.
435
+ test_sent: Test webhook sent. Check deliveries for the result.
422
436
  webhooks_subscribers:
423
437
  all_events: All Events
424
438
  new_webhooks_subscriber: New Webhooks Subscriber
data/config/routes.rb CHANGED
@@ -256,7 +256,14 @@ Spree::Core::Engine.add_routes do
256
256
  end
257
257
  end
258
258
  resources :webhook_endpoints do
259
- resources :webhook_deliveries, only: [:index, :show]
259
+ member do
260
+ post :test
261
+ end
262
+ resources :webhook_deliveries, only: [:index, :show] do
263
+ member do
264
+ post :redeliver
265
+ end
266
+ end
260
267
  end
261
268
  resources :allowed_origins, except: :show
262
269
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.4.0.rc3
4
+ version: 5.4.0.rc4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vendo Connect Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-25 00:00:00.000000000 Z
11
+ date: 2026-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.4.0.rc3
19
+ version: 5.4.0.rc4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 5.4.0.rc3
26
+ version: 5.4.0.rc4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: active_link_to
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -997,6 +997,7 @@ files:
997
997
  - app/views/spree/admin/tables/columns/_webhook_deliveries_stats.html.erb
998
998
  - app/views/spree/admin/tables/columns/_webhook_delivery_actions.html.erb
999
999
  - app/views/spree/admin/tables/columns/_webhook_delivery_status.html.erb
1000
+ - app/views/spree/admin/tables/columns/_webhook_endpoint_health.html.erb
1000
1001
  - app/views/spree/admin/tax_categories/_form.html.erb
1001
1002
  - app/views/spree/admin/tax_categories/edit.html.erb
1002
1003
  - app/views/spree/admin/tax_categories/index.html.erb
@@ -1169,9 +1170,9 @@ licenses:
1169
1170
  - BSD-3-Clause
1170
1171
  metadata:
1171
1172
  bug_tracker_uri: https://github.com/spree/spree/issues
1172
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.rc3
1173
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.rc4
1173
1174
  documentation_uri: https://docs.spreecommerce.org/
1174
- source_code_uri: https://github.com/spree/spree/tree/v5.4.0.rc3
1175
+ source_code_uri: https://github.com/spree/spree/tree/v5.4.0.rc4
1175
1176
  post_install_message:
1176
1177
  rdoc_options: []
1177
1178
  require_paths: