spree_admin 5.4.0.rc5 → 5.4.0.rc6

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/tailwind/spree/admin/base/_theme.css +2 -1
  3. data/app/assets/tailwind/spree/admin/components/_bulk-panel.css +1 -1
  4. data/app/assets/tailwind/spree/admin/components/_buttons.css +1 -1
  5. data/app/assets/tailwind/spree/admin/components/_cards.css +3 -7
  6. data/app/assets/tailwind/spree/admin/components/_forms.css +1 -1
  7. data/app/assets/tailwind/spree/admin/components/_list-groups.css +1 -1
  8. data/app/assets/tailwind/spree/admin/components/_variants-form.css +7 -0
  9. data/app/controllers/spree/admin/products_controller.rb +7 -1
  10. data/app/helpers/spree/admin/table_helper.rb +1 -1
  11. data/app/javascript/spree/admin/controllers/variants_form_controller.js +9 -0
  12. data/app/models/spree/admin/form_builder.rb +1 -1
  13. data/app/presenters/spree/admin/order_summary_presenter.rb +11 -0
  14. data/app/views/spree/admin/option_types/_form.html.erb +9 -1
  15. data/app/views/spree/admin/option_types/_option_value_fields.html.erb +15 -1
  16. data/app/views/spree/admin/orders/_shipment.html.erb +1 -1
  17. data/app/views/spree/admin/payments/_payment.html.erb +1 -1
  18. data/app/views/spree/admin/payments/new.html.erb +1 -1
  19. data/app/views/spree/admin/payments/source_forms/_previous_cards.html.erb +1 -1
  20. data/app/views/spree/admin/payments/source_forms/_store_credit.html.erb +1 -1
  21. data/app/views/spree/admin/products/form/_variants.html.erb +3 -0
  22. data/app/views/spree/admin/products/form/variants/_variant_template.html.erb +3 -0
  23. data/app/views/spree/admin/shared/_filters_search_bar.html.erb +1 -1
  24. data/app/views/spree/admin/shared/_head.html.erb +1 -1
  25. data/app/views/spree/admin/shared/_media_form.html.erb +1 -1
  26. data/app/views/spree/admin/shipments/edit.html.erb +6 -6
  27. data/app/views/spree/admin/tables/_column_selector.html.erb +1 -1
  28. data/app/views/spree/admin/tables/_query_builder.html.erb +1 -1
  29. data/app/views/spree/admin/tables/_table.html.erb +3 -3
  30. data/app/views/spree/admin/translations/edit.html.erb +1 -1
  31. data/app/views/spree/admin/variants/form/_pricing.html.erb +1 -1
  32. data/config/locales/en.yml +2 -3
  33. metadata +6 -7
  34. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e4dcdb0dbb58f3fc9dbded5e7f0869dac57779665a2f38ad0a2c9805e338047
4
- data.tar.gz: fbec9e836b4c310fefd56d82016ba697ede7498be0f68097715f2f606aac353c
3
+ metadata.gz: 50570f56dda55aad96c630a301c60c4f23a793d334cd72670697bd7dd535301c
4
+ data.tar.gz: c2422ff165f838cab717fdbbc287b90e678c7c0fd36ed4abdc5278f4430b111f
5
5
  SHA512:
6
- metadata.gz: e0c87915f09a8dda042e8745e876877a0c0087910ae293f2d9ceb8dc2b2cb071a7dc40b475d46b1ad933308f42c80043787a352c0c7d3aadb8a015e81583bd6a
7
- data.tar.gz: 9334252c421fff0751298d07df351ca54b81a5869b5156b3b5da298ffa820d061997ce12c038802b6e95bd41a07fb7140ac280e7f66db5ad9db2edf7dbe2a94a
6
+ metadata.gz: 5ffcae807ccdf08a77684bde3a9f61da11f04ffe8efe901572bffc27feff7ea21477ff49992f2b3cd3cdaf8ccdbd88ea9d614fdc256180c4e4f45ccde7197945
7
+ data.tar.gz: fdedbeee10fc76796f0355e3958eb4fdfbd438831fb458aefff328b0b36655fd6f7b73cb2018ee9af413e5c7ca13eccc206ae802afb44435e980528fd409cf37
@@ -14,7 +14,8 @@
14
14
  --color-info: var(--color-blue-900);
15
15
 
16
16
  /* Typography */
17
- --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
17
+ --font-sans: "Geist", ui-sans-serif, system-ui, sans-serif;
18
+ --font-mono: "Geist Mono", ui-monospace, monospace;
18
19
 
19
20
  /* Override Tailwind's text-* scale to match Spree design system */
20
21
  --text-2xs: 0.625rem;
@@ -66,7 +66,7 @@
66
66
  }
67
67
 
68
68
  .bulk-panel-container .btn-close {
69
- @apply w-10;
69
+ @apply w-10 rounded-xl;
70
70
  }
71
71
 
72
72
  #bulk-panel {
@@ -11,7 +11,7 @@
11
11
  .btn {
12
12
  @apply inline-flex items-center justify-center text-center align-middle gap-2;
13
13
  @apply cursor-pointer select-none no-underline;
14
- @apply px-3 py-1.5 text-base font-medium leading-normal border border-transparent rounded-xl;
14
+ @apply px-2.5 py-1.5 text-base font-medium leading-normal border border-transparent rounded-xl;
15
15
  @apply transition-colors duration-100 ease-linear;
16
16
  }
17
17
 
@@ -13,10 +13,6 @@
13
13
  @apply p-0 mb-3;
14
14
  }
15
15
 
16
- .card .card {
17
- @apply rounded-xl;
18
- }
19
-
20
16
  /* Card with table */
21
17
  .card > .table,
22
18
  .card .table-responsive > .table {
@@ -74,7 +70,7 @@
74
70
  }
75
71
 
76
72
  .card-body {
77
- @apply flex-auto p-5;
73
+ @apply flex-auto p-3;
78
74
  }
79
75
 
80
76
  .card-body .form-group:last-child {
@@ -87,7 +83,7 @@
87
83
  }
88
84
 
89
85
  .card-header {
90
- @apply flex items-center mb-0 p-5 pr-3 h-14 border-b border-gray-100 rounded-t-[calc(var(--radius-xl)-1px)];
86
+ @apply flex items-center mb-0 px-3 h-12 border-b border-gray-100 rounded-t-[calc(var(--radius-xl)-1px)];
91
87
  }
92
88
 
93
89
  .card-header .card-title {
@@ -107,7 +103,7 @@
107
103
  }
108
104
 
109
105
  .card-footer {
110
- @apply p-5;
106
+ @apply p-3;
111
107
  }
112
108
 
113
109
  .card-footer:last-child {
@@ -23,7 +23,7 @@
23
23
  .select-input,
24
24
  .form-control-sm,
25
25
  .custom-select-sm {
26
- @apply block w-full py-2 px-3 text-base font-normal leading-normal;
26
+ @apply block w-full py-1.5 px-2.5 text-base font-normal leading-normal;
27
27
  @apply text-gray-950 bg-white border border-gray-200 rounded-lg shadow-xs;
28
28
  @apply focus:outline-offset-2 focus:outline-blue-500 focus:border-gray-200 focus:ring-0;
29
29
  @apply transition-all duration-100 ease-in-out;
@@ -8,7 +8,7 @@
8
8
  }
9
9
 
10
10
  .list-group-item {
11
- @apply relative block py-3 px-5 text-gray-950 no-underline border border-gray-200 hover:bg-gray-25;
11
+ @apply relative block py-2.5 px-3 text-gray-950 no-underline border border-gray-200 hover:bg-gray-25;
12
12
  }
13
13
 
14
14
  .list-group-item:first-child {
@@ -72,6 +72,7 @@
72
72
  }
73
73
 
74
74
  .variants-form .variants-table .column-checkbox,
75
+ .variants-form .variants-table .column-thumbnail,
75
76
  .variants-form .variants-table .column-variant,
76
77
  .variants-form .variants-table .column-price,
77
78
  .variants-form .variants-table .column-quantity,
@@ -83,6 +84,11 @@
83
84
  @apply justify-center grow-0 basis-8;
84
85
  }
85
86
 
87
+ .variants-form .variants-table .column-thumbnail {
88
+ @apply grow-0 shrink-0;
89
+ flex-basis: 36px;
90
+ }
91
+
86
92
  .variants-form .variants-table .column-variant {
87
93
  @apply select-none grow-[3] basis-0;
88
94
  }
@@ -136,6 +142,7 @@
136
142
  }
137
143
 
138
144
  .variants-form .variants-table__body__row.nested .column-checkbox,
145
+ .variants-form .variants-table__body__row.nested .column-thumbnail,
139
146
  .variants-form .variants-table__body__row.nested .column-variant {
140
147
  @apply left-5 relative;
141
148
  }
@@ -179,10 +179,16 @@ module Spree
179
179
 
180
180
  @product_variant_ids = {}
181
181
  @product_variant_prefix_ids = {}
182
+ @product_variant_images = {}
182
183
 
183
- @product.variants.includes(:option_values).each do |variant|
184
+ @product.variants.includes(:option_values, primary_media: { attachment_attachment: :blob }).each do |variant|
184
185
  @product_variant_ids[variant.human_name] = variant.id.to_s
185
186
  @product_variant_prefix_ids[variant.human_name] = variant.to_param
187
+
188
+ image = variant.primary_media
189
+ if image.present? && image.attached? && image.variable?
190
+ @product_variant_images[variant.human_name] = helpers.spree_image_url(image, variant: :mini)
191
+ end
186
192
  end
187
193
  end
188
194
 
@@ -359,7 +359,7 @@ module Spree
359
359
  private
360
360
 
361
361
  def sort_dropdown_toggle(current_direction, current_label)
362
- dropdown_toggle(class: 'btn-light btn-sm h-[2.125rem]') do
362
+ dropdown_toggle(class: 'btn-light btn-sm') do
363
363
  safe_join([
364
364
  icon(current_direction == 'asc' ? 'sort-ascending' : 'sort-descending'),
365
365
  content_tag(:span, current_label),
@@ -35,6 +35,7 @@ export default class extends CheckboxSelectAll {
35
35
  currencies: Array,
36
36
  variantIds: Object,
37
37
  variantPrefixIds: Object,
38
+ variantImages: Object,
38
39
  currentStockLocationId: String,
39
40
  stockLocations: Array,
40
41
  optionValuesSelectOptions: Array,
@@ -533,6 +534,14 @@ export default class extends CheckboxSelectAll {
533
534
  }
534
535
  }
535
536
 
537
+ const variantImageUrl = this.variantImagesValue?.[internalName]
538
+ if (variantImageUrl) {
539
+ const thumbnailContainer = variantTarget.querySelector('[data-slot="variantThumbnail"]')
540
+ if (thumbnailContainer) {
541
+ thumbnailContainer.innerHTML = `<div class="overflow-hidden rounded-md border border-gray-300" style="width: 36px; height: 36px;"><img src="${variantImageUrl}" width="36" height="36" alt="" class="object-cover transition-transform duration-300 ease-out hover:scale-120" loading="lazy"></div>`
542
+ }
543
+ }
544
+
536
545
  let previousVariant = null
537
546
 
538
547
  if (i > 0) {
@@ -389,7 +389,7 @@ module Spree
389
389
 
390
390
  @template.content_tag(:div, class: 'input-group') do
391
391
  prepend_html = if prepend.present?
392
- @template.content_tag(:div, prepend, class: 'pl-3 text-gray-400')
392
+ @template.content_tag(:div, prepend, class: 'pl-2 text-gray-400')
393
393
  else
394
394
  ''.html_safe
395
395
  end
@@ -13,6 +13,7 @@ module Spree
13
13
  [
14
14
  *metadata_rows,
15
15
  :separator,
16
+ market_row,
16
17
  locale_row,
17
18
  currency_row,
18
19
  subtotal_row,
@@ -72,6 +73,16 @@ module Spree
72
73
  rows
73
74
  end
74
75
 
76
+ def market_row
77
+ return nil if order.market.blank?
78
+
79
+ {
80
+ label: Spree.t(:market),
81
+ value: order.market.name,
82
+ id: 'market'
83
+ }
84
+ end
85
+
75
86
  def locale_row
76
87
  return nil if order.locale.blank?
77
88
 
@@ -12,6 +12,13 @@
12
12
  <%= f.spree_text_field :name, label: Spree.t(:internal_name), data: { slug_form_target: :url }, help_text: raw("This is used internally to identify the option type. <strong>It must be unique.</strong>") %>
13
13
  </div>
14
14
  </div>
15
+ <div class="grid grid-cols-12 gap-6 mb-6">
16
+ <div class="col-span-12 md:col-span-6">
17
+ <%= f.spree_select :kind,
18
+ Spree::OptionType::KINDS.map { |k| [Spree.t("option_type_kinds.#{k}"), k] },
19
+ { label: Spree.t(:kind), help: Spree.t(:option_type_kind_info) } %>
20
+ </div>
21
+ </div>
15
22
  <div class="grid grid-cols-12 gap-6">
16
23
  <div class="col-span-12 md:col-span-6">
17
24
  <%= f.spree_check_box :filterable, help_text: raw(Spree.t('option_type_filterable_info')) %>
@@ -38,6 +45,7 @@
38
45
  <th scope="col"></th>
39
46
  <th scope="col"><%= raw(Spree.t(:presentation) + required_span_tag) %></th>
40
47
  <th scope="col"><%= raw(Spree.t(:internal_name) + required_span_tag) %></th>
48
+ <th scope="col"><%= Spree.t(:color_code) %></th>
41
49
  <th scope="col"></th>
42
50
  </tr>
43
51
  </thead>
@@ -51,7 +59,7 @@
51
59
  <tr data-nested-form-target="target"></tr>
52
60
 
53
61
  <tr class="hover-none">
54
- <td colspan="4" class="text-center p-2">
62
+ <td colspan="5" class="text-center p-2">
55
63
  <button type="button" data-action="nested-form#add" class="btn btn-secondary py-3 w-full" id="add_option_value_button">
56
64
  <%= icon('plus') %>
57
65
  <%= Spree.t(:add_one) %>
@@ -14,12 +14,26 @@
14
14
  <% end %>
15
15
  <%= f.hidden_field :id %>
16
16
  </td>
17
- <td class="w-45 presentation">
17
+ <td class="w-40 presentation">
18
18
  <%= f.text_field :presentation, class: "form-input", data: { slug_form_target: :name, action: 'slug-form#updateUrlFromName' } %>
19
19
  </td>
20
20
  <td class="w-40 name">
21
21
  <%= f.text_field :name, class: "form-input", data: { slug_form_target: :url } %>
22
22
  </td>
23
+ <td class="w-5 color_code">
24
+ <div data-controller="color-picker" data-color-picker-clear-value="true" data-color-picker-default-color-value="#000000">
25
+ <div class="flex items-center gap-2">
26
+ <button type="button"
27
+ data-color-picker-target="picker"
28
+ class="w-8 h-8 rounded border border-gray-300 cursor-pointer shrink-0"
29
+ style="background: <%= f.object.color_code.presence || 'white' %>;">
30
+ </button>
31
+ <span data-color-picker-target="value" class="text-sm text-gray-500"><%= f.object.color_code %></span>
32
+ </div>
33
+ <%= f.hidden_field :color_code, data: { color_picker_target: :input } %>
34
+ <span data-color-picker-target="display" class="hidden"></span>
35
+ </div>
36
+ </td>
23
37
  <td class="w-10 actions">
24
38
  <button type="button" class="btn btn-danger btn-sm remove_option_value_button" data-action="nested-form#remove">
25
39
  <%= icon('trash', class: 'mr-0') %>
@@ -1,5 +1,5 @@
1
1
  <% order ||= shipment.order %>
2
- <%= turbo_frame_tag dom_id(shipment), class: "card rounded-lg" do %>
2
+ <%= turbo_frame_tag dom_id(shipment), class: "card" do %>
3
3
  <div class="card-header items-center justify-between">
4
4
  <div class="flex items-center gap-2">
5
5
  <span class="flex items-center"><%= shipment_state(shipment.state) %></span>
@@ -1,4 +1,4 @@
1
- <div class="card rounded-lg" id="<%= dom_id(payment) %>">
1
+ <div class="card" id="<%= dom_id(payment) %>">
2
2
  <div class="card-header flex items-center gap-2">
3
3
  <span class="badge badge-<%= payment.state %> gap-1">
4
4
  <% if payment.completed? %>
@@ -19,7 +19,7 @@
19
19
  <ul class="list-group mb-6">
20
20
  <% @payment_methods.each do |payment_method| %>
21
21
  <li class="list-group-item p-0 overflow-hidden">
22
- <%= link_to spree.new_admin_order_payment_path(@order, payment_method_id: payment_method.id), class: "form-check-label flex items-center gap-4 px-6 py-6 w-full cursor-pointer hover:bg-gray-25 text-gray-900 no-underline" do %>
22
+ <%= link_to spree.new_admin_order_payment_path(@order, payment_method_id: payment_method.id), class: "form-check-label flex items-center gap-4 px-3 py-3 w-full cursor-pointer hover:bg-gray-25 text-gray-900 no-underline" do %>
23
23
  <div class="form-check flex items-center">
24
24
  <%= f.radio_button :payment_method_id, payment_method.id, class: "form-check-input" %>
25
25
  </div>
@@ -3,7 +3,7 @@
3
3
  <%= f.fields_for :source, @payment.source do |source_form| %>
4
4
  <% previous_cards.each do |card| %>
5
5
  <li class="list-group-item p-0">
6
- <%= source_form.label :id, value: card.id, class: "form-check-label flex items-center gap-4 px-6 py-6 w-full cursor-pointer hover:bg-gray-25" do %>
6
+ <%= source_form.label :id, value: card.id, class: "form-check-label flex items-center gap-4 px-3 py-3 w-full cursor-pointer hover:bg-gray-25" do %>
7
7
  <div class="form-check flex items-center">
8
8
  <%= source_form.radio_button :id, card.id, class: "form-check-input" %>
9
9
  </div>
@@ -3,7 +3,7 @@
3
3
  <%= f.fields_for :source, @payment.source do |source_form| %>
4
4
  <% @store_credits.each do |credit| %>
5
5
  <li class="list-group-item p-0">
6
- <%= source_form.label :id, value: credit.id, class: "form-check-label flex items-center gap-4 px-6 py-6 w-full cursor-pointer hover:bg-gray-25" do %>
6
+ <%= source_form.label :id, value: credit.id, class: "form-check-label flex items-center gap-4 px-3 py-3 w-full cursor-pointer hover:bg-gray-25" do %>
7
7
  <div class="form-check flex items-center">
8
8
  <%= source_form.radio_button :id, credit.id, class: "form-check-input", checked: @payment.source.id == credit.id || @store_credits.first.id == credit.id %>
9
9
  </div>
@@ -22,6 +22,7 @@
22
22
  <% if @product_prices.present? %> data-variants-form-prices-value="<%= @product_prices.to_json %>" <% end %>
23
23
  <% if @product_variant_ids.present? %> data-variants-form-variant-ids-value="<%= @product_variant_ids.to_json %>" <% end %>
24
24
  <% if @product_variant_prefix_ids.present? %> data-variants-form-variant-prefix-ids-value="<%= @product_variant_prefix_ids.to_json %>" <% end %>
25
+ <% if @product_variant_images.present? %> data-variants-form-variant-images-value="<%= @product_variant_images.to_json %>" <% end %>
25
26
  >
26
27
  <div class="options-creator">
27
28
  <%= render 'spree/admin/products/form/variants/option_template', option_types_for_select: option_types_for_select %>
@@ -145,6 +146,8 @@
145
146
  </div>
146
147
  </div>
147
148
  <% end%>
149
+ <div class="variants-table__header__cell column-thumbnail">
150
+ </div>
148
151
  <div class="variants-table__header__cell column-variant">
149
152
  <%= Spree.t(:variant) %>
150
153
  <button data-variants-form-target="deleteButton" data-action="variants-form#deleteSelected" type="button" class="btn btn-danger btn-sm hidden ml-12">
@@ -12,6 +12,9 @@
12
12
  </div>
13
13
  </div>
14
14
  <% end %>
15
+ <div class="variants-table__body__cell column-thumbnail pr-2" data-slot="variantThumbnail">
16
+ <%= render 'spree/admin/shared/no_image', width: 36, height: 36 %>
17
+ </div>
15
18
  <div class="variants-table__body__cell column-variant" data-slot="variantName">
16
19
  Medium
17
20
  </div>
@@ -2,7 +2,7 @@
2
2
  <% badge_name ||= label %>
3
3
  <% placeholder ||= [Spree.t(:search), controller_name.humanize.downcase].join(' ') %>
4
4
 
5
- <div class="form-input flex items-center py-0 focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-blue-500 grow max-lg:max-w-[300px] mr-auto h-[2.125rem] max-lg:mb-4 transition-all duration-100 ease-in-out" id="filters-search-bar">
5
+ <div class="form-input flex items-center py-0 focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-blue-500 grow max-lg:max-w-[300px] mr-auto max-lg:mb-4 transition-all duration-100 ease-in-out" id="filters-search-bar">
6
6
  <%= icon "search", class: "mr-4 text-gray-600" %>
7
7
  <%= search_field_tag "q[#{param}]", params.dig(:q, param), class: "outline-none border-0 h-full focus:border-0 focus:ring-0 p-0 text-base w-full", placeholder: placeholder, data: { filters_target: :input, badge_name: badge_name } %>
8
8
  </div>
@@ -19,7 +19,7 @@
19
19
 
20
20
  <link rel="preconnect" href="https://fonts.googleapis.com">
21
21
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
22
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap" rel="stylesheet">
22
+ <link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap" rel="stylesheet">
23
23
 
24
24
  <%= stylesheet_link_tag 'spree/admin/application', media: :all, data: { turbo_track: "reload" } %>
25
25
  <%= tinymce_assets %>
@@ -24,7 +24,7 @@
24
24
  media_form_target: 'addButton'
25
25
  } do %>
26
26
  <%= icon('upload', class: 'mt-12 text-4xl') %>
27
- <p class="text-sm mt-2 mb-12">
27
+ <p class="text-sm mb-12">
28
28
  <%= Spree.t('admin.upload_new_asset') %>
29
29
  </p>
30
30
  <% end %>
@@ -2,12 +2,12 @@
2
2
  <%= form_with model: @shipment, url: spree.admin_order_shipment_path(@order, @shipment), class: "w-full flex justify-between items-center" do |f| %>
3
3
  <div>
4
4
  <%= f.select :selected_shipping_rate_id, options_for_select(@shipment.shipping_rates.map {|sr| ["#{sr.name} #{sr.display_price}", sr.id] }, @shipment.selected_shipping_rate_id),
5
- {}, class: 'form-select', autofocus: true %>
5
+ {}, class: 'form-select form-select-sm', autofocus: true %>
6
6
  </div>
7
7
  <div class="flex h-full items-center gap-2">
8
8
  <% if can? :update, @shipment %>
9
- <%= turbo_save_button_tag Spree.t('actions.save'), data: { turbo_frame: :_top }, type: :submit, class: 'btn btn-primary' %>
10
- <%= link_to Spree.t('actions.discard'), spree.edit_admin_order_path(@order), class: "btn btn-light" %>
9
+ <%= turbo_save_button_tag Spree.t('actions.save'), data: { turbo_frame: :_top }, type: :submit, class: 'btn btn-sm btn-primary' %>
10
+ <%= link_to Spree.t('actions.discard'), spree.edit_admin_order_path(@order), class: "btn btn-sm btn-light" %>
11
11
  <% end %>
12
12
  </div>
13
13
  <% end %>
@@ -16,12 +16,12 @@
16
16
  <%= form_with model: @shipment, url: spree.admin_order_shipment_path(@order, @shipment), class: "w-full py-1 flex justify-between items-center" do |f| %>
17
17
  <div class="flex items-center text-nowrap gap-x-3 items-center grow mr-3">
18
18
  <%= f.label :tracking, Spree.t(:tracking_number), class: 'mb-0' %>
19
- <%= f.text_field :tracking, class: 'form-input', required: true, autofocus: true %>
19
+ <%= f.text_field :tracking, class: 'form-input form-input-sm', required: true, autofocus: true %>
20
20
  </div>
21
21
  <div class="flex h-full items-center gap-2">
22
22
  <% if can? :update, @shipment %>
23
- <%= turbo_save_button_tag Spree.t('actions.save'), data: { turbo_frame: dom_id(@shipment) }, type: :submit, class: 'btn btn-primary' %>
24
- <%= link_to Spree.t('actions.discard'), spree.edit_admin_order_path(@order), class: "btn btn-light" %>
23
+ <%= turbo_save_button_tag Spree.t('actions.save'), data: { turbo_frame: dom_id(@shipment) }, type: :submit, class: 'btn btn-sm btn-primary' %>
24
+ <%= link_to Spree.t('actions.discard'), spree.edit_admin_order_path(@order), class: "btn btn-sm btn-light" %>
25
25
  <% end %>
26
26
  </div>
27
27
  <% end %>
@@ -7,7 +7,7 @@
7
7
  <%= hidden_field_tag :redirect_url, request.fullpath %>
8
8
 
9
9
  <%= dropdown(portal: false) do %>
10
- <%= dropdown_toggle(class: 'btn-light btn-sm h-[2.125rem]') do %>
10
+ <%= dropdown_toggle(class: 'btn-light btn-sm') do %>
11
11
  <%= icon 'columns-3' %>
12
12
  <span><%= Spree.t('admin.tables.columns') %></span>
13
13
  <%= icon 'chevron-down' %>
@@ -6,7 +6,7 @@
6
6
 
7
7
  <div data-controller="dialog" class="h-full">
8
8
  <button type="button"
9
- class="btn btn-light btn-sm h-[2.125rem]"
9
+ class="btn btn-light btn-sm"
10
10
  data-action="dialog#open">
11
11
  <%= icon 'filter' %>
12
12
  <span><%= Spree.t('admin.tables.filters') %></span>
@@ -11,11 +11,11 @@
11
11
  <%= render 'spree/admin/shared/export_modal', export_type: export_type %>
12
12
  <% end %>
13
13
  <div class="<%= local_assigns[:container_class] || 'card-lg' %>" data-controller="table" data-table-url-value="<%= request.path %>">
14
- <div class="p-3 border-b border-gray-200">
14
+ <div class="p-2 border-b border-gray-200">
15
15
  <div class="flex flex-col lg:flex-row gap-3 items-start lg:items-center justify-between">
16
16
  <div class="flex gap-2 items-center flex-wrap">
17
17
  <%= search_form_for @search, url: url_for, html: { data: { turbo_frame: frame_name, turbo_action: 'advance', controller: 'auto-submit search-clear', auto_submit_delay_value: 300 } } do |f| %>
18
- <div class="form-input flex items-center py-0 pr-1 focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-blue-500 lg:w-[300px] mr-auto h-[2.125rem] transition-all duration-100 ease-in-out">
18
+ <div class="form-input flex items-center py-0 pr-1 focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-blue-500 lg:w-[300px] mr-auto h-[2rem] transition-all duration-100 ease-in-out">
19
19
  <%= icon "search", class: "mr-4 text-gray-600 shrink-0" %>
20
20
  <%= search_field_tag "q[#{search_param}]",
21
21
  params.dig(:q, search_param),
@@ -55,7 +55,7 @@
55
55
  date_to_input_name: "q[#{date_range_param}_lt]",
56
56
  date_from_value: params.dig(:q, :"#{date_range_param}_gt"),
57
57
  date_to_value: params.dig(:q, :"#{date_range_param}_lt"),
58
- css_classes: "btn-light btn-sm dropdown-toggle h-[2.125rem]" %>
58
+ css_classes: "btn-light btn-sm" %>
59
59
  <%# Preserve search and filter state when submitting date range %>
60
60
  <% if params.dig(:q, search_param).present? %>
61
61
  <%= hidden_field_tag "q[#{search_param}]", params.dig(:q, search_param) %>
@@ -32,7 +32,7 @@
32
32
  <p class="text-center mb-3"><%= Spree.t('admin.translations.no_translations_configured') %></p>
33
33
 
34
34
  <% if can?(:edit, current_store) %>
35
- <%= link_to_with_icon 'world', Spree.t('admin.translations.manage_markets'), spree.edit_admin_store_path(section: 'general-settings'), class: 'btn btn-primary', data: { 'turbo-frame': '_top' } %>
35
+ <%= link_to_with_icon 'world', Spree.t('admin.manage_markets'), spree.admin_markets_path, class: 'btn btn-primary', data: { 'turbo-frame': '_top' } %>
36
36
  <% end %>
37
37
  </div>
38
38
  </div>
@@ -5,7 +5,7 @@
5
5
  </h5>
6
6
 
7
7
  <% if can?(:manage, Spree::Store) %>
8
- <%= link_to_with_icon 'adjustments', Spree.t('admin.manage_currencies'), spree.edit_admin_store_path(section: 'general-settings'), class: 'btn btn-sm btn-light' %>
8
+ <%= link_to_with_icon 'world', Spree.t('admin.manage_markets'), spree.admin_markets_path, class: 'btn btn-sm btn-light' %>
9
9
  <% end %>
10
10
  </div>
11
11
  <div class="card-body p-0">
@@ -143,7 +143,7 @@ en:
143
143
  page_subtitle: Connect your store to third-party services to enhance customer experience.
144
144
  json_preview:
145
145
  no_api_response: No API response found for this resource
146
- manage_currencies: Manage Currencies
146
+ manage_markets: Manage Markets
147
147
  manage_properties: Manage Properties
148
148
  manage_stock_locations: Manage Stock Locations
149
149
  manage_taxons: Manage Categories
@@ -366,9 +366,8 @@ en:
366
366
  manual: Manual
367
367
  manual_info: Curate products manually. You can add or remove them in bulk.
368
368
  translations:
369
- manage_markets: Manage Markets
370
369
  no_translations_configured: No translations configured. Please setup Markets to use translations.
371
- upload_new_asset: Upload new asset
370
+ upload_new_asset: Upload new media
372
371
  user:
373
372
  last_order_placed: Last order placed
374
373
  no_store_credit: Customer has no Store Credit available
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.rc5
4
+ version: 5.4.0.rc6
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-30 00:00:00.000000000 Z
11
+ date: 2026-04-04 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.rc5
19
+ version: 5.4.0.rc6
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.rc5
26
+ version: 5.4.0.rc6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: active_link_to
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -1095,7 +1095,6 @@ files:
1095
1095
  - config/locales/en.yml
1096
1096
  - config/routes.rb
1097
1097
  - config/tailwind.config.js
1098
- - db/migrate/20250217171018_create_action_text_video_embeds.rb
1099
1098
  - lib/generators/spree/admin/devise/devise_generator.rb
1100
1099
  - lib/generators/spree/admin/install/install_generator.rb
1101
1100
  - lib/generators/spree/admin/install/templates/app/assets/tailwind/spree_admin.css.tt
@@ -1170,9 +1169,9 @@ licenses:
1170
1169
  - BSD-3-Clause
1171
1170
  metadata:
1172
1171
  bug_tracker_uri: https://github.com/spree/spree/issues
1173
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.rc5
1172
+ changelog_uri: https://github.com/spree/spree/releases/tag/v5.4.0.rc6
1174
1173
  documentation_uri: https://docs.spreecommerce.org/
1175
- source_code_uri: https://github.com/spree/spree/tree/v5.4.0.rc5
1174
+ source_code_uri: https://github.com/spree/spree/tree/v5.4.0.rc6
1176
1175
  post_install_message:
1177
1176
  rdoc_options: []
1178
1177
  require_paths:
@@ -1,11 +0,0 @@
1
- class CreateActionTextVideoEmbeds < ActiveRecord::Migration[6.1]
2
- def change
3
- create_table :action_text_video_embeds, if_not_exists: true do |t|
4
- t.string :url, null: false
5
- t.string :thumbnail_url, null: false
6
- t.text :raw_html, null: false
7
-
8
- t.timestamps
9
- end
10
- end
11
- end